Changeset 2022

Show
Ignore:
Timestamp:
05/06/08 18:32:38 (7 months ago)
Author:
mdcurran
Message:

Changes to make better use of IAccIdentity. IAccessiblehandler.getIAccIdentityString is now IAccessiblehandler.getIAccIdentity, and returns a dictionary of possible 'childID', 'objectID', 'windowHandle', and 'menuHandle'. IAccessible NVDAObject now makes use of this better by filling in event_childID, event_objectID and event_windowHandle, if one of them is still None. This now means that for objects that properly support IAccIdentity, events will definitely reach it, even if the object itself wasn't created specifically from an event.

Location:
trunk/source
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/source/IAccessibleHandler.py

    r2020 r2022  
    149149import itertools 
    150150import time 
     151import struct 
    151152from ctypes import * 
    152153from ctypes.wintypes import * 
     
    935936 
    936937 
    937 def getIAccIdentityString(pacc,childID): 
    938         p,s=pacc.QueryInterface(IAccIdentity).getIdentityString(childID) 
    939         p=cast(p,POINTER(c_char*s)) 
    940         return p.contents.raw 
     938def getIAccIdentity(pacc,childID): 
     939        stringPtr,stringSize=pacc.QueryInterface(IAccIdentity).getIdentityString(childID) 
     940        stringPtr=cast(stringPtr,POINTER(c_char*stringSize)) 
     941        s=p.contents.raw 
     942        fields=struct.unpack('IIII',s) 
     943        d={} 
     944        d['childID']=fields[3] 
     945        if fields[0]&2: 
     946                d['menuHandle']=fields[2] 
     947        else: 
     948                d['objectID']=fields[2] 
     949                d['windowHandle']=fields[1] 
     950        return d 
    941951 
    942952def findGroupboxObject(obj): 
  • trunk/source/NVDAObjects/IAccessible/__init__.py

    r2017 r2022  
    77import weakref 
    88import re 
     9import struct 
    910import os 
    1011import tones 
     
    177178                if not windowHandle: 
    178179                        windowHandle=IAccessibleHandler.windowFromAccessibleObject(IAccessibleObject) 
    179                 if not windowHandle: 
     180                if not windowHandle and event_windowHandle: 
     181                        windowHandle=event_windowHandle 
     182                elif not windowHandle: 
    180183                        return None #We really do need a window handle 
    181184                windowClassName=winUser.getClassName(windowHandle) 
     
    224227                self.IAccessibleObject=IAccessibleObject 
    225228                self.IAccessibleChildID=IAccessibleChildID 
     229                Identity=self.IAccessibleIdentity 
     230                if event_windowHandle is None and Identity and 'windowHandle' in Identity: 
     231                        event_windowHandle=Identity['windowHandle'] 
     232                if event_objectID is None and Identity and 'objectID' in Identity: 
     233                        event_objectID=Identity['objectID'] 
     234                if event_childID is None and Identity and 'childID' in Identity: 
     235                        event_childID=Identity['childID'] 
     236                if event_childID is None: 
     237                        event_childID=IAccessibleChildID 
    226238                self.event_windowHandle=event_windowHandle 
    227239                self.event_objectID=event_objectID 
     
    291303                if not super(IAccessible,self)._isEqual(other): 
    292304                        return False 
    293                 selfIden=self.IAccessibleIdentityString 
    294                 otherIden=other.IAccessibleIdentityString 
     305                selfIden=self.IAccessibleIdentity 
     306                otherIden=other.IAccessibleIdentity 
    295307                if selfIden!=otherIden: 
    296308                        return False 
     
    331343                        self.IAccessibleObject.accDoDefaultAction() 
    332344 
    333         def _get_IAccessibleIdentityString(self): 
    334                 if not hasattr(self,'_IAccessibleIdentityString'): 
     345        def _get_IAccessibleIdentity(self): 
     346                if not hasattr(self,'_IAccessibleIdentity'): 
    335347                        try: 
    336                                 self._IAccessibleIdentityString=IAccessibleHandler.getIAccIdentityString(self.IAccessibleObject,self.IAccessibleChildID) 
     348                                self._IAccessibleIdentity=IAccessibleHandler.getIAccIdentity(self.IAccessibleObject,self.IAccessibleChildID) 
    337349                        except: 
    338                                 self._IAccessibleIdentityString=None 
    339                 return self._IAccessibleIdentityString 
     350                                self._IAccessibleIdentity=None 
     351                return self._IAccessibleIdentity 
    340352 
    341353        def _get_IAccessibleRole(self):