From 433d06b025d2e169d53dec40b239fb6d2f6d68e6 Mon Sep 17 00:00:00 2001 From: James Cameron Date: Fri, 8 Jul 2016 12:42:57 +1000 Subject: [PATCH] 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