]> Pileus Git - wmpus/blobdiff - sys-win32.c
Try to improve focus speed
[wmpus] / sys-win32.c
index 463b6ffb315e425d80edab9c8ce41f58c4df9a7a..5d0550ab9cdafa398e1a739b86353dacb1808dbd 100644 (file)
@@ -35,7 +35,6 @@ static int NO_CAPTURE = 0;
 /* Internal structures */
 struct win_sys {
        HWND hwnd;
-       state_t state;
 };
 
 typedef struct {
@@ -250,7 +249,7 @@ LRESULT CALLBACK ShlProc(int msg, WPARAM wParam, LPARAM lParam)
        case HSHELL_WINDOWDESTROYED:
                printf("ShlProc: %p - window destroyed\n", hwnd);
                if ((win = win_find(hwnd,0)) &&
-                   win->sys->state == st_show) {
+                   win->state == st_show) {
                        wm_remove(win);
                        win_remove(win);
                }
@@ -343,16 +342,21 @@ void sys_focus(win_t *win)
        /* Windows prevents a thread from using SetForegroundInput under
         * certain circumstances and instead flashes the windows toolbar icon.
         * Attaching the thread input queues avoids this behavior */
-       DWORD oldId = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
+       HWND  fgWin = GetForegroundWindow();
+       if (fgWin == win->sys->hwnd)
+               return; // already focused
+       DWORD oldId = GetWindowThreadProcessId(fgWin, NULL);
        DWORD newId = GetCurrentThreadId();
-       AttachThreadInput(oldId, newId, TRUE);
+       if (oldId != newId)
+               AttachThreadInput(oldId, newId, TRUE);
 
        HWND next = GetWindow(win->sys->hwnd, GW_HWNDNEXT);
        SetWindowPos(win->sys->hwnd, NULL, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
        if (next)
                SetWindowPos(win->sys->hwnd, next, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
 
-       AttachThreadInput(oldId, newId, FALSE);
+       if (oldId != newId)
+               AttachThreadInput(oldId, newId, FALSE);
 }
 
 void sys_show(win_t *win, state_t state)
@@ -367,9 +371,13 @@ void sys_show(win_t *win, state_t state)
                [st_icon ] {"icon" , SW_MINIMIZE},
                [st_hide ] {"hide" , SW_HIDE    },
        };
-       win->sys->state = state;
+       if (win->state != state && win->state == st_shade)
+               SetWindowRgn(win->sys->hwnd, NULL, TRUE);
+       win->state = state;
        printf("sys_show: %s\n", map[state].str);
        ShowWindow(win->sys->hwnd, map[state].cmd);
+       if (state == st_shade)
+               SetWindowRgn(win->sys->hwnd, CreateRectRgn(0,0,win->w,25), TRUE);
 }
 
 void sys_watch(win_t *win, Key_t key, mod_t mod)