56 |
|
* Utility functions |
57 |
|
*/ |
58 |
|
|
59 |
+ |
#if ! GLIB_CHECK_VERSION(2,0,0) |
60 |
+ |
#define G_OBJECT(obj) GTK_OBJECT(obj) |
61 |
+ |
#define g_object_get_data(obj, key) gtk_object_get_data((obj), (key)) |
62 |
+ |
#define g_object_set_data(obj, key, data) gtk_object_set_data((obj), (key), (data)) |
63 |
+ |
#endif |
64 |
+ |
|
65 |
|
struct opt_desc { |
66 |
|
int label_id; |
67 |
|
GtkSignalFunc func; |
68 |
|
}; |
69 |
|
|
70 |
+ |
struct combo_desc { |
71 |
+ |
int label_id; |
72 |
+ |
}; |
73 |
+ |
|
74 |
+ |
struct file_req_assoc { |
75 |
+ |
file_req_assoc(GtkWidget *r, GtkWidget *e) : req(r), entry(e) {} |
76 |
+ |
GtkWidget *req; |
77 |
+ |
GtkWidget *entry; |
78 |
+ |
}; |
79 |
+ |
|
80 |
+ |
static void cb_browse_ok(GtkWidget *button, file_req_assoc *assoc) |
81 |
+ |
{ |
82 |
+ |
gchar *file = (char *)gtk_file_selection_get_filename(GTK_FILE_SELECTION(assoc->req)); |
83 |
+ |
gtk_entry_set_text(GTK_ENTRY(assoc->entry), file); |
84 |
+ |
gtk_widget_destroy(assoc->req); |
85 |
+ |
delete assoc; |
86 |
+ |
} |
87 |
+ |
|
88 |
+ |
static void cb_browse(GtkWidget *widget, void *user_data) |
89 |
+ |
{ |
90 |
+ |
GtkWidget *req = gtk_file_selection_new(GetString(STR_BROWSE_TITLE)); |
91 |
+ |
gtk_signal_connect_object(GTK_OBJECT(req), "delete_event", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(req)); |
92 |
+ |
gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(req)->ok_button), "clicked", GTK_SIGNAL_FUNC(cb_browse_ok), new file_req_assoc(req, (GtkWidget *)user_data)); |
93 |
+ |
gtk_signal_connect_object(GTK_OBJECT(GTK_FILE_SELECTION(req)->cancel_button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(req)); |
94 |
+ |
gtk_widget_show(req); |
95 |
+ |
} |
96 |
+ |
|
97 |
+ |
static GtkWidget *make_browse_button(GtkWidget *entry) |
98 |
+ |
{ |
99 |
+ |
GtkWidget *button; |
100 |
+ |
|
101 |
+ |
button = gtk_button_new_with_label(GetString(STR_BROWSE_CTRL)); |
102 |
+ |
gtk_widget_show(button); |
103 |
+ |
gtk_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc)cb_browse, (void *)entry); |
104 |
+ |
return button; |
105 |
+ |
} |
106 |
+ |
|
107 |
|
static void add_menu_item(GtkWidget *menu, int label_id, GtkSignalFunc func) |
108 |
|
{ |
109 |
|
GtkWidget *item = gtk_menu_item_new_with_label(GetString(label_id)); |
167 |
|
return table; |
168 |
|
} |
169 |
|
|
170 |
+ |
static GtkWidget *table_make_option_menu(GtkWidget *table, int row, int label_id, const opt_desc *options, int active) |
171 |
+ |
{ |
172 |
+ |
GtkWidget *label, *opt, *menu; |
173 |
+ |
|
174 |
+ |
label = gtk_label_new(GetString(label_id)); |
175 |
+ |
gtk_widget_show(label); |
176 |
+ |
gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row + 1, (GtkAttachOptions)0, (GtkAttachOptions)0, 4, 4); |
177 |
+ |
|
178 |
+ |
opt = gtk_option_menu_new(); |
179 |
+ |
gtk_widget_show(opt); |
180 |
+ |
menu = gtk_menu_new(); |
181 |
+ |
|
182 |
+ |
while (options->label_id) { |
183 |
+ |
add_menu_item(menu, options->label_id, options->func); |
184 |
+ |
options++; |
185 |
+ |
} |
186 |
+ |
gtk_menu_set_active(GTK_MENU(menu), active); |
187 |
+ |
|
188 |
+ |
gtk_option_menu_set_menu(GTK_OPTION_MENU(opt), menu); |
189 |
+ |
gtk_table_attach(GTK_TABLE(table), opt, 1, 2, row, row + 1, (GtkAttachOptions)(GTK_FILL | GTK_EXPAND), (GtkAttachOptions)0, 4, 4); |
190 |
+ |
return menu; |
191 |
+ |
} |
192 |
+ |
|
193 |
+ |
static GtkWidget *table_make_combobox(GtkWidget *table, int row, int label_id, const char *default_value, GList *glist) |
194 |
+ |
{ |
195 |
+ |
GtkWidget *label, *combo; |
196 |
+ |
char str[32]; |
197 |
+ |
|
198 |
+ |
label = gtk_label_new(GetString(label_id)); |
199 |
+ |
gtk_widget_show(label); |
200 |
+ |
gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row + 1, (GtkAttachOptions)0, (GtkAttachOptions)0, 4, 4); |
201 |
+ |
|
202 |
+ |
combo = gtk_combo_new(); |
203 |
+ |
gtk_widget_show(combo); |
204 |
+ |
gtk_combo_set_popdown_strings(GTK_COMBO(combo), glist); |
205 |
+ |
|
206 |
+ |
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry), default_value); |
207 |
+ |
gtk_table_attach(GTK_TABLE(table), combo, 1, 2, row, row + 1, (GtkAttachOptions)(GTK_FILL | GTK_EXPAND), (GtkAttachOptions)0, 4, 4); |
208 |
+ |
|
209 |
+ |
return combo; |
210 |
+ |
} |
211 |
+ |
|
212 |
+ |
static GtkWidget *table_make_combobox(GtkWidget *table, int row, int label_id, const char *default_value, const combo_desc *options) |
213 |
+ |
{ |
214 |
+ |
GList *glist = NULL; |
215 |
+ |
while (options->label_id) { |
216 |
+ |
glist = g_list_append(glist, (void *)GetString(options->label_id)); |
217 |
+ |
options++; |
218 |
+ |
} |
219 |
+ |
|
220 |
+ |
return table_make_combobox(table, row, label_id, default_value, glist); |
221 |
+ |
} |
222 |
+ |
|
223 |
+ |
static GtkWidget *table_make_file_entry(GtkWidget *table, int row, int label_id, const char *prefs_item, bool only_dirs = false) |
224 |
+ |
{ |
225 |
+ |
GtkWidget *box, *label, *entry, *button; |
226 |
+ |
|
227 |
+ |
label = gtk_label_new(GetString(label_id)); |
228 |
+ |
gtk_widget_show(label); |
229 |
+ |
gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row + 1, (GtkAttachOptions)0, (GtkAttachOptions)0, 4, 4); |
230 |
+ |
|
231 |
+ |
const char *str = PrefsFindString(prefs_item); |
232 |
+ |
if (str == NULL) |
233 |
+ |
str = ""; |
234 |
+ |
|
235 |
+ |
box = gtk_hbox_new(FALSE, 4); |
236 |
+ |
gtk_widget_show(box); |
237 |
+ |
gtk_table_attach(GTK_TABLE(table), box, 1, 2, row, row + 1, (GtkAttachOptions)(GTK_FILL | GTK_EXPAND), (GtkAttachOptions)0, 4, 4); |
238 |
+ |
|
239 |
+ |
entry = gtk_entry_new(); |
240 |
+ |
gtk_entry_set_text(GTK_ENTRY(entry), str); |
241 |
+ |
gtk_widget_show(entry); |
242 |
+ |
gtk_box_pack_start(GTK_BOX(box), entry, TRUE, TRUE, 0); |
243 |
+ |
|
244 |
+ |
button = make_browse_button(entry); |
245 |
+ |
gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0); |
246 |
+ |
g_object_set_data(G_OBJECT(entry), "chooser_button", button); |
247 |
+ |
return entry; |
248 |
+ |
} |
249 |
+ |
|
250 |
|
static GtkWidget *make_option_menu(GtkWidget *top, int label_id, const opt_desc *options, int active) |
251 |
|
{ |
252 |
|
GtkWidget *box, *label, *opt, *menu; |
407 |
|
// Menu item descriptions |
408 |
|
static GtkItemFactoryEntry menu_items[] = { |
409 |
|
{(gchar *)GetString(STR_PREFS_MENU_FILE_GTK), NULL, NULL, 0, "<Branch>"}, |
410 |
< |
{(gchar *)GetString(STR_PREFS_ITEM_START_GTK), NULL, GTK_SIGNAL_FUNC(cb_start), 0, NULL}, |
410 |
> |
{(gchar *)GetString(STR_PREFS_ITEM_START_GTK), "<control>S", GTK_SIGNAL_FUNC(cb_start), 0, NULL}, |
411 |
|
{(gchar *)GetString(STR_PREFS_ITEM_ZAP_PRAM_GTK), NULL, GTK_SIGNAL_FUNC(mn_zap_pram), 0, NULL}, |
412 |
|
{(gchar *)GetString(STR_PREFS_ITEM_SEPL_GTK), NULL, NULL, 0, "<Separator>"}, |
413 |
|
{(gchar *)GetString(STR_PREFS_ITEM_QUIT_GTK), "<control>Q", GTK_SIGNAL_FUNC(cb_quit), 0, NULL}, |
484 |
|
selected_volume = row; |
485 |
|
} |
486 |
|
|
364 |
– |
struct file_req_assoc { |
365 |
– |
file_req_assoc(GtkWidget *r, GtkWidget *e) : req(r), entry(e) {} |
366 |
– |
GtkWidget *req; |
367 |
– |
GtkWidget *entry; |
368 |
– |
}; |
369 |
– |
|
487 |
|
// Volume selected for addition |
488 |
|
static void add_volume_ok(GtkWidget *button, file_req_assoc *assoc) |
489 |
|
{ |
970 |
|
// Set sensitivity of widgets |
971 |
|
static void set_input_sensitive(void) |
972 |
|
{ |
973 |
< |
gtk_widget_set_sensitive(w_keycode_file, PrefsFindBool("keycodes")); |
973 |
> |
const bool use_keycodes = PrefsFindBool("keycodes"); |
974 |
> |
gtk_widget_set_sensitive(w_keycode_file, use_keycodes); |
975 |
> |
gtk_widget_set_sensitive(GTK_WIDGET(g_object_get_data(G_OBJECT(w_keycode_file), "chooser_button")), use_keycodes); |
976 |
|
gtk_widget_set_sensitive(w_mouse_wheel_lines, PrefsFindInt32("mousewheelmode") == 1); |
977 |
|
} |
978 |
|
|
1002 |
|
// Create "Input" pane |
1003 |
|
static void create_input_pane(GtkWidget *top) |
1004 |
|
{ |
1005 |
< |
GtkWidget *box, *hbox, *menu, *label; |
1005 |
> |
GtkWidget *box, *hbox, *menu, *label, *button; |
1006 |
|
GtkObject *adj; |
1007 |
|
|
1008 |
|
box = make_pane(top, STR_INPUT_PANE_TITLE); |
1009 |
|
|
1010 |
|
make_checkbox(box, STR_KEYCODES_CTRL, "keycodes", GTK_SIGNAL_FUNC(tb_keycodes)); |
1011 |
< |
w_keycode_file = make_entry(box, STR_KEYCODE_FILE_CTRL, "keycodefile"); |
1011 |
> |
|
1012 |
> |
hbox = gtk_hbox_new(FALSE, 4); |
1013 |
> |
gtk_widget_show(hbox); |
1014 |
> |
gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0); |
1015 |
> |
|
1016 |
> |
label = gtk_label_new(GetString(STR_KEYCODES_CTRL)); |
1017 |
> |
gtk_widget_show(label); |
1018 |
> |
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
1019 |
> |
|
1020 |
> |
const char *str = PrefsFindString("keycodefile"); |
1021 |
> |
if (str == NULL) |
1022 |
> |
str = ""; |
1023 |
> |
|
1024 |
> |
w_keycode_file = gtk_entry_new(); |
1025 |
> |
gtk_entry_set_text(GTK_ENTRY(w_keycode_file), str); |
1026 |
> |
gtk_widget_show(w_keycode_file); |
1027 |
> |
gtk_box_pack_start(GTK_BOX(hbox), w_keycode_file, TRUE, TRUE, 0); |
1028 |
> |
|
1029 |
> |
button = make_browse_button(w_keycode_file); |
1030 |
> |
gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
1031 |
> |
g_object_set_data(G_OBJECT(w_keycode_file), "chooser_button", button); |
1032 |
|
|
1033 |
|
make_separator(box); |
1034 |
|
|
1156 |
|
} |
1157 |
|
close(s); |
1158 |
|
} |
1159 |
+ |
#ifdef HAVE_SLIRP |
1160 |
+ |
static char s_slirp[] = "slirp"; |
1161 |
+ |
glist = g_list_append(glist, s_slirp); |
1162 |
+ |
#endif |
1163 |
|
if (glist) |
1164 |
|
g_list_sort(glist, gl_str_cmp); |
1165 |
|
else |
1225 |
|
* "Memory/Misc" pane |
1226 |
|
*/ |
1227 |
|
|
1228 |
< |
static GtkObject *w_ramsize_adj; |
1228 |
> |
static GtkWidget *w_ramsize; |
1229 |
|
static GtkWidget *w_rom_file; |
1230 |
|
|
1231 |
|
// Don't use CPU when idle? |
1243 |
|
// Read settings from widgets and set preferences |
1244 |
|
static void read_memory_settings(void) |
1245 |
|
{ |
1246 |
< |
PrefsReplaceInt32("ramsize", int(GTK_ADJUSTMENT(w_ramsize_adj)->value) << 20); |
1246 |
> |
const char *str = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(w_ramsize)->entry)); |
1247 |
> |
PrefsReplaceInt32("ramsize", atoi(str) << 20); |
1248 |
|
|
1249 |
< |
const char *str = gtk_entry_get_text(GTK_ENTRY(w_rom_file)); |
1249 |
> |
str = gtk_entry_get_text(GTK_ENTRY(w_rom_file)); |
1250 |
|
if (str && strlen(str)) |
1251 |
|
PrefsReplaceString("rom", str); |
1252 |
|
else |
1256 |
|
// Create "Memory/Misc" pane |
1257 |
|
static void create_memory_pane(GtkWidget *top) |
1258 |
|
{ |
1259 |
< |
GtkWidget *box, *vbox, *hbox, *hbox2, *label, *scale; |
1259 |
> |
GtkWidget *box, *hbox, *table, *label, *menu; |
1260 |
|
|
1261 |
|
box = make_pane(top, STR_MEMORY_MISC_PANE_TITLE); |
1262 |
+ |
table = make_table(box, 2, 5); |
1263 |
|
|
1264 |
< |
hbox = gtk_hbox_new(FALSE, 4); |
1265 |
< |
gtk_widget_show(hbox); |
1266 |
< |
|
1267 |
< |
label = gtk_label_new(GetString(STR_RAMSIZE_SLIDER)); |
1268 |
< |
gtk_widget_show(label); |
1269 |
< |
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
1270 |
< |
|
1271 |
< |
vbox = gtk_vbox_new(FALSE, 4); |
1272 |
< |
gtk_widget_show(vbox); |
1273 |
< |
|
1274 |
< |
gfloat min, max; |
1275 |
< |
min = 4; |
1276 |
< |
max = 512; |
1277 |
< |
w_ramsize_adj = gtk_adjustment_new(min, min, max, 1, 16, 0); |
1133 |
< |
gtk_adjustment_set_value(GTK_ADJUSTMENT(w_ramsize_adj), PrefsFindInt32("ramsize") >> 20); |
1134 |
< |
|
1135 |
< |
scale = gtk_hscale_new(GTK_ADJUSTMENT(w_ramsize_adj)); |
1136 |
< |
gtk_widget_show(scale); |
1137 |
< |
gtk_scale_set_digits(GTK_SCALE(scale), 0); |
1138 |
< |
gtk_box_pack_start(GTK_BOX(vbox), scale, TRUE, TRUE, 0); |
1139 |
< |
|
1140 |
< |
hbox2 = gtk_hbox_new(FALSE, 4); |
1141 |
< |
gtk_widget_show(hbox2); |
1142 |
< |
|
1143 |
< |
char val[32]; |
1144 |
< |
sprintf(val, GetString(STR_RAMSIZE_FMT), int(min)); |
1145 |
< |
label = gtk_label_new(val); |
1146 |
< |
gtk_widget_show(label); |
1147 |
< |
gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); |
1148 |
< |
|
1149 |
< |
sprintf(val, GetString(STR_RAMSIZE_FMT), int(max)); |
1150 |
< |
label = gtk_label_new(val); |
1151 |
< |
gtk_widget_show(label); |
1152 |
< |
gtk_box_pack_end(GTK_BOX(hbox2), label, FALSE, FALSE, 0); |
1153 |
< |
gtk_box_pack_start(GTK_BOX(vbox), hbox2, TRUE, TRUE, 0); |
1154 |
< |
gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); |
1155 |
< |
gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0); |
1264 |
> |
static const combo_desc options[] = { |
1265 |
> |
STR_RAMSIZE_4MB_LAB, |
1266 |
> |
STR_RAMSIZE_8MB_LAB, |
1267 |
> |
STR_RAMSIZE_16MB_LAB, |
1268 |
> |
STR_RAMSIZE_32MB_LAB, |
1269 |
> |
STR_RAMSIZE_64MB_LAB, |
1270 |
> |
STR_RAMSIZE_128MB_LAB, |
1271 |
> |
STR_RAMSIZE_256MB_LAB, |
1272 |
> |
STR_RAMSIZE_512MB_LAB, |
1273 |
> |
0 |
1274 |
> |
}; |
1275 |
> |
char default_ramsize[10]; |
1276 |
> |
sprintf(default_ramsize, "%d", PrefsFindInt32("ramsize") >> 20); |
1277 |
> |
w_ramsize = table_make_combobox(table, 0, STR_RAMSIZE_CTRL, default_ramsize, options); |
1278 |
|
|
1279 |
< |
w_rom_file = make_entry(box, STR_ROM_FILE_CTRL, "rom"); |
1279 |
> |
w_rom_file = table_make_file_entry(table, 1, STR_ROM_FILE_CTRL, "rom"); |
1280 |
|
|
1281 |
|
make_checkbox(box, STR_IGNORESEGV_CTRL, "ignoresegv", GTK_SIGNAL_FUNC(tb_ignoresegv)); |
1282 |
|
make_checkbox(box, STR_IDLEWAIT_CTRL, "idlewait", GTK_SIGNAL_FUNC(tb_idlewait)); |