1.1 --- a/src/gui/gtkui.c Wed Oct 17 11:26:45 2007 +0000
1.2 +++ b/src/gui/gtkui.c Sun Oct 21 05:21:35 2007 +0000
1.5 - * $Id: gtkui.c,v 1.4 2007-10-17 11:26:45 nkeynes Exp $
1.6 + * $Id: gtkui.c,v 1.5 2007-10-21 05:21:35 nkeynes Exp $
1.8 * Core GTK-based user interface
1.10 @@ -44,11 +44,144 @@
1.11 static mmio_window_t mmio_win = NULL;
1.14 + * UIManager and action helpers
1.16 +static GtkUIManager *global_ui_manager;
1.17 +static GtkAccelGroup *global_accel_group;
1.18 +static GtkActionGroup *global_action_group;
1.21 * Count of running nanoseconds - used to cut back on the GUI runtime
1.23 static uint32_t gtk_gui_nanos = 0;
1.24 static struct timeval gtk_gui_lasttv;
1.27 +#define ENABLE_ACTION(win,name) SET_ACTION_ENABLED(win,name,TRUE)
1.28 +#define DISABLE_ACTION(win,name) SET_ACTION_ENABLED(win,name,FALSE)
1.31 +static const GtkActionEntry ui_actions[] = {
1.32 + { "FileMenu", NULL, "_File" },
1.33 + { "SettingsMenu", NULL, "_Settings" },
1.34 + { "HelpMenu", NULL, "_Help" },
1.35 + { "Mount", GTK_STOCK_CDROM, "_Mount...", "<control>O", "Mount a cdrom disc", G_CALLBACK(mount_action_callback) },
1.36 + { "Reset", GTK_STOCK_REFRESH, "_Reset", "<control>R", "Reset dreamcast", G_CALLBACK(reset_action_callback) },
1.37 + { "Pause", GTK_STOCK_MEDIA_PAUSE, "_Pause", NULL, "Pause dreamcast", G_CALLBACK(pause_action_callback) },
1.38 + { "Run", GTK_STOCK_MEDIA_PLAY, "Resume", NULL, "Resume", G_CALLBACK(resume_action_callback) },
1.39 + { "LoadState", GTK_STOCK_REVERT_TO_SAVED, "_Load state...", "F4", "Load an lxdream save state", G_CALLBACK(load_state_action_callback) },
1.40 + { "SaveState", GTK_STOCK_SAVE_AS, "_Save state...", "F3", "Create an lxdream save state", G_CALLBACK(save_state_action_callback) },
1.41 + { "Exit", GTK_STOCK_QUIT, "E_xit", NULL, "Exit lxdream", G_CALLBACK(exit_action_callback) },
1.42 + { "PathSettings", NULL, "_Paths...", NULL, "Configure files and paths", G_CALLBACK(path_settings_callback) },
1.43 + { "AudioSettings", NULL, "_Audio...", NULL, "Configure audio output", G_CALLBACK(audio_settings_callback) },
1.44 + { "ControllerSettings", NULL, "_Controllers...", NULL, "Configure controllers", G_CALLBACK(maple_settings_callback) },
1.45 + { "NetworkSettings", NULL, "_Network...", NULL, "Configure network settings", G_CALLBACK(network_settings_callback) },
1.46 + { "VideoSettings", NULL, "_Video...", NULL, "Configure video output", G_CALLBACK(video_settings_callback) },
1.47 + { "About", GTK_STOCK_ABOUT, "_About...", NULL, "About lxdream", G_CALLBACK(about_action_callback) },
1.48 + { "DebugMenu", NULL, "_Debug" },
1.49 + { "Debugger", NULL, "_Debugger", NULL, "Open debugger window", G_CALLBACK(debugger_action_callback) },
1.50 + { "DebugMem", NULL, "View _Memory", NULL, "View memory dump", G_CALLBACK(debug_memory_action_callback) },
1.51 + { "DebugMmio", NULL, "View IO _Registers", NULL, "View MMIO Registers", G_CALLBACK(debug_mmio_action_callback) },
1.52 + { "SaveScene", NULL, "_Save Scene", NULL, "Save next rendered scene", G_CALLBACK(save_scene_action_callback) },
1.53 + { "SingleStep", GTK_STOCK_REDO, "_Single Step", NULL, "Single step", G_CALLBACK(debug_step_action_callback) },
1.54 + { "RunTo", GTK_STOCK_GOTO_LAST, "Run _To", NULL, "Run to", G_CALLBACK( debug_runto_action_callback) },
1.55 + { "SetBreakpoint", GTK_STOCK_CLOSE, "_Breakpoint", NULL, "Toggle breakpoint", G_CALLBACK( debug_breakpoint_action_callback) }
1.57 +static const GtkToggleActionEntry ui_toggle_actions[] = {
1.58 + { "FullScreen", NULL, "_Full Screen", "<alt>Return", "Toggle full screen video", G_CALLBACK(fullscreen_toggle_callback), 0 },
1.61 +// Menus and toolbars
1.62 +static const char *ui_description =
1.64 + " <menubar name='MainMenu'>"
1.65 + " <menu action='FileMenu'>"
1.66 + " <menuitem action='Mount'/>"
1.68 + " <menuitem action='Reset'/>"
1.69 + " <menuitem action='Pause'/>"
1.70 + " <menuitem action='Run'/>"
1.71 + " <menuitem action='Debugger'/>"
1.73 + " <menuitem action='LoadState'/>"
1.74 + " <menuitem action='SaveState'/>"
1.76 + " <menuitem action='Exit'/>"
1.78 + " <menu action='SettingsMenu'>"
1.79 + " <menuitem action='PathSettings'/>"
1.80 + " <menuitem action='AudioSettings'/>"
1.81 + " <menuitem action='ControllerSettings'/>"
1.82 + " <menuitem action='NetworkSettings'/>"
1.83 + " <menuitem action='VideoSettings'/>"
1.85 + " <menuitem action='FullScreen'/>"
1.87 + " <menu action='HelpMenu'>"
1.88 + " <menuitem action='About'/>"
1.91 + " <toolbar name='MainToolbar'>"
1.92 + " <toolitem action='Mount'/>"
1.93 + " <toolitem action='Reset'/>"
1.94 + " <toolitem action='Pause'/>"
1.95 + " <toolitem action='Run'/>"
1.97 + " <toolitem action='LoadState'/>"
1.98 + " <toolitem action='SaveState'/>"
1.100 + " <menubar name='DebugMenu'>"
1.101 + " <menu action='FileMenu'>"
1.102 + " <menuitem action='Mount'/>"
1.104 + " <menuitem action='Reset'/>"
1.106 + " <menuitem action='LoadState'/>"
1.107 + " <menuitem action='SaveState'/>"
1.109 + " <menuitem action='Exit'/>"
1.111 + " <menu action='DebugMenu'>"
1.112 + " <menuitem action='DebugMem'/>"
1.113 + " <menuitem action='DebugMmio'/>"
1.114 + " <menuitem action='SaveScene'/>"
1.116 + " <menuitem action='SetBreakpoint'/>"
1.117 + " <menuitem action='Pause'/>"
1.118 + " <menuitem action='SingleStep'/>"
1.119 + " <menuitem action='RunTo'/>"
1.120 + " <menuitem action='Run'/>"
1.122 + " <menu action='SettingsMenu'>"
1.123 + " <menuitem action='PathSettings'/>"
1.124 + " <menuitem action='AudioSettings'/>"
1.125 + " <menuitem action='ControllerSettings'/>"
1.126 + " <menuitem action='NetworkSettings'/>"
1.127 + " <menuitem action='VideoSettings'/>"
1.129 + " <menuitem action='FullScreen'/>"
1.131 + " <menu action='HelpMenu'>"
1.132 + " <menuitem action='About'/>"
1.135 + " <toolbar name='DebugToolbar'>"
1.136 + " <toolitem action='Mount'/>"
1.137 + " <toolitem action='Reset'/>"
1.138 + " <toolitem action='Pause'/>"
1.140 + " <toolitem action='SingleStep'/>"
1.141 + " <toolitem action='RunTo'/>"
1.142 + " <toolitem action='Run'/>"
1.143 + " <toolitem action='SetBreakpoint'/>"
1.145 + " <toolitem action='LoadState'/>"
1.146 + " <toolitem action='SaveState'/>"
1.152 gboolean gui_parse_cmdline( int *argc, char **argv[] )
1.154 return gtk_init_check( argc, argv );
1.155 @@ -56,12 +189,34 @@
1.157 gboolean gui_init( gboolean withDebug )
1.159 + GError *error = NULL;
1.160 dreamcast_register_module( >k_gui_module );
1.161 gtk_gui_alloc_resources();
1.163 + global_action_group = gtk_action_group_new("MenuActions");
1.164 + gtk_action_group_add_actions( global_action_group, ui_actions, G_N_ELEMENTS(ui_actions), NULL );
1.165 + gtk_action_group_add_toggle_actions( global_action_group, ui_toggle_actions, G_N_ELEMENTS(ui_toggle_actions), NULL );
1.166 + gtk_gui_enable_action("AudioSettings", FALSE);
1.167 + gtk_gui_enable_action("NetworkSettings", FALSE);
1.168 + gtk_gui_enable_action("VideoSettings", FALSE);
1.169 + global_ui_manager = gtk_ui_manager_new();
1.170 + gtk_ui_manager_set_add_tearoffs(global_ui_manager, TRUE);
1.171 + gtk_ui_manager_insert_action_group( global_ui_manager, global_action_group, 0 );
1.173 + if (!gtk_ui_manager_add_ui_from_string (global_ui_manager, ui_description, -1, &error)) {
1.174 + g_message ("building menus failed: %s", error->message);
1.175 + g_error_free (error);
1.178 + GtkAccelGroup *accel_group = gtk_ui_manager_get_accel_group (global_ui_manager);
1.179 + GtkWidget *menubar = gtk_ui_manager_get_widget(global_ui_manager, "/MainMenu");
1.180 + GtkWidget *toolbar = gtk_ui_manager_get_widget(global_ui_manager, "/MainToolbar");
1.181 + main_win = main_window_new( APP_NAME " " APP_VERSION, menubar, toolbar, accel_group );
1.184 - debug_win = debug_window_new();
1.185 + gtk_gui_show_debugger();
1.187 - main_win = main_window_new( APP_NAME " " APP_VERSION );
1.192 @@ -99,9 +254,37 @@
1.194 debug_window_show(debug_win, TRUE);
1.196 - debug_win = debug_window_new();
1.197 + GtkAccelGroup *accel_group = gtk_ui_manager_get_accel_group (global_ui_manager);
1.198 + GtkWidget *menubar = gtk_ui_manager_get_widget(global_ui_manager, "/DebugMenu");
1.199 + GtkWidget *toolbar = gtk_ui_manager_get_widget(global_ui_manager, "/DebugToolbar");
1.200 + debug_win = debug_window_new( APP_NAME " " APP_VERSION " :: Debugger", menubar, toolbar, accel_group );
1.205 +void gtk_gui_show_mmio()
1.208 + mmio_window_show(mmio_win, TRUE);
1.210 + mmio_win = mmio_window_new( APP_NAME " " APP_VERSION " :: MMIO Registers" );
1.215 +main_window_t gtk_gui_get_main()
1.220 +debug_window_t gtk_gui_get_debugger()
1.222 + return debug_win;
1.225 +mmio_window_t gtk_gui_get_mmio()
1.230 GtkWidget *gtk_gui_get_renderarea()
1.232 @@ -141,7 +324,7 @@
1.234 mmio_win_update(mmio_win);
1.236 - dump_win_update_all();
1.237 + dump_window_update_all();
1.241 @@ -211,7 +394,7 @@
1.242 gui_fixed_font = pango_font_description_from_string("Courier 10");
1.245 -gint gtk_gui_run_property_dialog( const gchar *title, GtkWidget *panel )
1.246 +gint gtk_gui_run_property_dialog( const gchar *title, GtkWidget *panel, gtk_dialog_done_fn fn )
1.248 GtkWidget *dialog =
1.249 gtk_dialog_new_with_buttons(title, main_window_get_frame(main_win),
1.250 @@ -223,6 +406,14 @@
1.251 gtk_widget_show_all(panel);
1.252 gtk_container_add( GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), panel );
1.253 result = gtk_dialog_run( GTK_DIALOG(dialog) );
1.254 + if( fn != NULL ) {
1.255 + fn(panel, result == GTK_RESPONSE_ACCEPT);
1.257 gtk_widget_destroy( dialog );
1.261 +void gtk_gui_enable_action( const gchar *action, gboolean enable )
1.263 + gtk_action_set_sensitive( gtk_action_group_get_action( global_action_group, action), enable);