From: Andy Spencer Date: Thu, 19 May 2011 05:59:59 +0000 (+0000) Subject: X11 Bug fixes X-Git-Url: http://pileus.org/git/?p=wmpus;a=commitdiff_plain;h=078801ca18f69b82db8174109e1d1112fb98d1eb X11 Bug fixes --- diff --git a/sys-win32.c b/sys-win32.c index 8ec77ff..f6479c5 100644 --- a/sys-win32.c +++ b/sys-win32.c @@ -26,20 +26,6 @@ typedef struct { 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 }, @@ -78,17 +64,20 @@ keymap_t key2vk[] = { {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; @@ -96,23 +85,22 @@ ptr_t getptr(void) 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; @@ -182,6 +170,25 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM 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); diff --git a/sys-x11.c b/sys-x11.c index 16cbe63..0e55854 100644 --- a/sys-x11.c +++ b/sys-x11.c @@ -15,11 +15,13 @@ struct win_sys { 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 }, @@ -42,15 +44,18 @@ struct { {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 @@ -59,31 +64,63 @@ unsigned int mod2x(mod_t mod) | 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); @@ -107,28 +144,6 @@ void sys_watch(win_t *win, Key_t key, mod_t mod) 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); @@ -144,15 +159,16 @@ void sys_run(win_t *root) 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); @@ -160,7 +176,8 @@ void sys_run(win_t *root) 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)); diff --git a/sys.h b/sys.h index 74938c7..ced143e 100644 --- a/sys.h +++ b/sys.h @@ -32,14 +32,15 @@ typedef enum { } Key_t; typedef struct { - unsigned char up : 1; unsigned char alt : 1; unsigned char ctrl : 1; unsigned char shift : 1; unsigned char win : 1; + unsigned char up : 1; + unsigned char spare : 3; } mod_t; #define MOD(...) ((mod_t){__VA_ARGS__}) -#define mod2int(mod) (*((unsigned*)&(mod))) +#define mod2int(mod) (*((unsigned short*)&(mod))) typedef struct { int x, y; diff --git a/wm-wmii.c b/wm-wmii.c index 444a596..63eec36 100644 --- a/wm-wmii.c +++ b/wm-wmii.c @@ -13,7 +13,10 @@ Mode_t mode; int wm_handle_key(win_t *win, Key_t key, mod_t mod, ptr_t ptr) { - printf("wm_handle_key: %p - %x\n", win, key); + if (!win) + return; + printf("wm_handle_key: %p - %x %hhx\n", + win, key, mod2int(mod)); kptr = ptr; kwin = win;