/* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LxQt - a lightweight, Qt based, desktop toolset * http://razor-qt.org, http://lxde.org/ * * Copyright: 2010-2011 LxQt team * Authors: * Hong Jen Yee (PCMan) * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ // the following XKB code is taken from numlockx which is licensed under MIT. // Copyright (C) 2000-2001 Lubos Lunak // Copyright (C) 2001 Oswald Buddenhagen #include #include #include #include #include #include /* the XKB stuff is based on code created by Oswald Buddenhagen */ static unsigned int xkb_mask_modifier(Display* /*dpy*/, XkbDescPtr xkb, const char *name ) { int i; if( !xkb || !xkb->names ) return 0; for( i = 0; i < XkbNumVirtualMods; i++ ) { char* modStr = XGetAtomName( xkb->dpy, xkb->names->vmods[i] ); if( modStr != NULL && strcmp(name, modStr) == 0 ) { unsigned int mask; XkbVirtualModsToReal( xkb, 1 << i, &mask ); return mask; } } return 0; } static unsigned int xkb_numlock_mask(Display* dpy) { XkbDescPtr xkb; if(( xkb = XkbGetKeyboard( dpy, XkbAllComponentsMask, XkbUseCoreKbd )) != NULL ) { unsigned int mask = xkb_mask_modifier( dpy, xkb, "NumLock" ); XkbFreeKeyboard( xkb, 0, True ); return mask; } return 0; } static int xkb_set_on(Display* dpy) { unsigned int mask; mask = xkb_numlock_mask(dpy); if( mask == 0 ) return 0; XkbLockModifiers ( dpy, XkbUseCoreKbd, mask, mask); return 1; } void enableNumlock() { // this currently only works for X11 if(QX11Info::isPlatformX11()) xkb_set_on(QX11Info::display()); }