Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Middle Mouse Button Gestures (diagonal)


  • Please log in to reply
3 replies to this topic
drozdman
  • Members
  • 17 posts
  • Last active: Dec 05 2015 06:05 AM
  • Joined: 15 Oct 2012
I needed to add some middle button gestures to StrokeIt and Opera. This is something simple, but it adds 8 new gestures.
So this is a general script. The message boxes should be replaces with commands or subroutines.


MButton::
MouseGetPos, X1, Y1
SetTimer, MBGesture, 1
Keywait MButton
if(A_TimeSinceThisHotkey>200 AND X2-X1>0 AND Y2-Y1<0 AND Abs(X2-X1) >= 20 AND Abs(Y2-Y1) >= 20) {
MsgBox,,,Gesture top/right diagonal,1	
}			 ; gesture top/right
else if(A_TimeSinceThisHotkey>200 AND X2-X1>0 AND Y2-Y1>0 AND Abs(X2-X1) >= 20 AND Abs(Y2-Y1) >= 20) {
MsgBox,,,Gesture down/right diagonal,1
}			 ; gesture down/right
else if(A_TimeSinceThisHotkey>200 AND X2-X1<0 AND Y2-Y1<0 AND Abs(X2-X1) >= 20 AND Abs(Y2-Y1) >= 20) {
MsgBox,,,Gesture top/left diagonal,1
}			 ; gesture top/left
else if(A_TimeSinceThisHotkey>200 AND X2-X1<0 AND Y2-Y1>0 AND Abs(X2-X1) >= 20 AND Abs(Y2-Y1) >= 20) {
MsgBox,,,Gesture down/left diagonal,1
}			 ; gesture down/left
else if(A_TimeSinceThisHotkey>200 AND Y2-Y1< 0 AND Abs(Y2-Y1) >= 20 AND Abs(X2-X1) < 20) {
MsgBox,,,Gesture up,1
}			 ; gesture up
else if(A_TimeSinceThisHotkey>200 AND Y2-Y1>0 AND Abs(Y2-Y1) >= 20 AND Abs(X2-X1) < 20) {
MsgBox,,,Gesture down,1
}			 ; Gesture down
else if(A_TimeSinceThisHotkey>200 AND X2-X1<0 AND Abs(X2-X1) >= 20 AND Abs(Y2-Y1) < 20) {
MsgBox,,,Gesture left,1
}			 ; gesture left
else if(A_TimeSinceThisHotkey>200 AND X2-X1>0 AND Abs(X2-X1) >= 20 AND Abs(Y2-Y1) < 20) {
MsgBox,,,Gesture right,1
}			 ; gesture right
else if (A_TimeSinceThisHotkey>400)					 ; press and hold
{
Send, ^c
} else {
Send, ^v
}
MBGesture:
MouseGetPos, X2, Y2
return
return


drozdman
  • Members
  • 17 posts
  • Last active: Dec 05 2015 06:05 AM
  • Joined: 15 Oct 2012
This is the specific script that I use.
The mouse middle button actions:

press: Paste
press and hold: Copy text and show clipboard (or just show clipboard when there's no selection)
gesture left: Paste previous clipboard
gesture right: Show part of the clipboard and part of the previous clipboard as a tooltip
gesture down: Copy selection and starts WordWeb dictionary (*)
gesture up: Google search of highlighted word
gesture top/right diagonal: Paste clipboard with a semicolon in front
gesture top/left diagonal: Paste previous clipboard with a semicolon in front

(*) WordWeb dictionary has problems with text recognition (OCR) in Opera



ClipNew := clipboard
OnClipboardChange:
ClipOld := ClipNew
ClipNew := clipboard
LWin & LCtrl:: SendInput %ClipOld%	
^b:: SendInput %ClipOld%
LAlt & Space:: Gosub, Show_Clipboard


MButton::
MouseGetPos, X1, Y1
Keywait MButton
MouseGetPos, X2, Y2
if(A_TimeSinceThisHotkey>200 AND X2-X1>0 AND Y2-Y1<0 AND Abs(X2-X1) >= 20 AND Abs(Y2-Y1) >= 20) {
SendInput `;{Space}%clipboard%{Space}	
}			 ; gesture top/right
else if(A_TimeSinceThisHotkey>200 AND X2-X1>0 AND Y2-Y1>0 AND Abs(X2-X1) >= 20 AND Abs(Y2-Y1) >= 20) {
MsgBox,,,Gesture down/right diagonal,1
}			 ; gesture down/right
else if(A_TimeSinceThisHotkey>200 AND X2-X1<0 AND Y2-Y1<0 AND Abs(X2-X1) >= 20 AND Abs(Y2-Y1) >= 20) {
SendInput `; %ClipOld%
}			 ; gesture top/left
else if(A_TimeSinceThisHotkey>200 AND X2-X1<0 AND Y2-Y1>0 AND Abs(X2-X1) >= 20 AND Abs(Y2-Y1) >= 20) {
MsgBox,,,Gesture down/left diagonal,1
}			 ; gesture down/left
else if(A_TimeSinceThisHotkey>200 AND Y2-Y1< 0 AND Abs(Y2-Y1) >= 20 AND Abs(X2-X1) < 20) {
Gosub, Google_search
}			 ; gesture up
else if(A_TimeSinceThisHotkey>200 AND Y2-Y1>0 AND Abs(Y2-Y1) >= 20 AND Abs(X2-X1) < 20) {
Gosub, Go_dict
}			 ; gesture down
	 else if(A_TimeSinceThisHotkey>200 AND X2-X1<0 AND Abs(X2-X1) >= 20 AND Abs(Y2-Y1) < 20) {
SendInput %ClipOld%
}			 ; gesture left
else if(A_TimeSinceThisHotkey>200 AND X2-X1>0 AND Abs(X2-X1) >= 20 AND Abs(Y2-Y1) < 20) {
	 Gosub, Show_Clipboard
}			 ; gesture right
	 else if (A_TimeSinceThisHotkey>400)				 ; press and hold
{
	 Gosub, Close_Context_Menu
	 Send, ^c
	 Clip2 := SubStr(clipboard, 1, 70)		 ;"`n"SubStr(clipboard, 71, 71)
	 Clip3 := SubStr(ClipOld, 1, 70)			 ;"`n"SubStr(ClipOld, 71, 71)
	 CoordMode,ToolTip,Screen
	 ToolTip %Clip2% `n ----------- `n %Clip3% ,600,300					
	 Sleep 1500
	 ToolTip

return
} else {
Send, ^v
}
return


Show_Clipboard:
Clip2 := SubStr(clipboard, 1, 70) "`n"SubStr(clipboard, 71, 71)
Clip3 := SubStr(ClipOld, 1, 70)"`n"SubStr(ClipOld, 71, 71)
CoordMode,ToolTip,Screen
ToolTip %Clip2% `n ----------- `n %Clip3% ,600,450					
Sleep 2000
ToolTip
return


Get_high_text:
clipboard_backup := clipboard
Send,^c
high_text:= clipboard
Send,^c
clipboard := clipboard_backup
return

ToolTip_Copy:
ToolTip Copy
Sleep 250
ToolTip
return

Go_dict:
Gosub, Close_Context_Menu
Send ^c
Run, C:\Program Files\WordWeb\wwnotray.exe
return

Close_Context_Menu:
Send {Ctrl down}{Alt down}{Alt UP}{Ctrl UP}
return

Google_search:
Gosub, Close_Context_Menu
Gosub, Get_high_text
high_text := RegExReplace(high_text, "\s","+")
Run, C:\Program Files\Opera\opera.exe http://www.google.com/search?q=%high_text%
return



ruespe
  • Members
  • 567 posts
  • Last active: Dec 01 2014 07:59 PM
  • Joined: 17 Jun 2008
Nice. Just one comment:

MButton::
MouseGetPos, X1, Y1
;SetTimer, MBGesture, 1

Keywait MButton
MouseGetPos, X2, Y2

The Timer isn't nessessary (and you never stop him - not very cpu-friendly), because you wait for the key to be released.

drozdman
  • Members
  • 17 posts
  • Last active: Dec 05 2015 06:05 AM
  • Joined: 15 Oct 2012

The Timer isn't nessessary (and you never stop him - not very cpu-friendly)



Thanks for the tip. Without a timer it is better, even though I didn't notice any higher CPU usage at all. (BTW: I just discovered AutoHotkey a couple of months ago, so I don't have much experience).
I will edit the timer out in the general code, so it's easier to read in this form:


MButton::
MouseGetPos, X1, Y1
Keywait MButton
MouseGetPos, X2, Y2
if(A_TimeSinceThisHotkey>200 AND X2-X1>0 AND Y2-Y1<0 AND Abs(X2-X1) >= 20 AND Abs(Y2-Y1) >= 20) {  
MsgBox,,,Gesture top/right diagonal,1	
}			   ; gesture top/right
else if(A_TimeSinceThisHotkey>200 AND X2-X1>0 AND Y2-Y1>0 AND Abs(X2-X1) >= 20 AND Abs(Y2-Y1) >= 20) {  
MsgBox,,,Gesture down/right diagonal,1   
}			    ; gesture down/right
else if(A_TimeSinceThisHotkey>200 AND X2-X1<0 AND Y2-Y1<0 AND Abs(X2-X1) >= 20 AND Abs(Y2-Y1) >= 20) {  
MsgBox,,,Gesture top/left diagonal,1
}			   ; gesture top/left
else if(A_TimeSinceThisHotkey>200 AND X2-X1<0 AND Y2-Y1>0 AND Abs(X2-X1) >= 20 AND Abs(Y2-Y1) >= 20) {  
MsgBox,,,Gesture down/left diagonal,1
}			    ; gesture down/left
else if(A_TimeSinceThisHotkey>200 AND Y2-Y1< 0 AND Abs(Y2-Y1) >= 20 AND Abs(X2-X1) < 20) {
MsgBox,,,Gesture up,1
}			    ;  gesture up
else if(A_TimeSinceThisHotkey>200 AND Y2-Y1>0 AND Abs(Y2-Y1) >= 20 AND Abs(X2-X1) < 20) {
MsgBox,,,Gesture down,1
}			    ; Gesture down
  else if(A_TimeSinceThisHotkey>200 AND X2-X1<0 AND Abs(X2-X1) >= 20 AND Abs(Y2-Y1) < 20) {
MsgBox,,,Gesture left,1
}			    ; gesture left
else if(A_TimeSinceThisHotkey>200 AND X2-X1>0 AND Abs(X2-X1) >= 20 AND Abs(Y2-Y1) < 20) {
  MsgBox,,,Gesture right,1 
  }			    ; gesture right
  else if (A_TimeSinceThisHotkey>400)					  ; press and hold
  {
  Send, ^c
  }  else {
  Send, ^v
  }
return