[orca] Work around missing focus-change events when focus changes due to mouse click
- From: Joanmarie Diggs <joanied src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [orca] Work around missing focus-change events when focus changes due to mouse click
- Date: Mon, 30 Jan 2017 17:28:31 +0000 (UTC)
commit 89dcd075cca8bf12ae1adf7710eda6447a9a01c0
Author: Joanmarie Diggs <jdiggs igalia com>
Date: Mon Jan 30 11:42:55 2017 +0100
Work around missing focus-change events when focus changes due to mouse click
src/orca/event_manager.py | 3 ++-
src/orca/input_event.py | 39 +++++++++++++++++++++++++++++++++++++++
src/orca/scripts/default.py | 8 ++++++--
3 files changed, 47 insertions(+), 3 deletions(-)
---
diff --git a/src/orca/event_manager.py b/src/orca/event_manager.py
index 57a451a..b110bd9 100644
--- a/src/orca/event_manager.py
+++ b/src/orca/event_manager.py
@@ -301,7 +301,8 @@ class EventManager:
toolkitName = app.toolkitName
except:
toolkitName = None
- if toolkitName in self._synchronousToolkits:
+ if toolkitName in self._synchronousToolkits \
+ or isinstance(e, input_event.MouseButtonEvent):
asyncMode = False
script = _scriptManager.getScript(app, e.source)
script.eventCache[e.type] = (e, time.time())
diff --git a/src/orca/input_event.py b/src/orca/input_event.py
index e4a79c6..b64ba3d 100644
--- a/src/orca/input_event.py
+++ b/src/orca/input_event.py
@@ -27,8 +27,10 @@ __copyright__ = "Copyright (c) 2005-2008 Sun Microsystems Inc." \
"Copyright (c) 2011-2016 Igalia, S.L."
__license__ = "LGPL"
+import math
import pyatspi
import time
+from gi.repository import Gdk
from gi.repository import GLib
from . import debug
@@ -680,6 +682,13 @@ class BrailleEvent(InputEvent):
class MouseButtonEvent(InputEvent):
+ try:
+ display = Gdk.Display.get_default()
+ seat = Gdk.Display.get_default_seat(display)
+ _pointer = seat.get_pointer()
+ except:
+ _pointer = None
+
def __init__(self, event):
"""Creates a new InputEvent of type MOUSE_BUTTON_EVENT."""
@@ -688,6 +697,35 @@ class MouseButtonEvent(InputEvent):
self.y = event.detail2
self.pressed = event.type.endswith('p')
self.button = event.type[len("mouse:button:"):-1]
+ self._script = orca_state.activeScript
+ self.window = None
+ self.obj = None
+
+ if self.pressed:
+ self._validateCoordinates()
+
+ if not self._script:
+ return
+
+ self.window = self._script.utilities.activeWindow()
+ if not self.window:
+ return
+
+ self.obj = self._script.utilities.descendantAtPoint(
+ self.window, self.x, self.y, event.any_data)
+
+ def _validateCoordinates(self):
+ if not self._pointer:
+ return
+
+ screen, x, y = self._pointer.get_position()
+ if math.sqrt((self.x - x)**2 + (self.y - y)**2) < 25:
+ return
+
+ msg = "WARNING: Event coordinates (%i, %i) may be bogus. " \
+ "Updating to (%i, %i)." % (self.x, self.y, x, y)
+ debug.println(debug.LEVEL_INFO, msg, True)
+ self.x, self.y = x, y
def setClickCount(self):
"""Updates the count of the number of clicks a user has made."""
@@ -695,6 +733,7 @@ class MouseButtonEvent(InputEvent):
if not self.pressed:
return
+ lastInputEvent = orca_state.lastInputEvent
if not isinstance(lastInputEvent, MouseButtonEvent):
self._clickCount = 1
return
diff --git a/src/orca/scripts/default.py b/src/orca/scripts/default.py
index 924d181..55b849c 100644
--- a/src/orca/scripts/default.py
+++ b/src/orca/scripts/default.py
@@ -2274,9 +2274,13 @@ class Script(script.Script):
mouseEvent = input_event.MouseButtonEvent(event)
orca_state.lastInputEvent = mouseEvent
+ if not mouseEvent.pressed:
+ return
- if mouseEvent.pressed:
- speech.stop()
+ speech.stop()
+ obj = mouseEvent.obj
+ if obj and obj.getState().contains(pyatspi.STATE_FOCUSED):
+ orca.setLocusOfFocus(None, obj, False)
def onNameChanged(self, event):
"""Callback for object:property-change:accessible-name events."""
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]