From 659f596601feb65b4b65fd734e80f90de72658a7 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Tue, 8 Nov 2016 23:48:27 -0700 Subject: [PATCH] Add WindowPadX as submodule --- .gitmodules | 3 + Home.ahk | 3 +- Utilities/WindowPadX | 1 + WindowPadX/.gitignore | 3 - WindowPadX/Doc-Adding_Commands.txt | 14 - WindowPadX/Doc-Commandline_Usage.txt | 9 - WindowPadX/Readme.md | 36 - WindowPadX/WPXA.ahk | 1496 -------------------------- WindowPadX/WindowPadX.Default.ini | 117 -- WindowPadX/WindowPadX.ahk | 485 --------- WindowPadX/WindowPadX.html | 427 -------- WindowPadX/WindowPadX.ini | 117 -- WindowPadX/_inc/Notify.ahk | 406 ------- WindowPadX/icons/WindowPad.ico | Bin 15086 -> 0 bytes WindowPadX/icons/disabled.ico | Bin 1150 -> 0 bytes WindowPadX/icons/disabled_orig.ico | Bin 1150 -> 0 bytes WindowPadX/icons/minus.png | Bin 52961 -> 0 bytes WindowPadX/icons/plus.png | Bin 55737 -> 0 bytes WindowPadX/icons/tray.ico | Bin 1150 -> 0 bytes WindowPadX/icons/tray_orig.ico | Bin 1150 -> 0 bytes 20 files changed, 5 insertions(+), 3112 deletions(-) create mode 160000 Utilities/WindowPadX delete mode 100644 WindowPadX/.gitignore delete mode 100644 WindowPadX/Doc-Adding_Commands.txt delete mode 100644 WindowPadX/Doc-Commandline_Usage.txt delete mode 100644 WindowPadX/Readme.md delete mode 100644 WindowPadX/WPXA.ahk delete mode 100644 WindowPadX/WindowPadX.Default.ini delete mode 100644 WindowPadX/WindowPadX.ahk delete mode 100644 WindowPadX/WindowPadX.html delete mode 100644 WindowPadX/WindowPadX.ini delete mode 100644 WindowPadX/_inc/Notify.ahk delete mode 100644 WindowPadX/icons/WindowPad.ico delete mode 100644 WindowPadX/icons/disabled.ico delete mode 100644 WindowPadX/icons/disabled_orig.ico delete mode 100644 WindowPadX/icons/minus.png delete mode 100644 WindowPadX/icons/plus.png delete mode 100644 WindowPadX/icons/tray.ico delete mode 100644 WindowPadX/icons/tray_orig.ico diff --git a/.gitmodules b/.gitmodules index 49c393c..ad0de61 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "Utilities/Colorette"] path = Utilities/Colorette url = https://github.com/Appifyer/Colorette.git +[submodule "Utilities/WindowPadX"] + path = Utilities/WindowPadX + url = https://github.com/denolfe/WindowPadX diff --git a/Home.ahk b/Home.ahk index 7b37f34..e96f574 100644 --- a/Home.ahk +++ b/Home.ahk @@ -12,8 +12,7 @@ SetCapsLockState, AlwaysOff RunIfExist(A_ScriptDir "\VolumeScroll\VolumeScroll.ahk") RunIfExist(A_ScriptDir "\AutoCorrect.ahk") -FileCopy, %A_ScriptDir%\WindowPadX\WindowPadX-home.ini, %A_ScriptDir%\WindowPadX\WindowPadX.ini, 1 -RunIfExist(A_ScriptDir "\WindowPadX\WindowPadX.ahk") +RunIfExist(A_ScriptDir "Utilities\WindowPadX\WindowPadX.ahk .\WindowPadX.ini") RunIfExist(A_ScriptDir "\AutoCorrect.ahk") IfWinNotExist, ahk_exe clipx.exe diff --git a/Utilities/WindowPadX b/Utilities/WindowPadX new file mode 160000 index 0000000..933b8c6 --- /dev/null +++ b/Utilities/WindowPadX @@ -0,0 +1 @@ +Subproject commit 933b8c6238794e9ed7c1ff92edbc985f0899a562 diff --git a/WindowPadX/.gitignore b/WindowPadX/.gitignore deleted file mode 100644 index 79e714c..0000000 --- a/WindowPadX/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.exe -*.bak -/_SOURCES_ \ No newline at end of file diff --git a/WindowPadX/Doc-Adding_Commands.txt b/WindowPadX/Doc-Adding_Commands.txt deleted file mode 100644 index bb852e3..0000000 --- a/WindowPadX/Doc-Adding_Commands.txt +++ /dev/null @@ -1,14 +0,0 @@ -About: Adding Commands - -Additional commands for use in *WindowPadX.ini* may be implemented by simply adding subroutines or functions to *WPXA.ahk*. For instance, a Close command could be implemented by adding either of the following - ->WPXA_Close(winTitle) { -> if wp_WinExist(winTitle) -> WinClose ->} - -It would then be used like any other *WindowPadX* command from , by adding something like this to WindowPadX.ini - ->!4 = WPXA_Close, A - -Note that *AutoHotkey* is required to run *WindowPadX.ahk* after making changes. To get an executable version of *WindowPadX* you might want to use *Ahk2Exe* \ No newline at end of file diff --git a/WindowPadX/Doc-Commandline_Usage.txt b/WindowPadX/Doc-Commandline_Usage.txt deleted file mode 100644 index 8778d5c..0000000 --- a/WindowPadX/Doc-Commandline_Usage.txt +++ /dev/null @@ -1,9 +0,0 @@ -About: Command-line Usage - -*WindowPadX* supports a command-line mode. Simply pass one or more commands from the command-line and *WindowPadX* will execute them and then exit. If a command's parameters contain spaces, the command and its arguments must be enclosed in quotation marks. For example - -> WindowPadX.exe GatherWindows,1 "WindowScreenMove, Next, My Window" - -Available commands are described within . - -*Hint*: To get an executable version of *WindowPadX* you might want to use *Ahk2Exe* diff --git a/WindowPadX/Readme.md b/WindowPadX/Readme.md deleted file mode 100644 index b929e1a..0000000 --- a/WindowPadX/Readme.md +++ /dev/null @@ -1,36 +0,0 @@ -WindowPadX -========== - -Detailed Documentation can be found here: http://hoppfrosch.github.com/WindowPadX/files/WindowPadX-ahk.html - -Introduction ------------- - -***WindowPadX*** is an enhancement of ***WindowPad***, originally released by Lexikos (see: http://http://www.autohotkey.com/forum/viewtopic.php?t=21703) - -***WindowPadX*** is a tool which provides some useful functionality within multi monitor environments. - -Features --------- -- Possible actions to be configured on hotkeys - - Window actions - - Multi-Monitor - - WPXA_MoveWindowToMonitor: Move window between screens, preserving relative position and size. - - WPXA_MinimizeWindowsOnMonitor: Minimize all windows on the given Screen - - WPXA_GatherWindowsOnMonitor: "Gather" windows on a specific screen. - - WPXA_FillVirtualScreen: Expand the window to fill the virtual screen (all monitors). - - General - - WPXA_MaximizeToggle: Maximize or restore the window. - - WPXA_TopToggle: Toogles "AlwaysOnTop" for given window - - WPXA_RollToggle: Toggles "Roll/Unroll" for given window - - WPXA_Move: move and resize window based on a "pad" concept. - - WPXA_TileLast2Windows: Tile active and last window - - Mouse actions - - Multi-Monitor - - WPXA_MoveMouseToMonitor: Moves mouse to center of given monitor - - WPXA_ClipCursorToCurrentMonitorToggle: Toogles clipping mouse to current monitor - - WPXA_ClipCursorToMonitor: Clips (Restricts) mouse to given monitor - - General - - WPXA_MouseLocator: Easy find the mouse - -For more details see http://hoppfrosch.github.com/WindowPadX/files/WindowPadX-ahk.html \ No newline at end of file diff --git a/WindowPadX/WPXA.ahk b/WindowPadX/WPXA.ahk deleted file mode 100644 index d4563d4..0000000 --- a/WindowPadX/WPXA.ahk +++ /dev/null @@ -1,1496 +0,0 @@ -/* - Title: WindowPadX-Actions library - Implementation of different useful actions for handling windows in general and within a multi-monitor setup in special. - - Functions starting with the prefix *WPXA* are designed to be used as user-actions within *WindowPadX*, whereas functions starting with the prefix *wp* are internal helper functions. - - Author: - hoppfrosch - - License: - WTFPL (http://sam.zoy.org/wtfpl/) - - Credits: - Lexikos - for his great work and his Original *WindowPad - multi-monitor window-moving tool* (http://www.autohotkey.com/forum/topic21703.html) - ShinyWong - for his *GetMonitorIndexFromWindow* function (http://www.autohotkey.com/forum/viewtopic.php?p=462080#462080) - used in - Skrommel - for his *MouseMark* function (http://www.donationcoder.com/Software/Skrommel/MouseMark/MouseMark.ahk) - used in - x97animal - for his *clipCursor* Function (http://www.autohotkey.com/forum/viewtopic.php?p=409537#409537) - used in - ipstone today - for his initial implementation (http://www.autohotkey.com/forum/viewtopic.php?p=521482#521482) for - Sean - for his *WinTrayMin* functionality (http://http://www.autohotkey.com/community/viewtopic.php?f=2&t=33263) - used in - gwarble - for his great *Notify* function (http://www.autohotkey.com/community/viewtopic.php?f=2&t=48668) - - Changelog: - 0.2.0 - [-] Removed - [-] Removed - [+] : Toggles Roll/Unroll State of window. (Corrected behaviour after manually resizing a previously rolled window) - [*] Adapted to use wp_RollWindowToggle - 0.1.12 - [*] Internal Changes: Update to Notify 0.499 (http://www.autohotkey.com/community/viewtopic.php?f=2&t=48668), Introduced Global variables for easier configuration ... - 0.1.11 - [+] : Minimize a window to a tray icon (see: http://http://www.autohotkey.com/community/viewtopic.php?f=2&t=33263 - thanks to Sean) - {+] : Mininmize a window to a tray icon (see ) - 0.1.10 - [+] : Determines monitor from current mouseposition. - [*] : added minimization of all windows on screen where mouse is. - 0.1.9 - [+] : Tile active and last window (see: http://www.autohotkey.com/forum/viewtopic.php?p=521482#521482 - thanks to ipstone today). - 0.1.8 - [*] : Bugfix to actually toggle Maximization (see: http://www.autohotkey.com/forum/post-508122.html#508122 - thanks to sjkeegs). - 0.1.7 - [+] : Toggles Roll/Unroll State of window. - [+] : Rolls up a window to its titlebar. - [+] : Unrolls a previously rolled up window (restores original height). - 0.1.6 - [*] : Reanimated Notification (removed Parameter ShowNotification). - [*] Extended Debug-Logging via OutputDebug. (Unified Output format, Created posibillity to remove debug information (via Tag _DBG_)). - 0.1.5 - [-] : Using integer coordinates for Gui Show. -*/ - -; ****** HINT: Documentation can be extracted to HTML using NaturalDocs ************** */ - -; Global Varibles -Version := "0.2.0" - -NotifyOptions := "GC=303030 TC=FFFFFF TS=8 TF=Verdana MC=FFFFFF MF=Verdana SI=200 ST=200 SC=200 BK=White IW=16 IH=16 Image=" -NotifyDuration := 3 -Ico_Dir := A_ScriptDir "/icons" -Ico_Minus := Ico_Dir "/minus.png" -Ico_Plus := Ico_Dir "/plus.png" - -/* -=============================================================================== -Function: WPXA_version - Returns the current version of WPXA - - Versioning scheme according to http://semver.org - -Returns: - current version number of the module - -Author(s): - 20110713 - hoppfrosch - Original -=============================================================================== -*/ -WPXA_version() -{ - Global Version - - return Version -} - -/* -=============================================================================== -Function: wp_ClipCursor - Clips (restricts/confines) the mouse to a given area - -Parameters: - Confine - Toogle for Clipping - x1,y1,x2,y2 - Bounding coordinates (upper left, lower right) of confined area - -Returns: - If the function succeeds, the return value is nonzero. - If the function fails, the return value is zero. To get extended error information, call GetLastError. - -Author(s): - Original - x79animal - http://www.autohotkey.com/forum/viewtopic.php?p=409537#409537 - 20110127 - hoppfrosch - Modifications -=============================================================================== -*/ -wp_ClipCursor( Confine=True, x1=0 , y1=0, x2=1, y2=1 ) -{ - VarSetCapacity(R,16,0), NumPut(x1,&R+0),NumPut(y1,&R+4),NumPut(x2,&R+8),NumPut(y2,&R+12) - Return Confine ? DllCall( "ClipCursor", UInt,&R ) : DllCall( "ClipCursor" ) -} - -/* -=============================================================================== -Function: wp_GetMonitorAt - Get the index of the monitor containing the specified x and y coordinates. - -Parameters: - x,y - Coordinates - default - Default monitor - -Returns: - Index of the monitor at specified coordinates - -Author(s): - Original - Lexikos - http://www.autohotkey.com/forum/topic21703.html -=============================================================================== -*/ -wp_GetMonitorAt(x, y, default=1) -{ - SysGet, m, MonitorCount - ; Iterate through all monitors. - Loop, %m% - { ; Check if the window is on this monitor. - SysGet, Mon, Monitor, %A_Index% - if (x >= MonLeft && x <= MonRight && y >= MonTop && y <= MonBottom) - return A_Index - } - - return default -} - -/* -=============================================================================== -Function: wp_GetMonitorFromMouse - Get the index of the monitor where the mouse is - -Parameters: - default - Default monitor - -Returns: - Index of the monitor where the mouse is - -Author(s): - 20120322- hoppfrosch: Initial -=============================================================================== -*/ -wp_GetMonitorFromMouse(default=1) -{ - MouseGetPos,x,y - return wp_GetMonitorAt(x,y,default) -} - -/* -=============================================================================== -Function: wp_GetMonitorFromWindow - Get the index of the monitor containing the specified window. - -Parameters: - hWnd - Window handle - -Returns: - Index of the monitor of specified window - -Author(s): - Original - ShinyWong - http://www.autohotkey.com/forum/viewtopic.php?p=462080#462080 -=============================================================================== -*/ -wp_GetMonitorFromWindow(hWnd) -{ - ; Starts with 1. - monitorIndex := 1 - - VarSetCapacity(monitorInfo, 40) - NumPut(40, monitorInfo) - - if (monitorHandle := DllCall("MonitorFromWindow", "uint", hWnd, "uint", 0x2)) - && DllCall("GetMonitorInfo", "uint", monitorHandle, "uint", &monitorInfo) - { - monitorLeft := NumGet(monitorInfo, 4, "Int") - monitorTop := NumGet(monitorInfo, 8, "Int") - monitorRight := NumGet(monitorInfo, 12, "Int") - monitorBottom := NumGet(monitorInfo, 16, "Int") - workLeft := NumGet(monitorInfo, 20, "Int") - workTop := NumGet(monitorInfo, 24, "Int") - workRight := NumGet(monitorInfo, 28, "Int") - workBottom := NumGet(monitorInfo, 32, "Int") - isPrimary := NumGet(monitorInfo, 36, "Int") & 1 - - SysGet, monitorCount, MonitorCount - - Loop, %monitorCount% - { - SysGet, tempMon, Monitor, %A_Index% - - ; Compare location to determine the monitor index. - if ((monitorLeft = tempMonLeft) and (monitorTop = tempMonTop) - and (monitorRight = tempMonRight) and (monitorBottom = tempMonBottom)) - { - monitorIndex := A_Index - break - } - } - } - - return %monitorIndex% -} - - -/* -=============================================================================== -Function: wp_GetProp - Get window property. - -Parameters: - hwnd - Window handle - property_name - Name of the property - type - Type of the property - should be int, uint or float. - -Returns: - Value of the property, otherwise NULL if property does not exist - -See also: - , - -Author(s): - Original - Lexikos - http://www.autohotkey.com/forum/topic21703.html - Reference - MSDN - http://msdn.microsoft.com/en-us/library/ms633564%28v=vs.85%29.aspx -=============================================================================== -*/ -wp_GetProp(hwnd, property_name, type="int") { - return DllCall("GetProp", "uint", hwnd, "str", property_name, type) -} - -/* -=============================================================================== -Function: wp_IsAlwaysOnTop - Determine whether fiven window is set to always on top - -Parameters: - WinTitle - Title of the window - IsSetByWP - Checks whether "AlwaysOnTop" was set with WindowPadX (needed to restore state ...) - -Returns: - True or False - -Author(s): - 20110811 - hoppfrosch - Initial -=============================================================================== -*/ -wp_IsAlwaysOnTop(WinTitle,IsSetByWP=0) -{ - WinGet, CurrExStyle, ExStyle, %WinTitle% - - if hwnd := wp_WinExist(WinTitle) { - if (IsSetByWP=1) - { - if wp_GetProp(hwnd,"wpAlwaysOnTop") - { - return (CurrExStyle & 0x08) ; WS_EX_TOPMOST - } - else - { - return 0 - } - } - return (CurrExStyle & 0x08) ; WS_EX_TOPMOST - } - - return -} - -/* -=============================================================================== -Function: wp_IsResizable - Determine if we should attempt to resize the last found window. - -Returns: - True or False - -Author(s): - Original - Lexikos - http://www.autohotkey.com/forum/topic21703.html -=============================================================================== -*/ -wp_IsResizable() -{ - WinGetClass, Class - if Class in Chrome_XPFrame,MozillaUIWindowClass - return true - WinGet, CurrStyle, Style - return (CurrStyle & 0x40000) ; WS_SIZEBOX -} - -/* -=============================================================================== -Function: wp_IsWhereWePutIt - Restores windows position and size previously stored with - -Parameters: - hwnd - Window handle - -Returns: - x,y,w,h - last position and size - -See also: - - -Author(s): - Original - Lexikos - http://www.autohotkey.com/forum/topic21703.html -=============================================================================== -*/ -wp_IsWhereWePutIt(hwnd, x, y, w, h) -{ - if wp_GetProp(hwnd,"wpHasRestorePos") - { ; Window has restore info. Check if it is where we last put it. - last_x := wp_GetProp(hwnd,"wpLastX") - last_y := wp_GetProp(hwnd,"wpLastY") - last_w := wp_GetProp(hwnd,"wpLastW") - last_h := wp_GetProp(hwnd,"wpLastH") - return (last_x = x && last_y = y && last_w = w && last_h = h) - } - return false -} - -/* -=============================================================================== -Function: wp_RememberPos - Helper function for detection of window movement by user. Stores the current position. The stored position can be recovered by - -Parameters: - hwnd - Window handle - -See also: - , - -Author(s): - Original - Lexikos - http://www.autohotkey.com/forum/topic21703.html -=============================================================================== -*/ -wp_RememberPos(hwnd) -{ - WinGetPos, x, y, w, h, ahk_id %hwnd% - ; Remember where we put it, to detect if the user moves it. - wp_SetProp(hwnd,"wpLastX",x) - wp_SetProp(hwnd,"wpLastY",y) - wp_SetProp(hwnd,"wpLastW",w) - wp_SetProp(hwnd,"wpLastH",h) -} - -/* -=============================================================================== -Function: wp_RemoveProp - Remove window property. - -Parameters: - hwnd - Window handle - property_name - Name of the property - -Returns: - Handle - The return value identifies the specified data. If the data cannot be found in the specified property list, the return value is NULL. - -See also: - , - -Author(s): - Reference - MSDN (http://msdn.microsoft.com/en-us/library/ms633567%28v=vs.85%29.aspx) - 20110713 - hoppfrosch - AutoHotkey-Implementation -=============================================================================== -*/ -wp_RemoveProp(hwnd, property_name) { - - _DBG_FName := A_ScriptName "-[wp_RemoveProp] - " ; _DBG_ - WinGetClass, WinClass, ahk_id %hwnd% ; _DBG_ - WinGetTitle, WinTitle, ahk_id %hwnd% ; _DBG_ - OutputDebug % _DBG_FName "Remove Property <" property_name "> for hwnd: " hwnd " - win_class: " WinClass " - win_title: " WinTitle ; _DBG_ - - return DllCall("RemoveProp", "uint", hwnd, "str", property_name) -} - -/* -=============================================================================== -Function: wp_Restore - Restores windows to state according properties - - Following states are restored: - * AlwaysOnTop - * RolledWindow - -Author(s): - 20110713 - hoppfrosch - AutoHotkey-Implementation -=============================================================================== -*/ -wp_Restore() { - ;MsgBox % "wp_Restore(): Vollstaendige Implementierung" - _DBG_FName := A_ScriptName "-[wp_Restore] - " ; _DBG_ - - WinGet, id, list, , , Program Manager - Loop, %id% - { - ; Aktionen r�ckh�ngig ... - hwnd := id%A_Index% - WinGetTitle, WinTitle, ahk_id %hwnd% - - WinGetClass, WinClass, ahk_id %hwnd% ; _DBG_ - OutputDebug % _DBG_FName "Besuche Fenster <" a_index "/" id ">: ahk_id: " hwnd " - win_class: " WinClass " - win_title: " WinTitle ; _DBG_ - - if wp_GetProp(hwnd,"wpAlwaysOnTop") { - OutputDebug % _DBG_FName "Window <" WinTitle "> has property " ; _DBG_ - if wp_IsAlwaysOnTop(WinTitle,1) { - OutputDebug % _DBG_FName "Disable AlwaysOnTop since it was set by WindowPadX" ; _DBG_ - WPXA_TopToggle(WinTitle) - OutputDebug % _DBG_FName "Current State of AlwaysOnTop: " wp_IsAlwaysOnTop(WinTitle) ; _DBG_ - } - } - else if (wp_GetProp(hwnd,"wpHasRestorePos")) { - OutputDebug % _DBG_FName "Window <" WinTitle "> has property " ; _DBG_ - } - else if (wp_GetProp(hwnd,"wpRolledUp") = 1) - { - OutputDebug % _DBG_FName "RollWindow disabled for hwnd: " hwnd " - win_class: " WinClass " - win_title: " WinTitle ; _DBG_ - wp_RollWindowToggle(hwnd) - } - - - } -} - -/* -=============================================================================== -Function: wp_RollWindowToggle - Toggles Rollup of a window (Rollup to caption bar) - -Parameters: - hWnd - Window handle - -Author(s): - 20120620 - hoppfrosch - Original -=============================================================================== -*/ -wp_RollWindowToggle(hwnd) -{ - _DBG_FName := A_ScriptName "-[wp_RollWindowToggle] - " ; _DBG_ - WinGetClass, WinClass, ahk_id %hwnd% ; _DBG_ - WinGetTitle, WinTitle, ahk_id %hwnd% ; _DBG_ - - ; Determine the minmal height of a window - SysGet, MinWinHeight, 29 - ; Get size of current window - WinGetPos, x, y, width, height, ahk_id %hwnd% - OutputDebug % _DBG_FName "MinWinHeight: " MinWinHeight " - win_height: " height " - wpRolledUp: " wp_GetProp(hwnd,"wpRolledUp") ; _DBG_ - - if (wp_GetProp(hwnd,"wpRolledUp") = 1) - { - if (height = MinWinHeight) - { - ; The window is still rolled up - heightUnrolled := wp_GetProp(hwnd,"wpUnrolledHeight") - WinMove, ahk_id %hwnd%, , , , ,%heightUnrolled% - wp_SetProp(hwnd,"wpRolledUp", 0) - wp_RemoveProp(hwnd,"wpUnrolledHeight") - OutputDebug % _DBG_FName "RollWindow disabled for hwnd: " hwnd " - win_class: " WinClass " - win_title: " WinTitle ; _DBG_ - } - else - { - ; the previously rolled-up window was unrolled manually - so rollup it again - wp_SetProp(hwnd,"wpRolledUp",1) - wp_SetProp(hwnd,"wpUnrolledHeight",height) - WinMove, ahk_id %hwnd%, , , , ,%MinWinHeight% - OutputDebug % _DBG_FName "RollWindow enabled for hwnd: " hwnd " - win_class: " WinClass " - win_title: " WinTitle ; _DBG_ - } - } - else - { - if (height > MinWinHeight) - { - wp_SetProp(hwnd,"wpRolledUp",1) - wp_SetProp(hwnd,"wpUnrolledHeight",height) - WinMove, ahk_id %hwnd%, , , , ,%MinWinHeight% - OutputDebug % _DBG_FName "RollWindow enabled for hwnd: " hwnd " - win_class: " WinClass " - win_title: " WinTitle ; _DBG_ - } - } - return wp_GetProp(hwnd,"wpRolledUp") -} - -/* -=============================================================================== -Function: wp_SetProp - Set window property. - -Parameters: - hwnd - Window handle - property_name - Name of the property - data - Value of the property - type - Type of the property - should be int, uint or float - -Returns: - True or False - -See also: - , - -Author(s): - Original - Lexikos - http://www.autohotkey.com/forum/topic21703.html -=============================================================================== -*/ -wp_SetProp(hwnd, property_name, data, type="int") { - _DBG_FName := A_ScriptName "-[wp_SetProp] - " ; _DBG_ - WinGetClass, WinClass, ahk_id %hwnd% ; _DBG_ - WinGetTitle, WinTitle, ahk_id %hwnd% ; _DBG_ - OutputDebug % _DBG_FName "Set Property <" property_name "> to data <" data "> for hwnd: " hwnd " - win_class: " WinClass " - win_title: " WinTitle ; _DBG_ - return DllCall("SetProp", "uint", hwnd, "str", property_name, type, data) -} - -/* -=============================================================================== -Function: wp_SetRestorePos - Stores windows position for restoring it later - -Parameters: - hwnd - Window handle - x,y,w,h - Next time user requests the window be "restored" use this position and size. - -See also: - - -Author(s): - Original - Lexikos - http://www.autohotkey.com/forum/topic21703.html -=============================================================================== -*/ -wp_SetRestorePos(hwnd, x, y, w, h) -{ - ; Next time user requests the window be "restored" use this position and size. - wp_SetProp(hwnd,"wpHasRestorePos",true) - wp_SetProp(hwnd,"wpRestoreX",x) - wp_SetProp(hwnd,"wpRestoreY",y) - wp_SetProp(hwnd,"wpRestoreW",w) - wp_SetProp(hwnd,"wpRestoreH",h) -} - -/* -=============================================================================== -Function: wp_WinExist - Custom WinExist() for implementing a couple extra "special" values. - -Parameters: - WinTitle - Title of the window - -Returns: - Windowshandle - -Author(s): - Original - Lexikos - http://www.autohotkey.com/forum/topic21703.html -=============================================================================== -*/ -wp_WinExist(WinTitle) -{ - if WinTitle = P - return wp_WinPreviouslyActive() - if WinTitle = M - { - MouseGetPos,,, win - return WinExist("ahk_id " win) - } - if WinTitle = _ - return wp_WinLastMinimized() - return WinExist(WinTitle!="" ? WinTitle : "A") -} - -/* -=============================================================================== -Function: wp_WinGetTitle - Custom WinGetTitle() for getting either title of "last found" window or window given by title - -Parameters: - WinTitle - Title of the window - -Returns: - WinTitle - Title of the window - -Author(s): - 20110607 - hoppfrosch - Original -=============================================================================== -*/ -wp_WinGetTitle(WinTitle) -{ - if WinTitle = - WinGetTitle, CurrWinTitle, - else - WinGetTitle, CurrWinTitle,WinTitle - - return CurrWinTitle -} - -/* -=============================================================================== -Function: wp_WinLastMinimized - Get most recently minimized window. - -Returns: - True or false - -Author(s): - Original - Lexikos - http://www.autohotkey.com/forum/topic21703.html -=============================================================================== -*/ -wp_WinLastMinimized() -{ - WinGet, w, List - - Loop %w% - { - wi := w%A_Index% - WinGet, m, MinMax, ahk_id %wi% - if m = -1 ; minimized - { - lastFound := wi - break - } - } - - return WinExist("ahk_id " . (lastFound ? lastFound : 0)) -} - -/* -=============================================================================== -Function: wp_WinPreviouslyActive - Get next window beneath the active one in the z-order. - -Returns: - Windowshandle - -Author(s): - Original - Lexikos - http://www.autohotkey.com/forum/topic21703.html -=============================================================================== -*/ -wp_WinPreviouslyActive() -{ - active := WinActive("A") - WinGet, win, List - - ; Find the active window. - ; (Might not be win1 if there are always-on-top windows?) - Loop, %win% - if (win%A_Index% = active) - { - if (A_Index < win) - N := A_Index+1 - - ; hack for PSPad: +1 seems to get the document (child!) window, so do +2 - ifWinActive, ahk_class TfPSPad - N += 1 - - break - } - - ; Use WinExist to set Last Found Window (for consistency with WinActive()) - return WinExist("ahk_id " . win%N%) -} - -/* -=============================================================================== -Function: wp_WinTraymin - Minimizes a window to a tray icon. - -Parameters: - hWnd - Windows-Handle - nFlags - Flag to allow manipulate properites: - wp_WinTraymin(hWnd,0), where 0 can be omitted. - Removing all trayminned trayicons: wp_WinTraymin(0,-1). - Other values than 0 & -1 are reserved for internal use. - -Author(s): - Original - Sean - http://http://www.autohotkey.com/community/viewtopic.php?f=2&t=33263 -=============================================================================== -*/ -wp_WinTraymin(hWnd = "", nFlags = "") -{ - Static - If Not hAHK&&hAHK:=WinExist("ahk_class AutoHotkey ahk_pid " DllCall("GetCurrentProcessId")) - ShellHook:=DllCall("RegisterWindowMessage","Str","SHELLHOOK"), nIcons:=0 - , DllCall("RegisterShellHookWindow","Uint",hAHK) - , OnMessage(nMsg:=1028,"WM_SHELLHOOKMESSAGE") - If Not nFlags - { - If Not ((hWnd+=0)||hWnd:=DllCall("GetForegroundWindow"))||((h:=DllCall("GetWindow","Uint",hWnd,"Uint",4))&&DllCall("IsWindowVisible","Uint",h)&&!hWnd:=h)|| - !(VarSetCapacity(sClass,32),DllCall("GetClassName","Uint",hWnd,"Str",sClass,"Uint",VarSetCapacity(sClass)//2))||sClass=="Shell_TrayWnd"||sClass=="Progman" - { - Return - } - OnMessage(ShellHook,"") - WinMinimize, ahk_id %hWnd% - WinHide, ahk_id %hWnd% - Sleep, 100 - OnMessage(ShellHook,"WM_SHELLHOOKMESSAGE") - uID:=uID_%hWnd%, uID ? "" : (uID_%hWnd%:=uID:=++nIcons=nMsg ? ++nIcons : nIcons) - SendMessage, 0x7F, 2, 0,, ahk_id %hWnd% - If Not hIcon:=ErrorLevel - { - hIcon:=DllCall("GetClassLong","Uint",hWnd,"Int",-34) - } - DllCall("GetWindowTextA","Uint",hWnd,"Uint",NumPut(hIcon,NumPut(nMsg,NumPut(1|2|4,NumPut(uID,NumPut(hAHK,NumPut(VarSetCapacity(ni,152),ni)))))),"int",128) - Return hWnd_%uID%:=DllCall("shell32\Shell_NotifyIcon","Uint",hWnd_%uID% ? 1 : 0,"Uint",&ni) ? hWnd : DllCall("ShowWindow","Uint",hWnd,"int",5)*0, DllCall("DestroyIcon","Uint",hIcon) - } - Else If nFlags > 0 - { - If (nFlags=3&&uID:=hWnd) - If WinExist("ahk_id " . hWnd:=hWnd_%uID%) - { - WinShow, ahk_id %hWnd% - WinRestore, ahk_id %hWnd% - } - Else nFlags:=2 - Else uID:=uID_%hWnd% - Return uID&&hWnd_%uID% ? (DllCall("shell32\Shell_NotifyIcon","Uint",2,"Uint",NumPut(uID,NumPut(hAHK,NumPut(VarSetCapacity(ni,152),ni)))-12),hWnd_%uID%:="") : "" - } - Else - Loop, % nIcons+0*DllCall("DeregisterShellHookWindow","Uint",hAHK) - hWnd_%A_Index% ? (DllCall("shell32\Shell_NotifyIcon","Uint",2,"Uint",NumPut(A_Index,NumPut(hAHK,NumPut(VarSetCapacity(ni,152),ni)))-12),DllCall("ShowWindow","Uint",hWnd_%A_Index%,"int",5),hWnd_%A_Index%:="") : "" -} - -/* -=============================================================================== -Function: WPXA_ClipCursorToMonitor - Clips (Restricts) mouse to given monitor - -Parameters: - md - monitor-id - -Author(s): - 20110126 - hoppfrosch - Initial -=============================================================================== -*/ -WPXA_ClipCursorToMonitor(md) -{ - SysGet, mc, MonitorCount - if (md<0 or md>mc) - return - - if (md=0) - { - wp_ClipCursor( False,0,0,1,1) ; Turn clipping off - return - } - - Loop, %mc% - SysGet, mon%A_Index%, MonitorWorkArea, %A_Index% - - ; Destination monitor - mdx1 := mon%md%Left - mdy1 := mon%md%Top - mdx2 := mon%md%Right - mdy2 := mon%md%Bottom - - wp_ClipCursor(True,mdx1,mdy1,mdx2,mdy2) - } - -/* -=============================================================================== -Function: WPXA_ClipCursorToCurrentMonitorToggle - Toogles clipping mouse to current monitor - -Author(s): - 20110126 - hoppfrosch - Initial -=============================================================================== -*/ -WPXA_ClipCursorToCurrentMonitorToggle() -{ - Static IsLocked - - if (IsLocked=True) - { - wp_ClipCursor( False ) ; Turn clipping off - IsLocked:=False - } - else - { - CoordMode, Mouse, Screen - MouseGetPos, xpos, ypos - md := wp_GetMonitorAt(xpos, ypos, 0) - - SysGet, mc, MonitorCount - Loop, %mc% - SysGet, mon%A_Index%, MonitorWorkArea, %A_Index% - - ; Destination monitor - mdx1 := mon%md%Left - mdy1 := mon%md%Top - mdx2 := mon%md%Right - mdy2 := mon%md%Bottom - - wp_ClipCursor(True,mdx1,mdy1,mdx2,mdy2) - IsLocked := True - } -} - -/* -=============================================================================== -Function: WPXA_FillVirtualScreen - Expand the window to fill the virtual screen (all monitors). - -Parameters: - winTitle - windows title - -Author(s): - Original - Lexikos - http://www.autohotkey.com/forum/topic21703.html -=============================================================================== -*/ -WPXA_FillVirtualScreen(winTitle) -{ - if hwnd := wp_WinExist(winTitle) - { - WinGetPos, x, y, w, h - if !wp_IsWhereWePutIt(hwnd, x, y, w, h) - wp_SetRestorePos(hwnd, x, y, w, h) - ; Get position and size of virtual screen. - SysGet, x, 76 - SysGet, y, 77 - SysGet, w, 78 - SysGet, h, 79 - ; Resize window to fill all... - WinMove,,, x, y, w, h - wp_RememberPos(hwnd) - } -} - -/* -=============================================================================== -Function: WPXA_GatherWindowsOnMonitor - "Gather" windows on a specific screen. - -Parameters: - md - monitor id - -Author(s): - Original - Lexikos - http://www.autohotkey.com/forum/topic21703.html -=============================================================================== -*/ -WPXA_GatherWindowsOnMonitor(md) -{ - global ProcessGatherExcludeList - - SetWinDelay, 0 - - ; List all visible windows. - WinGet, win, List - - ; Copy bounds of all monitors to an array. - SysGet, mc, MonitorCount - Loop, %mc% - SysGet, mon%A_Index%, MonitorWorkArea, %A_Index% - - if md = M - { ; Special exception for 'M', since the desktop window - ; spreads across all screens. - CoordMode, Mouse, Screen - MouseGetPos, x, y - md := wp_GetMonitorAt(x, y, 0) - } - else if md is not integer - { ; Support A, P and WinTitle. - ; (Gather at screen containing specified window.) - wp_WinExist(md) - WinGetPos, x, y, w, h - md := wp_GetMonitorAt(x+w/2, y+h/2, 0) - } - if (md<1 or md>mc) - return - - ; Destination monitor - mdx := mon%md%Left - mdy := mon%md%Top - mdw := mon%md%Right - mdx - mdh := mon%md%Bottom - mdy - - Loop, %win% - { - ; If this window matches the GatherExclude group, don't touch it. - if (WinExist("ahk_group GatherExclude ahk_id " . win%A_Index%)) - continue - - ; Set Last Found Window. - if (!WinExist("ahk_id " . win%A_Index%)) - continue - - WinGet, procname, ProcessName - ; Check process (program) exclusion list. - if procname in %ProcessGatherExcludeList% - continue - - WinGetPos, x, y, w, h - - ; Determine which monitor this window is on. - xc := x+w/2, yc := y+h/2 - ms := 0 - Loop, %mc% - if (xc >= mon%A_Index%Left && xc <= mon%A_Index%Right - && yc >= mon%A_Index%Top && yc <= mon%A_Index%Bottom) - { - ms := A_Index - break - } - ; If already on destination monitor, skip this window. - if (ms = md) - continue - - WinGet, state, MinMax - if (state = 1) { - WinRestore - WinGetPos, x, y, w, h - } - - if ms - { - ; Source monitor - msx := mon%ms%Left - msy := mon%ms%Top - msw := mon%ms%Right - msx - msh := mon%ms%Bottom - msy - - ; If the window is resizable, scale it by the monitors' resolution difference. - if (wp_IsResizable()) { - w *= (mdw/msw) - h *= (mdh/msh) - } - - ; Move window, using resolution difference to scale co-ordinates. - WinMove,,, mdx + (x-msx)*(mdw/msw), mdy + (y-msy)*(mdh/msh), w, h - } - else - { ; Window not on any monitor, move it to center. - WinMove,,, mdx + (mdw-w)/2, mdy + (mdh-h)/2 - } - - if state = 1 - WinMaximize - } -} - -/* -=============================================================================== -Function: WPXA_MaximizeToggle - Maximize or restore the window. - -Parameters: - winTitle - windows title - -Author(s): - Original - Lexikos - http://www.autohotkey.com/forum/topic21703.html -=============================================================================== -*/ -WPXA_MaximizeToggle(winTitle) -{ - if hwnd := wp_WinExist(winTitle) - { - WinGetPos, x, y, w, h - if !wp_IsWhereWePutIt(hwnd, x, y, w, h) - { - ; WindowPadX didn't put that window here, so save this position before moving. - wp_SetRestorePos(hwnd, x, y, w, h) - } - - WinGet, state, MinMax - if state - WinRestore - else - WinMaximize - - wp_RememberPos(hwnd) - } -} - -/* -=============================================================================== -Function: WPXA_MinimizeWindowsOnMonitor - Minimize all windows on the given Screen or all windows on screen where where the mouse currently lives - -Parameters: - md - monitor-id, if 0 determine monitor from mouse pos - -Author(s): - 20110125 - hoppfrosch - Initial - 20120322 - hoppfrosch - minimize windows on screen where mouse is (md = 0) -=============================================================================== -*/ -WPXA_MinimizeWindowsOnMonitor(md) -{ - ; If md=0: determine monitor from mouse ... - if (md=0) { - md := wp_GetMonitorFromMouse() - } - SysGet, mc, MonitorCount - if (md<1 or md>mc) - return - - ; List all visible windows. - WinGet, win, List - Loop, %win% - { - this_id := win%A_Index% - WinGetTitle, this_title, ahk_id %this_id% - WinGetPos, x, y, w, h, %this_title% - ; Determine which monitor this window is on. - xc := x+w/2, yc := y+h/2 - mcurr := wp_GetMonitorAt(xc, yc, 0) - - if (mcurr=md) - { - WinMinimize, %this_title% - } - } -} - -/* -=============================================================================== -Function: WPXA_Move - move and resize window based on a "pad" concept. - -Parameters: - sideX, sideY, widthFactor, heightFactor - **TODO** - winTitle - windows title ("A" - Active Window, "P" - Previous Window) - -Author(s): - Original - Lexikos - http://www.autohotkey.com/forum/topic21703.html -=============================================================================== -*/ -WPXA_Move(sideX, sideY, widthFactor, heightFactor, winTitle) -{ - if ! hwnd := wp_WinExist(winTitle) - return - - if sideX = - sideX = R - if sideY = - sideY = R - if widthFactor is not number - widthFactor := sideX ? 0.5 : 1.0 - if heightFactor is not number - heightFactor := sideY ? 0.5 : 1.0 - - WinGetPos, x, y, w, h - - if wp_IsWhereWePutIt(hwnd, x, y, w, h) - { ; Check if user wants to restore. - if SubStr(sideX,1,1) = "R" - { ; Restore on X-axis. - restore_x := wp_GetProp(hwnd,"wpRestoreX") - restore_w := wp_GetProp(hwnd,"wpRestoreW") - StringTrimLeft, sideX, sideX, 1 - } - if SubStr(sideY,1,1) = "R" - { ; Restore on Y-axis. - restore_y := wp_GetProp(hwnd,"wpRestoreY") - restore_h := wp_GetProp(hwnd,"wpRestoreH") - StringTrimLeft, sideY, sideY, 1 - } - if (restore_x != "" || restore_y != "") - { ; If already at the "restored" size and position, do the normal thing instead. - if ((restore_x = x || restore_x = "") && (restore_y = y || restore_y = "") - && (restore_w = w || restore_w = "") && (restore_h = h || restore_h = "")) - { - restore_x = - restore_y = - restore_w = - restore_h = - } - } - } - else - { ; WindowPadX didn't put that window here, so save this position before moving. - wp_SetRestorePos(hwnd, x, y, w, h) - if SubStr(sideX,1,1) = "R" - StringTrimLeft, sideX, sideX, 1 - if SubStr(sideY,1,1) = "R" - StringTrimLeft, sideY, sideY, 1 - } - - ; If no direction specified, restore or only switch monitors. - if (sideX+0 = "" && restore_x = "") - restore_x := x, restore_w := w - if (sideY+0 = "" && restore_y = "") - restore_y := y, restore_h := h - - ; Determine which monitor contains the center of the window. - m := wp_GetMonitorAt(x+w/2, y+h/2) - - ; Get work area of active monitor. - gosub wp_CalcMonitorStats - ; Calculate possible new position for window. - gosub wp_CalcNewSizeAndPosition - - ; If the window is already there, - if (newx "," newy "," neww "," newh) = (x "," y "," w "," h) - { ; ..move to the next monitor along instead. - - if (sideX or sideY) - { ; Move in the direction of sideX or sideY. - SysGet, monB, Monitor, %m% ; get bounds of entire monitor (vs. work area) - x := (sideX=0) ? (x+w/2) : (sideX>0 ? monBRight : monBLeft) + sideX - y := (sideY=0) ? (y+h/2) : (sideY>0 ? monBBottom : monBTop) + sideY - newm := wp_GetMonitorAt(x, y, m) - } - else - { ; Move to center (Numpad5) - newm := m+1 - SysGet, mon, MonitorCount - if (newm > mon) - newm := 1 - } - - if (newm != m) - { m := newm - ; Move to opposite side of monitor (left of a monitor is another monitor's right edge) - sideX *= -1 - sideY *= -1 - ; Get new monitor's work area. - gosub wp_CalcMonitorStats - } - else - { ; No monitor to move to, alternate size of window instead. - if sideX - widthFactor /= 2 - else if sideY - heightFactor /= 2 - else - widthFactor *= 1.5 - } - - ; Calculate new position for window. - gosub wp_CalcNewSizeAndPosition - } - - ; Restore before resizing... - WinGet, state, MinMax - if state - WinRestore - - WinDelay := A_WinDelay - SetWinDelay, 0 - - if (is_resizable := wp_IsResizable()) - { - ; Move and resize. - WinMove,,, newx, newy, neww, newh - - ; Since some windows might be resizable but have restrictions, - ; check that the window has sized correctly. If not, adjust. - WinGetPos, newx, newy, w, h - } - if (!is_resizable || (neww != w || newh != h)) - { - ; If the window is smaller on a given axis, center it within - ; the space. Otherwise align to the appropriate side. - newx := Round(newx + (neww-w)/2 * (1 + (w>neww)*sideX)) - newy := Round(newy + (newh-h)/2 * (1 + (h>newh)*sideY)) - ; Move but (usually) don't resize. - WinMove,,, newx, newy, w, h - } - - ; Explorer uses WM_EXITSIZEMOVE to detect when a user finishes moving a window - ; in order to save the position for next time. May also be used by other apps. - PostMessage, 0x232 - - SetWinDelay, WinDelay - - wp_RememberPos(hwnd) - return - -wp_CalcNewSizeAndPosition: - ; Calculate desired size. - neww := restore_w != "" ? restore_w : Round(monWidth * widthFactor) - newh := restore_h != "" ? restore_h : Round(monHeight * heightFactor) - ; Fall through to below: -wp_CalcNewPosition: - ; Calculate desired position. - newx := restore_x != "" ? restore_x : Round(monLeft + (sideX+1) * (monWidth - neww)/2) - newy := restore_y != "" ? restore_y : Round(monTop + (sideY+1) * (monHeight - newh)/2) - return - -wp_CalcMonitorStats: - ; Get work area (excludes taskbar-reserved space.) - SysGet, mon, MonitorWorkArea, %m% - monWidth := monRight - monLeft - monHeight := monBottom - monTop - return -} - -/* -=============================================================================== -Function: WPXA_MoveMouseToMonitor - Moves mouse to center of given monitor - -Parameters: - md - monitor-id - -Author(s): - 20110125 - hoppfrosch - Initial -=============================================================================== -*/ -WPXA_MoveMouseToMonitor(md) -{ - SysGet, mc, MonitorCount - if (md<1 or md>mc) - return - - Loop, %mc% - SysGet, mon%A_Index%, MonitorWorkArea, %A_Index% - - ; Destination monitor - mdx := mon%md%Left - mdy := mon%md%Top - mdw := mon%md%Right - mdx - mdh := mon%md%Bottom - mdy - - mdxc := mdx+mdw/2, mdyc := mdy+mdh/2 - - CoordMode, Mouse, Screen - MouseMove, mdxc, mdyc, 0 - WPXA_MouseLocator() -} - - -/* -=============================================================================== -Function: WPXA_MoveWindowToMonitor - Move window between screens, preserving relative position and size. - -Parameters: - md - Monitor id - winTitle - windows title - -Author(s): - Original - Lexikos - http://www.autohotkey.com/forum/topic21703.html -=============================================================================== -*/ -WPXA_MoveWindowToMonitor(md, winTitle) -{ - if !wp_WinExist(winTitle) - return - - SetWinDelay, 0 - - WinGet, state, MinMax - if state - WinRestore - - WinGetPos, x, y, w, h - - ; Determine which monitor contains the center of the window. - ms := wp_GetMonitorAt(x+w/2, y+h/2) - - SysGet, mc, MonitorCount - - ; Determine which monitor to move to. - if md in ,N,Next - { - md := ms+1 - if (md > mc) - md := 1 - } - else if md in P,Prev,Previous - { - md := ms-1 - if (md < 1) - md := mc - } - - if (md=ms or (md+0)="" or md<1 or md>mc) - return - - ; Get source and destination work areas (excludes taskbar-reserved space.) - SysGet, ms, MonitorWorkArea, %ms% - SysGet, md, MonitorWorkArea, %md% - msw := msRight - msLeft, msh := msBottom - msTop - mdw := mdRight - mdLeft, mdh := mdBottom - mdTop - - ; Calculate new size. - if (wp_IsResizable()) { - w := Round(w*(mdw/msw)) - h := Round(h*(mdh/msh)) - } - - ; Move window, using resolution difference to scale co-ordinates. - WinMove,,, mdLeft + (x-msLeft)*(mdw/msw), mdTop + (y-msTop)*(mdh/msh), w, h - - if state = 1 - WinMaximize -} - -/* -=============================================================================== -Function: WPXA_MouseLocator - Easy find the mouse - -Requirements: - Windings-Font - -Author(s): - Original - Skrommel - http://www.donationcoder.com/Software/Skrommel/MouseMark/MouseMark.ahk - 20110127 - hoppfrosch - Modifications -=============================================================================== -*/ -WPXA_MouseLocator() -{ - applicationname := A_ScriptName - - SetWinDelay,0 - DetectHiddenWindows,On - CoordMode,Mouse,Screen - - delay := 100 - size1 := 250 - size2 := 200 - size3 := 150 - size4 := 100 - size5 := 50 - col1 := "Red" - col2 := "Blue" - col3 := "Yellow" - col4 := "Lime" - col5 := "Green" - boldness1 := 700 - boldness2 := 600 - boldness3 := 500 - boldness4 := 400 - boldness5 := 300 - - Transform, OutputVar, Chr, 177 - - Loop,5 - { - MouseGetPos,x,y - size:=size%A_Index% - width:=Round(size%A_Index%*1.4) - height:=Round(size%A_Index%*1.4) - colX:=col%A_Index% - boldness:=boldness%A_Index% - Gui,%A_Index%:Destroy - Gui,%A_Index%:+Owner +AlwaysOnTop -Resize -SysMenu -MinimizeBox -MaximizeBox -Disabled -Caption -Border -ToolWindow - Gui,%A_Index%:Margin,0,0 - Gui,%A_Index%:Color,123456 - - Gui,%A_Index%:Font,c%colX% S%size% W%boldness%,Wingdings - Gui,%A_Index%:Add,Text,,%OutputVar% - - Gui,%A_Index%:Show,X-%width% Y-%height% W%width% H%height% NoActivate,%applicationname%%A_Index% - WinSet,TransColor,123456,%applicationname%%A_Index% - } - Loop,5 - { - MouseGetPos,x,y - WinMove,%applicationname%%A_Index%,,% x-size%A_Index%/1.7,% y-size%A_Index%/1.4 - WinShow,%applicationname%%A_Index% - Sleep,%delay% - WinHide,%applicationname%%A_Index% - ;Sleep,%delay% - } - - Loop,5 - { - Gui,%A_Index%:Destroy - } -} - -/* -=============================================================================== -Function: WPXA_RollToggle - Toogles "Roll/Unroll" for given window - -Parameters: - WinTitle - Title of the window - -Author(s): - 20120116 - hoppfrosch - Original -=============================================================================== -*/ -WPXA_RollToggle(WinTitle) { - - Global NotifyOptions, NotifyDuration, Ico_Minus, Ico_Plus - - if hwnd := wp_WinExist(WinTitle) - { - _DBG_FName := A_ScriptName "-[WPXA_RollToggle] - " ; _DBG_ - WinGetClass, WinClass, ahk_id %hwnd% ; _DBG_ - WinGetTitle, WinTitle, ahk_id %hwnd% ; _DBG_ - - CurrWinTitle := wp_WinGetTitle(WinTitle) - wp_RollWindowToggle(hwnd) - if (wp_GetProp(hwnd,"wpRolledUp") = 0) - { - Notify(A_ScriptName,CurrWinTitle "`nRollWindow disabled - " hwnd, NotifyDuration, NotifyOptions Ico_Minus) - } - else - { - Notify(A_ScriptName,CurrWinTitle "`nRollWindow enabled - " hwnd, NotifyDuration, NotifyOptions Ico_Plus) - } - } -} - -/* -=============================================================================== -Function: WPXA_TileLast2Windows - Tile active and last window - -Author(s): - 20120316 - ipstone today - Initial (http://www.autohotkey.com/forum/viewtopic.php?p=521482#521482) -=============================================================================== -*/ -WPXA_TileLast2Windows() { - static tileOrientation := 0 - if (tileOrientation=0) - { - tileOrientation := 1 - WPXA_Move(-1,0,0.5,1.0, "A") - WPXA_Move(+1,0,0.5,1.0, "P") - } - else - { - tileOrientation := 0 - WPXA_Move(0,-1, 1.0, 0.5, "A") - WPXA_Move(0, 1, 1.0, 0.5, "P") - } -} - -/* -=============================================================================== -Function: WPXA_TopToggle - Toogles "Always On Top" for given window - -Parameters: - WinTitle - Title of the window - -Author(s): - 20110811 - hoppfrosch - Initial -=============================================================================== -*/ -WPXA_TopToggle(WinTitle) { - - Global NotifyOptions, NotifyDuration, Ico_Minus, Ico_Plus - - if hwnd := wp_WinExist(WinTitle) - { - WinSet, AlwaysOnTop, toggle - - _DBG_FName := A_ScriptName "-[WPXA_TopToggle] - " ; _DBG_ - WinGetClass, WinClass, ahk_id %hwnd% ; _DBG_ - WinGetTitle, WinTitle, ahk_id %hwnd% ; _DBG_ - - CurrWinTitle := wp_WinGetTitle(WinTitle) - if (wp_IsAlwaysOnTop(WinTitle)) - { - OutputDebug % _DBG_FName "AlwaysOnTop enabled for hwnd: " hwnd " - win_class: " WinClass " - win_title: " WinTitle ; _DBG_ - Notify(A_ScriptName,CurrWinTitle "`nAlwaysOnTop enabled - " hwnd, NotifyDuration, NotifyOptions Ico_Plus) - //MsgBox, NotifyOptions - wp_SetProp(hwnd,"wpAlwaysOnTop",1) - } - else - { - OutputDebug % _DBG_FName "AlwaysOnTop disabled for hwnd: " hwnd " - win_class: " WinClass " - win_title: " WinTitle ; _DBG_ - Notify(A_ScriptName,CurrWinTitle "`nAlwaysOnTop disabled - " hwnd, NotifyDuration, NotifyOptions Ico_Minus) - wp_RemoveProp(hwnd,"wpAlwaysOnTop") - } - } -} - -/* -=============================================================================== -Function: WPXA_TrayMinWindow - Minimizes a window to a tray icon. - -Parameters: - WinTitle - Title of the window - -Author(s): - 20120509 - hoppfrosch - Initial -=============================================================================== -*/ -WPXA_TrayMinWindow(WinTitle) { - - if hwnd := wp_WinExist(WinTitle) - { - wp_WinTraymin(hwnd) - } -} - - -WM_SHELLHOOKMESSAGE(wParam, lParam, nMsg) -{ - Critical - If nMsg=1028 - { - If wParam=1028 - Return - Else If (lParam=0x201||lParam=0x205||lParam=0x207) - wp_WinTraymin(wParam,3) - } - Else If (wParam=1||wParam=2) - wp_WinTraymin(lParam,wParam) - Return 0 -} - -#include %A_ScriptDir%\_inc\Notify.ahk \ No newline at end of file diff --git a/WindowPadX/WindowPadX.Default.ini b/WindowPadX/WindowPadX.Default.ini deleted file mode 100644 index 33c8672..0000000 --- a/WindowPadX/WindowPadX.Default.ini +++ /dev/null @@ -1,117 +0,0 @@ -; -; See WindowPadX.html for more details about configuring WindowPadX. -; - -[Options] -TitleMatchMode=2 - -; -; [Hotkeys]: Hotkeys which are active by default. -; Hotkey sets using standard modifier keys such as -; * Ctrl (^) -; * Win (#) -; * Alt (!) -; * Shift (+) -; * For more see: http://l.autohotkey.net/docs/Hotkeys.htm -; should be placed directly in this section. [Hotkeys: NAME] sections -; must be enabled/disabled by a hotkey defined in this section. -; -[Hotkeys] -; Win+Numpad for Active Window: -#Numpad1 = WPXA_Move, -1, +1, 0.5, 0.5 -#Numpad2 = WPXA_Move, 0, +1, 1.0, 0.5 -#Numpad3 = WPXA_Move, +1, +1, 0.5, 0.5 -#Numpad4 = WPXA_Move, -1, 0, 0.5, 1.0 -#Numpad5 = WPXA_Move, 0, 0, 0.5, 1.0 -#Numpad6 = WPXA_Move, +1, 0, 0.5, 1.0 -#Numpad7 = WPXA_Move, -1, -1, 0.5, 0.5 -#Numpad8 = WPXA_Move, 0, -1, 1.0, 0.5 -#Numpad9 = WPXA_Move, +1, -1, 0.5, 0.5 -#!Numpad1 = WPXA_MoveMouseToMonitor, 1 -#!Numpad2 = WPXA_MoveMouseToMonitor, 2 -#!Numpad5 = WPXA_ClipCursorToCurrentMonitorToggle -#!Numpad0 = WPXA_MouseLocator -~RButton & LButton = WPXA_MouseLocator - -#NumpadAdd = WPXA_MaximizeToggle -#NumpadEnter = WPXA_MoveWindowToMonitor, Next -#NumpadDiv = WPXA_MinimizeWindowsOnMonitor, 1 -#!NumpadDiv = WPXA_GatherWindowsOnMonitor, 1 -#NumpadMult = WPXA_MinimizeWindowsOnMonitor, 2 -#!NumpadMult = WPXA_GatherWindowsOnMonitorOnMonitor, 2 -#NumpadSub = WPXA_TopToggle - - -; Custom modifier keys: -CapsLock = Hotkeys, Active Window (WADS) -Numpad0 = Hotkeys, Active Window (Numpad) -NumpadSub = Hotkeys, Previous Window (Numpad) - -; -; [Hotkeys: xxx]: Hotkeys which are enabled/disabled via the Hotkeys command. -; These are typically used to implement custom modifier keys. -; -[Hotkeys: Active Window (WADS)] -z = WPXA_Move, -1, +1, 0.5, 0.5 -x = WPXA_Move, 0, +1, 1.0, 0.5 -c = WPXA_Move, +1, +1, 0.5, 0.5 -a = WPXA_Move, -1, 0, 0.5, 1.0 -s = WPXA_Move, 0, 0, 0.5, 1.0 -d = WPXA_Move, +1, 0, 0.5, 1.0 -q = WPXA_Move, -1, -1, 0.5, 0.5 -w = WPXA_Move, 0, -1, 1.0, 0.5 -e = WPXA_Move, +1, -1, 0.5, 0.5 -Tab = WPXA_MaximizeToggle -Space = WPXA_MoveWindowToMonitor, Next -LAlt = WPXA_MoveWindowToMonitor, Prev -1 = WPXA_GatherWindowsOnMonitor, 1 -2 = WPXA_GatherWindowsOnMonitor, 2 - -[Hotkeys: Active Window (Numpad)] -*Numpad1 = WPXA_Move, -1, +1, 0.5, 0.5 -*Numpad2 = WPXA_Move, 0, +1, 1.0, 0.5 -*Numpad3 = WPXA_Move, +1, +1, 0.5, 0.5 -*Numpad4 = WPXA_Move, -1, 0, 0.5, 1.0 -*Numpad5 = WPXA_Move, 0, 0, 0.5, 1.0 -*Numpad6 = WPXA_Move, +1, 0, 0.5, 1.0 -*Numpad7 = WPXA_Move, -1, -1, 0.5, 0.5 -*Numpad8 = WPXA_Move, 0, -1, 1.0, 0.5 -*Numpad9 = WPXA_Move, +1, -1, 0.5, 0.5 -*NumpadAdd = WPXA_MaximizeToggle -*NumpadEnter = WPXA_MoveWindowToMonitor, Next - -[Hotkeys: Previous Window (Numpad)] -*Numpad1 = WPXA_Move, -1, +1, 0.5, 0.5, P -*Numpad2 = WPXA_Move, 0, +1, 1.0, 0.5, P -*Numpad3 = WPXA_Move, +1, +1, 0.5, 0.5, P -*Numpad4 = WPXA_Move, -1, 0, 0.5, 1.0, P -*Numpad5 = WPXA_Move, 0, 0, 0.5, 1.0, P -*Numpad6 = WPXA_Move, +1, 0, 0.5, 1.0, P -*Numpad7 = WPXA_Move, -1, -1, 0.5, 0.5, P -*Numpad8 = WPXA_Move, 0, -1, 1.0, 0.5, P -*Numpad9 = WPXA_Move, +1, -1, 0.5, 0.5, P -*NumpadAdd = WPXA_MaximizeToggle, P -*NumpadEnter = WPXA_MoveWindowToMonitor, Next, P - -; -; [Exclude Windows]: Hotkeys are disabled for these windows. -; -[Exclude Windows] -Window=Virtual PC -Window=Remote Desktop - -; -; [Gather: Exclude Windows]: WPXA_GatherWindowsOnMonitor ignores these windows when gathering. -; -[Gather: Exclude Windows] -Window=ahk_class SideBar_AppBarWindow -Window=ahk_class SideBar_HTMLHostWindow -Window=ahk_class BasicWindow - -; -; [Gather: Exclude Processes]: WPXA_GatherWindowsOnMonitor ignores windows belonging to these processes. -; It is usually not necessary to use both this and the above. -; -[Gather: Exclude Processes] -; Process=sidebar.exe -Process=clocx.exe diff --git a/WindowPadX/WindowPadX.ahk b/WindowPadX/WindowPadX.ahk deleted file mode 100644 index 70b98f1..0000000 --- a/WindowPadX/WindowPadX.ahk +++ /dev/null @@ -1,485 +0,0 @@ -/* -Title: _WindowPadX - -*Handling windows in general and within a multi-monitor setup in special* - -derived from *WindowPad* by *Lexikos* (http://www.autohotkey.com/forum/topic21703.html) - -See also the documentation of original *WindowPad* by *Lexikos* (http://www.autohotkey.com/forum/topic21703.html), as *WindowPadX* is just a simple clone of *WindowPad* with reengineering and a few enhancements .... - -Documentation: -- - Using *WindowPadX* from the commandline -- - Implement your own commands - -Requires: - AutoHotkey v1.1.0 or later. - -Author: - hoppfrosch - -Version History: - 1.2.2 - 22.Mar.2012 Hoppfrosch - [+] WPXA.ahk v0.2.0: : Bugfix for rolling up windows to its titlebar - 1.2.1 - 22.Mar.2012 Hoppfrosch - [+] WPXA.ahk v0.1.10: : Determine monitor where mouse is - [*] WPXA.ahk v0.1.10: : Minimize windows on screen where mouse is - 1.2.0 - 19.Mar.2012 Hoppfrosch - [+] WPXA.ahk v0.1.9: : Tile active and last window (Credits: ipstone today (http://www.autohotkey.com/forum/viewtopic.php?p=521482#521482)) - 1.1.1 - 26.Jan.2012 Hoppfrosch - [*] WPXA.ahk v0.1.8: : Bugfix to actually toggle Maximization - 1.1.0 - 13.Jan.2012 Hoppfrosch - [*] WPXA.ahk v0.1.6: : Reanimated Notifications - [+] WPXA.ahk v0.1.7: : New action for toggling rolling a window to its captionbar - 1.0.1 - 13.Jan.2012 Hoppfrosch - [*] WPXA.ahk v0.1.5: : Using integer coordinates for Gui Show - 1.0.0 - 12.Jan.2012 Hoppfrosch: Initial release of WindowPadX -*/ - -/* - --------------------------------------------------------------------------------------- -Ideensammlung: -* Transparenz f�r Fenster -* Overlay-Icon in Taskbar, um anzuzeigen auf welchem Screen sich das Fenster befindet ... (Funktion aus ITaskBar von maul.esel). Dies sollte bei verlassen des Programmes auch wieder entfernt werden. - Hinweise: - * http://www.autohotkey.com/forum/viewtopic.php?t=74314 - * http://www.autohotkey.com/forum/viewtopic.php?t=70978 -* "TaskSwitcher" fuer jeden Monitor - Hinweise: - * http://www.autohotkey.com/forum/viewtopic.php?t=71912 --------------------------------------------------------------------------------------- -*/ - -#include %A_ScriptDir%/WPXA.ahk - -#SingleInstance force - -Version := "1.2.2" - -if 0 > 0 -{ - ; Command-line mode: interpret each arg as a pseudo-command. - ; Suspend all hotkeys which may be created by WindowPadXInit. - Suspend On - ; Load options and Gather exclusions. - gosub WindowPadXInit - ; Execute command line(s). Each args should be in one of these formats: - ; - ; , - ; ", " ; In this case the initial comma is optional. - Loop %0% - wp_ExecLine(%A_Index%) - ExitApp -} - -OnExit, TrayExit - -WindowPadXInit: - ; If this script is #included in another script, this section may not be - ; auto-executed. In that case, the following should be called manually: - WindowPadX_Init(WINDOWPADX_INI_PATH) - return - -WindowPadX_Init(IniPath="") -{ - global WINDOWPADX_INI_PATH - ; - ; Init icons and tray menu. - ; - if A_IsCompiled ; Load icons from my custom WindowPadX.exe. - { - ; Default icon is 32x32, so doesn't look good in the tray. - Menu, Tray, Icon, %A_ScriptFullPath%, 2 - } - else if (A_LineFile = A_ScriptFullPath) - { ; Set the tray icon, but only if not included in some other script. - wp_SetTrayIcon(true) - ; Use OnMessage to catch "Suspend Hotkeys" or "Pause Script" - ; so the "disabled" icon can be used. - OnMessage(0x111, "WM_COMMAND") - } - - Menu, Tray, NoStandard - Menu, Tray, MainWindow - Menu, Tray, Add, &Debug, TrayDebug - ifExist, %A_ScriptDir%\WindowPadX.html - { - Menu, Tray, Add, &Help, TrayHelp - Menu, Tray, Add - } - Menu, Tray, Add, &Reload, TrayReload - if !A_IsCompiled - { - Menu, Tray, Add, &Edit Source, TrayEdit - } - Menu, Tray, Add, Edit &Configuration, TrayEditConfig - Menu, Tray, Add - Menu, Tray, Add, &Suspend, TraySuspend - Menu, Tray, Add, E&xit, TrayExit - Menu, Tray, Default, &Debug - ; - ; Load settings. - ; - if IniPath = - Loop, %A_LineFile%\..\WindowPadX.ini - IniPath := A_LoopFileFullPath - ifNotExist %IniPath% - { - IniPath = %A_ScriptDir%\WindowPadX.ini - FileInstall, WindowPadX.Default.ini, %IniPath% - } - WINDOWPADX_INI_PATH := IniPath - WindowPadX_LoadSettings(IniPath) -} - -WindowPadX_LoadSettings(ininame) -{ - local v - - ; Misc Options - IniRead, v, %ininame%, Options, TitleMatchMode, %A_TitleMatchMode% - SetTitleMatchMode, %v% - - ; Hotkeys: Exclude Windows - v := wp_INI_GetList(ininame, "Exclude Windows", "Window") - Loop, Parse, v, `n - GroupAdd, HotkeyExclude, %A_LoopField% - - ; Read the Hotkeys section in. - v := wp_INI_ReadSection(ininame, "Hotkeys") - ; Replace the first = with ::. - ; ('=' is required for WritePrivateProfileSection to work properly.) - v := RegExReplace(v, "m`a)^(.*?)=", "$1::") - Hotkey, IfWinNotActive, ahk_group HotkeyExclude - Hotkey_Params(v) - - ; Gather: Exclude Windows - v := wp_INI_GetList(ininame, "Gather: Exclude Windows", "Window") - Loop, Parse, v, `n - GroupAdd, GatherExclude, %A_LoopField% - - ; Gather: Exclude Processes - ProcessGatherExcludeList := wp_INI_GetList(ininame - , "Gather: Exclude Processes", "Process", ",") -} - -wp_INI_GetList(ininame, Section, Key, Delim="`n") -{ - v := wp_INI_ReadSection(ininame, Section) - Loop, Parse, v, `n - { - pos := InStr(A_LoopField, "=") - if (pos && SubStr(A_LoopField,1,pos-1) = Key) - list .= (list ? Delim : "") . SubStr(A_LoopField, pos+1) - } - return list -} - -wp_INI_ReadSection(Filename, Section) -{ - char_type := A_IsUnicode ? "UShort" : "UChar" - char_size := A_IsUnicode ? 2 : 1 - - ; Expand relative paths, since GetPrivateProfileSection only searches %A_WinDir%. - Loop, %Filename%, 0 - Filename := A_LoopFileLongPath - - VarSetCapacity(buf, 0x7FFF*char_size, 0) - - len := DllCall("GetPrivateProfileSection" - , "uint", &Section, "uint", &buf, "uint", 0x7FFF, "uint", &Filename) - - VarSetCapacity(text, len*char_size), p := &buf - ; For each null-terminated substring, - while (s := DllCall("MulDiv", "int", p, "int", 1, "int", 1, "str")) - ; append it to the output and advance to the next substring. - text .= s "`n", p += (StrLen(s)+1)*char_size - - ; Strip the trailing newline - text := SubStr(text, 1, -1) - - ; Windows Me/98/95: - ; The returned string includes comments. - ; - ; This removes comments. Also, I'm not sure if leading/trailing space is - ; automatically removed on Win9x, so the regex removes that too. - if A_OSVersion in WIN_ME,WIN_98,WIN_95 - text := RegExReplace(text, "m`n)^[ `t]*(?:;.*`n?|`n)|^[ `t]+|[ `t]+$") - - return text -} - - -; Tray menu subroutines. May also be assigned to hotkeys in WindowPadX.ini. -TrayDebug: - ListHotkeys - return -TrayHelp: - Run, %A_ScriptDir%\WindowPadX.html - return -TrayReload: - Reload - return -TrayEdit: - Edit - return -TrayEditConfig: - RegRead, Editor, HKCR, AutoHotkeyScript\Shell\Edit\Command - StringReplace, Editor, Editor, "`%1", - Editor := RegExReplace(Editor, "(^\s*|\s*$)") - if (Editor = ) - Editor = notepad - Run, %Editor% "%A_ScriptDir%\WindowPadX.ini" - return -TraySuspend: - WM_COMMAND(65305,0) - Suspend - Menu, Tray, % A_IsSuspended ? "Check" : "Uncheck", &Suspend - return -TrayExit: - - - wp_Restore() - ExitApp - - - -; -; Hotkeys: Activate hotkeys defined in INI section [Hotkeys: %section%]. -; -Hotkeys(section, options) -{ - local this_hotkey, section_var, hotkeys, wait_for_keyup, m, m1, pos, k - static key_regex = "^(?:.* & )?[#!^+&<>*~$]*(.+)" - - this_hotkey := A_ThisHotkey - - if !section - goto HC_SendThisHotkeyAndReturn - - pos := RegExMatch(options, "i)(?<=\bD)\d*\.?\d*", m) - if pos - { - options := SubStr(options, 1, pos-2) . SubStr(options, pos+StrLen(m)) - if (m+0 = "") - m := 0.1 - Input, k, L1 T%m% - if ErrorLevel != Timeout - { - gosub HC_SendThisHotkey - Send %k% - return - } - } - - section_var := RegExReplace(section, "[^\w#@$]", "_") - hotkeys := Hotkeys_%section_var% - - if hotkeys = - { - ; Load each hotkeys section on first use. Since the ini file may be - ; edited between enabling and disabling the hotkeys, loading them - ; each and every time would be hazardous. - hotkeys := wp_INI_ReadSection(WINDOWPADX_INI_PATH, "Hotkeys: " section) - if hotkeys = - goto HC_SendThisHotkeyAndReturn - - ; key=command -> key::command - hotkeys := RegExReplace(hotkeys, "m`a)^(.*?)=", "$1::") - - Hotkeys_%section_var% := hotkeys - } - - ; If Options were omitted and this is a key-down hotkey, - ; automatically disable the hotkeys when the key is released. - if (wait_for_keyup := (options="" && SubStr(this_hotkey,-2) != " up")) - options = On ; Explicit "on" in case hotkey exists but is disabled. - - Hotkey, IfWinNotActive, ahk_group HotkeyExclude - Hotkey_Params(hotkeys, options) - - if (wait_for_keyup) - { - if (!RegExMatch(this_hotkey, key_regex, m) || GetKeyState(m1)="") { - MsgBox, % "Error retrieving primary key of hotkey in Hotkeys().`n" - . "`tHotkey: " this_hotkey "`n" - . "`tResult: " m1 - . "`nPlease inform Lexikos. Tip: Press Ctrl+C to copy this message." - return - } - - KeyWait, %m1% - - Hotkey_Params(hotkeys, "Off") - - ; A_ThisHotkey: "The key name of the *most recently executed* hotkey" - ;if(some other hotkey was executed during KeyWait) - if (this_hotkey = A_ThisHotkey) - goto HC_SendThisHotkeyAndReturn - } - return - -HC_SendThisHotkey: -HC_SendThisHotkeyAndReturn: - if ! InStr(this_hotkey, "~") - if (RegExMatch(this_hotkey, key_regex, m) && GetKeyState(m1)!="") { - Hotkey, %this_hotkey%, Off - Send {Blind}{%m1%} - Hotkey, %this_hotkey%, On - } - return -} - - -; -; Commands implemented as labels for simplicity. -; -Send: - Send, %Params% - return -Minimize: - if wp_WinExist(Params) - PostMessage, 0x112, 0xF020 ; WM_SYSCOMMAND, SC_MINIMIZE - return -Unminimize: - if wp_WinLastMinimized() - WinRestore - return -Restore: - if wp_WinExist(Params) - WinRestore - return - -; -; Internal Functions -; -; Execute a pseudo-command with params. -wp_ExecLine(cmdline) -{ - if RegExMatch(cmdline, "^\s*(?\S+?)(?:[, `t]\s*(?.*?))?\s*$", a) - { - global Params := aParams ; Global for use by label-based pseudo-commands. - if (n := IsFunc(aName)) && n <= 6 - { ; %aName% is a function with up to 5 params. - if n > 2 - { ; Two or more required parameters. - if RegExMatch(aParams, "^(?:[^,]*,){1," n-2 "}\s*", aParams) - StringSplit, p, aParams, `,, %A_Space%%A_Tab% - else ; no comma - p0 := 1 - p%p0% := SubStr(Params, StrLen(aParams) + 1) - } - else - ; At most one required parameter. - p1 := Params - ; Call function with values supplied for only the required params. - ; This allows commas to be treated literally in the last param. - return %aName%(p1, p2, p3, p4, p5) - } - else - ; aName is a label or invalid. - gosub %aName% - } -} - -; Hotkey_Params( line [, Options ] ) -; Associates a hotkey with a parameter string. -; -; Expects a newline(`n)-delimited list of hotkeys in the form: -; Hotkey:: LabelName, Params -; -; Note: -; - Spaces are optional. -; - As with hotkey labels, there should be no space between 'Hotkey' and '::'. -; - Unlike the Hotkey command, LabelName MUST NOT be omitted. -; - Params MUST NOT contain a newline character (`n). -; - Params may contain zero or more commas. -; - , (comma) is supported as a hotkey. -; - Unlike the Hotkey command, 'Toggle' should be specified in the Options, not as a label. -; -; Returns the number of hotkeys successfully enabled/disabled. -; -Hotkey_Params(line, Options="") -{ - static List ; List of hotkeys and associated labels + parameters. - , sCmdLine ; temp var used by hotkey subroutine. - - count = 0 - - ; Note: The parsing loop operates on a temporary copy of 'line', - ; so 'line' can be (and is) reused within the loop. - - Loop, Parse, line, `n, %A_Space%%A_Tab% - { - ; Clear ErrorLevel in case UseErrorLevel is (not) specified. - ErrorLevel = - - if ! RegExMatch(A_LoopField, "^\s*(?.+?)::\s*(?.+?)(?:[, `t]\s*(?.*?))?\s*$", line) - continue - - if !(IsLabel(lineName) || IsFunc(lineName)) - continue - - if Options = Toggle ; Not supported as an option (must be Label.) - { - ; Toggle hotkey. If it doesn't exist, the next line will enable it. - Hotkey, %lineHotkey%, Toggle, UseErrorLevel - ; Ensure the hotkey will execute the correct label. - Hotkey, %lineHotkey%, hp_ExecuteHotkeyWithParams, UseErrorLevel - } else - Hotkey, %lineHotkey%, hp_ExecuteHotkeyWithParams, %Options% - - ; Check ErrorLevel in case UseErrorLevel was specified. - if ErrorLevel - continue - - ; Rebuild line to remove whitespace. - line := lineHotkey "::" lineName "," lineParams - - ; Update an existing hotkey's label + params, - temp := RegExReplace(List, "m`n)^\Q" lineHotkey "\E::.*$", line, repl, 1) - if (repl > 0) - List := temp - else ; or add a new hotkey to the list. - List .= (List ? "`n" : "") . line - - count += 1 - } - return count - -hp_ExecuteHotkeyWithParams: - if RegExMatch(List, "m`n)^\Q" A_ThisHotkey "\E::\K.*", sCmdLine) - wp_ExecLine(sCmdLine) -return -} - - -; -; Tray Icon Override: -; Provides a way to customize the icons without compiling the script. -; - -WM_COMMAND(wParam, lParam) -{ - static IsPaused, IsSuspended - Critical - id := wParam & 0xFFFF - if id in 65305,65404,65306,65403 - { ; "Suspend Hotkeys" or "Pause Script" - if id in 65306,65403 ; pause - IsPaused := ! IsPaused - else ; at this point, A_IsSuspended has not yet been toggled. - IsSuspended := ! A_IsSuspended - wp_SetTrayIcon(!(IsPaused or IsSuspended)) - } -} - -wp_SetTrayIcon(is_enabled) -{ - icon := is_enabled ? "tray.ico" : "disabled.ico" - icon = %A_ScriptDir%\icons\%icon% - - ; avoid an error message if the icon doesn't exist - IfExist, %icon% - Menu, TRAY, Icon, %icon%,, 1 -} diff --git a/WindowPadX/WindowPadX.html b/WindowPadX/WindowPadX.html deleted file mode 100644 index 5e70c1f..0000000 --- a/WindowPadX/WindowPadX.html +++ /dev/null @@ -1,427 +0,0 @@ - - - - - WindowPadX v0.1.0 - - - - -

WindowPadX  v0.1.0

- -
-
-

Adding Commands

-

Additional commands for use in WindowPadX.ini may be implemented by simply adding subroutines or functions to WindowPadX.ahk. For instance, a Close command could be implemented by adding either of the following:

-
Close: ; Subroutine version
-    if wp_WinExist(Params)
-        WinClose
-    return
-    
-Close(winTitle) { ; Function version, requires v1.60+
-    if wp_WinExist(winTitle)
-        WinClose
-}
-

It would then be used like any other WindowPadX command, by adding something like this to WindowPadX.ini:

-
!4 = Close, A
-
-

Note that AutoHotkey or Ahk2Exe is required to run or compile WindowPadX.ahk after making changes.

-
-
-

Command-line Usage

-

As of v1.56, WindowPadX supports a command-line mode. Simply pass one or more commands on the command-line and WindowPadX will execute them and then exit. If a command's parameters contain spaces, the command and its arguments must be enclosed in quotation marks. For example: -

WindowPadX.exe GatherWindows,1 "WindowScreenMove, Next, My Window"
-
-
-
-

Configuration

-

All configuration is currently done by editing WindowPadX.ini.

-

Hotkeys

-

Hotkeys are defined in [Hotkeys] sections. Each section contains a list of hotkey=command bindings. The syntax for a binding is:

-
Hotkey = Command, Params
-

Hotkey may be any valid AutoHotkey hotkey. Command must be a WindowPadX command, defined in the script as a label.

-

Hotkeys defined in the [Hotkeys] section are initially active when WindowPadX loads. Hotkey sets which use standard modifier keys like Ctrl (^) or Win (#) should be placed directly in this section.

-
[Hotkeys]
-#Num
-
-

Custom modifier keys may be implemented by placing "pad" keys (excluding the modifier key) in a [Hotkeys: Name] section, and a hotkey in the [Hotkeys] section to enable/disable it:

-
[Hotkeys]
-ModifierKey = Hotkeys, Name
-...
-[Hotkeys: Name]
-Key1 = Command, Params
-Key2 = Command, Params
-...
-

Options

-

TitleMatchMode: Defines the default title matching mode for the script. -

If WindowPadX is #included in another script, WindowPad_Init() must be called from the auto-execute section for this option to work. -

[Options]
-TitleMatchMode=2
-
-

-

Exclude Windows

-

WindowPadX hotkeys are disabled for windows listed in this section. -

[Exclude Windows]
-Window=Virtual PC
-Window=ahk_class TSSHELLWND
-; TSSHELLWND is the window class of Remote Desktop.
-
-

-

Gather Exclusions

-

Windows may be excluded from "gathering" either by title or by process. -

In the following example, either section may be used to prevent GatherWindows from affecting Windows Vista's side bar.

[Gather: Exclude Windows]
-Window=ahk_class SideBar_AppBarWindow
-Window=ahk_class SideBar_HTMLHostWindow
-Window=ahk_class BasicWindow
-
-[Gather: Exclude Processes]
-Process=sidebar.exe
-
-

-
-
-

FillVirtualScreen

-

Expands a window to fill the entire virtual screen, which encompasses all screens in a multi-monitor setup.

-

FillVirtualScreen, WinTitle

-

Parameters

- - - - - -
WinTitleSee Window Titles.
-
-
-

GatherWindows

-

Gathers windows onto a single monitor.

-

GatherWindows, WinTitle
-GatherWindows, Monitor

-

Parameters

- - - - - - - - - -
WinTitleGather windows onto the monitor which contains this window. See Window Titles.
MonitorA monitor number, where 1 is the first monitor.
-
-
-

Hotkeys

-

Enables or disables a set of hotkeys.

-

Hotkeys, Section, Options

-

Parameters

- - - - - - - - - -
SectionThe name of a hotkey set defined in WindowPadX.ini, excluding the Hotkeys: prefix.
OptionsAny option or string of options compatible with AutoHotkey's Hotkey command. For instance, On or Off. -

The word Toggle to toggle each hotkey in the set. -

Specify D%time% to indicate that the hotkey that launched this command must be held for at least %time% seconds before the hotkey set is enabled. -

If no options are specified, the hotkeys will be automatically disabled when the hotkey that launched this command is released.

-

Example

-

In the following example, the hotkey set is enabled if CapsLock is held for 0.2 seconds, and automatically disabled when CapsLock is released:

[Hotkeys]
-CapsLock = Hotkeys, Active Window, D0.2
-
-[Hotkeys: Active Window]
-z = WindowPadMove, -1, +1,  0.5, 0.5
-x = WindowPadMove,  0, +1,  1.0, 0.5
-...
-
-

-
-
-

MaximizeToggle

-

Maximizes or restores a window.

-

MaximizeToggle, WinTitle

-

Parameters

- - - - - -
WinTitleIndicates which window to maximize or restore. See Window Titles.
-
-
-

Minimize

-

Minimizes a window.

-

Minimize, WinTitle

-

Parameters

- - - - - -
WinTitleIndicates which window to minimize. See Window Titles.
-
-
-

Restore

-

Restores a window.

-

Restore, WinTitle

-

Parameters

- - - - - -
WinTitleIndicates which window to restore. See Window Titles.
-
-
-

Send

-

Analogous to AutoHotkey's Send command.

-

Send, Keys

-

Remarks

-

The comma is required.

-
-
-

Unminimize

-

Restores the most recently minimized window.

-

Unminimize

-
-
-

Version History

-

Version 0.1.0: -

-

-
-
-

Window Titles

-

WindowPadX commands accept any of the following for the WinTitle parameter: -

    -
  • Empty or omitted: the active window.
  • -
  • Any standard AutoHotkey WinTitle. For instance, Untitled - Notepad and ahk_class Notepad are both acceptable, and A specifies the active window.
  • -
  • P: the window below the active window in the z-order, which is usually but not always the previously active window.
  • -
  • M: the window under the mouse cursor.
  • -
  • _ (underscore): the top-most minimized window, which is usually the most recently minimized.
  • -

-
-
-

WindowPadMove

-

Simultaneously moves and resizes a window, based on a "pad" concept.

-

WindowPadMove, X, Y [, WidthFactor, HeightFactor, WinTitle ]

-

Parameters

- - - - - - - - - - - - - - - - - - - - - -
X-1 (left), 0 (center) or +1 (right)
Y-1 (up), 0 (center) or +1 (down)
WidthFactorA number between 0.0 and 1.0, where 0.5 is half of the screen's width.
HeightFactorA number between 0.0 and 1.0, where 0.5 is half of the screen's height.
WinTitleIndicates which window to move. See Window Titles.
-

Remarks

-

[ Brackets denote optional parameters. ]

-

WindowPadMove performs the first applicable action from the following list:

-
    -
  • If the window is not already occupying the indicated portion of the current monitor, move and resize.
  • -
  • If X or Y are non-zero and there is another monitor in the indicated direction, move to it. If both X and Y are non-zero, the move is strictly diagonal and may not be applicable to all multi-monitor setups.
  • -
  • If X and Y are zero and there are multiple monitors, move to the "next" monitor.
  • -
  • If X is non-zero, halve the width of the window, effectively "squashing" the window against the side of the screen.
  • -
  • If Y is non-zero, halve the height of the window.
  • -
  • Increase the width of the window by 50%. Usually X and Y are zero, the window is already in place, and there is only one monitor.
  • -
-

If the window is minimized or maximized, it will be restored before it is moved.

-
-
-

WindowScreenMove

-

Moves a window between monitors (screens.)

-

WindowScreenMove, Monitor, WinTitle

-

Parameters

- - - - - - - - - -
MonitorNext, Previous or a monitor number, where 1 is the first monitor. N, P and Prev are also acceptable.
WinTitleIndicates which window to move. See Window Titles.
-
-
- - \ No newline at end of file diff --git a/WindowPadX/WindowPadX.ini b/WindowPadX/WindowPadX.ini deleted file mode 100644 index cf718e6..0000000 --- a/WindowPadX/WindowPadX.ini +++ /dev/null @@ -1,117 +0,0 @@ -; -; See WindowPadX.html for more details about configuring WindowPadX. -; - -[Options] -TitleMatchMode=2 - -; -; [Hotkeys]: Hotkeys which are active by default. -; Hotkey sets using standard modifier keys such as -; * Ctrl (^) -; * Win (#) -; * Alt (!) -; * Shift (+) -; * For more see: http://l.autohotkey.net/docs/Hotkeys.htm -; should be placed directly in this section. [Hotkeys: NAME] sections -; must be enabled/disabled by a hotkey defined in this section. -; -[Hotkeys] -; Win+Numpad for Active Window: -; #Numpad1 = WPXA_Move, -1, +1, 0.5, 0.5 -; #Numpad2 = WPXA_Move, 0, +1, 1.0, 0.5 -; #Numpad3 = WPXA_Move, +1, +1, 0.5, 0.5 -; #Numpad4 = WPXA_Move, -1, 0, 0.5, 1.0 -; #Numpad5 = WPXA_Move, 0, 0, 0.5, 1.0 -; #Numpad6 = WPXA_Move, +1, 0, 0.5, 1.0 -; #Numpad7 = WPXA_Move, -1, -1, 0.5, 0.5 -; #Numpad8 = WPXA_Move, 0, -1, 1.0, 0.5 -; #Numpad9 = WPXA_Move, +1, -1, 0.5, 0.5 -; #!Numpad1 = WPXA_MoveMouseToMonitor, 1 -; #!Numpad2 = WPXA_MoveMouseToMonitor, 2 -; #!Numpad5 = WPXA_ClipCursorToCurrentMonitorToggle -; #!Numpad0 = WPXA_MouseLocator -; ~RButton & LButton = WPXA_MouseLocator - -#NumpadAdd = WPXA_MaximizeToggle -#NumpadEnter = WPXA_MoveWindowToMonitor, Next -#NumpadDiv = WPXA_MinimizeWindowsOnMonitor, 1 -#!NumpadDiv = WPXA_GatherWindowsOnMonitor, 1 -#NumpadMult = WPXA_MinimizeWindowsOnMonitor, 2 -#!NumpadMult = WPXA_GatherWindowsOnMonitorOnMonitor, 2 -#NumpadSub = WPXA_TopToggle - - -; Custom modifier keys: -RAlt = Hotkeys, Active Window (WADS) -; Numpad0 = Hotkeys, Active Window (Numpad) -; NumpadSub = Hotkeys, Previous Window (Numpad) - -; -; [Hotkeys: xxx]: Hotkeys which are enabled/disabled via the Hotkeys command. -; These are typically used to implement custom modifier keys. -; -[Hotkeys: Active Window (WADS)] -z = WPXA_Move, -1, +1, 0.5, 0.5 -x = WPXA_Move, 0, +1, 1.0, 0.5 -c = WPXA_Move, +1, +1, 0.5, 0.5 -a = WPXA_Move, -1, 0, 0.5, 1.0 -s = WPXA_Move, 0, 0, 0.5, 1.0 -d = WPXA_Move, +1, 0, 0.5, 1.0 -q = WPXA_Move, -1, -1, 0.5, 0.5 -w = WPXA_Move, 0, -1, 1.0, 0.5 -e = WPXA_Move, +1, -1, 0.5, 0.5 -Space = WPXA_MaximizeToggle -Tab = WPXA_MoveWindowToMonitor, Next -LAlt = WPXA_MoveWindowToMonitor, Prev -1 = WPXA_GatherWindowsOnMonitor, 1 -2 = WPXA_GatherWindowsOnMonitor, 2 - -[Hotkeys: Active Window (Numpad)] -*Numpad1 = WPXA_Move, -1, +1, 0.5, 0.5 -*Numpad2 = WPXA_Move, 0, +1, 1.0, 0.5 -*Numpad3 = WPXA_Move, +1, +1, 0.5, 0.5 -*Numpad4 = WPXA_Move, -1, 0, 0.5, 1.0 -*Numpad5 = WPXA_Move, 0, 0, 0.5, 1.0 -*Numpad6 = WPXA_Move, +1, 0, 0.5, 1.0 -*Numpad7 = WPXA_Move, -1, -1, 0.5, 0.5 -*Numpad8 = WPXA_Move, 0, -1, 1.0, 0.5 -*Numpad9 = WPXA_Move, +1, -1, 0.5, 0.5 -*NumpadAdd = WPXA_MaximizeToggle -*NumpadEnter = WPXA_MoveWindowToMonitor, Next - -[Hotkeys: Previous Window (Numpad)] -*Numpad1 = WPXA_Move, -1, +1, 0.5, 0.5, P -*Numpad2 = WPXA_Move, 0, +1, 1.0, 0.5, P -*Numpad3 = WPXA_Move, +1, +1, 0.5, 0.5, P -*Numpad4 = WPXA_Move, -1, 0, 0.5, 1.0, P -*Numpad5 = WPXA_Move, 0, 0, 0.5, 1.0, P -*Numpad6 = WPXA_Move, +1, 0, 0.5, 1.0, P -*Numpad7 = WPXA_Move, -1, -1, 0.5, 0.5, P -*Numpad8 = WPXA_Move, 0, -1, 1.0, 0.5, P -*Numpad9 = WPXA_Move, +1, -1, 0.5, 0.5, P -*NumpadAdd = WPXA_MaximizeToggle, P -*NumpadEnter = WPXA_MoveWindowToMonitor, Next, P - -; -; [Exclude Windows]: Hotkeys are disabled for these windows. -; -[Exclude Windows] -Window=Virtual PC -Window=Remote Desktop - -; -; [Gather: Exclude Windows]: WPXA_GatherWindowsOnMonitor ignores these windows when gathering. -; -[Gather: Exclude Windows] -Window=ahk_class SideBar_AppBarWindow -Window=ahk_class SideBar_HTMLHostWindow -Window=ahk_class BasicWindow - -; -; [Gather: Exclude Processes]: WPXA_GatherWindowsOnMonitor ignores windows belonging to these processes. -; It is usually not necessary to use both this and the above. -; -[Gather: Exclude Processes] -; Process=sidebar.exe -Process=clocx.exe diff --git a/WindowPadX/_inc/Notify.ahk b/WindowPadX/_inc/Notify.ahk deleted file mode 100644 index 35a0b03..0000000 --- a/WindowPadX/_inc/Notify.ahk +++ /dev/null @@ -1,406 +0,0 @@ -;������������������������������������������������������ -;�������� Notify() 0.499 by gwarble �������� -;����� ����� -;��� easy multiple tray area notifications ��� -;�� http://www.autohotkey.net/~gwarble/Notify/ �� -;������������������������������������������������������ -; -; Notify([Title,Message,Duration,Options]) -; -; Duration seconds to show notification [Default: 30] -; 0 for permanent/remain until clicked (flashing) -; -3 negative value to ExitApp on click/timeout -; "-0" for permanent and ExitApp when clicked (needs "") -; -; Options string of options, single-space seperated, ie: -; "TS=16 TM=8 TF=Times New Roman GC_=Blue SI_=1000" -; most options are remembered (static), some not (local) -; Option_= can be used for non-static call, ie: -; "GC=Blue" makes all future blue, "GC_=Blue" only takes effect once -; "Wait=ID" to wait for a notification -; "Update=ID" to change Title, Message, and Progress Bar (with 'Duration') -; -; Return ID (Gui Number used) -; 0 if failed (too many open most likely) -; VarValue if Options includes: Return=VarName -;������������������������������������������������������ - -Notify(Title="Notify()",Message="",Duration="",Options="") -{ - static GNList, ACList, ATList, AXList, Exit, _Wallpaper_, _Title_, _Message_, _Progress_, _Image_, Saved - static GF := 50 ; Gui First Number - static GL := 74 ; Gui Last Number (which defines range and allowed count) - static GC,GR,GT,BC,BK,BW,BR,BT,BF ; static options, remembered between calls - static TS,TW,TC,TF,MS,MW,MC,MF - static SI,SC,ST,IW,IH,IN,XC,XS,XW,PC,PB - - If (Options) ; skip parsing steps if Options param isn't used - { - Options.=" " ; poor whitespace handling for next parsing step (ensures last option is parsed) - Loop,Parse,Options,= ; parse options string at "="s, needs better whitespace handling - { - If A_Index = 1 ; first option handling - Option := A_LoopField ; sets options VarName - Else ; for the rest after the first, - { ; split at the last space, apply the first chunk to the VarValue for the last Option - %Option% := SubStr(A_LoopField, 1, (pos := InStr(A_LoopField, A_Space, false, 0))-1) - Option := SubStr(A_LoopField, pos+1) ; and set the next option to the last chunk (from the last space to the "=") - } - } - If Wait <> ; option Wait=ID used, normal Notify window not being created - { - If Wait Is Number ; waits for a specific notify - { - Gui %Wait%:+LastFound ; i'd like to remove this to not affect calling script... - If NotifyGuiID := WinExist() ; but think i have to use hWnd's for reference instead of gui numbers which will - { ; probably happen in my AHK_L transition since gui numbers won't matter anymore - WinWaitClose, , , % Abs(Duration) ; wait to close for duration - If (ErrorLevel && Duration < 1) ; destroys window when done waiting if duration is negative - { ; otherwise lets the calling script procede after waiting the duration (without destroying) - Gui, % Wait + GL - GF + 1 ":Destroy" ; destroys border gui - If ST - DllCall("AnimateWindow","UInt",NotifyGuiID,"Int",ST,"UInt","0x00050001") ; slides window out to the right if ST or SC are used - Gui, %Wait%:Destroy ; and destroys it - } - } - } - Else ; wait for all notify's if "Wait=All" is used in the options string - { ; loops through all existing notify's and performs the same wait logic - Loop, % GL-GF ; (with or without destroying if negative or not) - { - Wait := A_Index + GF - 1 - Gui %Wait%:+LastFound - If NotifyGuiID := WinExist() - { - WinWaitClose, , , % Abs(Duration) - If (ErrorLevel && Duration < 1) - { - Gui, % Wait + GL - GF + 1 ":Destroy" ; destroys border gui - If ST - DllCall("AnimateWindow","UInt",NotifyGuiID,"Int",ST,"UInt","0x00050001") ; slides window out to the right if ST or SC are used - Gui, %Wait%:Destroy ; and destroys it - } - } - } - GNList := ACList := ATList := AXList := "" ; clears internal variables since they're all destroyed now - } - Return - } - If Update <> ; option "Update=ID" being used, Notify window will not be created - { ; title, message, image and progress position can be updated - If Title <> - GuiControl, %Update%:,_Title_,%Title% - If Message <> - GuiControl, %Update%:,_Message_,%Message% - If Duration <> - GuiControl, %Update%:,_Progress_,%Duration% - If Image <> - GuiControl, %Update%:,_Image_,%Image% - If Wallpaper <> - GuiControl, %Update%:,_Wallpaper_,%Image% - Return - } - If Style = Save ; option "Style=Save" is used to save the existing window style - { ; and call it back later with "Style=Load" - Saved := Options " GC=" GC " GR=" GR " GT=" GT " BC=" BC " BK=" BK " BW=" BW " BR=" BR " BT=" BT " BF=" BF - Saved .= " TS=" TS " TW=" TW " TC=" TC " TF=" TF " MS=" MS " MW=" MW " MC=" MC " MF=" MF - Saved .= " IW=" IW " IH=" IH " IN=" IN " PW=" PW " PH=" PH " PC=" PC " PB=" PB " XC=" XC " XS=" MS " XW=" XW - Saved .= " SI=" SI " SC=" SC " ST=" ST " WF=" Image " IF=" IF - } ; this needs some major improvement to have multiple saved instead of just one, otherwise pointless - If Return <> - Return, % (%Return%) - If Style <> ; option "Style=Default will reset all variables back to defaults... except options also specified - { ; so "Style=Default GC=Blue" is allowed, which will reset all defaults and then set GC=Blue - If Style = Default - Return % Notify(Title,Message,Duration, ; maybe handled poorly by calling itself, but it saves having to have the defaults set in two areas... thoughts? -( -"GC= GR= GT= BC= BK= BW= BR= BT= BF= TS= TW= TC= TF= - MS= MW= MC= MF= SI= ST= SC= IW= - IH= IN= XC= XS= XW= PC= PB= " Options "Style=") -) ; below are more internally saved styles, which may move to an auxiliary function at some point, but could use some improvement - Else If Style = ToolTip - Return % Notify(Title,Message,Duration,"SI=50 GC=FFFFAA BC=00000 GR=0 BR=0 BW=1 BT=255 TS=8 MS=8 " Options "Style=") - Else If Style = BalloonTip - Return % Notify(Title,Message,Duration,"SI=350 GC=FFFFAA BC=00000 GR=13 BR=15 BW=1 BT=255 TS=10 MS=8 AX=1 XC=999922 IN=8 Image=" A_WinDir "\explorer.exe " Options "Style=") - Else If Style = Error - Return % Notify(Title,Message,Duration,"SI=250 GC=Default BC=00000 GR=0 BR=0 BW=1 BT=255 TS=12 MS=12 AX=1 XC=666666 IN=10 IW=32 IH=32 Image=" A_WinDir "\explorer.exe " Options "Style=") - Else If Style = Warning - Return % Notify(Title,Message,Duration,"SI=250 GC=Default BC=00000 GR=0 BR=0 BW=1 BT=255 TS=12 MS=12 AX=1 XC=666666 IN=9 IW=32 IH=32 Image=" A_WinDir "\explorer.exe " Options "Style=") - Else If Style = Info - Return % Notify(Title,Message,Duration,"SI=250 GC=Default BC=00000 GR=0 BR=0 BW=1 BT=255 TS=12 MS=12 AX=1 XC=666666 IN=8 IW=32 IH=32 Image=" A_WinDir "\explorer.exe " Options "Style=") - Else If Style = Question - Return % Notify(Title,Message,Duration,"SI=250 GC=Default BC=00000 GR=0 BR=0 BW=1 BT=255 TS=12 MS=12 AX=1 XC=666666 Image=24 IW=32 IH=32 " Options "Style=") - Else If Style = Progress - Return % Notify(Title,Message,Duration,"SI=100 GC=Default BC=00000 GR=9 BR=13 BW=2 BT=105 TS=10 MS=10 PG=100 PH=10 GW=300 " Options "Style=") - Else If Style = Huge - Return % Notify(Title,Message,Duration,"SI=100 ST=200 SC=200 GC=FFFFAA BC=00000 GR=27 BR=39 BW=6 BT=105 TS=24 MS=22 " Options "Style=") - Else If Style = Load - Return % Notify(Title,Message,Duration,Saved) - } - } -;������ end if options ���������������������������������������������������������������������������� - - GC_ := GC_<>"" ? GC_ : GC := GC<>"" ? GC : "FFFFAA" ; defaults are set here, and static overrides are used and saved - GR_ := GR_<>"" ? GR_ : GR := GR<>"" ? GR : 9 ; and non static options (with OP_=) are used but not saved - GT_ := GT_<>"" ? GT_ : GT := GT<>"" ? GT : "Off" - BC_ := BC_<>"" ? BC_ : BC := BC<>"" ? BC : "000000" - BK_ := BK_<>"" ? BK_ : BK := BK<>"" ? BK : "Silver" - BW_ := BW_<>"" ? BW_ : BW := BW<>"" ? BW : 2 - BR_ := BR_<>"" ? BR_ : BR := BR<>"" ? BR : 13 - BT_ := BT_<>"" ? BT_ : BT := BT<>"" ? BT : 105 - BF_ := BF_<>"" ? BF_ : BF := BF<>"" ? BF : 350 - TS_ := TS_<>"" ? TS_ : TS := TS<>"" ? TS : 10 - TW_ := TW_<>"" ? TW_ : TW := TW<>"" ? TW : 625 - TC_ := TC_<>"" ? TC_ : TC := TC<>"" ? TC : "Default" - TF_ := TF_<>"" ? TF_ : TF := TF<>"" ? TF : "Default" - MS_ := MS_<>"" ? MS_ : MS := MS<>"" ? MS : 10 - MW_ := MW_<>"" ? MW_ : MW := MW<>"" ? MW : "Default" - MC_ := MC_<>"" ? MC_ : MC := MC<>"" ? MC : "Default" - MF_ := MF_<>"" ? MF_ : MF := MF<>"" ? MF : "Default" - SI_ := SI_<>"" ? SI_ : SI := SI<>"" ? SI : 0 - SC_ := SC_<>"" ? SC_ : SC := SC<>"" ? SC : 0 - ST_ := ST_<>"" ? ST_ : ST := ST<>"" ? ST : 0 - IW_ := IW_<>"" ? IW_ : IW := IW<>"" ? IW : 32 - IH_ := IH_<>"" ? IH_ : IH := IH<>"" ? IH : 32 - IN_ := IN_<>"" ? IN_ : IN := IN<>"" ? IN : 0 - XF_ := XF_<>"" ? XF_ : XF := XF<>"" ? XF : "Arial Black" - XC_ := XC_<>"" ? XC_ : XC := XC<>"" ? XC : "Default" - XS_ := XS_<>"" ? XS_ : XS := XS<>"" ? XS : 12 - XW_ := XW_<>"" ? XW_ : XW := XW<>"" ? XW : 800 - PC_ := PC_<>"" ? PC_ : PC := PC<>"" ? PC : "Default" - PB_ := PB_<>"" ? PB_ : PB := PB<>"" ? PB : "Default" - - wPW := ((PW<>"") ? ("w" PW) : ("")) ; needs improvement, poor handling of explicit sizes and progress widths - hPH := ((PH<>"") ? ("h" PH) : ("")) - If GW <> - { - wGW = w%GW% - wPW := "w" GW - 20 - } - hGH := ((GH<>"") ? ("h" GH) : ("")) - wGW_ := ((GW<>"") ? ("w" GW - 20) : ("")) - hGH_ := ((GH<>"") ? ("h" GH - 20) : ("")) -;������������������������������������������������������������������������ - If Duration = ; default if duration is not used or set to "" - Duration = 30 - GN := GF ; find the next available gui number to use, starting from GF (default 50) - Loop ; within the defined range GF to GL - IfNotInString, GNList, % "|" GN - Break - Else - If (++GN > GL) ;=== too many notifications open, returns 0, handle this error in the calling script - Return 0 ; this is uncommon as the screen is too cluttered by this point anyway - GNList .= "|" GN - GN2 := GN + GL - GF + 1 - - If AC <> ; saves the action to be used when clicked or timeout (or x-button is clicked) - ACList .= "|" GN "=" AC ; need to add different clicks for Title, Message, Image as well - If AT <> ; saved internally in a list, then parsed by the timer or click routine - ATList .= "|" GN "=" AT ; to run the script-side subroutine/label "AC=LabelName" - If AX <> - AXList .= "|" GN "=" AX - - - P_DHW := A_DetectHiddenWindows ; start finding location based on what other Notify() windows are on the screen - P_TMM := A_TitleMatchMode ; saved to restore these settings after changing them, so the calling script won't know - DetectHiddenWindows On ; as they are needed to find all as they are being made as well... or hidden for some reason... - SetTitleMatchMode 1 ; and specific window title match is a little more failsafe - If (WinExist("_Notify()_GUI_")) ;=== find all Notifications from ALL scripts, for placement - WinGetPos, OtherX, OtherY ;=== change this to a loop for all open notifications and find the highest? - DetectHiddenWindows %P_DHW% ;=== using the last Notify() made at this point, which may be better - SetTitleMatchMode %P_TMM% ; and the global settings are restored for the calling thread - - Gui, %GN%:-Caption +ToolWindow +AlwaysOnTop -Border ; here begins the creation of the window - Gui, %GN%:Color, %GC_% ; with the logic to add or not add certain controls, Wallpaper, Image, Title, Progress, Message - If FileExist(WP) ; and some placement logic depending if they are used or not... could definitely be improved - { - Gui, %GN%:Add, Picture, x0 y0 w0 h0 v_Wallpaper_, % WP ; wallpaper added first, stretched to size later - ImageOptions = x+8 y+4 - } - If Image <> ; icon image added next, sized, and spacing added for whats next - { - If FileExist(Image) - Gui, %GN%:Add, Picture, w%IW_% h%IH_% Icon%IN_% v_Image_ %ImageOptions%, % Image - Else - Gui, %GN%:Add, Picture, w%IW_% h%IH_% Icon%Image% v_Image_ %ImageOptions%, %A_WinDir%\system32\shell32.dll - ImageOptions = x+10 - } - If Title <> ; title text control added next, if used - { - Gui, %GN%:Font, w%TW_% s%TS_% c%TC_%, %TF_% - Gui, %GN%:Add, Text, %ImageOptions% BackgroundTrans v_Title_, % Title - } - If PG ; then the progress bar, if called for - Gui, %GN%:Add, Progress, Range0-%PG% %wPW% %hPH% c%PC_% Background%PB_% v_Progress_ - Else - If ((Title) && (Message)) ; some spacing tweaks if both used - Gui, %GN%:Margin, , -5 - If Message <> ; and finally the message text control if used - { - Gui, %GN%:Font, w%MW_% s%MS_% c%MC_%, %MF_% - Gui, %GN%:Add, Text, BackgroundTrans v_Message_, % Message - } - If ((Title) && (Message)) ; final spacing - Gui, %GN%:Margin, , 8 - Gui, %GN%:Show, Hide %wGW% %hGH%, _Notify()_GUI_ ; final sizing - Gui %GN%:+LastFound ; would like to get rid of this to prevent calling script being affected - WinGetPos, GX, GY, GW, GH ; final positioning - GuiControl, %GN%:, _Wallpaper_, % "*w" GW " *h" GH " " WP ; stretch that wallpaper to size - GuiControl, %GN%:MoveDraw, _Title_, % "w" GW-20 " h" GH-10 ; poor handling of text wrapping when gui has explicit size called - GuiControl, %GN%:MoveDraw, _Message_, % "w" GW-20 " h" GH-10 ; needs improvement (and if image is used or not) - If AX <> ; add the corner "X" for closing with a different action than otherwise clicked - { - GW += 10 - Gui, %GN%:Font, w%XW_% s%XS_% c%XC_%, Arial Black ; � (multiply) is the character used for the X-Button - Gui, %GN%:Add, Text, % "x" GW-15 " y-2 Center w12 h20 g_Notify_Kill_" GN - GF + 1, � - } - Gui, %GN%:Add, Text, x0 y0 w%GW% h%GH% BackgroundTrans g_Notify_Action_Clicked_ ; to catch clicks anywhere on the gui - If (GR_) ; may have to be removed for seperate title/message/etc actions - WinSet, Region, % "0-0 w" GW " h" GH " R" GR_ "-" GR_ - If (GT_) ; non-functioning GT option, since the border gui gets in the way - WinSet, Transparent, % GT_ ; will be addressed someday, leaving it in - - SysGet, Workspace, MonitorWorkArea ; positioning - NewX := WorkSpaceRight-GW-5 - If (OtherY) - NewY := OtherY-GH-2-BW_*2 - Else - NewY := WorkspaceBottom-GH-5 - If NewY < % WorkspaceTop - NewY := WorkspaceBottom-GH-5 - - Gui, %GN2%:-Caption +ToolWindow +AlwaysOnTop -Border +E0x20 ; border gui - Gui, %GN2%:Color, %BC_% - Gui %GN2%:+LastFound - If (BR_) - WinSet, Region, % "0-0 w" GW+(BW_*2) " h" GH+(BW_*2) " R" BR_ "-" BR_ - If (BT_) - WinSet, Transparent, % BT_ - - Gui, %GN2%:Show, % "Hide x" NewX-BW_ " y" NewY-BW_ " w" GW+(BW_*2) " h" GH+(BW_*2), _Notify()_BGGUI_ ; actual creation of border gui! but still not shown - Gui, %GN%:Show, % "Hide x" NewX " y" NewY " w" GW, _Notify()_GUI_ ; actual creation of Notify() gui! but still not shown - Gui %GN%:+LastFound ; need to get rid of this so calling script isn't affected - If SI_ - DllCall("AnimateWindow","UInt",WinExist(),"Int",SI_,"UInt","0x00040008") ; animated in, if SI is used - Else - Gui, %GN%:Show, NA, _Notify()_GUI_ ; otherwise, just shown - Gui, %GN2%:Show, NA, _Notify()_BGGUI_ ; and the border shown - WinSet, AlwaysOnTop, On ; and set to Always on Top - - If ((Duration < 0) OR (Duration = "-0")) ; saves internally that ExitApp should happen when this - Exit := GN ; notify dissappears - If (Duration) - SetTimer, % "_Notify_Kill_" GN - GF + 1, % - Abs(Duration) * 1000 ; timer set depending on Duration parameter - Else - SetTimer, % "_Notify_Flash_" GN - GF + 1, % BF_ ; timer set to flash border if the Notify has 0 (infinite) duration - -Return %GN% ; end of Notify(), returns Gui ID number used - -;========================================================================== -;========================================== when a notification is clicked: -_Notify_Action_Clicked_: ; option AC=Label means Label: subroutine will be called here when clicked - ; Critical - SetTimer, % "_Notify_Kill_" A_Gui - GF + 1, Off - Gui, % A_Gui + GL - GF + 1 ":Destroy" - If SC - { - Gui, %A_Gui%:+LastFound - DllCall("AnimateWindow","UInt",WinExist(),"Int",SC,"UInt", "0x00050001") - } - Gui, %A_Gui%:Destroy - If (ACList) - Loop,Parse,ACList,| - If ((Action := SubStr(A_LoopField,1,2)) = A_Gui) - { - Temp_Notify_Action:= SubStr(A_LoopField,4) - StringReplace, ACList, ACList, % "|" A_Gui "=" Temp_Notify_Action, , All - If IsLabel(_Notify_Action := Temp_Notify_Action) - Gosub, %_Notify_Action% - _Notify_Action = - Break - } - StringReplace, GNList, GNList, % "|" A_Gui, , All - SetTimer, % "_Notify_Flash_" A_Gui - GF + 1, Off - If (Exit = A_Gui) - ExitApp -Return - -;========================================================================== -;=========================================== when a notification times out: -_Notify_Kill_1: -_Notify_Kill_2: ; this needs a different method, too many labels -_Notify_Kill_3: ; they are used for Timers, different for each Notify() based on duration... -_Notify_Kill_4: -_Notify_Kill_5: -_Notify_Kill_6: -_Notify_Kill_7: -_Notify_Kill_8: -_Notify_Kill_9: -_Notify_Kill_10: -_Notify_Kill_11: -_Notify_Kill_12: -_Notify_Kill_13: -_Notify_Kill_14: -_Notify_Kill_15: -_Notify_Kill_16: -_Notify_Kill_17: -_Notify_Kill_18: -_Notify_Kill_19: -_Notify_Kill_20: -_Notify_Kill_21: -_Notify_Kill_22: -_Notify_Kill_23: -_Notify_Kill_24: -_Notify_Kill_25: - Critical - StringReplace, GK, A_ThisLabel, _Notify_Kill_ - SetTimer, _Notify_Flash_%GK%, Off - GK := GK + GF - 1 - Gui, % GK + GL - GF + 1 ":Destroy" - If ST - { - Gui, %GK%:+LastFound - DllCall("AnimateWindow","UInt",WinExist(),"Int",ST,"UInt", "0x00050001") - } - Gui, %GK%:Destroy - StringReplace, GNList, GNList, % "|" GK, , All - If (Exit = GK) - ExitApp -Return 1 - -;========================================================================== -;======================================== flashes a permanent notification: -_Notify_Flash_1: -_Notify_Flash_2: -_Notify_Flash_3: -_Notify_Flash_4: ; this needs a different method, too many labels -_Notify_Flash_5: ; they are used for Timers, different for each Notify() based on flash speed... -_Notify_Flash_6: ; when duration is 0 (infinite) -_Notify_Flash_7: ; this may feature may be removed completely, Update given the ability to affect GC and BC -_Notify_Flash_8: ; and then the flashing could be handled script-side via returned gui number and a script-side timer -_Notify_Flash_9: -_Notify_Flash_10: -_Notify_Flash_11: -_Notify_Flash_12: -_Notify_Flash_13: -_Notify_Flash_14: -_Notify_Flash_15: -_Notify_Flash_16: -_Notify_Flash_17: -_Notify_Flash_18: -_Notify_Flash_19: -_Notify_Flash_20: -_Notify_Flash_21: -_Notify_Flash_22: -_Notify_Flash_23: -_Notify_Flash_24: -_Notify_Flash_25: - StringReplace, FlashGN, A_ThisLabel, _Notify_Flash_ - FlashGN += GF - 1 - FlashGN2 := FlashGN + GL - GF + 1 - If Flashed%FlashGN2% := !Flashed%FlashGN2% - Gui, %FlashGN2%:Color, %BK% - Else - Gui, %FlashGN2%:Color, %BC% -Return -} diff --git a/WindowPadX/icons/WindowPad.ico b/WindowPadX/icons/WindowPad.ico deleted file mode 100644 index 184c0673bba9cb6d981fdb7d4b8188480d0cf730..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 zcmeI2%WqXh9LJB*KY&C{R34U=Ms%S>ko3WVxZtr6iirt^1SllLoiTJ{Tu^BdjX{yn zg&UKCCM;Zli3$mA6C(@SMobKaE=q!Z@JOH(+TK3-IiI=wE_25@=iauwLe3g z60J5BI!e8v^UM0<>&36KX0be~>dWT+QOTaGoVFD&%UmlMZrm7}RYmq(=Ii=X`KkVA z;{y-N|Hj8BWMm{G+A6le!8UJ}PEs54e|S(fZrmvQ z_U)6Ysi_>Vp`l^v?(UYVsw!z~Ym@7(zvkrMx-}#f6_wJ})g{Bjqq#Y=k>B3lE+$V) zX=$mEKW%jZpG;;Q*R=}b%lG>2`(a|w0AO5VB78~FX zlao^d9^})$w|y*uSBn(c->)_pW^hFY_1=;RwlR4mw2l@L^4=18h-SyTiWs z_4P^VtBa)N=VLiPMQ`AR9xSx1fqCkmE{>3Ve4csu81he_K5f^84tTGutdhNZ_uA*J zA8wY7_jDi!KNT6vNZG;#hNeQQRxFq5H(rw^24nT|x25CIevyCLb9?LjnyW$ugNq3{ zU|0Fr5*?^ad|dT$=`XY1k`k)}{6L0pOSO^RVDOnmTRimDZrf%t$hAJ}ugHv-pOuGv zWTOvsfL@1&hOAxM+dE`zY+OeBE(sMskmMv0Y);=+K!|u%k$A6Nk%&3$u zS|}~2PD)SH{=7ZgUq3RdtE*+hh7Hzk_zw0%2RnD}wDLPUJ8cevcmLm=78@9u>-x^k zo3||;`J}Y8%;uBf;Y?27A^T%vEu{ER$xX6;)dSNklknwlEK2)P4Y z;h*rLG&eWfdH5pnp!N>QXRXLVKCu8T`IP=0J9gMHcp~5C|KE?v`SV?te^v)~W%1%t zy9VMEe+Bc_t=pKE7mH!}Q?h4Iy|H;dR_xu|+bi|;pBpUMoNVRSzH9j&IPi^}IB~+- z;NZdUEPni$eAU%;!P3A(*G?OfulYh-rN@@^X-mKEf8_hyw?}N=*PMgRh9EM#608Xtl2!H7j!n8xy8(x z>-TIS87cncbLLe4h4hp9e^QL4{*(Gol7AE$ds_X6^EuAqIK$))foIO~;`E_scbqdq z%bf(Y{{F>zBIC-FbG|s9#q`JNAHIhVAC^_CR@rmafq?;g{vF2?+?zISvS;|ackj06 zrL5P-4`0r-Icw*xi?zh@ET%sWKl+5f`PR0TJ0ffmX9Lcy%gf6xEoa%fULU{97u|6F zUJTASnmGJmRs7&`G5Ngo{ty~nFX!g)IJ5T6yze*k-`d)0={R$zgwBb58FBAP_|Xq| zxLcrAOujtubHAaq?s~cJaKAsf8=fC;Pb>f^u)5>jkq+$J}2Q<8>3r_zJt}Z0r)jmXwk3QpmzIqkt_e^#XUJk>G4hI z>C>wBDXxy<)>ABgbav#(5vw!3H&gyD9&kbH+rYg?B8It-L;vW6IesO^DcA=3ncycr zDem1LJSZ9yt_{dDb#-+X4>-W;`iRE8=3dQLYERY?s*H1&MnOlRHC(7(ke45zfj@Do z`e8nO@Cexethz3I4g2F?nkO~)$`4;#S@sOU+%fAMVga144K(M0p~~D(+roXd`7N#0 zJ&$+S#=V~A6Lf%oGS2@bC@NQNz_|7?4?4}08mC|*4pg@E_So13A2c#CF4Fl&wwn80 z3hP%Jsn7D?59JYuA72UKXAL16fM546y=R8jw*i=Xn!d2#6xUAwBIGr-@#M&`?PtHH zp4+uaMlSc{YzQ6tx_qQ5kFIIy^L9P1{;|KyTlF7j1I4fVDZU16$Of7#vC+kg7cG9) zPSJdzSaiPHmKfu^PseHf?-Tma8}??+%yscI9$Jy778MOiUb)VMx$fZIj~_w%z#2onT&2dT6mT{~?0bU#sGWUTNXW{!R=K%RIAhAk(d2#-7Y${VLOK zUH;ln{-&ZI&E-1gx5ODVgM-=DA9wjHt@0&@Qkl=54@Rx@6_SlCm%lIjLAi?<#C;3OAvDAN3|0(1nN#hUOe=bzd&;6d)-}MiwbQxkYT!RG(0#uE diff --git a/WindowPadX/icons/disabled.ico b/WindowPadX/icons/disabled.ico deleted file mode 100644 index 01aef997ea69f87376dd2085d0a002e685fe8ac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmb`FEsg>~5QU2bO-3PDg9A-QEr$)d;{;d6( zPB1IHzn{^U%5z@!hgq=G)Asi%@SpSVpDg+(@9xy~@OhWTEabsx9zGw(=WK7>gUi!n iI6UVw_&hnDKJWI9@9*OMd*yH5FY0LV(8pbo*W(T*4$MUW diff --git a/WindowPadX/icons/disabled_orig.ico b/WindowPadX/icons/disabled_orig.ico deleted file mode 100644 index 1f9fc416e7e1b543a4dc75c8a2f9ff10a2fa293c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 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 KMNUMnLSTYzelo}a diff --git a/WindowPadX/icons/plus.png b/WindowPadX/icons/plus.png deleted file mode 100644 index e90fcd2c99d9ff882b8fe7e2d0579d9290e9c9e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55737 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 diff --git a/WindowPadX/icons/tray.ico b/WindowPadX/icons/tray.ico deleted file mode 100644 index 8b4a943d89ae2aeae9f4494061253bcbdaf82463..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmbW#uTMg86b10h<{v;}a~6w}*$hO-)27Knb8|K)RGjg-nKVF=A^{Ris0M?Z27_(} z1KFsf^22z%7d)hscyFKgwtK#3@26SD_iWbuxNfH_W;rvYx^VU}r3iGP>73Q~tIuzzdQ$S&U{eA_7`JVR`=IQeV zr2ps7dtYI{`cQ$wJl>(QcK9=!pY=|lupejTvDTgSk6R@u>`y=YP~xA9`zkf|CH5yD z9VqM{-0VPE^xxW;2<#Uxx1q2vYhz#zuJz@P!dKp~(AL>x#lH~{6)f#(L#{~)}$+VuZ_H${^1 zul&&e_%O&!Lh^6le*BLOgYG9Q~>nEXiBk1tN816~jeKYa1GvwsCa d{Ubg6>EVA|aSV#zqaHyx^E5~vy*wb54*($GMuGqU