Module mouseHandler
[hide private]
[frames] | no frames]

Source Code for Module mouseHandler

  1  #mouseHandler.py 
  2  #A part of NonVisual Desktop Access (NVDA) 
  3  #Copyright (C) 2006-2007 NVDA Contributors <http://www.nvda-project.org/> 
  4  #This file is covered by the GNU General Public License. 
  5  #See the file COPYING for more details. 
  6   
  7  import time 
  8  import tones 
  9  import ctypes 
 10  import winUser 
 11  import queueHandler 
 12  import api 
 13  import screenBitmap 
 14  import speech 
 15  import globalVars 
 16  import eventHandler 
 17  from logHandler import log 
 18  import config 
 19  import winInputHook 
 20   
 21  WM_MOUSEMOVE=0x0200 
 22  WM_LBUTTONDOWN=0x0201 
 23  WM_LBUTTONUP=0x0202 
 24  WM_LBUTTONDBLCLK=0x0203 
 25  WM_RBUTTONDOWN=0x0204 
 26  WM_RBUTTONUP=0x0205 
 27  WM_RBUTTONDBLCLK=0x0206 
 28   
 29  curMousePos=(0,0) 
 30  mouseMoved=False 
 31  curMouseShape="" 
 32  mouseShapeChanged=0 
 33  scrBmpObj=None 
 34  #: The time (in seconds) at which the last mouse event occurred. 
 35  #: @type: float 
 36  lastMouseEventTime=0 
 37   
38 -def updateMouseShape(name):
39 global curMouseShape, mouseShapeChanged 40 if not name or name==curMouseShape: 41 return 42 curMouseShape=name 43 mouseShapeChanged=1
44
45 -def playAudioCoordinates(x, y, screenWidth, screenHeight, detectBrightness=True,blurFactor=0):
46 minPitch=config.conf['mouse']['audioCoordinates_minPitch'] 47 maxPitch=config.conf['mouse']['audioCoordinates_maxPitch'] 48 curPitch=minPitch+((maxPitch-minPitch)*((screenHeight-y)/float(screenHeight))) 49 if detectBrightness: 50 startX=min(max(x-blurFactor,0),screenWidth) 51 width=min((x+blurFactor+1)-startX,screenWidth) 52 startY=min(max(y-blurFactor,0),screenHeight) 53 height=min((y+blurFactor+1)-startY,screenHeight) 54 grey=screenBitmap.rgbPixelBrightness(scrBmpObj.captureImage(startX,startY,width,height)[0][0]) 55 brightness=grey/255.0 56 minBrightness=config.conf['mouse']['audioCoordinates_minVolume'] 57 maxBrightness=config.conf['mouse']['audioCoordinates_maxVolume'] 58 brightness=(brightness*(maxBrightness-minBrightness))+minBrightness 59 else: 60 brightness=config.conf['mouse']['audioCoordinates_maxVolume'] 61 leftVolume=int((85*((screenWidth-float(x))/screenWidth))*brightness) 62 rightVolume=int((85*(float(x)/screenWidth))*brightness) 63 tones.beep(curPitch,40,left=leftVolume,right=rightVolume)
64 65 #Internal mouse event 66
67 -def internal_mouseEvent(msg,x,y,injected):
68 global mouseMoved, curMousePos, lastMouseEventTime 69 lastMouseEventTime=time.time() 70 if injected: 71 return True 72 if not config.conf['mouse']['enableMouseTracking']: 73 return True 74 try: 75 curMousePos=(x,y) 76 if msg==WM_MOUSEMOVE: 77 mouseMoved=True 78 elif msg in (WM_LBUTTONDOWN,WM_RBUTTONDOWN): 79 queueHandler.queueFunction(queueHandler.eventQueue,speech.cancelSpeech) 80 except: 81 log.error("", exc_info=True) 82 return True
83
84 -def executeMouseMoveEvent(x,y):
85 global currentMouseWindow 86 desktopObject=api.getDesktopObject() 87 screenLeft,screenTop,screenWidth,screenHeight=desktopObject.location 88 x=min(max(screenLeft,x),(screenLeft+screenWidth)-1) 89 y=min(max(screenTop,y),(screenTop+screenHeight)-1) 90 if config.conf["mouse"]["audioCoordinatesOnMouseMove"]: 91 playAudioCoordinates(x,y,screenWidth,screenHeight,config.conf['mouse']['audioCoordinates_detectBrightness'],config.conf['mouse']['audioCoordinates_blurFactor']) 92 oldMouseObject=api.getMouseObject() 93 mouseObject=desktopObject.objectFromPoint(x,y) 94 while mouseObject and mouseObject.beTransparentToMouse: 95 mouseObject=mouseObject.parent 96 if not mouseObject: 97 return 98 if oldMouseObject==mouseObject: 99 mouseObject=oldMouseObject 100 else: 101 api.setMouseObject(mouseObject) 102 try: 103 eventHandler.executeEvent("mouseMove",mouseObject,x=x,y=y) 104 oldMouseObject=mouseObject 105 except: 106 log.error("api.notifyMouseMoved", exc_info=True)
107 108 #Register internal mouse event 109
110 -def initialize():
111 global curMousePos, scrBmpObj 112 scrBmpObj=screenBitmap.ScreenBitmap(1,1) 113 (x,y)=winUser.getCursorPos() 114 desktopObject=api.getDesktopObject() 115 try: 116 mouseObject=desktopObject.objectFromPoint(x,y) 117 except: 118 log.exception("Error retrieving initial mouse object") 119 mouseObject=None 120 if not mouseObject: 121 mouseObject=api.getDesktopObject() 122 api.setMouseObject(mouseObject) 123 curMousePos=(x,y) 124 winInputHook.initialize() 125 winInputHook.setCallbacks(mouse=internal_mouseEvent)
126
127 -def pumpAll():
128 global mouseMoved, curMousePos, mouseShapeChanged, curMouseShape 129 if mouseMoved: 130 mouseMoved=False 131 (x,y)=curMousePos 132 executeMouseMoveEvent(x,y) 133 if config.conf["mouse"]["reportMouseShapeChanges"] and mouseShapeChanged>0: 134 if mouseShapeChanged==10: 135 mouseShapeChanged=0 136 speech.speakMessage(_("%s cursor")%curMouseShape) 137 else: 138 mouseShapeChanged+=1
139
140 -def terminate():
141 global scrBmpObj 142 scrBmpObj=None 143 winInputHook.terminate()
144