[gnome-boxes/wip/ungrab-focus2: 1/3] tmp: ungrab focuses event_box



commit 49b31806bf09aa9452a18379e36e5329524e56ca
Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
Date:   Fri Dec 11 15:17:25 2015 +0000

    tmp: ungrab focuses event_box

 data/ui/display-page.ui    |    1 +
 data/ui/display-toolbar.ui |    1 +
 src/display-page.vala      |   44 +++++++++++++++++++++++++++++++++++++++++---
 3 files changed, 43 insertions(+), 3 deletions(-)
---
diff --git a/data/ui/display-page.ui b/data/ui/display-page.ui
index 24da3be..fe6a8fc 100644
--- a/data/ui/display-page.ui
+++ b/data/ui/display-page.ui
@@ -45,6 +45,7 @@
               <object class="GtkEventBox" id="event_box">
                 <property name="visible">True</property>
                 <property name="above-child">True</property>
+                <property name="can-focus">True</property>
                 <property name="hexpand">True</property>
                 <property name="vexpand">True</property>
                 <signal name="event" handler="on_event_box_event"/>
diff --git a/data/ui/display-toolbar.ui b/data/ui/display-toolbar.ui
index 65a2721..544d058 100644
--- a/data/ui/display-toolbar.ui
+++ b/data/ui/display-toolbar.ui
@@ -3,6 +3,7 @@
   <!-- interface-requires gtk+ 3.9 -->
   <template class="BoxesDisplayToolbar" parent="GtkHeaderBar">
     <property name="visible">True</property>
+    <property name="can-focus">True</property>
     <style>
       <class name="titlebar"/>
     </style>
diff --git a/src/display-page.vala b/src/display-page.vala
index 9741ab8..8faf5c3 100644
--- a/src/display-page.vala
+++ b/src/display-page.vala
@@ -54,7 +54,10 @@ private class Boxes.DisplayPage: Gtk.Box {
         this.window = window;
 
         overlay_toolbar_invisible_timeout = AppWindow.TRANSITION_DURATION;
-        event_box.set_events (EventMask.POINTER_MOTION_MASK | EventMask.SCROLL_MASK);
+        event_box.set_events (EventMask.POINTER_MOTION_MASK |
+                              EventMask.SCROLL_MASK |
+                              EventMask.KEY_PRESS_MASK |
+                              EventMask.KEY_RELEASE_MASK);
 
         window.window_state_event.connect ((event) => {
             update_toolbar_visible ();
@@ -138,6 +141,9 @@ private class Boxes.DisplayPage: Gtk.Box {
             });
         });
         keyboard_grabbed_id = display.notify["keyboard-grabbed"].connect(() => {
+            if (!display.keyboard_grabbed)
+                event_box.grab_focus ();
+
             Idle.add_full (Priority.HIGH, () => {
                 update_subtitle ();
                 return false;
@@ -203,8 +209,13 @@ private class Boxes.DisplayPage: Gtk.Box {
         return widget;
     }
 
+    private bool ctrl_released;
+    private bool alt_released;
+
     [GtkCallback]
     private bool on_event_box_event (Gdk.Event event) {
+        //print ("event: %s\n", event.type.to_string ());
+
         if (window.fullscreened && event.type == EventType.MOTION_NOTIFY) {
             var x = event.motion.x;
             var y = event.motion.y;
@@ -238,8 +249,35 @@ private class Boxes.DisplayPage: Gtk.Box {
         if (event.type == EventType.GRAB_BROKEN)
             return false;
 
-        if (event_box.get_child () != null)
-            event_box.get_child ().event (event);
+        var widget = event_box.get_child ();
+
+        if (event.type == EventType.KEY_PRESS)
+            return false;
+
+        if (event.type == EventType.KEY_RELEASE) {
+            print ("key released\n");
+            // Receiving key events mean event_box is focused & keyboard in ungrabbed
+            if (event.key.keyval == Key.Control_L)
+                ctrl_released = true;
+            else if (event.key.keyval == Key.Alt_L)
+                alt_released = true;
+
+            if (ctrl_released && alt_released) {
+                print ("all released\n");
+                ctrl_released = false;
+                alt_released = false;
+
+                if (widget != null) {
+                    print ("focusing\n");
+                    widget.grab_focus ();
+                }
+            }
+
+            return false;
+        }
+
+        if (widget != null)
+            widget.event (event);
 
         return false;
     }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]