diff --git a/trunk/src/drivers/sdl/config.cpp b/trunk/src/drivers/sdl/config.cpp index 21f11c64..537a59c9 100644 --- a/trunk/src/drivers/sdl/config.cpp +++ b/trunk/src/drivers/sdl/config.cpp @@ -176,6 +176,7 @@ InitConfig() config->addOption("noframe", "SDL.NoFrame", 0); config->addOption("special", "SDL.SpecialFilter", 0); config->addOption("showfps", "SDL.ShowFPS", 0); + config->addOption("togglemenu", "SDL.ToggleMenu", 0); // OpenGL options config->addOption("opengl", "SDL.OpenGL", 0); diff --git a/trunk/src/drivers/sdl/gui.cpp b/trunk/src/drivers/sdl/gui.cpp index da3d1400..6955e1d2 100644 --- a/trunk/src/drivers/sdl/gui.cpp +++ b/trunk/src/drivers/sdl/gui.cpp @@ -48,8 +48,10 @@ GtkWidget* evbox = NULL; GtkWidget* padNoCombo = NULL; GtkWidget* configNoCombo = NULL; GtkWidget* buttonMappings[10]; +GtkWidget* Menubar; GtkRadioAction* stateSlot = NULL; bool gtkIsStarted = false; +bool menuTogglingEnabled; // check to see if a particular GTK version is available // 2.24 is required for most of the dialogs -- ie: checkGTKVersion(2,24); @@ -1399,6 +1401,14 @@ void enableFullscreen () ToggleFS(); } +void toggleMenuToggling (GtkToggleAction *action) +{ + bool toggleMenu = gtk_toggle_action_get_active(action); + + g_config->setOption("SDL.ToggleMenu", (int)toggleMenu); + menuTogglingEnabled = toggleMenu; +} + void toggleAutoResume (GtkToggleAction *action) { bool autoResume = gtk_toggle_action_get_active(action); @@ -2233,6 +2243,7 @@ static char* menuXml = " " " " " " + " " " " " " " " @@ -2319,6 +2330,7 @@ static GtkActionEntry normal_entries[] = { static GtkToggleActionEntry toggle_entries[] = { {"GameGenieToggleAction", NULL, "Enable Game _Genie", NULL, NULL, G_CALLBACK(toggleGameGenie), FALSE}, {"AutoResumeAction", NULL, "Auto-Resume Play", NULL, NULL, G_CALLBACK(toggleAutoResume), FALSE}, + {"ToggleMenuAction", NULL, "Toggle Menubar (alt)", NULL, NULL, G_CALLBACK(toggleMenuToggling), FALSE}, }; // Menu items for selecting a save state slot using radio buttons @@ -2393,6 +2405,28 @@ void showGui(bool b) gtk_widget_hide(MainWindow); } +gint handleKeyRelease(GtkWidget* w, GdkEvent* event, gpointer cb_data) +{ + if(menuTogglingEnabled) + { + static bool menuShown = true; + if(((GdkEventKey*)event)->keyval == GDK_KEY_Alt_L || ((GdkEventKey*)event)->keyval == GDK_KEY_Alt_R) + { + if(menuShown) + { + gtk_widget_hide(Menubar); + menuShown = false; + } + else + { + gtk_widget_show(Menubar); + menuShown = true; + } + } + } + return 0; +}; + int GtkMouseData[3] = {0,0,0}; gint handleMouseClick(GtkWidget* widget, GdkEvent *event, gpointer callback_data) @@ -2481,10 +2515,10 @@ void handle_resize(GtkWindow* win, GdkEvent* event, gpointer data) int InitGTKSubsystem(int argc, char** argv) { - GtkWidget* Menubar; GtkWidget* vbox; MainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_widget_set_events(GTK_WIDGET(MainWindow), GDK_KEY_RELEASE_MASK); // gtk_window_set_policy (GTK_WINDOW (MainWindow), FALSE, FALSE, TRUE); gtk_window_set_resizable(GTK_WINDOW(MainWindow), TRUE); gtk_window_set_title(GTK_WINDOW(MainWindow), FCEU_NAME_AND_VERSION); @@ -2536,6 +2570,7 @@ int InitGTKSubsystem(int argc, char** argv) g_signal_connect(G_OBJECT(evbox), "button-press-event", G_CALLBACK(handleMouseClick), NULL); g_signal_connect(G_OBJECT(evbox), "button-release-event", G_CALLBACK(handleMouseClick), NULL); + g_signal_connect(G_OBJECT(MainWindow), "key-release-event", G_CALLBACK(handleKeyRelease), NULL); // signal handlers g_signal_connect(MainWindow, "delete-event", quit, NULL);