diff options
author | Sean Davis <smd.seandavis@gmail.com> | 2013-12-26 12:23:43 -0500 |
---|---|---|
committer | Sean Davis <smd.seandavis@gmail.com> | 2013-12-26 12:23:43 -0500 |
commit | 51f6c956668cc30f415f4368a5600a1d92093d88 (patch) | |
tree | 0a21c4894413c82ed2a165461b33d33f0b933bae | |
parent | 44c9fcb8da5197a1161e6669ec435a62f6970346 (diff) | |
parent | a0249517aaf4d6c368fdb8f498282b59248eab39 (diff) | |
download | lightdm-gtk-greeter-51f6c956668cc30f415f4368a5600a1d92093d88.tar.gz |
Merge focus_fix branch
-rw-r--r-- | src/lightdm-gtk-greeter.c | 50 |
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(); |