Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Berg <benjamin@sipsolutions.net>2011-11-06 17:30:58 (GMT)
committer Benjamin Berg <benjamin@sipsolutions.net>2011-11-06 17:30:58 (GMT)
commit60e57c42036b1ea75101de2b3cbc3b375dd68608 (patch)
tree06883c770af98ea01084feac7de5df981bf61276
parent4eaac2db60b5bff4d44d4b4498636a6279722679 (diff)
Grab the input when opening a palette (in window mode).
-rw-r--r--src/sugar3/graphics/palettewindow.py41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/sugar3/graphics/palettewindow.py b/src/sugar3/graphics/palettewindow.py
index 38848ac..9742ef7 100644
--- a/src/sugar3/graphics/palettewindow.py
+++ b/src/sugar3/graphics/palettewindow.py
@@ -134,6 +134,9 @@ class _PaletteWindowWidget(Gtk.Window):
self._should_accept_focus = True
+ self._have_grab = False
+
+
def set_accept_focus(self, focus):
self._should_accept_focus = focus
if self.get_window() != None:
@@ -183,6 +186,44 @@ class _PaletteWindowWidget(Gtk.Window):
# (Leaving out the window expose handler which redraws everything)
Gtk.Bin.do_draw(self, cr)
+ def do_button_release_event(self, event):
+ alloc = self.get_allocation()
+ x, y = self.get_window().get_position()
+
+ in_window = event.x_root >= x and event.x_root < x + alloc.width and \
+ event.y_root >= y and event.y_root < y + alloc.height
+
+ if not in_window:
+ logging.error("Causing pop down!")
+ self.popdown()
+ return True
+
+ def do_map_event(self, event):
+ if self._have_grab:
+ # We are already popped up apparently.
+ return
+
+ display = self.get_display()
+ manager = display.get_device_manager()
+ self._grab_device = manager.get_client_pointer()
+
+ grab_state = self._grab_device.grab(self.get_window(), Gdk.GrabOwnership.WINDOW, True,
+ Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK |
+ Gdk.EventMask.ENTER_NOTIFY_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK |
+ Gdk.EventMask.POINTER_MOTION_MASK, None, 0)
+
+ self._have_grab = grab_state == Gdk.GrabStatus.SUCCESS
+
+ Gtk.Window.do_map_event(self, event)
+
+ def do_unmap_event(self, event):
+ if self._have_grab:
+ self._grab_device.ungrab(0)
+ self._have_grab = False
+
+ # This is not implemented in GtkWindow, so do not chain up.
+ #Gtk.Window.do_unmap_event(self, event)
+
def popup(self):
self.show()