From 552c7da884dabbd95388013f354a07f4896e45df Mon Sep 17 00:00:00 2001 From: James Cameron Date: Fri, 8 Jul 2016 11:53:37 +1000 Subject: [PATCH 1/3] remove surplus message The log message "PaletteWindowWidget popup get_visible True" is not useful, and is removed. It can be made to occur in Terminal by repeated right-click on any of the first three toolbar button. --- src/sugar3/graphics/palettewindow.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/sugar3/graphics/palettewindow.py b/src/sugar3/graphics/palettewindow.py index 3889cf0f..b0c0bf14 100644 --- a/src/sugar3/graphics/palettewindow.py +++ b/src/sugar3/graphics/palettewindow.py @@ -394,7 +394,6 @@ class _PaletteWindowWidget(Gtk.Window): def popup(self, invoker): if self.get_visible(): - logging.error('PaletteWindowWidget popup get_visible True') return self.connect('enter-notify-event', self.__enter_notify_event_cb) self.connect('leave-notify-event', self.__leave_notify_event_cb) From 65fa711e53fdb130ebe52e9542526d01e1db5b7f Mon Sep 17 00:00:00 2001 From: James Cameron Date: Fri, 8 Jul 2016 12:40:04 +1000 Subject: [PATCH 2/3] refactor pointer position get Move common code into a function, and cache Gdk.Device client pointer. --- src/sugar3/graphics/palettewindow.py | 37 ++++++++++++---------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/src/sugar3/graphics/palettewindow.py b/src/sugar3/graphics/palettewindow.py index b0c0bf14..eefe2e81 100644 --- a/src/sugar3/graphics/palettewindow.py +++ b/src/sugar3/graphics/palettewindow.py @@ -38,6 +38,18 @@ from sugar3.graphics import style from sugar3.graphics.icon import CellRendererIcon +_pointer = None + +def _get_pointer_position(widget): + global _pointer + + if _pointer is None: + display = widget.get_display() + manager = display.get_device_manager() + _pointer = manager.get_client_pointer() + screen, x, y = _pointer.get_position() + return (x, y) + def _calculate_gap(a, b): """Helper function to find the gap position and size of widget a""" # Test for each side if the palette and invoker are @@ -436,7 +448,7 @@ class MouseSpeedDetector(GObject.GObject): def start(self): self.stop() - self._mouse_pos = self._get_mouse_position() + self._mouse_pos = _get_pointer_position(self.parent) self._timeout_hid = GLib.timeout_add(self._delay, self._timer_cb) def stop(self): @@ -445,19 +457,9 @@ class MouseSpeedDetector(GObject.GObject): self._timeout_hid = None self._state = None - def _get_mouse_position(self): - if hasattr(self.parent, 'get_display'): - display = self.parent.get_display() - else: - display = Gdk.Display.get_default() - manager = display.get_device_manager() - pointer_device = manager.get_client_pointer() - screen, x, y = pointer_device.get_position() - return (x, y) - def _detect_motion(self): oldx, oldy = self._mouse_pos - (x, y) = self._get_mouse_position() + (x, y) = _get_pointer_position(self.parent) self._mouse_pos = (x, y) dist2 = (oldx - x) ** 2 + (oldy - y) ** 2 @@ -844,15 +846,8 @@ class Invoker(GObject.GObject): invoker_valign = alignment[3] if self._cursor_x == -1 or self._cursor_y == -1: - if hasattr(self.parent, 'get_display'): - display = self.parent.get_display() - else: - display = Gdk.Display.get_default() - manager = display.get_device_manager() - pointer_device = manager.get_client_pointer() - screen, x, y = pointer_device.get_position() - self._cursor_x = x - self._cursor_y = y + position = _get_pointer_position(self.parent) + (self._cursor_x, self._cursor_y) = position if self._position_hint is self.ANCHORED: rect = self.get_rect() From 433d06b025d2e169d53dec40b239fb6d2f6d68e6 Mon Sep 17 00:00:00 2001 From: James Cameron Date: Fri, 8 Jul 2016 12:42:57 +1000 Subject: [PATCH 3/3] avoid uncommanded palettes Problem #1, buddy menu appears on Sugar startup on physical hardware, or when mouse is centre of display. Problem #2, Terminal toolbar steals keyboard focus, when mouse is left in home view search box at activity start time. Regressions were introduced in the port from Gtk2 to Gtk3. Cause is enter-notify-events that arrive because cursor is already present in widgets as they are realised and mapped. Fix is to capture cursor position when the widget is being created, and ignore enter-notify-event if the same position is seen. --- src/sugar3/graphics/palettewindow.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/sugar3/graphics/palettewindow.py b/src/sugar3/graphics/palettewindow.py index eefe2e81..34a8a9cf 100644 --- a/src/sugar3/graphics/palettewindow.py +++ b/src/sugar3/graphics/palettewindow.py @@ -1111,6 +1111,7 @@ class WidgetInvoker(Invoker): self._widget = None self._expanded = False + self._pointer_position = (-1, -1) self._enter_hid = None self._leave_hid = None self._release_hid = None @@ -1130,6 +1131,8 @@ class WidgetInvoker(Invoker): else: self._widget = parent + self._pointer_position = _get_pointer_position(self._widget) + self.notify('widget') self._enter_hid = self._widget.connect('enter-notify-event', @@ -1206,6 +1209,9 @@ class WidgetInvoker(Invoker): gap[0], gap[1], gap[1] + gap[2]) def __enter_notify_event_cb(self, widget, event): + if (event.x_root, event.y_root) == self._pointer_position: + self._pointer_position = (-1, -1) + return False if event.mode == Gdk.CrossingMode.NORMAL: self.notify_mouse_enter() @@ -1297,6 +1303,7 @@ class CursorInvoker(Invoker): Invoker.__init__(self) self._position_hint = self.AT_CURSOR + self._pointer_position = (-1, -1) self._enter_hid = None self._leave_hid = None self._release_hid = None @@ -1312,6 +1319,9 @@ class CursorInvoker(Invoker): Invoker.attach(self, parent) self._item = parent + + self._pointer_position = _get_pointer_position(self.parent) + self._enter_hid = self._item.connect('enter-notify-event', self.__enter_notify_event_cb) self._leave_hid = self._item.connect('leave-notify-event', @@ -1346,6 +1356,9 @@ class CursorInvoker(Invoker): return rect def __enter_notify_event_cb(self, button, event): + if (event.x_root, event.y_root) == self._pointer_position: + self._pointer_position = (-1, -1) + return False if event.mode == Gdk.CrossingMode.NORMAL: self.notify_mouse_enter() return False