Moved cheat window code to its own file. Created a cheat window class object to better manage multiple instances of the cheat window.

This commit is contained in:
Matthew Budd 2020-05-12 20:14:11 -04:00
parent 754e621735
commit 309cb00f93
4 changed files with 1102 additions and 903 deletions

View File

@ -8,6 +8,7 @@ Export('env')
source_list = Split(
"""
input.cpp
cheat.cpp
config.cpp
sdl.cpp
sdl-joystick.cpp

1097
src/drivers/sdl/cheat.cpp Normal file

File diff suppressed because it is too large Load Diff

3
src/drivers/sdl/cheat.h Normal file
View File

@ -0,0 +1,3 @@
// cheat.h
void openCheatsWindow(void);

View File

@ -14,6 +14,7 @@
#include "dface.h"
#include "input.h"
#include "config.h"
#include "cheat.h"
#include "icon.xpm"
#ifdef _S9XLUA_H
@ -63,23 +64,6 @@ bool gtkIsStarted = false;
bool menuTogglingEnabled = false;
static GtkTreeStore *hotkey_store = NULL;
//-----------------------------------------
// Cheat static variables
static GtkTreeStore *actv_cheats_store = NULL;
static GtkTreeStore *ram_match_store = NULL;
static GtkTreeIter actv_cheats_iter;
static GtkTreeIter ram_match_iter;
static int cheat_search_known_value = 0;
static int cheat_search_neq_value = 0;
static int cheat_search_gt_value = 0;
static int cheat_search_lt_value = 0;
static int new_cheat_addr = -1;
static int new_cheat_val = -1;
static int new_cheat_cmp = -1;
static std::string new_cheat_name;
static bool wasPausedByCheats = false;
static bool pauseWhileCheatsActv = false;
static bool cheatWindowOpen = false;
//-----------------------------------------
// Ram Watch static variables
@ -1527,892 +1511,6 @@ void toggleAutoResume(GtkCheckMenuItem *item, gpointer user_data)
g_config->setOption("SDL.AutoResume", (int)autoResume);
AutoResumePlay = autoResume;
}
//*******************************************************************************************************
// Cheat Window
//*******************************************************************************************************
static int ShowCheatSearchResultsCallB(uint32 a, uint8 last, uint8 current)
{
char addrStr[32], lastStr[32], curStr[32];
sprintf( addrStr, "0x%04X ", a );
sprintf( lastStr, " 0x%02X ", last );
sprintf( curStr, " 0x%02X ", current );
gtk_tree_store_append( ram_match_store, &ram_match_iter, NULL); // aquire iter
gtk_tree_store_set(ram_match_store, &ram_match_iter,
0, addrStr, 1, lastStr, 2, curStr,
-1);
return 1;
}
static void showCheatSearchResults(void)
{
int total_matches = 0;
gtk_tree_store_clear(ram_match_store);
total_matches = FCEUI_CheatSearchGetCount();
printf("Cheat Search Matches: %i \n", total_matches );
FCEUI_CheatSearchGetRange( 0, total_matches, ShowCheatSearchResultsCallB );
}
static void cheatSearchReset( GtkButton *button,
gpointer user_data)
{
printf("Cheat Search Reset!\n");
//cheat_search_known_value = 0;
//cheat_search_neq_value = 0;
//cheat_search_gt_value = 0;
//cheat_search_lt_value = 0;
FCEUI_CheatSearchBegin();
showCheatSearchResults();
// Enable Cheat Search Buttons - Change Sensitivity
}
static void cheatSearchKnown( GtkButton *button,
gpointer user_data)
{
//printf("Cheat Search Known!\n");
FCEUI_CheatSearchEnd(FCEU_SEARCH_NEWVAL_KNOWN, cheat_search_known_value, 0);
showCheatSearchResults();
}
static void cheatSearchEqual( GtkButton *button,
gpointer user_data)
{
//printf("Cheat Search Equal !\n");
FCEUI_CheatSearchEnd(FCEU_SEARCH_PUERLY_RELATIVE_CHANGE, 0, 0);
showCheatSearchResults();
}
static void cheatSearchNotEqual( GtkButton *button,
GtkToggleButton *chkbox )
{
int checked = gtk_toggle_button_get_active(chkbox);
//printf("Cheat Search NotEqual %i!\n", checked);
if ( checked ){
FCEUI_CheatSearchEnd(FCEU_SEARCH_PUERLY_RELATIVE_CHANGE, 0, cheat_search_neq_value);
} else {
FCEUI_CheatSearchEnd(FCEU_SEARCH_ANY_CHANGE, 0, 0);
}
showCheatSearchResults();
}
static void cheatSearchGreaterThan( GtkButton *button,
GtkToggleButton *chkbox )
{
int checked = gtk_toggle_button_get_active(chkbox);
//printf("Cheat Search GreaterThan %i!\n", checked);
if ( checked ){
FCEUI_CheatSearchEnd(FCEU_SEARCH_NEWVAL_GT_KNOWN, 0, cheat_search_gt_value);
} else {
FCEUI_CheatSearchEnd(FCEU_SEARCH_NEWVAL_GT, 0, 0);
}
showCheatSearchResults();
}
static void cheatSearchLessThan( GtkButton *button,
GtkToggleButton *chkbox )
{
int checked = gtk_toggle_button_get_active(chkbox);
//printf("Cheat Search LessThan %i!\n", checked);
if ( checked ){
FCEUI_CheatSearchEnd(FCEU_SEARCH_NEWVAL_LT_KNOWN, 0, cheat_search_lt_value);
} else {
FCEUI_CheatSearchEnd(FCEU_SEARCH_NEWVAL_LT, 0, 0);
}
showCheatSearchResults();
}
static void pauseDuringCheatWinActvCB( GtkToggleButton *button,
void *userData )
{
pauseWhileCheatsActv = gtk_toggle_button_get_active(button);
if ( pauseWhileCheatsActv )
{
if ( EmulationPaused == 0 )
{
EmulationPaused = 1;
wasPausedByCheats = true;
}
}
else
{
if ( EmulationPaused && wasPausedByCheats )
{
EmulationPaused = 0;
}
wasPausedByCheats = false;
}
FCEU_printf("Emulation paused: %d\n", EmulationPaused);
}
static void cheatSearchValueEntryCB( GtkWidget *widget,
void *userData )
{
long value;
const gchar *entry_text;
entry_text = gtk_entry_get_text (GTK_ENTRY (widget));
value = strtol( entry_text, NULL, 16 );
switch ( (long)userData )
{
default:
case 0:
break;
case 1:
cheat_search_known_value = value;
break;
case 2:
cheat_search_neq_value = value;
break;
case 3:
cheat_search_gt_value = value;
break;
case 4:
cheat_search_lt_value = value;
break;
}
//printf("Cheat Value Entry contents: '%s' Value: 0x%02lx\n", entry_text, value);
}
static int activeCheatListCB(char *name, uint32 a, uint8 v, int c, int s, int type, void* data)
{
long int reset;
char addrStr[32], valStr[16], cmpStr[16];
//printf("Cheat Name:'%s' Addr:0x%04x Val:0x%02x \n", name, a, v );
//
reset = (long)data;
if ( reset )
{
gtk_tree_store_append( actv_cheats_store, &actv_cheats_iter, NULL); // aquire iter
}
sprintf( addrStr, "0x%04X ", a );
sprintf( valStr, " 0x%02X ", v );
if ( c >= 0 ){
sprintf( cmpStr, " 0x%02X ", c );
} else {
strcpy( cmpStr, " 0xFF ");
}
gtk_tree_store_set(actv_cheats_store, &actv_cheats_iter,
0, s, 1, addrStr, 2, valStr, 3, cmpStr, 4, name,
-1);
if ( !reset )
{
if ( !gtk_tree_model_iter_next( GTK_TREE_MODEL(actv_cheats_store), &actv_cheats_iter ) )
{
gtk_tree_store_append( actv_cheats_store, &actv_cheats_iter, NULL); // aquire iter
}
}
return 1;
}
static void showActiveCheatList( long int reset )
{
if ( reset )
{
gtk_tree_store_clear(actv_cheats_store);
}
else
{
if ( !gtk_tree_model_get_iter_first( GTK_TREE_MODEL(actv_cheats_store), &actv_cheats_iter ) )
{
printf("No Tree Entries Loaded.\n");
reset = 1;
}
}
FCEUI_ListCheats( activeCheatListCB, (void*)reset );
}
static void cheatListEnableToggle( GtkCellRendererToggle *renderer,
gchar *pathStr,
GtkTreeView *tree )
{
GtkTreePath *path;
int depth;
int *indexArray;
path = gtk_tree_path_new_from_string( pathStr );
if ( path == NULL ){
printf("Error: gtk_tree_path_new_from_string failed\n");
return;
}
depth = gtk_tree_path_get_depth(path);
indexArray = gtk_tree_path_get_indices(path);
if ( depth > 0 )
{
//printf("Toggle: %i\n", indexArray[0] );
FCEUI_ToggleCheat( indexArray[0] );
}
gtk_tree_path_free( path );
showActiveCheatList(0);
}
static void openCheatFile( GtkWidget *widget,
void *userData )
{
GtkWidget* fileChooser;
GtkFileFilter* filterCht;
GtkFileFilter* filterAll;
filterCht = gtk_file_filter_new();
filterAll = gtk_file_filter_new();
gtk_file_filter_add_pattern(filterCht, "*.cht");
gtk_file_filter_add_pattern(filterAll, "*");
gtk_file_filter_set_name(filterCht, "*.cht");
gtk_file_filter_set_name(filterAll, "All Files");
fileChooser = gtk_file_chooser_dialog_new ("Open Cheat", GTK_WINDOW(MainWindow),
GTK_FILE_CHOOSER_ACTION_OPEN, "_Cancel", GTK_RESPONSE_CANCEL,
"_Open", GTK_RESPONSE_ACCEPT, NULL);
const char* last_dir;
g_config->getOption("SDL.LastOpenFile", &last_dir);
gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(fileChooser), last_dir);
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(fileChooser), filterCht);
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(fileChooser), filterAll);
if (gtk_dialog_run (GTK_DIALOG (fileChooser)) ==GTK_RESPONSE_ACCEPT)
{
FILE *fp;
char* filename;
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (fileChooser));
gtk_widget_destroy (fileChooser);
fp = fopen( filename, "r");
if ( fp != NULL )
{
FCEU_LoadGameCheats( fp, 0 );
fclose(fp);
}
//g_config->setOption("SDL.LastOpenFile", filename);
// Error dialog no longer required with GTK implementation of FCEUD_PrintError()
resizeGtkWindow();
g_free( filename);
}
else
{
gtk_widget_destroy (fileChooser);
}
showActiveCheatList(1);
}
static void newCheatEntryCB( GtkWidget *widget,
void *userData )
{
const gchar *entry_text;
entry_text = gtk_entry_get_text (GTK_ENTRY (widget));
switch ( (long)userData )
{
default:
case 0:
if ( entry_text[0] == 0 )
{
new_cheat_addr = -1;
}
else
{
new_cheat_addr = strtol( entry_text, NULL, 16 );
}
break;
case 1:
if ( entry_text[0] == 0 )
{
new_cheat_val = -1;
}
else
{
new_cheat_val = strtol( entry_text, NULL, 16 );
}
break;
case 2:
{
if ( entry_text[0] == 0 )
{
new_cheat_cmp = -1;
}
else
{
new_cheat_cmp = strtol( entry_text, NULL, 16 );
}
}
break;
case 3:
new_cheat_name.assign( entry_text );
break;
}
}
static void addCheat2Active( GtkWidget *widget,
void *userData )
{
if ( (new_cheat_addr >= 0) && (new_cheat_val >= 0) )
{
if ( FCEUI_AddCheat( new_cheat_name.c_str(), new_cheat_addr, new_cheat_val, new_cheat_cmp, 1) )
{
showActiveCheatList(1);
}
}
}
static void removeCheatFromActive( GtkWidget *widget,
GtkTreeView *tree )
{
int numListRows;
GList *selListRows, *tmpList;
GtkTreeModel *model = NULL;
GtkTreeSelection *treeSel = gtk_tree_view_get_selection(tree);
numListRows = gtk_tree_selection_count_selected_rows( treeSel );
if ( numListRows == 0 )
{
return;
}
//printf("Number of Rows Selected: %i\n", numListRows );
selListRows = gtk_tree_selection_get_selected_rows( treeSel, &model );
tmpList = selListRows;
while ( tmpList )
{
int depth;
int *indexArray;
GtkTreePath *path = (GtkTreePath*)tmpList->data;
depth = gtk_tree_path_get_depth(path);
indexArray = gtk_tree_path_get_indices(path);
if ( depth > 0 )
{
//GtkTreeIter iter;
FCEUI_DelCheat( indexArray[0] );
//if ( gtk_tree_model_get_iter ( model, &iter, path ) )
//{
// gtk_tree_store_remove( actv_cheats_store, &iter );
//}
}
tmpList = tmpList->next;
}
g_list_free_full(selListRows, (GDestroyNotify) gtk_tree_path_free);
showActiveCheatList(1);
}
static void updateCheatList( GtkWidget *widget,
GtkTreeView *tree )
{
int numListRows;
GList *selListRows, *tmpList;
GtkTreeModel *model = NULL;
GtkTreeSelection *treeSel = gtk_tree_view_get_selection(tree);
numListRows = gtk_tree_selection_count_selected_rows( treeSel );
if ( numListRows == 0 )
{
return;
}
//printf("Number of Rows Selected: %i\n", numListRows );
selListRows = gtk_tree_selection_get_selected_rows( treeSel, &model );
tmpList = selListRows;
while ( tmpList )
{
int depth;
int *indexArray;
GtkTreePath *path = (GtkTreePath*)tmpList->data;
depth = gtk_tree_path_get_depth(path);
indexArray = gtk_tree_path_get_indices(path);
if ( depth > 0 )
{
uint32 a; uint8 v;
int c, s, type;
const char *name = NULL;
if ( FCEUI_GetCheat( indexArray[0], NULL, &a, &v, &c, &s, &type) )
{
if ( new_cheat_addr >= 0 ){
a = new_cheat_addr;
}
if ( new_cheat_val >= 0 ){
v = new_cheat_val;
}
if ( new_cheat_cmp >= 0 ){
c = new_cheat_cmp;
}
if ( new_cheat_name.size() )
{
name = new_cheat_name.c_str();
}
FCEUI_SetCheat( indexArray[0], name, a, v, c, s, type );
}
}
//printf("Depth: %i \n", depth );
//for (int i=0; i<depth; i++)
//{
// printf("%i: %i\n", i, indexArray[i] );
//}
tmpList = tmpList->next;
}
g_list_free_full(selListRows, (GDestroyNotify) gtk_tree_path_free);
showActiveCheatList(0);
}
static void cheat_cell_edited_cb (GtkCellRendererText *cell,
gchar *path_string,
gchar *new_text,
gpointer user_data)
{
long int row_idx = -1, column_idx;
//printf("'%s'\n", path_string );
//printf("'%s'\n", new_text );
//printf("%p\n", user_data );
column_idx = (long)user_data;
if ( isdigit(path_string[0]) )
{
row_idx = atoi(path_string);
}
if ( row_idx >= 0 )
{
uint32 a; uint8 v;
int c, s, type;
const char *name = NULL;
if ( FCEUI_GetCheat( row_idx, NULL, &a, &v, &c, &s, &type) )
{
switch ( column_idx )
{
default:
case 0:
break;
case 1:
a = strtol( new_text, NULL, 0 );
break;
case 2:
v = strtol( new_text, NULL, 0 );
break;
case 3:
c = strtol( new_text, NULL, 0 );
break;
case 4:
name = new_text;
break;
}
FCEUI_SetCheat( row_idx, name, a, v, c, s, type );
showActiveCheatList(0);
}
}
}
void closeCheatDialog(GtkWidget* w, GdkEvent* e, gpointer p)
{
if ( EmulationPaused && wasPausedByCheats )
{
EmulationPaused = 0;
}
wasPausedByCheats = false;
pauseWhileCheatsActv = false;
cheatWindowOpen = false;
cheat_search_known_value = 0;
cheat_search_neq_value = 0;
cheat_search_gt_value = 0;
cheat_search_lt_value = 0;
new_cheat_addr = -1;
new_cheat_val = -1;
new_cheat_cmp = -1;
gtk_widget_destroy(w);
}
// creates and opens cheats window
static void openCheatsWindow(void)
{
GtkWidget* win;
GtkWidget* main_hbox;
GtkWidget* hbox;
GtkWidget* vbox, *prev_cmp_vbox;
GtkWidget* frame;
GtkWidget* label, *txt_entry;
GtkWidget* button, *chkbutton;
GtkWidget *tree;
GtkWidget *scroll;
if ( cheatWindowOpen ){
return; // Only allow one cheat window to be open per gui.
}
win = gtk_dialog_new_with_buttons("Cheats",
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_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
frame = gtk_frame_new("Active Cheats");
actv_cheats_store = gtk_tree_store_new( 5, G_TYPE_BOOLEAN,
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING );
tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(actv_cheats_store));
GtkCellRenderer *renderer;
GtkCellRenderer *chkbox_renderer;
GtkTreeViewColumn* column;
gtk_tree_view_set_grid_lines( GTK_TREE_VIEW(tree), GTK_TREE_VIEW_GRID_LINES_VERTICAL );
renderer = gtk_cell_renderer_text_new();
g_object_set(renderer, "editable", TRUE, NULL);
g_signal_connect(renderer, "edited", (GCallback) cheat_cell_edited_cb, NULL);
chkbox_renderer = gtk_cell_renderer_toggle_new();
gtk_cell_renderer_toggle_set_activatable( (GtkCellRendererToggle*)chkbox_renderer, TRUE );
column = gtk_tree_view_column_new_with_attributes("Ena", chkbox_renderer, "active", 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) cheat_cell_edited_cb, (gpointer)1);
column = gtk_tree_view_column_new_with_attributes("Addr", 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) cheat_cell_edited_cb, (gpointer)2);
column = gtk_tree_view_column_new_with_attributes("Val", renderer, "text", 2, 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) cheat_cell_edited_cb, (gpointer)3);
column = gtk_tree_view_column_new_with_attributes("Cmp", renderer, "text", 3, 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) cheat_cell_edited_cb, (gpointer)4);
column = gtk_tree_view_column_new_with_attributes("Desc", renderer, "text", 4, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
g_signal_connect( chkbox_renderer, "toggled",
G_CALLBACK(cheatListEnableToggle), (void*)tree );
showActiveCheatList(1);
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(vbox), scroll, TRUE, TRUE, 1);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);
label = gtk_label_new("Name:");
txt_entry = gtk_entry_new();
g_signal_connect( txt_entry, "activate",
G_CALLBACK(newCheatEntryCB), (void*)3L );
g_signal_connect( txt_entry, "changed",
G_CALLBACK(newCheatEntryCB), (void*)3L );
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 1);
gtk_box_pack_start(GTK_BOX(hbox), txt_entry, TRUE, TRUE, 1);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 1);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
label = gtk_label_new("Addr:");
txt_entry = gtk_entry_new();
gtk_entry_set_max_length( GTK_ENTRY(txt_entry), 4 );
gtk_entry_set_width_chars( GTK_ENTRY(txt_entry), 4 );
g_signal_connect( txt_entry, "activate",
G_CALLBACK(newCheatEntryCB), (void*)0L );
g_signal_connect( txt_entry, "changed",
G_CALLBACK(newCheatEntryCB), (void*)0L );
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 1);
gtk_box_pack_start(GTK_BOX(hbox), txt_entry, TRUE, TRUE, 1);
label = gtk_label_new("Val:");
txt_entry = gtk_entry_new();
gtk_entry_set_max_length( GTK_ENTRY(txt_entry), 2 );
gtk_entry_set_width_chars( GTK_ENTRY(txt_entry), 2 );
g_signal_connect( txt_entry, "activate",
G_CALLBACK(newCheatEntryCB), (void*)1L );
g_signal_connect( txt_entry, "changed",
G_CALLBACK(newCheatEntryCB), (void*)1L );
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 1);
gtk_box_pack_start(GTK_BOX(hbox), txt_entry, TRUE, TRUE, 1);
label = gtk_label_new("Cmp:");
txt_entry = gtk_entry_new();
gtk_entry_set_max_length( GTK_ENTRY(txt_entry), 2 );
gtk_entry_set_width_chars( GTK_ENTRY(txt_entry), 2 );
g_signal_connect( txt_entry, "activate",
G_CALLBACK(newCheatEntryCB), (void*)2L );
g_signal_connect( txt_entry, "changed",
G_CALLBACK(newCheatEntryCB), (void*)2L );
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 1);
gtk_box_pack_start(GTK_BOX(hbox), txt_entry, TRUE, TRUE, 1);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 1);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3);
button = gtk_button_new_with_label("Add");
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 1);
g_signal_connect( button, "clicked",
G_CALLBACK (addCheat2Active), (gpointer) NULL );
button = gtk_button_new_with_label("Delete");
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 1);
g_signal_connect( button, "clicked",
G_CALLBACK (removeCheatFromActive), (gpointer) tree );
button = gtk_button_new_with_label("Update");
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 1);
g_signal_connect( button, "clicked",
G_CALLBACK (updateCheatList), (gpointer) tree );
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 1);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
button = gtk_button_new_with_label("Add from CHT file...");
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 1);
g_signal_connect( button, "clicked",
G_CALLBACK (openCheatFile), (gpointer) NULL );
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 1);
gtk_container_add(GTK_CONTAINER(frame), vbox);
//
gtk_box_pack_start(GTK_BOX(main_hbox), frame, TRUE, TRUE, 1);
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
button = gtk_button_new_with_label("Reset");
g_signal_connect( button, "clicked",
G_CALLBACK (cheatSearchReset), (gpointer) NULL );
gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3);
button = gtk_button_new_with_label("Known Value:");
g_signal_connect( button, "clicked",
G_CALLBACK (cheatSearchKnown), (gpointer) NULL );
gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 5);
label = gtk_label_new("0x");
txt_entry = gtk_entry_new();
gtk_entry_set_max_length( GTK_ENTRY(txt_entry), 2 );
gtk_entry_set_width_chars( GTK_ENTRY(txt_entry), 2 );
g_signal_connect( txt_entry, "activate",
G_CALLBACK(cheatSearchValueEntryCB), (void*)1L );
g_signal_connect( txt_entry, "changed",
G_CALLBACK(cheatSearchValueEntryCB), (void*)1L );
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(hbox), txt_entry, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
frame = gtk_frame_new("Previous Compare");
gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 5);
button = gtk_check_button_new_with_label("Pause emulation when this window is active");
gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 5);
g_signal_connect( button, "clicked",
G_CALLBACK (pauseDuringCheatWinActvCB), (gpointer) NULL );
prev_cmp_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
gtk_container_add(GTK_CONTAINER(frame), prev_cmp_vbox);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
button = gtk_button_new_with_label("Equal");
//gtk_widget_set_halign( button, GTK_ALIGN_BASELINE);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 5);
gtk_box_pack_start(GTK_BOX(prev_cmp_vbox), hbox, FALSE, FALSE, 5);
g_signal_connect( button, "clicked",
G_CALLBACK (cheatSearchEqual), (gpointer) NULL );
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
button = gtk_button_new_with_label("Not Equal");
//gtk_widget_set_halign( button, GTK_ALIGN_BASELINE);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 5);
chkbutton = gtk_check_button_new();
gtk_box_pack_start(GTK_BOX(hbox), chkbutton, FALSE, FALSE, 5);
g_signal_connect( button, "clicked",
G_CALLBACK (cheatSearchNotEqual), (gpointer) chkbutton );
label = gtk_label_new("By: 0x");
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
txt_entry = gtk_entry_new();
gtk_entry_set_max_length( GTK_ENTRY(txt_entry), 2 );
gtk_entry_set_width_chars( GTK_ENTRY(txt_entry), 2 );
g_signal_connect( txt_entry, "activate",
G_CALLBACK(cheatSearchValueEntryCB), (void*)2L );
g_signal_connect( txt_entry, "changed",
G_CALLBACK(cheatSearchValueEntryCB), (void*)2L );
gtk_box_pack_start(GTK_BOX(hbox), txt_entry, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(prev_cmp_vbox), hbox, FALSE, FALSE, 5);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
button = gtk_button_new_with_label("Greater Than");
//gtk_widget_set_halign( button, GTK_ALIGN_BASELINE);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 5);
chkbutton = gtk_check_button_new();
g_signal_connect( button, "clicked",
G_CALLBACK (cheatSearchGreaterThan), (gpointer) chkbutton );
gtk_box_pack_start(GTK_BOX(hbox), chkbutton, FALSE, FALSE, 5);
label = gtk_label_new("By: 0x");
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
txt_entry = gtk_entry_new();
gtk_entry_set_max_length( GTK_ENTRY(txt_entry), 2 );
gtk_entry_set_width_chars( GTK_ENTRY(txt_entry), 2 );
g_signal_connect( txt_entry, "activate",
G_CALLBACK(cheatSearchValueEntryCB), (void*)3L );
g_signal_connect( txt_entry, "changed",
G_CALLBACK(cheatSearchValueEntryCB), (void*)3L );
gtk_box_pack_start(GTK_BOX(hbox), txt_entry, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(prev_cmp_vbox), hbox, FALSE, FALSE, 5);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
button = gtk_button_new_with_label("Less Than");
//gtk_widget_set_halign( button, GTK_ALIGN_BASELINE);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 5);
chkbutton = gtk_check_button_new();
g_signal_connect( button, "clicked",
G_CALLBACK (cheatSearchLessThan), (gpointer) chkbutton );
gtk_box_pack_start(GTK_BOX(hbox), chkbutton, FALSE, FALSE, 5);
label = gtk_label_new("By: 0x");
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
txt_entry = gtk_entry_new();
gtk_entry_set_max_length( GTK_ENTRY(txt_entry), 2 );
gtk_entry_set_width_chars( GTK_ENTRY(txt_entry), 2 );
g_signal_connect( txt_entry, "activate",
G_CALLBACK(cheatSearchValueEntryCB), (void*)4L );
g_signal_connect( txt_entry, "changed",
G_CALLBACK(cheatSearchValueEntryCB), (void*)4L );
gtk_box_pack_start(GTK_BOX(hbox), txt_entry, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(prev_cmp_vbox), hbox, FALSE, FALSE, 1);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);
gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 1);
frame = gtk_frame_new("Cheat Search");
gtk_container_add(GTK_CONTAINER(frame), hbox);
gtk_box_pack_start(GTK_BOX(main_hbox), frame, TRUE, TRUE, 5);
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
//hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
ram_match_store = gtk_tree_store_new( 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ram_match_store));
gtk_tree_view_set_grid_lines( GTK_TREE_VIEW(tree), GTK_TREE_VIEW_GRID_LINES_VERTICAL );
renderer = gtk_cell_renderer_text_new();
g_object_set(renderer, "family", "MonoSpace", NULL);
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("Last", renderer, "text", 1, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
column = gtk_tree_view_column_new_with_attributes("Curr", renderer, "text", 2, 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(vbox), scroll, TRUE, TRUE, 5);
frame = gtk_frame_new("");
gtk_container_add(GTK_CONTAINER(frame), vbox);
gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 5);
gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(win))), main_hbox, TRUE, TRUE, 0);
g_signal_connect(win, "delete-event", G_CALLBACK(closeCheatDialog), NULL);
g_signal_connect(win, "response", G_CALLBACK(closeCheatDialog), NULL);
gtk_widget_show_all(win);
cheatWindowOpen = true;
}
//*******************************************************************************************************
// Ram Watch Window