From 60e57c42036b1ea75101de2b3cbc3b375dd68608 Mon Sep 17 00:00:00 2001 From: Benjamin Berg Date: Sun, 06 Nov 2011 17:30:58 +0000 Subject: Grab the input when opening a palette (in window mode). --- 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() -- cgit v0.9.1