diff options
author | Olivier Fourdan <fourdan.olivier@wanadoo.fr> | 2007-05-02 05:40:38 +0000 |
---|---|---|
committer | Olivier Fourdan <fourdan.olivier@wanadoo.fr> | 2007-05-02 05:40:38 +0000 |
commit | 7e0e05051eac5bcb433ffd17eb3c25499e4c7558 (patch) | |
tree | 7c56ee6f300f780f1eb309b80490f8e21b3ca24c /src/keyboard.c | |
parent | be7af6aeaf356fcfca3b08611f8d849d80de9f22 (diff) | |
download | xfwm4-7e0e05051eac5bcb433ffd17eb3c25499e4c7558.tar.gz |
Fix memleak in modifier mapping
(Old svn revision: 25666)
Diffstat (limited to 'src/keyboard.c')
-rw-r--r-- | src/keyboard.c | 52 |
1 files changed, 19 insertions, 33 deletions
diff --git a/src/keyboard.c b/src/keyboard.c index 5ca3ff4c2..3cc597222 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -306,7 +306,6 @@ ungrabButton (Display * dpy, int button, int modifier, Window w) } } -#define set_mask(m_mask, mask_cnt) if (!m_mask) m_mask = (1 << mask_cnt); void initModifiers (Display * dpy) { @@ -332,7 +331,7 @@ initModifiers (Display * dpy) modmap = XGetModifierMapping (dpy); keymap = XGetKeyboardMapping (dpy, min_keycode, max_keycode - min_keycode + 1, &keysyms_per_keycode); - if (modmap) + if (modmap && keymap) { for (i = 3 * modmap->max_keypermod; i < 8 * modmap->max_keypermod; i++) { @@ -344,60 +343,47 @@ initModifiers (Display * dpy) for (j = 0; j < keysyms_per_keycode; j++) { - if (syms[j] == XK_Num_Lock) + if (!NumLockMask && (syms[j] == XK_Num_Lock)) { - set_mask(NumLockMask, (i / modmap->max_keypermod)); + NumLockMask = (1 << (i / modmap->max_keypermod)); } - else if (syms[j] == XK_Scroll_Lock) + else if (!ScrollLockMask && (syms[j] == XK_Scroll_Lock)) { - set_mask(ScrollLockMask, (i / modmap->max_keypermod)); + ScrollLockMask = (1 << (i / modmap->max_keypermod)); } - else if ((syms[j] == XK_Alt_L) || (syms[j] == XK_Alt_R)) + else if (!AltMask && ((syms[j] == XK_Alt_L) || (syms[j] == XK_Alt_R))) { - set_mask(AltMask, (i / modmap->max_keypermod)); + AltMask = (1 << (i / modmap->max_keypermod)); } - else if ((syms[j] == XK_Super_L) || (syms[j] == XK_Super_R)) + else if (!SuperMask && ((syms[j] == XK_Super_L) || (syms[j] == XK_Super_R))) { - set_mask(SuperMask, (i / modmap->max_keypermod)); + SuperMask = (1 << (i / modmap->max_keypermod)); } - else if ((syms[j] == XK_Hyper_L) || (syms[j] == XK_Hyper_R)) + else if (!HyperMask && ((syms[j] == XK_Hyper_L) || (syms[j] == XK_Hyper_R))) { - set_mask(HyperMask, (i / modmap->max_keypermod)); + HyperMask = (1 << (i / modmap->max_keypermod)); } - else if ((syms[j] == XK_Meta_L) || (syms[j] == XK_Meta_R)) + else if (!MetaMask && ((syms[j] == XK_Meta_L) || (syms[j] == XK_Meta_R))) { - set_mask(MetaMask, (i / modmap->max_keypermod)); + MetaMask = (1 << (i / modmap->max_keypermod)); } } } } - XFreeModifiermap (modmap); - } - - if (MetaMask == AltMask) - { - MetaMask = 0; } - if ((AltMask != 0) && (MetaMask == Mod1Mask)) + /* Cleanup memory */ + if (modmap) { - MetaMask = AltMask; - AltMask = Mod1Mask; + XFreeModifiermap (modmap); } - if ((AltMask == 0) && (MetaMask != 0)) + if (keymap) { - if (MetaMask != Mod1Mask) - { - AltMask = Mod1Mask; - } - else - { - AltMask = MetaMask; - MetaMask = 0; - } + XFree (keymap); } + /* In case we didn't find AltMask, use Mod1Mask */ if (AltMask == 0) { AltMask = Mod1Mask; |