int vk;
} keymap_t;
-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 */
keymap_t key2vk[] = {
{key_mouse1 , VK_LBUTTON },
{key_win , VK_RWIN },
};
-UINT key2w(Key_t key)
-{
- keymap_t *km = map_get(key2vk,key);
- return km ? km->vk : toupper(key);
-}
+/* - Keycodes */
Key_t w2key(UINT vk)
{
keymap_t *km = map_getr(key2vk,vk);
return km ? km->key : vk;
}
+UINT key2w(Key_t key)
+{
+ keymap_t *km = map_get(key2vk,key);
+ return km ? km->vk : toupper(key);
+}
+
+/* - Pointers */
ptr_t getptr(void)
{
POINT wptr;
return (ptr_t){-1, -1, wptr.x, wptr.y};
}
-/* Functions */
-void sys_move(win_t *win, int x, int y, int w, int h)
-{
- printf("sys_move: %p - %d,%d %dx%d\n", win, x, y, w, h);
- MoveWindow(win->sys->hwnd, x, y, w, h, TRUE);
-}
-
-void sys_raise(win_t *win)
-{
- printf("sys_raise: %p\n", win);
-}
-
-void sys_watch(win_t *win, Key_t key, mod_t mod)
+/* Helper functions */
+win_t *win_new(HWND hwnd)
{
- printf("sys_watch: %p\n", win);
+ 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;
}
+/* Callbacks */
LRESULT CALLBACK KbdProc(int msg, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT *st = (KBDLLHOOKSTRUCT *)lParam;
return DefWindowProc(hwnd, msg, wParam, lParam);
}
+/*****************
+ * Sys functions *
+ *****************/
+void sys_move(win_t *win, int x, int y, int w, int h)
+{
+ printf("sys_move: %p - %d,%d %dx%d\n", win, x, y, w, h);
+ MoveWindow(win->sys->hwnd, x, y, w, h, TRUE);
+}
+
+void sys_raise(win_t *win)
+{
+ printf("sys_raise: %p\n", win);
+}
+
+void sys_watch(win_t *win, Key_t key, mod_t mod)
+{
+ printf("sys_watch: %p\n", win);
+}
+
win_t *sys_init(void)
{
HINSTANCE hInst = GetModuleHandle(NULL);
Display *dpy;
};
-/* Conversion functions */
-struct {
+typedef struct {
Key_t key;
int sym;
-} key2sym[] = {
+} keymap_t;
+
+/* Conversion functions */
+keymap_t key2sym[] = {
{key_left , XK_Left },
{key_right , XK_Right},
{key_up , XK_Up },
{key_f12 , XK_F12 },
};
-mod_t x2mod(unsigned int state)
+/* - Modifiers */
+mod_t x2mod(unsigned int state, int up)
{
return (mod_t){
.alt = !!(state & Mod1Mask ),
.ctrl = !!(state & ControlMask),
.shift = !!(state & ShiftMask ),
.win = !!(state & Mod4Mask ),
+ .up = up,
};
}
+
unsigned int mod2x(mod_t mod)
{
return mod.alt ? Mod1Mask : 0
| mod.win ? Mod4Mask : 0;
}
-KeySym key2x(Key_t key)
-{
- return map_get(key2sym,key)->sym ?: key;
-}
+/* - Keycodes */
Key_t x2key(KeySym sym)
{
- return map_getr(key2sym,sym)->key ?: sym;
+ keymap_t *km = map_getr(key2sym,sym);
+ return km ? km->key : sym;
}
-int btn2x(Key_t key)
+KeySym key2x(Key_t key)
{
- return key - key_mouse0;
+ keymap_t *km = map_get(key2sym,key);
+ return km ? km->sym : key;
}
+
Key_t x2btn(int btn)
{
return btn + key_mouse0;
}
+int btn2x(Key_t key)
+{
+ return key - key_mouse0;
+}
+
+/* - Pointers */
ptr_t x2ptr(XEvent _ev)
{
XKeyEvent ev = _ev.xkey;
return (ptr_t){ev.x, ev.y, ev.x_root, ev.y_root};
}
-/* Functions */
+/* Helper functions */
+win_t *win_new(Display *xdpy, Window xwin)
+{
+ if (!xdpy || !xwin)
+ return NULL;
+ XWindowAttributes attr;
+ XGetWindowAttributes(xdpy, xwin, &attr);
+ win_t *win = new0(win_t);
+ win->x = attr.x;
+ win->y = attr.y;
+ win->w = attr.width;
+ win->h = attr.height;
+ win->sys = new0(win_sys_t);
+ win->sys->dpy = xdpy;
+ win->sys->win = xwin;
+ return win;
+}
+
+void win_free(win_t *win)
+{
+ free(win->sys);
+ free(win);
+}
+
+/*****************
+ * Sys functions *
+ *****************/
void sys_move(win_t *win, int x, int y, int w, int h)
{
printf("sys_move: %p - %d,%d %dx%d\n", win, x, y, w, h);
mod2x(mod), win->sys->win, True, GrabModeAsync, GrabModeAsync);
}
-win_t *win_new(Display *xdpy, Window xwin)
-{
- if (!xdpy || !xwin)
- return NULL;
- XWindowAttributes attr;
- XGetWindowAttributes(xdpy, xwin, &attr);
- win_t *win = new0(win_t);
- win->x = attr.x;
- win->y = attr.y;
- win->w = attr.width;
- win->h = attr.height;
- win->sys = new0(win_sys_t);
- win->sys->dpy = xdpy;
- win->sys->win = xwin;
- return win;
-}
-void win_free(win_t *win)
-{
- free(win->sys);
- free(win);
-}
-
win_t *sys_init(void)
{
Display *xdpy = XOpenDisplay(NULL);
XEvent ev;
XNextEvent(dpy, &ev);
//printf("event: %d\n", ev.type);
- if (ev.type == KeyPress && ev.xkey.subwindow) {
+ if (ev.type == KeyPress) {
while (XCheckTypedEvent(dpy, KeyPress, &ev));
KeySym sym = XKeycodeToKeysym(dpy, ev.xkey.keycode, 0);
wm_handle_key(win_new(dpy, ev.xkey.subwindow),
- x2key(sym), x2mod(ev.xkey.state), x2ptr(ev));
+ x2key(sym), x2mod(ev.xkey.state,0), x2ptr(ev));
}
- else if (ev.type == ButtonPress && ev.xbutton.subwindow) {
+ else if (ev.type == ButtonPress) {
wm_handle_key(win_new(dpy, ev.xkey.subwindow),
- x2btn(ev.xbutton.button), MOD(.up=0), x2ptr(ev));
+ x2btn(ev.xbutton.button),
+ x2mod(ev.xbutton.state,0), x2ptr(ev));
XGrabPointer(dpy, ev.xkey.subwindow, True,
PointerMotionMask|ButtonReleaseMask, GrabModeAsync,
GrabModeAsync, None, None, CurrentTime);
else if(ev.type == ButtonRelease) {
XUngrabPointer(dpy, CurrentTime);
wm_handle_key(win_new(dpy, ev.xkey.subwindow),
- x2btn(ev.xbutton.button), MOD(.up=1), x2ptr(ev));
+ x2btn(ev.xbutton.button),
+ x2mod(ev.xbutton.state,1), x2ptr(ev));
}
else if(ev.type == MotionNotify) {
while (XCheckTypedEvent(dpy, MotionNotify, &ev));