X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=sys-win32.c;h=c42f8891b9317932fb7fa48a7b0a119cecd5558e;hb=1aa7113d008e06382a4b5b06bd138ae05f4fda4d;hp=5e9bae7b9eb631136ccf1b618d8d6ece56c71c69;hpb=cbc34d3fb6dc1db9b0e33fd8f92c14805ba4fde2;p=wmpus diff --git a/sys-win32.c b/sys-win32.c index 5e9bae7..c42f889 100644 --- a/sys-win32.c +++ b/sys-win32.c @@ -25,13 +25,17 @@ #include #include "util.h" +#include "conf.h" #include "sys.h" #include "wm.h" +/* Configuration */ +static int NO_CAPTURE = 0; +static int STACK = 25; + /* Internal structures */ struct win_sys { HWND hwnd; - state_t state; }; typedef struct { @@ -40,7 +44,6 @@ typedef struct { } keymap_t; /* Global data */ -static int running; static int shellhookid; static void *cache; static win_t *root; @@ -247,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); } @@ -294,6 +297,20 @@ BOOL CALLBACK MonProc(HMONITOR mon, HDC dc, LPRECT rect, LPARAM _screens) return TRUE; } +BOOL CALLBACK LoopProc(HWND hwnd, LPARAM user) +{ + win_t *win; + if ((win = win_find(hwnd,1))) + wm_insert(win); + return TRUE; +} + +BOOL WINAPI CtrlProc(DWORD type) +{ + sys_exit(); + return TRUE; +} + /******************** * System functions * ********************/ @@ -308,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) @@ -323,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) @@ -346,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) @@ -375,6 +405,10 @@ win_t *sys_init(void) HINSTANCE hInst = GetModuleHandle(NULL); HWND hwnd = NULL; + /* Load configuration */ + NO_CAPTURE = conf_get_int("main.no-capture", NO_CAPTURE); + STACK = conf_get_int("main.stack", STACK); + /* Setup window class */ WNDCLASSEX wc = { .cbSize = sizeof(WNDCLASSEX), @@ -415,14 +449,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; - running = 1; - while (running && GetMessage(&msg, NULL, 0, 0) > 0) { + MSG msg = {}; + if (!NO_CAPTURE) + EnumWindows(LoopProc, 0); + while (GetMessage(&msg, NULL, 0, 0) > 0 && + msg.message != WM_QUIT) { TranslateMessage(&msg); DispatchMessage(&msg); } @@ -430,7 +469,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)