X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=sys-win32.c;h=d6c1c7fe04d9ce88bc6921d2b75f7ff1b56195ea;hb=fbe40e33b81782904f487d4c5567f7f245779817;hp=bf6c9aa466b7db3227e3b252e80760ea8b7a3d77;hpb=a6f2be4a52a3dd478c0640714c5be9c5cf87c64e;p=wmpus diff --git a/sys-win32.c b/sys-win32.c index bf6c9aa..d6c1c7f 100644 --- a/sys-win32.c +++ b/sys-win32.c @@ -25,13 +25,16 @@ #include #include "util.h" +#include "conf.h" #include "sys.h" #include "wm.h" +/* Configuration */ +static int NO_CAPTURE = 0; + /* Internal structures */ struct win_sys { HWND hwnd; - state_t state; }; typedef struct { @@ -40,9 +43,10 @@ typedef struct { } keymap_t; /* Global data */ -static int shellhookid; -static void *cache; -static win_t *root; +static int shellhookid; +static void *cache; +static win_t *root; +static list_t *screens; /* Conversion functions */ static keymap_t key2vk[] = { @@ -245,7 +249,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); } @@ -292,6 +296,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 * ********************/ @@ -306,12 +324,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) @@ -325,9 +346,10 @@ void sys_focus(win_t *win) DWORD newId = GetCurrentThreadId(); 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); } @@ -344,7 +366,7 @@ void sys_show(win_t *win, state_t state) [st_icon ] {"icon" , SW_MINIMIZE}, [st_hide ] {"hide" , SW_HIDE }, }; - win->sys->state = state; + win->state = state; printf("sys_show: %s\n", map[state].str); ShowWindow(win->sys->hwnd, map[state].cmd); } @@ -363,8 +385,8 @@ void sys_unwatch(win_t *win, Key_t key, mod_t mod) list_t *sys_info(win_t *win) { - list_t *screens = NULL; - EnumDisplayMonitors(NULL, NULL, MonProc, (LPARAM)&screens); + if (screens == NULL) + EnumDisplayMonitors(NULL, NULL, MonProc, (LPARAM)&screens); return screens; } @@ -373,6 +395,9 @@ win_t *sys_init(void) HINSTANCE hInst = GetModuleHandle(NULL); HWND hwnd = NULL; + /* Load configuration */ + NO_CAPTURE = conf_get_int("main.no-capture", NO_CAPTURE); + /* Setup window class */ WNDCLASSEX wc = { .cbSize = sizeof(WNDCLASSEX), @@ -413,14 +438,32 @@ 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; - while (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); } } + +void sys_exit(void) +{ + PostMessage(root->sys->hwnd, WM_QUIT, 0, 0); +} + +void sys_free(win_t *root) +{ + /* I don't really care about this + * since I don't know how to use + * valgrind on win32 anyway.. */ +}