@@ -98,7 +98,7 @@ static int16_t linuxraw_input_state(
9898 if (binds [port ][i ].valid )
9999 {
100100 if ( (binds [port ][i ].key && binds [port ][i ].key < RETROK_LAST )
101- && linuxraw -> state [rarch_keysym_lut [(enum retro_key )binds [port ][i ].key ]])
101+ && linuxraw -> state [rarch_keysym_lut [(enum retro_key )binds [port ][i ].key ] & 0X7F ])
102102 ret |= (1 << i );
103103 }
104104 }
@@ -112,7 +112,7 @@ static int16_t linuxraw_input_state(
112112 if (binds [port ][id ].valid )
113113 {
114114 if ( (binds [port ][id ].key && binds [port ][id ].key < RETROK_LAST )
115- && linuxraw -> state [rarch_keysym_lut [(enum retro_key )binds [port ][id ].key ]]
115+ && linuxraw -> state [rarch_keysym_lut [(enum retro_key )binds [port ][id ].key ] & 0X7F ]
116116 && (id == RARCH_GAME_FOCUS_TOGGLE || !keyboard_mapping_blocked )
117117 )
118118 return 1 ;
@@ -139,20 +139,27 @@ static int16_t linuxraw_input_state(
139139
140140 if (id_plus_valid && id_plus_key && id_plus_key < RETROK_LAST )
141141 {
142- unsigned sym = rarch_keysym_lut [(enum retro_key )id_plus_key ];
143- if (linuxraw -> state [sym ] & 0x80 )
142+ unsigned sym = rarch_keysym_lut [(enum retro_key )id_plus_key ] & 0X7F ;
143+ if (linuxraw -> state [sym ])
144144 ret = 0x7fff ;
145145 }
146146 if (id_minus_valid && id_minus_key && id_minus_key < RETROK_LAST )
147147 {
148- unsigned sym = rarch_keysym_lut [(enum retro_key )id_minus_key ];
149- if (linuxraw -> state [sym ] & 0x80 )
148+ unsigned sym = rarch_keysym_lut [(enum retro_key )id_minus_key ] & 0X7F ;
149+ if (linuxraw -> state [sym ])
150150 ret += -0x7fff ;
151151 }
152152
153153 return ret ;
154154 }
155155 break ;
156+ case RETRO_DEVICE_KEYBOARD :
157+ if (id && id < RETROK_LAST )
158+ {
159+ unsigned sym = rarch_keysym_lut [(enum retro_key )id ] & 0X7F ;
160+ return linuxraw -> state [sym ];
161+ }
162+ break ;
156163 }
157164
158165 return 0 ;
@@ -242,14 +249,30 @@ static void linuxraw_input_poll(void *data)
242249 if (!c )
243250 read (STDIN_FILENO , & t , 2 );
244251 else
252+ {
253+ unsigned keyboardcode = input_keymaps_translate_keysym_to_rk (c );
254+ uint16_t mod = 0 ;
255+
256+ if (linuxraw -> state [KEY_LEFTCTRL ] || linuxraw -> state [KEY_RIGHTCTRL ])
257+ mod |= RETROKMOD_CTRL ;
258+ if (linuxraw -> state [KEY_LEFTALT ] || linuxraw -> state [KEY_RIGHTALT ])
259+ mod |= RETROKMOD_ALT ;
260+ if (linuxraw -> state [KEY_LEFTSHIFT ] || linuxraw -> state [KEY_RIGHTSHIFT ])
261+ mod |= RETROKMOD_SHIFT ;
262+ if (linuxraw -> state [KEY_LEFTMETA ] || linuxraw -> state [KEY_RIGHTMETA ])
263+ mod |= RETROKMOD_META ;
264+
245265 linuxraw -> state [c ] = pressed ;
266+ input_keyboard_event (pressed , keyboardcode , keyboardcode , mod , RETRO_DEVICE_KEYBOARD );
267+ }
246268 }
247269}
248270
249271static uint64_t linuxraw_get_capabilities (void * data )
250272{
251273 return (1 << RETRO_DEVICE_JOYPAD )
252- | (1 << RETRO_DEVICE_ANALOG );
274+ | (1 << RETRO_DEVICE_ANALOG )
275+ | (1 << RETRO_DEVICE_KEYBOARD );
253276}
254277
255278input_driver_t input_linuxraw = {
0 commit comments