Howdy! Newbie with keyboard patches.

Peter Seebach seebs at plethora.net
Mon Jan 22 14:07:34 CST 2007


Hi!  I'm new to Wine, but not a total newbie at C.  I have a very
specific interest:  I would like Wine to support more keys.

Background:  Windows has support for no fewer than 24 function keys;
in fact, possibly, as many as 32.  However, right now, Wine only supports
16 of them.  It is insanely trivial to patch Wine to support 24 function
keys by plugging new values into nonchar_key_vkey and nonchar_key_scan.
It is not much harder to support 32 at least partially; some sites
claim that vkey values 0x88-0x8F are intended to be used as F25-F32,
but there are no corresponding codes.  Well, okay; it's not unheard of for
a key to have a vkey value but no corresponding scan code.

I have diffs for this.  It works.

There's just one TINY little problem.  Many Windows games have no support
for these keys!  NOOOOO!

I have implemented and tested a patch which is almost certainly unsuitable
for production, but which is very convenient to me; it is this patch I
enclose.  This patch replaces F13-F24 with "control-alt-F1" through
"control-alt-F12", and F25-F32 control-alt-shift-F1 through F8.

Now, this is great for me, but it is obviously unsuitable as the only
behavior; it deprives people of functioning keys.  (My implementation
my also be utter crap, but "it works in Warcraft", and that's my real
interest.)

I have no clue how to do Wine configuration settings.  I think that this
behavior is likely to be useful to a lot of people; X systems are easy to
configure to generate extra keysyms, and many people have interesting
keyboards which generate a broad range of additional values.  Binding them
to function keys is useful, and this patch would allow people to use
such things in Windows games.

Insofar as I have any possible copyright claim on this patch, I hereby
release it into the public domain.  Also, not in patch form, the winuser.h
change:

#define VK_F25              0x88
#define VK_F26              0x89
#define VK_F27              0x8A
#define VK_F28              0x8B
#define VK_F29              0x8C
#define VK_F30              0x8D
#define VK_F31              0x8E
#define VK_F32              0x8F

---
*** keyboard.c.orig	Mon Jan 22 11:10:15 2007
--- keyboard.c	Mon Jan 22 13:59:38 2007
***************
*** 1020,1027 ****
      /* function keys */
      VK_F1, VK_F2,
      VK_F3, VK_F4, VK_F5, VK_F6, VK_F7, VK_F8, VK_F9, VK_F10,    /* FFC0 */
!     VK_F11, VK_F12, VK_F13, VK_F14, VK_F15, VK_F16, 0, 0,       /* FFC8 */
!     0, 0, 0, 0, 0, 0, 0, 0,                                     /* FFD0 */
      0, 0, 0, 0, 0, 0, 0, 0,                                     /* FFD8 */
      /* modifier keys */
      0, VK_SHIFT, VK_SHIFT, VK_CONTROL,                          /* FFE0 */
--- 1020,1027 ----
      /* function keys */
      VK_F1, VK_F2,
      VK_F3, VK_F4, VK_F5, VK_F6, VK_F7, VK_F8, VK_F9, VK_F10,    /* FFC0 */
!     VK_F11, VK_F12, VK_F13, VK_F14, VK_F15, VK_F16, VK_F17, VK_F18,  /* FFC8 */
!     VK_F19, VK_F20, VK_F21, VK_F22, VK_F23, VK_F24, 0, 0,       /* FFD0 */
      0, 0, 0, 0, 0, 0, 0, 0,                                     /* FFD8 */
      /* modifier keys */
      0, VK_SHIFT, VK_SHIFT, VK_CONTROL,                          /* FFE0 */
***************
*** 1066,1073 ****
      /* function keys */
      0x3B, 0x3C,
      0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44,              /* FFC0 */
!     0x57, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FFC8 */
!     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FFD0 */
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FFD8 */
      /* modifier keys */
      0x00, 0x2A, 0x36, 0x1D, 0x11D, 0x3A, 0x00, 0x38,             /* FFE0 */
--- 1066,1073 ----
      /* function keys */
      0x3B, 0x3C,
      0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44,              /* FFC0 */
!     0x57, 0x58, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,              /* FFC8 */
!     0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x76, 0x00, 0x00,              /* FFD0 */
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FFD8 */
      /* modifier keys */
      0x00, 0x2A, 0x36, 0x1D, 0x11D, 0x3A, 0x00, 0x38,             /* FFE0 */
***************
*** 1465,1471 ****
  	if ( event->type == KeyRelease ) dwFlags |= KEYEVENTF_KEYUP;
  	if ( vkey & 0x100 )              dwFlags |= KEYEVENTF_EXTENDEDKEY;
  
!         X11DRV_send_keyboard_input( vkey & 0xff, bScan, dwFlags, event_time, 0, 0 );
      }
     }
  }
--- 1465,1499 ----
  	if ( event->type == KeyRelease ) dwFlags |= KEYEVENTF_KEYUP;
  	if ( vkey & 0x100 )              dwFlags |= KEYEVENTF_EXTENDEDKEY;
  
! 	if ((vkey & 0xFF) >= VK_F13 && (vkey & 0xFF) <= VK_F24) {
! 		/* translate to control-alt-F(N-12) */
! 		vkey = vkey - 12;
! 		if (event->type != KeyRelease) {
! 			X11DRV_send_keyboard_input(VK_MENU, 0, 0, event_time, 0, 0 );
! 			X11DRV_send_keyboard_input(VK_CONTROL, 0, 0, event_time, 0, 0 );
! 		}
! 		X11DRV_send_keyboard_input( vkey & 0xff, bScan, dwFlags, event_time, 0, 0 );
! 		if (event->type != KeyRelease) {
! 			X11DRV_send_keyboard_input(VK_CONTROL, 0, KEYEVENTF_KEYUP, event_time, 0, 0 );
! 			X11DRV_send_keyboard_input(VK_MENU, 0, KEYEVENTF_KEYUP, event_time, 0, 0 );
! 		}
! 	} else if ((vkey & 0xFF) >= VK_F25 && (vkey & 0xFF) <= VK_F32) {
! 		/* translate to control-alt-F(N-12) */
! 		vkey = vkey - 24;
! 		if (event->type != KeyRelease) {
! 			X11DRV_send_keyboard_input(VK_MENU, 0, 0, event_time, 0, 0 );
! 			X11DRV_send_keyboard_input(VK_CONTROL, 0, 0, event_time, 0, 0 );
! 			X11DRV_send_keyboard_input(VK_SHIFT, 0, 0, event_time, 0, 0 );
! 		}
! 		X11DRV_send_keyboard_input( vkey & 0xff, bScan, dwFlags, event_time, 0, 0 );
! 		if (event->type != KeyRelease) {
! 			X11DRV_send_keyboard_input(VK_SHIFT, 0, KEYEVENTF_KEYUP, event_time, 0, 0 );
! 			X11DRV_send_keyboard_input(VK_CONTROL, 0, KEYEVENTF_KEYUP, event_time, 0, 0 );
! 			X11DRV_send_keyboard_input(VK_MENU, 0, KEYEVENTF_KEYUP, event_time, 0, 0 );
! 		}
! 	} else {
! 		X11DRV_send_keyboard_input( vkey & 0xff, bScan, dwFlags, event_time, 0, 0 );
! 	}
      }
     }
  }
***************
*** 2253,2260 ****
              function keys. Soooo.. We will leave the table alone and
              fudge the lookup here till the other part is found and fixed!!! */
  
!   if ( ((scanCode >= 0x13b) && (scanCode <= 0x144)) ||
!        (scanCode == 0x157) || (scanCode == 0x158))
      scanCode &= 0xff;   /* remove "extended-key" flag for Fx keys */
  
    /* let's do scancode -> keycode -> keysym -> String */
--- 2281,2290 ----
              function keys. Soooo.. We will leave the table alone and
              fudge the lookup here till the other part is found and fixed!!! */
  
!   if (((scanCode >= 0x13b) && (scanCode <= 0x144)) ||
!       ((scanCode >= 0x164) && (scanCode <= 0x16e)) ||
!        (scanCode == 0x157) || (scanCode == 0x158)  ||
!        (scanCode == 0x176))
      scanCode &= 0xff;   /* remove "extended-key" flag for Fx keys */
  
    /* let's do scancode -> keycode -> keysym -> String */



More information about the wine-devel mailing list