Linux (gtk): Add fixed window size options.

This commit is contained in:
alvinwong 2014-02-25 14:13:40 +00:00
parent 513370ca21
commit ae36159259
1 changed files with 60 additions and 5 deletions

View File

@ -144,6 +144,7 @@ static void ToggleAutoFrameskip (GtkToggleAction *action);
static void ToggleSwapScreens(GtkToggleAction *action);
static void ToggleGap (GtkToggleAction *action);
static void SetRotation(GtkAction *action, GtkRadioAction *current);
static void SetWinSize(GtkAction *action, GtkRadioAction *current);
static void SetOrientation(GtkAction *action, GtkRadioAction *current);
static void ToggleLayerVisibility(GtkToggleAction* action, gpointer data);
static void ToggleHudDisplay(GtkToggleAction* action, gpointer data);
@ -219,6 +220,19 @@ static const char *ui_description =
" <menuitem action='rotate_180'/>"
" <menuitem action='rotate_270'/>"
" </menu>"
" <menu action='WinsizeMenu'>"
" <menuitem action='winsize_half'/>"
" <menuitem action='winsize_1'/>"
" <menuitem action='winsize_1half'/>"
" <menuitem action='winsize_2'/>"
" <menuitem action='winsize_2half'/>"
" <menuitem action='winsize_3'/>"
" <menuitem action='winsize_4'/>"
" <menuitem action='winsize_5'/>"
" <menuitem action='winsize_scale'/>"
" <separator/>"
" <menuitem action='fullscreen'/>"
" </menu>"
" <menuitem action='gap'/>"
" <menu action='PriInterpolationMenu'>"
" <menuitem action='pri_interp_none'/>"
@ -269,7 +283,6 @@ static const char *ui_description =
" <menuitem action='view_toolbar'/>"
" <menuitem action='view_statusbar'/>"
" <separator/>"
" <menuitem action='fullscreen'/>"
" </menu>"
" <menu action='ConfigMenu'>"
" <menuitem action='enableaudio'/>"
@ -376,6 +389,7 @@ static const GtkActionEntry action_entries[] = {
{ "ViewMenu", NULL, "_View" },
{ "RotationMenu", NULL, "_Rotation" },
{ "OrientationMenu", NULL, "LCDs _Layout" },
{ "WinsizeMenu", NULL, "_Window Size" },
{ "PriInterpolationMenu", NULL, "Primary _Interpolation" },
{ "InterpolationMenu", NULL, "S_econdary Interpolation" },
{ "HudMenu", NULL, "_HUD" },
@ -456,6 +470,32 @@ static const GtkRadioActionEntry rotation_entries[] = {
{ "rotate_270", "gtk-orientation-reverse-landscape", "_270",NULL, NULL, 270 },
};
enum winsize_enum {
WINSIZE_SCALE = 0,
WINSIZE_HALF = 1,
WINSIZE_1 = 2,
WINSIZE_1HALF = 3,
WINSIZE_2 = 4,
WINSIZE_2HALF = 5,
WINSIZE_3 = 6,
WINSIZE_4 = 8,
WINSIZE_5 = 10,
};
static winsize_enum winsize_current;
static const GtkRadioActionEntry winsize_entries[] = {
{ "winsize_half", NULL, "0_.5x", NULL, NULL, WINSIZE_HALF },
{ "winsize_1", NULL, "_1x", NULL, NULL, WINSIZE_1 },
{ "winsize_1half", NULL, "1.5x", NULL, NULL, WINSIZE_1HALF },
{ "winsize_2", NULL, "_2x", NULL, NULL, WINSIZE_2 },
{ "winsize_2half", NULL, "2.5x", NULL, NULL, WINSIZE_2HALF },
{ "winsize_3", NULL, "_3x", NULL, NULL, WINSIZE_3 },
{ "winsize_4", NULL, "_4x", NULL, NULL, WINSIZE_4 },
{ "winsize_5", NULL, "_5x", NULL, NULL, WINSIZE_5 },
{ "winsize_scale", NULL, "_Scale to window", NULL, NULL, WINSIZE_SCALE },
};
/* When adding modes here remember to add the relevent entry to screen_size */
enum orientation_enum {
ORIENT_VERTICAL = 0,
@ -1376,12 +1416,16 @@ static void UpdateDrawingAreaAspect()
} else {
W += nds_screen.gap_size;
}
} else {
}
}
gtk_widget_set_size_request(GTK_WIDGET(pDrawingArea), W, H);
if (winsize_current == WINSIZE_SCALE) {
gtk_widget_set_size_request(GTK_WIDGET(pDrawingArea), W / 2, H / 2);
gtk_window_set_resizable(GTK_WINDOW(pWindow), TRUE);
} else {
gtk_widget_set_size_request(GTK_WIDGET(pDrawingArea), W * winsize_current / 2, H * winsize_current / 2);
gtk_window_set_resizable(GTK_WINDOW(pWindow), FALSE);
}
}
static void ToggleGap(GtkToggleAction* action)
@ -1396,6 +1440,13 @@ static void SetRotation(GtkAction *action, GtkRadioAction *current)
UpdateDrawingAreaAspect();
}
static void SetWinsize(GtkAction *action, GtkRadioAction *current)
{
winsize_current = (winsize_enum) gtk_radio_action_get_current_value(current);
gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "fullscreen"), winsize_current == WINSIZE_SCALE);
UpdateDrawingAreaAspect();
}
static void SetOrientation(GtkAction *action, GtkRadioAction *current)
{
nds_screen.orientation = gtk_radio_action_get_current_value(current);
@ -2803,6 +2854,8 @@ common_gtk_main( class configured_features *my_config)
0, G_CALLBACK(Modify_Frameskip), NULL);
gtk_action_group_add_radio_actions(action_group, rotation_entries, G_N_ELEMENTS(rotation_entries),
0, G_CALLBACK(SetRotation), NULL);
gtk_action_group_add_radio_actions(action_group, winsize_entries, G_N_ELEMENTS(winsize_entries),
WINSIZE_1, G_CALLBACK(SetWinsize), NULL);
gtk_action_group_add_radio_actions(action_group, orientation_entries, G_N_ELEMENTS(orientation_entries),
0, G_CALLBACK(SetOrientation), NULL);
{
@ -2816,6 +2869,7 @@ common_gtk_main( class configured_features *my_config)
gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "printscreen"), FALSE);
gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "cheatlist"), FALSE);
gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "cheatsearch"), FALSE);
gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "fullscreen"), FALSE);
gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
@ -2843,7 +2897,8 @@ common_gtk_main( class configured_features *my_config)
pDrawingArea = gtk_drawing_area_new();
gtk_container_add (GTK_CONTAINER (pVBox), pDrawingArea);
gtk_widget_set_size_request(GTK_WIDGET(pDrawingArea), 256, 384);
winsize_current = WINSIZE_1;
UpdateDrawingAreaAspect();
gtk_widget_set_events(pDrawingArea,
GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK |