And the patch. Sorry ....
Till
? directfb-avifile.pc
? directfb-swf.pc
? locks.patch
Index: include/directfb.h
===================================================================
RCS file: /cvs/directfb/DirectFB/include/directfb.h,v
retrieving revision 1.75
diff -u -r1.75 directfb.h
--- include/directfb.h 27 Jan 2002 20:20:58 -0000 1.75
+++ include/directfb.h 3 Feb 2002 19:41:21 -0000
@@ -1750,8 +1750,17 @@
DIKC_INSERT, DIKC_DELETE, DIKC_HOME, DIKC_END,
DIKC_PAGEUP, DIKC_PAGEDOWN,
DIKC_CAPSLOCK, DIKC_NUMLOCK, DIKC_SCRLOCK, DIKC_PRINT, DIKC_PAUSE,
- DIKC_KP_DIV, DIKC_KP_MULT, DIKC_KP_MINUS, DIKC_KP_PLUS,
- DIKC_KP_ENTER,
+
+ DIKC_KP_DIV, DIKC_KP_MULT, DIKC_KP_MINUS, DIKC_KP_PLUS,
+ DIKC_KP_ENTER, DIKC_KP_SPACE, DIKC_KP_TAB, DIKC_KP_F1,
+ DIKC_KP_F2, DIKC_KP_F3, DIKC_KP_F4, DIKC_KP_HOME, DIKC_KP_LEFT,
+ DIKC_KP_UP, DIKC_KP_RIGHT, DIKC_KP_DOWN, DIKC_KP_PRIOR,
+ DIKC_KP_PAGE_UP, DIKC_KP_NEXT, DIKC_KP_PAGE_DOWN, DIKC_KP_END,
+ DIKC_KP_BEGIN, DIKC_KP_INSERT, DIKC_KP_DELETE, DIKC_KP_EQUAL,
+ DIKC_KP_DECIMAL, DIKC_KP_SEPARATOR,
+
+ DIKC_KP_0, DIKC_KP_1, DIKC_KP_2, DIKC_KP_3, DIKC_KP_4,
+ DIKC_KP_5, DIKC_KP_6, DIKC_KP_7, DIKC_KP_8, DIKC_KP_9,
DIKC_OK, DIKC_CANCEL, DIKC_SELECT, DIKC_GOTO, DIKC_CLEAR,
DIKC_POWER, DIKC_POWER2, DIKC_OPTION,
@@ -1770,7 +1779,6 @@
DIKC_CHANNELUP, DIKC_CHANNELDOWN, DIKC_BACK, DIKC_FORWARD,
DIKC_VOLUMEUP, DIKC_VOLUMEDOWN, DIKC_MUTE, DIKC_AB,
-
DIKC_PLAYPAUSE, DIKC_PLAY, DIKC_STOP, DIKC_RESTART,
DIKC_SLOW, DIKC_FAST, DIKC_RECORD, DIKC_EJECT, DIKC_SHUFFLE,
DIKC_REWIND, DIKC_FASTFORWARD, DIKC_PREVIOUS, DIKC_NEXT,
@@ -1806,10 +1814,19 @@
DIMK_SHIFT = 0x00000001, /* any shift key down? */
DIMK_CTRL = 0x00000002, /* any ctrl key down? */
DIMK_ALT = 0x00000004, /* alt key down? */
- DIMK_ALTGR = 0x00000008 /* altgr key down? */
+ DIMK_ALTGR = 0x00000008 /* altgr key down? */
} DFBInputDeviceModifierKeys;
/*
+ * Flags specifying the key locks that are currently active.
+ */
+ typedef enum {
+ DIMK_SCROLL = 0x00000001, /* scroll-lock active? */
+ DIMK_CAPS = 0x00000002, /* caps-lock active? */
+ DIMK_NUM = 0x00000004 /* num-lock active? */
+ } DFBInputDeviceLockState;
+
+ /*
* Flags specifying which buttons are currently down.
*/
typedef enum {
@@ -1885,6 +1902,14 @@
DFBInputDeviceModifierKeys *modifiers
);
+ /*
+ * Get the current state of the key locks.
+ */
+ DFBResult (*GetLockState) (
+ IDirectFBInputDevice *thiz,
+ DFBInputDeviceLockState *locks
+ );
+
/*
* Get a mask of currently pressed buttons.
*
@@ -1955,7 +1980,8 @@
*/
typedef enum {
DIEF_KEYCODE = 0x01, /* keycode is valid */
- DIEF_MODIFIERS = 0x04, /* modifiers are valid */
+ DIEF_MODIFIERS = 0x02, /* modifiers are valid */
+ DIEF_LOCKS = 0x04, /* locks are valid */
DIEF_BUTTON = 0x08, /* button is valid */
DIEF_AXISABS = 0x10, /* axis and axisabs are valid */
DIEF_AXISREL = 0x20, /* axis and axisrel are valid */
@@ -1982,6 +2008,8 @@
unsigned short key_unicode;
DFBInputDeviceModifierKeys modifiers; /* modifier keys as
a bitmask */
+ DFBInputDeviceLockState locks; /* key lock state
+ as a bitmask */
/* DIET_BUTTONPRESS, DIET_BUTTONRELEASE */
DFBInputDeviceButtonIdentifier button; /* in case of a button
@@ -2068,6 +2096,7 @@
unsigned char key_ascii;
unsigned short key_unicode;
DFBInputDeviceModifierKeys modifiers;
+ DFBInputDeviceLockState locks;
/* used by DWET_BUTTONDOWN, DWET_BUTTONUP */
DFBInputDeviceButtonIdentifier button;
Index: inputdrivers/keyboard/keyboard.c
===================================================================
RCS file: /cvs/directfb/DirectFB/inputdrivers/keyboard/keyboard.c,v
retrieving revision 1.17
diff -u -r1.17 keyboard.c
--- inputdrivers/keyboard/keyboard.c 27 Jan 2002 16:31:41 -0000 1.17
+++ inputdrivers/keyboard/keyboard.c 3 Feb 2002 19:41:22 -0000
@@ -59,6 +59,7 @@
InputDevice *device;
struct termios old_ts;
DFBInputDeviceModifierKeys modifier_state;
+ DFBInputDeviceLockState lock_state;
pthread_t thread;
} KeyboardData;
@@ -71,7 +72,6 @@
switch (key_type) {
case KT_LETTER:
case KT_LATIN:
- case KT_PAD:
case KT_ASCII:
return key_index;
/* some special keys also have ascii values */
@@ -79,6 +79,7 @@
if (kb_value == K_ENTER) {
return 13;
}
+ case KT_PAD:
default:
HEAVYDEBUGMSG( "key typed has no ascii value (key_type: %d)\n",
key_type );
@@ -121,7 +122,7 @@
break;
case KT_PAD:
if (key_index <= 9)
- return DIKC_0 + key_index;
+ return DIKC_KP_0 + key_index;
break;
case 0xe: /* special IPAQ H3600 case - AH */
switch (key_index) {
@@ -145,7 +146,6 @@
case K_UP: return DIKC_UP;
case K_DOWN: return DIKC_DOWN;
case K_ENTER: return DIKC_ENTER;
-
case K_CTRL: return DIKC_CTRL;
case K_SHIFT: return DIKC_SHIFT;
case K_ALT: return DIKC_ALT;
@@ -165,11 +165,35 @@
case K_PMINUS: return DIKC_KP_MINUS;
case K_PPLUS: return DIKC_KP_PLUS;
case K_PENTER: return DIKC_KP_ENTER;
+ case K_PCOMMA:
+ case K_PDOT: return DIKC_KP_DECIMAL;
}
return DIKC_UNKNOWN;
}
+static unsigned char adjust_pad_keys( unsigned char code ){
+ switch (code) {
+ case DIKC_KP_DECIMAL: return DIKC_KP_DELETE;
+ case DIKC_KP_0: return DIKC_KP_INSERT;
+ case DIKC_KP_1: return DIKC_KP_END;
+ case DIKC_KP_2: return DIKC_KP_DOWN;
+ case DIKC_KP_3: return DIKC_KP_PAGE_DOWN;
+ case DIKC_KP_4: return DIKC_KP_LEFT;
+ case DIKC_KP_5: return DIKC_KP_BEGIN;
+ case DIKC_KP_6: return DIKC_KP_RIGHT;
+ case DIKC_KP_7: return DIKC_KP_HOME;
+ case DIKC_KP_8: return DIKC_KP_UP;
+ case DIKC_KP_9: return DIKC_KP_PAGE_UP;
+ }
+
+ return DIKC_UNKNOWN;
+
+}
+#define TOGGLE_LOCK(flag) data->lock_state & flag ?\
+ (data->lock_state &= ~flag):\
+ (data->lock_state |= flag);
+
static DFBInputEvent
keyboard_handle_code( KeyboardData *data, unsigned char code )
{
@@ -193,12 +217,12 @@
entry.kb_value = 0;
ioctl( dfb_vt->fd, KDGKBENT, &entry );
-
+ ioctl( dfb_vt->fd, KDGKBLED, &data->lock_state );
{
DFBInputEvent event;
event.type = keydown ? DIET_KEYPRESS : DIET_KEYRELEASE;
- event.flags = DIEF_KEYCODE | DIEF_MODIFIERS;
+ event.flags = DIEF_KEYCODE | DIEF_MODIFIERS | DIEF_LOCKS;
event.keycode = keyboard_translate( entry.kb_value );
@@ -227,9 +251,27 @@
else
data->modifier_state &= ~DIMK_ALTGR;
break;
- default:
+ case DIKC_CAPSLOCK:
+ if (keydown) {
+ TOGGLE_LOCK( DIMK_CAPS );
+ }
+ break;
+ case DIKC_NUMLOCK:
+ if (keydown) {
+ TOGGLE_LOCK( DIMK_NUM );
+ }
+ break;
+ case DIKC_SCRLOCK:
+ if (keydown) {
+ TOGGLE_LOCK( DIMK_SCROLL );
+ }
+ break;
+ default:
break;
}
+ /* Set the lock flags. We rely on these being
+ * in the same order as defined by the kernel. */
+ ioctl( dfb_vt->fd, KDSKBLED, data->lock_state );
if (data->modifier_state & DIMK_SHIFT) {
if (data->modifier_state & DIMK_ALT)
@@ -243,8 +285,18 @@
entry.kb_table = K_ALTTAB;
ioctl( dfb_vt->fd, KDGKBENT, &entry );
}
+ if ( ((entry.kb_value & 0xFF00) >> 8 == KT_LETTER) &&
+ (data->lock_state & DIMK_CAPS)) {
+ entry.kb_table = K_SHIFTTAB;
+ ioctl( dfb_vt->fd, KDGKBENT, &entry );
+ }
+ if ( ((entry.kb_value & 0xFF00) >> 8 == KT_PAD) &&
+ !(data->lock_state & DIMK_NUM)) {
+ event.keycode = adjust_pad_keys(event.keycode);
+ }
event.modifiers = data->modifier_state;
+ event.locks = data->lock_state;
event.key_ascii = keyboard_get_ascii( entry.kb_value );
return event;
Index: src/core/windows.c
===================================================================
RCS file: /cvs/directfb/DirectFB/src/core/windows.c,v
retrieving revision 1.45
diff -u -r1.45 windows.c
--- src/core/windows.c 29 Jan 2002 15:41:20 -0000 1.45
+++ src/core/windows.c 3 Feb 2002 19:41:25 -0000
@@ -1001,6 +1001,7 @@
we.key_unicode = evt->key_unicode;
we.keycode = evt->keycode;
we.modifiers = evt->modifiers;
+ we.locks = evt->locks;
dfb_window_dispatch( window, &we );
}
Index: src/input/idirectfbinputdevice.c
===================================================================
RCS file: /cvs/directfb/DirectFB/src/input/idirectfbinputdevice.c,v
retrieving revision 1.17
diff -u -r1.17 idirectfbinputdevice.c
--- src/input/idirectfbinputdevice.c 14 Jan 2002 04:57:02 -0000 1.17
+++ src/input/idirectfbinputdevice.c 3 Feb 2002 19:41:25 -0000
@@ -65,6 +65,8 @@
DFBInputDeviceModifierKeys modifiers; /* bitmask reflecting the
state of the modifier
keys */
+ DFBInputDeviceLockState locks; /* bitmask reflecting the
+ state of the key locks */
DFBInputDeviceButtonMask buttonmask; /* bitmask reflecting the
state of the buttons */
@@ -188,6 +190,19 @@
return DFB_OK;
}
+static DFBResult IDirectFBInputDevice_GetLockState( IDirectFBInputDevice *thiz,
+ DFBInputDeviceLockState *locks )
+{
+ INTERFACE_GET_DATA(IDirectFBInputDevice)
+
+ if (!locks)
+ return DFB_INVARG;
+
+ *locks = data->locks;
+
+ return DFB_OK;
+}
+
static DFBResult IDirectFBInputDevice_GetButtons( IDirectFBInputDevice *thiz,
DFBInputDeviceButtonMask *buttons )
{
@@ -270,6 +285,7 @@
thiz->GetDescription = IDirectFBInputDevice_GetDescription;
thiz->GetKeyState = IDirectFBInputDevice_GetKeyState;
thiz->GetModifiers = IDirectFBInputDevice_GetModifiers;
+ thiz->GetLockState = IDirectFBInputDevice_GetLockState;
thiz->GetButtons = IDirectFBInputDevice_GetButtons;
thiz->GetButtonState = IDirectFBInputDevice_GetButtonState;
thiz->GetAxis = IDirectFBInputDevice_GetAxis;
@@ -293,13 +309,17 @@
data->keystates[evt->keycode] = DIKS_DOWN;
if (evt->flags & DIEF_MODIFIERS)
data->modifiers = evt->modifiers;
- break;
+ if (evt->flags & DIEF_LOCKS)
+ data->locks = evt->locks;
+ break;
case DIET_KEYRELEASE:
if (evt->flags & DIEF_KEYCODE)
data->keystates[evt->keycode] = DIKS_UP;
if (evt->flags & DIEF_MODIFIERS)
data->modifiers = evt->modifiers;
+ if (evt->flags & DIEF_LOCKS)
+ data->locks = evt->locks;
break;
case DIET_BUTTONPRESS: