From: Andy Spencer Date: Thu, 19 May 2011 07:45:53 +0000 (+0000) Subject: Playing with focus X-Git-Url: http://pileus.org/git/?p=wmpus;a=commitdiff_plain;h=8c3a527e337ac76beac38131ff1accdf8312d09e Playing with focus --- diff --git a/makefile b/makefile index 5cbe8fb..ff5ded7 100644 --- a/makefile +++ b/makefile @@ -1,17 +1,17 @@ WM=wmii -SYS=x11 -CC=gcc -PROG=awm -CFLAGS=-g -Wall -Os -LIBS=-Wl,--as-needed -lX11 -TEST=DISPLAY=:2.0 +#SYS=x11 +#CC=gcc +#PROG=awm +#CFLAGS=-g -Wall -Os +#LIBS=-Wl,--as-needed -lX11 +#TEST=DISPLAY=:2.0 -#SYS=win32 -#CC=i686-pc-mingw32-gcc -#CFLAGS=-g -Wall -#PROG=awm.exe -#TEST=wine +SYS=win32 +CC=i686-pc-mingw32-gcc +CFLAGS=-g -Wall +PROG=awm.exe +TEST=wine test: $(PROG) $(TEST) ./$< diff --git a/sys-win32.c b/sys-win32.c index f6479c5..cfaeedf 100644 --- a/sys-win32.c +++ b/sys-win32.c @@ -26,7 +26,6 @@ typedef struct { int vk; } keymap_t; -/* Conversion functions */ keymap_t key2vk[] = { {key_mouse1 , VK_LBUTTON }, {key_mouse2 , VK_MBUTTON }, @@ -64,6 +63,22 @@ keymap_t key2vk[] = { {key_win , VK_RWIN }, }; +/* Helper functions */ +win_t *win_new(HWND hwnd) +{ + RECT rect = {}; + GetWindowRect(hwnd, &rect); + win_t *win = new0(win_t); + win->x = rect.left; + win->y = rect.top; + win->w = rect.right - rect.left; + win->h = rect.bottom - rect.top; + win->sys = new0(win_sys_t); + win->sys->hwnd = hwnd; + return win; +} + +/* Conversion functions */ /* - Keycodes */ Key_t w2key(UINT vk) { @@ -85,19 +100,11 @@ ptr_t getptr(void) return (ptr_t){-1, -1, wptr.x, wptr.y}; } -/* Helper functions */ -win_t *win_new(HWND hwnd) +win_t *getwin(void) { - RECT rect = {}; - GetWindowRect(hwnd, &rect); - win_t *win = new0(win_t); - win->x = rect.left; - win->y = rect.top; - win->w = rect.right - rect.left; - win->h = rect.bottom - rect.top; - win->sys = new0(win_sys_t); - win->sys->hwnd = hwnd; - return win; + POINT wptr; + GetCursorPos(&wptr); + return win_new(GetAncestor(WindowFromPoint(wptr),GA_ROOT)); } /* Callbacks */ @@ -114,15 +121,13 @@ LRESULT CALLBACK KbdProc(int msg, WPARAM wParam, LPARAM lParam) msg, wParam, lParam, st->vkCode, st->scanCode, st->flags, key, mod2int(mod_state)); - HWND fghwnd = GetForegroundWindow(); - wm_handle_key(win_new(fghwnd), key, mod_state, getptr()); + wm_handle_key(getwin(), key, mod_state, getptr()); return CallNextHookEx(0, msg, wParam, lParam); } LRESULT CALLBACK MllProc(int msg, WPARAM wParam, LPARAM lParam) { Key_t key = key_none; - HWND fghwnd = GetForegroundWindow(); switch (wParam) { case WM_LBUTTONDOWN: mod_state.up = 0; key = key_mouse1; break; case WM_LBUTTONUP: mod_state.up = 1; key = key_mouse1; break; @@ -130,9 +135,9 @@ LRESULT CALLBACK MllProc(int msg, WPARAM wParam, LPARAM lParam) case WM_RBUTTONUP: mod_state.up = 1; key = key_mouse3; break; } if (wParam == WM_MOUSEMOVE) - return wm_handle_ptr(win_new(fghwnd), getptr()); + return wm_handle_ptr(getwin(), getptr()); else if (key != key_none) - return wm_handle_key(win_new(fghwnd), key, mod_state, getptr()); + return wm_handle_key(getwin(), key, mod_state, getptr()); else return CallNextHookEx(0, msg, wParam, lParam); } @@ -182,6 +187,37 @@ 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); +} + +void sys_focus(win_t *win) +{ + printf("sys_focus: %p\n", win); + //POINT wptr; + //GetCursorPos(&wptr); + //HWND old = GetForegroundWindow(); + //HWND newc = WindowFromPoint(wptr); + //HWND new = GetAncestor(newc,GA_ROOT); + //SetWindowPos(new, HWND_NOTOPMOST, 0, 0, 0, 0, + // SWP_NOMOVE|SWP_NOSIZE); + //SetWindowPos(old, HWND_NOTOPMOST, 0, 0, 0, 0, + // SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE); + //SetFocus(hwnd); + //SetActiveWindow(hwnd); + + // Go to: HKEY_CURRENT_USER\Control Panel\Mouse + // Modify/Create DWORD Value of Data type REG_DWORD Named [ActiveWindowTracking] Setting for Value Data: [0 = ActiveWindowTracking Disabled / 1 = ActiveWindowTracking Enabled] + + //LockSetForegroundWindow(LSFW_LOCK); + //SetForegroundWindow(win->sys->hwnd); + //LockSetForegroundWindow(LSFW_UNLOCK); + //SetFocus(win->sys->hwnd); + //SetActiveWindow(win->sys->hwnd); + //EnableWindow(win->sys->hwnd, TRUE); } void sys_watch(win_t *win, Key_t key, mod_t mod) diff --git a/sys.h b/sys.h index ced143e..e35c9d7 100644 --- a/sys.h +++ b/sys.h @@ -53,6 +53,8 @@ void sys_move(win_t *win, int x, int y, int w, int h); void sys_raise(win_t *win); +void sys_focus(win_t *win); + win_t *sys_init(void); void sys_run(win_t *root); diff --git a/wm-wmii.c b/wm-wmii.c index 63eec36..7a5c5b0 100644 --- a/wm-wmii.c +++ b/wm-wmii.c @@ -3,6 +3,8 @@ #include "sys.h" #include "wm.h" +#define MODKEY ctrl + typedef enum { none, move, resize } Mode_t; @@ -13,15 +15,18 @@ Mode_t mode; int wm_handle_key(win_t *win, Key_t key, mod_t mod, ptr_t ptr) { - if (!win) - return; - printf("wm_handle_key: %p - %x %hhx\n", - win, key, mod2int(mod)); + if (!win) return; + printf("wm_handle_key: %p - %x\n", win, key); + kptr = ptr; kwin = win; /* Raise */ - if ((key == key_f1 && mod.ctrl) || + if (key == key_f2) + return sys_focus(win), 1; + if (key == key_f4) + return sys_raise(win), 1; + if ((key == key_f1 && mod.MODKEY) || (key_mouse0 <= key && key <= key_mouse7)) sys_raise(win); @@ -29,9 +34,9 @@ int wm_handle_key(win_t *win, Key_t key, mod_t mod, ptr_t ptr) if (key_mouse0 <= key && key <= key_mouse7 && mod.up && mode != none) return mode = none, 1; - else if (key == key_mouse1 && mod.ctrl) + else if (key == key_mouse1 && mod.MODKEY) return mode = move, 1; - else if (key == key_mouse3 && mod.ctrl) + else if (key == key_mouse3 && mod.MODKEY) return mode = resize, 1; return 0; @@ -43,6 +48,7 @@ int wm_handle_ptr(win_t *win, ptr_t ptr) win, ptr.x, ptr.y, ptr.rx, ptr.ry, mode); int dx = ptr.rx - kptr.rx; int dy = ptr.ry - kptr.ry; + //if (win) sys_focus(win); if (mode == move) sys_move(kwin, kwin->x+dx, kwin->y+dy, kwin->w, kwin->h); else if (mode == resize) @@ -52,7 +58,7 @@ int wm_handle_ptr(win_t *win, ptr_t ptr) void wm_init(win_t *root) { - sys_watch(root, key_f1, MOD(.ctrl=1)); - sys_watch(root, key_mouse1, MOD(.ctrl=1)); - sys_watch(root, key_mouse3, MOD(.ctrl=1)); + sys_watch(root, key_f1, MOD(.MODKEY=1)); + sys_watch(root, key_mouse1, MOD(.MODKEY=1)); + sys_watch(root, key_mouse3, MOD(.MODKEY=1)); }