[orca] Work around missing focus-change events when focus changes due to mouse click



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]