]> Pileus Git - wmpus/blobdiff - sys-win32.c
Update Win32 ShlProc
[wmpus] / sys-win32.c
index 8513bca081f71a38af95174aeb136b1bce3ac294..6d57bb6c1d77ec49179e3a16994c9eedc9034a06 100644 (file)
@@ -19,7 +19,7 @@
 #include <search.h>
 
 #define WIN32_LEAN_AND_MEAN
-#define _WIN32_WINNT 0x0500
+#define _WIN32_WINNT 0x0501
 #include <windows.h>
 #include <winbase.h>
 #include <winuser.h>
@@ -31,6 +31,7 @@
 
 /* Configuration */
 static int NO_CAPTURE = 0;
+static int STACK      = 25;
 
 /* Internal structures */
 struct win_sys {
@@ -238,24 +239,30 @@ LRESULT CALLBACK ShlProc(int msg, WPARAM wParam, LPARAM lParam)
        HWND hwnd = (HWND)wParam;
        win_t *win = NULL;
        switch (msg) {
-       case HSHELL_WINDOWCREATED:
        case HSHELL_REDRAW:
+       case HSHELL_WINDOWCREATED:
                printf("ShlProc: %p - %s\n", hwnd, msg == HSHELL_REDRAW ?
                                "redraw" : "window created");
                if (!(win = win_find(hwnd,0)))
                        if ((win = win_find(hwnd,1)))
                                wm_insert(win);
                return 1;
+       case HSHELL_WINDOWREPLACED:
        case HSHELL_WINDOWDESTROYED:
-               printf("ShlProc: %p - window destroyed\n", hwnd);
+               printf("ShlProc: %p - %s\n", hwnd, msg == HSHELL_WINDOWREPLACED ?
+                               "window replaced" : "window destroyed");
                if ((win = win_find(hwnd,0)) &&
-                   win->state == st_show) {
+                   (win->state == st_show ||
+                    win->state == st_shade)) {
                        wm_remove(win);
                        win_remove(win);
                }
                return 1;
        case HSHELL_WINDOWACTIVATED:
                printf("ShlProc: %p - window activated\n", hwnd);
+               // Fake button-click
+               if ((win = win_find(hwnd,0)))
+                       wm_handle_key(win, key_mouse1, MOD(), getptr());
                return 0;
        default:
                printf("ShlProc: %p - unknown msg, %d\n", hwnd, msg);
@@ -342,16 +349,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)
@@ -372,7 +384,7 @@ void sys_show(win_t *win, state_t 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);
+               SetWindowRgn(win->sys->hwnd, CreateRectRgn(0,0,win->w,STACK), TRUE);
 }
 
 void sys_watch(win_t *win, Key_t key, mod_t mod)
@@ -401,6 +413,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    = {