- Fix a possible (but slim) buffer overflow caused by the usage of sprintf.

Linux (gtk):
- Show error instead of warning if --enable-hud is configured but libagg not found.
- Change F10 to use savestate slot 0 instead of 10.
- Show savestate time on savestate menu.
- Change startup window size back to resizable.
This commit is contained in:
alvinwong 2014-02-26 09:52:06 +00:00
parent ae36159259
commit fed37e55d3
3 changed files with 64 additions and 18 deletions

View File

@ -211,7 +211,7 @@ if test "x$libagg" = "xyes" ; then
AC_SUBST(LIBAGG_LIBS) AC_SUBST(LIBAGG_LIBS)
AC_DEFINE([HAVE_LIBAGG]) AC_DEFINE([HAVE_LIBAGG])
else else
AC_MSG_WARN([HUD rendering enabled, but libagg not found]) AC_MSG_ERROR([HUD rendering enabled, but libagg not found])
fi fi
fi fi

View File

@ -124,6 +124,8 @@ static void SaveStateDialog();
static void LoadStateDialog(); static void LoadStateDialog();
void Launch(); void Launch();
void Pause(); void Pause();
static void ResetSaveStateTimes();
static void LoadSaveStateInfo();
static void Printscreen(); static void Printscreen();
static void Reset(); static void Reset();
static void Edit_Controls(); static void Edit_Controls();
@ -872,9 +874,12 @@ static void ToggleFullscreen(GtkToggleAction *action)
static int Open(const char *filename) static int Open(const char *filename)
{ {
int res; int res;
ResetSaveStateTimes();
res = NDS_LoadROM( filename ); res = NDS_LoadROM( filename );
if(res > 0) if(res > 0) {
LoadSaveStateInfo();
gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "cheatlist"), TRUE); gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "cheatlist"), TRUE);
}
return res; return res;
} }
@ -1420,7 +1425,7 @@ static void UpdateDrawingAreaAspect()
} }
if (winsize_current == WINSIZE_SCALE) { if (winsize_current == WINSIZE_SCALE) {
gtk_widget_set_size_request(GTK_WIDGET(pDrawingArea), W / 2, H / 2); gtk_widget_set_size_request(GTK_WIDGET(pDrawingArea), W, H);
gtk_window_set_resizable(GTK_WINDOW(pWindow), TRUE); gtk_window_set_resizable(GTK_WINDOW(pWindow), TRUE);
} else { } else {
gtk_widget_set_size_request(GTK_WIDGET(pDrawingArea), W * winsize_current / 2, H * winsize_current / 2); gtk_widget_set_size_request(GTK_WIDGET(pDrawingArea), W * winsize_current / 2, H * winsize_current / 2);
@ -1770,6 +1775,7 @@ static void savegame(int num){
} }
else else
savestate_slot(num); savestate_slot(num);
LoadSaveStateInfo();
} }
static void MenuLoad(GtkMenuItem *item, gpointer slot) static void MenuLoad(GtkMenuItem *item, gpointer slot)
@ -1794,9 +1800,9 @@ static gint Key_Press(GtkWidget *w, GdkEventKey *e, gpointer data)
} }
if( e->keyval >= GDK_F1 && e->keyval <= GDK_F10 ){ if( e->keyval >= GDK_F1 && e->keyval <= GDK_F10 ){
if(!gdk_shift_pressed) if(!gdk_shift_pressed)
loadgame(e->keyval - GDK_F1 + 1); loadgame((e->keyval - GDK_F1 + 1) % 10);
else else
savegame(e->keyval - GDK_F1 + 1); savegame((e->keyval - GDK_F1 + 1) % 10);
return 1; return 1;
} }
guint mask; guint mask;
@ -2449,23 +2455,63 @@ static void dui_set_accel_group(gpointer action, gpointer group) {
gtk_action_set_accel_group((GtkAction *)action, (GtkAccelGroup *)group); gtk_action_set_accel_group((GtkAction *)action, (GtkAccelGroup *)group);
} }
// The following functions are adapted from the Windows port:
// UpdateSaveStateMenu, ResetSaveStateTimes, LoadSaveStateInfo
static void UpdateSaveStateMenu(int pos, char* txt)
{
char name[64];
snprintf(name, sizeof(name), "savestate%d", (pos == 0) ? 10 : pos);
gtk_action_set_label(gtk_action_group_get_action(action_group, name), txt);
snprintf(name, sizeof(name), "loadstate%d", (pos == 0) ? 10 : pos);
gtk_action_set_label(gtk_action_group_get_action(action_group, name), txt);
}
static void ResetSaveStateTimes()
{
char ntxt[64];
for(int i = 0; i < NB_STATES;i++)
{
snprintf(ntxt, sizeof(ntxt), "_%d", i);
UpdateSaveStateMenu(i, ntxt);
}
}
static void LoadSaveStateInfo()
{
scan_savestates();
char ntxt[128];
for(int i = 0; i < NB_STATES; i++)
{
if(savestates[i].exists)
{
snprintf(ntxt, sizeof(ntxt), "_%d %s", i, savestates[i].date);
UpdateSaveStateMenu(i, ntxt);
}
}
}
static void desmume_gtk_menu_file_saveload_slot (GtkActionGroup *ag) static void desmume_gtk_menu_file_saveload_slot (GtkActionGroup *ag)
{ {
for(guint i = 1; i <= 10; i++){ for(guint i = 1; i <= 10; i++){
GtkAction *act; GtkAction *act;
char label[64], name[64]; char label[64], name[64], accel[64];
snprintf(label, 60, "_%d", i); snprintf(label, sizeof(label), "_%d", i % 10);
snprintf(name, 60, "savestate%d", i); // Note: GTK+ doesn't handle Shift correctly, so the actual action is
// done in Key_Press. The accelerators here are simply visual cues.
snprintf(name, sizeof(name), "savestate%d", i);
snprintf(accel, sizeof(accel), "<Shift>F%d", i);
act = gtk_action_new(name, label, NULL, NULL); act = gtk_action_new(name, label, NULL, NULL);
g_signal_connect(G_OBJECT(act), "activate", G_CALLBACK(MenuSave), GUINT_TO_POINTER(i)); g_signal_connect(G_OBJECT(act), "activate", G_CALLBACK(MenuSave), GUINT_TO_POINTER(i % 10));
gtk_action_group_add_action_with_accel(ag, GTK_ACTION(act), NULL); gtk_action_group_add_action_with_accel(ag, GTK_ACTION(act), accel);
snprintf(name, 60, "loadstate%d", i); snprintf(name, sizeof(name), "loadstate%d", i);
snprintf(accel, sizeof(accel), "F%d", i);
act = gtk_action_new(name, label, NULL, NULL); act = gtk_action_new(name, label, NULL, NULL);
g_signal_connect(G_OBJECT(act), "activate", G_CALLBACK(MenuLoad), GUINT_TO_POINTER(i)); g_signal_connect(G_OBJECT(act), "activate", G_CALLBACK(MenuLoad), GUINT_TO_POINTER(i % 10));
gtk_action_group_add_action_with_accel(ag, GTK_ACTION(act), NULL); gtk_action_group_add_action_with_accel(ag, GTK_ACTION(act), accel);
} }
} }
@ -2855,7 +2901,7 @@ common_gtk_main( class configured_features *my_config)
gtk_action_group_add_radio_actions(action_group, rotation_entries, G_N_ELEMENTS(rotation_entries), gtk_action_group_add_radio_actions(action_group, rotation_entries, G_N_ELEMENTS(rotation_entries),
0, G_CALLBACK(SetRotation), NULL); 0, G_CALLBACK(SetRotation), NULL);
gtk_action_group_add_radio_actions(action_group, winsize_entries, G_N_ELEMENTS(winsize_entries), gtk_action_group_add_radio_actions(action_group, winsize_entries, G_N_ELEMENTS(winsize_entries),
WINSIZE_1, G_CALLBACK(SetWinsize), NULL); WINSIZE_SCALE, G_CALLBACK(SetWinsize), NULL);
gtk_action_group_add_radio_actions(action_group, orientation_entries, G_N_ELEMENTS(orientation_entries), gtk_action_group_add_radio_actions(action_group, orientation_entries, G_N_ELEMENTS(orientation_entries),
0, G_CALLBACK(SetOrientation), NULL); 0, G_CALLBACK(SetOrientation), NULL);
{ {
@ -2897,7 +2943,7 @@ common_gtk_main( class configured_features *my_config)
pDrawingArea = gtk_drawing_area_new(); pDrawingArea = gtk_drawing_area_new();
gtk_container_add (GTK_CONTAINER (pVBox), pDrawingArea); gtk_container_add (GTK_CONTAINER (pVBox), pDrawingArea);
winsize_current = WINSIZE_1; winsize_current = WINSIZE_SCALE;
UpdateDrawingAreaAspect(); UpdateDrawingAreaAspect();
gtk_widget_set_events(pDrawingArea, gtk_widget_set_events(pDrawingArea,

View File

@ -2380,10 +2380,10 @@ void UpdateSaveStateMenu(int pos, char* txt)
**/ **/
void ResetSaveStateTimes() void ResetSaveStateTimes()
{ {
char ntxt[64]; char ntxt[16];
for(int i = 0; i < NB_STATES;i++) for(int i = 0; i < NB_STATES;i++)
{ {
sprintf(ntxt,"%d %s", i, ""); snprintf(ntxt, sizeof(ntxt), "&%d", i);
UpdateSaveStateMenu(i, ntxt); UpdateSaveStateMenu(i, ntxt);
} }
} }
@ -2404,7 +2404,7 @@ void LoadSaveStateInfo()
{ {
if(savestates[i].exists) if(savestates[i].exists)
{ {
sprintf(ntxt, "&%d %s", i, savestates[i].date); snprintf(ntxt, sizeof(ntxt), "&%d %s", i, savestates[i].date);
UpdateSaveStateMenu(i, ntxt); UpdateSaveStateMenu(i, ntxt);
} }
} }