Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate

EasyWindowDrag variation


  • Please log in to reply
1 reply to this topic
catweazle
  • Guests
  • Last active:
  • Joined: --
I've made a few tweaks to the EasyWindowDrag showcase script, that might be of interest:

1. Releasing Alt cancels the {move,resize} operation and restores the original window location/size.
2. Alt+LButton raises the active window to the top of the stack
3. Alt+RButton lowers the active window to the bottom of the stack
4. The move functionality only starts after the mouse is moved a minimum threshold (10 pixels). This is to avoid accidentally moving a window when the intention is to just bring it to the top.
5. Changed the resize binding to Ctrl+Alt+button1.

I also turned off the double alt handling as I don't personally use it (I use gestures for closing windows, etc). This functionality could probably easily be added back if desired.

; Easy Window Dragging -- KDE style (requires XP/2k/NT) -- by Jonny
; http://www.autohotkey.com
; This script makes it much easier to move or resize a window: 1) Hold down
; the ALT key and LEFT-click anywhere inside a window to drag it to a new
; location; 2) Hold down ALT and RIGHT-click-drag anywhere inside a window
; to easily resize it; 3) Press ALT twice, but before releasing it the second
; time, left-click to minimize the window under the mouse cursor, right-click
; to maximize it, or middle-click to close it.

; This script was inspired by and built on many like it
; in the forum. Thanks go out to ck, thinkstorm, Chris,
; and aurelian for a job well done.


; The Double-Alt modifier is activated by pressing
; Alt twice, much like a double-click. Hold the second
; press down until you click.
;
; The shortcuts:
;  Alt + Left Button  : Drag to move a window.
;  Ctrl+ Alt + Left Button : Drag to resize a window.
;  Alt + Right Button: Lowers a window to the bottom of the stack
;  Alt + Left Button: Raises a window to the top of the stack
;
; Releasing Alt after initiating a move or drag will cancel the operation.

If A_AhkVersion < 1.0.25.07
{
	MsgBox,20,,This script may not work properly with your version of AutoHotkey. Continue?
	IfMsgBox,No
	ExitApp
}

; This is the setting that runs smoothest on my
; system. Depending on your video card and cpu
; power, you may want to raise or lower this value.
SetWinDelay,2

CoordMode,Mouse
return

^!LButton::
If DoubleAlt
{
	MouseGetPos,,,KDE_id
	; Toggle between maximized and restored state.
	WinGet,KDE_Win,MinMax,ahk_id %KDE_id%
	If KDE_Win
		WinRestore,ahk_id %KDE_id%
	Else
		WinMaximize,ahk_id %KDE_id%
	DoubleAlt := false
	return
}
; Get the initial mouse position and window id, and
; abort if the window is maximized.
MouseGetPos,KDE_X1,KDE_Y1,KDE_id
WinGet,KDE_Win,MinMax,ahk_id %KDE_id%
If KDE_Win
	return
; Get the initial window position and size.
WinGetPos,KDE_WinX1,KDE_WinY1,KDE_WinW,KDE_WinH,ahk_id %KDE_id%
; Define the window region the mouse is currently in.
; The four regions are Up and Left, Up and Right, Down and Left, Down and Right.
Orig_X = %KDE_WinX1%
Orig_Y = %KDE_WinY1%
Orig_Width = %KDE_WinW%
Orig_Height = %KDE_WinH%
;MsgBox Start %Orig_X% %Orig_Y% %Orig_Width% %Orig_Height%

If (KDE_X1 < KDE_WinX1 + KDE_WinW / 2)
	KDE_WinLeft := true
Else
	KDE_WinLeft := false
If (KDE_Y1 < KDE_WinY1 + KDE_WinH / 2)
	KDE_WinUp := true
Else
	KDE_WinUp := false
Loop
{
	GetKeyState,KDE_Button,LButton,P ; Break if button has been released.
	If KDE_Button = U
		break

	GetKeyState, EWD_EscapeState, LAlt, P
	if EWD_EscapeState = U  ; Escape has been pressed, so drag is cancelled.
	{
                ;MsgBox Start %Orig_X% %Orig_Y% %Orig_Width% %Orig_Height%
		;WinMove, ahk_id %KDE_id%,, %KDE_X1%, %KDE_Y1%
                WinMove,ahk_id %KDE_id%,,%Orig_X%,%Orig_Y%,%Orig_Width%,%Orig_Height%
		return
	}

	MouseGetPos,KDE_X2,KDE_Y2 ; Get the current mouse position.
	; Get the current window position and size.
	WinGetPos,KDE_WinX1,KDE_WinY1,KDE_WinW,KDE_WinH,ahk_id %KDE_id%
	KDE_X2 -= KDE_X1 ; Obtain an offset from the initial mouse position.
	KDE_Y2 -= KDE_Y1
	; Then, act according to the defined region.
	If KDE_WinLeft
	{
		; Reverse and apply the offset to the size, and correct for the skewed position.
		KDE_WinX1 += KDE_X2
		KDE_WinW -= KDE_X2
	}
	Else
		KDE_WinW += KDE_X2 ; Apply the offset to the size.
	If KDE_WinUp
	{
		; Reverse and apply, correct the position.
		KDE_WinY1 += KDE_Y2
		KDE_WinH -= KDE_Y2
	}
	Else
		KDE_WinH += KDE_Y2 ; Apply the offset.
	; Finally, apply all the changes to the window.
	WinMove,ahk_id %KDE_id%,,%KDE_WinX1%,%KDE_WinY1%,%KDE_WinW%,%KDE_WinH%
	KDE_X1 := (KDE_X2 + KDE_X1) ; Reset the initial position for the next iteration.
	KDE_Y1 := (KDE_Y2 + KDE_Y1)
}
return

!LButton::
;If DoubleAlt
;{
;	MouseGetPos,,,KDE_id
;	; This message is mostly equivalent to WinMinimize,
;	; but it avoids a bug with PSPad.
;	PostMessage,0x112,0xf020,,,ahk_id %KDE_id%
;	DoubleAlt := false
;	return
;}
; Get the initial mouse position and window id, and
; abort if the window is maximized.
MouseGetPos,KDE_X1,KDE_Y1,KDE_id
WinGet,KDE_Win,MinMax,ahk_id %KDE_id%
If KDE_Win
	return
WinActivate,A
WinSet, Top,, A
; Get the initial window position.
WinGetPos,KDE_WinX1,KDE_WinY1,,,ahk_id %KDE_id%
StartedMove := false
StartMoveThreshold = 10
Loop
{
	GetKeyState,KDE_Button,LButton,P ; Break if button has been released.
	If KDE_Button = U
		break
	GetKeyState, EWD_EscapeState, LAlt, P
	if EWD_EscapeState = U  ; Escape has been pressed, so drag is cancelled.
	{
		WinMove, ahk_id %KDE_id%,, %KDE_WinX1%, %KDE_WinY1%
		return
	}

	MouseGetPos,KDE_X2,KDE_Y2 ; Get the current mouse position.
	KDE_X2 -= KDE_X1 ; Obtain an offset from the initial mouse position.
	KDE_Y2 -= KDE_Y1
        If ((not StartedMove) and ((abs(KDE_X2) < StartMoveThreshold) and (abs(KDE_Y2) < StartMoveThreshold)))
	  continue
	
	StartedMove := true
	KDE_WinX2 := (KDE_WinX1 + KDE_X2) ; Apply this offset to the window position.
	KDE_WinY2 := (KDE_WinY1 + KDE_Y2)
	WinMove,ahk_id %KDE_id%,,%KDE_WinX2%,%KDE_WinY2% ; Move the window to the new position.
}
return

; "Alt + MButton" may be simpler, but I
; like an extra measure of security for
; an operation like this.
;!MButton::
;If DoubleAlt
;{
;	MouseGetPos,,,KDE_id
;	WinClose,ahk_id %KDE_id%
;	DoubleAlt := false
;	return
;}
;return

!RButton::
WinSet, Bottom,,A
return

;; This code detects "double-clicks" of
;; the Alt key.
Alt::
  If toggle
    Send,{Alt}
  toggle := not toggle
return
;DoubleAlt := false ; Re-initialize DoubleAlt.
;; Uncomment this line if you still want to use the Alt key to activate a program's 
;; menu bar. Note that even without this enabled, menu shortcuts such as Alt+F will
;; still operate correctly:
;;  Send,{Alt} 
;KeyWait,Alt,D T0.6 ; ... and the next press.
;If Errorlevel ; If it never comes or takes too long, DoubleAlt remains false.
;	return
;DoubleAlt := true ; Otherwise, it's true until Alt is released (activating this hotkey again).
;return


Chris
  • Administrators
  • 10727 posts
  • Last active:
  • Joined: 02 Mar 2004
It looks good. If you or anyone thinks that any of these changes have broad enough appeal to be put into the showcase version, please let me know.

Thanks for posting it.