From 0333c59dfbe6118fd38d2476d954f0578e158eb1 Mon Sep 17 00:00:00 2001 From: iwamatsu Date: Mon, 13 Feb 2012 23:55:07 +0000 Subject: [PATCH] Fix logic for numlock and update coding style (#16536) The problem from which Numlock is set to Off when setOn is called. Signed-off-by: Nobuhiro Iwamatsu --- app.cpp | 4 ++-- numlock.cpp | 45 ++++++++++++++++++++++++--------------------- numlock.h | 6 ++++-- 3 files changed, 30 insertions(+), 25 deletions(-) diff --git a/app.cpp b/app.cpp index f18222b..8fbfe70 100644 --- a/app.cpp +++ b/app.cpp @@ -928,9 +928,9 @@ int App::StartServer() { string numlock = cfg->getOption("numlock"); if (numlock == "on") { - NumLock::setOn(); + NumLock::setOn(Dpy); } else if (numlock == "off") { - NumLock::setOff(); + NumLock::setOff(Dpy); } delete args; diff --git a/numlock.cpp b/numlock.cpp index 327c2c9..deaaa96 100644 --- a/numlock.cpp +++ b/numlock.cpp @@ -1,6 +1,7 @@ /* SLiM - Simple Login Manager Copyright (C) 2004-06 Simone Rota Copyright (C) 2004-06 Johannes Winkelmann + Copyright (C) 2012 Nobuhiro Iwamatsu This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,6 +23,7 @@ int NumLock::xkb_init(Display* dpy) { int xkb_opcode, xkb_event, xkb_error; int xkb_lmaj = XkbMajorVersion; int xkb_lmin = XkbMinorVersion; + return XkbLibraryVersion( &xkb_lmaj, &xkb_lmin ) && XkbQueryExtension( dpy, &xkb_opcode, &xkb_event, &xkb_error, &xkb_lmaj, &xkb_lmin ); @@ -30,7 +32,8 @@ int NumLock::xkb_init(Display* dpy) { unsigned int NumLock::xkb_mask_modifier( XkbDescPtr xkb, const char *name ) { int i; if( !xkb || !xkb->names ) - return 0; + return 0; + for( i = 0; i < XkbNumVirtualMods; i++ ) { char* modStr = XGetAtomName( xkb->dpy, xkb->names->vmods[i] ); if( modStr != NULL && strcmp(name, modStr) == 0 ) { @@ -44,39 +47,39 @@ unsigned int NumLock::xkb_mask_modifier( XkbDescPtr xkb, const char *name ) { unsigned int NumLock::xkb_numlock_mask(Display* dpy) { XkbDescPtr xkb; - if(( xkb = XkbGetKeyboard( dpy, XkbAllComponentsMask, XkbUseCoreKbd )) != NULL ) { + + xkb = XkbGetKeyboard( dpy, XkbAllComponentsMask, XkbUseCoreKbd ); + if( xkb != NULL ) { unsigned int mask = xkb_mask_modifier( xkb, "NumLock" ); XkbFreeKeyboard( xkb, 0, True ); return mask; } return 0; } - -void NumLock::setOn() { + +void NumLock::control_numlock(Display *dpy, bool flag) { unsigned int mask; - Display* dpy = XOpenDisplay( NULL ); - if( !xkb_init(dpy)) - return; - mask = xkb_numlock_mask(dpy); - if( mask == 0 ) - return; - XkbLockModifiers ( dpy, XkbUseCoreKbd, mask, mask); - XCloseDisplay( dpy ); -} -void NumLock::setOff() { - unsigned int mask; - Display* dpy = XOpenDisplay( NULL ); - if( !xkb_init(dpy)) + if( !xkb_init(dpy) ) return; + mask = xkb_numlock_mask(dpy); if( mask == 0 ) return; - XkbLockModifiers ( dpy, XkbUseCoreKbd, mask, 0); - XCloseDisplay( dpy ); + + if( flag == true ) + XkbLockModifiers ( dpy, XkbUseCoreKbd, mask, 0); + else + XkbLockModifiers ( dpy, XkbUseCoreKbd, mask, mask); +} + +void NumLock::setOn(Display *dpy) { + control_numlock(dpy, true); +} + +void NumLock::setOff(Display *dpy) { + control_numlock(dpy, false); } - - /* Copyright (C) 2000-2001 Lubos Lunak diff --git a/numlock.h b/numlock.h index 68c2a2c..62228e2 100644 --- a/numlock.h +++ b/numlock.h @@ -1,6 +1,7 @@ /* SLiM - Simple Login Manager Copyright (C) 2004-06 Simone Rota Copyright (C) 2004-06 Johannes Winkelmann + Copyright (C) 2012 Nobuhiro Iwamatsu This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,13 +20,14 @@ class NumLock { public: NumLock(); - static void setOn(); - static void setOff(); + static void setOn(Display *dpy); + static void setOff(Display *dpy); private: static int xkb_init(Display* dpy); static unsigned int xkb_mask_modifier( XkbDescPtr xkb, const char *name ); static unsigned int xkb_numlock_mask(Display* dpy); + static void control_numlock(Display *dpy, bool flag); }; #endif