Skip to content

Commit cb69d25

Browse files
Merge pull request #17739 from zoltanvb/linuxraw_keyboard
Extend keyboard input for linuxraw input driver
2 parents a3b690e + 5b29049 commit cb69d25

File tree

1 file changed

+30
-7
lines changed

1 file changed

+30
-7
lines changed

input/drivers/linuxraw_input.c

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

249271
static 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

255278
input_driver_t input_linuxraw = {

0 commit comments

Comments
 (0)