[Xfce4-commits] [apps/xfce4-screensaver] 11/17: fix password prompt flickering
noreply at xfce.org
noreply at xfce.org
Sat Mar 9 22:23:46 CET 2019
This is an automated email from the git hooks/post-receive script.
b l u e s a b r e p u s h e d a c o m m i t t o b r a n c h m a s t e r
in repository apps/xfce4-screensaver.
commit dc72b93a2df318712287e81fe071e5d9069257f4
Author: Alexander Butenko <a.butenka at gmail.com>
Date: Sat Feb 9 14:19:41 2019 -0400
fix password prompt flickering
---
src/gs-manager.c | 93 ++++++++++++++++++++---------------------------------
src/gs-window-x11.c | 12 +++++++
src/gs-window.h | 2 ++
3 files changed, 48 insertions(+), 59 deletions(-)
diff --git a/src/gs-manager.c b/src/gs-manager.c
index fa11575..5b9e508 100644
--- a/src/gs-manager.c
+++ b/src/gs-manager.c
@@ -76,7 +76,6 @@ struct GSManagerPrivate {
guint fading : 1;
guint dialog_up : 1;
- gint last_monitor_count;
time_t activate_time;
@@ -1423,8 +1422,8 @@ gs_manager_create_window_for_monitor (GSManager *manager,
gdk_monitor_get_geometry (monitor, &rect);
- gs_debug ("Creating a window [%d,%d] (%dx%d)",
- rect.x, rect.y, rect.width, rect.height);
+ gs_debug ("Creating a Window [%d,%d] (%dx%d) for monitor %s",
+ rect.x, rect.y, rect.width, rect.height, gdk_monitor_get_model(monitor));
window = gs_window_new (monitor,
manager->priv->lock_enabled,
@@ -1481,46 +1480,36 @@ on_display_monitor_added (GdkDisplay *display,
GSManager *manager) {
GSList *l;
int n_monitors;
+ gboolean should_create = TRUE;
- g_return_if_fail (gs_manager_is_real_monitor(monitor));
+ if (!gs_manager_is_real_monitor(monitor))
+ return;
n_monitors = gs_manager_get_n_monitors (display);
- gs_debug ("Monitor added on display %s, now there are %d",
- gdk_display_get_name (display), n_monitors);
-
- if (manager->priv->last_monitor_count == 0) {
- /* Tidy up from lid-close or other headless event once we have a new monitor.
- * See https://gitlab.gnome.org/GNOME/gtk/issues/1466
- */
- l = manager->priv->windows;
- while (l != NULL)
- {
- GSList *next = l->next;
-
- manager_maybe_stop_job_for_window(manager,
- GS_WINDOW(l->data));
- g_hash_table_remove(manager->priv->jobs, l->data);
- gs_window_disconnect_monitor(GS_WINDOW(l->data));
- gs_window_destroy(GS_WINDOW(l->data));
- manager->priv->windows = g_slist_delete_link(manager->priv->windows, l);
- l = next;
- }
- }
+ gs_debug ("Monitor %s added on display %s, now there are %d",
+ gdk_monitor_get_model(monitor), gdk_display_get_name (display), n_monitors);
- manager->priv->last_monitor_count = n_monitors;
+ /* build password window for a new monitor if doesnt exist */
+ for (l = manager->priv->windows; l; l = l->next) {
+ GdkDisplay *this_display;
+ const gchar *this_monitor_model;
- /* add a new window */
- gs_manager_create_window_for_monitor (manager, monitor);
+ this_display = gs_window_get_display (GS_WINDOW (l->data));
+ this_monitor_model = gs_window_get_monitor_model (GS_WINDOW (l->data));
+ if (this_display == display && g_strcmp0 (this_monitor_model, gdk_monitor_get_model(monitor)) == 0) {
+ gs_debug ("Found window for this Monitor");
+ gs_window_set_monitor (GS_WINDOW (l->data), monitor);
+ should_create = FALSE;
+ }
+ }
- /* Tear down the unlock dialog in case we want to move it
- * to the new monitor
- */
- l = manager->priv->windows;
- while (l != NULL) {
- gs_window_cancel_unlock_request (GS_WINDOW (l->data));
- l = l->next;
+ if (should_create) {
+ gs_debug("Creating new window for Monitor %s", gdk_monitor_get_model (monitor));
+ gs_manager_create_window_for_monitor(manager, monitor);
}
+ gs_manager_request_unlock(manager);
+ g_debug("added_done");
}
static void
@@ -1529,14 +1518,14 @@ on_display_monitor_removed (GdkDisplay *display,
GSManager *manager) {
GSList *l;
int n_monitors;
- GdkMonitor *last_monitor = NULL;
- g_return_if_fail (gs_manager_is_real_monitor(monitor));
+ if (!gs_manager_is_real_monitor(monitor))
+ return;
- n_monitors = manager->priv->last_monitor_count = gs_manager_get_n_monitors (display);
+ n_monitors = gs_manager_get_n_monitors (display);
- gs_debug ("Monitor removed on display %s, now there are %d",
- gdk_display_get_name (display), n_monitors);
+ gs_debug ("Monitor %p removed on display %s, now there are %d",
+ monitor, gdk_display_get_name (display), n_monitors);
/* Tidy up from lid-close or other headless event once we have a new monitor.
* See https://gitlab.gnome.org/GNOME/gtk/issues/1466
@@ -1546,37 +1535,24 @@ on_display_monitor_removed (GdkDisplay *display,
gdk_x11_grab_server ();
- /* remove the now extra window */
- l = manager->priv->windows;
- while (l != NULL) {
+ /* destroy password window of a removed monitor */
+ for (l = manager->priv->windows; l; l = l->next) {
GdkDisplay *this_display;
- GdkMonitor *this_monitor;
- GSList *next = l->next;
+ const gchar *this_monitor_model;
this_display = gs_window_get_display (GS_WINDOW (l->data));
- this_monitor = gs_window_get_monitor (GS_WINDOW (l->data));
- if (this_display == display && this_monitor == monitor) {
+ this_monitor_model = gs_window_get_monitor_model (GS_WINDOW (l->data));
+ if (this_display == display && g_strcmp0 (this_monitor_model, gdk_monitor_get_model(monitor)) == 0) {
manager_maybe_stop_job_for_window (manager,
GS_WINDOW (l->data));
g_hash_table_remove (manager->priv->jobs, l->data);
gs_window_destroy (GS_WINDOW (l->data));
manager->priv->windows = g_slist_delete_link (manager->priv->windows, l);
- } else {
- last_monitor = this_monitor;
- gs_window_cancel_unlock_request (GS_WINDOW (l->data));
}
- l = next;
}
gdk_display_flush (display);
gdk_x11_ungrab_server ();
-
- /* add a new window */
- if (last_monitor)
- gs_manager_create_window_for_monitor(manager, last_monitor);
-
- /* and put unlock dialog up whereever it's supposed to be */
- gs_manager_request_unlock(manager);
}
static void
@@ -1703,7 +1679,6 @@ gs_manager_new (void) {
manager = g_object_new (GS_TYPE_MANAGER, NULL);
mgr = GS_MANAGER (manager);
- mgr->priv->last_monitor_count = -1;
return mgr;
}
diff --git a/src/gs-window-x11.c b/src/gs-window-x11.c
index a4f7da2..b579102 100644
--- a/src/gs-window-x11.c
+++ b/src/gs-window-x11.c
@@ -60,6 +60,7 @@ enum {
struct GSWindowPrivate {
GdkMonitor *monitor;
+ gchar *monitor_model;
GdkRectangle geometry;
guint obscured : 1;
@@ -1797,6 +1798,7 @@ gs_window_set_monitor (GSWindow *window,
}
window->priv->monitor = monitor;
+ window->priv->monitor_model = g_strdup(gdk_monitor_get_model(monitor));
gtk_widget_queue_resize (GTK_WIDGET (window));
@@ -1810,6 +1812,14 @@ gs_window_get_monitor (GSWindow *window) {
return window->priv->monitor;
}
+const gchar *
+gs_window_get_monitor_model (GSWindow *window) {
+ g_return_val_if_fail (GS_IS_WINDOW (window), NULL);
+
+ return window->priv->monitor_model;
+}
+
+
static void
gs_window_set_property (GObject *object,
guint prop_id,
@@ -2360,6 +2370,7 @@ gs_window_finalize (GObject *object) {
g_free (window->priv->logout_command);
g_free (window->priv->keyboard_command);
+ g_free (window->priv->monitor_model);
if (window->priv->info_bar_timer_id > 0) {
g_source_remove (window->priv->info_bar_timer_id);
@@ -2394,6 +2405,7 @@ gs_window_new (GdkMonitor *monitor,
GdkDisplay *display = gdk_monitor_get_display (monitor);
GdkScreen *screen = gdk_display_get_default_screen (display);
+ gs_debug ("Creating new GSWindow for %s", gdk_monitor_get_model(monitor));
result = g_object_new (GS_TYPE_WINDOW,
"type", GTK_WINDOW_POPUP,
"screen", screen,
diff --git a/src/gs-window.h b/src/gs-window.h
index 77e2a37..66de41e 100644
--- a/src/gs-window.h
+++ b/src/gs-window.h
@@ -64,6 +64,8 @@ GdkDisplay *gs_window_get_display (GSWindow *window);
void gs_window_set_monitor (GSWindow *window,
GdkMonitor *monitor);
GdkMonitor *gs_window_get_monitor (GSWindow *window);
+const
+gchar *gs_window_get_monitor_model (GSWindow *window);
void gs_window_set_background_surface (GSWindow *window,
cairo_surface_t *surface);
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list