Added initial framework for RAM watch window.

This commit is contained in:
Matthew Budd 2020-05-05 23:08:50 -04:00
parent d1fd5a8e2d
commit 19deda1314
1 changed files with 289 additions and 0 deletions

View File

@ -74,6 +74,10 @@ static bool wasPausedByCheats = false;
static bool pauseWhileCheatsActv = false;
static bool cheatWindowOpen = false;
//-----------------------------------------
// Ram Watch static variables
static GtkTreeStore *ram_watch_store = NULL;
// check to see if a particular GTK version is available
// 2.24 is required for most of the dialogs -- ie: checkGTKVersion(2,24);
bool checkGTKVersion(int major_required, int minor_required)
@ -2186,6 +2190,289 @@ static void openCheatsWindow(void)
cheatWindowOpen = true;
}
//*******************************************************************************************************
// Ram Watch Window
//*******************************************************************************************************
static void openWatchFile()
{
GtkWidget* fileChooser;
GtkFileFilter* filterWch;
GtkFileFilter* filterAll;
filterWch = gtk_file_filter_new();
gtk_file_filter_add_pattern(filterWch, "*.wch");
gtk_file_filter_add_pattern(filterWch, "*.WCH");
gtk_file_filter_set_name(filterWch, "Watch files");
filterAll = gtk_file_filter_new();
gtk_file_filter_add_pattern(filterAll, "*");
gtk_file_filter_set_name(filterAll, "All Files");
const char* last_dir;
g_config->getOption("SDL.LastSaveStateAs", &last_dir);
fileChooser = gtk_file_chooser_dialog_new ("Open Watch File", GTK_WINDOW(MainWindow),
GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL);
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(fileChooser), last_dir);
gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER(fileChooser), ".wch");
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(fileChooser), filterWch);
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(fileChooser), filterAll);
if (gtk_dialog_run (GTK_DIALOG (fileChooser)) ==GTK_RESPONSE_ACCEPT)
{
char* filename;
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (fileChooser));
//FCEUI_SaveState(filename);
//g_config->setOption("SDL.LastSaveStateAs", filename);
g_free(filename);
}
gtk_widget_destroy (fileChooser);
}
// Our menu, in the XML markup format used by GtkUIManager
static char* menuRamWatchXml =
"<ui>"
" <menubar name='Menubar'>"
" <menu action='FileMenuAction'>"
" <menuitem action='OpenWatchFile' />"
" <menuitem action='SaveWatchFile' />"
" </menu>"
" </menubar>"
"</ui>";
static GtkActionEntry ramWatch_entries[] = {
{"FileMenuAction", NULL, "_File"},
{"OpenWatchFile", GTK_STOCK_OPEN, "_Open Watch", NULL, NULL, G_CALLBACK(openWatchFile)},
{"SaveWatchFile", GTK_STOCK_SAVE_AS, "_Save Watch", NULL, NULL, G_CALLBACK(openWatchFile)},
};
static GtkWidget* CreateRamWatchMenubar( GtkWidget* window)
{
GtkUIManager *ui_manager;
GtkActionGroup *action_group;
GtkAccelGroup* accel_group;
GError *error = NULL;
//GtkAction* state;
/* Make an UIManager (which makes a menubar). */
ui_manager = gtk_ui_manager_new ();
/* Add the menu items to the UIManager as a GtkActionGroup. */
action_group = gtk_action_group_new ("MenubarActions");
gtk_action_group_add_actions (action_group, ramWatch_entries, G_N_ELEMENTS (ramWatch_entries), NULL);
//gtk_action_group_add_toggle_actions (action_group, toggle_entries, G_N_ELEMENTS (toggle_entries), NULL);
//gtk_action_group_add_radio_actions (action_group, radio_entries, G_N_ELEMENTS (radio_entries), 0, G_CALLBACK(changeState), NULL);
gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
/* Read the menu layout from the XML markup. */
gtk_ui_manager_add_ui_from_string (ui_manager, menuRamWatchXml, -1, &error);
if (error)
{
fprintf (stderr, "Unable to create menu bar: %s\n", error->message);
g_error_free (error);
}
/* Attach the new accelerator group to the window. */
accel_group = gtk_ui_manager_get_accel_group (ui_manager);
gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
/* Get an action that can be used to change the active state slot selection. */
//state = gtk_action_group_get_action (action_group, "State0Action");
//if (state && GTK_IS_RADIO_ACTION (state))
// stateSlot = GTK_RADIO_ACTION (state);
/* Finally, return the actual menu bar created by the UIManager. */
return gtk_ui_manager_get_widget (ui_manager, "/Menubar");
}
static int openRamWatchEntryDialog( char *name, int *addr, int *type )
{
int retval;
GtkWidget* win;
GtkWidget* vbox;
GtkWidget* hbox;
GtkWidget* label;
GtkWidget* chkbox;
GtkWidget* txt_entry_name;
GtkWidget* txt_entry_addr;
char stmp[32];
win = gtk_dialog_new_with_buttons("RAM Watch Entry",
GTK_WINDOW(MainWindow), (GtkDialogFlags)(GTK_DIALOG_DESTROY_WITH_PARENT),
GTK_STOCK_CLOSE,
GTK_RESPONSE_OK,
NULL);
gtk_window_set_default_size(GTK_WINDOW(win), 400, 200);
vbox = gtk_vbox_new(FALSE, 4);
label = gtk_label_new("Name:");
txt_entry_name = gtk_entry_new();
if ( name[0] != 0 ){
gtk_entry_set_text( GTK_ENTRY(txt_entry_name), name );
}
gtk_box_pack_start (GTK_BOX(vbox), label, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX(vbox), txt_entry_name, FALSE, TRUE, 0);
hbox = gtk_hbox_new(FALSE, 2);
label = gtk_label_new("Hex Address:");
txt_entry_addr = gtk_entry_new();
gtk_box_pack_start (GTK_BOX(vbox), label, FALSE, FALSE, 0);
label = gtk_label_new("0x");
sprintf( stmp, "%04x", *addr );
gtk_entry_set_max_length( GTK_ENTRY(txt_entry_addr), 4 );
gtk_entry_set_width_chars( GTK_ENTRY(txt_entry_addr), 4 );
gtk_entry_set_text( GTK_ENTRY(txt_entry_addr), stmp );
gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX(hbox), txt_entry_addr, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
chkbox = gtk_check_button_new_with_label("Value is Unsigned");
gtk_box_pack_start (GTK_BOX(vbox), chkbox, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(win))), vbox, TRUE, TRUE, 0);
gtk_widget_show_all(win);
retval = gtk_dialog_run(GTK_DIALOG(win));
if ( retval )
{
// FIXME - what error checking should be done here
}
strcpy( name, gtk_entry_get_text ( GTK_ENTRY(txt_entry_name) ) );
*addr = strtol( gtk_entry_get_text ( GTK_ENTRY(txt_entry_addr) ), NULL, 16 );
*type = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(chkbox) );
//printf("retval %i\n", retval );
gtk_widget_destroy(win);
return 0;
}
static void editRamWatch( GtkButton *button,
void *userData )
{
char name[256];
int addr = 0, type = 0;
name[0] = 0;
openRamWatchEntryDialog( name, &addr, &type );
printf("Edit RamWatch '%s' 0x%04x %i\n", name, addr, type);
}
static void removeRamWatch( GtkButton *button,
void *userData )
{
printf("Remove RamWatch\n");
}
static void newRamWatch( GtkButton *button,
void *userData )
{
char name[256];
int addr = 0, type = 0;
name[0] = 0;
openRamWatchEntryDialog( name, &addr, &type );
printf("New RamWatch '%s' 0x%04x %i\n", name, addr, type);
}
// creates and opens cheats window
static void openMemoryWatchWindow(void)
{
GtkWidget* win;
GtkWidget* main_vbox;
GtkWidget* hbox;
GtkWidget* vbox;
GtkWidget* button;
GtkWidget *tree;
GtkWidget *scroll;
GtkWidget* menubar;
win = gtk_dialog_new_with_buttons("RAM Watch",
GTK_WINDOW(MainWindow), (GtkDialogFlags)(GTK_DIALOG_DESTROY_WITH_PARENT),
GTK_STOCK_CLOSE,
GTK_RESPONSE_OK,
NULL);
gtk_window_set_default_size(GTK_WINDOW(win), 600, 600);
main_vbox = gtk_vbox_new(FALSE, 1);
menubar = CreateRamWatchMenubar(win);
gtk_box_pack_start (GTK_BOX(main_vbox), menubar, FALSE, TRUE, 0);
hbox = gtk_hbox_new(FALSE,2);
ram_watch_store = gtk_tree_store_new( 4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ram_watch_store));
GtkCellRenderer *renderer;
GtkTreeViewColumn* column;
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("Addr", renderer, "text", 0, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
column = gtk_tree_view_column_new_with_attributes("Value Dec", renderer, "text", 1, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
column = gtk_tree_view_column_new_with_attributes("Value Hex", renderer, "text", 2, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
column = gtk_tree_view_column_new_with_attributes("Notes", renderer, "text", 3, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
scroll = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_NEVER,
GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(scroll), tree);
gtk_box_pack_start(GTK_BOX(hbox), scroll, TRUE, TRUE, 5);
gtk_box_pack_start(GTK_BOX(main_vbox), hbox, TRUE, TRUE, 5);
vbox = gtk_vbox_new(FALSE, 3);
button = gtk_button_new_with_label("Edit");
gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 5);
g_signal_connect( button, "clicked",
G_CALLBACK (editRamWatch), (gpointer) NULL );
button = gtk_button_new_with_label("Remove");
gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 5);
g_signal_connect( button, "clicked",
G_CALLBACK (removeRamWatch), (gpointer) NULL );
button = gtk_button_new_with_label("New");
gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 5);
g_signal_connect( button, "clicked",
G_CALLBACK (newRamWatch), (gpointer) NULL );
gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 5);
gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(win))), main_vbox, TRUE, TRUE, 0);
g_signal_connect(win, "delete-event", G_CALLBACK(closeDialog), NULL);
g_signal_connect(win, "response", G_CALLBACK(closeDialog), NULL);
gtk_widget_show_all(win);
}
void recordMovie()
{
if(isloaded)
@ -3034,6 +3321,7 @@ static char* menuXml =
" </menu>"
" <menu action='ToolsMenuAction'>"
" <menuitem action='CheatsAction' />"
" <menuitem action='RamWatchAction' />"
" </menu>"
" <menu action='MovieMenuAction'>"
" <menuitem action='OpenMovieAction' />"
@ -3089,6 +3377,7 @@ static GtkActionEntry normal_entries[] = {
{"ToolsMenuAction", NULL, "_Tools"},
{"CheatsAction", "cheats-win", "_Cheats...", NULL, NULL, G_CALLBACK(openCheatsWindow)},
{"RamWatchAction", "ram-watch", "_RAM Watch...", NULL, NULL, G_CALLBACK(openMemoryWatchWindow)},
{"MovieMenuAction", NULL, "_Movie"},
{"OpenMovieAction", GTK_STOCK_OPEN, "_Open", "<shift>F7", NULL, G_CALLBACK(loadMovie)},