diff options
author | David Reveman <davidr@novell.com> | 2008-03-07 19:05:54 -0500 |
---|---|---|
committer | David Reveman <davidr@novell.com> | 2008-03-10 12:17:30 -0400 |
commit | 13dc88a6a3a6ceeef3617f4dffc49d6725a04d72 (patch) | |
tree | 77b4f86f217dad4332f66121569426452953bca8 | |
parent | e47bd8dd6548ecfda3c4a21f10989dcb0478420b (diff) |
Use CompKeyEventDescription objects for keyGrabs.
-rw-r--r-- | src/screen.c | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/src/screen.c b/src/screen.c index 6c1d3c86..7a1c666c 100644 --- a/src/screen.c +++ b/src/screen.c @@ -46,6 +46,7 @@ #include <X11/cursorfont.h> #include <compiz/core.h> +#include <compiz/keyboard.h> #include <compiz/c-object.h> #include <compiz/marshal.h> #include <compiz/error.h> @@ -467,32 +468,43 @@ updatePassiveGrabs (CompScreen *s) for (i = 0; i < s->data.keyGrabs.nChild; i++) { - CompObject *o = s->data.keyGrabs.child[i].ref; - char *value; + CompKeyEventDescription *ked; - if ((*o->vTable->getString) (o, 0, "value", &value, 0)) + ked = COMP_TYPE_CAST (s->data.keyGrabs.child[i].ref, + getKeyEventDescriptionObjectType (), + CompKeyEventDescription); + if (ked) { - CompKeyBinding key; + int j; + unsigned int mask = + ked->data.modifiers & (ShiftMask | LockMask | ControlMask); - if (stringToKeyBinding (s->display, value, &key)) + for (j = 0; j < CompModNum; j++) + if (ked->data.modifiers & (1 << (j + 3))) + mask |= s->display->modMask[j]; + + if (mask) { - unsigned int mask; - int j; + KeySym keysym; - mask = virtualToRealModMask (s->display, key.modifiers); - if (!(mask & CompNoMask)) + keysym = XStringToKeysym (ked->data.key); + if (keysym != NoSymbol) { - for (j = 0; j < s->nKeyGrab; j++) - if (key.keycode == s->keyGrab[j].keycode && - mask == s->keyGrab[j].modifiers) - break; + KeyCode keycode; + + keycode = XKeysymToKeycode (s->display->display, keysym); + if (keycode) + { + for (j = 0; j < s->nKeyGrab; j++) + if (keycode == s->keyGrab[j].keycode && + mask == s->keyGrab[j].modifiers) + break; - if (j == s->nKeyGrab) - grabKeys (s, key.keycode, mask); + if (j == s->nKeyGrab) + grabKeys (s, keycode, mask); + } } } - - free (value); } } } |