Moved RAM watch window logic to its own separate file.
This commit is contained in:
parent
309cb00f93
commit
57561ad563
|
@ -10,6 +10,7 @@ source_list = Split(
|
|||
input.cpp
|
||||
cheat.cpp
|
||||
config.cpp
|
||||
ramwatch.cpp
|
||||
sdl.cpp
|
||||
sdl-joystick.cpp
|
||||
sdl-sound.cpp
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include "config.h"
|
||||
#include "cheat.h"
|
||||
#include "icon.xpm"
|
||||
#include "ramwatch.h"
|
||||
|
||||
#ifdef _S9XLUA_H
|
||||
#include "../../fceulua.h"
|
||||
|
@ -65,118 +66,6 @@ bool menuTogglingEnabled = false;
|
|||
|
||||
static GtkTreeStore *hotkey_store = NULL;
|
||||
|
||||
//-----------------------------------------
|
||||
// Ram Watch static variables
|
||||
static GtkTreeStore *ram_watch_store = NULL;
|
||||
static gint ramWatchEvntSrcID = 0;
|
||||
static bool ramWatchWinOpen = false;
|
||||
static int ramWatchEditRowIdx = -1;
|
||||
static int ramWatchEditColIdx = -1;
|
||||
|
||||
struct ramWatch_t
|
||||
{
|
||||
std::string name;
|
||||
int addr;
|
||||
int type;
|
||||
int size;
|
||||
|
||||
union {
|
||||
int8_t i8;
|
||||
uint8_t u8;
|
||||
int16_t i16;
|
||||
uint16_t u16;
|
||||
} val;
|
||||
|
||||
ramWatch_t(void)
|
||||
{
|
||||
addr = 0; type = 0; size = 0; val.u16 = 0;
|
||||
};
|
||||
|
||||
void updateMem(void)
|
||||
{
|
||||
if ( size == 1)
|
||||
{
|
||||
val.u8 = GetMem( addr );
|
||||
}
|
||||
else if ( size == 2)
|
||||
{
|
||||
val.u16 = GetMem( addr ) | (GetMem( addr+1 ) << 8);
|
||||
}
|
||||
else
|
||||
{
|
||||
val.u8 = GetMem( addr );
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
struct ramWatchList_t
|
||||
{
|
||||
|
||||
std::list <ramWatch_t*> ls;
|
||||
|
||||
ramWatchList_t(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
~ramWatchList_t(void)
|
||||
{
|
||||
ramWatch_t *rw;
|
||||
|
||||
while ( !ls.empty() )
|
||||
{
|
||||
rw = ls.front();
|
||||
|
||||
delete rw;
|
||||
|
||||
ls.pop_front();
|
||||
}
|
||||
}
|
||||
|
||||
size_t size(void){ return ls.size(); };
|
||||
|
||||
void add_entry( const char *name, int addr, int type, int size )
|
||||
{
|
||||
ramWatch_t *rw = new ramWatch_t;
|
||||
|
||||
rw->name.assign(name);
|
||||
rw->addr = addr;
|
||||
rw->type = type;
|
||||
rw->size = size;
|
||||
ls.push_back(rw);
|
||||
}
|
||||
|
||||
void updateMemoryValues(void)
|
||||
{
|
||||
ramWatch_t *rw;
|
||||
std::list <ramWatch_t*>::iterator it;
|
||||
|
||||
for (it=ls.begin(); it!=ls.end(); it++)
|
||||
{
|
||||
rw = *it;
|
||||
|
||||
rw->updateMem();
|
||||
}
|
||||
}
|
||||
|
||||
ramWatch_t *getIndex(size_t idx)
|
||||
{
|
||||
size_t i=0;
|
||||
std::list <ramWatch_t*>::iterator it;
|
||||
|
||||
for (it=ls.begin(); it!=ls.end(); it++)
|
||||
{
|
||||
if ( i == idx )
|
||||
{
|
||||
return *it;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
};
|
||||
static ramWatchList_t ramWatchList;
|
||||
|
||||
// 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)
|
||||
|
@ -1512,771 +1401,6 @@ void toggleAutoResume(GtkCheckMenuItem *item, gpointer user_data)
|
|||
AutoResumePlay = autoResume;
|
||||
}
|
||||
|
||||
//*******************************************************************************************************
|
||||
// Ram Watch Window
|
||||
//*******************************************************************************************************
|
||||
//
|
||||
static void showRamWatchResults(int reset)
|
||||
{
|
||||
int row=0;
|
||||
std::list <ramWatch_t*>::iterator it;
|
||||
GtkTreeIter iter;
|
||||
char addrStr[32], valStr1[16], valStr2[16];
|
||||
ramWatch_t *rw;
|
||||
|
||||
//if ( !reset )
|
||||
//{
|
||||
// if ( gtk_tree_model_get_iter_first( GTK_TREE_MODEL(ram_watch_store), &iter ) )
|
||||
// {
|
||||
// size_t treeSize = 1;
|
||||
|
||||
// while ( gtk_tree_model_iter_next( GTK_TREE_MODEL(ram_watch_store), &iter ) )
|
||||
// {
|
||||
// treeSize++;
|
||||
// }
|
||||
// if ( treeSize != ramWatchList.size() )
|
||||
// {
|
||||
// reset = 1;
|
||||
// }
|
||||
// //printf(" TreeSize: %zi RamWatchList.size: %zi \n", treeSize, ramWatchList.size() );
|
||||
// }
|
||||
//}
|
||||
|
||||
if ( reset )
|
||||
{
|
||||
gtk_tree_store_clear(ram_watch_store);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !gtk_tree_model_get_iter_first( GTK_TREE_MODEL(ram_watch_store), &iter ) )
|
||||
{
|
||||
gtk_tree_store_append( ram_watch_store, &iter, NULL); // aquire iter
|
||||
}
|
||||
}
|
||||
|
||||
for (it=ramWatchList.ls.begin(); it!=ramWatchList.ls.end(); it++)
|
||||
{
|
||||
rw = *it;
|
||||
sprintf( addrStr, "0x%04X", rw->addr );
|
||||
|
||||
if ( reset ){
|
||||
gtk_tree_store_append( ram_watch_store, &iter, NULL); // aquire iter
|
||||
}
|
||||
|
||||
rw->updateMem();
|
||||
|
||||
if ( rw->size == 2 )
|
||||
{
|
||||
if ( rw->type ){
|
||||
sprintf( valStr1, "%6u", rw->val.u16);
|
||||
} else {
|
||||
sprintf( valStr1, "%6i", rw->val.i16);
|
||||
}
|
||||
sprintf( valStr2, "0x%04X", rw->val.u16);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( rw->type ){
|
||||
sprintf( valStr1, "%6u", rw->val.u8);
|
||||
} else {
|
||||
sprintf( valStr1, "%6i", rw->val.i8);
|
||||
}
|
||||
sprintf( valStr2, "0x%02X", rw->val.u8);
|
||||
}
|
||||
|
||||
if ( row != ramWatchEditRowIdx )
|
||||
{
|
||||
gtk_tree_store_set(ram_watch_store, &iter,
|
||||
0, addrStr, 1, valStr1, 2, valStr2, 3, rw->name.c_str(),
|
||||
-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
//if ( ramWatchEditColIdx != 0 )
|
||||
//{
|
||||
// gtk_tree_store_set(ram_watch_store, &iter, 0, addrStr, -1 );
|
||||
//}
|
||||
|
||||
//if ( ramWatchEditColIdx != 1 )
|
||||
//{
|
||||
// gtk_tree_store_set(ram_watch_store, &iter, 1, valStr1, -1 );
|
||||
//}
|
||||
|
||||
//if ( ramWatchEditColIdx != 2 )
|
||||
//{
|
||||
// gtk_tree_store_set(ram_watch_store, &iter, 2, valStr2, -1 );
|
||||
//}
|
||||
|
||||
//if ( ramWatchEditColIdx != 3 )
|
||||
//{
|
||||
// gtk_tree_store_set(ram_watch_store, &iter, 3, rw->name.c_str(), -1 );
|
||||
//}
|
||||
}
|
||||
|
||||
if ( !reset )
|
||||
{
|
||||
if ( !gtk_tree_model_iter_next( GTK_TREE_MODEL(ram_watch_store), &iter ) )
|
||||
{
|
||||
gtk_tree_store_append( ram_watch_store, &iter, NULL); // aquire iter
|
||||
}
|
||||
}
|
||||
row++;
|
||||
}
|
||||
}
|
||||
|
||||
static void saveWatchFile( const char *filename )
|
||||
{
|
||||
int i;
|
||||
FILE *fp;
|
||||
const char *c;
|
||||
std::list <ramWatch_t*>::iterator it;
|
||||
ramWatch_t *rw;
|
||||
|
||||
fp = fopen( filename, "w");
|
||||
|
||||
if ( fp == NULL )
|
||||
{
|
||||
printf("Error: Failed to open file: %s\n", filename);
|
||||
return;
|
||||
}
|
||||
|
||||
for (it=ramWatchList.ls.begin(); it!=ramWatchList.ls.end(); it++)
|
||||
{
|
||||
rw = *it;
|
||||
|
||||
c = rw->name.c_str();
|
||||
|
||||
fprintf( fp, "0x%04x %c%i ", rw->addr, rw->type ? 'U' : 'S', rw->size);
|
||||
|
||||
i=0;
|
||||
fprintf( fp, "\"");
|
||||
while ( c[i] )
|
||||
{
|
||||
if ( c[i] == '"')
|
||||
{
|
||||
fprintf( fp, "\\%c", c[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf( fp, "%c", c[i]);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
fprintf( fp, "\"\n");
|
||||
}
|
||||
fclose(fp);
|
||||
|
||||
}
|
||||
|
||||
static void loadWatchFile( const char *filename )
|
||||
{
|
||||
FILE *fp;
|
||||
int i, j, a, t, s, literal;
|
||||
char line[512], stmp[512];
|
||||
ramWatch_t *rw;
|
||||
|
||||
fp = fopen( filename, "r");
|
||||
|
||||
if ( fp == NULL )
|
||||
{
|
||||
printf("Error: Failed to open file: %s\n", filename);
|
||||
return;
|
||||
}
|
||||
|
||||
while ( fgets( line, sizeof(line)-1, fp ) > 0)
|
||||
{
|
||||
a = -1; t = -1; s = -1;
|
||||
// Check for Comments
|
||||
i=0;
|
||||
while ( line[i] != 0 )
|
||||
{
|
||||
if ( literal )
|
||||
{
|
||||
literal = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( line[i] == '#')
|
||||
{
|
||||
line[i] = 0; break;
|
||||
}
|
||||
else if ( line[i] == '\\' )
|
||||
{
|
||||
literal = 1;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
i=0; j=0;
|
||||
while ( isspace(line[i]) ) i++;
|
||||
|
||||
if ( (line[i] == '0') && ( tolower(line[i+1]) == 'x') )
|
||||
{
|
||||
stmp[j] = '0'; j++; i++;
|
||||
stmp[j] = 'x'; j++; i++;
|
||||
|
||||
while ( isxdigit(line[i]) )
|
||||
{
|
||||
stmp[j] = line[i]; i++; j++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while ( isxdigit(line[i]) )
|
||||
{
|
||||
stmp[j] = line[i]; i++; j++;
|
||||
}
|
||||
}
|
||||
stmp[j] = 0;
|
||||
|
||||
if ( j == 0 ) continue;
|
||||
|
||||
a = strtol( stmp, NULL, 0);
|
||||
|
||||
while ( isspace(line[i]) ) i++;
|
||||
|
||||
t = line[i]; i++;
|
||||
s = line[i]; i++;
|
||||
|
||||
if ( (t != 'U') && (t != 'S') )
|
||||
{
|
||||
printf("Error: Invalid RAM Watch Byte Type: %c", t);
|
||||
continue;
|
||||
}
|
||||
if ( !isdigit(s) )
|
||||
{
|
||||
printf("Error: Invalid RAM Watch Byte Size: %c", s);
|
||||
continue;
|
||||
}
|
||||
s = s - '0';
|
||||
|
||||
if ( (s != 1) && (s != 2) && (s != 4) )
|
||||
{
|
||||
printf("Error: Invalid RAM Watch Byte Size: %i", s);
|
||||
continue;
|
||||
}
|
||||
|
||||
while ( isspace(line[i]) ) i++;
|
||||
|
||||
if ( line[i] == '"')
|
||||
{
|
||||
i++; j=0;
|
||||
literal = 0;
|
||||
while ( (line[i] != 0) )
|
||||
{
|
||||
if ( literal )
|
||||
{
|
||||
literal = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( line[i] == '"')
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if ( line[i] == '\\' )
|
||||
{
|
||||
literal = 1;
|
||||
}
|
||||
}
|
||||
if ( !literal ){
|
||||
stmp[j] = line[i]; j++;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
stmp[j] = 0;
|
||||
}
|
||||
rw = new ramWatch_t;
|
||||
|
||||
rw->addr = a;
|
||||
rw->type = (t == 'U') ? 1 : 0;
|
||||
rw->size = s;
|
||||
rw->name.assign( stmp );
|
||||
|
||||
ramWatchList.ls.push_back(rw);
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
|
||||
showRamWatchResults(1);
|
||||
}
|
||||
|
||||
static void openWatchFile( int mode )
|
||||
{
|
||||
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);
|
||||
|
||||
|
||||
if ( mode )
|
||||
{
|
||||
fileChooser = gtk_file_chooser_dialog_new ("Save Watch File", GTK_WINDOW(MainWindow),
|
||||
GTK_FILE_CHOOSER_ACTION_SAVE, "_Cancel", GTK_RESPONSE_CANCEL,
|
||||
"_Save", GTK_RESPONSE_ACCEPT, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
fileChooser = gtk_file_chooser_dialog_new ("Load Watch File", GTK_WINDOW(MainWindow),
|
||||
GTK_FILE_CHOOSER_ACTION_OPEN, "_Cancel", GTK_RESPONSE_CANCEL,
|
||||
"_Open", 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);
|
||||
if ( filename )
|
||||
{
|
||||
if ( mode )
|
||||
{
|
||||
saveWatchFile( filename );
|
||||
}
|
||||
else
|
||||
{
|
||||
loadWatchFile( filename );
|
||||
}
|
||||
g_free(filename);
|
||||
}
|
||||
}
|
||||
gtk_widget_destroy (fileChooser);
|
||||
}
|
||||
|
||||
static void loadRamWatchCB( GtkMenuItem *menuitem,
|
||||
gpointer user_data)
|
||||
{
|
||||
openWatchFile(0);
|
||||
}
|
||||
static void saveRamWatchCB( GtkMenuItem *menuitem,
|
||||
gpointer user_data)
|
||||
{
|
||||
openWatchFile(1);
|
||||
}
|
||||
|
||||
static GtkWidget* CreateRamWatchMenubar( GtkWidget* window)
|
||||
{
|
||||
GtkWidget *menubar, *menu, *item;
|
||||
|
||||
menubar = gtk_menu_bar_new();
|
||||
|
||||
item = gtk_menu_item_new_with_label("File");
|
||||
|
||||
gtk_menu_shell_append( GTK_MENU_SHELL(menubar), item );
|
||||
|
||||
menu = gtk_menu_new();
|
||||
|
||||
gtk_menu_item_set_submenu( GTK_MENU_ITEM(item), menu );
|
||||
|
||||
item = gtk_menu_item_new_with_label("Load Watch");
|
||||
|
||||
g_signal_connect( item, "activate", G_CALLBACK(loadRamWatchCB), NULL);
|
||||
|
||||
gtk_menu_shell_append( GTK_MENU_SHELL(menu), item );
|
||||
|
||||
item = gtk_menu_item_new_with_label("Save Watch");
|
||||
|
||||
g_signal_connect( item, "activate", G_CALLBACK(saveRamWatchCB), NULL);
|
||||
|
||||
gtk_menu_shell_append( GTK_MENU_SHELL(menu), item );
|
||||
|
||||
// Finally, return the actual menu bar created
|
||||
return menubar;
|
||||
}
|
||||
|
||||
static int openRamWatchEntryDialog( char *name, int *addr, int *type, int *size )
|
||||
{
|
||||
int retval;
|
||||
GtkWidget* win;
|
||||
GtkWidget* vbox;
|
||||
GtkWidget* hbox;
|
||||
GtkWidget* label;
|
||||
GtkWidget* chkbox;
|
||||
GtkWidget* button1, *button2, *button4;
|
||||
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),
|
||||
"_Close",
|
||||
GTK_RESPONSE_OK,
|
||||
NULL);
|
||||
gtk_window_set_default_size(GTK_WINDOW(win), 400, 200);
|
||||
|
||||
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
|
||||
|
||||
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_box_new(GTK_ORIENTATION_HORIZONTAL, 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);
|
||||
|
||||
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
|
||||
label = gtk_label_new("Size in Bytes:");
|
||||
button1 = gtk_radio_button_new_with_label (NULL, "1");
|
||||
//gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
|
||||
|
||||
gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 1);
|
||||
gtk_box_pack_start (GTK_BOX(hbox), button1, TRUE, FALSE, 1);
|
||||
|
||||
button2 = gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON (button1), "2");
|
||||
gtk_box_pack_start (GTK_BOX(hbox), button2, TRUE, FALSE, 1);
|
||||
|
||||
button4 = gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON (button1), "4");
|
||||
gtk_box_pack_start (GTK_BOX(hbox), button4, TRUE, FALSE, 1);
|
||||
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button1), TRUE);
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button2), FALSE);
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button4), FALSE);
|
||||
|
||||
gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, TRUE, 1);
|
||||
|
||||
gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(win))), vbox, TRUE, TRUE, 1);
|
||||
|
||||
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) );
|
||||
|
||||
if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(button4) ) )
|
||||
{
|
||||
*size = 4;
|
||||
}
|
||||
else if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(button2) ) )
|
||||
{
|
||||
*size = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
*size = 1;
|
||||
}
|
||||
|
||||
//printf("retval %i\n", retval );
|
||||
|
||||
g_signal_connect(win, "delete-event", G_CALLBACK(closeDialog), NULL);
|
||||
g_signal_connect(win, "response", G_CALLBACK(closeDialog), NULL);
|
||||
|
||||
gtk_widget_destroy(win);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void editRamWatch( GtkButton *button,
|
||||
void *userData )
|
||||
{
|
||||
char name[256];
|
||||
int addr = 0, type = 0, size = 0;
|
||||
name[0] = 0;
|
||||
openRamWatchEntryDialog( name, &addr, &type, &size );
|
||||
printf("Edit RamWatch '%s' 0x%04x %i %i\n", name, addr, type, size);
|
||||
}
|
||||
|
||||
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, size = 0;
|
||||
name[0] = 0;
|
||||
openRamWatchEntryDialog( name, &addr, &type, &size );
|
||||
printf("New RamWatch '%s' 0x%04x %i %i\n", name, addr, type, size);
|
||||
|
||||
ramWatchList.add_entry( name, addr, type, size );
|
||||
|
||||
showRamWatchResults(1);
|
||||
}
|
||||
|
||||
static gint updateRamWatchTree( void *userData )
|
||||
{
|
||||
//static uint32_t c = 0;
|
||||
//printf("RamWatch: %u\n", c++ );
|
||||
showRamWatchResults(0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void ramWatch_cell_edited_cb (
|
||||
GtkCellRendererText *cell,
|
||||
gchar *path_string,
|
||||
gchar *new_text,
|
||||
gpointer user_data)
|
||||
{
|
||||
ramWatch_t *rw;
|
||||
//printf("Ram Watch Edited: %i:%i\n", ramWatchEditRowIdx, ramWatchEditColIdx);
|
||||
|
||||
rw = ramWatchList.getIndex( ramWatchEditRowIdx );
|
||||
|
||||
switch ( (long)user_data )
|
||||
{
|
||||
case 0:
|
||||
rw->addr = strtol( new_text, NULL, 0 );
|
||||
break;
|
||||
case 1:
|
||||
case 2:
|
||||
{
|
||||
writefunc wfunc;
|
||||
|
||||
if ( rw->size == 2 )
|
||||
{
|
||||
if ( rw->type )
|
||||
{
|
||||
rw->val.u16 = strtol( new_text, NULL, 0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
rw->val.i16 = strtol( new_text, NULL, 0 );
|
||||
}
|
||||
wfunc = GetWriteHandler( rw->addr );
|
||||
|
||||
if ( wfunc )
|
||||
{
|
||||
wfunc( (uint32)rw->addr, (uint8)(rw->val.u16 & 0x00ff) );
|
||||
}
|
||||
|
||||
wfunc = GetWriteHandler( rw->addr+1 );
|
||||
|
||||
if ( wfunc )
|
||||
{
|
||||
wfunc( (uint32)rw->addr+1, (uint8)( (rw->val.u16 & 0xff00) >> 8) );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( rw->type )
|
||||
{
|
||||
rw->val.u8 = strtol( new_text, NULL, 0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
rw->val.i8 = strtol( new_text, NULL, 0 );
|
||||
}
|
||||
wfunc = GetWriteHandler( rw->addr );
|
||||
|
||||
if ( wfunc )
|
||||
{
|
||||
wfunc( (uint32)rw->addr, (uint8)rw->val.u8 );
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
rw->name.assign( new_text );
|
||||
break;
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
ramWatchEditRowIdx = -1;
|
||||
ramWatchEditColIdx = -1;
|
||||
}
|
||||
|
||||
static void ramWatch_cell_edited_start_cb(
|
||||
GtkCellRenderer *renderer,
|
||||
GtkCellEditable *editable,
|
||||
gchar *path,
|
||||
gpointer user_data)
|
||||
{
|
||||
//printf("Ram Watch Edit Start: '%s':%li\n", path, (long)user_data);
|
||||
ramWatchEditRowIdx = atoi( path );
|
||||
ramWatchEditColIdx = (long)user_data;
|
||||
}
|
||||
|
||||
static void ramWatch_cell_edited_cancel_cb(
|
||||
GtkCellRenderer *renderer,
|
||||
gpointer user_data)
|
||||
{
|
||||
//printf("Ram Watch Edit Cancel:%li\n", (long)user_data);
|
||||
ramWatchEditRowIdx = -1;
|
||||
ramWatchEditColIdx = -1;
|
||||
}
|
||||
|
||||
void closeMemoryWatchWindow(GtkWidget* w, GdkEvent* e, gpointer p)
|
||||
{
|
||||
ramWatchWinOpen = false;
|
||||
|
||||
gtk_widget_destroy(w);
|
||||
}
|
||||
|
||||
// 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;
|
||||
|
||||
if ( ramWatchWinOpen )
|
||||
{
|
||||
return; // Only allow 1 RAM watch window to be open.
|
||||
}
|
||||
|
||||
win = gtk_dialog_new_with_buttons("RAM Watch",
|
||||
GTK_WINDOW(MainWindow), (GtkDialogFlags)(GTK_DIALOG_DESTROY_WITH_PARENT),
|
||||
"_Close",
|
||||
GTK_RESPONSE_OK,
|
||||
NULL);
|
||||
gtk_window_set_default_size(GTK_WINDOW(win), 600, 600);
|
||||
|
||||
main_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 1);
|
||||
|
||||
menubar = CreateRamWatchMenubar(win);
|
||||
|
||||
gtk_box_pack_start (GTK_BOX(main_vbox), menubar, FALSE, TRUE, 0);
|
||||
|
||||
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,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));
|
||||
|
||||
gtk_tree_view_set_grid_lines( GTK_TREE_VIEW(tree), GTK_TREE_VIEW_GRID_LINES_VERTICAL );
|
||||
|
||||
GtkCellRenderer *renderer;
|
||||
GtkTreeViewColumn* column;
|
||||
|
||||
renderer = gtk_cell_renderer_text_new();
|
||||
g_object_set(renderer, "family", "MonoSpace", NULL);
|
||||
g_object_set(renderer, "editable", TRUE, NULL);
|
||||
g_signal_connect(renderer, "edited", (GCallback) ramWatch_cell_edited_cb, (gpointer)0);
|
||||
g_signal_connect(renderer, "editing-started", (GCallback) ramWatch_cell_edited_start_cb, (gpointer)0);
|
||||
g_signal_connect(renderer, "editing-canceled", (GCallback) ramWatch_cell_edited_cancel_cb, (gpointer)0);
|
||||
column = gtk_tree_view_column_new_with_attributes("Addr", renderer, "text", 0, NULL);
|
||||
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
|
||||
|
||||
renderer = gtk_cell_renderer_text_new();
|
||||
g_object_set(renderer, "family", "MonoSpace", NULL);
|
||||
g_object_set(renderer, "editable", TRUE, NULL);
|
||||
g_signal_connect(renderer, "edited", (GCallback) ramWatch_cell_edited_cb, (gpointer)1);
|
||||
g_signal_connect(renderer, "editing-started", (GCallback) ramWatch_cell_edited_start_cb, (gpointer)1);
|
||||
g_signal_connect(renderer, "editing-canceled", (GCallback) ramWatch_cell_edited_cancel_cb, (gpointer)1);
|
||||
column = gtk_tree_view_column_new_with_attributes("Value Dec", renderer, "text", 1, NULL);
|
||||
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
|
||||
|
||||
renderer = gtk_cell_renderer_text_new();
|
||||
g_object_set(renderer, "family", "MonoSpace", NULL);
|
||||
g_object_set(renderer, "editable", TRUE, NULL);
|
||||
g_signal_connect(renderer, "edited", (GCallback) ramWatch_cell_edited_cb, (gpointer)2);
|
||||
g_signal_connect(renderer, "editing-started", (GCallback) ramWatch_cell_edited_start_cb, (gpointer)2);
|
||||
g_signal_connect(renderer, "editing-canceled", (GCallback) ramWatch_cell_edited_cancel_cb, (gpointer)2);
|
||||
column = gtk_tree_view_column_new_with_attributes("Value Hex", renderer, "text", 2, NULL);
|
||||
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
|
||||
|
||||
renderer = gtk_cell_renderer_text_new();
|
||||
g_object_set(renderer, "editable", TRUE, NULL);
|
||||
g_signal_connect(renderer, "edited", (GCallback) ramWatch_cell_edited_cb, (gpointer)3);
|
||||
g_signal_connect(renderer, "editing-started", (GCallback) ramWatch_cell_edited_start_cb, (gpointer)3);
|
||||
g_signal_connect(renderer, "editing-canceled", (GCallback) ramWatch_cell_edited_cancel_cb, (gpointer)3);
|
||||
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);
|
||||
|
||||
showRamWatchResults(1);
|
||||
|
||||
if ( ramWatchEvntSrcID == 0 )
|
||||
{
|
||||
ramWatchEvntSrcID = g_timeout_add( 100, updateRamWatchTree, NULL );
|
||||
}
|
||||
|
||||
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 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(closeMemoryWatchWindow), NULL);
|
||||
g_signal_connect(win, "response", G_CALLBACK(closeMemoryWatchWindow), NULL);
|
||||
|
||||
gtk_widget_show_all(win);
|
||||
|
||||
ramWatchWinOpen = true;
|
||||
}
|
||||
|
||||
|
||||
void recordMovie()
|
||||
{
|
||||
if(isloaded)
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,3 @@
|
|||
// ramwatch.h
|
||||
|
||||
void openMemoryWatchWindow(void);
|
Loading…
Reference in New Issue