summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Davis <smd.seandavis@gmail.com>2013-12-26 12:23:43 -0500
committerSean Davis <smd.seandavis@gmail.com>2013-12-26 12:23:43 -0500
commit51f6c956668cc30f415f4368a5600a1d92093d88 (patch)
tree0a21c4894413c82ed2a165461b33d33f0b933bae
parent44c9fcb8da5197a1161e6669ec435a62f6970346 (diff)
parenta0249517aaf4d6c368fdb8f498282b59248eab39 (diff)
downloadlightdm-gtk-greeter-51f6c956668cc30f415f4368a5600a1d92093d88.tar.gz
Merge focus_fix branch
-rw-r--r--src/lightdm-gtk-greeter.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/lightdm-gtk-greeter.c b/src/lightdm-gtk-greeter.c
index 224cccc..87194f8 100644
--- a/src/lightdm-gtk-greeter.c
+++ b/src/lightdm-gtk-greeter.c
@@ -1754,6 +1754,51 @@ read_position_from_str (const gchar *s, DimensionPosition *x)
return x != NULL;
}
+static GdkFilterReturn
+focus_upon_map (GdkXEvent *gxevent, GdkEvent *event, gpointer data)
+{
+ XEvent* xevent = (XEvent*)gxevent;
+ if (xevent->type == MapNotify)
+ {
+ Window xwin = xevent->xmap.window;
+ Window keyboard_xid = 0;
+ GdkDisplay* display = gdk_x11_lookup_xdisplay (xevent->xmap.display);
+ GdkWindow* win = gdk_x11_window_foreign_new_for_display (display, xwin);
+ GdkWindow* keyboard_win = onboard_window ? gtk_widget_get_window (GTK_WIDGET (onboard_window)) : NULL;
+
+ /* Check to see if this window is our onboard window, since we don't want to focus it. */
+ if (keyboard_win)
+#if GTK_CHECK_VERSION (3, 0, 0)
+ keyboard_xid = gdk_x11_window_get_xid (keyboard_win);
+#else
+ keyboard_xid = gdk_x11_drawable_get_xid (keyboard_win);
+#endif
+
+ if (xwin != keyboard_xid && gdk_window_get_type_hint (win) != GDK_WINDOW_TYPE_HINT_NOTIFICATION)
+ {
+ gdk_window_focus (win, GDK_CURRENT_TIME);
+ /* Make sure to keep keyboard above */
+ if (onboard_window)
+ gdk_window_raise (keyboard_win);
+ }
+ }
+ else if (xevent->type == UnmapNotify)
+ {
+ Window xwin;
+ int revert_to;
+ XGetInputFocus (xevent->xunmap.display, &xwin, &revert_to);
+
+ if (revert_to == RevertToNone)
+ {
+ gdk_window_focus (gtk_widget_get_window (GTK_WIDGET (login_window)), GDK_CURRENT_TIME);
+ /* Make sure to keep keyboard above */
+ if (onboard_window)
+ gdk_window_raise (gtk_widget_get_window (GTK_WIDGET (onboard_window)));
+ }
+ }
+ return GDK_FILTER_CONTINUE;
+}
+
int
main (int argc, char **argv)
{
@@ -2244,6 +2289,11 @@ main (int argc, char **argv)
gdk_threads_add_timeout( 100, (GSourceFunc) clock_timeout_thread, NULL );
+ /* focus fix (source: unity-greeter) */
+ GdkWindow* root_window = gdk_get_default_root_window ();
+ gdk_window_set_events (root_window, gdk_window_get_events (root_window) | GDK_SUBSTRUCTURE_MASK);
+ gdk_window_add_filter (root_window, focus_upon_map, NULL);
+
#if GTK_CHECK_VERSION (3, 0, 0)
#else
gdk_threads_enter();