]> Pileus Git - wmpus/blobdiff - sys-win32.c
Use stack config variable in sys-win32
[wmpus] / sys-win32.c
index 463b6ffb315e425d80edab9c8ce41f58c4df9a7a..c42f8891b9317932fb7fa48a7b0a119cecd5558e 100644 (file)
 
 /* Configuration */
 static int NO_CAPTURE = 0;
+static int STACK      = 25;
 
 /* Internal structures */
 struct win_sys {
        HWND hwnd;
-       state_t state;
 };
 
 typedef struct {
@@ -250,7 +250,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 +343,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 +372,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,STACK), TRUE);
 }
 
 void sys_watch(win_t *win, Key_t key, mod_t mod)
@@ -398,6 +407,7 @@ win_t *sys_init(void)
 
        /* Load configuration */
        NO_CAPTURE = conf_get_int("main.no-capture", NO_CAPTURE);
+       STACK      = conf_get_int("main.stack",      STACK);
 
        /* Setup window class */
        WNDCLASSEX wc    = {