mirror of
https://github.com/edeproject/ede.git
synced 2023-08-10 21:13:03 +03:00
69 lines
1.6 KiB
C++
69 lines
1.6 KiB
C++
/*
|
|
* $Id$
|
|
*
|
|
* ELMA, Ede Login MAnager
|
|
* Part of Equinox Desktop Environment (EDE).
|
|
*
|
|
* Based on SLiM (Simple Login Manager) numlock code by:
|
|
* Copyright (C) 2004-06 Simone Rota <sip@varlock.com>
|
|
* Copyright (C) 2004-06 Johannes Winkelmann <jw@tks6.net>
|
|
*
|
|
* which in turn they ripped from KDE and nicely provide authors
|
|
* so I'm doing that too:
|
|
*
|
|
* Copyright (C) 2000-2001 Lubos Lunak <l.lunak@kde.org>
|
|
* Copyright (C) 2001 Oswald Buddenhagen <ossi@kde.org>
|
|
*
|
|
* And for else, blame me (Sanel).
|
|
*
|
|
* This program is licensed under terms of the
|
|
* GNU General Public License version 2 or newer.
|
|
* See COPYING for details.
|
|
*/
|
|
|
|
#include "NumLock.h"
|
|
#include <X11/XKBlib.h>
|
|
#include <X11/keysym.h>
|
|
#include <string.h>
|
|
|
|
static unsigned int numlock_mask(Display* dpy) {
|
|
XkbDescPtr xkb = XkbGetKeyboard(dpy, XkbAllComponentsMask, XkbUseCoreKbd);
|
|
if(xkb == NULL)
|
|
return 0;
|
|
|
|
char* modstr;
|
|
unsigned int mask = 0;
|
|
|
|
for(int i = 0; i < XkbNumVirtualMods; i++) {
|
|
modstr = XGetAtomName(xkb->dpy, xkb->names->vmods[i]);
|
|
if(modstr != NULL && strcmp(modstr, "NumLock") == 0) {
|
|
XkbVirtualModsToReal(xkb, 1 << i, &mask);
|
|
break;
|
|
}
|
|
}
|
|
|
|
XkbFreeKeyboard(xkb, 0, True);
|
|
return mask;
|
|
}
|
|
|
|
bool numlock_xkb_init(Display* dpy) {
|
|
int opcode, event, error;
|
|
int maj, min;
|
|
|
|
return XkbLibraryVersion(&maj, &min) && XkbQueryExtension(dpy, &opcode, &event, &error, &maj, &min);
|
|
}
|
|
|
|
void numlock_on(Display* dpy) {
|
|
unsigned int mask = numlock_mask(dpy);
|
|
if(!mask)
|
|
return;
|
|
XkbLockModifiers(dpy, XkbUseCoreKbd, mask, mask);
|
|
}
|
|
|
|
void numlock_off(Display* dpy) {
|
|
unsigned int mask = numlock_mask(dpy);
|
|
if(!mask)
|
|
return;
|
|
XkbLockModifiers(dpy, XkbUseCoreKbd, mask, 0);
|
|
}
|