1 /***********************************************************************
2 * ��˥塼�С�����
3 ************************************************************************/
4
5 /* QUASI88 �ν����ϡ� INIT / MAIN / WAIT ��3�ե��������롣
6 * INIT �ϡ����ߥ塿��˥塼�ʤɤ����ػ��Τ¹Ԥ��졢
7 * �̾�ϡ� MAIN �� WAIT �� MAIN �� WAIT �� �ȼ¹Ԥ���롣
8 *
9 * MAIN �ϡ����ߥ� �� �������� �� ���٥�Ƚ��� �� �������� ��Ԥʤ���
10 * WAIT �ϡ��»��֤Ȥ�Ʊ�� (�����٤�) �Τߤ�Ԥʤ���
11 *
12 * ���ơ�GTK �Υ�˥塼�С��ν������������Τɤ��ǹԤʤ���Τ�����
13 */
14
15
16 #include <gdk/gdkkeysyms.h>
17
18 #include "quasi88.h"
19 #include "device.h"
20 #include "event.h"
21
22 #include "initval.h"
23 #include "pc88main.h" /* boot_basic, ... */
24 #include "memory.h" /* use_pcg */
25 #include "soundbd.h" /* sound_board */
26 #include "intr.h" /* cpu_clock_mhz */
27 #include "keyboard.h" /* mouse_mode */
28 #include "fdc.h" /* fdc_wait */
29 #include "getconf.h" /* config_save */
30 #include "screen.h" /* SCREEN_INTERLACE_NO ... */
31 #include "emu.h" /* cpu_timing, emu_reset() */
32 #include "menu.h" /* menu_sound_restart() */
33 #include "drive.h"
34 #include "snddrv.h"
35
36 extern int sdl_buffersize;
37
38
39 static void menubar_item_setup(void);
40 static void menubar_item_sensitive(int sensitive);
41
42 /* �ե�����������η�̤���Ǽ����륰���Х��ѿ� �ʤˡ����μ��� (;_;) */
43 static char menubar_filename[QUASI88_MAX_FILENAME];
44
45 static int menubar_active;
46
47 static T_RESET_CFG menubar_reset_cfg;
48
49 #define LOCK_MENUBAR() { \
50 int save = menubar_active; \
51 menubar_active = FALSE;
52
53 #define UNLOCK_MENUBAR() menubar_active = save; \
54 }
55
56
57
58 /* �����ƥ�ե����ȥ�Τ��ڤʤΤ������٤������椬�狼��ʤ��ΤǼ��Ϥǽ��� */
59
60 /*
61 * ��˥塼�ι��ܰ��� ��˥塼���ܤ��Ȥˡ��ֹ���꿶��
62 */
63 enum {
64 M_TOP,
65
66 /*----------------*/
67 M_SYS,
68
69 M_SYS_RESET,
70
71 M_SYS_MODE,
72 M_SYS_MODE_V2,
73 M_SYS_MODE_V1H,
74 M_SYS_MODE_V1S,
75 M_SYS_MODE_N,
76 M_SYS_MODE_4MH,
77 M_SYS_MODE_8MH,
78 M_SYS_MODE_SB,
79 M_SYS_MODE_SB2,
80
81 M_SYS_RESET_V2,
82 M_SYS_RESET_V1H,
83 M_SYS_RESET_V1S,
84
85 M_SYS_MENU,
86
87 M_SYS_SAVE,
88 M_SYS_EXIT,
89
90 /*----------------*/
91 M_SET,
92
93 M_SET_SPD,
94 M_SET_SPD_DUMMY,
95 M_SET_SPD_25,
96 M_SET_SPD_50,
97 M_SET_SPD_100,
98 M_SET_SPD_200,
99 M_SET_SPD_400,
100 M_SET_SPD_MAX,
101
102 M_SET_SUB,
103 M_SET_SUB_DUMMY,
104 M_SET_SUB_SOME,
105 M_SET_SUB_OFT,
106 M_SET_SUB_ALL,
107
108 M_SET_FDCWAIT,
109
110 M_SET_REF,
111 M_SET_REF_DUMMY,
112 M_SET_REF_60,
113 M_SET_REF_30,
114 M_SET_REF_20,
115 M_SET_REF_15,
116
117 M_SET_INT,
118 M_SET_INT_DUMMY,
119 M_SET_INT_NO,
120 M_SET_INT_SKIP,
121 M_SET_INT_YES,
122
123 M_SET_SIZ,
124 M_SET_SIZ_DUMMY,
125 M_SET_SIZ_FULL,
126 M_SET_SIZ_HALF,
127
128 M_SET_PCG,
129
130 M_SET_MO,
131 M_SET_MO_DUMMY,
132 M_SET_MO_NO,
133 M_SET_MO_MOUSE,
134 M_SET_MO_JOYMO,
135 M_SET_MO_JOY,
136
137 M_SET_CUR,
138 M_SET_CUR_DUMMY,
139 M_SET_CUR_DEF,
140 M_SET_CUR_TEN,
141
142 M_SET_NUMLOCK,
143 M_SET_ROMAJI,
144
145 M_SET_FM,
146 M_SET_FM_DUMMY,
147 M_SET_FM_MAME,
148 M_SET_FM_FMGEN,
149
150 M_SET_FRQ,
151 M_SET_FRQ_DUMMY,
152 M_SET_FRQ_48,
153 M_SET_FRQ_44,
154 M_SET_FRQ_22,
155 M_SET_FRQ_11,
156
157 M_SET_BUF,
158 M_SET_BUF_DUMMY,
159 M_SET_BUF_800,
160 M_SET_BUF_400,
161 M_SET_BUF_200,
162 M_SET_BUF_100,
163
164 /*----------------*/
165 M_DRV,
166
167 M_DRV_DRV1,
168 M_DRV_DRV1_DUMMY,
169 M_DRV_DRV1_1,
170 M_DRV_DRV1_2,
171 M_DRV_DRV1_3,
172 M_DRV_DRV1_4,
173 M_DRV_DRV1_5,
174 M_DRV_DRV1_6,
175 M_DRV_DRV1_7,
176 M_DRV_DRV1_8,
177 M_DRV_DRV1_9,
178 M_DRV_DRV1_NO,
179 M_DRV_DRV1_CHG,
180
181 M_DRV_DRV2,
182 M_DRV_DRV2_DUMMY,
183 M_DRV_DRV2_1,
184 M_DRV_DRV2_2,
185 M_DRV_DRV2_3,
186 M_DRV_DRV2_4,
187 M_DRV_DRV2_5,
188 M_DRV_DRV2_6,
189 M_DRV_DRV2_7,
190 M_DRV_DRV2_8,
191 M_DRV_DRV2_9,
192 M_DRV_DRV2_NO,
193 M_DRV_DRV2_CHG,
194
195 M_DRV_CHG,
196 M_DRV_UNSET,
197
198 /*----------------*/
199 M_MISC,
200
201 M_MISC_CAPTURE,
202 M_MISC_RECORD,
203
204 M_MISC_CLOAD,
205 M_MISC_CLOAD_S_DUMMY,
206 M_MISC_CLOAD_S,
207 M_MISC_CLOAD_U,
208
209 M_MISC_CSAVE,
210 M_MISC_CSAVE_S_DUMMY,
211 M_MISC_CSAVE_S,
212 M_MISC_CSAVE_U,
213
214 M_MISC_SLOAD,
215 M_MISC_SLOAD_1,
216 M_MISC_SLOAD_2,
217 M_MISC_SLOAD_3,
218 M_MISC_SLOAD_4,
219 M_MISC_SLOAD_5,
220 M_MISC_SLOAD_6,
221 M_MISC_SLOAD_7,
222 M_MISC_SLOAD_8,
223 M_MISC_SLOAD_9,
224
225 M_MISC_SSAVE,
226 M_MISC_SSAVE_1,
227 M_MISC_SSAVE_2,
228 M_MISC_SSAVE_3,
229 M_MISC_SSAVE_4,
230 M_MISC_SSAVE_5,
231 M_MISC_SSAVE_6,
232 M_MISC_SSAVE_7,
233 M_MISC_SSAVE_8,
234 M_MISC_SSAVE_9,
235
236 M_MISC_STATUS,
237
238 /*----------------*/
239 M_HELP,
240 M_HELP_ABOUT,
241
242 M_END
243 };
244 enum { /* �饸�������ƥ�Υ��롼�װ��� */
245 GRP_BASIC,
246 GRP_CLOCK,
247 GRP_SB,
248 GRP_SPEED,
249 GRP_SUBCPU,
250 GRP_REFRESH,
251 GRP_INTERLACE,
252 GRP_SIZE,
253 GRP_MOUSE,
254 GRP_CURSOR,
255 GRP_FM,
256 GRP_FRQ,
257 GRP_BUF,
258 GRP_DRIVE1,
259 GRP_DRIVE2,
260 GRP_CLOAD,
261 GRP_CSAVE,
262 GRP_END
263 };
264
265 static struct { /* �������åȤʤɤξ������¸���� */
266 GtkWidget *widget;
267 GtkWidget *label;
268 GtkWidget *submenu;
269 } mwidget[M_END];
270
271 static GSList *mlist[GRP_END]; /* �饸�������ƥ�Υꥹ�Ȥ���¸���� */
272
273 /*
274 * ������Хå��ؿ�
275 */
276
277 static void f_sys_reset (GtkMenuItem *widget, gpointer data);
278 static void f_sys_reset_as (GtkMenuItem *widget, gpointer data);
279 static void f_sys_basic (GtkRadioMenuItem *widget, gpointer data);
280 static void f_sys_clock (GtkRadioMenuItem *widget, gpointer data);
281 static void f_sys_sb (GtkRadioMenuItem *widget, gpointer data);
282 static void f_sys_menu (GtkMenuItem *widget, gpointer data);
283 static void f_sys_save (GtkMenuItem *widget, gpointer data);
284 static void f_sys_exit (GtkMenuItem *widget, gpointer data);
285 static void f_set_speed (GtkRadioMenuItem *widget, gpointer data);
286 static void f_set_nowait (GtkCheckMenuItem *widget, gpointer data);
287 static void f_set_subcpu (GtkRadioMenuItem *widget, gpointer data);
288 static void f_set_fdcwait (GtkCheckMenuItem *widget, gpointer data);
289 static void f_set_refresh (GtkRadioMenuItem *widget, gpointer data);
290 static void f_set_interlace (GtkRadioMenuItem *widget, gpointer data);
291 static void f_set_size (GtkRadioMenuItem *widget, gpointer data);
292 static void f_set_pcg (GtkCheckMenuItem *widget, gpointer data);
293 static void f_set_mouse (GtkRadioMenuItem *widget, gpointer data);
294 static void f_set_cursor (GtkRadioMenuItem *widget, gpointer data);
295 static void f_set_numlock (GtkCheckMenuItem *widget, gpointer data);
296 static void f_set_romaji (GtkCheckMenuItem *widget, gpointer data);
297 static void f_set_fm (GtkRadioMenuItem *widget, gpointer data);
298 static void f_set_frq (GtkRadioMenuItem *widget, gpointer data);
299 static void f_set_buf (GtkRadioMenuItem *widget, gpointer data);
300 static void f_drv_chg (GtkMenuItem *widget, gpointer data);
301 static void f_drv_drv1 (GtkRadioMenuItem *widget, gpointer data);
302 static void f_drv_drv2 (GtkRadioMenuItem *widget, gpointer data);
303 static void f_drv_unset (GtkMenuItem *widget, gpointer data);
304 static void f_misc_capture (GtkMenuItem *widget, gpointer data);
305 static void f_misc_record (GtkCheckMenuItem *widget, gpointer data);
306 static void f_misc_cload_s (GtkMenuItem *widget, gpointer data);
307 static void f_misc_cload_u (GtkMenuItem *widget, gpointer data);
308 static void f_misc_csave_s (GtkMenuItem *widget, gpointer data);
309 static void f_misc_csave_u (GtkMenuItem *widget, gpointer data);
310 static void f_misc_sload (GtkMenuItem *widget, gpointer data);
311 static void f_misc_ssave (GtkMenuItem *widget, gpointer data);
312 static void f_misc_status (GtkCheckMenuItem *widget, gpointer data);
313 static void f_help_about (GtkMenuItem *widget, gpointer data);
314
315 /*
316 * ��˥塼�ι������� �ƻҴط��Τ����Τϡ��Ƥ�����
317 */
318
319 typedef struct {
320 enum {
321 TP_SUB,
322 TP_ITEM,
323 TP_CHECK,
324 TP_RADIO,
325 TP_SEP
326 } type;
327 int id;
328 const char *label;
329 int parent;
330 int group;
331 void (*callback)();
332 int data;
333 } T_MENUTABLE;
334
335 static T_MENUTABLE menutable[] =
336 {
337 { TP_SUB, M_SYS, "System", M_TOP, 0, 0, 0 },
338
339 { TP_ITEM, M_SYS_RESET, "Reset", M_SYS, 0, f_sys_reset, 0 },
340
341 { TP_SUB, M_SYS_MODE, "Mode", M_SYS, 0, 0, 0 },
342 { TP_RADIO, M_SYS_MODE_V2, "V2", M_SYS_MODE, GRP_BASIC, f_sys_basic, BASIC_V2 },
343 { TP_RADIO, M_SYS_MODE_V1H, "V1H", M_SYS_MODE, GRP_BASIC, f_sys_basic, BASIC_V1H },
344 { TP_RADIO, M_SYS_MODE_V1S, "V1S", M_SYS_MODE, GRP_BASIC, f_sys_basic, BASIC_V1S },
345 { TP_RADIO, M_SYS_MODE_N, "N", M_SYS_MODE, GRP_BASIC, f_sys_basic, BASIC_N },
346 { TP_SEP, 0, 0, M_SYS_MODE, 0, 0, 0 },
347 { TP_RADIO, M_SYS_MODE_4MH, "4MHz", M_SYS_MODE, GRP_CLOCK, f_sys_clock, CLOCK_4MHZ },
348 { TP_RADIO, M_SYS_MODE_8MH, "8MHz", M_SYS_MODE, GRP_CLOCK, f_sys_clock, CLOCK_8MHZ },
349 { TP_SEP, 0, 0, M_SYS_MODE, 0, 0, 0 },
350 { TP_RADIO, M_SYS_MODE_SB, "Sound Board", M_SYS_MODE, GRP_SB, f_sys_sb, SOUND_I },
351 { TP_RADIO, M_SYS_MODE_SB2, "Sound Board II", M_SYS_MODE, GRP_SB, f_sys_sb, SOUND_II },
352
353 { TP_SEP, 0, 0, M_SYS, 0, 0, 0 },
354
355 { TP_ITEM, M_SYS_RESET_V2, "V2 mode", M_SYS, 0, f_sys_reset_as, BASIC_V2 },
356 { TP_ITEM, M_SYS_RESET_V1H,"V1H mode", M_SYS, 0, f_sys_reset_as, BASIC_V1H },
357 { TP_ITEM, M_SYS_RESET_V1S,"V1S mode", M_SYS, 0, f_sys_reset_as, BASIC_V1S },
358
359 { TP_SEP, 0, 0, M_SYS, 0, 0, 0 },
360
361 { TP_ITEM, M_SYS_MENU, "Menu", M_SYS, 0, f_sys_menu, 0 },
362
363 { TP_SEP, 0, 0, M_SYS, 0, 0, 0 },
364
365 { TP_ITEM, M_SYS_SAVE, "Save Config", M_SYS, 0, f_sys_save, 0 },
366 { TP_ITEM, M_SYS_EXIT, "Exit", M_SYS, 0, f_sys_exit, 0 },
367
368 /*------------------------------------------------------------------------------------------------------------------*/
369
370 { TP_SUB, M_SET, "Setting", M_TOP, 0, 0, 0 },
371
372 { TP_SUB, M_SET_SPD, "Speed", M_SET, 0, 0, 0 },
373 { TP_RADIO, M_SET_SPD_DUMMY,0, M_SET_SPD, GRP_SPEED, 0, 0 },
374 { TP_RADIO, M_SET_SPD_25, " 25%", M_SET_SPD, GRP_SPEED, f_set_speed, 25 },
375 { TP_RADIO, M_SET_SPD_50, " 50%", M_SET_SPD, GRP_SPEED, f_set_speed, 50 },
376 { TP_RADIO, M_SET_SPD_100, "100%", M_SET_SPD, GRP_SPEED, f_set_speed, 100 },
377 { TP_RADIO, M_SET_SPD_200, "200%", M_SET_SPD, GRP_SPEED, f_set_speed, 200 },
378 { TP_RADIO, M_SET_SPD_400, "400%", M_SET_SPD, GRP_SPEED, f_set_speed, 400 },
379 { TP_SEP, 0, 0, M_SET_SPD, 0, 0, 0 },
380 { TP_CHECK, M_SET_SPD_MAX, "No wait", M_SET_SPD, 0, f_set_nowait, 0 },
381
382 { TP_SUB, M_SET_SUB, "Sub-CPU", M_SET, 0, 0, 0 },
383 { TP_RADIO, M_SET_SUB_DUMMY,0, M_SET_SUB, GRP_SUBCPU, 0, 0 },
384 { TP_RADIO, M_SET_SUB_SOME, "Run sometimes", M_SET_SUB, GRP_SUBCPU, f_set_subcpu, 0 },
385 { TP_RADIO, M_SET_SUB_OFT, "Run often", M_SET_SUB, GRP_SUBCPU, f_set_subcpu, 1 },
386 { TP_RADIO, M_SET_SUB_ALL, "Run always", M_SET_SUB, GRP_SUBCPU, f_set_subcpu, 2 },
387
388 { TP_CHECK, M_SET_FDCWAIT, "Use FDC-Wait", M_SET, 0, f_set_fdcwait, 0 },
389
390 { TP_SEP, 0, 0, M_SET, 0, 0, 0 },
391
392 { TP_SUB, M_SET_REF, "Refresh Rate", M_SET, 0, 0, 0 },
393 { TP_RADIO, M_SET_REF_DUMMY,0, M_SET_REF, GRP_REFRESH, 0, 0 },
394 { TP_RADIO, M_SET_REF_60, "60fps", M_SET_REF, GRP_REFRESH, f_set_refresh, 1 },
395 { TP_RADIO, M_SET_REF_30, "30fps", M_SET_REF, GRP_REFRESH, f_set_refresh, 2 },
396 { TP_RADIO, M_SET_REF_20, "20fps", M_SET_REF, GRP_REFRESH, f_set_refresh, 3 },
397 { TP_RADIO, M_SET_REF_15, "15fps", M_SET_REF, GRP_REFRESH, f_set_refresh, 4 },
398
399 { TP_SUB, M_SET_INT, "Interlace", M_SET, 0, 0, 0 },
400 { TP_RADIO, M_SET_INT_DUMMY,0, M_SET_INT, GRP_INTERLACE, 0, 0 },
401 { TP_RADIO, M_SET_INT_NO, "Non interlace", M_SET_INT, GRP_INTERLACE, f_set_interlace,SCREEN_INTERLACE_NO },
402 { TP_RADIO, M_SET_INT_SKIP, "Skip Line", M_SET_INT, GRP_INTERLACE, f_set_interlace,SCREEN_INTERLACE_SKIP },
403 { TP_RADIO, M_SET_INT_YES, "Interlace", M_SET_INT, GRP_INTERLACE, f_set_interlace,SCREEN_INTERLACE_YES },
404
405 { TP_SUB, M_SET_SIZ, "Screen Size", M_SET, 0, 0, 0 },
406 { TP_RADIO, M_SET_SIZ_DUMMY,0, M_SET_SIZ, GRP_SIZE, 0, 0 },
407 { TP_RADIO, M_SET_SIZ_FULL, "Normal size", M_SET_SIZ, GRP_SIZE, f_set_size, SCREEN_SIZE_FULL},
408 { TP_RADIO, M_SET_SIZ_HALF, "Half size", M_SET_SIZ, GRP_SIZE, f_set_size, SCREEN_SIZE_HALF},
409
410 { TP_CHECK, M_SET_PCG, "Use PCG-8100", M_SET, 0, f_set_pcg, 0 },
411
412 { TP_SEP, 0, 0, M_SET, 0, 0, 0 },
413
414 { TP_SUB, M_SET_MO, "Mouse", M_SET, 0, 0, 0 },
415 { TP_RADIO, M_SET_MO_DUMMY, 0, M_SET_MO, GRP_MOUSE, 0, 0 },
416 { TP_RADIO, M_SET_MO_NO, "Nothing", M_SET_MO, GRP_MOUSE, f_set_mouse, MOUSE_NONE },
417 { TP_RADIO, M_SET_MO_MOUSE, "Mouse", M_SET_MO, GRP_MOUSE, f_set_mouse, MOUSE_MOUSE },
418 { TP_RADIO, M_SET_MO_JOYMO, "Mouse as joy", M_SET_MO, GRP_MOUSE, f_set_mouse, MOUSE_JOYMOUSE },
419 /* { TP_RADIO, M_SET_MO_JOY, "Joystick", M_SET_MO, GRP_MOUSE, f_set_mouse, MOUSE_JOYSTICK },*/
420
421 { TP_SUB, M_SET_CUR, "Cursor Key", M_SET, 0, 0, 0 },
422 { TP_RADIO, M_SET_CUR_DUMMY,0, M_SET_CUR, GRP_CURSOR, 0, 0 },
423 { TP_RADIO, M_SET_CUR_DEF, "Default", M_SET_CUR, GRP_CURSOR, f_set_cursor, 0 },
424 { TP_RADIO, M_SET_CUR_TEN, "as Ten-key", M_SET_CUR, GRP_CURSOR, f_set_cursor, 1 },
425
426 { TP_CHECK, M_SET_NUMLOCK, "Software Numlock", M_SET, 0, f_set_numlock, 0 },
427 { TP_CHECK, M_SET_ROMAJI, "Kana (Romaji)", M_SET, 0, f_set_romaji, 0 },
428
429 #ifdef USE_SOUND
430 { TP_SEP, 0, 0, M_SET, 0, 0, 0 },
431
432 #ifdef USE_FMGEN
433 { TP_SUB, M_SET_FM, "FM Generator", M_SET, 0, 0, 0 },
434 { TP_RADIO, M_SET_FM_DUMMY, 0, M_SET_FM, GRP_FM, 0, 0 },
435 { TP_RADIO, M_SET_FM_MAME, "MAME embedded", M_SET_FM, GRP_FM, f_set_fm, 0 },
436 { TP_RADIO, M_SET_FM_FMGEN, "fmgen", M_SET_FM, GRP_FM, f_set_fm, 1 },
437 #endif
438
439 { TP_SUB, M_SET_FRQ, "Sample Frequency", M_SET, 0, 0, 0 },
440 { TP_RADIO, M_SET_FRQ_DUMMY,0, M_SET_FRQ, GRP_FRQ, 0, 0 },
441 { TP_RADIO, M_SET_FRQ_48, "48000Hz", M_SET_FRQ, GRP_FRQ, f_set_frq, 48000 },
442 { TP_RADIO, M_SET_FRQ_44, "44100Hz", M_SET_FRQ, GRP_FRQ, f_set_frq, 44100 },
443 { TP_RADIO, M_SET_FRQ_22, "22050Hz", M_SET_FRQ, GRP_FRQ, f_set_frq, 22050 },
444 { TP_RADIO, M_SET_FRQ_11, "11025Hz", M_SET_FRQ, GRP_FRQ, f_set_frq, 11025 },
445
446 { TP_SUB, M_SET_BUF, "Sound Buffer", M_SET, 0, 0, 0 },
447 { TP_RADIO, M_SET_BUF_DUMMY,0, M_SET_BUF, GRP_BUF, 0, 0 },
448 { TP_RADIO, M_SET_BUF_800, "8192", M_SET_BUF, GRP_BUF, f_set_buf, 8192 },
449 { TP_RADIO, M_SET_BUF_400, "4096", M_SET_BUF, GRP_BUF, f_set_buf, 4096 },
450 { TP_RADIO, M_SET_BUF_200, "2048", M_SET_BUF, GRP_BUF, f_set_buf, 2048 },
451 { TP_RADIO, M_SET_BUF_100, "1024", M_SET_BUF, GRP_BUF, f_set_buf, 1024 },
452 #endif
453
454 /*------------------------------------------------------------------------------------------------------------------*/
455
456 { TP_SUB, M_DRV, "Disk", M_TOP, 0, 0, 0 },
457
458 { TP_SUB, M_DRV_DRV1, "Drive 1:", M_DRV, 0, 0, 0 },
459 { TP_RADIO, M_DRV_DRV1_DUMMY,0, M_DRV_DRV1, GRP_DRIVE1, 0, 0 },
460 { TP_RADIO, M_DRV_DRV1_1, "1", M_DRV_DRV1, GRP_DRIVE1, f_drv_drv1, 0 },
461 { TP_RADIO, M_DRV_DRV1_2, "2", M_DRV_DRV1, GRP_DRIVE1, f_drv_drv1, 1 },
462 { TP_RADIO, M_DRV_DRV1_3, "3", M_DRV_DRV1, GRP_DRIVE1, f_drv_drv1, 2 },
463 { TP_RADIO, M_DRV_DRV1_4, "4", M_DRV_DRV1, GRP_DRIVE1, f_drv_drv1, 3 },
464 { TP_RADIO, M_DRV_DRV1_5, "5", M_DRV_DRV1, GRP_DRIVE1, f_drv_drv1, 4 },
465 { TP_RADIO, M_DRV_DRV1_6, "6", M_DRV_DRV1, GRP_DRIVE1, f_drv_drv1, 5 },
466 { TP_RADIO, M_DRV_DRV1_7, "7", M_DRV_DRV1, GRP_DRIVE1, f_drv_drv1, 6 },
467 { TP_RADIO, M_DRV_DRV1_8, "8", M_DRV_DRV1, GRP_DRIVE1, f_drv_drv1, 7 },
468 { TP_RADIO, M_DRV_DRV1_9, "9", M_DRV_DRV1, GRP_DRIVE1, f_drv_drv1, 8 },
469 { TP_RADIO, M_DRV_DRV1_NO, "<No disk>", M_DRV_DRV1, GRP_DRIVE1, f_drv_drv1, -1 },
470 { TP_SEP, 0, 0, M_DRV_DRV1, 0, 0, 0 },
471 { TP_ITEM, M_DRV_DRV1_CHG, "Change ...", M_DRV_DRV1, 0, f_drv_chg, DRIVE_1 },
472
473 { TP_SUB, M_DRV_DRV2, "Drive 2:", M_DRV, 0, 0, 0 },
474 { TP_RADIO, M_DRV_DRV2_DUMMY,0, M_DRV_DRV2, GRP_DRIVE2, 0, 0 },
475 { TP_RADIO, M_DRV_DRV2_1, "1", M_DRV_DRV2, GRP_DRIVE2, f_drv_drv2, 0 },
476 { TP_RADIO, M_DRV_DRV2_2, "2", M_DRV_DRV2, GRP_DRIVE2, f_drv_drv2, 1 },
477 { TP_RADIO, M_DRV_DRV2_3, "3", M_DRV_DRV2, GRP_DRIVE2, f_drv_drv2, 2 },
478 { TP_RADIO, M_DRV_DRV2_4, "4", M_DRV_DRV2, GRP_DRIVE2, f_drv_drv2, 3 },
479 { TP_RADIO, M_DRV_DRV2_5, "5", M_DRV_DRV2, GRP_DRIVE2, f_drv_drv2, 4 },
480 { TP_RADIO, M_DRV_DRV2_6, "6", M_DRV_DRV2, GRP_DRIVE2, f_drv_drv2, 5 },
481 { TP_RADIO, M_DRV_DRV2_7, "7", M_DRV_DRV2, GRP_DRIVE2, f_drv_drv2, 6 },
482 { TP_RADIO, M_DRV_DRV2_8, "8", M_DRV_DRV2, GRP_DRIVE2, f_drv_drv2, 7 },
483 { TP_RADIO, M_DRV_DRV2_9, "9", M_DRV_DRV2, GRP_DRIVE2, f_drv_drv2, 8 },
484 { TP_RADIO, M_DRV_DRV2_NO, "<No disk>", M_DRV_DRV2, GRP_DRIVE2, f_drv_drv2, -1 },
485 { TP_SEP, 0, 0, M_DRV_DRV2, 0, 0, 0 },
486 { TP_ITEM, M_DRV_DRV2_CHG, "Change ...", M_DRV_DRV2, 0, f_drv_chg, DRIVE_2 },
487
488 { TP_SEP, 0, 0, M_DRV, 0, 0, 0 },
489 { TP_ITEM, M_DRV_CHG, "Set ...", M_DRV, 0, f_drv_chg, -1 },
490 { TP_ITEM, M_DRV_UNSET, "Unset", M_DRV, 0, f_drv_unset, -1 },
491
492 /*------------------------------------------------------------------------------------------------------------------*/
493
494 { TP_SUB, M_MISC, "Misc", M_TOP, 0, 0, 0 },
495
496 { TP_ITEM, M_MISC_CAPTURE, "Screen Capture", M_MISC, 0, f_misc_capture, 0 },
497 { TP_CHECK, M_MISC_RECORD, "Sound Record", M_MISC, 0, f_misc_record, 0 },
498
499 { TP_SUB, M_MISC_CLOAD, "Tape-Image [Load]", M_MISC, 0, 0, 0 },
500 { TP_RADIO, M_MISC_CLOAD_S_DUMMY, 0, M_MISC_CLOAD, GRP_CLOAD, 0, 0 },
501 { TP_RADIO, M_MISC_CLOAD_S, "Set ...", M_MISC_CLOAD, GRP_CLOAD, f_misc_cload_s, 0 },
502 { TP_ITEM, M_MISC_CLOAD_U, "Unset", M_MISC_CLOAD, 0, f_misc_cload_u, 0 },
503
504 { TP_SUB, M_MISC_CSAVE, "Tape-Image [Save]", M_MISC, 0, 0, 0 },
505 { TP_RADIO, M_MISC_CSAVE_S_DUMMY, 0, M_MISC_CSAVE, GRP_CSAVE, 0, 0 },
506 { TP_RADIO, M_MISC_CSAVE_S, "Set ...", M_MISC_CSAVE, GRP_CSAVE, f_misc_csave_s, 0 },
507 { TP_ITEM, M_MISC_CSAVE_U, "Unset", M_MISC_CSAVE, 0, f_misc_csave_u, 0 },
508
509 { TP_SEP, 0, 0, M_MISC, 0, 0, 0 },
510
511 { TP_SUB, M_MISC_SLOAD, "State-Load", M_MISC, 0, 0, 0 },
512 { TP_ITEM, M_MISC_SLOAD_1, "1", M_MISC_SLOAD, 0, f_misc_sload, '1' },
513 { TP_ITEM, M_MISC_SLOAD_2, "2", M_MISC_SLOAD, 0, f_misc_sload, '2' },
514 { TP_ITEM, M_MISC_SLOAD_3, "3", M_MISC_SLOAD, 0, f_misc_sload, '3' },
515 { TP_ITEM, M_MISC_SLOAD_4, "4", M_MISC_SLOAD, 0, f_misc_sload, '4' },
516 { TP_ITEM, M_MISC_SLOAD_5, "5", M_MISC_SLOAD, 0, f_misc_sload, '5' },
517 { TP_ITEM, M_MISC_SLOAD_6, "6", M_MISC_SLOAD, 0, f_misc_sload, '6' },
518 { TP_ITEM, M_MISC_SLOAD_7, "7", M_MISC_SLOAD, 0, f_misc_sload, '7' },
519 { TP_ITEM, M_MISC_SLOAD_8, "8", M_MISC_SLOAD, 0, f_misc_sload, '8' },
520 { TP_ITEM, M_MISC_SLOAD_9, "9", M_MISC_SLOAD, 0, f_misc_sload, '9' },
521
522 { TP_SUB, M_MISC_SSAVE, "State-Save", M_MISC, 0, 0, 0 },
523 { TP_ITEM, M_MISC_SSAVE_1, "1", M_MISC_SSAVE, 0, f_misc_ssave, '1' },
524 { TP_ITEM, M_MISC_SSAVE_2, "2", M_MISC_SSAVE, 0, f_misc_ssave, '2' },
525 { TP_ITEM, M_MISC_SSAVE_3, "3", M_MISC_SSAVE, 0, f_misc_ssave, '3' },
526 { TP_ITEM, M_MISC_SSAVE_4, "4", M_MISC_SSAVE, 0, f_misc_ssave, '4' },
527 { TP_ITEM, M_MISC_SSAVE_5, "5", M_MISC_SSAVE, 0, f_misc_ssave, '5' },
528 { TP_ITEM, M_MISC_SSAVE_6, "6", M_MISC_SSAVE, 0, f_misc_ssave, '6' },
529 { TP_ITEM, M_MISC_SSAVE_7, "7", M_MISC_SSAVE, 0, f_misc_ssave, '7' },
530 { TP_ITEM, M_MISC_SSAVE_8, "8", M_MISC_SSAVE, 0, f_misc_ssave, '8' },
531 { TP_ITEM, M_MISC_SSAVE_9, "9", M_MISC_SSAVE, 0, f_misc_ssave, '9' },
532
533 { TP_SEP, 0, 0, M_MISC, 0, 0, 0 },
534
535 { TP_CHECK, M_MISC_STATUS, "Show Status", M_MISC, 0, f_misc_status, 0 },
536
537 /*------------------------------------------------------------------------------------------------------------------*/
538 { TP_SUB, M_HELP, "Help", M_TOP, 0, 0, 0 },
539
540 { TP_ITEM, M_HELP_ABOUT, "About", M_HELP, 0, f_help_about, 0 },
541 };
542
543
544 /***********************************************************************
545 * ��˥塼�С�����
546 ************************************************************************/
create_menubar(GtkWidget * target_window,GtkWidget ** created_menubar)547 void create_menubar(GtkWidget *target_window,
548 GtkWidget **created_menubar)
549 {
550 int i, show;
551 T_MENUTABLE *p = &menutable[0];
552 GtkWidget *menubar, *label, *item, *submenu;
553
554 menubar_active = FALSE;
555
556 menubar = gtk_menu_bar_new();
557
558
559 for (i=0; i<COUNTOF(menutable); i++, p++) {
560
561 show = TRUE;
562
563 if (p->type == TP_SEP) label = NULL;
564 else {
565 if (p->label) { label = gtk_label_new(p->label); }
566 else { label = NULL; show = FALSE; }
567 }
568
569 switch (p->type) {
570 case TP_SUB:
571 item = gtk_menu_item_new();
572 if (label)
573 gtk_container_add(GTK_CONTAINER(item), label);
574
575 submenu = gtk_menu_new();
576 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
577 mwidget[p->id].submenu = submenu;
578
579 break;
580
581 case TP_ITEM:
582 item = gtk_menu_item_new();
583 if (label)
584 gtk_container_add(GTK_CONTAINER(item), label);
585
586 if (p->callback) {
587 gtk_signal_connect(GTK_OBJECT(item), "activate",
588 GTK_SIGNAL_FUNC(p->callback),
589 (gpointer)p->data);
590 }
591 break;
592
593 case TP_CHECK:
594 item = gtk_check_menu_item_new();
595 if (label)
596 gtk_container_add(GTK_CONTAINER(item), label);
597
598 if (p->callback) {
599 gtk_signal_connect(GTK_OBJECT(item), "toggled",
600 GTK_SIGNAL_FUNC(p->callback),
601 (gpointer)p->data);
602 }
603 break;
604
605 case TP_RADIO:
606 item = gtk_radio_menu_item_new(mlist[p->group]);
607 if (label)
608 gtk_container_add(GTK_CONTAINER(item), label);
609
610 mlist[p->group]
611 = gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM(item));
612
613 if (p->callback) {
614 gtk_signal_connect(GTK_OBJECT(item), "toggled",
615 GTK_SIGNAL_FUNC(p->callback),
616 (gpointer)p->data);
617 }
618 break;
619
620 case TP_SEP:
621 item = gtk_menu_item_new();
622 break;
623 }
624
625 if (p->type == TP_SEP) ;
626 else mwidget[p->id].widget = item;
627
628 if (label) {
629 mwidget[p->id].label = label;
630 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
631 gtk_widget_show(label);
632 }
633 if (show)
634 gtk_widget_show(item);
635
636 if (p->parent == M_TOP) {
637 gtk_menu_bar_append(GTK_MENU_BAR(menubar), item);
638 } else {
639 gtk_menu_append(GTK_MENU(mwidget[p->parent].submenu), item);
640 }
641 }
642
643 /* ��������졼�����������ꤹ����ϡ� target_window ���Ф�����Ͽ���� */
644
645 *created_menubar = menubar;
646 }
647
648
649 /****************************************************************************
650 * �⡼���ڤ��ؤ����Ρ���˥塼�С��ν���������
651 * ���ߥ�⡼�ɤȥ�˥塼�⡼�ɤǡ���˥塼�С������Ƥ��ѹ�����
652 *****************************************************************************/
menubar_setup(int active)653 void menubar_setup(int active)
654 {
655 if (active) {
656
657 /* ��˥塼�С������Ƥ����� */
658 menubar_item_setup();
659
660 /* �Ȥ��ʤ��������ܤ�Ȥ���褦�ˤ��� (���ߥ�⡼�ɳ��ϻ�) */
661 menubar_item_sensitive(TRUE);
662
663 menubar_active = TRUE;
664
665 } else {
666
667 /* �ۤȤ�ɤι��ܤ�Ȥ��ʤ����� (��˥塼�⡼�ɳ��ϻ�) */
668 menubar_item_sensitive(FALSE);
669
670 menubar_active = FALSE;
671 }
672 }
673
674
675
676
677
678
679 /* �ե������������������ɽ�����������˥�����Хå��ؿ���Ƥ� */
680 static char *select_file_fullname; /* �ե�����̾�Ϥ����˳�Ǽ */
681 static int select_file_n_fullname; /* ���ΥХåե��Υ����� */
682 static void (*select_file_callback)(int result);/* ��λ���˸ƤӽФ��ؿ� */
cb_select_file_ok(GtkWidget * widget,gpointer data)683 static void cb_select_file_ok(GtkWidget *widget, gpointer data)
684 {
685 my_strncpy(select_file_fullname,
686 gtk_file_selection_get_filename(GTK_FILE_SELECTION(data)),
687 select_file_n_fullname);
688
689 (select_file_callback)(1); /* �ե��������� */
690
691 gtk_widget_destroy(GTK_WIDGET(data));
692
693 }
cb_select_file_cancel(GtkWidget * widget,gpointer data)694 static void cb_select_file_cancel(GtkWidget *widget, gpointer data)
695 {
696 (select_file_callback)(0); /* �ե��������� */
697
698 gtk_widget_destroy(GTK_WIDGET(data));
699 }
cb_select_file_destroy(GtkWidget * widget,gpointer data)700 static void cb_select_file_destroy(GtkWidget *widget, gpointer data)
701 {
702 (select_file_callback)(0); /* �ե��������� */
703
704 gtk_grab_remove(GTK_WIDGET(widget));
705 }
select_file(const char * title,void (* callback)(int result),char fullname[],int n_fullname)706 static int select_file(const char *title,
707 void (*callback)(int result),
708 char fullname[],
709 int n_fullname)
710 {
711 GtkWidget *fsel;
712
713 select_file_callback = callback;
714
715 select_file_fullname = fullname;
716 select_file_n_fullname = n_fullname;
717 memset(fullname, 0, n_fullname);
718
719
720 fsel = gtk_file_selection_new(title);
721
722 /*gtk_file_selection_set_filename(fsel, fullname);*/
723
724 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fsel)->ok_button),
725 "clicked", GTK_SIGNAL_FUNC(cb_select_file_ok), fsel);
726
727 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fsel)->cancel_button),
728 "clicked", GTK_SIGNAL_FUNC(cb_select_file_cancel), fsel);
729
730 gtk_signal_connect(GTK_OBJECT(fsel), "destroy",
731 GTK_SIGNAL_FUNC(cb_select_file_destroy), NULL);
732
733 gtk_widget_show(fsel);
734
735 gtk_grab_add(fsel);
736
737 return 0;
738 }
739
740
741
742
743
744
745 /* Reset ��˥塼�����ƥ�Υ�٥������ */
update_sys_reset(void)746 static void update_sys_reset(void)
747 {
748 char buf[32];
749
750 LOCK_MENUBAR()
751
752 strcpy(buf, "Reset [");
753
754 switch (menubar_reset_cfg.boot_basic) {
755 case BASIC_V2: strcat(buf, "V2"); break;
756 case BASIC_V1H: strcat(buf, "V1H"); break;
757 case BASIC_V1S: strcat(buf, "V1S"); break;
758 case BASIC_N: strcat(buf, "N"); break;
759 }
760
761 strcat(buf, " : ");
762
763 switch (menubar_reset_cfg.boot_clock_4mhz) {
764 case CLOCK_4MHZ: strcat(buf, "4MHz"); break;
765 case CLOCK_8MHZ: strcat(buf, "8MHz"); break;
766 }
767
768 strcat(buf, "]");
769
770 gtk_label_set(GTK_LABEL(mwidget[M_SYS_RESET].label), buf);
771
772 UNLOCK_MENUBAR()
773 }
774
775
776
777 /* Drive ��˥塼�����ƥ��ɽ�����롦���� */
update_drive(void)778 static void update_drive(void)
779 {
780 int uItem;
781 char buf[64];
782 int i;
783 int drv, base, tag, none;
784 int has_image = FALSE;
785
786 LOCK_MENUBAR()
787
788 for (drv = 0; drv < NR_DRIVE; drv ++) {
789 base = (drv == DRIVE_1) ? M_DRV_DRV1_1 : M_DRV_DRV2_1;
790 tag = (drv == DRIVE_1) ? M_DRV_DRV1_NO : M_DRV_DRV2_NO;
791 none = (drv == DRIVE_1) ? M_DRV_DRV1_DUMMY : M_DRV_DRV2_DUMMY;
792
793 if (disk_image_exist(drv)) {
794
795 /* ������ο���ʬ����˥塼�����ƥ��ɽ�����롣
796 ��٥�ϡ������̾�˥��åȤ�ľ���� */
797 for (i = 0; i < MIN(disk_image_num(drv), 9); i++) {
798 uItem = i + base;
799
800 sprintf(buf, "%d ", i + 1);
801 my_strncat(buf, drive[drv].image[i].name, sizeof(buf));
802
803 gtk_label_set(GTK_LABEL(mwidget[uItem].label), buf);
804 gtk_widget_show(mwidget[uItem].widget);
805 }
806 for ( ; i<9; i++) {
807 uItem = i + base;
808 gtk_widget_hide(mwidget[uItem].widget);
809 }
810 has_image = TRUE;
811
812 } else {
813
814 /* �ǥ��������ʤ���硢��˥塼�����ƥ�� */
815 for (i=0; i<9; i++) {
816 uItem = i + base;
817 gtk_widget_hide(mwidget[uItem].widget);
818 }
819 }
820
821 /* �����楤����Ρ��饸����˥塼���ƥ��֤ˤ��� */
822
823 if (disk_image_exist(drv) == FALSE || /* �ե�����ʤ� or */
824 drive_check_empty(drv)) { /* �������� */
825
826 uItem = tag; /* �� NO Disk */
827
828 } else {
829 i = disk_image_selected(drv);
830 if (0 <= i && i <= 9) { /* 1��9�������� */
831 uItem = i + base; /* �� ����� */
832 } else { /* 10���ܡ� */
833 uItem = none; /* �� �ʤ� */
834 }
835 }
836 gtk_check_menu_item_set_active(
837 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), TRUE);
838 }
839
840 /* ��˥塼��̾�����Ѥ����ꡢ̵���ˤ����� */
841
842 for (drv = 0; drv < NR_DRIVE; drv ++) {
843 const char *s;
844 s = filename_get_disk_name(drv);
845
846 if (s) {
847 sprintf(buf, "Drive %d: ", drv + 1);
848 my_strncat(buf, s, sizeof(buf));
849 } else {
850 sprintf(buf, "Drive %d:", drv + 1);
851 }
852 i = (drv == DRIVE_1) ? M_DRV_DRV1 : M_DRV_DRV2;
853 gtk_label_set(GTK_LABEL(mwidget[ i ].label), buf);
854 }
855
856 gtk_label_set(GTK_LABEL(mwidget[M_DRV_CHG].label),
857 (has_image) ? "Change ..." : "Set ...");
858 gtk_widget_set_sensitive(mwidget[M_DRV_UNSET].widget,
859 (has_image) ? TRUE : FALSE);
860
861 UNLOCK_MENUBAR()
862 }
863
864 /* Tape Load ��˥塼�����ƥ�Υ�٥���Ѥ���������ԲĤˤ����� */
update_misc_cload(void)865 static void update_misc_cload(void)
866 {
867 int uItem;
868 const char *s;
869 char buf[64];
870
871 LOCK_MENUBAR()
872
873 s = filename_get_tape_name(CLOAD);
874
875 /* �ơ��פ���ʤ�ե�����̾�ʤ��ʤ�ǥե���ȤΥ�٥��ɽ�� */
876 uItem = M_MISC_CLOAD_S;
877 {
878 if (s) { my_strncpy(buf, s, sizeof(buf)); }
879 else { strcpy(buf, "Set ..."); }
880 gtk_label_set(GTK_LABEL(mwidget[uItem].label), buf);
881 }
882
883 /* �ơ��פ���ʤ顢�饸����˥塼���ƥ��֤� */
884 if (s) uItem = M_MISC_CLOAD_S;
885 else uItem = M_MISC_CLOAD_S_DUMMY;
886 gtk_check_menu_item_set_active(
887 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), TRUE);
888
889 /* �ơ��פ���ʤ� unset ��ɽ�����ʤ��ʤ鱣�� */
890 uItem = M_MISC_CLOAD_U;
891 gtk_widget_set_sensitive(mwidget[uItem].widget, (s) ? TRUE : FALSE);
892
893 UNLOCK_MENUBAR()
894 }
895
896 /* Tape Save ��˥塼�����ƥ�Υ�٥���Ѥ���������ԲĤˤ����� */
update_misc_csave(void)897 static void update_misc_csave(void)
898 {
899 int uItem;
900 const char *s;
901 char buf[64];
902
903 LOCK_MENUBAR()
904
905 s = filename_get_tape_name(CSAVE);
906
907 /* �ơ��פ���ʤ�ե�����̾�ʤ��ʤ�ǥե���ȤΥ�٥��ɽ�� */
908 uItem = M_MISC_CSAVE_S;
909 {
910 if (s) { my_strncpy(buf, s, sizeof(buf)); }
911 else { strcpy(buf, "Set ..."); }
912 gtk_label_set(GTK_LABEL(mwidget[uItem].label), buf);
913 }
914
915 /* �ơ��פ���ʤ顢�饸����˥塼���ƥ��֤� */
916 if (s) uItem = M_MISC_CSAVE_S;
917 else uItem = M_MISC_CSAVE_S_DUMMY;
918 gtk_check_menu_item_set_active(
919 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), TRUE);
920
921 /* �ơ��פ���ʤ� unset ��ɽ�����ʤ��ʤ鱣�� */
922 uItem = M_MISC_CSAVE_U;
923 gtk_widget_set_sensitive(mwidget[uItem].widget, (s) ? TRUE : FALSE);
924
925 UNLOCK_MENUBAR()
926 }
927
928 /* Sound Record ��˥塼�����ƥ�Υ����å����ѹ����� */
update_misc_record(void)929 static void update_misc_record(void)
930 {
931 int uItem;
932 int i;
933
934 LOCK_MENUBAR()
935
936 i = xmame_wavout_opened();
937 uItem = M_MISC_RECORD;
938 gtk_check_menu_item_set_active(
939 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), i);
940
941 UNLOCK_MENUBAR()
942 }
943
944
945
946
947 /*======================================================================
948 * ��˥塼�С������Ƥ�ƽ����
949 *======================================================================*/
menubar_item_setup(void)950 static void menubar_item_setup(void)
951 {
952 int uItem;
953 int i;
954 GtkWidget *w;
955
956 LOCK_MENUBAR()
957
958 /* System -----------------------------------------------------------*/
959
960 quasi88_get_reset_cfg(&menubar_reset_cfg);
961
962 switch (menubar_reset_cfg.boot_basic) {
963 case BASIC_V2: uItem = M_SYS_MODE_V2; break;
964 case BASIC_V1H: uItem = M_SYS_MODE_V1H; break;
965 case BASIC_V1S: uItem = M_SYS_MODE_V1S; break;
966 case BASIC_N: uItem = M_SYS_MODE_N; break;
967 }
968 gtk_check_menu_item_set_active(
969 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), TRUE);
970
971 switch (menubar_reset_cfg.boot_clock_4mhz) {
972 case CLOCK_4MHZ: uItem = M_SYS_MODE_4MH; break;
973 case CLOCK_8MHZ: uItem = M_SYS_MODE_8MH; break;
974 }
975 gtk_check_menu_item_set_active(
976 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), TRUE);
977
978 switch (menubar_reset_cfg.sound_board) {
979 case SOUND_I: uItem = M_SYS_MODE_SB; break;
980 case SOUND_II: uItem = M_SYS_MODE_SB2; break;
981 }
982 gtk_check_menu_item_set_active(
983 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), TRUE);
984
985 update_sys_reset();
986
987 /* Setting ----------------------------------------------------------*/
988
989 i = quasi88_cfg_now_wait_rate(); /* �������� */
990 switch (i) {
991 case 25: uItem = M_SET_SPD_25; break;
992 case 50: uItem = M_SET_SPD_50; break;
993 case 100: uItem = M_SET_SPD_100; break;
994 case 200: uItem = M_SET_SPD_200; break;
995 case 400: uItem = M_SET_SPD_400; break;
996 default: uItem = M_SET_SPD_DUMMY; break;
997 }
998 gtk_check_menu_item_set_active(
999 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), TRUE);
1000
1001 i = quasi88_cfg_now_no_wait(); /* �������� */
1002 uItem = M_SET_SPD_MAX;
1003 gtk_check_menu_item_set_active(
1004 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), i);
1005
1006 i = cpu_timing; /* �������� */
1007 switch (i) {
1008 case 0: uItem = M_SET_SUB_SOME; break;
1009 case 1: uItem = M_SET_SUB_OFT; break;
1010 case 2: uItem = M_SET_SUB_ALL; break;
1011 default: uItem = M_SET_SUB_DUMMY; break;
1012 }
1013 gtk_check_menu_item_set_active(
1014 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), TRUE);
1015
1016 i = fdc_wait; /* �������� */
1017 uItem = M_SET_FDCWAIT;
1018 gtk_check_menu_item_set_active(
1019 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), i);
1020
1021 i = quasi88_cfg_now_frameskip_rate(); /* �������� */
1022 switch (i) {
1023 case 1: uItem = M_SET_REF_60; break;
1024 case 2: uItem = M_SET_REF_30; break;
1025 case 3: uItem = M_SET_REF_20; break;
1026 case 4: uItem = M_SET_REF_15; break;
1027 default: uItem = M_SET_REF_DUMMY; break;
1028 }
1029 gtk_check_menu_item_set_active(
1030 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), TRUE);
1031
1032 i = quasi88_cfg_now_interlace(); /* �������� */
1033 switch (i) {
1034 case SCREEN_INTERLACE_NO: uItem = M_SET_INT_NO; break;
1035 case SCREEN_INTERLACE_SKIP: uItem = M_SET_INT_SKIP; break;
1036 case SCREEN_INTERLACE_YES: uItem = M_SET_INT_YES; break;
1037 default: uItem = M_SET_INT_DUMMY;break;
1038 }
1039 gtk_check_menu_item_set_active(
1040 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), TRUE);
1041
1042 i = quasi88_cfg_now_size(); /* �������� */
1043 switch (i) {
1044 case SCREEN_SIZE_FULL: uItem = M_SET_SIZ_FULL; break;
1045 case SCREEN_SIZE_HALF: uItem = M_SET_SIZ_HALF; break;
1046 default: uItem = M_SET_SIZ_DUMMY;break;
1047 }
1048 gtk_check_menu_item_set_active(
1049 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), TRUE);
1050
1051 i = use_pcg; /* �������� */
1052 uItem = M_SET_PCG;
1053 gtk_check_menu_item_set_active(
1054 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), i);
1055
1056 i = mouse_mode; /* �������� */
1057 switch (i) {
1058 case MOUSE_NONE: uItem = M_SET_MO_NO; break;
1059 case MOUSE_MOUSE: uItem = M_SET_MO_MOUSE; break;
1060 case MOUSE_JOYMOUSE: uItem = M_SET_MO_JOYMO; break;
1061 case MOUSE_JOYSTICK: uItem = M_SET_MO_JOY; break;
1062 default: uItem = M_SET_MO_DUMMY; break;
1063 }
1064 gtk_check_menu_item_set_active(
1065 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), TRUE);
1066
1067 i = cursor_key_mode; /* �������� */
1068 switch (i) {
1069 case 0: uItem = M_SET_CUR_DEF; break;
1070 case 1: uItem = M_SET_CUR_TEN; break;
1071 default: uItem = M_SET_CUR_DUMMY; break;
1072 }
1073 gtk_check_menu_item_set_active(
1074 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), TRUE);
1075
1076 i = numlock_emu; /* �������� */
1077 uItem = M_SET_NUMLOCK;
1078 gtk_check_menu_item_set_active(
1079 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), i);
1080
1081 i = romaji_input_mode; /* �������� */
1082 uItem = M_SET_ROMAJI;
1083 gtk_check_menu_item_set_active(
1084 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), i);
1085
1086 #ifdef USE_SOUND
1087 if (xmame_has_sound()) {
1088 #ifdef USE_FMGEN
1089 i = xmame_cfg_get_use_fmgen(); /* �������� */
1090 switch (i) {
1091 case 0: uItem = M_SET_FM_MAME; break;
1092 case 1: uItem = M_SET_FM_FMGEN; break;
1093 default: uItem = M_SET_FM_DUMMY; break;
1094 }
1095 gtk_check_menu_item_set_active(
1096 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), TRUE);
1097 #endif
1098
1099 i = xmame_cfg_get_sample_freq(); /* �������� */
1100 switch (i) {
1101 case 48000: uItem = M_SET_FRQ_48; break;
1102 case 44100: uItem = M_SET_FRQ_44; break;
1103 case 22050: uItem = M_SET_FRQ_22; break;
1104 case 11025: uItem = M_SET_FRQ_11; break;
1105 default: uItem = M_SET_FRQ_DUMMY; break;
1106 }
1107 gtk_check_menu_item_set_active(
1108 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), TRUE);
1109
1110 i = sdl_buffersize; /* �������� */
1111 switch (i) {
1112 case 8192: uItem = M_SET_BUF_800; break;
1113 case 4096: uItem = M_SET_BUF_400; break;
1114 case 2048: uItem = M_SET_BUF_200; break;
1115 case 1024: uItem = M_SET_BUF_100; break;
1116 default: uItem = M_SET_BUF_DUMMY; break;
1117 }
1118 gtk_check_menu_item_set_active(
1119 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), TRUE);
1120 } else {
1121 gtk_widget_set_sensitive(mwidget[M_SET_FM].widget, FALSE);
1122 gtk_widget_set_sensitive(mwidget[M_SET_FRQ].widget, FALSE);
1123 gtk_widget_set_sensitive(mwidget[M_SET_BUF].widget, FALSE);
1124 }
1125 #endif
1126
1127 /* Drive ------------------------------------------------------------*/
1128
1129 update_drive();
1130
1131 /* Misc -------------------------------------------------------------*/
1132
1133 if (xmame_has_sound()) {
1134 i = xmame_wavout_opened();
1135 uItem = M_MISC_RECORD;
1136 gtk_check_menu_item_set_active(
1137 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), i);
1138 } else {
1139 gtk_widget_set_sensitive(mwidget[M_MISC_RECORD].widget, FALSE);
1140 }
1141
1142 update_misc_cload();
1143
1144 update_misc_csave();
1145
1146 i = quasi88_cfg_now_showstatus();
1147 uItem = M_MISC_STATUS;
1148 gtk_check_menu_item_set_active(
1149 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), i);
1150
1151 UNLOCK_MENUBAR()
1152 }
1153
1154 /*======================================================================
1155 * ��˥塼�С����Ѳ�ǽ���ܤ�����
1156 *======================================================================*/
menubar_item_sensitive(int sensitive)1157 static void menubar_item_sensitive(int sensitive)
1158 {
1159 gtk_widget_set_sensitive(mwidget[M_SYS_RESET ].widget, sensitive);
1160 gtk_widget_set_sensitive(mwidget[M_SYS_MODE ].widget, sensitive);
1161 gtk_widget_set_sensitive(mwidget[M_SYS_RESET_V2 ].widget, sensitive);
1162 gtk_widget_set_sensitive(mwidget[M_SYS_RESET_V1H].widget, sensitive);
1163 gtk_widget_set_sensitive(mwidget[M_SYS_RESET_V1S].widget, sensitive);
1164 gtk_widget_set_sensitive(mwidget[M_SYS_MENU ].widget, sensitive);
1165 gtk_widget_set_sensitive(mwidget[M_SYS_SAVE ].widget, sensitive);
1166
1167 gtk_widget_set_sensitive(mwidget[M_SET ].widget, sensitive);
1168 gtk_widget_set_sensitive(mwidget[M_DRV ].widget, sensitive);
1169 gtk_widget_set_sensitive(mwidget[M_MISC].widget, sensitive);
1170 }
1171
1172
1173 /*======================================================================
1174 * ��˥塼�С�������Хå��ؿ�
1175 *======================================================================*/
1176
1177 /*----------------------------------------------------------------------
1178 * System ��˥塼
1179 *----------------------------------------------------------------------*/
1180
f_sys_reset(GtkMenuItem * widget,gpointer data)1181 static void f_sys_reset(GtkMenuItem *widget, gpointer data)
1182 {
1183 if (menubar_reset_cfg.boot_clock_4mhz) {
1184 cpu_clock_mhz = CONST_4MHZ_CLOCK;
1185 } else {
1186 cpu_clock_mhz = CONST_8MHZ_CLOCK;
1187 }
1188
1189 if (drive_check_empty(DRIVE_1)) {
1190 menubar_reset_cfg.boot_from_rom = TRUE;
1191 } else {
1192 menubar_reset_cfg.boot_from_rom = FALSE;
1193 }
1194
1195 quasi88_reset(&menubar_reset_cfg);
1196 }
1197
f_sys_reset_as(GtkMenuItem * widget,gpointer data)1198 static void f_sys_reset_as(GtkMenuItem *widget, gpointer data)
1199 {
1200 int uItem;
1201
1202 LOCK_MENUBAR()
1203
1204 menubar_reset_cfg.boot_basic = (int)data;
1205 switch (menubar_reset_cfg.boot_basic) {
1206 case BASIC_V2: uItem = M_SYS_MODE_V2; break;
1207 case BASIC_V1H: uItem = M_SYS_MODE_V1H; break;
1208 case BASIC_V1S: uItem = M_SYS_MODE_V1S; break;
1209 case BASIC_N: uItem = M_SYS_MODE_N; break;
1210 }
1211 gtk_check_menu_item_set_active(
1212 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), TRUE);
1213
1214 UNLOCK_MENUBAR()
1215
1216 update_sys_reset();
1217 f_sys_reset(0,0);
1218 }
1219
f_sys_basic(GtkRadioMenuItem * widget,gpointer data)1220 static void f_sys_basic(GtkRadioMenuItem *widget, gpointer data)
1221 {
1222 if (menubar_active == FALSE) { return; }
1223
1224 if (GTK_CHECK_MENU_ITEM(widget)->active)
1225 {
1226 menubar_reset_cfg.boot_basic = (int)data;
1227 update_sys_reset();
1228 }
1229 }
1230
f_sys_clock(GtkRadioMenuItem * widget,gpointer data)1231 static void f_sys_clock(GtkRadioMenuItem *widget, gpointer data)
1232 {
1233 if (menubar_active == FALSE) { return; }
1234
1235 if (GTK_CHECK_MENU_ITEM(widget)->active)
1236 {
1237 menubar_reset_cfg.boot_clock_4mhz = (int)data;
1238 update_sys_reset();
1239 }
1240 }
1241
f_sys_sb(GtkRadioMenuItem * widget,gpointer data)1242 static void f_sys_sb(GtkRadioMenuItem *widget, gpointer data)
1243 {
1244 if (menubar_active == FALSE) { return; }
1245
1246 if (GTK_CHECK_MENU_ITEM(widget)->active)
1247 {
1248 menubar_reset_cfg.sound_board = (int)data;
1249 update_sys_reset();
1250 }
1251 }
1252
f_sys_menu(GtkMenuItem * widget,gpointer data)1253 static void f_sys_menu(GtkMenuItem *widget, gpointer data)
1254 {
1255 quasi88_menu();
1256 }
1257
f_sys_save(GtkMenuItem * widget,gpointer data)1258 static void f_sys_save(GtkMenuItem *widget, gpointer data)
1259 {
1260 config_save(NULL);
1261 }
1262
f_sys_exit(GtkMenuItem * widget,gpointer data)1263 static void f_sys_exit(GtkMenuItem *widget, gpointer data)
1264 {
1265 quasi88_quit();
1266 }
1267
1268 /*----------------------------------------------------------------------
1269 * Setting ��˥塼
1270 *----------------------------------------------------------------------*/
1271
f_set_speed(GtkRadioMenuItem * widget,gpointer data)1272 static void f_set_speed(GtkRadioMenuItem *widget, gpointer data)
1273 {
1274 if (menubar_active == FALSE) { return; }
1275
1276 if (GTK_CHECK_MENU_ITEM(widget)->active)
1277 {
1278 quasi88_cfg_set_wait_rate((int)data);
1279 }
1280 }
1281
f_set_nowait(GtkCheckMenuItem * widget,gpointer data)1282 static void f_set_nowait(GtkCheckMenuItem *widget, gpointer data)
1283 {
1284 int active;
1285
1286 if (menubar_active == FALSE) { return; }
1287
1288 active = (int)widget->active;
1289
1290 quasi88_cfg_set_no_wait(active);
1291 }
1292
f_set_subcpu(GtkRadioMenuItem * widget,gpointer data)1293 static void f_set_subcpu(GtkRadioMenuItem *widget, gpointer data)
1294 {
1295 if (menubar_active == FALSE) { return; }
1296
1297 if (GTK_CHECK_MENU_ITEM(widget)->active)
1298 {
1299 if (cpu_timing != (int)data) {
1300 cpu_timing = (int)data;
1301 emu_reset();
1302 /* ¾�˺ƽ�������٤���ΤϤʤ��Τ��� */
1303 }
1304 }
1305 }
1306
f_set_fdcwait(GtkCheckMenuItem * widget,gpointer data)1307 static void f_set_fdcwait(GtkCheckMenuItem *widget, gpointer data)
1308 {
1309 int active;
1310
1311 if (menubar_active == FALSE) { return; }
1312
1313 active = ((int)widget->active) ? TRUE : FALSE;
1314
1315 fdc_wait = active;
1316 }
1317
f_set_refresh(GtkRadioMenuItem * widget,gpointer data)1318 static void f_set_refresh(GtkRadioMenuItem *widget, gpointer data)
1319 {
1320 if (menubar_active == FALSE) { return; }
1321
1322 if (GTK_CHECK_MENU_ITEM(widget)->active)
1323 {
1324 quasi88_cfg_set_frameskip_rate((int)data);
1325 }
1326 }
1327
f_set_interlace(GtkRadioMenuItem * widget,gpointer data)1328 static void f_set_interlace(GtkRadioMenuItem *widget, gpointer data)
1329 {
1330 if (menubar_active == FALSE) { return; }
1331
1332 if (GTK_CHECK_MENU_ITEM(widget)->active)
1333 {
1334 quasi88_cfg_set_interlace((int)data);
1335 }
1336 }
1337
f_set_size(GtkRadioMenuItem * widget,gpointer data)1338 static void f_set_size(GtkRadioMenuItem *widget, gpointer data)
1339 {
1340 if (menubar_active == FALSE) { return; }
1341
1342 if (GTK_CHECK_MENU_ITEM(widget)->active)
1343 {
1344 quasi88_cfg_set_size((int)data);
1345 }
1346 }
1347
f_set_pcg(GtkCheckMenuItem * widget,gpointer data)1348 static void f_set_pcg(GtkCheckMenuItem *widget, gpointer data)
1349 {
1350 int active;
1351
1352 if (menubar_active == FALSE) { return; }
1353
1354 active = ((int)widget->active) ? TRUE : FALSE;
1355
1356 use_pcg = active;
1357 }
1358
f_set_mouse(GtkRadioMenuItem * widget,gpointer data)1359 static void f_set_mouse(GtkRadioMenuItem *widget, gpointer data)
1360 {
1361 if (menubar_active == FALSE) { return; }
1362
1363 if (GTK_CHECK_MENU_ITEM(widget)->active)
1364 {
1365 mouse_mode = (int)data;
1366 keyboard_switch();
1367 }
1368 }
1369
f_set_cursor(GtkRadioMenuItem * widget,gpointer data)1370 static void f_set_cursor(GtkRadioMenuItem *widget, gpointer data)
1371 {
1372 if (menubar_active == FALSE) { return; }
1373
1374 if (GTK_CHECK_MENU_ITEM(widget)->active)
1375 {
1376 if ((int)data) {
1377 cursor_key_mode = 1;
1378 } else {
1379 cursor_key_mode = 0;
1380 }
1381 keyboard_switch();
1382 }
1383 }
1384
f_set_numlock(GtkCheckMenuItem * widget,gpointer data)1385 static void f_set_numlock(GtkCheckMenuItem *widget, gpointer data)
1386 {
1387 int active;
1388
1389 if (menubar_active == FALSE) { return; }
1390
1391 active = (int)widget->active;
1392
1393 quasi88_cfg_key_numlock(active);
1394 }
1395
f_set_romaji(GtkCheckMenuItem * widget,gpointer data)1396 static void f_set_romaji(GtkCheckMenuItem *widget, gpointer data)
1397 {
1398 int active;
1399
1400 if (menubar_active == FALSE) { return; }
1401
1402 active = (int)widget->active;
1403
1404 quasi88_cfg_key_romaji(active);
1405 }
1406
1407 #ifdef USE_SOUND
f_set_fm(GtkRadioMenuItem * widget,gpointer data)1408 static void f_set_fm(GtkRadioMenuItem *widget, gpointer data)
1409 {
1410 if (menubar_active == FALSE) { return; }
1411
1412 #ifdef USE_FMGEN
1413 if (GTK_CHECK_MENU_ITEM(widget)->active)
1414 {
1415 /* ���� */
1416 if (((xmame_cfg_get_use_fmgen()) && ((int)data == FALSE)) ||
1417 ((xmame_cfg_get_use_fmgen() == FALSE) && ((int)data))) {
1418
1419 xmame_cfg_set_use_fmgen((int)data);
1420
1421 menu_sound_restart(TRUE);
1422 update_misc_record();
1423 }
1424 }
1425 #endif
1426 }
1427
f_set_frq(GtkRadioMenuItem * widget,gpointer data)1428 static void f_set_frq(GtkRadioMenuItem *widget, gpointer data)
1429 {
1430 if (menubar_active == FALSE) { return; }
1431
1432 if (GTK_CHECK_MENU_ITEM(widget)->active)
1433 {
1434 /* ���� */
1435 if (xmame_cfg_get_sample_freq() != (int)data) {
1436 if (8000 <= (int)data && (int)data <= 48000) {
1437 xmame_cfg_set_sample_freq((int)data);
1438
1439 menu_sound_restart(TRUE);
1440 update_misc_record();
1441 }
1442 }
1443 }
1444 }
1445
f_set_buf(GtkRadioMenuItem * widget,gpointer data)1446 static void f_set_buf(GtkRadioMenuItem *widget, gpointer data)
1447 {
1448 if (menubar_active == FALSE) { return; }
1449
1450 if (GTK_CHECK_MENU_ITEM(widget)->active)
1451 {
1452 /* ���� */
1453 if (sdl_buffersize != (int)data) {
1454 if (32 <= (int)data && (int)data <= 65536) {
1455 sdl_buffersize = (int)data;
1456
1457 menu_sound_restart(TRUE);
1458 update_misc_record();
1459 }
1460 }
1461 }
1462 }
1463 #endif
1464
1465 /*----------------------------------------------------------------------
1466 * Drive ��˥塼
1467 *----------------------------------------------------------------------*/
1468
1469 static int data_drv_chg;
1470 static void cb_drv_chg(int result);
f_drv_chg(GtkMenuItem * widget,gpointer data)1471 static void f_drv_chg(GtkMenuItem *widget, gpointer data)
1472 {
1473 const char *headline;
1474
1475 if (menubar_active == FALSE) { return; }
1476
1477 switch ((int)data) {
1478 case DRIVE_1: headline = "Open Disk-Image-File (Drive 1:)"; break;
1479 case DRIVE_2: headline = "Open Disk-Image-File (Drive 2:)"; break;
1480 default: headline = "Open Disk-Image-File"; break;
1481 }
1482
1483 data_drv_chg = (int)data;
1484
1485 select_file(headline,
1486 cb_drv_chg,
1487 menubar_filename,
1488 sizeof(menubar_filename));
1489
1490 /* ���η�̤ϡ�������Хå��ؿ��ˤ� */
1491 }
cb_drv_chg(int result)1492 static void cb_drv_chg(int result)
1493 {
1494 if (result) {
1495 int ok = FALSE;
1496 int ro = (result < 0) ? TRUE : FALSE;
1497
1498 if ((data_drv_chg == DRIVE_1) || (data_drv_chg == DRIVE_2)) {
1499
1500 ok = quasi88_disk_insert(data_drv_chg, menubar_filename, 0, ro);
1501
1502 } else if (data_drv_chg < 0) {
1503
1504 ok = quasi88_disk_insert_all(menubar_filename, ro);
1505
1506 }
1507
1508 /* ���Ǥ˥ե�������Ĥ��Ƥ���Τǡ����Ԥ��Ƥ��˥塼�С����� */
1509 update_drive();
1510 }
1511 }
1512
f_drv_drv1(GtkRadioMenuItem * widget,gpointer data)1513 static void f_drv_drv1(GtkRadioMenuItem *widget, gpointer data)
1514 {
1515 if (menubar_active == FALSE) { return; }
1516
1517 if (GTK_CHECK_MENU_ITEM(widget)->active)
1518 {
1519 if ((int)data < 0) {
1520 quasi88_disk_image_empty(DRIVE_1);
1521 } else {
1522 quasi88_disk_image_select(DRIVE_1, (int)data);
1523 }
1524 }
1525 }
1526
f_drv_drv2(GtkRadioMenuItem * widget,gpointer data)1527 static void f_drv_drv2(GtkRadioMenuItem *widget, gpointer data)
1528 {
1529 if (menubar_active == FALSE) { return; }
1530
1531 if (GTK_CHECK_MENU_ITEM(widget)->active)
1532 {
1533 if ((int)data < 0) {
1534 quasi88_disk_image_empty(DRIVE_2);
1535 } else {
1536 quasi88_disk_image_select(DRIVE_2, (int)data);
1537 }
1538 }
1539 }
1540
f_drv_unset(GtkMenuItem * widget,gpointer data)1541 static void f_drv_unset(GtkMenuItem *widget, gpointer data)
1542 {
1543 if (menubar_active == FALSE) { return; }
1544
1545 quasi88_disk_eject_all();
1546
1547 update_drive();
1548 }
1549
1550 /*----------------------------------------------------------------------
1551 * Misc ��˥塼
1552 *----------------------------------------------------------------------*/
1553
f_misc_capture(GtkMenuItem * widget,gpointer data)1554 static void f_misc_capture(GtkMenuItem *widget, gpointer data)
1555 {
1556 if (menubar_active == FALSE) { return; }
1557
1558 quasi88_screen_snapshot();
1559 }
1560
f_misc_record(GtkCheckMenuItem * widget,gpointer data)1561 static void f_misc_record(GtkCheckMenuItem *widget, gpointer data)
1562 {
1563 int active;
1564 int uItem;
1565
1566 if (menubar_active == FALSE) { return; }
1567
1568 LOCK_MENUBAR()
1569
1570 active = xmame_wavout_opened() ? FALSE : TRUE; /* �դˤ��� */
1571
1572 if (active == FALSE) {
1573 if (xmame_wavout_opened()) {
1574 quasi88_waveout(FALSE);
1575 }
1576 } else {
1577 if (xmame_wavout_opened() == FALSE) {
1578 if (quasi88_waveout(TRUE) == FALSE) {
1579 active = FALSE;
1580 }
1581 }
1582 }
1583
1584 uItem = M_MISC_RECORD;
1585 gtk_check_menu_item_set_active(
1586 GTK_CHECK_MENU_ITEM(mwidget[uItem].widget), active);
1587
1588 UNLOCK_MENUBAR()
1589 }
1590
1591 static void cb_misc_cload_s(int result);
f_misc_cload_s(GtkMenuItem * widget,gpointer data)1592 static void f_misc_cload_s(GtkMenuItem *widget, gpointer data)
1593 {
1594 if (menubar_active == FALSE) { return; }
1595
1596 if (filename_get_tape(CLOAD)) { return; } /* �ơ��פ���ʤ���� */
1597
1598 select_file("Open Tape-Image-File for LOAD",
1599 cb_misc_cload_s,
1600 menubar_filename,
1601 sizeof(menubar_filename));
1602
1603 /* ���η�̤ϡ�������Хå��ؿ��ˤ� */
1604 }
cb_misc_cload_s(int result)1605 static void cb_misc_cload_s(int result)
1606 {
1607 if (result) {
1608
1609 int ok = quasi88_load_tape_insert(menubar_filename);
1610
1611 /* ���Ǥ˥ե�������Ĥ��Ƥ���Τǡ����Ԥ��Ƥ��˥塼�С����� */
1612 update_misc_cload();
1613 }
1614 }
1615
f_misc_cload_u(GtkMenuItem * widget,gpointer data)1616 static void f_misc_cload_u(GtkMenuItem *widget, gpointer data)
1617 {
1618 if (menubar_active == FALSE) { return; }
1619
1620 quasi88_load_tape_eject();
1621
1622 update_misc_cload();
1623 }
1624
1625 static void cb_misc_csave_s(int result);
f_misc_csave_s(GtkMenuItem * widget,gpointer data)1626 static void f_misc_csave_s(GtkMenuItem *widget, gpointer data)
1627 {
1628 if (menubar_active == FALSE) { return; }
1629
1630 if (filename_get_tape(CSAVE)) { return; } /* �ơ��פ���ʤ���� */
1631
1632 select_file("Open Tape-Image-File for SAVE (append)",
1633 cb_misc_csave_s,
1634 menubar_filename,
1635 sizeof(menubar_filename));
1636
1637 /* ���η�̤ϡ�������Хå��ؿ��ˤ� */
1638 }
cb_misc_csave_s(int result)1639 static void cb_misc_csave_s(int result)
1640 {
1641 if (result) {
1642
1643 int ok = quasi88_save_tape_insert(menubar_filename);
1644
1645 /* ���Ǥ˥ե�������Ĥ��Ƥ���Τǡ����Ԥ��Ƥ��˥塼�С����� */
1646 update_misc_csave();
1647 }
1648 }
1649
f_misc_csave_u(GtkMenuItem * widget,gpointer data)1650 static void f_misc_csave_u(GtkMenuItem *widget, gpointer data)
1651 {
1652 if (menubar_active == FALSE) { return; }
1653
1654 quasi88_save_tape_eject();
1655
1656 update_misc_csave();
1657 }
1658
f_misc_sload(GtkMenuItem * widget,gpointer data)1659 static void f_misc_sload(GtkMenuItem *widget, gpointer data)
1660 {
1661 if (menubar_active == FALSE) { return; }
1662
1663 quasi88_stateload((int) data);
1664
1665 /* �����ե�����̾���ѹ����줿�Ϥ��ʤΤǡ���˥塼�С������ƹ��� */
1666 menubar_setup(TRUE);
1667 }
1668
f_misc_ssave(GtkMenuItem * widget,gpointer data)1669 static void f_misc_ssave(GtkMenuItem *widget, gpointer data)
1670 {
1671 if (menubar_active == FALSE) { return; }
1672
1673 quasi88_statesave((int) data);
1674 }
1675
f_misc_status(GtkCheckMenuItem * widget,gpointer data)1676 static void f_misc_status(GtkCheckMenuItem *widget, gpointer data)
1677 {
1678 int active;
1679
1680 if (menubar_active == FALSE) { return; }
1681
1682 active = (int)widget->active;
1683
1684 quasi88_cfg_set_showstatus(active);
1685 }
1686
1687 /*----------------------------------------------------------------------
1688 * Help ��˥塼
1689 *----------------------------------------------------------------------*/
1690
cb_help_about_destroy(GtkWidget * widget,gpointer data)1691 static void cb_help_about_destroy(GtkWidget *widget, gpointer data)
1692 {
1693 gtk_grab_remove(GTK_WIDGET(widget));
1694 }
cb_help_about_button(GtkWidget * widget,gpointer data)1695 static void cb_help_about_button(GtkWidget *widget, gpointer data)
1696 {
1697 gtk_widget_destroy(GTK_WIDGET(data));
1698 }
f_help_about(GtkMenuItem * widget,gpointer data)1699 static void f_help_about(GtkMenuItem *widget, gpointer data)
1700 {
1701 GtkWidget *dialog, *label, *button;
1702 int i;
1703 static const char *message[] = {
1704 "",
1705 "QUASI88 ver. " Q_VERSION " <" Q_COMMENT ">",
1706 " " Q_COPYRIGHT,
1707 "",
1708 #ifdef USE_SOUND
1709 "MAME Sound-Engine included",
1710 " " Q_MAME_COPYRIGHT,
1711 #ifdef USE_FMGEN
1712 "FM Sound Generator (fmgen) included",
1713 " " Q_FMGEN_COPYRIGHT,
1714 #endif
1715 "",
1716 #endif
1717 };
1718
1719 dialog = gtk_dialog_new();
1720
1721 gtk_signal_connect(GTK_OBJECT(dialog), "destroy",
1722 GTK_SIGNAL_FUNC(cb_help_about_destroy), NULL);
1723
1724 gtk_window_set_title(GTK_WINDOW(dialog), "About...");
1725
1726 gtk_container_border_width(GTK_CONTAINER(dialog), 5);
1727
1728 /*----*/
1729
1730 for (i=0; i<COUNTOF(message); i++) {
1731 label = gtk_label_new(message[i]);
1732 /*gtk_misc_set_padding(GTK_MISC(label), 10, 10);*/
1733 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
1734 label, FALSE, TRUE, 0);
1735 gtk_widget_show(label);
1736 }
1737
1738 /*----*/
1739
1740 button = gtk_button_new_with_label("OK");
1741 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
1742
1743 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area),
1744 button, TRUE, TRUE, 0);
1745
1746 gtk_widget_show(button);
1747
1748 gtk_signal_connect(GTK_OBJECT(button), "clicked",
1749 GTK_SIGNAL_FUNC(cb_help_about_button), dialog);
1750
1751 gtk_widget_grab_default(button);
1752
1753
1754
1755 gtk_widget_show(dialog);
1756
1757 gtk_grab_add(dialog);
1758 }
1759