]> Pileus Git - wmpus/blobdiff - sys-win32.c
Use stack config variable in sys-win32
[wmpus] / sys-win32.c
index 0e52935832df55bde60cefb551af5fa93210e4c7..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);
                }
@@ -325,12 +325,15 @@ void sys_move(win_t *win, int x, int y, int w, int h)
 void sys_raise(win_t *win)
 {
        printf("sys_raise: %p\n", win);
-       SetForegroundWindow(win->sys->hwnd);
 
-       //HWND hwnd = win->sys->hwnd;
-       //HWND top  = GetAncestor(hwnd,GA_ROOT);
-       //SetWindowPos(top, HWND_TOPMOST, 0, 0, 0, 0,
-       //              SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
+       /* See note in sys_focus */
+       DWORD oldId = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
+       DWORD newId = GetCurrentThreadId();
+       AttachThreadInput(oldId, newId, TRUE);
+
+       SetWindowPos(win->sys->hwnd, NULL, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
+
+       AttachThreadInput(oldId, newId, FALSE);
 }
 
 void sys_focus(win_t *win)
@@ -340,15 +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);
 
-       BringWindowToTop(win->sys->hwnd);
-       SetForegroundWindow(win->sys->hwnd);
-       SetFocus(win->sys->hwnd);
+       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)
@@ -363,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)
@@ -394,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    = {