From c7b6c0a388ddd42584ef66c86fae4a8dd502e00b Mon Sep 17 00:00:00 2001 From: joten Date: Sun, 25 Jan 2015 18:07:51 +0100 Subject: [PATCH] Moved window-related functions to Window.ahk ... therewith revising Manager_findHung (bug in line 272: "If (A_Index = ghostWnd)") --- src/Main.ahk | 1 + src/Manager.ahk | 235 ++++++------------------------------------------ src/View.ahk | 17 ++-- src/Window.ahk | 173 +++++++++++++++++++++++++++++++++++ 4 files changed, 205 insertions(+), 221 deletions(-) create mode 100644 src/Window.ahk diff --git a/src/Main.ahk b/src/Main.ahk index 1b3c4a2..1ac83b6 100644 --- a/src/Main.ahk +++ b/src/Main.ahk @@ -247,3 +247,4 @@ Return #Include Monitor.ahk #Include ResourceMonitor.ahk #Include View.ahk +#Include Window.ahk diff --git a/src/Manager.ahk b/src/Manager.ahk index 009cb0d..803ea13 100644 --- a/src/Manager.ahk +++ b/src/Manager.ahk @@ -229,56 +229,24 @@ Manager_cleanup() ;; SKAN: Crazy Scripting : Quick Launcher for Portable Apps (http://www.autohotkey.com/forum/topic22398.html) } -Manager_closeWindow() -{ - Local aWndId, aview, c0 +Manager_closeWindow() { + Local aView, aWndId, c + WinGet, aWndId, ID, A - WinGetClass, aWndClass, ahk_id %aWndId% - WinGetTitle, aWndTitle, ahk_id %aWndId% - If Not (aWndClass = "AutoHotkeyGUI" And RegExMatch(aWndTitle, "bug.n_BAR_[0-9]+")) - { + If Window_isProg(aWndId) { ;; Prior to closing, find the next window that should have focus. ;; If there is no such window, choose the bar on the same monitor. - aview := Monitor_#%Manager_aMonitor%_aView_#1 - wnds := View_#%Manager_aMonitor%_#%aview%_wndIds - StringSplit, c, wnds, `; - If (c0 < 3) - { + aView := Monitor_#%Manager_aMonitor%_aView_#1 + StringSplit, c, View_#%Manager_aMonitor%_#%aView%_wndIds, `; + If (c0 < 3) { Manager_winActivate(0) - } - Else - { + } Else { View_activateWindow(1) } Manager_winClose(aWndId) } } - -;; Given a ghost window, try to find its body. -;; This is only known to work on Windows 7 -Manager_findHung(ghostWnd) -{ - Local expectedH, expectedTitle, expectedW, expectedX, expectedY, wndH, wndIds, wndTitle, wndW, wndX, wndY - - WinGetTitle, expectedTitle, ahk_id %ghostWnd% - StringReplace, expectedTitle, expectedTitle, %Config_ghostWndSubString%, - WinGetPos, expectedX, expectedY, expectedW, expectedH, ahk_id %ghostWnd% - - SetTitleMatchMode, 2 - WinGet, wndIds, List, %expectedTitle% - Loop, % wndIds - { - If (A_Index = ghostWnd) - Continue - WinGetPos, wndX, wndY, wndW, wndH, % "ahk_id" wndIDs%A_Index% - - If (wndX = expectedX) And (wndY = expectedY) And (wndW = expectedW) And (wndH = expectedH) - Return wndIds%A_Index% - } - Return 0 -} - Manager_getWindowInfo() { Local aWndClass, aWndHeight, aWndId, aWndMinMax, aWndProcessName, aWndStyle, aWndTitle, aWndWidth, aWndX, aWndY, rule, text, v @@ -335,38 +303,6 @@ Manager_getWindowList() Clipboard := text } -Manager_isGhost(wndId) -{ - Local wndClass, wndProc - - WinGet, wndProc, ProcessName, ahk_id %wndId% - WinGetClass, wndClass, ahk_id %wndId% - - If (wndProc = "dwm.exe") And (wndClass = "Ghost") - Return 1 - Else - Return 0 -} - -;; 0 - Not hung -;; 1 - Hung -Manager_isHung(wndId) -{ - Local detect_setting, result, WM_NULL - - WM_NULL := 0 - detect_setting := A_DetectHiddenWindows - DetectHiddenWindows, On - SendMessage, WM_NULL, , , , ahk_id %wndId% - result := ErrorLevel - DetectHiddenWindows, %detect_setting% - - If result - Return 1 - Else - Return 0 -} - Manager_lockWorkStation() { Global Config_shellMsgDelay @@ -1216,18 +1152,6 @@ Manager_initial_sync(doRestore) } } -Manager_toggleDecor() -{ - Local aWndId - - WinGet, aWndId, ID, A - Manager_#%aWndId%_isDecorated := Not Manager_#%aWndId%_isDecorated - If Manager_#%aWndId%_isDecorated - Manager_winSet("Style", "+0xC00000", aWndId) - Else - Manager_winSet("Style", "-0xC00000", aWndId) -} - Manager_unmanage(wndId) { Local a, aView, wndId0, wndIds @@ -1264,139 +1188,30 @@ Manager_unmanage(wndId) { Return, a } -Manager_winActivate(wndId) -{ - Local aWndId, wndHeight, wndWidth, wndX, wndY +Manager_winActivate(wndId) { + Local wndHeight, wndWidth, wndX, wndY - If Config_mouseFollowsFocus - { - If wndId - { + If Config_mouseFollowsFocus { + If wndId { WinGetPos, wndX, wndY, wndWidth, wndHeight, ahk_id %wndId% DllCall("SetCursorPos", "Int", Round(wndX + wndWidth / 2), "Int", Round(wndY + wndHeight / 2)) - } - Else + } Else DllCall("SetCursorPos", "Int", Round(Monitor_#%Manager_aMonitor%_x + Monitor_#%Manager_aMonitor%_width / 2), "Int", Round(Monitor_#%Manager_aMonitor%_y + Monitor_#%Manager_aMonitor%_height / 2)) } - If wndId And Manager_isHung(wndId) - { - Debug_logMessage("DEBUG[2] Manager_winActivate: Potentially hung window " . wndId, 2) - Return 1 - } - Else - { - Debug_logMessage("DEBUG[1] Activating window: " wndId, 1) - If Not wndId - { - If (A_OSVersion = "WIN_8") - WinGet, wndId, ID, ahk_class WorkerW - Else - WinGet, wndId, ID, Program Manager ahk_class Progman - Debug_logMessage("DEBUG[1] Activating Desktop: " wndId, 1) - } - WinActivate, ahk_id %wndId% - WinGet, aWndId, ID, A - If (wndId != aWndId) - Return 1 - } - Bar_updateTitle() - Return 0 -} -Manager_winClose(wndId) -{ - If Manager_isHung(wndId) - { - Debug_logMessage("DEBUG[2] Manager_winClose: Potentially hung window " . wndId, 2) - Return 1 + Debug_logMessage("DEBUG[1] Activating window: " wndId, 1) + If Not wndId { + If (A_OSVersion = "WIN_8") + WinGet, wndId, ID, ahk_class WorkerW + Else + WinGet, wndId, ID, Program Manager ahk_class Progman + Debug_logMessage("DEBUG[1] Activating Desktop: " wndId, 1) } - Else - { - WinClose, ahk_id %wndId% - Return 0 - } -} - -Manager_winHide(wndId) -{ - If Manager_isHung(wndId) - { - Debug_logMessage("DEBUG[2] Manager_winHide: Potentially hung window " . wndId, 2) - Return 1 - } - Else - { - WinHide, ahk_id %wndId% - Return 0 - } -} - -Manager_winMaximize(wndId) -{ - If Manager_isHung(wndId) - { - Debug_logMessage("DEBUG[2] Manager_winMaximize: Potentially hung window " . wndId, 2) - Return 1 - } - Else - { - WinMaximize, ahk_id %wndId% - Return 0 - } -} - -Manager_winMove(wndId, x, y, width, height) -{ - If Manager_isHung(wndId) - { - Debug_logMessage("DEBUG[2] Manager_winMove: Potentially hung window " . wndId, 2) - Return 1 - } - Else - { - WinGet, wndMin, MinMax, ahk_id %wndId% - If (wndMin = -1) - WinRestore, ahk_id %wndId% - } - WM_ENTERSIZEMOVE = 0x0231 - WM_EXITSIZEMOVE = 0x0232 - SendMessage, WM_ENTERSIZEMOVE, , , , ahk_id %wndId% - If ErrorLevel - { - Debug_logMessage("DEBUG[2] Manager_winMove: Potentially hung window " . wndId, 1) - Return 1 - } - Else - { - WinMove, ahk_id %wndId%, , %x%, %y%, %width%, %height% - SendMessage, WM_EXITSIZEMOVE, , , , ahk_id %wndId% - } -} - -Manager_winSet(type, value, wndId) -{ - If Manager_isHung(wndId) - { - Debug_logMessage("DEBUG[2] Manager_winSet: Potentially hung window " . wndId, 2) - Return 1 - } - Else - { - WinSet, %type%, %value%, ahk_id %wndId% - Return 0 - } -} - -Manager_winShow(wndId) -{ - If Manager_isHung(wndId) - { - Debug_logMessage("DEBUG[2] Manager_winShow: Potentially hung window " . wndId, 2) - Return 1 - } - Else - { - WinShow, ahk_id %wndId% + + If Window_activate(wndId) + Return, 1 + Else { + Bar_updateTitle() Return 0 } } diff --git a/src/View.ahk b/src/View.ahk index 15e8b05..2d165ab 100644 --- a/src/View.ahk +++ b/src/View.ahk @@ -227,19 +227,14 @@ View_arrange_tile(m, v, x, y, w, h) View_stackWindows("View_tiledWndId", mSplit + 1, stackLen, +1, axis3, x2, y2, w2, h2, gapW) } -View_getActiveWindow(m, v) -{ - Local aWndClass, aWndId, aWndTitle +View_getActiveWindow(m, v) { + Local aWndId WinGet, aWndId, ID, A - If WinExist("ahk_id" aWndId) And InStr(View_#%m%_#%v%_wndIds, aWndId ";") - { - WinGetClass, aWndClass, ahk_id %aWndId% - WinGetTitle, aWndTitle, ahk_id %aWndId% - If Not (aWndClass = "Progman") And Not (aWndClass = "WorkerW") And Not (aWndClass = "AutoHotkeyGui" And SubStr(aWndTitle, 1, 10) = "bug.n_BAR_") And Not (aWndClass = "DesktopBackgroundClass") - Return, aWndId - } - Return, 0 + If WinExist("ahk_id" aWndId) And InStr(View_#%m%_#%v%_wndIds, aWndId ";") And Window_isProg(aWndId) + Return, aWndId + Else + Return, 0 } View_getLayoutSymbol_tile(m, v, n) diff --git a/src/Window.ahk b/src/Window.ahk new file mode 100644 index 0000000..4a95a52 --- /dev/null +++ b/src/Window.ahk @@ -0,0 +1,173 @@ +/* + bug.n -- tiling window management + Copyright (c) 2010-2015 Joshua Fuhs, joten + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + @license GNU General Public License version 3 + ../LICENSE.md or + + @version 9.0.0 +*/ + +;; Given a ghost window, try to find its body. This is only known to work on Windows 7 +Manager_findHung(ghostWndId) { + Global Config_ghostWndSubString + + WinGetTitle, ghostWndTitle, ahk_id %ghostWndId% + StringReplace, ghostWndTitle, ghostWndTitle, %Config_ghostWndSubString%, + WinGetPos, ghostWndX, ghostWndY, ghostWndW, ghostWndH, ahk_id %ghostWndId% + + SetTitleMatchMode, 2 + WinGet, wndId, List, %ghostWndTitle% + Loop, % wndId { + If (wndId%A_Index% = ghostWndId) + Continue + WinGetPos, wndX, wndY, wndW, wndH, % "ahk_id" wndId%A_Index% + If (wndX = ghostWndX) And (wndY = ghostWndY) And (wndW = ghostWndW) And (wndH = ghostWndH) + Return, wndId%A_Index% + } + Return, 0 +} + +Manager_isGhost(wndId) { + Local wndClass, wndProc + + WinGet, wndProc, ProcessName, ahk_id %wndId% + WinGetClass, wndClass, ahk_id %wndId% + If (wndProc = "dwm.exe") And (wndClass = "Ghost") + Return, 1 + Else + Return, 0 +} + +;; 0 - Not hung +;; 1 - Hung +Manager_isHung(wndId) { + Local detectSetting, result, WM_NULL + + WM_NULL = 0 + detectSetting := A_DetectHiddenWindows + DetectHiddenWindows, On + SendMessage, WM_NULL, , , , ahk_id %wndId% + result := ErrorLevel + DetectHiddenWindows, %detectSetting% + + If result + Return, 1 + Else + Return, 0 +} + +Window_isProg(wndId) { + WinGetClass, wndClass, ahk_id %wndId% + WinGetTitle, wndTitle, ahk_id %wndId% + If Not (wndClass = "Progman") And Not (wndClass = "WorkerW") And Not (wndClass = "DesktopBackgroundClass") + And Not (wndClass = "AutoHotkeyGui" And SubStr(wndTitle, 1, 10) = "bug.n_BAR_") + Return, wndId + Else + Return, 0 +} + +Manager_winClose(wndId) { + If Manager_isHung(wndId) { + Debug_logMessage("DEBUG[2] Manager_winClose: Potentially hung window " . wndId, 2) + Return, 1 + } Else { + WinClose, ahk_id %wndId% + Return, 0 + } +} + +Manager_winHide(wndId) { + If Manager_isHung(wndId) { + Debug_logMessage("DEBUG[2] Manager_winHide: Potentially hung window " . wndId, 2) + Return, 1 + } Else { + WinHide, ahk_id %wndId% + Return, 0 + } +} + +Manager_winMaximize(wndId) { + If Manager_isHung(wndId) { + Debug_logMessage("DEBUG[2] Manager_winMaximize: Potentially hung window " . wndId, 2) + Return, 1 + } Else { + WinMaximize, ahk_id %wndId% + Return, 0 + } +} + +Manager_winMove(wndId, x, y, width, height) { + If Manager_isHung(wndId) { + Debug_logMessage("DEBUG[2] Manager_winMove: Potentially hung window " . wndId, 2) + Return, 1 + } Else { + WinGet, wndMin, MinMax, ahk_id %wndId% + If (wndMin = -1) + WinRestore, ahk_id %wndId% + } + + WM_ENTERSIZEMOVE = 0x0231 + WM_EXITSIZEMOVE = 0x0232 + SendMessage, WM_ENTERSIZEMOVE, , , , ahk_id %wndId% + If ErrorLevel { + Debug_logMessage("DEBUG[2] Manager_winMove: Potentially hung window " . wndId, 1) + Return, 1 + } Else { + WinMove, ahk_id %wndId%, , %x%, %y%, %width%, %height% + SendMessage, WM_EXITSIZEMOVE, , , , ahk_id %wndId% + Return, 0 + } +} + +Manager_winSet(type, value, wndId) { + If Manager_isHung(wndId) { + Debug_logMessage("DEBUG[2] Manager_winSet: Potentially hung window " . wndId, 2) + Return, 1 + } Else { + WinSet, %type%, %value%, ahk_id %wndId% + Return, 0 + } +} + +Manager_winShow(wndId) { + If Manager_isHung(wndId) { + Debug_logMessage("DEBUG[2] Manager_winShow: Potentially hung window " . wndId, 2) + Return, 1 + } Else { + WinShow, ahk_id %wndId% + Return, 0 + } +} + +Manager_toggleDecor(wndId = 0) { + Global + + If (wndId = 0) + WinGet, wndId, ID, A + + Manager_#%wndId%_isDecorated := Not Manager_#%wndId%_isDecorated + If Manager_#%wndId%_isDecorated + Manager_winSet("Style", "+0xC00000", wndId) + Else + Manager_winSet("Style", "-0xC00000", wndId) +} + +Window_activate(wndId) { + If Manager_isHung(wndId) { + Debug_logMessage("DEBUG[2] Window_activate: Potentially hung window " . wndId, 2) + Return, 1 + } Else { + WinActivate, ahk_id %wndId% + WinGet, aWndId, ID, A + If (wndId != aWndId) + Return, 1 + Else + Return, 0 + } +}