Changeset 78
- Timestamp:
- 12/06/07 12:54:22
- Files:
-
- action_groups/trunk/ActionBrowser.py (modified) (14 diffs)
- action_groups/trunk/atspi.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
action_groups/trunk/ActionBrowser.py
r77 r78 14 14 import gobject 15 15 16 from ActionModel import ActionModel 16 from ActionModel import ActionModel, ActionGroup 17 17 18 18 _ = lambda x: x … … 104 104 105 105 def _onExamine(self, button): 106 acc = self.groups_tree.get_selected_acc() 107 if acc is not None and self.node is not None: 108 self.node.update(acc) 106 if self.node is not None: 107 acc = self.groups_tree.get_selected_acc() 108 if acc is not None : 109 self.node.update(acc) 109 110 110 111 def _onScan(self, button): … … 124 125 125 126 def _onRowActivated(self, treeview, path, column): 126 self._onExamine(None) 127 #acc = self.groups_tree.get_acc_from_path(path) 128 #self.node.update(acc) 127 if self.node is not None: 128 self._onExamine(None) 129 acc = self.groups_tree.get_acc_from_path(path) 130 self.node.update(acc) 131 else: 132 self._onAction(None) 129 133 130 134 def _onSelectionChanged(self, selection): … … 145 149 146 150 class ActionTree(gtk.TreeView): 151 EVENTS = ('object', 'window', 'focus') 152 EVENTS = ('focus') 153 147 154 def __init__(self): 148 155 gtk.TreeView.__init__(self) 149 156 self.connect('row-expanded', self._onExpanded) 150 157 self.connect('row-collapsed', self._onCollapsed) 158 self.connect('destroy', self._onDestroy) 151 159 152 160 crt = gtk.CellRendererText() … … 161 169 self.append_column(tvc) 162 170 163 pyatspi.Registry.registerEventListener(self._onAccEventState, 'object', 'window', 'focus') 164 pyatspi.Registry.registerEventListener(self._onAccEventState, 'object:state-changed') 171 pyatspi.Registry.registerEventListener(self._onATSPIEvent, *ActionTree.EVENTS) 165 172 #self.set_property('fixed-height-mode', True) # speed display 166 173 … … 203 210 self.set_model(model) 204 211 205 def _ _del__(self):206 self.deRegisterEventListener(self._onAccEventState, 'object:state-changed')212 def _onDestroy(self, object): 213 pyatspi.Registry.deregisterEventListener(self._onATSPIEvent, *ActionTree.EVENTS) 207 214 208 215 def select(self, iter): … … 227 234 self.select(nextiter) 228 235 229 def _onAccEventState(self, event): 230 ''' 231 Callback for accessible state changes. Repopulates the states model. 232 233 @param event: Event that triggered this callback. 234 @type event: Accessibility.Event 235 ''' 236 def _onATSPIEvent(self, event): 237 if event.source.getApplication() == self.get_acc_from_path(0).getApplication(): 238 gobject.idle_add(self._processEventOnIdle, event) 239 240 def _processEventOnIdle(self, event): 236 241 if not self.get_model(): 237 return238 if event.source.getApplication() <> self.get_acc_from_path(0).getApplication():239 242 return 240 243 model, iter, acc = self._getSelection() 241 244 if acc is None: 242 245 return 243 #printEvent(event) 246 247 printEvent(event) 248 244 249 if event.source.getRole() == pyatspi.ROLE_WINDOW \ 245 250 and event.type in ('object:state-changed:showing'): … … 247 252 path = model.get_path(iter) 248 253 249 if showing:# \ 250 # and not model.iter_has_child(iter): 251 model.makeExpandable(iter) 252 #model.addSubTree(event.source, None) 253 model.popLevel(iter) 254 self.expand_row(path, False) 255 acc.is_group = True 254 if showing: 255 if acc.hasRoleIn(pyatspi.ROLE_MENU): 256 model.makeExpandable(iter) 257 model.popLevel(iter) 258 self.expand_row(path, False) 259 acc.is_group = True 260 self.next() 261 #dumpAcc(event.source) 256 262 257 263 elif not showing: … … 265 271 self.get_selection().select_iter(menu_iter) 266 272 273 return False # remove this from idle processing 274 267 275 def do_action(self): 268 276 model, iter, acc = self._getSelection() … … 270 278 path = model.get_path(iter) 271 279 acc.grabFocus() 272 280 273 281 if acc.isEditable(): 274 282 try: … … 283 291 acc.generateClick() 284 292 else: 285 acc.doAction() 293 acc.generateClick() 294 #acc.doAction() 286 295 287 296 if acc.isHyperlink(): … … 294 303 print 'zzz' + str(path) 295 304 model.popToPath(path) 296 self.expandToPath(path)297 selection.select_path(path)305 goToPath(path) 306 return 298 307 299 308 elif acc.isSelectable(): 309 print 'selectable' 300 310 acc.toggleSectable() 301 311 302 if getattr(acc, 'is_group', False) and acc.is_group: 312 # if getattr(acc, 'is_group', False) and acc.is_group: 313 if acc.is_group: 303 314 if self.row_expanded(path): 304 315 if acc.getRole() == pyatspi.ROLE_MENU: … … 311 322 self.next() 312 323 313 def expandToPath(self, path): 314 for i in xrange(1, len(path)): 315 self.expand_row(path[:i], False) 316 324 def goToPath(self, path): 325 if len(path) > 1: 326 self.expand_to_path(path[:-1]) 327 self.scroll_to_cell(path) 328 selection = self.get_selection() 329 selection.select_path(path) 330 317 331 class MessageBox(): 318 332 def __init__(self, parent, message): … … 375 389 print '\t', ad.x, ad.y, ad.width, ad.height 376 390 391 def dumpAcc(acc, level=0): 392 #if level == 0: 393 # print 'Dumping' 394 #print ' ' * level + str(acc) 395 level += 1 396 for child_acc in acc: 397 if child_acc is None: continue 398 dumpAcc(child_acc, level) action_groups/trunk/atspi.py
r73 r78 1 1 import pyatspi 2 import time 2 from os import times 3 from gobject import idle_add 4 5 def dumpAccTree(acc, level=0): 6 if level == 0: 7 print 'Dumping' 8 print ' ' * level + str(acc) 9 level += 1 10 for child_acc in acc: 11 if child_acc is None: continue 12 dumpAccTree(child_acc, level) 3 13 4 14 def eventCallback(event): 5 app = event.source.getApplication() 6 if app is not None and app.name not in ('gedit', 'zgnome-terminal', 'zMinefield', 'rhythmbox', 'nautilus'): 7 return 8 9 t = time.localtime() 10 ts = '%s:%s' % (t[4], t[5]) 11 print ts, event.type, event.detail1, event.detail2, \ 12 (str(event.any_data) if event.any_data else ''), \ 13 '\n\t', event.host_application, event.source, repr(event.source_role) 14 if isinstance(event.any_data, pyatspi.Accessibility.BoundingBox): 15 ad = event.any_data 16 print '\t', ad.x, ad.y, ad.width, ad.height 15 acc = event.source 16 app = acc.getApplication() 17 if app is not None and app.name not in ('gedit', 'zgnome-terminal', 'zMinefield', 'rhythmbox', 'nautilus'): 18 return 17 19 18 #pyatspi.Registry.registerEventListener(eventCallback, 'object:state-changed') 19 pyatspi.Registry.registerEventListener(eventCallback, 'object', 'window') 20 def printEvent(): 21 ts = int(times()[-1] % 10000) 22 print ts, event.type, event.detail1, event.detail2, \ 23 (str(event.any_data) if event.any_data else ''), \ 24 '\n\t', event.host_application, event.source, repr(event.source_role) 25 if isinstance(event.any_data, pyatspi.Accessibility.BoundingBox): 26 ad = event.any_data 27 print '\t', ad.x, ad.y, ad.width, ad.height 28 if event.source.getRole() == pyatspi.ROLE_WINDOW \ 29 and event.type.startswith(('object:state-changed:showing',)): 30 showing = bool(event.detail1) 31 if showing: 32 dumpAccTree(event.source) 33 # if event.type.startswith('object:children-changed:add'): 34 # print acc.childCount, len(acc) 35 # a = acc[event.detail1] 36 # dumpAccTree(a) 37 38 return False 39 40 idle_add(printEvent) 41 42 EVENTS = ('document', 'focus', 'object', 'window', 'terminal') 43 pyatspi.Registry.registerEventListener(eventCallback, *EVENTS) 20 44 21 45 try: 22 pyatspi.Registry.start()46 pyatspi.Registry.start() 23 47 except KeyboardInterrupt: 24 pass 25 26 pyatspi.printCache() 48 pass 27 49 28 50 #cleanup 29 51 pyatspi.Registry.stop() 30 pyatspi.Registry.deregisterEventListener(eventCallback, 'object', 'window') 52 pyatspi.Registry.deregisterEventListener(eventCallback, *EVENTS) 53
