From 72315fa33939df1c9c7c909895c2c68ae9c45359 Mon Sep 17 00:00:00 2001 From: thesource Date: Thu, 10 Oct 2024 11:42:27 +0300 Subject: [PATCH] Make gamepad key configuration non-blocking --- desmume/src/frontend/posix/gtk/main.cpp | 68 +++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index fe3b51105..5c6fb0bff 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -115,6 +115,7 @@ int real_framebuffer_height = GPU_FRAMEBUFFER_NATIVE_HEIGHT; desmume::config::Config config; +bool in_joy_config_mode = false; #ifdef GDB_STUB gdbstub_handle_t arm9_gdb_stub = NULL; @@ -2075,6 +2076,63 @@ static void Edit_Controls(GSimpleAction *action, GVariant *parameter, gpointer u } +static gboolean JoyKeyAcceptTimerFunc(gpointer data) +{ + if(!in_joy_config_mode) + return FALSE; + SDL_Event event; + u16 key; + bool done = FALSE; + while(SDL_PollEvent(&event) && !done) + { + switch(event.type) + { + case SDL_JOYBUTTONDOWN: + key = ((event.jbutton.which & 15) << 12) | JOY_BUTTON << 8 | (event.jbutton.button & 255); + done = TRUE; + break; + case SDL_JOYAXISMOTION: + if( ((u32)abs(event.jaxis.value) >> 14) != 0 ) + { + key = ((event.jaxis.which & 15) << 12) | JOY_AXIS << 8 | ((event.jaxis.axis & 127) << 1); + if (event.jaxis.value > 0) + key |= 1; + done = TRUE; + } + break; + case SDL_JOYHATMOTION: + if (event.jhat.value != SDL_HAT_CENTERED) { + key = ((event.jhat.which & 15) << 12) | JOY_HAT << 8 | ((event.jhat.hat & 63) << 2); + if ((event.jhat.value & SDL_HAT_UP) != 0) + key |= JOY_HAT_UP; + else if ((event.jhat.value & SDL_HAT_RIGHT) != 0) + key |= JOY_HAT_RIGHT; + else if ((event.jhat.value & SDL_HAT_DOWN) != 0) + key |= JOY_HAT_DOWN; + else if ((event.jhat.value & SDL_HAT_LEFT) != 0) + key |= JOY_HAT_LEFT; + done = TRUE; + } + break; + } + } + + if(done) { + struct modify_key_ctx *ctx = (struct modify_key_ctx*)data; + ctx->mk_key_chosen = key; + gchar* YouPressed = g_strdup_printf("You pressed : %d\nClick OK to keep this key.", ctx->mk_key_chosen); + gtk_label_set_text(GTK_LABEL(ctx->label), YouPressed); + g_free(YouPressed); + return FALSE; + } + return in_joy_config_mode; +} + +static void JoyKeyAcceptTimerStart(GtkWidget *w, GdkEventFocus *e, struct modify_key_ctx *ctx) +{ + g_timeout_add(200, JoyKeyAcceptTimerFunc, ctx); +} + static void AcceptNewJoyKey(GtkWidget *w, GdkEventFocus *e, struct modify_key_ctx *ctx) { gchar *YouPressed; @@ -2097,7 +2155,7 @@ static void Modify_JoyKey(GtkWidget* widget, gpointer data) Key = GPOINTER_TO_INT(data); /* Joypad keys start at 1 */ ctx.key_id = Key+1; - ctx.mk_key_chosen = 0; + ctx.mk_key_chosen = Keypad_Temp[Key]; Title = g_strdup_printf("Press \"%s\" key ...\n", key_names[Key]); mkDialog = gtk_dialog_new_with_buttons(Title, GTK_WINDOW(pWindow), @@ -2111,7 +2169,9 @@ static void Modify_JoyKey(GtkWidget* widget, gpointer data) gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(mkDialog))), ctx.label, TRUE, FALSE, 0); gtk_widget_show_all(gtk_dialog_get_content_area(GTK_DIALOG(mkDialog))); - g_signal_connect(G_OBJECT(mkDialog), "focus_in_event", G_CALLBACK(AcceptNewJoyKey), &ctx); + in_joy_config_mode = true; + g_signal_connect(G_OBJECT(mkDialog), "focus_in_event", G_CALLBACK(JoyKeyAcceptTimerStart), &ctx); + JoyKeyAcceptTimerFunc(&ctx); switch(gtk_dialog_run(GTK_DIALOG(mkDialog))) { case GTK_RESPONSE_OK: @@ -2125,6 +2185,7 @@ static void Modify_JoyKey(GtkWidget* widget, gpointer data) ctx.mk_key_chosen = 0; break; } + in_joy_config_mode = false; gtk_widget_destroy(mkDialog); @@ -2852,7 +2913,8 @@ gboolean EmuLoop(gpointer data) #endif /* Merge the joystick keys with the keyboard ones */ - process_joystick_events(&keys_latch); + if(!in_joy_config_mode) + process_joystick_events(&keys_latch); /* Update! */ update_keypad(keys_latch);