Skip to content

Instantly share code, notes, and snippets.

@steleto
Created January 28, 2014 17:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save steleto/8671862 to your computer and use it in GitHub Desktop.
Save steleto/8671862 to your computer and use it in GitHub Desktop.
Index: xwindow/fb/x_display_wscons.c
==================================================================
--- xwindow/fb/x_display_wscons.c
+++ xwindow/fb/x_display_wscons.c
@@ -36,10 +36,12 @@
static int wskbd_repeat_wait = (DEFAULT_KEY_REPEAT_1 + KEY_REPEAT_UNIT - 1) / KEY_REPEAT_UNIT ;
int wskbd_repeat_1 = DEFAULT_KEY_REPEAT_1 ;
int wskbd_repeat_N = DEFAULT_KEY_REPEAT_N ;
#endif
static int orig_console_mode = WSDISPLAYIO_MODE_EMUL ; /* 0 */
+static int wskbd_mode_switch = 0 ;
+static int wskbd_capslock = 0 ;
/* --- static functions --- */
/* For iBus which requires ps/2 keycode. */
@@ -188,24 +190,66 @@
static void
process_wskbd_event(
struct wscons_event * ev
)
{
+ keysym_t *group ;
keysym_t ksym ;
if( keymap.map[ev->value].command == KS_Cmd_ResetEmul)
{
/* XXX */
ksym = XK_BackSpace ;
+ }
+ else if( wskbd_mode_switch)
+ {
+ group = keymap.map[ev->value].group2 ;
+ }
+ else
+ {
+ group = keymap.map[ev->value].group1 ;
+ }
+
+ if( (_display.lock_state & NLKED) &&
+ KS_GROUP(group[1]) == KS_GROUP_Keypad)
+ {
+ if( _display.key_state & ShiftMask)
+ {
+ ksym = group[0];
+ }
+ else
+ {
+ ksym = group[1];
+ }
+ }
+ else if ( wskbd_capslock)
+ {
+ if( _display.key_state & ShiftMask)
+ {
+ ksym = group[1];
+ }
+ else
+ {
+ ksym = group[0];
+ }
+ if( KS_a <= ksym && ksym <= KS_z)
+ {
+ ksym += KS_A - KS_a;
+ }
+ else if( KS_agrave <= ksym && ksym <= KS_thorn &&
+ ksym != KS_division)
+ {
+ ksym += KS_Agrave - KS_agrave;
+ }
}
else if( _display.key_state & ShiftMask)
{
- ksym = keymap.map[ev->value].group1[1] ;
+ ksym = group[1];
}
else
{
- ksym = keymap.map[ev->value].group1[0] ;
+ ksym = group[0];
}
if( KS_f1 <= ksym && ksym <= KS_f20)
{
/* KS_f1 => KS_F1 */
@@ -219,18 +263,11 @@
{
_display.key_state |= ShiftMask ;
}
else if( ksym == KS_Caps_Lock)
{
- if( _display.key_state & ShiftMask)
- {
- _display.key_state &= ~ShiftMask ;
- }
- else
- {
- _display.key_state |= ShiftMask ;
- }
+ wskbd_capslock ^= 1 ;
}
else if( ksym == KS_Control_R ||
ksym == KS_Control_L)
{
_display.key_state |= ControlMask ;
@@ -237,10 +274,14 @@
}
else if( ksym == KS_Alt_R ||
ksym == KS_Alt_L)
{
_display.key_state |= ModMask ;
+ }
+ else if( ksym == KS_Mode_switch)
+ {
+ wskbd_mode_switch = 1 ;
}
else if( ksym == KS_Num_Lock)
{
_display.lock_state ^= NLKED ;
}
@@ -277,10 +318,14 @@
}
else if( ksym == KS_Alt_R ||
ksym == KS_Alt_L)
{
_display.key_state &= ~ModMask ;
+ }
+ else if( ksym == KS_Mode_switch)
+ {
+ wskbd_mode_switch = 0 ;
}
else if( ev->value == prev_key_event.value)
{
prev_key_event.value = 0 ;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment