From c5bd273a9a464b5264df4e20efc5271db4d9b286 Mon Sep 17 00:00:00 2001 From: thesource Date: Sun, 21 Sep 2025 19:26:25 +0300 Subject: [PATCH] Port commit 58bbe69 to GTK3 frontend --- desmume/src/frontend/posix/gtk/main.cpp | 18 +- desmume/src/frontend/posix/shared/gdksdl.cpp | 281 +++++++++++++++++++ 2 files changed, 297 insertions(+), 2 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index 8b65b10aa..50e129d00 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -53,6 +53,7 @@ #include "movie.h" #include "dTool.h" #include "../shared/desmume_config.h" +#include "../shared/gdksdl.cpp" #include "cheatsGTK.h" #include "frontend/modules/osd/agg/agg_osd.h" @@ -2046,7 +2047,11 @@ static void Edit_Controls(GSimpleAction *action, GVariant *parameter, gpointer u GtkWidget *ecDialog; GtkWidget *ecKey; gchar *Key_Label; + u32 keyboard_cfg_sdl[NB_KEYS]; int i; + + g_assert(sizeof(Keypad_Temp) == sizeof(keyboard_cfg) && + sizeof(keyboard_cfg) == sizeof(keyboard_cfg_sdl)); memcpy(&Keypad_Temp, &keyboard_cfg, sizeof(keyboard_cfg)); @@ -2069,8 +2074,17 @@ static void Edit_Controls(GSimpleAction *action, GVariant *parameter, gpointer u switch (gtk_dialog_run(GTK_DIALOG(ecDialog))) { case GTK_RESPONSE_OK: - memcpy(&keyboard_cfg, &Keypad_Temp, sizeof(keyboard_cfg)); - desmume_config_update_keys(keyfile); + /* convert keycodes to SDL for the cli frontend, since it has no config menu */ + for (i = 0; i < NB_KEYS; ++i) { + int sk = gdk_to_sdl_keycode(Keypad_Temp[i]); + /* if we don't know the keycode, chances are that SDL knows it anyways */ + if (sk == -1) sk = (u32) Keypad_Temp[i]; + keyboard_cfg_sdl[i] = sk; + } + memcpy(keyboard_cfg, keyboard_cfg_sdl, sizeof(keyboard_cfg)); + desmume_config_update_keys(keyfile, "SDLKEYS"); + memcpy(keyboard_cfg, Keypad_Temp, sizeof(keyboard_cfg)); + desmume_config_update_keys(keyfile, "KEYS"); break; case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_NONE: diff --git a/desmume/src/frontend/posix/shared/gdksdl.cpp b/desmume/src/frontend/posix/shared/gdksdl.cpp index e6f771ecb..7a1b0a85c 100644 --- a/desmume/src/frontend/posix/shared/gdksdl.cpp +++ b/desmume/src/frontend/posix/shared/gdksdl.cpp @@ -1,6 +1,286 @@ #include +#include #include +#if GTK_CHECK_VERSION(3, 0, 0) + +int gdk_to_sdl_keycode(int gdk_key) +{ + switch (gdk_key) + { + case GDK_KEY_BackSpace: + return SDLK_BACKSPACE; + case GDK_KEY_Tab: + return SDLK_TAB; + case GDK_KEY_Clear: + return SDLK_CLEAR; + case GDK_KEY_Return: + return SDLK_RETURN; + case GDK_KEY_Pause: + return SDLK_PAUSE; + case GDK_KEY_Escape: + return SDLK_ESCAPE; + case GDK_KEY_KP_Space: + return SDLK_SPACE; + case GDK_KEY_exclamdown: + return SDLK_EXCLAIM; + case GDK_KEY_quotedbl: + return SDLK_QUOTEDBL; + case GDK_KEY_numbersign: + return SDLK_HASH; + case GDK_KEY_dollar: + return SDLK_DOLLAR; + case GDK_KEY_ampersand: + return SDLK_AMPERSAND; + case GDK_KEY_quoteright: + return SDLK_QUOTE; + case GDK_KEY_parenleft: + return SDLK_LEFTPAREN; + case GDK_KEY_parenright: + return SDLK_RIGHTPAREN; + case GDK_KEY_asterisk: + return SDLK_ASTERISK; + case GDK_KEY_plus: + return SDLK_PLUS; + case GDK_KEY_comma: + return SDLK_COMMA; + case GDK_KEY_minus: + return SDLK_MINUS; + case GDK_KEY_period: + return SDLK_PERIOD; + case GDK_KEY_slash: + return SDLK_SLASH; + case GDK_KEY_0: + return SDLK_0; + case GDK_KEY_1: + return SDLK_1; + case GDK_KEY_2: + return SDLK_2; + case GDK_KEY_3: + return SDLK_3; + case GDK_KEY_4: + return SDLK_4; + case GDK_KEY_5: + return SDLK_5; + case GDK_KEY_6: + return SDLK_6; + case GDK_KEY_7: + return SDLK_7; + case GDK_KEY_8: + return SDLK_8; + case GDK_KEY_9: + return SDLK_9; + case GDK_KEY_colon: + return SDLK_COLON; + case GDK_KEY_semicolon: + return SDLK_SEMICOLON; + case GDK_KEY_less: + return SDLK_LESS; + case GDK_KEY_equal: + return SDLK_EQUALS; + case GDK_KEY_greater: + return SDLK_GREATER; + case GDK_KEY_question: + return SDLK_QUESTION; + case GDK_KEY_at: + return SDLK_AT; + case GDK_KEY_bracketleft: + return SDLK_LEFTBRACKET; + case GDK_KEY_backslash: + return SDLK_BACKSLASH; + case GDK_KEY_bracketright: + return SDLK_RIGHTBRACKET; + case GDK_KEY_asciicircum: + return SDLK_CARET; + case GDK_KEY_underscore: + return SDLK_UNDERSCORE; + case GDK_KEY_quoteleft: + return SDLK_BACKQUOTE; + case GDK_KEY_a: + return SDLK_a; + case GDK_KEY_b: + return SDLK_b; + case GDK_KEY_c: + return SDLK_c; + case GDK_KEY_d: + return SDLK_d; + case GDK_KEY_e: + return SDLK_e; + case GDK_KEY_f: + return SDLK_f; + case GDK_KEY_g: + return SDLK_g; + case GDK_KEY_h: + return SDLK_h; + case GDK_KEY_i: + return SDLK_i; + case GDK_KEY_j: + return SDLK_j; + case GDK_KEY_k: + return SDLK_k; + case GDK_KEY_l: + return SDLK_l; + case GDK_KEY_m: + return SDLK_m; + case GDK_KEY_n: + return SDLK_n; + case GDK_KEY_o: + return SDLK_o; + case GDK_KEY_p: + return SDLK_p; + case GDK_KEY_q: + return SDLK_q; + case GDK_KEY_r: + return SDLK_r; + case GDK_KEY_s: + return SDLK_s; + case GDK_KEY_t: + return SDLK_t; + case GDK_KEY_u: + return SDLK_u; + case GDK_KEY_v: + return SDLK_v; + case GDK_KEY_w: + return SDLK_w; + case GDK_KEY_x: + return SDLK_x; + case GDK_KEY_y: + return SDLK_y; + case GDK_KEY_z: + return SDLK_z; + case GDK_KEY_Delete: + return SDLK_DELETE; + case GDK_KEY_KP_0: + return SDLK_KP_0; + case GDK_KEY_KP_1: + return SDLK_KP_1; + case GDK_KEY_KP_2: + return SDLK_KP_2; + case GDK_KEY_KP_3: + return SDLK_KP_3; + case GDK_KEY_KP_4: + return SDLK_KP_4; + case GDK_KEY_KP_5: + return SDLK_KP_5; + case GDK_KEY_KP_6: + return SDLK_KP_6; + case GDK_KEY_KP_7: + return SDLK_KP_7; + case GDK_KEY_KP_8: + return SDLK_KP_8; + case GDK_KEY_KP_9: + return SDLK_KP_9; + case GDK_KEY_KP_Decimal: + return SDLK_KP_PERIOD; + case GDK_KEY_KP_Divide: + return SDLK_KP_DIVIDE; + case GDK_KEY_KP_Multiply: + return SDLK_KP_MULTIPLY; + case GDK_KEY_KP_Subtract: + return SDLK_KP_MINUS; + case GDK_KEY_KP_Add: + return SDLK_KP_PLUS; + case GDK_KEY_KP_Enter: + return SDLK_KP_ENTER; + case GDK_KEY_KP_Equal: + return SDLK_KP_EQUALS; + case GDK_KEY_Up: + return SDLK_UP; + case GDK_KEY_Down: + return SDLK_DOWN; + case GDK_KEY_Right: + return SDLK_RIGHT; + case GDK_KEY_Left: + return SDLK_LEFT; + case GDK_KEY_Insert: + return SDLK_INSERT; + case GDK_KEY_Home: + return SDLK_HOME; + case GDK_KEY_End: + return SDLK_END; + case GDK_KEY_Page_Up: + return SDLK_PAGEUP; + case GDK_KEY_Page_Down: + return SDLK_PAGEDOWN; + case GDK_KEY_F1: + return SDLK_F1; + case GDK_KEY_F2: + return SDLK_F2; + case GDK_KEY_F3: + return SDLK_F3; + case GDK_KEY_F4: + return SDLK_F4; + case GDK_KEY_F5: + return SDLK_F5; + case GDK_KEY_F6: + return SDLK_F6; + case GDK_KEY_F7: + return SDLK_F7; + case GDK_KEY_F8: + return SDLK_F8; + case GDK_KEY_F9: + return SDLK_F9; + case GDK_KEY_F10: + return SDLK_F10; + case GDK_KEY_F11: + return SDLK_F11; + case GDK_KEY_F12: + return SDLK_F12; + case GDK_KEY_F13: + return SDLK_F13; + case GDK_KEY_F14: + return SDLK_F14; + case GDK_KEY_F15: + return SDLK_F15; + case GDK_KEY_Num_Lock: + return SDLK_NUMLOCKCLEAR; + case GDK_KEY_Caps_Lock: + return SDLK_CAPSLOCK; + case GDK_KEY_Scroll_Lock: + return SDLK_SCROLLLOCK; + case GDK_KEY_Shift_R: + return SDLK_RSHIFT; + case GDK_KEY_Shift_L: + return SDLK_LSHIFT; + case GDK_KEY_Control_R: + return SDLK_RCTRL; + case GDK_KEY_Control_L: + return SDLK_LCTRL; + case GDK_KEY_Alt_R: + return SDLK_RALT; + case GDK_KEY_Alt_L: + return SDLK_LALT; + case GDK_KEY_Meta_R: + return SDLK_RGUI; + case GDK_KEY_Meta_L: + return SDLK_LGUI; + case GDK_KEY_Super_L: + return SDLK_LGUI; + case GDK_KEY_Super_R: + return SDLK_RGUI; + case GDK_KEY_Mode_switch: + return SDLK_MODE; + + + case GDK_KEY_Help: + return SDLK_HELP; + case GDK_KEY_Print: + return SDLK_PRINTSCREEN; + case GDK_KEY_Sys_Req: + return SDLK_SYSREQ; + case GDK_KEY_Break: + return SDLK_PAUSE; + case GDK_KEY_Menu: + return SDLK_MENU; + + default: + + return -1; + } +} + +#else + int gdk_to_sdl_keycode(int gdk_key) { switch (gdk_key) @@ -276,3 +556,4 @@ int gdk_to_sdl_keycode(int gdk_key) } } +#endif