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:


Reply via email to