int vk;
} keymap_t;
-/* Conversion functions */
keymap_t key2vk[] = {
{key_mouse1 , VK_LBUTTON },
{key_mouse2 , VK_MBUTTON },
{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)
{
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 */
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;
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);
}
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)
#include "sys.h"
#include "wm.h"
+#define MODKEY ctrl
+
typedef enum {
none, move, resize
} Mode_t;
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);
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;
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)
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));
}