Files
px68k-libretro/x11/prop.c
T
2013-07-16 06:46:56 -07:00

1295 lines
38 KiB
C

/* $Id: prop.c,v 1.4 2008/11/17 12:02:08 nonaka Exp $ */
/*
* Copyright (c) 2003 NONAKA Kimihiro
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/* -------------------------------------------------------------------------- *
* PROP.C - 各種設定用プロパティシートと設定値管理 *
* -------------------------------------------------------------------------- */
#include <sys/stat.h>
#include "common.h"
#include "winx68k.h"
#include "keyboard.h"
#include "fileio.h"
#include "prop.h"
BYTE LastCode = 0;
BYTE KEYCONFFILE[] = "xkeyconf.dat";
int CurrentHDDNo = 0;
BYTE ini_title[] = "WinX68k";
static const char MIDI_TYPE_NAME[4][3] = {
"LA", "GM", "GS", "XG"
};
BYTE KeyTableBk[512];
Win68Conf Config;
Win68Conf ConfBk;
#ifndef MAX_BUTTON
#define MAX_BUTTON 32
#endif
extern char filepath[MAX_PATH];
extern char winx68k_ini[MAX_PATH];
extern int winx, winy;
extern char joyname[2][MAX_PATH];
extern char joybtnname[2][MAX_BUTTON][MAX_PATH];
extern BYTE joybtnnum[2];
extern BYTE FrameRate;
#define CFGLEN MAX_PATH
#if 0
static long solveHEX(char *str) {
long ret;
int i;
char c;
ret = 0;
for (i=0; i<8; i++) {
c = *str++;
if ((c >= '0') && (c <= '9')) {
c -= '0';
}
else if ((c >= 'A') && (c <= 'F')) {
c -= '7';
}
else if ((c >= 'a') && (c <= 'f')) {
c -= 'W';
}
else {
break;
}
ret <<= 4;
ret += (long) c;
}
return(ret);
}
#endif
static char *makeBOOL(BYTE value) {
if (value) {
return("true");
}
return("false");
}
static BYTE Aacmp(char *cmp, char *str) {
char p;
while(*str) {
p = *cmp++;
if (!p) {
break;
}
if (p >= 'a' && p <= 'z') {
p -= 0x20;
}
if (p != *str++) {
return(-1);
}
}
return(0);
}
static BYTE solveBOOL(char *str) {
if ((!Aacmp(str, "TRUE")) || (!Aacmp(str, "ON")) ||
(!Aacmp(str, "+")) || (!Aacmp(str, "1")) ||
(!Aacmp(str, "ENABLE"))) {
return(1);
}
return(0);
}
int
set_modulepath(char *path, size_t len)
{
struct stat sb;
char *homepath;
homepath = getenv("HOME");
if (homepath == 0)
homepath = ".";
g_snprintf(path, len, "%s/%s", homepath, ".keropi");
if (stat(path, &sb) < 0) {
if (mkdir(path, 0700) < 0) {
perror(path);
return 1;
}
} else {
if ((sb.st_mode & S_IFDIR) == 0) {
fprintf(stderr, "%s isn't directory.\n", path);
return 1;
}
}
g_snprintf(winx68k_ini, sizeof(winx68k_ini), "%s/%s", path, "config");
if (stat(winx68k_ini, &sb) >= 0) {
if (sb.st_mode & S_IFDIR) {
fprintf(stderr, "%s is directory.\n", winx68k_ini);
return 1;
}
}
return 0;
}
void LoadConfig(void)
{
int i, j;
char buf[CFGLEN];
FILEH fp;
winx = GetPrivateProfileInt(ini_title, "WinPosX", 0, winx68k_ini);
winy = GetPrivateProfileInt(ini_title, "WinPosY", 0, winx68k_ini);
FrameRate = (BYTE)GetPrivateProfileInt(ini_title, "FrameRate", 7, winx68k_ini);
if (!FrameRate) FrameRate=7;
GetPrivateProfileString(ini_title, "StartDir", "", buf, MAX_PATH, winx68k_ini);
if (buf[0] != 0)
strncpy(filepath, buf, sizeof(filepath));
else
filepath[0] = 0;
Config.OPM_VOL = GetPrivateProfileInt(ini_title, "OPM_Volume", 12, winx68k_ini);
Config.PCM_VOL = GetPrivateProfileInt(ini_title, "PCM_Volume", 15, winx68k_ini);
Config.MCR_VOL = GetPrivateProfileInt(ini_title, "MCR_Volume", 13, winx68k_ini);
Config.SampleRate = GetPrivateProfileInt(ini_title, "SampleRate", 0, winx68k_ini);
Config.BufferSize = GetPrivateProfileInt(ini_title, "BufferSize", 50, winx68k_ini);
Config.MouseSpeed = GetPrivateProfileInt(ini_title, "MouseSpeed", 10, winx68k_ini);
GetPrivateProfileString(ini_title, "FDDStatWin", "1", buf, CFGLEN, winx68k_ini);
Config.WindowFDDStat = solveBOOL(buf);
GetPrivateProfileString(ini_title, "FDDStatFullScr", "1", buf, CFGLEN, winx68k_ini);
Config.FullScrFDDStat = solveBOOL(buf);
GetPrivateProfileString(ini_title, "DSAlert", "1", buf, CFGLEN, winx68k_ini);
Config.DSAlert = solveBOOL(buf);
GetPrivateProfileString(ini_title, "SoundLPF", "1", buf, CFGLEN, winx68k_ini);
Config.Sound_LPF = solveBOOL(buf);
GetPrivateProfileString(ini_title, "UseRomeo", "0", buf, CFGLEN, winx68k_ini);
Config.SoundROMEO = solveBOOL(buf);
GetPrivateProfileString(ini_title, "MIDI_SW", "1", buf, CFGLEN, winx68k_ini);
Config.MIDI_SW = solveBOOL(buf);
GetPrivateProfileString(ini_title, "MIDI_Reset", "0", buf, CFGLEN, winx68k_ini);
Config.MIDI_Reset = solveBOOL(buf);
Config.MIDI_Type = GetPrivateProfileInt(ini_title, "MIDI_Type", 1, winx68k_ini);
GetPrivateProfileString(ini_title, "JoySwap", "0", buf, CFGLEN, winx68k_ini);
Config.JoySwap = solveBOOL(buf);
GetPrivateProfileString(ini_title, "JoyKey", "0", buf, CFGLEN, winx68k_ini);
Config.JoyKey = solveBOOL(buf);
GetPrivateProfileString(ini_title, "JoyKeyReverse", "0", buf, CFGLEN, winx68k_ini);
Config.JoyKeyReverse = solveBOOL(buf);
GetPrivateProfileString(ini_title, "JoyKeyJoy2", "0", buf, CFGLEN, winx68k_ini);
Config.JoyKeyJoy2 = solveBOOL(buf);
GetPrivateProfileString(ini_title, "SRAMBootWarning", "1", buf, CFGLEN, winx68k_ini);
Config.SRAMWarning = solveBOOL(buf);
GetPrivateProfileString(ini_title, "WinDrvLFN", "1", buf, CFGLEN, winx68k_ini);
Config.LongFileName = solveBOOL(buf);
GetPrivateProfileString(ini_title, "WinDrvFDD", "1", buf, CFGLEN, winx68k_ini);
Config.WinDrvFD = solveBOOL(buf);
Config.WinStrech = GetPrivateProfileInt(ini_title, "WinStretch", 1, winx68k_ini);
GetPrivateProfileString(ini_title, "DSMixing", "0", buf, CFGLEN, winx68k_ini);
Config.DSMixing = solveBOOL(buf);
Config.XVIMode = (BYTE)GetPrivateProfileInt(ini_title, "XVIMode", 0, winx68k_ini);
GetPrivateProfileString(ini_title, "CDROM_ASPI", "1", buf, CFGLEN, winx68k_ini);
Config.CDROM_ASPI = solveBOOL(buf);
Config.CDROM_SCSIID = (BYTE)GetPrivateProfileInt(ini_title, "CDROM_SCSIID", 6, winx68k_ini);
Config.CDROM_ASPI_Drive = (BYTE)GetPrivateProfileInt(ini_title, "CDROM_ASPIDrv", 0, winx68k_ini);
Config.CDROM_IOCTRL_Drive = (BYTE)GetPrivateProfileInt(ini_title, "CDROM_CTRLDrv", 16, winx68k_ini);
GetPrivateProfileString(ini_title, "CDROM_Enable", "1", buf, CFGLEN, winx68k_ini);
Config.CDROM_Enable = solveBOOL(buf);
GetPrivateProfileString(ini_title, "SSTP_Enable", "0", buf, CFGLEN, winx68k_ini);
Config.SSTP_Enable = solveBOOL(buf);
Config.SSTP_Port = GetPrivateProfileInt(ini_title, "SSTP_Port", 11000, winx68k_ini);
GetPrivateProfileString(ini_title, "ToneMapping", "0", buf, CFGLEN, winx68k_ini);
Config.ToneMap = solveBOOL(buf);
GetPrivateProfileString(ini_title, "ToneMapFile", "", buf, MAX_PATH, winx68k_ini);
if (buf[0] != 0)
strcpy(Config.ToneMapFile, buf);
else
Config.ToneMapFile[0] = 0;
Config.MIDIDelay = GetPrivateProfileInt(ini_title, "MIDIDelay", Config.BufferSize*5, winx68k_ini);
Config.MIDIAutoDelay = GetPrivateProfileInt(ini_title, "MIDIAutoDelay", 1, winx68k_ini);
for (i=0; i<2; i++)
{
for (j=0; j<8; j++)
{
sprintf(buf, "Joy%dButton%d", i+1, j+1);
Config.JOY_BTN[i][j] = GetPrivateProfileInt(ini_title, buf, j, winx68k_ini);
}
}
for (i=0; i<16; i++)
{
sprintf(buf, "HDD%d", i);
GetPrivateProfileString(ini_title, buf, "", Config.HDImage[i], MAX_PATH, winx68k_ini);
}
fp = File_OpenCurDir(KEYCONFFILE);
if (fp)
{
File_Read(fp, KeyTable, 512);
File_Close(fp);
}
}
void SaveConfig(void)
{
int i, j;
char buf[CFGLEN], buf2[CFGLEN];
FILEH fp;
wsprintf(buf, "%d", winx);
WritePrivateProfileString(ini_title, "WinPosX", buf, winx68k_ini);
wsprintf(buf, "%d", winy);
WritePrivateProfileString(ini_title, "WinPosY", buf, winx68k_ini);
wsprintf(buf, "%d", FrameRate);
WritePrivateProfileString(ini_title, "FrameRate", buf, winx68k_ini);
WritePrivateProfileString(ini_title, "StartDir", filepath, winx68k_ini);
wsprintf(buf, "%d", Config.OPM_VOL);
WritePrivateProfileString(ini_title, "OPM_Volume", buf, winx68k_ini);
wsprintf(buf, "%d", Config.PCM_VOL);
WritePrivateProfileString(ini_title, "PCM_Volume", buf, winx68k_ini);
wsprintf(buf, "%d", Config.MCR_VOL);
WritePrivateProfileString(ini_title, "MCR_Volume", buf, winx68k_ini);
wsprintf(buf, "%d", Config.SampleRate);
WritePrivateProfileString(ini_title, "SampleRate", buf, winx68k_ini);
wsprintf(buf, "%d", Config.BufferSize);
WritePrivateProfileString(ini_title, "BufferSize", buf, winx68k_ini);
wsprintf(buf, "%d", Config.MouseSpeed);
WritePrivateProfileString(ini_title, "MouseSpeed", buf, winx68k_ini);
WritePrivateProfileString(ini_title, "FDDStatWin", makeBOOL((BYTE)Config.WindowFDDStat), winx68k_ini);
WritePrivateProfileString(ini_title, "FDDStatFullScr", makeBOOL((BYTE)Config.FullScrFDDStat), winx68k_ini);
WritePrivateProfileString(ini_title, "DSAlert", makeBOOL((BYTE)Config.DSAlert), winx68k_ini);
WritePrivateProfileString(ini_title, "SoundLPF", makeBOOL((BYTE)Config.Sound_LPF), winx68k_ini);
WritePrivateProfileString(ini_title, "UseRomeo", makeBOOL((BYTE)Config.SoundROMEO), winx68k_ini);
WritePrivateProfileString(ini_title, "MIDI_SW", makeBOOL((BYTE)Config.MIDI_SW), winx68k_ini);
WritePrivateProfileString(ini_title, "MIDI_Reset", makeBOOL((BYTE)Config.MIDI_Reset), winx68k_ini);
wsprintf(buf, "%d", Config.MIDI_Type);
WritePrivateProfileString(ini_title, "MIDI_Type", buf, winx68k_ini);
WritePrivateProfileString(ini_title, "JoySwap", makeBOOL((BYTE)Config.JoySwap), winx68k_ini);
WritePrivateProfileString(ini_title, "JoyKey", makeBOOL((BYTE)Config.JoyKey), winx68k_ini);
WritePrivateProfileString(ini_title, "JoyKeyReverse", makeBOOL((BYTE)Config.JoyKeyReverse), winx68k_ini);
WritePrivateProfileString(ini_title, "JoyKeyJoy2", makeBOOL((BYTE)Config.JoyKeyJoy2), winx68k_ini);
WritePrivateProfileString(ini_title, "SRAMBootWarning", makeBOOL((BYTE)Config.SRAMWarning), winx68k_ini);
WritePrivateProfileString(ini_title, "WinDrvLFN", makeBOOL((BYTE)Config.LongFileName), winx68k_ini);
WritePrivateProfileString(ini_title, "WinDrvFDD", makeBOOL((BYTE)Config.WinDrvFD), winx68k_ini);
wsprintf(buf, "%d", Config.WinStrech);
WritePrivateProfileString(ini_title, "WinStretch", buf, winx68k_ini);
WritePrivateProfileString(ini_title, "DSMixing", makeBOOL((BYTE)Config.DSMixing), winx68k_ini);
wsprintf(buf, "%d", Config.XVIMode);
WritePrivateProfileString(ini_title, "XVIMode", buf, winx68k_ini);
WritePrivateProfileString(ini_title, "CDROM_ASPI", makeBOOL((BYTE)Config.CDROM_ASPI), winx68k_ini);
wsprintf(buf, "%d", Config.CDROM_SCSIID);
WritePrivateProfileString(ini_title, "CDROM_SCSIID", buf, winx68k_ini);
wsprintf(buf, "%d", Config.CDROM_ASPI_Drive);
WritePrivateProfileString(ini_title, "CDROM_ASPIDrv", buf, winx68k_ini);
wsprintf(buf, "%d", Config.CDROM_IOCTRL_Drive);
WritePrivateProfileString(ini_title, "CDROM_CTRLDrv", buf, winx68k_ini);
WritePrivateProfileString(ini_title, "CDROM_Enable", makeBOOL((BYTE)Config.CDROM_Enable), winx68k_ini);
WritePrivateProfileString(ini_title, "SSTP_Enable", makeBOOL((BYTE)Config.SSTP_Enable), winx68k_ini);
wsprintf(buf, "%d", Config.SSTP_Port);
WritePrivateProfileString(ini_title, "SSTP_Port", buf, winx68k_ini);
WritePrivateProfileString(ini_title, "ToneMapping", makeBOOL((BYTE)Config.ToneMap), winx68k_ini);
WritePrivateProfileString(ini_title, "ToneMapFile", Config.ToneMapFile, winx68k_ini);
wsprintf(buf, "%d", Config.MIDIDelay);
WritePrivateProfileString(ini_title, "MIDIDelay", buf, winx68k_ini);
WritePrivateProfileString(ini_title, "MIDIAutoDelay", makeBOOL((BYTE)Config.MIDIAutoDelay), winx68k_ini);
for (i=0; i<2; i++)
{
for (j=0; j<8; j++)
{
sprintf(buf, "Joy%dButton%d", i+1, j+1);
wsprintf(buf2, "%d", Config.JOY_BTN[i][j]);
WritePrivateProfileString(ini_title, buf, buf2, winx68k_ini);
}
}
for (i=0; i<16; i++)
{
sprintf(buf, "HDD%d", i);
WritePrivateProfileString(ini_title, buf, Config.HDImage[i], winx68k_ini);
}
fp = File_OpenCurDir(KEYCONFFILE);
if (!fp)
fp = File_CreateCurDir(KEYCONFFILE, FTYPE_TEXT);
if (fp)
{
File_Write(fp, KeyTable, 512);
File_Close(fp);
}
}
/* --------------- */
typedef struct {
GtkWidget *fs;
int type;
void *arg;
} file_selection_t;
static void file_selection_ok(GtkWidget *w, GtkFileSelection *gfs);
static void file_selection_destroy(GtkWidget *w, GtkWidget **wp);
static void file_selection(int type, char *title, char *defstr, void *arg);
static Win68Conf ConfigProp;
static GtkWidget *create_sound_note(void);
static GtkWidget *create_midi_note(void);
static GtkWidget *create_mouse_note(void);
static GtkWidget *create_others_note(void);
static void
dialog_destroy(GtkWidget *w, GtkWidget **wp)
{
UNUSED(wp);
gtk_widget_destroy(w);
install_idle_process();
}
/*
* Config dialog
*/
static void config_ok_button_clicked(GtkButton *b, gpointer d);
static void config_accept_button_clicked(GtkButton *b, gpointer d);
void
PropPage_Init(void)
{
GtkWidget *dialog;
GtkWidget *dialog_table;
GtkWidget *notebook;
GtkWidget *note;
GtkWidget *ok_button;
GtkWidget *cancel_button;
GtkWidget *accept_button;
uninstall_idle_process();
ConfigProp = Config;
dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(dialog), "Configure Keropi");
gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
gtk_signal_connect(GTK_OBJECT(dialog), "destroy",
GTK_SIGNAL_FUNC(dialog_destroy), NULL);
dialog_table = gtk_table_new(10, 4, FALSE);
gtk_container_add(GTK_CONTAINER(dialog), dialog_table);
gtk_widget_show(dialog_table);
/* notebook */
notebook = gtk_notebook_new();
gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP);
gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), TRUE);
gtk_table_attach_defaults(GTK_TABLE(dialog_table),notebook, 0, 4, 0, 9);
gtk_widget_show(notebook);
/* Sound note */
note = create_sound_note();
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), note,
gtk_label_new("Sound"));
gtk_widget_show(note);
/* MIDI note */
note = create_midi_note();
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), note,
gtk_label_new("MIDI"));
gtk_widget_show(note);
/* Keyboard note */
/* Joystick1 note */
/* Joystick2 note */
/* Mouse note */
note = create_mouse_note();
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), note,
gtk_label_new("Mouse"));
gtk_widget_show(note);
/* SCSI note */
/* Others note */
note = create_others_note();
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), note,
gtk_label_new("Others"));
gtk_widget_show(note);
/* ページ下部ボタン */
ok_button = gtk_button_new_with_label("OK");
gtk_table_attach_defaults(GTK_TABLE(dialog_table), ok_button,
1, 2, 9, 10);
gtk_signal_connect(GTK_OBJECT(ok_button), "clicked",
GTK_SIGNAL_FUNC(config_ok_button_clicked), dialog);
GTK_WIDGET_SET_FLAGS(ok_button, GTK_CAN_DEFAULT);
GTK_WIDGET_SET_FLAGS(ok_button, GTK_HAS_DEFAULT);
gtk_widget_grab_default(ok_button);
gtk_widget_show(ok_button);
cancel_button = gtk_button_new_with_label("Cancel");
gtk_container_set_border_width(GTK_CONTAINER(cancel_button), 5);
gtk_table_attach_defaults(GTK_TABLE(dialog_table), cancel_button,
2, 3, 9, 10);
gtk_signal_connect_object(GTK_OBJECT(cancel_button), "clicked",
GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(dialog));
gtk_widget_show(cancel_button);
accept_button = gtk_button_new_with_label("Accept");
gtk_container_set_border_width(GTK_CONTAINER(accept_button), 5);
gtk_table_attach_defaults(GTK_TABLE(dialog_table), accept_button,
3, 4, 9, 10);
gtk_signal_connect(GTK_OBJECT(accept_button), "clicked",
GTK_SIGNAL_FUNC(config_accept_button_clicked), dialog);
gtk_widget_show(accept_button);
gtk_widget_show(dialog);
}
static void
config_ok_button_clicked(GtkButton *b, gpointer d)
{
(void)b;
Config = ConfigProp;
gtk_widget_destroy(GTK_WIDGET(d));
}
static void
config_accept_button_clicked(GtkButton *b, gpointer d)
{
(void)b;
(void)d;
Config = ConfigProp;
}
/*
* Sound note
*/
static void sample_rate_button_clicked(GtkButton *b, gpointer d);
static void adpcm_lpf_button_clicked(GtkButton *b, gpointer d);
static void vol_adj_value_changed(GtkAdjustment *adj, gpointer d);
static const struct {
const char *str;
DWORD rate;
} sample_rate[] = {
{ "No Sound", 0 },
{ "11kHz", 11025 },
{ "22kHz", 22050 },
{ "44kHz", 44100 },
{ "48kHz", 48000 },
};
static const struct {
const char *name;
gfloat value;
gfloat min;
gfloat max;
size_t offset;
} sound_right_frame[] = {
{ "Buffer size", 500.0, 20.0,1000.0, offsetof(Win68Conf,BufferSize) },
{ "ADPCM volume", 15.0, 0.0, 16.0, offsetof(Win68Conf,PCM_VOL) },
{ "OPM volume", 12.0, 0.0, 16.0, offsetof(Win68Conf,OPM_VOL) },
{ "Mercury volume", 13.0, 0.0, 16.0, offsetof(Win68Conf,MCR_VOL) },
};
static GtkWidget *
create_sound_note(void)
{
GtkWidget *main_vbox;
GtkWidget *hbox;
GtkWidget *vbox;
GtkWidget *frame;
GtkWidget *button[NELEMENTS(sample_rate)];
GSList *gslist;
int i;
main_vbox = gtk_vbox_new(FALSE, 2);
hbox = gtk_hbox_new(FALSE, 2);
gtk_box_pack_start(GTK_BOX(main_vbox), hbox, FALSE, FALSE, 10);
gtk_widget_show(hbox);
frame = gtk_frame_new("Sample rate");
gtk_container_set_border_width(GTK_CONTAINER(frame), 5);
gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 0);
gtk_widget_show(frame);
vbox = gtk_vbox_new(FALSE, 5);
gtk_container_add(GTK_CONTAINER(frame), vbox);
gtk_widget_show(vbox);
/* Sample rate */
for (gslist = 0, i = 0; i < NELEMENTS(sample_rate); ++i) {
button[i] = gtk_radio_button_new_with_label(gslist,
sample_rate[i].str);
GTK_WIDGET_UNSET_FLAGS(button[i], GTK_CAN_FOCUS);
gslist = gtk_radio_button_group(GTK_RADIO_BUTTON(button[i]));
gtk_box_pack_start(GTK_BOX(vbox), button[i], FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(button[i]), "clicked",
GTK_SIGNAL_FUNC(sample_rate_button_clicked),
(gpointer)sample_rate[i].rate);
gtk_widget_show(button[i]);
}
for (i = 0; i < NELEMENTS(sample_rate); ++i) {
if (sample_rate[i].rate == Config.SampleRate)
break;
}
if (i == NELEMENTS(sample_rate))
i = 0;
gtk_signal_emit_by_name(GTK_OBJECT(button[i]), "clicked");
vbox = gtk_vbox_new(FALSE, 4);
gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 10);
gtk_widget_show(vbox);
for (i = 0; i < NELEMENTS(sound_right_frame); ++i) {
GtkObject *adjust;
GtkWidget *hscale;
GtkWidget *align;
frame = gtk_frame_new(sound_right_frame[i].name);
gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0);
gtk_widget_show(frame);
align = gtk_alignment_new(0.5, 0.5, 0.9, 0.9);
gtk_container_add(GTK_CONTAINER(frame), align);
gtk_widget_show(align);
adjust = gtk_adjustment_new(sound_right_frame[i].value,
sound_right_frame[i].min, sound_right_frame[i].max,
1.0, 0.0, 0.0);
hscale = gtk_hscale_new(GTK_ADJUSTMENT(adjust));
gtk_scale_set_value_pos(GTK_SCALE(hscale), GTK_POS_RIGHT);
gtk_scale_set_digits(GTK_SCALE(hscale), 0);
gtk_container_add(GTK_CONTAINER(align), hscale);
gtk_signal_connect(GTK_OBJECT(adjust), "value_changed",
GTK_SIGNAL_FUNC(vol_adj_value_changed),(gpointer)i);
gtk_widget_show(hscale);
if (i == 0)
gtk_adjustment_set_value(GTK_ADJUSTMENT(adjust),
Config.BufferSize);
else {
int *p = (int *)(((char *)&Config) + sound_right_frame[i].offset);
gtk_adjustment_set_value(GTK_ADJUSTMENT(adjust), *p);
}
}
button[0] = gtk_check_button_new_with_label("Enable ADPCM LPF");
gtk_container_set_border_width(GTK_CONTAINER(button[0]), 5);
gtk_box_pack_start(GTK_BOX(main_vbox), button[0], TRUE, TRUE, 0);
gtk_signal_connect(GTK_OBJECT(button[0]), "clicked",
GTK_SIGNAL_FUNC(adpcm_lpf_button_clicked), 0);
gtk_widget_show(button[0]);
if (Config.Sound_LPF)
gtk_signal_emit_by_name(GTK_OBJECT(button[0]), "clicked");
return main_vbox;
}
static void
sample_rate_button_clicked(GtkButton *b, gpointer d)
{
UNUSED(b);
ConfigProp.SampleRate = (DWORD)((long)d);
}
static void
adpcm_lpf_button_clicked(GtkButton *b, gpointer d)
{
UNUSED(d);
ConfigProp.Sound_LPF = GTK_TOGGLE_BUTTON(b)->active;
}
static void
vol_adj_value_changed(GtkAdjustment *adj, gpointer d)
{
int val = (int)(GTK_ADJUSTMENT(adj)->value);
int idx = (int)(long)d;
size_t offset = sound_right_frame[idx].offset;
if (idx == 0)
ConfigProp.BufferSize = (DWORD)val;
else {
int *p = (int *)(((char *)&ConfigProp) + offset);
*p = val;
}
}
/*
* Midi note
*/
static void midi_enable_button_clicked(GtkButton *b, gpointer d);
static void midi_send_reset_button_clicked(GtkButton *b, gpointer d);
static void midi_mimpi_browse_button_clicked(GtkButton *b, gpointer d);
static void midi_mimpi_button_clicked(GtkButton *b, gpointer d);
static void midi_init_entry_changed(GtkEditable *e, gpointer d);
typedef struct {
GtkWidget *init_combo;
GtkWidget *init_label;
GtkWidget *reset_button;
GtkWidget *mimpi_button;
GtkWidget *mimpi_entry;
GtkWidget *mimpi_browse_button;
} midi_init_item_t;
static GtkWidget *
create_midi_note(void)
{
GtkWidget *vbox;
GtkWidget *button;
GtkWidget *enable_button;
GtkWidget *mimpi_button;
GtkWidget *label;
GtkWidget *combo;
GtkWidget *entry;
GtkWidget *hbox;
static midi_init_item_t mii;
GList *items;
int i;
vbox = gtk_vbox_new(FALSE, 4);
hbox = gtk_hbox_new(FALSE, 3);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show(hbox);
enable_button = gtk_check_button_new_with_label(
"Enable MIDI");
gtk_container_set_border_width(GTK_CONTAINER(enable_button), 5);
gtk_box_pack_start(GTK_BOX(hbox), enable_button, FALSE, FALSE, 0);
gtk_widget_show(enable_button);
mii.init_combo = combo = gtk_combo_new();
gtk_container_set_border_width(GTK_CONTAINER(combo), 5);
gtk_combo_set_value_in_list(GTK_COMBO(combo), TRUE, TRUE);
gtk_combo_set_use_arrows_always(GTK_COMBO(combo), TRUE);
for (items = 0, i = 0; i < NELEMENTS(MIDI_TYPE_NAME); ++i)
items = g_list_append(items, (gpointer)MIDI_TYPE_NAME[i]);
gtk_combo_set_popdown_strings(GTK_COMBO(combo), items);
g_list_free(items);
gtk_box_pack_end(GTK_BOX(hbox), combo, FALSE, FALSE, 0);
gtk_widget_show(combo);
entry = GTK_COMBO(combo)->entry;
gtk_entry_set_editable(GTK_ENTRY(entry), FALSE);
gtk_signal_connect(GTK_OBJECT(entry), "changed",
GTK_SIGNAL_FUNC(midi_init_entry_changed), 0);
gtk_widget_show(entry);
mii.init_label = label = gtk_label_new(
"- MIDI initialized method:");
gtk_box_pack_end(GTK_BOX(hbox), label, TRUE, TRUE, 0);
gtk_widget_show(label);
mii.reset_button = button = gtk_check_button_new_with_label(
"Send initialize command when X68k is reseted");
gtk_container_set_border_width(GTK_CONTAINER(button), 5);
gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(midi_send_reset_button_clicked), 0);
gtk_widget_show(button);
if (Config.MIDI_Reset)
gtk_signal_emit_by_name(GTK_OBJECT(button), "clicked");
mii.mimpi_button = mimpi_button = gtk_check_button_new_with_label(
"Use MIMPI tone map");
gtk_container_set_border_width(GTK_CONTAINER(mimpi_button), 5);
gtk_box_pack_start(GTK_BOX(vbox), mimpi_button, FALSE, FALSE, 0);
gtk_widget_show(mimpi_button);
hbox = gtk_hbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show(hbox);
mii.mimpi_entry = entry = gtk_entry_new();
gtk_entry_set_max_length(GTK_ENTRY(entry), MAX_PATH - 1);
gtk_entry_set_editable(GTK_ENTRY(entry), FALSE);
gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 10);
gtk_widget_show(entry);
mii.mimpi_browse_button = button = gtk_button_new_with_label(
"Browse...");
gtk_container_set_border_width(GTK_CONTAINER(button), 5);
gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(midi_mimpi_browse_button_clicked),
(gpointer)&mii);
gtk_widget_show(button);
/* MIMPI ToneMap */
gtk_signal_connect(GTK_OBJECT(mimpi_button), "clicked",
GTK_SIGNAL_FUNC(midi_mimpi_button_clicked),
(gpointer)&mii);
if (!Config.ToneMap)
gtk_signal_emit_by_name(GTK_OBJECT(mimpi_button), "clicked");
gtk_signal_emit_by_name(GTK_OBJECT(mimpi_button), "clicked");
/* Enable MIDI */
gtk_signal_connect(GTK_OBJECT(enable_button), "clicked",
GTK_SIGNAL_FUNC(midi_enable_button_clicked),
(gpointer)&mii);
if (!Config.MIDI_SW)
gtk_signal_emit_by_name(GTK_OBJECT(enable_button), "clicked");
gtk_signal_emit_by_name(GTK_OBJECT(enable_button), "clicked");
return vbox;
}
static void
midi_enable_button_clicked(GtkButton *b, gpointer d)
{
midi_init_item_t *mii = (midi_init_item_t *)d;
ConfigProp.MIDI_SW = GTK_TOGGLE_BUTTON(b)->active;
if (ConfigProp.MIDI_SW) {
gtk_widget_set_sensitive(mii->init_combo, TRUE);
gtk_widget_set_sensitive(mii->init_label, TRUE);
gtk_widget_set_sensitive(mii->reset_button, TRUE);
gtk_widget_set_sensitive(mii->mimpi_button, TRUE);
if (ConfigProp.ToneMap) {
gtk_widget_set_sensitive(mii->mimpi_entry, TRUE);
gtk_widget_set_sensitive(mii->mimpi_browse_button,TRUE);
}
} else {
gtk_widget_set_sensitive(mii->init_combo, FALSE);
gtk_widget_set_sensitive(mii->init_label, FALSE);
gtk_widget_set_sensitive(mii->reset_button, FALSE);
gtk_widget_set_sensitive(mii->mimpi_button, FALSE);
gtk_widget_set_sensitive(mii->mimpi_entry, FALSE);
gtk_widget_set_sensitive(mii->mimpi_browse_button, FALSE);
}
}
static void
midi_send_reset_button_clicked(GtkButton *b, gpointer d)
{
UNUSED(d);
ConfigProp.MIDI_Reset = GTK_TOGGLE_BUTTON(b)->active;
}
static void
midi_mimpi_browse_button_clicked(GtkButton *b, gpointer d)
{
midi_init_item_t *mii = (midi_init_item_t *)d;
gchar *path = gtk_entry_get_text(GTK_ENTRY(mii->mimpi_entry));
UNUSED(b);
file_selection(1, "MIMPI tone map", path, mii->mimpi_entry);
}
static void
midi_mimpi_button_clicked(GtkButton *b, gpointer d)
{
midi_init_item_t *mii = (midi_init_item_t *)d;
ConfigProp.ToneMap = GTK_TOGGLE_BUTTON(b)->active;
if (ConfigProp.ToneMap) {
gtk_widget_set_sensitive(mii->mimpi_entry, TRUE);
gtk_widget_set_sensitive(mii->mimpi_browse_button, TRUE);
} else {
gtk_widget_set_sensitive(mii->mimpi_entry, FALSE);
gtk_widget_set_sensitive(mii->mimpi_browse_button, FALSE);
}
}
static void
midi_init_entry_changed(GtkEditable *e, gpointer d)
{
gchar *str;
int i;
UNUSED(d);
str = gtk_editable_get_chars(GTK_EDITABLE(e), 0, -1);
for (i = 0; i < NELEMENTS(MIDI_TYPE_NAME); ++i) {
if (strcmp(MIDI_TYPE_NAME[i], str) == 0) {
ConfigProp.MIDI_Type = i;
break;
}
}
g_free(str);
}
/*
* Mouse note
*/
static void mouse_speed_rate_value_changed(GtkAdjustment *adj, gpointer d);
static GtkWidget *
create_mouse_note(void)
{
GtkWidget *w;
GtkWidget *frame;
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *align;
GtkWidget *hscale;
GtkWidget *label;
GtkObject *adjust;
w = gtk_vbox_new(FALSE, 1);
frame = gtk_frame_new("Mouse speed");
gtk_box_pack_start(GTK_BOX(w), frame, FALSE, FALSE, 0);
gtk_widget_show(frame);
align = gtk_alignment_new(0.5, 0.5, 0.9, 0.9);
gtk_container_add(GTK_CONTAINER(frame), align);
gtk_widget_show(align);
vbox = gtk_vbox_new(FALSE, 2);
gtk_container_add(GTK_CONTAINER(align), vbox);
gtk_widget_show(vbox);
adjust = gtk_adjustment_new(10.0, 1.0, 20.0, 1.0, 1.0, 0.0);
hscale = gtk_hscale_new(GTK_ADJUSTMENT(adjust));
gtk_scale_set_draw_value(GTK_SCALE(hscale), FALSE);
gtk_box_pack_start(GTK_BOX(vbox), hscale, TRUE, TRUE, 0);
gtk_widget_show(hscale);
hbox = gtk_hbox_new(TRUE, 3);
gtk_box_pack_end(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
gtk_widget_show(hbox);
label = gtk_label_new("x0.1");
gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
gtk_widget_show(label);
label = gtk_label_new("x1.0");
gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.0);
gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
gtk_widget_show(label);
label = gtk_label_new("x2.0");
gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT);
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.0);
gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
gtk_widget_show(label);
/* Mouse speed rate */
gtk_signal_connect(GTK_OBJECT(adjust), "value_changed",
GTK_SIGNAL_FUNC(mouse_speed_rate_value_changed), 0);
gtk_adjustment_set_value(GTK_ADJUSTMENT(adjust),
(gfloat)Config.MouseSpeed);
return w;
}
static void
mouse_speed_rate_value_changed(GtkAdjustment *adj, gpointer d)
{
UNUSED(d);
ConfigProp.MouseSpeed = (int)adj->value;
if (ConfigProp.MouseSpeed < 1)
ConfigProp.MouseSpeed = 1;
if (ConfigProp.MouseSpeed > 20)
ConfigProp.MouseSpeed = 20;
}
/*
* Others note
*/
static void others_sasi_hdd_index_entry_changed(GtkEditable *e, gpointer d);
static void others_sasi_hdd_new_button_clicked(GtkButton *b, gpointer d);
static void others_sasi_hdd_remove_button_clicked(GtkButton *b, gpointer d);
static void others_sasi_hdd_browse_button_clicked(GtkButton *b, gpointer d);
static void others_show_fdd_status_button_clicked(GtkButton *b, gpointer d);
static void others_enable_virus_button_clicked(GtkButton *b, gpointer d);
typedef struct {
int idx;
GtkWidget *entry;
} sasi_hdd_t;
static GtkWidget *
create_others_note(void)
{
static const char *sasi_drive_str[16] = {
"0", "1", "2", "3", "4", "5", "6", "7", "8",
"9", "10", "11", "12", "13", "14", "15",
};
static sasi_hdd_t sasi_hdd = { 0, 0 };
GtkWidget *w;
GtkWidget *frame;
GtkWidget *align;
GtkWidget *table;
GtkWidget *label;
GtkWidget *combo;
GtkWidget *entry;
GtkWidget *button;
GList *items;
int i;
w = gtk_vbox_new(FALSE, 3);
frame = gtk_frame_new("HDD (SASI) Drive");
gtk_box_pack_start(GTK_BOX(w), frame, FALSE, FALSE, 0);
gtk_widget_show(frame);
align = gtk_alignment_new(0.5, 0.5, 0.9, 0.9);
gtk_container_add(GTK_CONTAINER(frame), align);
gtk_widget_show(align);
table = gtk_table_new(2, 5, FALSE);
gtk_container_add(GTK_CONTAINER(align), table);
gtk_widget_show(table);
label = gtk_label_new("Drive #:");
gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1);
gtk_widget_show(label);
combo = gtk_combo_new();
gtk_combo_set_value_in_list(GTK_COMBO(combo), TRUE, TRUE);
gtk_combo_set_use_arrows_always(GTK_COMBO(combo), TRUE);
for (items = 0, i = 0; i < NELEMENTS(sasi_drive_str); ++i)
items = g_list_append(items, (gpointer)sasi_drive_str[i]);
gtk_combo_set_popdown_strings(GTK_COMBO(combo), items);
g_list_free(items);
gtk_table_attach_defaults(GTK_TABLE(table), combo, 1, 2, 0, 1);
gtk_widget_show(combo);
entry = GTK_COMBO(combo)->entry;
gtk_entry_set_editable(GTK_ENTRY(entry), FALSE);
gtk_signal_connect(GTK_OBJECT(entry), "changed",
GTK_SIGNAL_FUNC(others_sasi_hdd_index_entry_changed),
&sasi_hdd);
gtk_widget_show(entry);
button = gtk_button_new_with_label("Remove");
gtk_container_set_border_width(GTK_CONTAINER(button), 5);
gtk_table_attach_defaults(GTK_TABLE(table), button, 3, 4, 0, 1);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(others_sasi_hdd_remove_button_clicked),
&sasi_hdd);
gtk_widget_show(button);
button = gtk_button_new_with_label("New");
gtk_container_set_border_width(GTK_CONTAINER(button), 5);
gtk_table_attach_defaults(GTK_TABLE(table), button, 4, 5, 0, 1);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(others_sasi_hdd_new_button_clicked),
&sasi_hdd);
#if 1
gtk_widget_set_sensitive(button, FALSE);
#endif
gtk_widget_show(button);
label = gtk_label_new("Filename:");
gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2);
gtk_widget_show(label);
sasi_hdd.entry = entry = gtk_entry_new();
gtk_entry_set_max_length(GTK_ENTRY(entry), MAX_PATH - 1);
gtk_entry_set_editable(GTK_ENTRY(entry), FALSE);
gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 4, 1, 2);
gtk_widget_show(entry);
gtk_entry_set_text(GTK_ENTRY(entry), Config.HDImage[0]);
button = gtk_button_new_with_label("Browse...");
gtk_container_set_border_width(GTK_CONTAINER(button), 5);
gtk_table_attach_defaults(GTK_TABLE(table), button, 4, 5, 1, 2);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(others_sasi_hdd_browse_button_clicked),
&sasi_hdd);
gtk_widget_show(button);
button = gtk_check_button_new_with_label("Show FDD status");
gtk_container_set_border_width(GTK_CONTAINER(button), 5);
gtk_box_pack_start(GTK_BOX(w), button, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(others_show_fdd_status_button_clicked), 0);
#if 1
gtk_widget_set_sensitive(button, FALSE);
#else
if (Config.WindowFDDStat)
gtk_signal_emit_by_name(GTK_OBJECT(button), "clicked");
#endif
gtk_widget_show(button);
button = gtk_check_button_new_with_label("Enable SRAM virus warning");
gtk_container_set_border_width(GTK_CONTAINER(button), 5);
gtk_box_pack_start(GTK_BOX(w), button, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(others_enable_virus_button_clicked), 0);
if (Config.SRAMWarning)
gtk_signal_emit_by_name(GTK_OBJECT(button), "clicked");
gtk_widget_show(button);
return w;
}
static void
others_sasi_hdd_index_entry_changed(GtkEditable *e, gpointer d)
{
sasi_hdd_t *sasi_hdd = (sasi_hdd_t *)d;
char *str;
char *ep;
str = gtk_editable_get_chars(GTK_EDITABLE(e), 0, -1);
if (str) {
unsigned long val;
errno = 0;
val = strtoul(str, &ep, 10);
/* Not a number */
if (str[0] == '\0' || *ep != '\0')
val = 0;
/* Out of range */
if (errno == ERANGE && val == ULONG_MAX)
val = 0;
sasi_hdd->idx = (int)val;
if (sasi_hdd->idx >= 0 && sasi_hdd->idx < 16) {
gtk_entry_set_text(GTK_ENTRY(sasi_hdd->entry),
ConfigProp.HDImage[sasi_hdd->idx]);
}
}
}
static void
others_sasi_hdd_new_button_clicked(GtkButton *b, gpointer d)
{
sasi_hdd_t *sasi_hdd = (sasi_hdd_t *)d;
gchar *path = gtk_entry_get_text(GTK_ENTRY(sasi_hdd->entry));
UNUSED(b);
file_selection(3, "Create SASI HDD", path, d);
}
static void
others_sasi_hdd_remove_button_clicked(GtkButton *b, gpointer d)
{
sasi_hdd_t *sasi_hdd = (sasi_hdd_t *)d;
UNUSED(b);
bzero(ConfigProp.HDImage[sasi_hdd->idx], sizeof(ConfigProp.HDImage));
gtk_entry_set_text(GTK_ENTRY(sasi_hdd->entry), ConfigProp.HDImage[sasi_hdd->idx]);
}
static void
others_sasi_hdd_browse_button_clicked(GtkButton *b, gpointer d)
{
sasi_hdd_t *sasi_hdd = (sasi_hdd_t *)d;
gchar *path = gtk_entry_get_text(GTK_ENTRY(sasi_hdd->entry));
UNUSED(b);
file_selection(2, "SASI HDD", path, d);
}
static void
others_show_fdd_status_button_clicked(GtkButton *b, gpointer d)
{
UNUSED(d);
ConfigProp.WindowFDDStat = GTK_TOGGLE_BUTTON(b)->active;
}
static void
others_enable_virus_button_clicked(GtkButton *b, gpointer d)
{
UNUSED(d);
ConfigProp.SRAMWarning = GTK_TOGGLE_BUTTON(b)->active;
}
/*
* ---------- file selection
*/
static void
file_selection_ok(GtkWidget *w, GtkFileSelection *gfs)
{
file_selection_t *fsp = (file_selection_t *)gfs;
GtkFileSelection *fs = (GtkFileSelection *)fsp->fs;
char *p;
UNUSED(w);
p = (char *)gtk_file_selection_get_filename(fs);
if (p) {
struct stat st;
if (stat(p, &st) == 0) {
if (!S_ISDIR(st.st_mode)) {
switch (fsp->type) {
case 1: // open MIMPI tone map
gtk_entry_set_text(GTK_ENTRY(fsp->arg), p);
strncpy(ConfigProp.ToneMapFile, p, sizeof(ConfigProp.ToneMapFile));
break;
case 2: // open SASI HDD
{
sasi_hdd_t *sasi_hdd = (sasi_hdd_t *)fsp->arg;
strncpy(ConfigProp.HDImage[sasi_hdd->idx], p, sizeof(ConfigProp.HDImage[0]));
gtk_entry_set_text(GTK_ENTRY(sasi_hdd->entry), p);
}
break;
}
}
} else if (errno == ENOENT) {
switch (fsp->type) {
case 3: // create SASI HDD image
{
sasi_hdd_t *sasi_hdd = (sasi_hdd_t *)fsp->arg;
char buf[0x1000];
FILEH *fh;
int i;
fh = File_Create(p, FTYPE_NONE);
if (fh == INVALID_HANDLE_VALUE)
break;
bzero(buf, sizeof(buf));
for (i = 0; i < 0x2793 /* 40Mb/0x1000 */; ++i)
File_Write(fh, buf, 0x1000);
File_Close(fh);
strncpy(ConfigProp.HDImage[sasi_hdd->idx], p, sizeof(ConfigProp.HDImage[0]));
gtk_entry_set_text(GTK_ENTRY(sasi_hdd->entry), p);
}
break;
}
}
}
gtk_widget_destroy(GTK_WIDGET(fs));
}
static void
file_selection_destroy(GtkWidget *w, GtkWidget **wp)
{
file_selection_t *fsp = (file_selection_t *)wp;
free(fsp);
gtk_widget_destroy(w);
}
static void
file_selection(int type, char *title, char *defstr, void *arg)
{
GtkWidget *file_dialog;
file_selection_t *fsp;
fsp = malloc(sizeof(*fsp));
if (fsp == 0) {
printf("file_selection: Can't alloc memory (size = %d)\n",
sizeof(*fsp));
return;
}
bzero(fsp, sizeof(*fsp));
file_dialog = gtk_file_selection_new(title);
if (defstr) {
gtk_file_selection_set_filename(
GTK_FILE_SELECTION(file_dialog), defstr);
}
fsp->fs = file_dialog;
fsp->type = type;
fsp->arg = arg;
gtk_window_set_position(GTK_WINDOW(file_dialog), GTK_WIN_POS_CENTER);
gtk_window_set_modal(GTK_WINDOW(file_dialog), TRUE);
gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(file_dialog));
gtk_signal_connect(GTK_OBJECT(file_dialog), "destroy",
GTK_SIGNAL_FUNC(file_selection_destroy), fsp);
gtk_signal_connect_object(
GTK_OBJECT(GTK_FILE_SELECTION(file_dialog)->cancel_button),
"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy),
GTK_OBJECT(file_dialog));
gtk_signal_connect(
GTK_OBJECT(GTK_FILE_SELECTION(file_dialog)->ok_button),
"clicked", GTK_SIGNAL_FUNC(file_selection_ok), fsp);
gtk_widget_show(file_dialog);
}