[PATCH v2 keyboard 3/3] Rewrote code to set initial state LEDS
Alexandr Shadchin
alexandr.shadchin at gmail.com
Sun Feb 20 07:44:06 PST 2011
Saved only initial state CapsLock and NumLock
Signed-off-by: Alexandr Shadchin <Alexandr.Shadchin at gmail.com>
---
src/kbd.c | 105 ++++++++++++++++---------------------------------------------
1 files changed, 27 insertions(+), 78 deletions(-)
diff --git a/src/kbd.c b/src/kbd.c
index e0d55e5..2a2a8a8 100644
--- a/src/kbd.c
+++ b/src/kbd.c
@@ -41,13 +41,8 @@
#include "xkbstr.h"
#include "xkbsrv.h"
-#define CAPSFLAG 1
-#define NUMFLAG 2
-#define SCROLLFLAG 4
-#define MODEFLAG 8
-#define COMPOSEFLAG 16
-/* Used to know when the first DEVICE_ON after a DEVICE_INIT is called */
-#define INITFLAG (1U << 31)
+/* Support only 4 LEDS */
+#define INITFLAG (~(XLED1 | XLED2 | XLED3 | XLED4))
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 12
static InputInfoPtr KbdPreInit(InputDriverPtr drv, IDevPtr dev, int flags);
@@ -59,9 +54,6 @@ static void KbdCtrl(DeviceIntPtr device, KeybdCtrl *ctrl);
static void KbdBell(int percent, DeviceIntPtr dev, pointer ctrl, int unused);
static void PostKbdEvent(InputInfoPtr pInfo, unsigned int key, Bool down);
-static void InitKBD(InputInfoPtr pInfo, Bool init);
-static void UpdateLeds(InputInfoPtr pInfo);
-
_X_EXPORT InputDriverRec KBD = {
1,
"kbd",
@@ -209,76 +201,19 @@ KbdBell(int percent, DeviceIntPtr dev, pointer ctrl, int unused)
}
static void
-UpdateLeds(InputInfoPtr pInfo)
+KbdCtrl(DeviceIntPtr device, KeybdCtrl *ctrl)
{
+ InputInfoPtr pInfo = (InputInfoPtr) device->public.devicePrivate;
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
- unsigned long leds = 0;
-
- if (pKbd->keyLeds & CAPSFLAG) leds |= XLED1;
- if (pKbd->keyLeds & NUMFLAG) leds |= XLED2;
- if (pKbd->keyLeds & SCROLLFLAG ||
- pKbd->keyLeds & MODEFLAG) leds |= XLED3;
- if (pKbd->keyLeds & COMPOSEFLAG) leds |= XLED4;
-
- pKbd->SetLeds(pInfo, leds);
-}
-
-static void
-KbdCtrl( DeviceIntPtr device, KeybdCtrl *ctrl)
-{
- InputInfoPtr pInfo = (InputInfoPtr) device->public.devicePrivate;
- KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-
- if ( ctrl->leds & XLED1) {
- pKbd->keyLeds |= CAPSFLAG;
- } else {
- pKbd->keyLeds &= ~CAPSFLAG;
- }
- if ( ctrl->leds & XLED2) {
- pKbd->keyLeds |= NUMFLAG;
- } else {
- pKbd->keyLeds &= ~NUMFLAG;
- }
- if ( ctrl->leds & XLED3) {
- pKbd->keyLeds |= SCROLLFLAG;
- } else {
- pKbd->keyLeds &= ~SCROLLFLAG;
- }
- if ( ctrl->leds & (XCOMP|XLED4) ) {
- pKbd->keyLeds |= COMPOSEFLAG;
- } else {
- pKbd->keyLeds &= ~COMPOSEFLAG;
- }
- pKbd->SetLeds(pInfo, ctrl->leds);
-}
-static void
-InitKBD(InputInfoPtr pInfo, Bool init)
-{
- KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-
- pKbd->scanPrefix = 0;
+ if (pKbd->keyLeds & INITFLAG) {
+ pKbd->keyLeds &= (INITFLAG | XLED1 |XLED2);
+ pKbd->keyLeds |= ctrl->leds;
+ } else {
+ pKbd->keyLeds = ctrl->leds;
+ }
- if (init) {
- pKbd->keyLeds = pKbd->GetLeds(pInfo);
- UpdateLeds(pInfo);
- pKbd->keyLeds |= INITFLAG;
- } else {
- unsigned long leds = pKbd->keyLeds;
-
- pKbd->keyLeds = pKbd->GetLeds(pInfo);
- UpdateLeds(pInfo);
- if ((pKbd->keyLeds & CAPSFLAG) !=
- ((leds & INITFLAG) ? 0 : (leds & CAPSFLAG))) {
- pKbd->PostEvent(pInfo, KEY_CapsLock, TRUE);
- pKbd->PostEvent(pInfo, KEY_CapsLock, FALSE);
- }
- if ((pKbd->keyLeds & NUMFLAG) !=
- (leds & INITFLAG ? 0 : leds & NUMFLAG)) {
- pKbd->PostEvent(pInfo, KEY_NumLock, TRUE);
- pKbd->PostEvent(pInfo, KEY_NumLock, FALSE);
- }
- }
+ pKbd->SetLeds(pInfo, pKbd->keyLeds);
}
static int
@@ -299,6 +234,9 @@ KbdProc(DeviceIntPtr device, int what)
pKbd->KbdGetMapping(pInfo, &keySyms, modMap);
+ pKbd->keyLeds = pKbd->GetLeds(pInfo);
+ pKbd->keyLeds |= INITFLAG;
+
device->public.on = FALSE;
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 5
{
@@ -329,7 +267,6 @@ KbdProc(DeviceIntPtr device, int what)
(KbdCtrlProcPtr)KbdCtrl);
}
#endif /* XINPUT ABI 5*/
- InitKBD(pInfo, TRUE);
break;
case DEVICE_ON:
if (device->public.on)
@@ -350,7 +287,7 @@ KbdProc(DeviceIntPtr device, int what)
}
device->public.on = TRUE;
- InitKBD(pInfo, FALSE);
+ pKbd->scanPrefix = 0;
break;
case DEVICE_CLOSE:
@@ -412,6 +349,18 @@ PostKbdEvent(InputInfoPtr pInfo, unsigned int scanCode, Bool down)
scanCode = KEY_Pause;
}
+ if (pKbd->keyLeds & INITFLAG) {
+ if (pKbd->keyLeds & XLED1) {
+ xf86PostKeyboardEvent(device, KEY_CapsLock + MIN_KEYCODE, TRUE);
+ xf86PostKeyboardEvent(device, KEY_CapsLock + MIN_KEYCODE, FALSE);
+ }
+ if (pKbd->keyLeds & XLED2) {
+ xf86PostKeyboardEvent(device, KEY_NumLock + MIN_KEYCODE, TRUE);
+ xf86PostKeyboardEvent(device, KEY_NumLock + MIN_KEYCODE, FALSE);
+ }
+ pKbd->keyLeds &= ~INITFLAG;
+ }
+
xf86PostKeyboardEvent(device, scanCode + MIN_KEYCODE, down);
}
--
1.7.3.5
More information about the xorg-devel
mailing list