static gboolean manager_maybe_grab_window (GSManager *manager, GSWindow *window) { GdkDisplay *display; GdkDevice *device; GdkMonitor *monitor; int x, y; gboolean grabbed; display = gdk_display_get_default (); device = gdk_seat_get_pointer (gdk_display_get_default_seat (display)); gdk_device_get_position (device, NULL, &x, &y); monitor = gdk_display_get_monitor_at_point (display, x, y); gdk_display_flush (display); grabbed = FALSE; if (gs_window_get_display (window) == display && gs_window_get_monitor (window) == monitor) { gs_debug ("Initiate grab move to %p", window); gs_grab_move_to_window (manager->priv->grab, gs_window_get_gdk_window (window), gs_window_get_display (window), FALSE, FALSE); grabbed = TRUE; } return grabbed; }
static void handle_window_dialog_down (GSManager *manager, GSWindow *window) { GSList *l; g_return_if_fail (manager != NULL); g_return_if_fail (GS_IS_MANAGER (manager)); gs_debug ("Handling dialog down"); /* regrab pointer */ gs_grab_move_to_window (manager->priv->grab, gs_window_get_gdk_window (window), gs_window_get_display (window), FALSE, FALSE); /* make all windows sensitive to get events */ for (l = manager->priv->windows; l; l = l->next) { gtk_widget_set_sensitive (GTK_WIDGET (l->data), TRUE); } manager->priv->dialog_up = FALSE; if (! manager->priv->throttled) { manager_resume_jobs (manager); } g_signal_emit (manager, signals [AUTH_REQUEST_END], 0); }
static void window_show_cb (GSWindow *window, gpointer data) { /* move devices grab so that dialog can be used */ gs_grab_move_to_window (grab, gs_window_get_gdk_window (window), gs_window_get_display (window), TRUE, FALSE); }
static void window_show_cb (GSWindow *window, gpointer data) { /* Grab keyboard so dialog can be used */ gs_grab_move_to_window (grab, gs_window_get_gdk_window (window), gs_window_get_display (window), FALSE); }
static GSWindow * find_window_at_pointer (GSManager *manager) { GdkDisplay *display; GdkDevice *device; GdkMonitor *monitor; int x, y; GSWindow *window; GSList *l; display = gdk_display_get_default (); device = gdk_seat_get_pointer (gdk_display_get_default_seat (display)); gdk_device_get_position (device, NULL, &x, &y); monitor = gdk_display_get_monitor_at_point (display, x, y); /* Find the gs-window that is on that monitor */ window = NULL; for (l = manager->priv->windows; l; l = l->next) { GSWindow *win = GS_WINDOW (l->data); if (gs_window_get_display (win) == display && gs_window_get_monitor (win) == monitor) { window = win; } } if (window == NULL) { gs_debug ("WARNING: Could not find the GSWindow for display %s", gdk_display_get_name (display)); /* take the first one */ window = manager->priv->windows->data; } else { gs_debug ("Requesting unlock for display %s", gdk_display_get_name (display)); } return window; }
static void on_display_monitor_removed (GdkDisplay *display, GdkMonitor *monitor, GSManager *manager) { GSList *l; int n_monitors; n_monitors = gdk_display_get_n_monitors (display); gs_debug ("Monitor removed on display %s, now there are %d", gdk_display_get_name (display), n_monitors); gdk_x11_grab_server (); /* remove the now extra window */ l = manager->priv->windows; while (l != NULL) { GdkDisplay *this_display; GdkMonitor *this_monitor; GSList *next = l->next; 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) { 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); } l = next; } gdk_display_flush (display); gdk_x11_ungrab_server (); }
static void handle_window_dialog_up (GSManager *manager, GSWindow *window) { GSList *l; g_return_if_fail (manager != NULL); g_return_if_fail (GS_IS_MANAGER (manager)); gs_debug ("Handling dialog up"); g_signal_emit (manager, signals [AUTH_REQUEST_BEGIN], 0); manager->priv->dialog_up = TRUE; /* make all other windows insensitive to not get events */ for (l = manager->priv->windows; l; l = l->next) { if (l->data != window) { gtk_widget_set_sensitive (GTK_WIDGET (l->data), FALSE); } } /* move devices grab so that dialog can be used; release the pointer grab while dialog is up so that the dialog can be used. We'll regrab it when the dialog goes down */ gs_debug ("Initiate pointer-less grab move to %p", window); gs_grab_move_to_window (manager->priv->grab, gs_window_get_gdk_window (window), gs_window_get_display (window), TRUE, FALSE); if (! manager->priv->throttled) { gs_debug ("Suspending jobs"); manager_suspend_jobs (manager); } }