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.
This commit is contained in:
James Cameron 2016-07-08 12:42:57 +10:00
parent 65fa711e53
commit 433d06b025

View File

@ -1111,6 +1111,7 @@ class WidgetInvoker(Invoker):
self._widget = None self._widget = None
self._expanded = False self._expanded = False
self._pointer_position = (-1, -1)
self._enter_hid = None self._enter_hid = None
self._leave_hid = None self._leave_hid = None
self._release_hid = None self._release_hid = None
@ -1130,6 +1131,8 @@ class WidgetInvoker(Invoker):
else: else:
self._widget = parent self._widget = parent
self._pointer_position = _get_pointer_position(self._widget)
self.notify('widget') self.notify('widget')
self._enter_hid = self._widget.connect('enter-notify-event', self._enter_hid = self._widget.connect('enter-notify-event',
@ -1206,6 +1209,9 @@ class WidgetInvoker(Invoker):
gap[0], gap[1], gap[1] + gap[2]) gap[0], gap[1], gap[1] + gap[2])
def __enter_notify_event_cb(self, widget, event): 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: if event.mode == Gdk.CrossingMode.NORMAL:
self.notify_mouse_enter() self.notify_mouse_enter()
@ -1297,6 +1303,7 @@ class CursorInvoker(Invoker):
Invoker.__init__(self) Invoker.__init__(self)
self._position_hint = self.AT_CURSOR self._position_hint = self.AT_CURSOR
self._pointer_position = (-1, -1)
self._enter_hid = None self._enter_hid = None
self._leave_hid = None self._leave_hid = None
self._release_hid = None self._release_hid = None
@ -1312,6 +1319,9 @@ class CursorInvoker(Invoker):
Invoker.attach(self, parent) Invoker.attach(self, parent)
self._item = parent self._item = parent
self._pointer_position = _get_pointer_position(self.parent)
self._enter_hid = self._item.connect('enter-notify-event', self._enter_hid = self._item.connect('enter-notify-event',
self.__enter_notify_event_cb) self.__enter_notify_event_cb)
self._leave_hid = self._item.connect('leave-notify-event', self._leave_hid = self._item.connect('leave-notify-event',
@ -1346,6 +1356,9 @@ class CursorInvoker(Invoker):
return rect return rect
def __enter_notify_event_cb(self, button, event): 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: if event.mode == Gdk.CrossingMode.NORMAL:
self.notify_mouse_enter() self.notify_mouse_enter()
return False return False