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