X-Git-Url: http://pileus.org/git/?p=wmpus;a=blobdiff_plain;f=sys-win32.c;h=afacdd2ba99ec8d3b3ab83b923d1462a5e5d44fc;hp=04e4ef4e52d75978520751034339291d9f431d0a;hb=c5d281c2e042c1153109dd46b74ef3d41fcacd93;hpb=eefa2034ad0f5c2ef5eb478984cfc53a6a40c6b7 diff --git a/sys-win32.c b/sys-win32.c index 04e4ef4..afacdd2 100644 --- a/sys-win32.c +++ b/sys-win32.c @@ -1,18 +1,16 @@ /* - * Copyright (C) 2011 Andy Spencer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * Copyright (c) 2011, Andy Spencer + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF */ #include @@ -27,9 +25,13 @@ #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; @@ -42,9 +44,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[] = { @@ -294,6 +297,14 @@ 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; +} + /******************** * System functions * ********************/ @@ -324,9 +335,13 @@ void sys_focus(win_t *win) * certain circumstances and instead flashes the windows toolbar icon. * Attaching the thread input queues avoids this behavior */ DWORD oldId = GetWindowThreadProcessId(GetForegroundWindow(), NULL); - DWORD newId = GetWindowThreadProcessId(win->sys->hwnd, NULL); + DWORD newId = GetCurrentThreadId(); AttachThreadInput(oldId, newId, TRUE); + + BringWindowToTop(win->sys->hwnd); SetForegroundWindow(win->sys->hwnd); + SetFocus(win->sys->hwnd); + AttachThreadInput(oldId, newId, FALSE); } @@ -361,8 +376,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; } @@ -371,6 +386,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), @@ -416,9 +434,24 @@ win_t *sys_init(void) 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) +{ + PostQuitMessage(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.. */ +}