summaryrefslogtreecommitdiff
path: root/PcsxSrc/Linux/GtkGui.c
diff options
context:
space:
mode:
Diffstat (limited to 'PcsxSrc/Linux/GtkGui.c')
-rw-r--r--PcsxSrc/Linux/GtkGui.c2652
1 files changed, 1326 insertions, 1326 deletions
diff --git a/PcsxSrc/Linux/GtkGui.c b/PcsxSrc/Linux/GtkGui.c
index 7ac46d4..6df431d 100644
--- a/PcsxSrc/Linux/GtkGui.c
+++ b/PcsxSrc/Linux/GtkGui.c
@@ -1,1326 +1,1326 @@
-/* Pcsx - Pc Psx Emulator
- * Copyright (C) 1999-2002 Pcsx Team
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <dirent.h>
-#include <dlfcn.h>
-#include <sys/stat.h>
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
-#include <signal.h>
-#include <sys/time.h>
-
-#include "Linux.h"
-#include "plugins.h"
-#include "Sio.h"
-#include "GladeGui.h"
-#include "GladeFuncs.h"
-
-extern int UseGui;
-long LoadCdBios;
-static int needreset = 1;
-
-PSEgetLibType PSE_getLibType = NULL;
-PSEgetLibVersion PSE_getLibVersion = NULL;
-PSEgetLibName PSE_getLibName = NULL;
-
-// Helper Functions
-void FindPlugins();
-
-// Functions Callbacks
-void OnFile_RunExe();
-void OnFile_RunCd();
-void OnFile_RunCdBios();
-void OnFile_Exit();
-void OnEmu_Run();
-void OnEmu_Reset();
-void OnConf_Gpu();
-void OnConf_Spu();
-void OnConf_Cdr();
-void OnConf_Pads();
-void OnConf_Mcds();
-void OnConf_Cpu();
-void OnConf_Conf();
-void OnHelp_Help();
-void OnHelp_About();
-
-GtkWidget *Window = NULL;
-GtkWidget *ConfDlg;
-GtkWidget *DebugDlg;
-GtkWidget *AboutDlg;
-GtkWidget *FileSel;
-
-GtkAccelGroup *AccelGroup;
-
-typedef struct {
- GtkWidget *Combo;
- GList *glist;
- char plist[255][255];
- int plugins;
-} PluginConf;
-
-PluginConf GpuConfS;
-PluginConf SpuConfS;
-PluginConf CdrConfS;
-PluginConf Pad1ConfS;
-PluginConf Pad2ConfS;
-PluginConf BiosConfS;
-
-void StartGui() {
- Window = create_MainWindow();
- gtk_window_set_title(GTK_WINDOW(Window), "P©SX");
-
- gtk_widget_show_all(Window);
- gtk_main();
-}
-
-void RunGui() {
- StartGui();
-}
-
-int destroy=0;
-
-void OnDestroy() {
- if (!destroy) OnFile_Exit();
-}
-
-void ConfigurePlugins() {
- if (!UseGui) return;
- OnConf_Conf();
-}
-
-void ConfigureMemcards() {
- OnConf_Mcds();
-}
-
-void OnRunExe_Ok() {
- gchar *File;
- char exe[256];
-
- File = gtk_file_selection_get_filename(GTK_FILE_SELECTION(FileSel));
- strcpy(exe, File);
- gtk_widget_destroy(FileSel);
- destroy=1;
- gtk_widget_destroy(Window);
- destroy=0;
- gtk_main_quit();
- while (gtk_events_pending()) gtk_main_iteration();
- OpenPlugins();
- SysReset();
- needreset = 0;
- Load(exe);
- psxCpu->Execute();
-}
-
-void OnRunExe_Cancel() {
- gtk_widget_destroy(FileSel);
-}
-
-void OnFile_RunExe() {
- GtkWidget *Ok,*Cancel;
-
- FileSel = gtk_file_selection_new("Select Psx Exe File");
-
- Ok = GTK_FILE_SELECTION(FileSel)->ok_button;
- gtk_signal_connect (GTK_OBJECT(Ok), "clicked", GTK_SIGNAL_FUNC(OnRunExe_Ok), NULL);
- gtk_widget_show(Ok);
-
- Cancel = GTK_FILE_SELECTION(FileSel)->cancel_button;
- gtk_signal_connect (GTK_OBJECT(Cancel), "clicked", GTK_SIGNAL_FUNC(OnRunExe_Cancel), NULL);
- gtk_widget_show(Cancel);
-
- gtk_widget_show(FileSel);
- gdk_window_raise(FileSel->window);
-}
-
-void OnFile_RunCd() {
- LoadCdBios = 0;
- destroy=1;
- gtk_widget_destroy(Window);
- destroy=0;
- gtk_main_quit();
- while (gtk_events_pending()) gtk_main_iteration();
- OpenPlugins();
- SysReset();
- needreset = 0;
- CheckCdrom();
- if (LoadCdrom() == -1) {
- ClosePlugins();
- SysMessage("Could not load Cdrom\n");
- return;
- }
- psxCpu->Execute();
-}
-
-void OnFile_RunCdBios() {
- LoadCdBios = 1;
- destroy=1;
- gtk_widget_destroy(Window);
- destroy=0;
- gtk_main_quit();
- while (gtk_events_pending()) gtk_main_iteration();
- OpenPlugins();
- SysReset();
- needreset = 0;
- CheckCdrom();
- psxCpu->Execute();
-}
-
-void OnFile_Exit() {
- DIR *dir;
- struct dirent *ent;
- void *Handle;
- char plugin[256];
-
- // with this the problem with plugins that are linked with the pthread
- // library is solved
-
- dir = opendir(Config.PluginsDir);
- if (dir != NULL) {
- while ((ent = readdir(dir)) != NULL) {
- sprintf (plugin, "%s%s", Config.PluginsDir, ent->d_name);
-
- if (strstr(plugin, ".so") == NULL) continue;
- Handle = dlopen(plugin, RTLD_NOW);
- if (Handle == NULL) continue;
- }
- }
-
- printf ("P©SX Quitting\n");
- if (UseGui) gtk_main_quit();
- SysClose();
- if (UseGui) gtk_exit(0);
- else exit(0);
-}
-
-void OnEmu_Run() {
- destroy=1;
- gtk_widget_destroy(Window);
- destroy=0;
- gtk_main_quit();
- while (gtk_events_pending()) gtk_main_iteration();
- OpenPlugins();
- if (needreset) { SysReset(); needreset = 0; }
- psxCpu->Execute();
-}
-
-void OnEmu_Reset() {
- needreset = 1;
-}
-
-void OnConf_Gpu() {
- gtk_widget_set_sensitive(Window, FALSE);
- GPU_configure();
- gtk_widget_set_sensitive(Window, TRUE);
-}
-
-void OnConf_Spu() {
- gtk_widget_set_sensitive(Window, FALSE);
- SPU_configure();
- gtk_widget_set_sensitive(Window, TRUE);
-}
-
-void OnConf_Cdr() {
- gtk_widget_set_sensitive(Window, FALSE);
- CDR_configure();
- gtk_widget_set_sensitive(Window, TRUE);
-}
-
-void OnConf_Pads() {
- gtk_widget_set_sensitive(Window, FALSE);
- PAD1_configure();
- if (strcmp(Config.Pad1, Config.Pad2)) PAD2_configure();
- gtk_widget_set_sensitive(Window, TRUE);
-}
-
-GtkWidget *McdDlg;
-GtkWidget *Entry1,*Entry2;
-GtkWidget *List1,*List2;
-GtkWidget *BtnPaste;
-GTimer *Gtimer;
-int timer;
-McdBlock Blocks[2][15];
-int IconC[2][15];
-
-void SetIcon(short *icon, GtkWidget *List, int i) {
- GdkPixmap *pixmap;
- GdkImage *image;
- GdkVisual *visual;
- GdkGC *gc;
- int x, y, c;
-
- visual = gdk_window_get_visual(McdDlg->window);
-
- if (visual->depth == 8) return;
-
- image = gdk_image_new(GDK_IMAGE_NORMAL, visual, 16, 16);
-
- for (y=0; y<16; y++) {
- for (x=0; x<16; x++) {
- c = icon[y*16+x];
- c = ((c&0x001f) << 10) | ((c&0x7c00) >> 10) | (c&0x03e0);
- if (visual->depth == 16)
- c = (c&0x001f) | ((c&0x7c00) << 1) | ((c&0x03e0) << 1);
- else if (visual->depth == 24 || visual->depth == 32)
- c = ((c&0x001f) << 3) | ((c&0x03e0) << 6) | ((c&0x7c00) << 9);
-
- gdk_image_put_pixel(image, x, y, c);
- }
- }
-
- pixmap = gdk_pixmap_new(McdDlg->window, 16, 16, visual->depth);
-
- gc = gdk_gc_new(pixmap);
- gdk_draw_image(pixmap, gc, image, 0, 0, 0, 0, 16, 16);
- gdk_gc_destroy(gc);
- gdk_image_destroy(image);
-
- gtk_clist_set_pixmap(GTK_CLIST(List), i-1, 0, pixmap, NULL);
-}
-
-void LoadListItems(int mcd, GtkWidget *List) {
- int i;
-
- gtk_clist_clear(GTK_CLIST(List));
-
- for (i=1; i<16; i++) {
- McdBlock *Info;
- gchar *text[5];
-
- Info = &Blocks[mcd-1][i-1];
- IconC[mcd-1][i-1] = 0;
-
- if ((Info->Flags & 0xF0) == 0xA0) {
- if ((Info->Flags & 0xF) >= 1 &&
- (Info->Flags & 0xF) <= 3) {
- text[2] = "Deleted";
- } else text[2] = "Free";
- } else if ((Info->Flags & 0xF0) == 0x50)
- text[2] = "Used";
- else { text[2] = "Free"; }
-
- text[0] = "";
- text[1] = Info->Title;
- text[3] = Info->ID;
- text[4] = Info->Name;
-
- gtk_clist_insert(GTK_CLIST(List), i-1, text);
-
- if (Info->IconCount == 0) continue;
-
- SetIcon(Info->Icon, List, i);
- }
-}
-
-void UpdateListItems(int mcd, GtkWidget *List) {
- int i,j;
-
- for (i=1; i<16; i++) {
- McdBlock *Info;
- gchar *text[5];
-
- Info = &Blocks[mcd-1][i-1];
- IconC[mcd-1][i-1] = 0;
-
- if ((Info->Flags & 0xF0) == 0xA0) {
- if ((Info->Flags & 0xF) >= 1 &&
- (Info->Flags & 0xF) <= 3) {
- text[2] = "Deleted";
- } else text[2] = "Free";
- } else if ((Info->Flags & 0xF0) == 0x50)
- text[2] = "Used";
- else { text[2] = "Free"; }
-
- text[0] = "";
- text[1] = Info->Title;
- text[3] = Info->ID;
- text[4] = Info->Name;
-
- for (j=0; j<5; j++)
- gtk_clist_set_text(GTK_CLIST(List), i-1, j, text[j]);
-
- if (Info->IconCount == 0) continue;
-
- SetIcon(Info->Icon, List, i);
- }
-}
-
-void LoadMcdDlg() {
- int i;
-
- for (i=1; i<16; i++) GetMcdBlockInfo(1, i, &Blocks[0][i-1]);
- for (i=1; i<16; i++) GetMcdBlockInfo(2, i, &Blocks[1][i-1]);
- LoadListItems(1, List1);
- LoadListItems(2, List2);
-}
-
-void UpdateMcdDlg() {
- int i;
-
- for (i=1; i<16; i++) GetMcdBlockInfo(1, i, &Blocks[0][i-1]);
- for (i=1; i<16; i++) GetMcdBlockInfo(2, i, &Blocks[1][i-1]);
- UpdateListItems(1, List1);
- UpdateListItems(2, List2);
-}
-
-void StopTimer() {
- g_timer_stop(Gtimer); timer = 0;
-}
-
-void OnMcd_Ok() {
- char *tmp;
-
- StopTimer();
-
- tmp = gtk_entry_get_text(GTK_ENTRY(Entry1));
- strcpy(Config.Mcd1, tmp);
- tmp = gtk_entry_get_text(GTK_ENTRY(Entry2));
- strcpy(Config.Mcd2, tmp);
-
- SaveConfig();
- LoadMcds(Config.Mcd1, Config.Mcd2);
-
- gtk_widget_destroy(McdDlg);
- if (Window != NULL) gtk_widget_set_sensitive(Window, TRUE);
-// gtk_main_quit();
-}
-
-void OnMcd_Cancel() {
- StopTimer();
-
- LoadMcds(Config.Mcd1, Config.Mcd2);
-
- gtk_widget_destroy(McdDlg);
- if (Window != NULL) gtk_widget_set_sensitive(Window, TRUE);
-// gtk_main_quit();
-}
-
-void OnMcdFS1_Ok() {
- gchar *File;
-
- File = gtk_file_selection_get_filename(GTK_FILE_SELECTION(FileSel));
- gtk_entry_set_text(GTK_ENTRY(Entry1), File);
-
- LoadMcd(1, File);
- UpdateMcdDlg();
-
- gtk_widget_destroy(FileSel);
-}
-
-void OnMcdFS2_Ok() {
- gchar *File;
-
- File = gtk_file_selection_get_filename(GTK_FILE_SELECTION(FileSel));
- gtk_entry_set_text(GTK_ENTRY(Entry2), File);
-
- LoadMcd(2, File);
- UpdateMcdDlg();
-
- gtk_widget_destroy(FileSel);
-}
-
-void OnMcdFS_Cancel() {
- gtk_widget_destroy(FileSel);
-}
-
-void OnMcd_FS1() {
- GtkWidget *Ok,*Cancel;
-
- FileSel = gtk_file_selection_new("Select Psx Mcd File");
- gtk_file_selection_set_filename(GTK_FILE_SELECTION(FileSel), gtk_entry_get_text(GTK_ENTRY(Entry1)));
-
- Ok = GTK_FILE_SELECTION(FileSel)->ok_button;
- gtk_signal_connect (GTK_OBJECT(Ok), "clicked", GTK_SIGNAL_FUNC(OnMcdFS1_Ok), NULL);
- gtk_widget_show(Ok);
-
- Cancel = GTK_FILE_SELECTION(FileSel)->cancel_button;
- gtk_signal_connect (GTK_OBJECT(Cancel), "clicked", GTK_SIGNAL_FUNC(OnMcdFS_Cancel), NULL);
- gtk_widget_show(Cancel);
-
- gtk_widget_show(FileSel);
- gdk_window_raise(FileSel->window);
-}
-
-void OnMcd_FS2() {
- GtkWidget *Ok,*Cancel;
-
- FileSel = gtk_file_selection_new("Select Psx Mcd File");
- gtk_file_selection_set_filename(GTK_FILE_SELECTION(FileSel), gtk_entry_get_text(GTK_ENTRY(Entry2)));
-
- Ok = GTK_FILE_SELECTION(FileSel)->ok_button;
- gtk_signal_connect (GTK_OBJECT(Ok), "clicked", GTK_SIGNAL_FUNC(OnMcdFS2_Ok), NULL);
- gtk_widget_show(Ok);
-
- Cancel = GTK_FILE_SELECTION(FileSel)->cancel_button;
- gtk_signal_connect (GTK_OBJECT(Cancel), "clicked", GTK_SIGNAL_FUNC(OnMcdFS_Cancel), NULL);
- gtk_widget_show(Cancel);
-
- gtk_widget_show(FileSel);
- gdk_window_raise(FileSel->window);
-}
-
-GtkWidget *MsgBoxDlg;
-int yes;
-
-void OnMsgBox_Yes() {
- yes = 1;
- gtk_widget_destroy(MsgBoxDlg);
- gtk_main_quit();
-}
-
-void OnMsgBox_No() {
- yes = 0;
- gtk_widget_destroy(MsgBoxDlg);
- gtk_main_quit();
-}
-
-int MessageBox(char *msg, char *title) {
- GtkWidget *Ok,*Txt;
- GtkWidget *Box,*Box1;
- int w;
-
- if (msg[strlen(msg)-1] == '\n') msg[strlen(msg)-1] = 0;
-
- w = strlen(msg) * 6 + 20;
-
- MsgBoxDlg = gtk_window_new (GTK_WINDOW_DIALOG);
- gtk_widget_set_usize(MsgBoxDlg, w, 70);
- gtk_window_set_position(GTK_WINDOW(MsgBoxDlg), GTK_WIN_POS_CENTER);
- gtk_window_set_title(GTK_WINDOW(MsgBoxDlg), title);
- gtk_container_set_border_width(GTK_CONTAINER(MsgBoxDlg), 0);
-
- Box = gtk_vbox_new(0, 0);
- gtk_container_add(GTK_CONTAINER(MsgBoxDlg), Box);
- gtk_widget_show(Box);
-
- Txt = gtk_label_new(msg);
-
- gtk_box_pack_start(GTK_BOX(Box), Txt, FALSE, FALSE, 5);
- gtk_widget_show(Txt);
-
- Box1 = gtk_hbutton_box_new();
- gtk_box_pack_start(GTK_BOX(Box), Box1, FALSE, FALSE, 0);
- gtk_widget_show(Box1);
-
- Ok = gtk_button_new_with_label("Yes");
- gtk_signal_connect (GTK_OBJECT(Ok), "clicked", GTK_SIGNAL_FUNC(OnMsgBox_Yes), NULL);
- gtk_container_add(GTK_CONTAINER(Box1), Ok);
- GTK_WIDGET_SET_FLAGS(Ok, GTK_CAN_DEFAULT);
- gtk_widget_show(Ok);
-
- Ok = gtk_button_new_with_label("No");
- gtk_signal_connect (GTK_OBJECT(Ok), "clicked", GTK_SIGNAL_FUNC(OnMsgBox_No), NULL);
- gtk_container_add(GTK_CONTAINER(Box1), Ok);
- GTK_WIDGET_SET_FLAGS(Ok, GTK_CAN_DEFAULT);
- gtk_widget_show(Ok);
-
- gtk_widget_show(MsgBoxDlg);
-
- gtk_main();
-
- return yes;
-}
-
-void OnMcd_Format1() {
- char *str;
-
- if (MessageBox("Are you sure you want to format this Memory Card?", "Confirmation") == 0) return;
- str = gtk_entry_get_text(GTK_ENTRY(Entry1));
- CreateMcd(str);
- LoadMcd(1, str);
- UpdateMcdDlg();
-}
-
-void OnMcd_Format2() {
- char *str;
-
- if (MessageBox("Are you sure you want to format this Memory Card?", "Confirmation") == 0) return;
- str = gtk_entry_get_text(GTK_ENTRY(Entry2));
- CreateMcd(str);
- LoadMcd(2, str);
- UpdateMcdDlg();
-}
-
-void OnMcd_Reload1() {
- char *str;
-
- str = gtk_entry_get_text(GTK_ENTRY(Entry1));
- LoadMcd(1, str);
- UpdateMcdDlg();
-}
-
-void OnMcd_Reload2() {
- char *str;
-
- str = gtk_entry_get_text(GTK_ENTRY(Entry2));
- LoadMcd(2, str);
- UpdateMcdDlg();
-}
-
-static int copy = 0, copymcd = 0;
-
-void OnMcd_CopyTo1() {
- int i = GTK_CLIST(List2)->focus_row;
-
- copy = i;
- copymcd = 1;
-
- gtk_widget_set_sensitive(BtnPaste, TRUE);
-}
-
-void OnMcd_CopyTo2() {
- int i = GTK_CLIST(List1)->focus_row;
-
- copy = i;
- copymcd = 2;
-
- gtk_widget_set_sensitive(BtnPaste, TRUE);
-}
-
-void OnMcd_Paste() {
- int i;
- char *str;
-
- if (MessageBox("Are you sure you want to paste this selection?", "Confirmation") == 0) return;
-
- if (copymcd == 1) {
- str = gtk_entry_get_text(GTK_ENTRY(Entry1));
- i = GTK_CLIST(List1)->focus_row;
-
- // save dir data + save data
- memcpy(Mcd1Data + (i+1) * 128, Mcd2Data + (copy+1) * 128, 128);
- SaveMcd(str, Mcd1Data, (i+1) * 128, 128);
- memcpy(Mcd1Data + (i+1) * 1024 * 8, Mcd2Data + (copy+1) * 1024 * 8, 1024 * 8);
- SaveMcd(str, Mcd1Data, (i+1) * 1024 * 8, 1024 * 8);
- } else { // 2
- str = gtk_entry_get_text(GTK_ENTRY(Entry2));
- i = GTK_CLIST(List2)->focus_row;
-
- // save dir data + save data
- memcpy(Mcd2Data + (i+1) * 128, Mcd1Data + (copy+1) * 128, 128);
- SaveMcd(str, Mcd2Data, (i+1) * 128, 128);
- memcpy(Mcd2Data + (i+1) * 1024 * 8, Mcd1Data + (copy+1) * 1024 * 8, 1024 * 8);
- SaveMcd(str, Mcd2Data, (i+1) * 1024 * 8, 1024 * 8);
- }
-
- UpdateMcdDlg();
-}
-
-void OnMcd_Delete1() {
- McdBlock *Info;
- int mcd = 1;
- int i, xor = 0, j;
- unsigned char *data, *ptr;
- char *str;
-
- str = gtk_entry_get_text(GTK_ENTRY(Entry1));
- i = GTK_CLIST(List1)->focus_row;
- data = Mcd1Data;
-
- i++;
-
- ptr = data + i * 128;
-
- Info = &Blocks[mcd-1][i-1];
-
- if ((Info->Flags & 0xF0) == 0xA0) {
- if ((Info->Flags & 0xF) >= 1 &&
- (Info->Flags & 0xF) <= 3) { // deleted
- *ptr = 0x50 | (Info->Flags & 0xF);
- } else return;
- } else if ((Info->Flags & 0xF0) == 0x50) { // used
- *ptr = 0xA0 | (Info->Flags & 0xF);
- } else { return; }
-
- for (j=0; j<127; j++) xor^=*ptr++;
- *ptr = xor;
-
- SaveMcd(str, data, i * 128, 128);
- UpdateMcdDlg();
-}
-
-void OnMcd_Delete2() {
- McdBlock *Info;
- int mcd = 2;
- int i, xor = 0, j;
- unsigned char *data, *ptr;
- char *str;
-
- str = gtk_entry_get_text(GTK_ENTRY(Entry2));
- i = GTK_CLIST(List2)->focus_row;
- data = Mcd2Data;
-
- i++;
-
- ptr = data + i * 128;
-
- Info = &Blocks[mcd-1][i-1];
-
- if ((Info->Flags & 0xF0) == 0xA0) {
- if ((Info->Flags & 0xF) >= 1 &&
- (Info->Flags & 0xF) <= 3) { // deleted
- *ptr = 0x50 | (Info->Flags & 0xF);
- } else return;
- } else if ((Info->Flags & 0xF0) == 0x50) { // used
- *ptr = 0xA0 | (Info->Flags & 0xF);
- } else { return; }
-
- for (j=0; j<127; j++) xor^=*ptr++;
- *ptr = xor;
-
- SaveMcd(str, data, i * 128, 128);
- UpdateMcdDlg();
-}
-
-void UpdateMcdIcon(int mcd, GtkWidget *List) {
- int i;
-
- for (i=1; i<16; i++) {
- McdBlock *Info;
- int *count;
-
- Info = &Blocks[mcd-1][i-1];
- count = &IconC[mcd-1][i-1];
-
- if (Info->IconCount <= 1) continue;
-
- (*count)++;
- if (*count == Info->IconCount) *count = 0;
-
- SetIcon(&Info->Icon[*count*16*16], List, i);
- }
-}
-
-void OnConf_Mcds() {
- McdDlg = create_McdsDlg();
- gtk_window_set_title(GTK_WINDOW(McdDlg), "P©SX Memcard Manager");
-
- Entry1 = lookup_widget(McdDlg, "GtkEntry_Mcd1");
- if (!strlen(Config.Mcd1)) strcpy(Config.Mcd1, "memcards/Mcd001.mcr");
- gtk_entry_set_text(GTK_ENTRY(Entry1), Config.Mcd1);
-
- Entry2 = lookup_widget(McdDlg, "GtkEntry_Mcd2");
- if (!strlen(Config.Mcd2)) strcpy(Config.Mcd2, "memcards/Mcd002.mcr");
- gtk_entry_set_text(GTK_ENTRY(Entry2), Config.Mcd2);
-
- List1 = lookup_widget(McdDlg, "GtkCList_McdList1");
- List2 = lookup_widget(McdDlg, "GtkCList_McdList2");
-
- BtnPaste = lookup_widget(McdDlg, "GtkButton_McdPaste");
- gtk_widget_set_sensitive(BtnPaste, FALSE);
-
- gtk_clist_set_column_justification(GTK_CLIST(List1), 0, GTK_JUSTIFY_CENTER);
- gtk_clist_set_column_justification(GTK_CLIST(List2), 0, GTK_JUSTIFY_CENTER);
- gtk_clist_set_column_justification(GTK_CLIST(List1), 2, GTK_JUSTIFY_CENTER);
- gtk_clist_set_column_justification(GTK_CLIST(List2), 2, GTK_JUSTIFY_CENTER);
-
- gtk_widget_show_all(McdDlg);
-
- LoadMcdDlg();
-
- if (Window != NULL) gtk_widget_set_sensitive(Window, FALSE);
-
- Gtimer = g_timer_new(); timer = 1;
-
- while (gtk_events_pending()) gtk_main_iteration();
-
- while (timer) {
- unsigned long usecs;
-
- g_timer_elapsed(Gtimer, &usecs);
- if (usecs > 250000) {
- UpdateMcdIcon(1, List1);
- UpdateMcdIcon(2, List2);
- g_timer_reset(Gtimer);
- }
-
- while (gtk_events_pending()) gtk_main_iteration();
- }
-}
-
-GtkWidget *CpuDlg;
-GtkWidget *PsxCombo;
-GList *psxglist;
-char *psxtypes[] = {
- "NTSC",
- "PAL"
-};
-
-void OnCpu_Ok() {
- GtkWidget *Btn;
- char *tmp;
- long t;
-
- tmp = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(PsxCombo)->entry));
-
- if (!strcmp("NTSC",tmp)) Config.PsxType = 0;
- else Config.PsxType = 1; // pal
-
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_Xa");
- Config.Xa = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
-
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_Sio");
- Config.Sio = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
-
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_Mdec");
- Config.Mdec = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
-
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_Cdda");
- Config.Cdda = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
-
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_PsxAuto");
- Config.PsxAuto = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
-
- t = Config.Cpu;
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_Cpu");
- Config.Cpu = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
- if (t != Config.Cpu) {
- psxCpu->Shutdown();
- if (Config.Cpu)
- psxCpu = &psxInt;
- else psxCpu = &psxRec;
- if (psxCpu->Init() == -1) {
- SysClose();
- exit(1);
- }
- psxCpu->Reset();
- }
-
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_CpuLog");
- Config.Log = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
-
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_PsxOut");
- Config.PsxOut = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
-
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_SpuIrq");
- Config.SpuIrq = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
-
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_CdTiming");
- Config.CdTiming = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
-
- gtk_widget_destroy(CpuDlg);
-
- SaveConfig();
- if (Window != NULL) gtk_widget_set_sensitive(Window, TRUE);
- gtk_main_quit();
-}
-
-void OnCpu_Cancel() {
- gtk_widget_destroy(CpuDlg);
- if (Window != NULL) gtk_widget_set_sensitive(Window, TRUE);
- gtk_main_quit();
-}
-
-
-void OnConf_Cpu() {
- GtkWidget *Btn;
- int i;
-
- CpuDlg = create_CpuDlg();
- gtk_window_set_title(GTK_WINDOW(CpuDlg), "P©SX Configuration");
-
- psxglist = NULL;
- for (i=0;i<2;i++)
- psxglist = g_list_append(psxglist, psxtypes[i]);
- PsxCombo = lookup_widget(CpuDlg, "GtkCombo_PsxType");
- gtk_combo_set_popdown_strings(GTK_COMBO(PsxCombo), psxglist);
- gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(PsxCombo)->entry), psxtypes[Config.PsxType]);
-
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_Xa");
- gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.Xa);
-
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_Sio");
- gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.Sio);
-
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_Mdec");
- gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.Mdec);
-
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_Cdda");
- gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.Cdda);
-
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_PsxAuto");
- gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.PsxAuto);
-
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_Cpu");
- gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.Cpu);
-
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_CpuLog");
- gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.Log);
-
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_PsxOut");
- gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.PsxOut);
-
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_SpuIrq");
- gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.SpuIrq);
-
- Btn = lookup_widget(CpuDlg, "GtkCheckButton_CdTiming");
- gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.CdTiming);
-
- gtk_widget_show_all(CpuDlg);
- if (Window != NULL) gtk_widget_set_sensitive(Window, FALSE);
- gtk_main();
-}
-
-#define FindComboText(combo,list,conf) \
- if (strlen(conf) > 0) { \
- int i; \
- for (i=2;i<255;i+=2) { \
- if (!strcmp(conf, list[i-2])) { \
- gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry), list[i-1]); \
- break; \
- } \
- } \
- }
-
-#define GetComboText(combo,list,conf) \
- { \
- int i; \
- char *tmp = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry)); \
- for (i=2;i<255;i+=2) { \
- if (!strcmp(tmp, list[i-1])) { \
- strcpy(conf, list[i-2]); \
- break; \
- } \
- } \
- }
-
-void OnConfConf_Ok() {
- GetComboText(GpuConfS.Combo, GpuConfS.plist, Config.Gpu);
- GetComboText(SpuConfS.Combo, SpuConfS.plist, Config.Spu);
- GetComboText(CdrConfS.Combo, CdrConfS.plist, Config.Cdr);
- GetComboText(Pad1ConfS.Combo, Pad1ConfS.plist, Config.Pad1);
- GetComboText(Pad2ConfS.Combo, Pad2ConfS.plist, Config.Pad2);
- GetComboText(BiosConfS.Combo, BiosConfS.plist, Config.Bios);
-
- SaveConfig();
-
- ReleasePlugins();
- LoadPlugins();
-
- needreset = 1;
- gtk_widget_destroy(ConfDlg);
- if (Window != NULL) gtk_widget_set_sensitive(Window, TRUE);
- gtk_main_quit();
-}
-
-void OnConfConf_Cancel() {
- gtk_widget_destroy(ConfDlg);
- if (Window != NULL) gtk_widget_set_sensitive(Window, TRUE);
- gtk_main_quit();
-}
-
-#define ConfPlugin(src, confs, plugin, name) \
- void *drv; \
- src conf; \
- char file[256]; \
- \
- GetComboText(confs.Combo, confs.plist, plugin); \
- strcpy(file, Config.PluginsDir); \
- strcat(file, plugin); \
- gtk_widget_set_sensitive(ConfDlg, FALSE); \
- drv = SysLoadLibrary(file); \
- if (drv == NULL) return; \
- conf = (src) SysLoadSym(drv, name); \
- if (SysLibError() == NULL) conf(); \
- else SysMessage("Plugin doesn't needs to be configured"); \
- SysCloseLibrary(drv); \
- gtk_widget_set_sensitive(ConfDlg, TRUE);
-
-#define TestPlugin(src, confs, plugin, name) \
- void *drv; \
- src conf; \
- int ret = 0; \
- char file[256]; \
- \
- GetComboText(confs.Combo, confs.plist, plugin); \
- strcpy(file, Config.PluginsDir); \
- strcat(file, plugin); \
- gtk_widget_set_sensitive(ConfDlg, FALSE); \
- drv = SysLoadLibrary(file); \
- if (drv == NULL) return; \
- conf = (src) SysLoadSym(drv, name); \
- if (SysLibError() == NULL) ret = conf(); \
- SysCloseLibrary(drv); \
- SysMessage("This plugin reports that should %swork correctly", ret == 0 ? "" : "not "); \
- gtk_widget_set_sensitive(ConfDlg, TRUE);
-
-void OnConfConf_GpuConf() {
- ConfPlugin(GPUconfigure, GpuConfS, Config.Gpu, "GPUconfigure");
-}
-
-void OnConfConf_GpuTest() {
- TestPlugin(GPUtest, GpuConfS, Config.Gpu, "GPUtest");
-}
-
-void OnConfConf_GpuAbout() {
- ConfPlugin(GPUabout, GpuConfS, Config.Gpu, "GPUabout");
-}
-
-void OnConfConf_SpuConf() {
- ConfPlugin(SPUconfigure, SpuConfS, Config.Spu, "SPUconfigure");
-}
-
-void OnConfConf_SpuTest() {
- TestPlugin(SPUtest, SpuConfS, Config.Spu, "SPUtest");
-}
-
-void OnConfConf_SpuAbout() {
- ConfPlugin(SPUabout, SpuConfS, Config.Spu, "SPUabout");
-}
-
-void OnConfConf_CdrConf() {
- ConfPlugin(CDRconfigure, CdrConfS, Config.Cdr, "CDRconfigure");
-}
-
-void OnConfConf_CdrTest() {
- TestPlugin(CDRtest, CdrConfS, Config.Cdr, "CDRtest");
-}
-
-void OnConfConf_CdrAbout() {
- ConfPlugin(CDRabout, CdrConfS, Config.Cdr, "CDRabout");
-}
-
-void OnConfConf_Pad1Conf() {
- ConfPlugin(PADconfigure, Pad1ConfS, Config.Pad1, "PADconfigure");
-}
-
-void OnConfConf_Pad1Test() {
- TestPlugin(PADtest, Pad1ConfS, Config.Pad1, "PADtest");
-}
-
-void OnConfConf_Pad1About() {
- ConfPlugin(PADabout, Pad1ConfS, Config.Pad1, "PADabout");
-}
-
-void OnConfConf_Pad2Conf() {
- ConfPlugin(PADconfigure, Pad2ConfS, Config.Pad2, "PADconfigure");
-}
-
-void OnConfConf_Pad2Test() {
- TestPlugin(PADtest, Pad2ConfS, Config.Pad2, "PADtest");
-}
-
-void OnConfConf_Pad2About() {
- ConfPlugin(PADabout, Pad2ConfS, Config.Pad2, "PADabout");
-}
-
-void OnPluginsPath_Ok() {
- gchar *File;
-
- File = gtk_file_selection_get_filename(GTK_FILE_SELECTION(FileSel));
- strcpy(Config.PluginsDir, File);
- if (Config.PluginsDir[strlen(Config.PluginsDir)-1] != '/')
- strcat(Config.PluginsDir, "/");
-
- FindPlugins();
-
- gtk_widget_destroy(FileSel);
-}
-
-void OnPluginsPath_Cancel() {
- gtk_widget_destroy(FileSel);
-}
-
-void OnConfConf_PluginsPath() {
- GtkWidget *Ok,*Cancel;
-
- FileSel = gtk_file_selection_new("Select Plugins Directory");
-
- Ok = GTK_FILE_SELECTION(FileSel)->ok_button;
- gtk_signal_connect (GTK_OBJECT(Ok), "clicked", GTK_SIGNAL_FUNC(OnPluginsPath_Ok), NULL);
- gtk_widget_show(Ok);
-
- Cancel = GTK_FILE_SELECTION(FileSel)->cancel_button;
- gtk_signal_connect (GTK_OBJECT(Cancel), "clicked", GTK_SIGNAL_FUNC(OnPluginsPath_Cancel), NULL);
- gtk_widget_show(Cancel);
-
- gtk_widget_show(FileSel);
- gdk_window_raise(FileSel->window);
-}
-
-void OnBiosPath_Ok() {
- gchar *File;
-
- File = gtk_file_selection_get_filename(GTK_FILE_SELECTION(FileSel));
- strcpy(Config.BiosDir, File);
- if (Config.BiosDir[strlen(Config.BiosDir)-1] != '/')
- strcat(Config.BiosDir, "/");
-
- FindPlugins();
-
- gtk_widget_destroy(FileSel);
-}
-
-void OnBiosPath_Cancel() {
- gtk_widget_destroy(FileSel);
-}
-
-void OnConfConf_BiosPath() {
- GtkWidget *Ok,*Cancel;
-
- FileSel = gtk_file_selection_new("Select Bios Directory");
-
- Ok = GTK_FILE_SELECTION(FileSel)->ok_button;
- gtk_signal_connect (GTK_OBJECT(Ok), "clicked", GTK_SIGNAL_FUNC(OnBiosPath_Ok), NULL);
- gtk_widget_show(Ok);
-
- Cancel = GTK_FILE_SELECTION(FileSel)->cancel_button;
- gtk_signal_connect (GTK_OBJECT(Cancel), "clicked", GTK_SIGNAL_FUNC(OnBiosPath_Cancel), NULL);
- gtk_widget_show(Cancel);
-
- gtk_widget_show(FileSel);
- gdk_window_raise(FileSel->window);
-}
-
-void OnConf_Conf() {
- ConfDlg = create_ConfDlg();
- gtk_window_set_title(GTK_WINDOW(ConfDlg), "P©SX Configuration");
-
- FindPlugins();
-
- gtk_widget_show_all(ConfDlg);
- if (Window != NULL) gtk_widget_set_sensitive(Window, FALSE);
- gtk_main();
-}
-
-void OnDebug() {
- DebugDlg = create_DebugDlg();
- gtk_widget_show_all(DebugDlg);
-
- if (Window != NULL) gtk_widget_set_sensitive(Window, FALSE);
- gtk_main();
-}
-
-void OnDebug_Ok() {
- gtk_widget_destroy(DebugDlg);
- if (Window != NULL) gtk_widget_set_sensitive(Window, TRUE);
- gtk_main_quit();
-}
-
-void OnHelp_Help() {
-}
-
-void OnHelpAbout_Ok() {
- gtk_widget_destroy(AboutDlg);
- if (Window != NULL) gtk_widget_set_sensitive(Window, TRUE);
- gtk_main_quit();
-}
-
-void OnHelp_About() {
- GtkWidget *Label;
-
- AboutDlg = create_AboutDlg();
- gtk_window_set_title(GTK_WINDOW(AboutDlg), "About P©SX");
-
- Label = lookup_widget(AboutDlg, "GtkAbout_LabelVersion");
- gtk_label_set_text(GTK_LABEL(Label),
- "P©SX For Linux\n"
- "Version " PCSX_VERSION);
-
- Label = lookup_widget(AboutDlg, "GtkAbout_LabelAuthors");
- gtk_label_set_text(GTK_LABEL(Label),
- "PCSX a psx emulator\n\n"
- "written by:\n"
- "main coder: linuzappz\n"
- "co-coders: shadow\n"
- "ex-coders: Nocomp, Pete Bernett, nik3d\n"
- "Webmaster: AkumaX");
-
- Label = lookup_widget(AboutDlg, "GtkAbout_LabelGreets");
- gtk_label_set_text(GTK_LABEL(Label),
- "Greets to: Duddie, Tratax, Kazzuya, JNS, Bobbi, Psychojak and Shunt\n"
- "Special thanks to:\n"
- "Twin (we Love you twin0r), Roor (love for you too),\n"
- "calb (Thanks for help :) ), now3d (for great help to my psxdev stuff :) )");
-
- gtk_widget_show_all(AboutDlg);
- if (Window != NULL) gtk_widget_set_sensitive(Window, FALSE);
- gtk_main();
-}
-
-#define ComboAddPlugin(type) { \
- ##type##ConfS.plugins+=2; \
- strcpy(##type##ConfS.plist[##type##ConfS.plugins-1], name); \
- strcpy(##type##ConfS.plist[##type##ConfS.plugins-2], ent->d_name); \
- ##type##ConfS.glist = g_list_append(##type##ConfS.glist, ##type##ConfS.plist[##type##ConfS.plugins-1]); \
-}
-
-#define ConfCreatePConf(name, type) \
- if (type##ConfS.glist != NULL) { \
- type##ConfS.Combo = lookup_widget(ConfDlg, "GtkCombo_" name); \
- gtk_combo_set_popdown_strings(GTK_COMBO(type##ConfS.Combo), type##ConfS.glist); \
- FindComboText(type##ConfS.Combo, type##ConfS.plist, Config.##type##); \
- }
-
-void FindPlugins() {
- DIR *dir;
- struct dirent *ent;
- void *Handle;
- char plugin[256],name[256];
-
- GpuConfS.plugins = 0; SpuConfS.plugins = 0; CdrConfS.plugins = 0;
- Pad1ConfS.plugins = 0; Pad2ConfS.plugins = 0; BiosConfS.plugins = 0;
- GpuConfS.glist = NULL; SpuConfS.glist = NULL; CdrConfS.glist = NULL;
- Pad1ConfS.glist = NULL; Pad2ConfS.glist = NULL; BiosConfS.glist = NULL;
-
- dir = opendir(Config.PluginsDir);
- if (dir == NULL) {
- SysMessage("Could not open '%s' directory\n", Config.PluginsDir);
- return;
- }
- while ((ent = readdir(dir)) != NULL) {
- long type,v;
-
- sprintf(plugin, "%s%s", Config.PluginsDir, ent->d_name);
-
- if (strstr(plugin, ".so") == NULL) continue;
- Handle = dlopen(plugin, RTLD_NOW);
- if (Handle == NULL) continue;
-
- PSE_getLibType = (PSEgetLibType) dlsym(Handle, "PSEgetLibType");
- if (dlerror() != NULL) {
- if (strstr(plugin, "gpu") != NULL) type = PSE_LT_GPU;
- else if (strstr(plugin, "cdr") != NULL) type = PSE_LT_CDR;
- else if (strstr(plugin, "spu") != NULL) type = PSE_LT_SPU;
- else if (strstr(plugin, "pad") != NULL) type = PSE_LT_PAD;
- else continue;
- }
- else type = PSE_getLibType();
-
- PSE_getLibName = (PSEgetLibName) dlsym(Handle, "PSEgetLibName");
- if (dlerror() == NULL) {
- sprintf(name, "%s", PSE_getLibName());
- PSE_getLibVersion = (PSEgetLibVersion) dlsym(Handle, "PSEgetLibVersion");
- if (dlerror() == NULL) {
- char ver[32];
-
- v = PSE_getLibVersion();
- sprintf(ver, " %ld.%ld.%ld",v>>16,(v>>8)&0xff,v&0xff);
- strcat(name, ver);
- }
- }
- else strcpy(name, ent->d_name);
-
- if (type & PSE_LT_CDR) {
- ComboAddPlugin(Cdr);
- }
- if (type & PSE_LT_GPU) {
- ComboAddPlugin(Gpu);
- }
- if (type & PSE_LT_SPU) {
- ComboAddPlugin(Spu);
- }
- if (type & PSE_LT_PAD) {
- PADquery query = (PADquery)dlsym(Handle, "PADquery");
- if (query() & 0x1) {
- ComboAddPlugin(Pad1);
- }
- if (query() & 0x2) {
- ComboAddPlugin(Pad2);
- }
- }
- }
- closedir(dir);
-
- ConfCreatePConf("Gpu", Gpu);
- ConfCreatePConf("Spu", Spu);
- ConfCreatePConf("Pad1", Pad1);
- ConfCreatePConf("Pad2", Pad2);
- ConfCreatePConf("Cdr", Cdr);
-
- BiosConfS.plugins+=2;
- strcpy(BiosConfS.plist[BiosConfS.plugins-1], "Internal HLE Bios");
- strcpy(BiosConfS.plist[BiosConfS.plugins-2], "HLE");
- BiosConfS.glist = g_list_append(BiosConfS.glist, BiosConfS.plist[BiosConfS.plugins-1]);
-
- dir = opendir(Config.BiosDir);
- if (dir == NULL) {
- SysMessage("Could not open '%s' directory\n", Config.BiosDir);
- return;
- }
-
- while ((ent = readdir(dir)) != NULL) {
- struct stat buf;
-
- sprintf (plugin, "%s%s", Config.BiosDir, ent->d_name);
- if (stat(plugin, &buf) == -1) continue;
- if (buf.st_size != (1024*512)) continue;
-
- BiosConfS.plugins+=2;
- strcpy(BiosConfS.plist[BiosConfS.plugins-1], ent->d_name);
- strcpy(BiosConfS.plist[BiosConfS.plugins-2], ent->d_name);
- BiosConfS.glist = g_list_append(BiosConfS.glist, BiosConfS.plist[BiosConfS.plugins-1]);
- }
- closedir(dir);
-
- ConfCreatePConf("Bios", Bios);
-}
-
-GtkWidget *MsgDlg;
-
-void OnMsg_Ok() {
- gtk_widget_destroy(MsgDlg);
- gtk_main_quit();
-}
-
-void SysMessage(char *fmt, ...) {
- GtkWidget *Ok,*Txt;
- GtkWidget *Box,*Box1;
- va_list list;
- char msg[512];
-
- va_start(list, fmt);
- vsprintf(msg, fmt, list);
- va_end(list);
-
- if (msg[strlen(msg)-1] == '\n') msg[strlen(msg)-1] = 0;
-
- if (!UseGui) { printf ("%s\n",msg); return; }
-
- MsgDlg = gtk_window_new (GTK_WINDOW_DIALOG);
- gtk_window_set_position(GTK_WINDOW(MsgDlg), GTK_WIN_POS_CENTER);
- gtk_window_set_title(GTK_WINDOW(MsgDlg), "P©SX Msg");
- gtk_container_set_border_width(GTK_CONTAINER(MsgDlg), 5);
-
- Box = gtk_vbox_new(5, 0);
- gtk_container_add(GTK_CONTAINER(MsgDlg), Box);
- gtk_widget_show(Box);
-
- Txt = gtk_label_new(msg);
-
- gtk_box_pack_start(GTK_BOX(Box), Txt, FALSE, FALSE, 5);
- gtk_widget_show(Txt);
-
- Box1 = gtk_hbutton_box_new();
- gtk_box_pack_start(GTK_BOX(Box), Box1, FALSE, FALSE, 0);
- gtk_widget_show(Box1);
-
- Ok = gtk_button_new_with_label("Ok");
- gtk_signal_connect (GTK_OBJECT(Ok), "clicked", GTK_SIGNAL_FUNC(OnMsg_Ok), NULL);
- gtk_container_add(GTK_CONTAINER(Box1), Ok);
- GTK_WIDGET_SET_FLAGS(Ok, GTK_CAN_DEFAULT);
- gtk_widget_show(Ok);
-
- gtk_widget_show(MsgDlg);
-
- gtk_main();
-}
-
+/* Pcsx - Pc Psx Emulator
+ * Copyright (C) 1999-2002 Pcsx Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <dirent.h>
+#include <dlfcn.h>
+#include <sys/stat.h>
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+#include <signal.h>
+#include <sys/time.h>
+
+#include "Linux.h"
+#include "plugins.h"
+#include "Sio.h"
+#include "GladeGui.h"
+#include "GladeFuncs.h"
+
+extern int UseGui;
+long LoadCdBios;
+static int needreset = 1;
+
+PSEgetLibType PSE_getLibType = NULL;
+PSEgetLibVersion PSE_getLibVersion = NULL;
+PSEgetLibName PSE_getLibName = NULL;
+
+// Helper Functions
+void FindPlugins();
+
+// Functions Callbacks
+void OnFile_RunExe();
+void OnFile_RunCd();
+void OnFile_RunCdBios();
+void OnFile_Exit();
+void OnEmu_Run();
+void OnEmu_Reset();
+void OnConf_Gpu();
+void OnConf_Spu();
+void OnConf_Cdr();
+void OnConf_Pads();
+void OnConf_Mcds();
+void OnConf_Cpu();
+void OnConf_Conf();
+void OnHelp_Help();
+void OnHelp_About();
+
+GtkWidget *Window = NULL;
+GtkWidget *ConfDlg;
+GtkWidget *DebugDlg;
+GtkWidget *AboutDlg;
+GtkWidget *FileSel;
+
+GtkAccelGroup *AccelGroup;
+
+typedef struct {
+ GtkWidget *Combo;
+ GList *glist;
+ char plist[255][255];
+ int plugins;
+} PluginConf;
+
+PluginConf GpuConfS;
+PluginConf SpuConfS;
+PluginConf CdrConfS;
+PluginConf Pad1ConfS;
+PluginConf Pad2ConfS;
+PluginConf BiosConfS;
+
+void StartGui() {
+ Window = create_MainWindow();
+ gtk_window_set_title(GTK_WINDOW(Window), "P©SX");
+
+ gtk_widget_show_all(Window);
+ gtk_main();
+}
+
+void RunGui() {
+ StartGui();
+}
+
+int destroy=0;
+
+void OnDestroy() {
+ if (!destroy) OnFile_Exit();
+}
+
+void ConfigurePlugins() {
+ if (!UseGui) return;
+ OnConf_Conf();
+}
+
+void ConfigureMemcards() {
+ OnConf_Mcds();
+}
+
+void OnRunExe_Ok() {
+ gchar *File;
+ char exe[256];
+
+ File = gtk_file_selection_get_filename(GTK_FILE_SELECTION(FileSel));
+ strcpy(exe, File);
+ gtk_widget_destroy(FileSel);
+ destroy=1;
+ gtk_widget_destroy(Window);
+ destroy=0;
+ gtk_main_quit();
+ while (gtk_events_pending()) gtk_main_iteration();
+ OpenPlugins();
+ SysReset();
+ needreset = 0;
+ Load(exe);
+ psxCpu->Execute();
+}
+
+void OnRunExe_Cancel() {
+ gtk_widget_destroy(FileSel);
+}
+
+void OnFile_RunExe() {
+ GtkWidget *Ok,*Cancel;
+
+ FileSel = gtk_file_selection_new("Select Psx Exe File");
+
+ Ok = GTK_FILE_SELECTION(FileSel)->ok_button;
+ gtk_signal_connect (GTK_OBJECT(Ok), "clicked", GTK_SIGNAL_FUNC(OnRunExe_Ok), NULL);
+ gtk_widget_show(Ok);
+
+ Cancel = GTK_FILE_SELECTION(FileSel)->cancel_button;
+ gtk_signal_connect (GTK_OBJECT(Cancel), "clicked", GTK_SIGNAL_FUNC(OnRunExe_Cancel), NULL);
+ gtk_widget_show(Cancel);
+
+ gtk_widget_show(FileSel);
+ gdk_window_raise(FileSel->window);
+}
+
+void OnFile_RunCd() {
+ LoadCdBios = 0;
+ destroy=1;
+ gtk_widget_destroy(Window);
+ destroy=0;
+ gtk_main_quit();
+ while (gtk_events_pending()) gtk_main_iteration();
+ OpenPlugins();
+ SysReset();
+ needreset = 0;
+ CheckCdrom();
+ if (LoadCdrom() == -1) {
+ ClosePlugins();
+ SysMessage("Could not load Cdrom\n");
+ return;
+ }
+ psxCpu->Execute();
+}
+
+void OnFile_RunCdBios() {
+ LoadCdBios = 1;
+ destroy=1;
+ gtk_widget_destroy(Window);
+ destroy=0;
+ gtk_main_quit();
+ while (gtk_events_pending()) gtk_main_iteration();
+ OpenPlugins();
+ SysReset();
+ needreset = 0;
+ CheckCdrom();
+ psxCpu->Execute();
+}
+
+void OnFile_Exit() {
+ DIR *dir;
+ struct dirent *ent;
+ void *Handle;
+ char plugin[256];
+
+ // with this the problem with plugins that are linked with the pthread
+ // library is solved
+
+ dir = opendir(Config.PluginsDir);
+ if (dir != NULL) {
+ while ((ent = readdir(dir)) != NULL) {
+ sprintf (plugin, "%s%s", Config.PluginsDir, ent->d_name);
+
+ if (strstr(plugin, ".so") == NULL) continue;
+ Handle = dlopen(plugin, RTLD_NOW);
+ if (Handle == NULL) continue;
+ }
+ }
+
+ printf ("P©SX Quitting\n");
+ if (UseGui) gtk_main_quit();
+ SysClose();
+ if (UseGui) gtk_exit(0);
+ else exit(0);
+}
+
+void OnEmu_Run() {
+ destroy=1;
+ gtk_widget_destroy(Window);
+ destroy=0;
+ gtk_main_quit();
+ while (gtk_events_pending()) gtk_main_iteration();
+ OpenPlugins();
+ if (needreset) { SysReset(); needreset = 0; }
+ psxCpu->Execute();
+}
+
+void OnEmu_Reset() {
+ needreset = 1;
+}
+
+void OnConf_Gpu() {
+ gtk_widget_set_sensitive(Window, FALSE);
+ GPU_configure();
+ gtk_widget_set_sensitive(Window, TRUE);
+}
+
+void OnConf_Spu() {
+ gtk_widget_set_sensitive(Window, FALSE);
+ SPU_configure();
+ gtk_widget_set_sensitive(Window, TRUE);
+}
+
+void OnConf_Cdr() {
+ gtk_widget_set_sensitive(Window, FALSE);
+ CDR_configure();
+ gtk_widget_set_sensitive(Window, TRUE);
+}
+
+void OnConf_Pads() {
+ gtk_widget_set_sensitive(Window, FALSE);
+ PAD1_configure();
+ if (strcmp(Config.Pad1, Config.Pad2)) PAD2_configure();
+ gtk_widget_set_sensitive(Window, TRUE);
+}
+
+GtkWidget *McdDlg;
+GtkWidget *Entry1,*Entry2;
+GtkWidget *List1,*List2;
+GtkWidget *BtnPaste;
+GTimer *Gtimer;
+int timer;
+McdBlock Blocks[2][15];
+int IconC[2][15];
+
+void SetIcon(short *icon, GtkWidget *List, int i) {
+ GdkPixmap *pixmap;
+ GdkImage *image;
+ GdkVisual *visual;
+ GdkGC *gc;
+ int x, y, c;
+
+ visual = gdk_window_get_visual(McdDlg->window);
+
+ if (visual->depth == 8) return;
+
+ image = gdk_image_new(GDK_IMAGE_NORMAL, visual, 16, 16);
+
+ for (y=0; y<16; y++) {
+ for (x=0; x<16; x++) {
+ c = icon[y*16+x];
+ c = ((c&0x001f) << 10) | ((c&0x7c00) >> 10) | (c&0x03e0);
+ if (visual->depth == 16)
+ c = (c&0x001f) | ((c&0x7c00) << 1) | ((c&0x03e0) << 1);
+ else if (visual->depth == 24 || visual->depth == 32)
+ c = ((c&0x001f) << 3) | ((c&0x03e0) << 6) | ((c&0x7c00) << 9);
+
+ gdk_image_put_pixel(image, x, y, c);
+ }
+ }
+
+ pixmap = gdk_pixmap_new(McdDlg->window, 16, 16, visual->depth);
+
+ gc = gdk_gc_new(pixmap);
+ gdk_draw_image(pixmap, gc, image, 0, 0, 0, 0, 16, 16);
+ gdk_gc_destroy(gc);
+ gdk_image_destroy(image);
+
+ gtk_clist_set_pixmap(GTK_CLIST(List), i-1, 0, pixmap, NULL);
+}
+
+void LoadListItems(int mcd, GtkWidget *List) {
+ int i;
+
+ gtk_clist_clear(GTK_CLIST(List));
+
+ for (i=1; i<16; i++) {
+ McdBlock *Info;
+ gchar *text[5];
+
+ Info = &Blocks[mcd-1][i-1];
+ IconC[mcd-1][i-1] = 0;
+
+ if ((Info->Flags & 0xF0) == 0xA0) {
+ if ((Info->Flags & 0xF) >= 1 &&
+ (Info->Flags & 0xF) <= 3) {
+ text[2] = "Deleted";
+ } else text[2] = "Free";
+ } else if ((Info->Flags & 0xF0) == 0x50)
+ text[2] = "Used";
+ else { text[2] = "Free"; }
+
+ text[0] = "";
+ text[1] = Info->Title;
+ text[3] = Info->ID;
+ text[4] = Info->Name;
+
+ gtk_clist_insert(GTK_CLIST(List), i-1, text);
+
+ if (Info->IconCount == 0) continue;
+
+ SetIcon(Info->Icon, List, i);
+ }
+}
+
+void UpdateListItems(int mcd, GtkWidget *List) {
+ int i,j;
+
+ for (i=1; i<16; i++) {
+ McdBlock *Info;
+ gchar *text[5];
+
+ Info = &Blocks[mcd-1][i-1];
+ IconC[mcd-1][i-1] = 0;
+
+ if ((Info->Flags & 0xF0) == 0xA0) {
+ if ((Info->Flags & 0xF) >= 1 &&
+ (Info->Flags & 0xF) <= 3) {
+ text[2] = "Deleted";
+ } else text[2] = "Free";
+ } else if ((Info->Flags & 0xF0) == 0x50)
+ text[2] = "Used";
+ else { text[2] = "Free"; }
+
+ text[0] = "";
+ text[1] = Info->Title;
+ text[3] = Info->ID;
+ text[4] = Info->Name;
+
+ for (j=0; j<5; j++)
+ gtk_clist_set_text(GTK_CLIST(List), i-1, j, text[j]);
+
+ if (Info->IconCount == 0) continue;
+
+ SetIcon(Info->Icon, List, i);
+ }
+}
+
+void LoadMcdDlg() {
+ int i;
+
+ for (i=1; i<16; i++) GetMcdBlockInfo(1, i, &Blocks[0][i-1]);
+ for (i=1; i<16; i++) GetMcdBlockInfo(2, i, &Blocks[1][i-1]);
+ LoadListItems(1, List1);
+ LoadListItems(2, List2);
+}
+
+void UpdateMcdDlg() {
+ int i;
+
+ for (i=1; i<16; i++) GetMcdBlockInfo(1, i, &Blocks[0][i-1]);
+ for (i=1; i<16; i++) GetMcdBlockInfo(2, i, &Blocks[1][i-1]);
+ UpdateListItems(1, List1);
+ UpdateListItems(2, List2);
+}
+
+void StopTimer() {
+ g_timer_stop(Gtimer); timer = 0;
+}
+
+void OnMcd_Ok() {
+ char *tmp;
+
+ StopTimer();
+
+ tmp = gtk_entry_get_text(GTK_ENTRY(Entry1));
+ strcpy(Config.Mcd1, tmp);
+ tmp = gtk_entry_get_text(GTK_ENTRY(Entry2));
+ strcpy(Config.Mcd2, tmp);
+
+ SaveConfig();
+ LoadMcds(Config.Mcd1, Config.Mcd2);
+
+ gtk_widget_destroy(McdDlg);
+ if (Window != NULL) gtk_widget_set_sensitive(Window, TRUE);
+// gtk_main_quit();
+}
+
+void OnMcd_Cancel() {
+ StopTimer();
+
+ LoadMcds(Config.Mcd1, Config.Mcd2);
+
+ gtk_widget_destroy(McdDlg);
+ if (Window != NULL) gtk_widget_set_sensitive(Window, TRUE);
+// gtk_main_quit();
+}
+
+void OnMcdFS1_Ok() {
+ gchar *File;
+
+ File = gtk_file_selection_get_filename(GTK_FILE_SELECTION(FileSel));
+ gtk_entry_set_text(GTK_ENTRY(Entry1), File);
+
+ LoadMcd(1, File);
+ UpdateMcdDlg();
+
+ gtk_widget_destroy(FileSel);
+}
+
+void OnMcdFS2_Ok() {
+ gchar *File;
+
+ File = gtk_file_selection_get_filename(GTK_FILE_SELECTION(FileSel));
+ gtk_entry_set_text(GTK_ENTRY(Entry2), File);
+
+ LoadMcd(2, File);
+ UpdateMcdDlg();
+
+ gtk_widget_destroy(FileSel);
+}
+
+void OnMcdFS_Cancel() {
+ gtk_widget_destroy(FileSel);
+}
+
+void OnMcd_FS1() {
+ GtkWidget *Ok,*Cancel;
+
+ FileSel = gtk_file_selection_new("Select Psx Mcd File");
+ gtk_file_selection_set_filename(GTK_FILE_SELECTION(FileSel), gtk_entry_get_text(GTK_ENTRY(Entry1)));
+
+ Ok = GTK_FILE_SELECTION(FileSel)->ok_button;
+ gtk_signal_connect (GTK_OBJECT(Ok), "clicked", GTK_SIGNAL_FUNC(OnMcdFS1_Ok), NULL);
+ gtk_widget_show(Ok);
+
+ Cancel = GTK_FILE_SELECTION(FileSel)->cancel_button;
+ gtk_signal_connect (GTK_OBJECT(Cancel), "clicked", GTK_SIGNAL_FUNC(OnMcdFS_Cancel), NULL);
+ gtk_widget_show(Cancel);
+
+ gtk_widget_show(FileSel);
+ gdk_window_raise(FileSel->window);
+}
+
+void OnMcd_FS2() {
+ GtkWidget *Ok,*Cancel;
+
+ FileSel = gtk_file_selection_new("Select Psx Mcd File");
+ gtk_file_selection_set_filename(GTK_FILE_SELECTION(FileSel), gtk_entry_get_text(GTK_ENTRY(Entry2)));
+
+ Ok = GTK_FILE_SELECTION(FileSel)->ok_button;
+ gtk_signal_connect (GTK_OBJECT(Ok), "clicked", GTK_SIGNAL_FUNC(OnMcdFS2_Ok), NULL);
+ gtk_widget_show(Ok);
+
+ Cancel = GTK_FILE_SELECTION(FileSel)->cancel_button;
+ gtk_signal_connect (GTK_OBJECT(Cancel), "clicked", GTK_SIGNAL_FUNC(OnMcdFS_Cancel), NULL);
+ gtk_widget_show(Cancel);
+
+ gtk_widget_show(FileSel);
+ gdk_window_raise(FileSel->window);
+}
+
+GtkWidget *MsgBoxDlg;
+int yes;
+
+void OnMsgBox_Yes() {
+ yes = 1;
+ gtk_widget_destroy(MsgBoxDlg);
+ gtk_main_quit();
+}
+
+void OnMsgBox_No() {
+ yes = 0;
+ gtk_widget_destroy(MsgBoxDlg);
+ gtk_main_quit();
+}
+
+int MessageBox(char *msg, char *title) {
+ GtkWidget *Ok,*Txt;
+ GtkWidget *Box,*Box1;
+ int w;
+
+ if (msg[strlen(msg)-1] == '\n') msg[strlen(msg)-1] = 0;
+
+ w = strlen(msg) * 6 + 20;
+
+ MsgBoxDlg = gtk_window_new (GTK_WINDOW_DIALOG);
+ gtk_widget_set_usize(MsgBoxDlg, w, 70);
+ gtk_window_set_position(GTK_WINDOW(MsgBoxDlg), GTK_WIN_POS_CENTER);
+ gtk_window_set_title(GTK_WINDOW(MsgBoxDlg), title);
+ gtk_container_set_border_width(GTK_CONTAINER(MsgBoxDlg), 0);
+
+ Box = gtk_vbox_new(0, 0);
+ gtk_container_add(GTK_CONTAINER(MsgBoxDlg), Box);
+ gtk_widget_show(Box);
+
+ Txt = gtk_label_new(msg);
+
+ gtk_box_pack_start(GTK_BOX(Box), Txt, FALSE, FALSE, 5);
+ gtk_widget_show(Txt);
+
+ Box1 = gtk_hbutton_box_new();
+ gtk_box_pack_start(GTK_BOX(Box), Box1, FALSE, FALSE, 0);
+ gtk_widget_show(Box1);
+
+ Ok = gtk_button_new_with_label("Yes");
+ gtk_signal_connect (GTK_OBJECT(Ok), "clicked", GTK_SIGNAL_FUNC(OnMsgBox_Yes), NULL);
+ gtk_container_add(GTK_CONTAINER(Box1), Ok);
+ GTK_WIDGET_SET_FLAGS(Ok, GTK_CAN_DEFAULT);
+ gtk_widget_show(Ok);
+
+ Ok = gtk_button_new_with_label("No");
+ gtk_signal_connect (GTK_OBJECT(Ok), "clicked", GTK_SIGNAL_FUNC(OnMsgBox_No), NULL);
+ gtk_container_add(GTK_CONTAINER(Box1), Ok);
+ GTK_WIDGET_SET_FLAGS(Ok, GTK_CAN_DEFAULT);
+ gtk_widget_show(Ok);
+
+ gtk_widget_show(MsgBoxDlg);
+
+ gtk_main();
+
+ return yes;
+}
+
+void OnMcd_Format1() {
+ char *str;
+
+ if (MessageBox("Are you sure you want to format this Memory Card?", "Confirmation") == 0) return;
+ str = gtk_entry_get_text(GTK_ENTRY(Entry1));
+ CreateMcd(str);
+ LoadMcd(1, str);
+ UpdateMcdDlg();
+}
+
+void OnMcd_Format2() {
+ char *str;
+
+ if (MessageBox("Are you sure you want to format this Memory Card?", "Confirmation") == 0) return;
+ str = gtk_entry_get_text(GTK_ENTRY(Entry2));
+ CreateMcd(str);
+ LoadMcd(2, str);
+ UpdateMcdDlg();
+}
+
+void OnMcd_Reload1() {
+ char *str;
+
+ str = gtk_entry_get_text(GTK_ENTRY(Entry1));
+ LoadMcd(1, str);
+ UpdateMcdDlg();
+}
+
+void OnMcd_Reload2() {
+ char *str;
+
+ str = gtk_entry_get_text(GTK_ENTRY(Entry2));
+ LoadMcd(2, str);
+ UpdateMcdDlg();
+}
+
+static int copy = 0, copymcd = 0;
+
+void OnMcd_CopyTo1() {
+ int i = GTK_CLIST(List2)->focus_row;
+
+ copy = i;
+ copymcd = 1;
+
+ gtk_widget_set_sensitive(BtnPaste, TRUE);
+}
+
+void OnMcd_CopyTo2() {
+ int i = GTK_CLIST(List1)->focus_row;
+
+ copy = i;
+ copymcd = 2;
+
+ gtk_widget_set_sensitive(BtnPaste, TRUE);
+}
+
+void OnMcd_Paste() {
+ int i;
+ char *str;
+
+ if (MessageBox("Are you sure you want to paste this selection?", "Confirmation") == 0) return;
+
+ if (copymcd == 1) {
+ str = gtk_entry_get_text(GTK_ENTRY(Entry1));
+ i = GTK_CLIST(List1)->focus_row;
+
+ // save dir data + save data
+ memcpy(Mcd1Data + (i+1) * 128, Mcd2Data + (copy+1) * 128, 128);
+ SaveMcd(str, Mcd1Data, (i+1) * 128, 128);
+ memcpy(Mcd1Data + (i+1) * 1024 * 8, Mcd2Data + (copy+1) * 1024 * 8, 1024 * 8);
+ SaveMcd(str, Mcd1Data, (i+1) * 1024 * 8, 1024 * 8);
+ } else { // 2
+ str = gtk_entry_get_text(GTK_ENTRY(Entry2));
+ i = GTK_CLIST(List2)->focus_row;
+
+ // save dir data + save data
+ memcpy(Mcd2Data + (i+1) * 128, Mcd1Data + (copy+1) * 128, 128);
+ SaveMcd(str, Mcd2Data, (i+1) * 128, 128);
+ memcpy(Mcd2Data + (i+1) * 1024 * 8, Mcd1Data + (copy+1) * 1024 * 8, 1024 * 8);
+ SaveMcd(str, Mcd2Data, (i+1) * 1024 * 8, 1024 * 8);
+ }
+
+ UpdateMcdDlg();
+}
+
+void OnMcd_Delete1() {
+ McdBlock *Info;
+ int mcd = 1;
+ int i, xor = 0, j;
+ unsigned char *data, *ptr;
+ char *str;
+
+ str = gtk_entry_get_text(GTK_ENTRY(Entry1));
+ i = GTK_CLIST(List1)->focus_row;
+ data = Mcd1Data;
+
+ i++;
+
+ ptr = data + i * 128;
+
+ Info = &Blocks[mcd-1][i-1];
+
+ if ((Info->Flags & 0xF0) == 0xA0) {
+ if ((Info->Flags & 0xF) >= 1 &&
+ (Info->Flags & 0xF) <= 3) { // deleted
+ *ptr = 0x50 | (Info->Flags & 0xF);
+ } else return;
+ } else if ((Info->Flags & 0xF0) == 0x50) { // used
+ *ptr = 0xA0 | (Info->Flags & 0xF);
+ } else { return; }
+
+ for (j=0; j<127; j++) xor^=*ptr++;
+ *ptr = xor;
+
+ SaveMcd(str, data, i * 128, 128);
+ UpdateMcdDlg();
+}
+
+void OnMcd_Delete2() {
+ McdBlock *Info;
+ int mcd = 2;
+ int i, xor = 0, j;
+ unsigned char *data, *ptr;
+ char *str;
+
+ str = gtk_entry_get_text(GTK_ENTRY(Entry2));
+ i = GTK_CLIST(List2)->focus_row;
+ data = Mcd2Data;
+
+ i++;
+
+ ptr = data + i * 128;
+
+ Info = &Blocks[mcd-1][i-1];
+
+ if ((Info->Flags & 0xF0) == 0xA0) {
+ if ((Info->Flags & 0xF) >= 1 &&
+ (Info->Flags & 0xF) <= 3) { // deleted
+ *ptr = 0x50 | (Info->Flags & 0xF);
+ } else return;
+ } else if ((Info->Flags & 0xF0) == 0x50) { // used
+ *ptr = 0xA0 | (Info->Flags & 0xF);
+ } else { return; }
+
+ for (j=0; j<127; j++) xor^=*ptr++;
+ *ptr = xor;
+
+ SaveMcd(str, data, i * 128, 128);
+ UpdateMcdDlg();
+}
+
+void UpdateMcdIcon(int mcd, GtkWidget *List) {
+ int i;
+
+ for (i=1; i<16; i++) {
+ McdBlock *Info;
+ int *count;
+
+ Info = &Blocks[mcd-1][i-1];
+ count = &IconC[mcd-1][i-1];
+
+ if (Info->IconCount <= 1) continue;
+
+ (*count)++;
+ if (*count == Info->IconCount) *count = 0;
+
+ SetIcon(&Info->Icon[*count*16*16], List, i);
+ }
+}
+
+void OnConf_Mcds() {
+ McdDlg = create_McdsDlg();
+ gtk_window_set_title(GTK_WINDOW(McdDlg), "P©SX Memcard Manager");
+
+ Entry1 = lookup_widget(McdDlg, "GtkEntry_Mcd1");
+ if (!strlen(Config.Mcd1)) strcpy(Config.Mcd1, "memcards/Mcd001.mcr");
+ gtk_entry_set_text(GTK_ENTRY(Entry1), Config.Mcd1);
+
+ Entry2 = lookup_widget(McdDlg, "GtkEntry_Mcd2");
+ if (!strlen(Config.Mcd2)) strcpy(Config.Mcd2, "memcards/Mcd002.mcr");
+ gtk_entry_set_text(GTK_ENTRY(Entry2), Config.Mcd2);
+
+ List1 = lookup_widget(McdDlg, "GtkCList_McdList1");
+ List2 = lookup_widget(McdDlg, "GtkCList_McdList2");
+
+ BtnPaste = lookup_widget(McdDlg, "GtkButton_McdPaste");
+ gtk_widget_set_sensitive(BtnPaste, FALSE);
+
+ gtk_clist_set_column_justification(GTK_CLIST(List1), 0, GTK_JUSTIFY_CENTER);
+ gtk_clist_set_column_justification(GTK_CLIST(List2), 0, GTK_JUSTIFY_CENTER);
+ gtk_clist_set_column_justification(GTK_CLIST(List1), 2, GTK_JUSTIFY_CENTER);
+ gtk_clist_set_column_justification(GTK_CLIST(List2), 2, GTK_JUSTIFY_CENTER);
+
+ gtk_widget_show_all(McdDlg);
+
+ LoadMcdDlg();
+
+ if (Window != NULL) gtk_widget_set_sensitive(Window, FALSE);
+
+ Gtimer = g_timer_new(); timer = 1;
+
+ while (gtk_events_pending()) gtk_main_iteration();
+
+ while (timer) {
+ unsigned long usecs;
+
+ g_timer_elapsed(Gtimer, &usecs);
+ if (usecs > 250000) {
+ UpdateMcdIcon(1, List1);
+ UpdateMcdIcon(2, List2);
+ g_timer_reset(Gtimer);
+ }
+
+ while (gtk_events_pending()) gtk_main_iteration();
+ }
+}
+
+GtkWidget *CpuDlg;
+GtkWidget *PsxCombo;
+GList *psxglist;
+char *psxtypes[] = {
+ "NTSC",
+ "PAL"
+};
+
+void OnCpu_Ok() {
+ GtkWidget *Btn;
+ char *tmp;
+ long t;
+
+ tmp = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(PsxCombo)->entry));
+
+ if (!strcmp("NTSC",tmp)) Config.PsxType = 0;
+ else Config.PsxType = 1; // pal
+
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_Xa");
+ Config.Xa = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
+
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_Sio");
+ Config.Sio = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
+
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_Mdec");
+ Config.Mdec = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
+
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_Cdda");
+ Config.Cdda = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
+
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_PsxAuto");
+ Config.PsxAuto = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
+
+ t = Config.Cpu;
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_Cpu");
+ Config.Cpu = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
+ if (t != Config.Cpu) {
+ psxCpu->Shutdown();
+ if (Config.Cpu)
+ psxCpu = &psxInt;
+ else psxCpu = &psxRec;
+ if (psxCpu->Init() == -1) {
+ SysClose();
+ exit(1);
+ }
+ psxCpu->Reset();
+ }
+
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_CpuLog");
+ Config.Log = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
+
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_PsxOut");
+ Config.PsxOut = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
+
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_SpuIrq");
+ Config.SpuIrq = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
+
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_CdTiming");
+ Config.CdTiming = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Btn));
+
+ gtk_widget_destroy(CpuDlg);
+
+ SaveConfig();
+ if (Window != NULL) gtk_widget_set_sensitive(Window, TRUE);
+ gtk_main_quit();
+}
+
+void OnCpu_Cancel() {
+ gtk_widget_destroy(CpuDlg);
+ if (Window != NULL) gtk_widget_set_sensitive(Window, TRUE);
+ gtk_main_quit();
+}
+
+
+void OnConf_Cpu() {
+ GtkWidget *Btn;
+ int i;
+
+ CpuDlg = create_CpuDlg();
+ gtk_window_set_title(GTK_WINDOW(CpuDlg), "P©SX Configuration");
+
+ psxglist = NULL;
+ for (i=0;i<2;i++)
+ psxglist = g_list_append(psxglist, psxtypes[i]);
+ PsxCombo = lookup_widget(CpuDlg, "GtkCombo_PsxType");
+ gtk_combo_set_popdown_strings(GTK_COMBO(PsxCombo), psxglist);
+ gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(PsxCombo)->entry), psxtypes[Config.PsxType]);
+
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_Xa");
+ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.Xa);
+
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_Sio");
+ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.Sio);
+
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_Mdec");
+ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.Mdec);
+
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_Cdda");
+ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.Cdda);
+
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_PsxAuto");
+ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.PsxAuto);
+
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_Cpu");
+ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.Cpu);
+
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_CpuLog");
+ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.Log);
+
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_PsxOut");
+ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.PsxOut);
+
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_SpuIrq");
+ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.SpuIrq);
+
+ Btn = lookup_widget(CpuDlg, "GtkCheckButton_CdTiming");
+ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(Btn), Config.CdTiming);
+
+ gtk_widget_show_all(CpuDlg);
+ if (Window != NULL) gtk_widget_set_sensitive(Window, FALSE);
+ gtk_main();
+}
+
+#define FindComboText(combo,list,conf) \
+ if (strlen(conf) > 0) { \
+ int i; \
+ for (i=2;i<255;i+=2) { \
+ if (!strcmp(conf, list[i-2])) { \
+ gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry), list[i-1]); \
+ break; \
+ } \
+ } \
+ }
+
+#define GetComboText(combo,list,conf) \
+ { \
+ int i; \
+ char *tmp = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry)); \
+ for (i=2;i<255;i+=2) { \
+ if (!strcmp(tmp, list[i-1])) { \
+ strcpy(conf, list[i-2]); \
+ break; \
+ } \
+ } \
+ }
+
+void OnConfConf_Ok() {
+ GetComboText(GpuConfS.Combo, GpuConfS.plist, Config.Gpu);
+ GetComboText(SpuConfS.Combo, SpuConfS.plist, Config.Spu);
+ GetComboText(CdrConfS.Combo, CdrConfS.plist, Config.Cdr);
+ GetComboText(Pad1ConfS.Combo, Pad1ConfS.plist, Config.Pad1);
+ GetComboText(Pad2ConfS.Combo, Pad2ConfS.plist, Config.Pad2);
+ GetComboText(BiosConfS.Combo, BiosConfS.plist, Config.Bios);
+
+ SaveConfig();
+
+ ReleasePlugins();
+ LoadPlugins();
+
+ needreset = 1;
+ gtk_widget_destroy(ConfDlg);
+ if (Window != NULL) gtk_widget_set_sensitive(Window, TRUE);
+ gtk_main_quit();
+}
+
+void OnConfConf_Cancel() {
+ gtk_widget_destroy(ConfDlg);
+ if (Window != NULL) gtk_widget_set_sensitive(Window, TRUE);
+ gtk_main_quit();
+}
+
+#define ConfPlugin(src, confs, plugin, name) \
+ void *drv; \
+ src conf; \
+ char file[256]; \
+ \
+ GetComboText(confs.Combo, confs.plist, plugin); \
+ strcpy(file, Config.PluginsDir); \
+ strcat(file, plugin); \
+ gtk_widget_set_sensitive(ConfDlg, FALSE); \
+ drv = SysLoadLibrary(file); \
+ if (drv == NULL) return; \
+ conf = (src) SysLoadSym(drv, name); \
+ if (SysLibError() == NULL) conf(); \
+ else SysMessage("Plugin doesn't needs to be configured"); \
+ SysCloseLibrary(drv); \
+ gtk_widget_set_sensitive(ConfDlg, TRUE);
+
+#define TestPlugin(src, confs, plugin, name) \
+ void *drv; \
+ src conf; \
+ int ret = 0; \
+ char file[256]; \
+ \
+ GetComboText(confs.Combo, confs.plist, plugin); \
+ strcpy(file, Config.PluginsDir); \
+ strcat(file, plugin); \
+ gtk_widget_set_sensitive(ConfDlg, FALSE); \
+ drv = SysLoadLibrary(file); \
+ if (drv == NULL) return; \
+ conf = (src) SysLoadSym(drv, name); \
+ if (SysLibError() == NULL) ret = conf(); \
+ SysCloseLibrary(drv); \
+ SysMessage("This plugin reports that should %swork correctly", ret == 0 ? "" : "not "); \
+ gtk_widget_set_sensitive(ConfDlg, TRUE);
+
+void OnConfConf_GpuConf() {
+ ConfPlugin(GPUconfigure, GpuConfS, Config.Gpu, "GPUconfigure");
+}
+
+void OnConfConf_GpuTest() {
+ TestPlugin(GPUtest, GpuConfS, Config.Gpu, "GPUtest");
+}
+
+void OnConfConf_GpuAbout() {
+ ConfPlugin(GPUabout, GpuConfS, Config.Gpu, "GPUabout");
+}
+
+void OnConfConf_SpuConf() {
+ ConfPlugin(SPUconfigure, SpuConfS, Config.Spu, "SPUconfigure");
+}
+
+void OnConfConf_SpuTest() {
+ TestPlugin(SPUtest, SpuConfS, Config.Spu, "SPUtest");
+}
+
+void OnConfConf_SpuAbout() {
+ ConfPlugin(SPUabout, SpuConfS, Config.Spu, "SPUabout");
+}
+
+void OnConfConf_CdrConf() {
+ ConfPlugin(CDRconfigure, CdrConfS, Config.Cdr, "CDRconfigure");
+}
+
+void OnConfConf_CdrTest() {
+ TestPlugin(CDRtest, CdrConfS, Config.Cdr, "CDRtest");
+}
+
+void OnConfConf_CdrAbout() {
+ ConfPlugin(CDRabout, CdrConfS, Config.Cdr, "CDRabout");
+}
+
+void OnConfConf_Pad1Conf() {
+ ConfPlugin(PADconfigure, Pad1ConfS, Config.Pad1, "PADconfigure");
+}
+
+void OnConfConf_Pad1Test() {
+ TestPlugin(PADtest, Pad1ConfS, Config.Pad1, "PADtest");
+}
+
+void OnConfConf_Pad1About() {
+ ConfPlugin(PADabout, Pad1ConfS, Config.Pad1, "PADabout");
+}
+
+void OnConfConf_Pad2Conf() {
+ ConfPlugin(PADconfigure, Pad2ConfS, Config.Pad2, "PADconfigure");
+}
+
+void OnConfConf_Pad2Test() {
+ TestPlugin(PADtest, Pad2ConfS, Config.Pad2, "PADtest");
+}
+
+void OnConfConf_Pad2About() {
+ ConfPlugin(PADabout, Pad2ConfS, Config.Pad2, "PADabout");
+}
+
+void OnPluginsPath_Ok() {
+ gchar *File;
+
+ File = gtk_file_selection_get_filename(GTK_FILE_SELECTION(FileSel));
+ strcpy(Config.PluginsDir, File);
+ if (Config.PluginsDir[strlen(Config.PluginsDir)-1] != '/')
+ strcat(Config.PluginsDir, "/");
+
+ FindPlugins();
+
+ gtk_widget_destroy(FileSel);
+}
+
+void OnPluginsPath_Cancel() {
+ gtk_widget_destroy(FileSel);
+}
+
+void OnConfConf_PluginsPath() {
+ GtkWidget *Ok,*Cancel;
+
+ FileSel = gtk_file_selection_new("Select Plugins Directory");
+
+ Ok = GTK_FILE_SELECTION(FileSel)->ok_button;
+ gtk_signal_connect (GTK_OBJECT(Ok), "clicked", GTK_SIGNAL_FUNC(OnPluginsPath_Ok), NULL);
+ gtk_widget_show(Ok);
+
+ Cancel = GTK_FILE_SELECTION(FileSel)->cancel_button;
+ gtk_signal_connect (GTK_OBJECT(Cancel), "clicked", GTK_SIGNAL_FUNC(OnPluginsPath_Cancel), NULL);
+ gtk_widget_show(Cancel);
+
+ gtk_widget_show(FileSel);
+ gdk_window_raise(FileSel->window);
+}
+
+void OnBiosPath_Ok() {
+ gchar *File;
+
+ File = gtk_file_selection_get_filename(GTK_FILE_SELECTION(FileSel));
+ strcpy(Config.BiosDir, File);
+ if (Config.BiosDir[strlen(Config.BiosDir)-1] != '/')
+ strcat(Config.BiosDir, "/");
+
+ FindPlugins();
+
+ gtk_widget_destroy(FileSel);
+}
+
+void OnBiosPath_Cancel() {
+ gtk_widget_destroy(FileSel);
+}
+
+void OnConfConf_BiosPath() {
+ GtkWidget *Ok,*Cancel;
+
+ FileSel = gtk_file_selection_new("Select Bios Directory");
+
+ Ok = GTK_FILE_SELECTION(FileSel)->ok_button;
+ gtk_signal_connect (GTK_OBJECT(Ok), "clicked", GTK_SIGNAL_FUNC(OnBiosPath_Ok), NULL);
+ gtk_widget_show(Ok);
+
+ Cancel = GTK_FILE_SELECTION(FileSel)->cancel_button;
+ gtk_signal_connect (GTK_OBJECT(Cancel), "clicked", GTK_SIGNAL_FUNC(OnBiosPath_Cancel), NULL);
+ gtk_widget_show(Cancel);
+
+ gtk_widget_show(FileSel);
+ gdk_window_raise(FileSel->window);
+}
+
+void OnConf_Conf() {
+ ConfDlg = create_ConfDlg();
+ gtk_window_set_title(GTK_WINDOW(ConfDlg), "P©SX Configuration");
+
+ FindPlugins();
+
+ gtk_widget_show_all(ConfDlg);
+ if (Window != NULL) gtk_widget_set_sensitive(Window, FALSE);
+ gtk_main();
+}
+
+void OnDebug() {
+ DebugDlg = create_DebugDlg();
+ gtk_widget_show_all(DebugDlg);
+
+ if (Window != NULL) gtk_widget_set_sensitive(Window, FALSE);
+ gtk_main();
+}
+
+void OnDebug_Ok() {
+ gtk_widget_destroy(DebugDlg);
+ if (Window != NULL) gtk_widget_set_sensitive(Window, TRUE);
+ gtk_main_quit();
+}
+
+void OnHelp_Help() {
+}
+
+void OnHelpAbout_Ok() {
+ gtk_widget_destroy(AboutDlg);
+ if (Window != NULL) gtk_widget_set_sensitive(Window, TRUE);
+ gtk_main_quit();
+}
+
+void OnHelp_About() {
+ GtkWidget *Label;
+
+ AboutDlg = create_AboutDlg();
+ gtk_window_set_title(GTK_WINDOW(AboutDlg), "About P©SX");
+
+ Label = lookup_widget(AboutDlg, "GtkAbout_LabelVersion");
+ gtk_label_set_text(GTK_LABEL(Label),
+ "P©SX For Linux\n"
+ "Version " PCSX_VERSION);
+
+ Label = lookup_widget(AboutDlg, "GtkAbout_LabelAuthors");
+ gtk_label_set_text(GTK_LABEL(Label),
+ "PCSX a psx emulator\n\n"
+ "written by:\n"
+ "main coder: linuzappz\n"
+ "co-coders: shadow\n"
+ "ex-coders: Nocomp, Pete Bernett, nik3d\n"
+ "Webmaster: AkumaX");
+
+ Label = lookup_widget(AboutDlg, "GtkAbout_LabelGreets");
+ gtk_label_set_text(GTK_LABEL(Label),
+ "Greets to: Duddie, Tratax, Kazzuya, JNS, Bobbi, Psychojak and Shunt\n"
+ "Special thanks to:\n"
+ "Twin (we Love you twin0r), Roor (love for you too),\n"
+ "calb (Thanks for help :) ), now3d (for great help to my psxdev stuff :) )");
+
+ gtk_widget_show_all(AboutDlg);
+ if (Window != NULL) gtk_widget_set_sensitive(Window, FALSE);
+ gtk_main();
+}
+
+#define ComboAddPlugin(type) { \
+ ##type##ConfS.plugins+=2; \
+ strcpy(##type##ConfS.plist[##type##ConfS.plugins-1], name); \
+ strcpy(##type##ConfS.plist[##type##ConfS.plugins-2], ent->d_name); \
+ ##type##ConfS.glist = g_list_append(##type##ConfS.glist, ##type##ConfS.plist[##type##ConfS.plugins-1]); \
+}
+
+#define ConfCreatePConf(name, type) \
+ if (type##ConfS.glist != NULL) { \
+ type##ConfS.Combo = lookup_widget(ConfDlg, "GtkCombo_" name); \
+ gtk_combo_set_popdown_strings(GTK_COMBO(type##ConfS.Combo), type##ConfS.glist); \
+ FindComboText(type##ConfS.Combo, type##ConfS.plist, Config.##type##); \
+ }
+
+void FindPlugins() {
+ DIR *dir;
+ struct dirent *ent;
+ void *Handle;
+ char plugin[256],name[256];
+
+ GpuConfS.plugins = 0; SpuConfS.plugins = 0; CdrConfS.plugins = 0;
+ Pad1ConfS.plugins = 0; Pad2ConfS.plugins = 0; BiosConfS.plugins = 0;
+ GpuConfS.glist = NULL; SpuConfS.glist = NULL; CdrConfS.glist = NULL;
+ Pad1ConfS.glist = NULL; Pad2ConfS.glist = NULL; BiosConfS.glist = NULL;
+
+ dir = opendir(Config.PluginsDir);
+ if (dir == NULL) {
+ SysMessage("Could not open '%s' directory\n", Config.PluginsDir);
+ return;
+ }
+ while ((ent = readdir(dir)) != NULL) {
+ long type,v;
+
+ sprintf(plugin, "%s%s", Config.PluginsDir, ent->d_name);
+
+ if (strstr(plugin, ".so") == NULL) continue;
+ Handle = dlopen(plugin, RTLD_NOW);
+ if (Handle == NULL) continue;
+
+ PSE_getLibType = (PSEgetLibType) dlsym(Handle, "PSEgetLibType");
+ if (dlerror() != NULL) {
+ if (strstr(plugin, "gpu") != NULL) type = PSE_LT_GPU;
+ else if (strstr(plugin, "cdr") != NULL) type = PSE_LT_CDR;
+ else if (strstr(plugin, "spu") != NULL) type = PSE_LT_SPU;
+ else if (strstr(plugin, "pad") != NULL) type = PSE_LT_PAD;
+ else continue;
+ }
+ else type = PSE_getLibType();
+
+ PSE_getLibName = (PSEgetLibName) dlsym(Handle, "PSEgetLibName");
+ if (dlerror() == NULL) {
+ sprintf(name, "%s", PSE_getLibName());
+ PSE_getLibVersion = (PSEgetLibVersion) dlsym(Handle, "PSEgetLibVersion");
+ if (dlerror() == NULL) {
+ char ver[32];
+
+ v = PSE_getLibVersion();
+ sprintf(ver, " %ld.%ld.%ld",v>>16,(v>>8)&0xff,v&0xff);
+ strcat(name, ver);
+ }
+ }
+ else strcpy(name, ent->d_name);
+
+ if (type & PSE_LT_CDR) {
+ ComboAddPlugin(Cdr);
+ }
+ if (type & PSE_LT_GPU) {
+ ComboAddPlugin(Gpu);
+ }
+ if (type & PSE_LT_SPU) {
+ ComboAddPlugin(Spu);
+ }
+ if (type & PSE_LT_PAD) {
+ PADquery query = (PADquery)dlsym(Handle, "PADquery");
+ if (query() & 0x1) {
+ ComboAddPlugin(Pad1);
+ }
+ if (query() & 0x2) {
+ ComboAddPlugin(Pad2);
+ }
+ }
+ }
+ closedir(dir);
+
+ ConfCreatePConf("Gpu", Gpu);
+ ConfCreatePConf("Spu", Spu);
+ ConfCreatePConf("Pad1", Pad1);
+ ConfCreatePConf("Pad2", Pad2);
+ ConfCreatePConf("Cdr", Cdr);
+
+ BiosConfS.plugins+=2;
+ strcpy(BiosConfS.plist[BiosConfS.plugins-1], "Internal HLE Bios");
+ strcpy(BiosConfS.plist[BiosConfS.plugins-2], "HLE");
+ BiosConfS.glist = g_list_append(BiosConfS.glist, BiosConfS.plist[BiosConfS.plugins-1]);
+
+ dir = opendir(Config.BiosDir);
+ if (dir == NULL) {
+ SysMessage("Could not open '%s' directory\n", Config.BiosDir);
+ return;
+ }
+
+ while ((ent = readdir(dir)) != NULL) {
+ struct stat buf;
+
+ sprintf (plugin, "%s%s", Config.BiosDir, ent->d_name);
+ if (stat(plugin, &buf) == -1) continue;
+ if (buf.st_size != (1024*512)) continue;
+
+ BiosConfS.plugins+=2;
+ strcpy(BiosConfS.plist[BiosConfS.plugins-1], ent->d_name);
+ strcpy(BiosConfS.plist[BiosConfS.plugins-2], ent->d_name);
+ BiosConfS.glist = g_list_append(BiosConfS.glist, BiosConfS.plist[BiosConfS.plugins-1]);
+ }
+ closedir(dir);
+
+ ConfCreatePConf("Bios", Bios);
+}
+
+GtkWidget *MsgDlg;
+
+void OnMsg_Ok() {
+ gtk_widget_destroy(MsgDlg);
+ gtk_main_quit();
+}
+
+void SysMessage(char *fmt, ...) {
+ GtkWidget *Ok,*Txt;
+ GtkWidget *Box,*Box1;
+ va_list list;
+ char msg[512];
+
+ va_start(list, fmt);
+ vsprintf(msg, fmt, list);
+ va_end(list);
+
+ if (msg[strlen(msg)-1] == '\n') msg[strlen(msg)-1] = 0;
+
+ if (!UseGui) { printf ("%s\n",msg); return; }
+
+ MsgDlg = gtk_window_new (GTK_WINDOW_DIALOG);
+ gtk_window_set_position(GTK_WINDOW(MsgDlg), GTK_WIN_POS_CENTER);
+ gtk_window_set_title(GTK_WINDOW(MsgDlg), "P©SX Msg");
+ gtk_container_set_border_width(GTK_CONTAINER(MsgDlg), 5);
+
+ Box = gtk_vbox_new(5, 0);
+ gtk_container_add(GTK_CONTAINER(MsgDlg), Box);
+ gtk_widget_show(Box);
+
+ Txt = gtk_label_new(msg);
+
+ gtk_box_pack_start(GTK_BOX(Box), Txt, FALSE, FALSE, 5);
+ gtk_widget_show(Txt);
+
+ Box1 = gtk_hbutton_box_new();
+ gtk_box_pack_start(GTK_BOX(Box), Box1, FALSE, FALSE, 0);
+ gtk_widget_show(Box1);
+
+ Ok = gtk_button_new_with_label("Ok");
+ gtk_signal_connect (GTK_OBJECT(Ok), "clicked", GTK_SIGNAL_FUNC(OnMsg_Ok), NULL);
+ gtk_container_add(GTK_CONTAINER(Box1), Ok);
+ GTK_WIDGET_SET_FLAGS(Ok, GTK_CAN_DEFAULT);
+ gtk_widget_show(Ok);
+
+ gtk_widget_show(MsgDlg);
+
+ gtk_main();
+}
+