From 414163fd7a9b57371772498ed6c162227e2030a7 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Sat, 20 Jan 2024 18:34:33 +0100 Subject: [PATCH] Accept disabled keyboard or mouse The input manager assumed that if a controller was present, then both a key processor and a mouse processor were present. Remove this assumption, to support disabling keyboard and mouse separately. This prepares the introduction of new command line options --keyboard and --mouse. --- app/src/input_manager.c | 55 ++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/app/src/input_manager.c b/app/src/input_manager.c index 8e7a6402..7186186f 100644 --- a/app/src/input_manager.c +++ b/app/src/input_manager.c @@ -52,8 +52,11 @@ is_shortcut_mod(struct sc_input_manager *im, uint16_t sdl_mod) { void sc_input_manager_init(struct sc_input_manager *im, const struct sc_input_manager_params *params) { - assert(!params->controller || (params->kp && params->kp->ops)); - assert(!params->controller || (params->mp && params->mp->ops)); + // A key/mouse processor may not be present if there is no controller + assert((!params->kp && !params->mp) || params->controller); + // A processor must have ops initialized + assert(!params->kp || params->kp->ops); + assert(!params->mp || params->mp->ops); im->controller = params->controller; im->fp = params->fp; @@ -89,7 +92,7 @@ sc_input_manager_init(struct sc_input_manager *im, static void send_keycode(struct sc_input_manager *im, enum android_keycode keycode, enum sc_action action, const char *name) { - assert(im->controller); + assert(im->controller && im->kp); // send DOWN event struct sc_control_msg msg; @@ -146,7 +149,7 @@ action_menu(struct sc_input_manager *im, enum sc_action action) { static void press_back_or_turn_screen_on(struct sc_input_manager *im, enum sc_action action) { - assert(im->controller); + assert(im->controller && im->kp); struct sc_control_msg msg; msg.type = SC_CONTROL_MSG_TYPE_BACK_OR_SCREEN_ON; @@ -197,7 +200,7 @@ collapse_panels(struct sc_input_manager *im) { static bool get_device_clipboard(struct sc_input_manager *im, enum sc_copy_key copy_key) { - assert(im->controller); + assert(im->controller && im->kp); struct sc_control_msg msg; msg.type = SC_CONTROL_MSG_TYPE_GET_CLIPBOARD; @@ -214,7 +217,7 @@ get_device_clipboard(struct sc_input_manager *im, enum sc_copy_key copy_key) { static bool set_device_clipboard(struct sc_input_manager *im, bool paste, uint64_t sequence) { - assert(im->controller); + assert(im->controller && im->kp); char *text = SDL_GetClipboardText(); if (!text) { @@ -274,7 +277,7 @@ switch_fps_counter_state(struct sc_input_manager *im) { static void clipboard_paste(struct sc_input_manager *im) { - assert(im->controller); + assert(im->controller && im->kp); char *text = SDL_GetClipboardText(); if (!text) { @@ -412,28 +415,28 @@ sc_input_manager_process_key(struct sc_input_manager *im, enum sc_action action = down ? SC_ACTION_DOWN : SC_ACTION_UP; switch (keycode) { case SDLK_h: - if (control && !shift && !repeat) { + if (im->kp && !shift && !repeat) { action_home(im, action); } return; case SDLK_b: // fall-through case SDLK_BACKSPACE: - if (control && !shift && !repeat) { + if (im->kp && !shift && !repeat) { action_back(im, action); } return; case SDLK_s: - if (control && !shift && !repeat) { + if (im->kp && !shift && !repeat) { action_app_switch(im, action); } return; case SDLK_m: - if (control && !shift && !repeat) { + if (im->kp && !shift && !repeat) { action_menu(im, action); } return; case SDLK_p: - if (control && !shift && !repeat) { + if (im->kp && !shift && !repeat) { action_power(im, action); } return; @@ -451,7 +454,7 @@ sc_input_manager_process_key(struct sc_input_manager *im, apply_orientation_transform(im, SC_ORIENTATION_FLIP_180); } - } else if (control) { + } else if (im->kp) { // forward repeated events action_volume_down(im, action); } @@ -462,7 +465,7 @@ sc_input_manager_process_key(struct sc_input_manager *im, apply_orientation_transform(im, SC_ORIENTATION_FLIP_180); } - } else if (control) { + } else if (im->kp) { // forward repeated events action_volume_up(im, action); } @@ -490,17 +493,17 @@ sc_input_manager_process_key(struct sc_input_manager *im, } return; case SDLK_c: - if (control && !shift && !repeat && down) { + if (im->kp && !shift && !repeat && down) { get_device_clipboard(im, SC_COPY_KEY_COPY); } return; case SDLK_x: - if (control && !shift && !repeat && down) { + if (im->kp && !shift && !repeat && down) { get_device_clipboard(im, SC_COPY_KEY_CUT); } return; case SDLK_v: - if (control && !repeat && down) { + if (im->kp && !repeat && down) { if (shift || im->legacy_paste) { // inject the text as input events clipboard_paste(im); @@ -552,7 +555,7 @@ sc_input_manager_process_key(struct sc_input_manager *im, return; } - if (!control) { + if (!im->kp) { return; } @@ -685,7 +688,7 @@ sc_input_manager_process_mouse_button(struct sc_input_manager *im, if (control) { enum sc_action action = down ? SC_ACTION_DOWN : SC_ACTION_UP; - if (event->button == SDL_BUTTON_X1) { + if (im->kp && event->button == SDL_BUTTON_X1) { action_app_switch(im, action); return; } @@ -697,11 +700,11 @@ sc_input_manager_process_mouse_button(struct sc_input_manager *im, } return; } - if (event->button == SDL_BUTTON_RIGHT) { + if (im->kp && event->button == SDL_BUTTON_RIGHT) { press_back_or_turn_screen_on(im, action); return; } - if (event->button == SDL_BUTTON_MIDDLE) { + if (im->kp && event->button == SDL_BUTTON_MIDDLE) { action_home(im, action); return; } @@ -725,7 +728,7 @@ sc_input_manager_process_mouse_button(struct sc_input_manager *im, // otherwise, send the click event to the device } - if (!control) { + if (!im->mp) { return; } @@ -865,7 +868,7 @@ sc_input_manager_handle_event(struct sc_input_manager *im, bool control = im->controller; switch (event->type) { case SDL_TEXTINPUT: - if (!control) { + if (!im->kp) { break; } sc_input_manager_process_text_input(im, &event->text); @@ -877,13 +880,13 @@ sc_input_manager_handle_event(struct sc_input_manager *im, sc_input_manager_process_key(im, &event->key); break; case SDL_MOUSEMOTION: - if (!control) { + if (!im->mp) { break; } sc_input_manager_process_mouse_motion(im, &event->motion); break; case SDL_MOUSEWHEEL: - if (!control) { + if (!im->mp) { break; } sc_input_manager_process_mouse_wheel(im, &event->wheel); @@ -897,7 +900,7 @@ sc_input_manager_handle_event(struct sc_input_manager *im, case SDL_FINGERMOTION: case SDL_FINGERDOWN: case SDL_FINGERUP: - if (!control) { + if (!im->mp) { break; } sc_input_manager_process_touch(im, &event->tfinger);