summaryrefslogtreecommitdiff
path: root/src/keyboard.c
diff options
context:
space:
mode:
authorOlivier Fourdan <fourdan.olivier@wanadoo.fr>2007-05-02 05:40:38 +0000
committerOlivier Fourdan <fourdan.olivier@wanadoo.fr>2007-05-02 05:40:38 +0000
commit7e0e05051eac5bcb433ffd17eb3c25499e4c7558 (patch)
tree7c56ee6f300f780f1eb309b80490f8e21b3ca24c /src/keyboard.c
parentbe7af6aeaf356fcfca3b08611f8d849d80de9f22 (diff)
downloadxfwm4-7e0e05051eac5bcb433ffd17eb3c25499e4c7558.tar.gz
Fix memleak in modifier mapping
(Old svn revision: 25666)
Diffstat (limited to 'src/keyboard.c')
-rw-r--r--src/keyboard.c52
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;