X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=sys-win32.c;h=6d57bb6c1d77ec49179e3a16994c9eedc9034a06;hb=230e1caa3e7adc71ae88ce9d5be0c5f49577d20f;hp=1562a5e044f1946a62b5c6f4b368e7991201d99f;hpb=d2452823db68a072489270a020a786b64c56fdb1;p=wmpus diff --git a/sys-win32.c b/sys-win32.c index 1562a5e..6d57bb6 100644 --- a/sys-win32.c +++ b/sys-win32.c @@ -19,7 +19,7 @@ #include #define WIN32_LEAN_AND_MEAN -#define _WIN32_WINNT 0x0500 +#define _WIN32_WINNT 0x0501 #include #include #include @@ -31,11 +31,11 @@ /* Configuration */ static int NO_CAPTURE = 0; +static int STACK = 25; /* Internal structures */ struct win_sys { HWND hwnd; - state_t state; }; typedef struct { @@ -44,7 +44,6 @@ typedef struct { } keymap_t; /* Global data */ -static int running; static int shellhookid; static void *cache; static win_t *root; @@ -240,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->sys->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); @@ -306,6 +311,12 @@ BOOL CALLBACK LoopProc(HWND hwnd, LPARAM user) return TRUE; } +BOOL WINAPI CtrlProc(DWORD type) +{ + sys_exit(); + return TRUE; +} + /******************** * System functions * ********************/ @@ -320,12 +331,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) @@ -335,15 +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); - 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) @@ -358,9 +378,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) @@ -389,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 = { @@ -430,18 +455,19 @@ win_t *sys_init(void) //if (!RegisterHotKey(NULL, 123, MOD_CONTROL, VK_LBUTTON)) // printf("sys_init: Error Registering Hotkey - %lu\n", GetLastError()); + /* Capture ctrl-c and console widnow close */ + SetConsoleCtrlHandler(CtrlProc, TRUE); + return root = win_new(hwnd,0); } void sys_run(win_t *root) { - MSG msg; - + MSG msg = {}; if (!NO_CAPTURE) EnumWindows(LoopProc, 0); - - running = 1; - while (running && GetMessage(&msg, NULL, 0, 0) > 0) { + while (GetMessage(&msg, NULL, 0, 0) > 0 && + msg.message != WM_QUIT) { TranslateMessage(&msg); DispatchMessage(&msg); } @@ -449,7 +475,7 @@ void sys_run(win_t *root) void sys_exit(void) { - running = 0; + PostMessage(root->sys->hwnd, WM_QUIT, 0, 0); } void sys_free(win_t *root)