]> Pileus Git - wmpus/commitdiff
X11 Bug fixes
authorAndy Spencer <andy753421@gmail.com>
Thu, 19 May 2011 05:59:59 +0000 (05:59 +0000)
committerAndy Spencer <andy753421@gmail.com>
Thu, 19 May 2011 05:59:59 +0000 (05:59 +0000)
sys-win32.c
sys-x11.c
sys.h
wm-wmii.c

index 8ec77ffe0da4f6072c818a658d664a964ea58b83..f6479c5fdc1dabaf233f09c9e3d4811745bffb40 100644 (file)
@@ -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);
index 16cbe632ec799c53e9ef158e9ad12f5e7b72d84b..0e55854441b6dfd7a83074fbf51c487f0cdab649 100644 (file)
--- 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 74938c7bfe11a0ed9621c705b516452dd61a365f..ced143ea3595c513269dbba35e29513c125cff99 100644 (file)
--- 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;
index 444a5968084fb5fffe0d6208ce817af959d77f14..63eec36008b520e4d52f63d3d02ea2ffa747e5cd 100644 (file)
--- 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;