def gotResults_bumpMouse(self, words, fullResults): """ usage: <x-axis increment> <y-axis increment> bump <integer multiplier> """ # register required displacement integer 's\s x_disp = int(words[0]) y_disp = int(words[1]) # do we have a multiplier? mult = 1 if len(words) > 4: mult = int(words[4]) logger.error( "mult:%d" % (mult)) # get current position x, y = natlink.getCursorPos() logger.error("x:%d y:%d" % (x,y)) # coordinate calculated using row and column pixel offset * multiplier if int(words[0]) != 0: x = x + x_disp*mult if int(words[1]) != 0: y = y + y_disp*mult logger.error("x:%d y:%d drag" % (x,y)) # get the equivalent event code of the type of mouse event to perform # leftclick, rightclick, rightdouble-click (currently left click) event = self.kmap['leftclick'] # play events down click and then release (for left double click # increment from left button up event which produces no action # then when incremented, performs the double-click) natlink.playEvents([(wm_mousemove, x, y), (event, x, y), (event + 1, x, y)])
def buttonClick(btnName='left', count=1, modifiers=None): """performs a button (double) click of the mouse without parameters: a single left click accepted values: - btnName: 'left', 'right' or 'middle', or 1, 2, 3 - count: 1 or 2 or 3 (3 not fully tested) - modifiers: 'shift', 'ctrl', 'alt', 'menu' ('alt' and 'menu' are identical) (see function getModifierKeyCodes below) (if you want more modifiers, separate by "+" or " ", eg. "shift+ctrl") """ x, y = natlink.getCursorPos() unimacroButtons = {1:'left', 2:'right', 3:'middle'} if btnName in [1,2,3]: btnName = unimacroButtons[btnName] singleLookup = { 'left': [(wm_lbuttondown,x,y),(wm_lbuttonup,x,y)], 'right': [(wm_rbuttondown,x,y),(wm_rbuttonup,x,y)], 'middle':[(wm_mbuttondown,x,y),(wm_mbuttonup,x,y)] } doubleLookup = { 'left': [(wm_lbuttondblclk,x,y),(wm_lbuttonup,x,y)], 'right': [(wm_rbuttondblclk,x,y),(wm_rbuttonup,x,y)], 'middle':[(wm_mbuttondblclk,x,y),(wm_mbuttonup,x,y)] } try: single = singleLookup[btnName] # KeyError means invalid button name double = doubleLookup[btnName] except KeyError: raise ValueError('buttonClick, invalid "btnName": %s'% btnName) events = [] # collect all events in a list if modifiers: try: keycodes = getModifierKeyCodes(modifiers) except KeyError: raise ValueError('buttonClick, invalid "modifiers": %s'% repr(modifiers)) for k in keycodes: events.append( (wm_keydown, k) ) # print "modifiers keycodes: %s"% keycodes if count == 1: events.extend( single ) elif count == 2: events.extend( single ) events.extend( double ) elif count == 3: events.extend( single ) events.extend( single ) events.extend( single ) else: raise ValueError( 'buttonClick, invalid "count": %s'% count ) if modifiers: for k in keycodes: events.append( (wm_keyup, k) ) if events: # print 'buttonClick events: %s'% events natlink.playEvents(events)
def gotResults_bumpMouse(self, words, fullResults): """ usage: <x-axis increment> <y-axis increment> bump <integer multiplier> """ # register required displacement integer 's\s x_disp = int(words[0]) y_disp = int(words[1]) # do we have a multiplier? mult = 1 if len(words) > 4: mult = int(words[4]) logger.error("mult:%d" % (mult)) # get current position x, y = natlink.getCursorPos() logger.error("x:%d y:%d" % (x, y)) # coordinate calculated using row and column pixel offset * multiplier if int(words[0]) != 0: x = x + x_disp * mult if int(words[1]) != 0: y = y + y_disp * mult logger.error("x:%d y:%d drag" % (x, y)) # get the equivalent event code of the type of mouse event to perform # leftclick, rightclick, rightdouble-click (currently left click) event = self.kmap['leftclick'] # play events down click and then release (for left double click # increment from left button up event which produces no action # then when incremented, performs the double-click) natlink.playEvents([(wm_mousemove, x, y), (event, x, y), (event + 1, x, y)])
def drag(self, dragDirection='up', startPos=None, dist=4): displacement = self.dispMap[dragDirection] call_Dragon('RememberPoint', '', []) x, y = natlink.getCursorPos() newx,newy = self.getDragPoints(x,y,displacement,dragDirection) natlink.playEvents([(wm_mousemove, newx, newy)]) call_Dragon('DragToPoint', 'i', [])
def click(self, clickType='leftclick', x=None, y=None, appName='iphoneWin'): # get the equivalent event code of the type of mouse event to perform # leftclick, rightclick, rightdouble-click (see kmap) event = self.kmap[clickType] # play events down click and then release (for left double click # increment from left button up event which produces no action # then when incremented, performs the double-click) # if coordinates are not supplied, just click if getattr(event, 'conjugate'): if not (x or y): x, y = natlink.getCursorPos() # apply vertical offset dependent on presence of "personal hotspot" # bar across the top of the screen y += self.windows.appDict[appName].vert_offset logging.debug('clicking at: %d, %d' % (x, y)) natlink.playEvents([(wm_mousemove, x, y), (event, x, y), (event + 1, x, y)]) else: logging.error(' incorrect click look up for the event %s' % str(clickType)) # default to natlink.recognitionMimic(['mouse', 'click'])
def drag(self, dragDirection='up', startPos=None, dist=4): displacement = self.dispMap[dragDirection] call_Dragon('RememberPoint', '', []) x, y = natlink.getCursorPos() newx, newy = self.getDragPoints(x, y, displacement, dragDirection) natlink.playEvents([(wm_mousemove, newx, newy)]) call_Dragon('DragToPoint', 'i', [])
def cancelMode(self): debugPrint('cancelMode') natlink.setTrayIcon() if self.inTimer: natlinktimer.setTimerCallback(self.onTimer, 0) self.inTimer = 0 if self.drag: debugPrint('switch of dragging') xPos, yPos = natlink.getCursorPos() if self.drag == 2: natlink.playEvents([(natlinkutils.wm_rbuttonup, xPos, yPos) ]) else: natlink.playEvents([(natlinkutils.wm_lbuttonup, xPos, yPos) ]) self.drag = 0 elif self.state == 'searching': self.stopSearch() self.state = '' self.minorState = '' self.curDir = '' self.Count = 0 self.mouseSteps = 10 self.inside = 0 self.insideCommand = 0 self.waiting = 0 self.drag = 0 self.repeatFlag = 0 self.hadRepeat = 0 self.repeatStuff = None self.lastResults = [] self.activateSet(normalSet, exclusive=0)
def gotResults_start(self, words, fullResults): # execute a control-left drag down 30 pixels x, y = natlink.getCursorPos() natlink.playEvents([(wm_keydown, vk_control, 1), (wm_lbuttondown, x, y), (wm_mousemove, x, y + 30), (wm_lbuttonup, x, y + 30), (wm_keyup, vk_control, 1)])
def gotResults_start(self,words,fullResults): # execute a control-left drag down 30 pixels x,y = natlink.getCursorPos() natlink.playEvents( [ (wm_keydown,vk_control,1), (wm_lbuttondown,x,y), (wm_mousemove,x,y+30), (wm_lbuttonup,x,y+30), (wm_keyup,vk_control,1) ] )
def moveMouse(self,direction,count): xPos,yPos = natlink.getCursorPos() if direction == 'up': yPos = yPos - count elif direction == 'down': yPos = yPos + count elif direction == 'left': xPos = xPos - count elif direction == 'right': xPos = xPos + count xSize,ySize = natlink.getScreenSize() if xPos < 0: xPos = 0 if xPos >= xSize: xPos = xSize - 1 if yPos < 0: yPos = 0 if yPos >= ySize: yPos = ySize - 1 natlink.playEvents([(wm_mousemove,xPos,yPos)])
def mbDonumber(number, modifier=None): events = [] if modifier: events.append (modifiers[modifier][0]) for n in number: code = getKeyCode(n) events.append((natut.wm_keydown, code, 1)) events.append((natut.wm_keyup, code, 1)) if modifier: events.append (modifiers[modifier][1]) ## print 'events',events natlink.playEvents(events)
def moveMouse(self, direction, count): xPos, yPos = natlink.getCursorPos() if direction == 'up': yPos = yPos - count elif direction == 'down': yPos = yPos + count elif direction == 'left': xPos = xPos - count elif direction == 'right': xPos = xPos + count xSize, ySize = natlink.getScreenSize() if xPos < 0: xPos = 0 if xPos >= xSize: xPos = xSize - 1 if yPos < 0: yPos = 0 if yPos >= ySize: yPos = ySize - 1 natlink.playEvents([(natlinkutils.wm_mousemove, xPos, yPos)])
def gotResults_startMousing(self, words, fullResults): self.activateSet(['mousing'], exclusive=1) debugPrint('start mousing %s' % repr(words)) if self.hasCommon(words, ["MUIS", 'MOUSE']): self.state = 'mousing' if self.hasCommon(words, ["SLEEP", 'DRAG']): self.state = 'dragging' xPos, yPos = natlink.getCursorPos() if self.hasCommon(words, ["SNELMENU", 'RIGHT']): self.drag = 2 natlink.playEvents([(natlinkutils.wm_rbuttondown, xPos, yPos)]) else: self.drag = 1 natlink.playEvents([(natlinkutils.wm_lbuttondown, xPos, yPos)])
def mbDonumber(number, modifier=None): events = [] if modifier: events.append (modifiers[modifier][0]) for n in number: code = getKeyCode(n) events.append((natut.wm_keydown, code, 1)) events.append((natut.wm_keyup, code, 1)) if modifier: events.append (modifiers[modifier][1]) try: natlink.playEvents(events) except natlink.NatError: print "==================" print "Error playing events in firefox browsing, doNumber: %s"% repr(events)
def gotResults_repeatKey(self, words, fullResults): num = int(words[3]) key = self.kmap[str(words[2])] # assumed only standard keys (not system keys) will want to be repeated # this requires wm_key(down|up) [natlink.playEvents([(wm_keydown, key, 1), (wm_keyup, key, 1)]) for i in range(num)]
def mbDonumber(number, modifier=None): events = [] if modifier: events.append(modifiers[modifier][0]) for n in number: code = getKeyCode(n) events.append((natut.wm_keydown, code, 1)) events.append((natut.wm_keyup, code, 1)) if modifier: events.append(modifiers[modifier][1]) try: natlink.playEvents(events) except natlink.NatError: print "==================" print "Error playing events in firefox browsing, doNumber: %s" % repr( events)
def buttonClick(btnName='left',count=1): x, y = natlink.getCursorPos() singleLookup = { 'left': [(wm_lbuttondown,x,y),(wm_lbuttonup,x,y)], 'right': [(wm_rbuttondown,x,y),(wm_rbuttonup,x,y)], 'moddle':[(wm_mbuttondown,x,y),(wm_mbuttonup,x,y)] } doubleLookup = { 'left': [(wm_lbuttondblclk,x,y),(wm_lbuttonup,x,y)], 'right': [(wm_rbuttondblclk,x,y),(wm_rbuttonup,x,y)], 'middle':[(wm_mbuttondblclk,x,y),(wm_mbuttonup,x,y)] } single = singleLookup[btnName] # KeyError means invalid button name double = doubleLookup[btnName] if count == 1: natlink.playEvents( single ) elif count == 2: natlink.playEvents( single + double ) else: raise ValueError( "invalid count" )
def gotResults_repeatKey(self, words, fullResults): num = int(words[3]) key = self.kmap[str(words[2])] # assumed only standard keys (not system keys) will want to be repeated # this requires wm_key(down|up) [ natlink.playEvents([(wm_keydown, key, 1), (wm_keyup, key, 1)]) for i in range(num) ]
def buttonClick(btnName='left', count=1): x, y = natlink.getCursorPos() singleLookup = { 'left': [(wm_lbuttondown, x, y), (wm_lbuttonup, x, y)], 'right': [(wm_rbuttondown, x, y), (wm_rbuttonup, x, y)], 'moddle': [(wm_mbuttondown, x, y), (wm_mbuttonup, x, y)] } doubleLookup = { 'left': [(wm_lbuttondblclk, x, y), (wm_lbuttonup, x, y)], 'right': [(wm_rbuttondblclk, x, y), (wm_rbuttonup, x, y)], 'middle': [(wm_mbuttondblclk, x, y), (wm_mbuttonup, x, y)] } single = singleLookup[btnName] # KeyError means invalid button name double = doubleLookup[btnName] if count == 1: natlink.playEvents(single) elif count == 2: natlink.playEvents(single + double) else: raise ValueError("invalid count")
def click(self, clickType='leftclick', x=None, y=None, appName='iphoneWin'): # get the equivalent event code of the type of mouse event to perform # leftclick, rightclick, rightdouble-click (see kmap) event = self.kmap[clickType] # play events down click and then release (for left double click # increment from left button up event which produces no action # then when incremented, performs the double-click) # if coordinates are not supplied, just click if getattr(event, 'conjugate'): if not (x or y): x, y = natlink.getCursorPos() # apply vertical offset dependent on presence of "personal hotspot" # bar across the top of the screen y += self.windows.appDict[appName].vert_offset logging.debug('clicking at: %d, %d'% (x,y)) natlink.playEvents( [(wm_mousemove, x, y), (event, x, y), (event + 1, x, y)]) else: logging.error(' incorrect click look up for the event %s'% str(clickType)) # default to natlink.recognitionMimic(['mouse', 'click'])
def gotResults_windowFocus(self, words, fullResults): """ Vertical taskbar window titles are spreadstarting from 150 pixels from the taskbar. Each subsequent icon is roughly 25 pixels between.this is assumed the same between subsequent rows. If 'from bottom'modifier supplied to command string, calculate the offset from the first window title. This technique is an alternative to be able to determine a phrase that would be recognised as a window title (e.g. explicitly setting each programs window title) TODO: need to fix, inaccurate when counting from bottom. Windows not filtered properly? (Extra "Windows" which do not have physical component). EDIT: 291013 - modified to perform close""" # Detect the optional word to specify offset for variable component if words[1] == 'on': repeat_modifier_offset = 3 else: repeat_modifier_offset = 2 # screen dimensions (excluding taskbar) x, y = natlink.getScreenSize() # number of pixels between top of screen and top row of taskbar icons row_initial = TB_ROW_INITIAL #35 #75 # number of pixels between left side of taskbar and first column of icons col_initial = TB_COL_INITIAL #14 # separation between subsequent rows row_sep = TB_ROW_SEP #23 #32 # coordinate calculated, vertical offset is from top, horizontal offset # from the left edge of the taskbar (maximum horizontal value of the # screen visible size (which excludes taskbar)) calculated earlier. x, y = x + col_initial, row_initial # initial position # argument to pass to callback contains words used in voice command # (this is also a recognised top-level window?) And dictionary of # strings: handles. (Window title: window handle) # selecting index from bottom window title on taskbar # enumerate all top-level windows and send handles to callback wins = {} try: # Windows dictionary returned assecond element of tuple wins = self.windows.winDiscovery(skipTitle=' '.join(words))[1] #logger.debug('enumerate Windows: %s'% wins) except: logger.error('cannot enumerate Windows') logger.error(tb.format_exc()) return # after visible taskbar application windows have been added to # dictionary (second element of wins tuple), we can calculate # relative offset from last taskbar title. total_windows = len(wins) # print('Number of taskbar applications: {0};'.format( total_windows)) # print wins.keys() # enumerate child windows of visible desktop top-level windows. # we want to use the dictionary component of wins and create a map of # parent to child Window handles. if words[4:5]: # get desired index "from bottom" (negative index) from_bottom_modifier = int(words[repeat_modifier_offset]) # maximum number of increments is total_Windows -1 relative_offset = total_windows - from_bottom_modifier #- 1 else: # get the index of window title required, add x vertical offsets # to get right vertical coordinate(0-based) relative_offset = int(words[repeat_modifier_offset]) - 1 if 0 > relative_offset or relative_offset >= total_windows: print( 'Specified taskbar index out of range. ' '{0} window titles listed.'.format(total_windows)) return 1 y = y + (row_sep * relative_offset) # move mouse to 00 first then separate mouse movement from click events # this seems to avoid occasional click failure natlink.playEvents([ (wm_mousemove, x, y), ]) if words[0] == 'close': event = self.kmap['rightclick'] natlink.playEvents([(event, x, y), (event + 1, x, y)]) natlink.playString('{up}{enter}') else: event = self.kmap['leftclick'] natlink.playEvents([(event, x, y), (event + 1, x, y)])
def gotResults_windowFocus(self, words, fullResults): """ Vertical taskbar window titles are spreadstarting from 150 pixels from the taskbar. Each subsequent icon is roughly 25 pixels between.this is assumed the same between subsequent rows. If 'from bottom'modifier supplied to command string, calculate the offset from the first window title. This technique is an alternative to be able to determine a phrase that would be recognised as a window title (e.g. explicitly setting each programs window title) TODO: need to fix, inaccurate when counting from bottom. Windows not filtered properly? (Extra "Windows" which do not have physical component). EDIT: 291013 - modified to perform close""" # Detect the optional word to specify offset for variable component if words[1] == 'on': repeat_modifier_offset = 3 else: repeat_modifier_offset = 2 # screen dimensions (excluding taskbar) x, y = natlink.getScreenSize() # number of pixels between top of screen and top row of taskbar icons row_initial = TB_ROW_INITIAL #35 #75 # number of pixels between left side of taskbar and first column of icons col_initial = TB_COL_INITIAL #14 # separation between subsequent rows row_sep = TB_ROW_SEP #23 #32 # coordinate calculated, vertical offset is from top, horizontal offset # from the left edge of the taskbar (maximum horizontal value of the # screen visible size (which excludes taskbar)) calculated earlier. x, y = x + col_initial, row_initial # initial position # argument to pass to callback contains words used in voice command # (this is also a recognised top-level window?) And dictionary of # strings: handles. (Window title: window handle) # selecting index from bottom window title on taskbar # enumerate all top-level windows and send handles to callback wins={} try: # Windows dictionary returned assecond element of tuple wins=self.windows.winDiscovery(skipTitle=' '.join(words))[1] #logger.debug('enumerate Windows: %s'% wins) except: logger.error('cannot enumerate Windows') logger.error(tb.format_exc()) return # after visible taskbar application windows have been added to # dictionary (second element of wins tuple), we can calculate # relative offset from last taskbar title. total_windows = len(wins) # print('Number of taskbar applications: {0};'.format( total_windows)) # print wins.keys() # enumerate child windows of visible desktop top-level windows. # we want to use the dictionary component of wins and create a map of # parent to child Window handles. if words[4:5]: # get desired index "from bottom" (negative index) from_bottom_modifier = int(words[ repeat_modifier_offset]) # maximum number of increments is total_Windows -1 relative_offset = total_windows - from_bottom_modifier #- 1 else: # get the index of window title required, add x vertical offsets # to get right vertical coordinate(0-based) relative_offset = int(words[repeat_modifier_offset]) - 1 if 0 > relative_offset or relative_offset >= total_windows: print('Specified taskbar index out of range. ' '{0} window titles listed.'.format(total_windows)) return 1 y = y + (row_sep * relative_offset) # move mouse to 00 first then separate mouse movement from click events # this seems to avoid occasional click failure natlink.playEvents([(wm_mousemove, x, y),]) if words[0] == 'close': event = self.kmap['rightclick'] natlink.playEvents([(event, x, y), (event + 1, x, y)]) natlink.playString('{up}{enter}') else: event = self.kmap['leftclick'] natlink.playEvents([(event, x, y), (event + 1, x, y)])
def gotResults_navigate(self,words,fullResults): key = self.kmap[str(words[1])] # this requires wm_key(down|up) natlink.playEvents([(wm_keydown, key, 1), (wm_keyup, key, 1)])