From 9cbe6b862ce2d8f17e7f582941bbaea365dbc14c Mon Sep 17 00:00:00 2001 From: "Andrew P." Date: Tue, 17 Dec 2013 23:57:16 +0300 Subject: Fixed: focus-only-under-mouse bug --- src/lightdm-gtk-greeter.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/lightdm-gtk-greeter.c b/src/lightdm-gtk-greeter.c index 94bf5b7..c4453ef 100644 --- a/src/lightdm-gtk-greeter.c +++ b/src/lightdm-gtk-greeter.c @@ -1748,6 +1748,47 @@ 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) + keyboard_xid = gdk_x11_window_get_xid (keyboard_win); + + 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) { @@ -2221,6 +2262,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(); -- cgit v1.2.1 From a0249517aaf4d6c368fdb8f498282b59248eab39 Mon Sep 17 00:00:00 2001 From: "Andrew P." Date: Wed, 18 Dec 2013 00:21:15 +0300 Subject: Fixed: focus-only-under-mouse bug. Gtk2 version --- src/lightdm-gtk-greeter.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lightdm-gtk-greeter.c b/src/lightdm-gtk-greeter.c index c4453ef..8c0d02f 100644 --- a/src/lightdm-gtk-greeter.c +++ b/src/lightdm-gtk-greeter.c @@ -1762,8 +1762,12 @@ focus_upon_map (GdkXEvent *gxevent, GdkEvent *event, gpointer data) /* Check to see if this window is our onboard window, since we don't want to focus it. */ if (keyboard_win) - keyboard_xid = gdk_x11_window_get_xid (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); -- cgit v1.2.1