summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Hua <william.hua@canonical.com>2016-10-14 17:00:34 -0400
committerWilliam Hua <william.hua@canonical.com>2017-01-05 17:57:36 -0500
commit440e80c832b8ef2fd3d8a73993c9fa8ba6192fa2 (patch)
treee413b80b464480f60a82076bb070d38153ed7249
parented0bd0bba29114a893b1355f799f6568dddf5d9a (diff)
downloadgtk+-440e80c832b8ef2fd3d8a73993c9fa8ba6192fa2.tar.gz
mir: track focused window
https://bugzilla.gnome.org/show_bug.cgi?id=775732
-rw-r--r--gdk/mir/gdkmir-private.h4
-rw-r--r--gdk/mir/gdkmirdisplay.c21
-rw-r--r--gdk/mir/gdkmireventsource.c10
3 files changed, 33 insertions, 2 deletions
diff --git a/gdk/mir/gdkmir-private.h b/gdk/mir/gdkmir-private.h
index 69f927fab9..0ccf28e0b3 100644
--- a/gdk/mir/gdkmir-private.h
+++ b/gdk/mir/gdkmir-private.h
@@ -107,6 +107,10 @@ void _gdk_mir_event_source_queue (GdkMirWindowReference *window_ref, const MirEv
MirPixelFormat _gdk_mir_display_get_pixel_format (GdkDisplay *display, MirBufferUsage usage);
+void _gdk_mir_display_focus_window (GdkDisplay *display, GdkWindow *window);
+
+void _gdk_mir_display_unfocus_window (GdkDisplay *display, GdkWindow *window);
+
gboolean _gdk_mir_display_init_egl_display (GdkDisplay *display);
EGLDisplay _gdk_mir_display_get_egl_display (GdkDisplay *display);
diff --git a/gdk/mir/gdkmirdisplay.c b/gdk/mir/gdkmirdisplay.c
index 77fa665b71..0e37794afe 100644
--- a/gdk/mir/gdkmirdisplay.c
+++ b/gdk/mir/gdkmirdisplay.c
@@ -51,6 +51,8 @@ typedef struct GdkMirDisplay
GdkKeymap *keymap;
+ GdkWindow *focused_window;
+
MirPixelFormat sw_pixel_format;
MirPixelFormat hw_pixel_format;
@@ -622,6 +624,25 @@ _gdk_mir_display_get_pixel_format (GdkDisplay *display,
return mir_dpy->sw_pixel_format;
}
+void
+_gdk_mir_display_focus_window (GdkDisplay *display,
+ GdkWindow *window)
+{
+ GdkMirDisplay *mir_display = GDK_MIR_DISPLAY (display);
+
+ g_set_object (&mir_display->focused_window, window);
+}
+
+void
+_gdk_mir_display_unfocus_window (GdkDisplay *display,
+ GdkWindow *window)
+{
+ GdkMirDisplay *mir_display = GDK_MIR_DISPLAY (display);
+
+ if (window == mir_display->focused_window)
+ g_clear_object (&mir_display->focused_window);
+}
+
gboolean
_gdk_mir_display_init_egl_display (GdkDisplay *display)
{
diff --git a/gdk/mir/gdkmireventsource.c b/gdk/mir/gdkmireventsource.c
index 8c7e106370..a2a1a128b7 100644
--- a/gdk/mir/gdkmireventsource.c
+++ b/gdk/mir/gdkmireventsource.c
@@ -240,9 +240,15 @@ generate_focus_event (GdkWindow *window, gboolean focused)
GdkEvent *event;
if (focused)
- gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FOCUSED);
+ {
+ gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FOCUSED);
+ _gdk_mir_display_focus_window (gdk_window_get_display (window), window);
+ }
else
- gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FOCUSED, 0);
+ {
+ gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FOCUSED, 0);
+ _gdk_mir_display_unfocus_window (gdk_window_get_display (window), window);
+ }
event = gdk_event_new (GDK_FOCUS_CHANGE);
event->focus_change.send_event = FALSE;