2012-11-18 19:15:59 +01:00
/* 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 . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 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 <regex.h>
# include "Linux.h"
# include "ConfDlg.h"
# include "../libpcsxcore/plugins.h"
static void OnBiosPath_Changed ( GtkWidget * wdg , gpointer data ) ;
static void OnConf_Clicked ( GtkDialog * dialog , gint arg1 , gpointer user_data ) ;
static void OnPluginPath_Changed ( GtkWidget * wdg , gpointer data ) ;
static void OnConfConf_Pad1About ( GtkWidget * widget , gpointer user_data ) ;
static void OnConfConf_Pad2About ( GtkWidget * widget , gpointer user_data ) ;
static void OnConfConf_Pad1Conf ( GtkWidget * widget , gpointer user_data ) ;
static void OnConfConf_Pad2Conf ( GtkWidget * widget , gpointer user_data ) ;
static void OnNet_Conf ( GtkWidget * widget , gpointer user_data ) ;
static void OnNet_About ( GtkWidget * widget , gpointer user_data ) ;
static void on_configure_plugin ( GtkWidget * widget , gpointer user_data ) ;
static void on_about_plugin ( GtkWidget * widget , gpointer user_data ) ;
static void UpdatePluginsBIOS_UpdateGUI ( ) ;
static void FindNetPlugin ( ) ;
PSEgetLibType PSE_getLibType = NULL ;
PSEgetLibVersion PSE_getLibVersion = NULL ;
PSEgetLibName PSE_getLibName = NULL ;
static GtkBuilder * builder ;
GtkWidget * ConfDlg = NULL ;
GtkWidget * NetDlg = NULL ;
GtkWidget * controlwidget = NULL ;
PluginConf GpuConfS ;
PluginConf SpuConfS ;
PluginConf CdrConfS ;
PluginConf Pad1ConfS ;
PluginConf Pad2ConfS ;
PluginConf NetConfS ;
2013-02-14 20:18:22 +01:00
# ifdef ENABLE_SIO1API
PluginConf Sio1ConfS ;
# endif
2012-11-18 19:15:59 +01:00
PluginConf BiosConfS ;
# 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_combo_box_set_active ( GTK_COMBO_BOX ( combo ) , i / 2 - 1 ) ; \
break ; \
} \
} \
}
# define GetComboText(combo, list, conf) \
{ \
int row ; \
row = gtk_combo_box_get_active ( GTK_COMBO_BOX ( combo ) ) ; \
strcpy ( conf , ( char * ) list [ row * 2 ] ) ; \
}
void ConfigurePlugins ( ) {
if ( ! UseGui ) {
/* How do we get here if we're not running the GUI? */
/* Ryan: we're going to imagine that someday, there will be a way
* to configure plugins from the commandline */
printf ( " ERROR: Plugins cannot be configured without the GUI. " ) ;
return ;
}
GtkWidget * widget ;
gchar * path ;
UpdatePluginsBIOS ( ) ;
builder = gtk_builder_new ( ) ;
2017-07-17 15:43:15 +02:00
if ( ! gtk_builder_add_from_resource ( builder , " /org/pcsxr/gui/pcsxr.ui " , NULL ) ) {
2012-11-18 19:15:59 +01:00
g_warning ( " Error: interface could not be loaded! " ) ;
return ;
}
UpdatePluginsBIOS_UpdateGUI ( builder ) ;
2013-02-17 16:42:04 +01:00
ConfDlg = GTK_WIDGET ( gtk_builder_get_object ( builder , " ConfDlg " ) ) ;
2020-05-22 00:50:40 +02:00
2012-11-18 19:15:59 +01:00
gtk_window_set_title ( GTK_WINDOW ( ConfDlg ) , _ ( " Configure PCSXR " ) ) ;
gtk_widget_show ( ConfDlg ) ;
/* Set the paths in the file choosers to be based on the saved configurations */
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " GtkFileChooser_Bios " ) ) ;
2012-11-18 19:15:59 +01:00
gtk_file_chooser_set_current_folder ( GTK_FILE_CHOOSER ( widget ) , Config . BiosDir ) ;
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " GtkFileChooser_Plugin " ) ) ;
2012-11-18 19:15:59 +01:00
gtk_file_chooser_set_current_folder ( GTK_FILE_CHOOSER ( widget ) , Config . PluginsDir ) ;
if ( strlen ( Config . PluginsDir ) = = 0 ) {
if ( ( path = gtk_file_chooser_get_current_folder ( GTK_FILE_CHOOSER ( widget ) ) ) ! = NULL ) {
strcpy ( Config . PluginsDir , path ) ;
g_free ( path ) ;
}
}
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_ConfGpu " ) ) ;
2012-11-20 22:01:10 +01:00
g_signal_connect_data ( G_OBJECT ( widget ) , " clicked " ,
2013-07-31 17:17:44 +02:00
G_CALLBACK ( on_configure_plugin ) , GINT_TO_POINTER ( PSE_LT_GPU ) , NULL , G_CONNECT_AFTER ) ;
2012-11-18 19:15:59 +01:00
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_ConfSpu " ) ) ;
2012-11-20 22:01:10 +01:00
g_signal_connect_data ( G_OBJECT ( widget ) , " clicked " ,
2013-07-31 17:17:44 +02:00
G_CALLBACK ( on_configure_plugin ) , GINT_TO_POINTER ( PSE_LT_SPU ) , NULL , G_CONNECT_AFTER ) ;
2012-11-18 19:15:59 +01:00
/* ADB TODO Does pad 1 and 2 need to be different? */
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_ConfPad1 " ) ) ;
2012-11-20 22:01:10 +01:00
g_signal_connect_data ( G_OBJECT ( widget ) , " clicked " ,
2012-11-18 19:15:59 +01:00
G_CALLBACK ( OnConfConf_Pad1Conf ) , builder , NULL , G_CONNECT_AFTER ) ;
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_ConfPad2 " ) ) ;
2012-11-20 22:01:10 +01:00
g_signal_connect_data ( G_OBJECT ( widget ) , " clicked " ,
2012-11-18 19:15:59 +01:00
G_CALLBACK ( OnConfConf_Pad2Conf ) , builder , NULL , G_CONNECT_AFTER ) ;
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_ConfCdr " ) ) ;
2012-11-20 22:01:10 +01:00
g_signal_connect_data ( G_OBJECT ( widget ) , " clicked " ,
2013-07-31 17:17:44 +02:00
G_CALLBACK ( on_configure_plugin ) , GINT_TO_POINTER ( PSE_LT_CDR ) , NULL , G_CONNECT_AFTER ) ;
2013-02-14 20:18:22 +01:00
# ifdef ENABLE_SIO1API
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_ConfSio1 " ) ) ;
2013-02-14 20:18:22 +01:00
g_signal_connect_data ( G_OBJECT ( widget ) , " clicked " ,
G_CALLBACK ( on_configure_plugin ) , ( gpointer ) PSE_LT_SIO1 , NULL , G_CONNECT_AFTER ) ;
2013-02-15 00:14:57 +01:00
# else
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " label18 " ) ) ;
2013-02-15 00:14:57 +01:00
gtk_widget_set_sensitive ( widget , FALSE ) ;
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " GtkCombo_Sio1 " ) ) ;
2013-02-15 00:14:57 +01:00
gtk_widget_set_sensitive ( widget , FALSE ) ;
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_ConfSio1 " ) ) ;
2013-02-15 00:14:57 +01:00
gtk_widget_set_sensitive ( widget , FALSE ) ;
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_AboutSio1 " ) ) ;
2013-02-15 00:14:57 +01:00
gtk_widget_set_sensitive ( widget , FALSE ) ;
2013-02-14 20:18:22 +01:00
# endif
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_AboutGpu " ) ) ;
2012-11-20 22:01:10 +01:00
g_signal_connect_data ( G_OBJECT ( widget ) , " clicked " ,
2013-07-31 17:17:44 +02:00
G_CALLBACK ( on_about_plugin ) , GINT_TO_POINTER ( PSE_LT_GPU ) , NULL , G_CONNECT_AFTER ) ;
2012-11-18 19:15:59 +01:00
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_AboutSpu " ) ) ;
2012-11-20 22:01:10 +01:00
g_signal_connect_data ( G_OBJECT ( widget ) , " clicked " ,
2013-07-31 17:17:44 +02:00
G_CALLBACK ( on_about_plugin ) , GINT_TO_POINTER ( PSE_LT_SPU ) , NULL , G_CONNECT_AFTER ) ;
2012-11-18 19:15:59 +01:00
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_AboutPad1 " ) ) ;
2012-11-20 22:01:10 +01:00
g_signal_connect_data ( G_OBJECT ( widget ) , " clicked " ,
2012-11-18 19:15:59 +01:00
G_CALLBACK ( OnConfConf_Pad1About ) , builder , NULL , G_CONNECT_AFTER ) ;
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_AboutPad2 " ) ) ;
2012-11-20 22:01:10 +01:00
g_signal_connect_data ( G_OBJECT ( widget ) , " clicked " ,
2012-11-18 19:15:59 +01:00
G_CALLBACK ( OnConfConf_Pad2About ) , builder , NULL , G_CONNECT_AFTER ) ;
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_AboutCdr " ) ) ;
2012-11-20 22:01:10 +01:00
g_signal_connect_data ( G_OBJECT ( widget ) , " clicked " ,
2013-07-31 17:17:44 +02:00
G_CALLBACK ( on_about_plugin ) , GINT_TO_POINTER ( PSE_LT_CDR ) , NULL , G_CONNECT_AFTER ) ;
2013-02-14 20:18:22 +01:00
# ifdef ENABLE_SIO1API
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_AboutSio1 " ) ) ;
2013-02-14 20:18:22 +01:00
g_signal_connect_data ( G_OBJECT ( widget ) , " clicked " ,
G_CALLBACK ( on_about_plugin ) , ( gpointer ) PSE_LT_SIO1 , NULL , G_CONNECT_AFTER ) ;
# endif
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " GtkFileChooser_Bios " ) ) ;
2012-11-20 22:01:10 +01:00
g_signal_connect_data ( G_OBJECT ( widget ) , " current_folder_changed " ,
2012-11-18 19:15:59 +01:00
G_CALLBACK ( OnBiosPath_Changed ) , builder , NULL , G_CONNECT_AFTER ) ;
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " GtkFileChooser_Plugin " ) ) ;
2012-11-20 22:01:10 +01:00
g_signal_connect_data ( G_OBJECT ( widget ) , " current_folder_changed " ,
2012-11-18 19:15:59 +01:00
G_CALLBACK ( OnPluginPath_Changed ) , builder , NULL , G_CONNECT_AFTER ) ;
2012-11-20 22:01:10 +01:00
g_signal_connect_data ( G_OBJECT ( ConfDlg ) , " response " ,
2012-11-18 19:15:59 +01:00
G_CALLBACK ( OnConf_Clicked ) , builder , ( GClosureNotify ) g_object_unref , G_CONNECT_AFTER ) ;
}
void OnNet_Clicked ( GtkDialog * dialog , gint arg1 , gpointer user_data ) {
GetComboText ( NetConfS . Combo , NetConfS . plist , Config . Net ) ;
SaveConfig ( ) ;
gtk_widget_destroy ( GTK_WIDGET ( dialog ) ) ;
NetDlg = NULL ;
}
void OnConf_Net ( ) {
GtkWidget * widget ;
if ( NetDlg ! = NULL ) {
gtk_window_present ( GTK_WINDOW ( NetDlg ) ) ;
return ;
}
builder = gtk_builder_new ( ) ;
2017-07-17 15:43:15 +02:00
if ( ! gtk_builder_add_from_resource ( builder , " /org/pcsxr/gui/pcsxr.ui " , NULL ) ) {
2012-11-18 19:15:59 +01:00
g_warning ( " Error: interface could not be loaded! " ) ;
return ;
}
2013-02-17 16:42:04 +01:00
NetDlg = GTK_WIDGET ( gtk_builder_get_object ( builder , " NetDlg " ) ) ;
2020-05-22 00:50:40 +02:00
2012-11-18 19:15:59 +01:00
gtk_widget_show ( NetDlg ) ;
FindNetPlugin ( builder ) ;
/* Setup a handler for when Close or Cancel is clicked */
2012-11-20 22:01:10 +01:00
g_signal_connect_data ( G_OBJECT ( NetDlg ) , " response " ,
2012-11-18 19:15:59 +01:00
G_CALLBACK ( OnNet_Clicked ) , builder , ( GClosureNotify ) g_object_unref , G_CONNECT_AFTER ) ;
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_ConfNet " ) ) ;
2012-11-20 22:01:10 +01:00
g_signal_connect_data ( G_OBJECT ( widget ) , " clicked " ,
2012-11-18 19:15:59 +01:00
G_CALLBACK ( OnNet_Conf ) , builder , NULL , G_CONNECT_AFTER ) ;
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_AboutNet " ) ) ;
2012-11-20 22:01:10 +01:00
g_signal_connect_data ( G_OBJECT ( widget ) , " clicked " ,
2012-11-18 19:15:59 +01:00
G_CALLBACK ( OnNet_About ) , builder , NULL , G_CONNECT_AFTER ) ;
}
void OnConf_Graphics ( ) {
void * drv ;
GPUconfigure conf ;
char Plugin [ MAXPATHLEN ] ;
sprintf ( Plugin , " %s/%s " , Config . PluginsDir , Config . Gpu ) ;
drv = SysLoadLibrary ( Plugin ) ;
if ( drv = = NULL ) { printf ( " Error with file %s \n " , Plugin ) ; return ; }
while ( gtk_events_pending ( ) ) gtk_main_iteration ( ) ;
conf = ( GPUconfigure ) SysLoadSym ( drv , " GPUconfigure " ) ;
if ( conf ! = NULL ) {
conf ( ) ;
}
else
SysInfoMessage ( _ ( " No configuration required " ) , _ ( " This plugin doesn't need to be configured. " ) ) ;
SysCloseLibrary ( drv ) ;
}
void OnConf_Sound ( ) {
void * drv ;
SPUconfigure conf ;
char Plugin [ MAXPATHLEN ] ;
sprintf ( Plugin , " %s/%s " , Config . PluginsDir , Config . Spu ) ;
drv = SysLoadLibrary ( Plugin ) ;
if ( drv = = NULL ) { printf ( " Error with file %s \n " , Plugin ) ; return ; }
while ( gtk_events_pending ( ) ) gtk_main_iteration ( ) ;
conf = ( GPUconfigure ) SysLoadSym ( drv , " SPUconfigure " ) ;
if ( conf ! = NULL ) {
conf ( ) ;
}
else
SysInfoMessage ( _ ( " No configuration required " ) , _ ( " This plugin doesn't need to be configured. " ) ) ;
SysCloseLibrary ( drv ) ;
}
void OnConf_CdRom ( ) {
void * drv ;
CDRconfigure conf ;
char Plugin [ MAXPATHLEN ] ;
sprintf ( Plugin , " %s/%s " , Config . PluginsDir , Config . Cdr ) ;
drv = SysLoadLibrary ( Plugin ) ;
if ( drv = = NULL ) { printf ( " Error with file %s \n " , Plugin ) ; return ; }
while ( gtk_events_pending ( ) ) gtk_main_iteration ( ) ;
conf = ( GPUconfigure ) SysLoadSym ( drv , " CDRconfigure " ) ;
if ( conf ! = NULL ) {
conf ( ) ;
}
else
SysInfoMessage ( _ ( " No configuration required " ) , _ ( " This plugin doesn't need to be configured. " ) ) ;
SysCloseLibrary ( drv ) ;
}
2013-02-14 20:18:22 +01:00
# ifdef ENABLE_SIO1API
void OnConf_Sio1 ( ) {
void * drv ;
SIO1configure conf ;
char Plugin [ MAXPATHLEN ] ;
sprintf ( Plugin , " %s/%s " , Config . PluginsDir , Config . Sio1 ) ;
drv = SysLoadLibrary ( Plugin ) ;
if ( drv = = NULL ) { printf ( " Error with file %s \n " , Plugin ) ; return ; }
while ( gtk_events_pending ( ) ) gtk_main_iteration ( ) ;
conf = ( SIO1configure ) SysLoadSym ( drv , " SIO1configure " ) ;
if ( conf ! = NULL ) {
conf ( ) ;
}
else
SysInfoMessage ( _ ( " No configuration required " ) , _ ( " This plugin doesn't need to be configured. " ) ) ;
2012-11-18 19:15:59 +01:00
2013-02-14 20:18:22 +01:00
SysCloseLibrary ( drv ) ;
}
# endif
2012-11-18 19:15:59 +01:00
void OnConf_Pad ( ) {
void * drv ;
PADconfigure conf ;
char Plugin [ MAXPATHLEN ] ;
2014-05-12 09:21:29 +02:00
// PAD 1
2012-11-18 19:15:59 +01:00
sprintf ( Plugin , " %s/%s " , Config . PluginsDir , Config . Pad1 ) ;
drv = SysLoadLibrary ( Plugin ) ;
if ( drv = = NULL ) { printf ( " Error with file %s \n " , Plugin ) ; return ; }
while ( gtk_events_pending ( ) ) gtk_main_iteration ( ) ;
2013-02-14 20:18:22 +01:00
conf = ( PADconfigure ) SysLoadSym ( drv , " PADconfigure " ) ;
2012-11-18 19:15:59 +01:00
if ( conf ! = NULL ) {
conf ( ) ;
}
else
SysInfoMessage ( _ ( " No configuration required " ) , _ ( " This plugin doesn't need to be configured. " ) ) ;
SysCloseLibrary ( drv ) ;
2014-05-12 09:21:29 +02:00
// PAD 2
2012-11-18 19:15:59 +01:00
if ( strcmp ( Config . Pad1 , Config . Pad2 ) ! = 0 ) {
sprintf ( Plugin , " %s/%s " , Config . PluginsDir , Config . Pad2 ) ;
drv = SysLoadLibrary ( Plugin ) ;
if ( drv = = NULL ) { printf ( " Error with file %s \n " , Plugin ) ; return ; }
while ( gtk_events_pending ( ) ) gtk_main_iteration ( ) ;
2013-02-14 20:18:22 +01:00
conf = ( PADconfigure ) SysLoadSym ( drv , " PADconfigure " ) ;
2012-11-18 19:15:59 +01:00
if ( conf ! = NULL ) {
conf ( ) ;
}
SysCloseLibrary ( drv ) ;
}
}
static int all_config_set ( ) {
int retval ;
if ( ( strlen ( Config . Gpu ) ! = 0 ) & &
2013-07-31 17:17:44 +02:00
( strlen ( Config . Spu ) ! = 0 ) & &
( strlen ( Config . Cdr ) ! = 0 ) & &
2013-02-14 20:18:22 +01:00
# ifdef ENABLE_SIO1API
2013-07-31 17:17:44 +02:00
( strlen ( Config . Sio1 ) ! = 0 ) & &
2013-02-14 20:18:22 +01:00
# endif
2013-07-31 17:17:44 +02:00
( strlen ( Config . Pad1 ) ! = 0 ) & &
( strlen ( Config . Pad2 ) ! = 0 ) )
2012-11-18 19:15:59 +01:00
retval = TRUE ;
else
retval = FALSE ;
return retval ;
}
/* TODO Check whether configuration is required when we choose the plugin, and set the state of the
button appropriately . New gtk tooltip API should allow us to put a tooltip explanation for
disabled widgets */
/* TODO If combo screen hasn't been opened and the user chooses the menu config option, confs.Combo will be null and cause a segfault */
# define ConfPlugin(src, confs, plugin, name, parent) { \
void * drv ; \
src conf ; \
gchar * filename ; \
\
GetComboText ( confs . Combo , confs . plist , plugin ) ; \
2013-07-31 17:17:44 +02:00
if ( strlen ( plugin ) > 0 ) { \
2013-02-24 01:57:23 +01:00
filename = g_build_filename ( getenv ( " HOME " ) , PLUGINS_DIR , plugin , NULL ) ; \
/*printf("Configuring plugin %s\n", filename);*/ \
drv = SysLoadLibrary ( filename ) ; \
if ( drv = = NULL ) { printf ( " Error with file %s \n " , filename ) ; return ; } \
2012-11-18 19:15:59 +01:00
\
2013-02-24 01:57:23 +01:00
while ( gtk_events_pending ( ) ) gtk_main_iteration ( ) ; \
conf = ( src ) SysLoadSym ( drv , name ) ; \
if ( conf ) { \
conf ( ) ; \
} else \
SysInfoMessage ( _ ( " No configuration required " ) , _ ( " This plugin doesn't need to be configured. " ) ) ; \
SysCloseLibrary ( drv ) ; \
g_free ( filename ) ; \
2013-07-31 17:17:44 +02:00
} else SysInfoMessage ( name , _ ( " Please select a plugin. " ) ) ; \
2012-11-18 19:15:59 +01:00
}
static void on_configure_plugin ( GtkWidget * widget , gpointer user_data ) {
2013-07-31 17:17:44 +02:00
gint plugin_type = GPOINTER_TO_INT ( user_data ) ;
2012-11-18 19:15:59 +01:00
while ( gtk_events_pending ( ) )
gtk_main_iteration ( ) ;
2013-02-24 01:57:23 +01:00
switch ( plugin_type ) {
case PSE_LT_GPU :
ConfPlugin ( GPUconfigure , GpuConfS , Config . Gpu , " GPUconfigure " , ConfDlg ) ;
break ;
case PSE_LT_SPU :
ConfPlugin ( SPUconfigure , SpuConfS , Config . Spu , " SPUconfigure " , ConfDlg ) ;
break ;
case PSE_LT_CDR :
ConfPlugin ( CDRconfigure , CdrConfS , Config . Cdr , " CDRconfigure " , ConfDlg ) ;
break ;
2013-02-14 20:18:22 +01:00
# ifdef ENABLE_SIO1API
2013-02-24 01:57:23 +01:00
case PSE_LT_SIO1 :
ConfPlugin ( SIO1configure , Sio1ConfS , Config . Sio1 , " SIO1configure " , ConfDlg ) ;
break ;
2013-02-14 20:18:22 +01:00
# endif
2013-02-24 01:57:23 +01:00
}
2012-11-18 19:15:59 +01:00
}
static void on_about_plugin ( GtkWidget * widget , gpointer user_data ) {
2013-07-31 17:17:44 +02:00
gint plugin_type = GPOINTER_TO_INT ( user_data ) ;
2012-11-18 19:15:59 +01:00
while ( gtk_events_pending ( ) )
gtk_main_iteration ( ) ;
2013-02-24 01:57:23 +01:00
switch ( plugin_type ) {
case PSE_LT_GPU :
ConfPlugin ( GPUconfigure , GpuConfS , Config . Gpu , " GPUabout " , ConfDlg ) ;
break ;
case PSE_LT_SPU :
ConfPlugin ( SPUconfigure , SpuConfS , Config . Spu , " SPUabout " , ConfDlg ) ;
break ;
case PSE_LT_CDR :
ConfPlugin ( CDRconfigure , CdrConfS , Config . Cdr , " CDRabout " , ConfDlg ) ;
break ;
2013-02-14 20:18:22 +01:00
# ifdef ENABLE_SIO1API
2013-02-24 01:57:23 +01:00
case PSE_LT_SIO1 :
ConfPlugin ( SIO1configure , Sio1ConfS , Config . Sio1 , " SIO1about " , ConfDlg ) ;
break ;
2013-02-14 20:18:22 +01:00
# endif
2013-02-24 01:57:23 +01:00
}
2012-11-18 19:15:59 +01:00
}
static void OnConfConf_Pad1About ( GtkWidget * widget , gpointer user_data ) {
ConfPlugin ( PADabout , Pad1ConfS , Config . Pad1 , " PADabout " , ConfDlg ) ;
}
static void OnConfConf_Pad2About ( GtkWidget * widget , gpointer user_data ) {
ConfPlugin ( PADabout , Pad2ConfS , Config . Pad2 , " PADabout " , ConfDlg ) ;
}
static void OnConfConf_Pad1Conf ( GtkWidget * widget , gpointer user_data ) {
ConfPlugin ( PADabout , Pad1ConfS , Config . Pad1 , " PADconfigure " , ConfDlg ) ;
}
static void OnConfConf_Pad2Conf ( GtkWidget * widget , gpointer user_data ) {
ConfPlugin ( PADabout , Pad2ConfS , Config . Pad2 , " PADconfigure " , ConfDlg ) ;
}
static void OnNet_Conf ( GtkWidget * widget , gpointer user_data ) {
ConfPlugin ( NETconfigure , NetConfS , Config . Net , " NETconfigure " , NetDlg ) ;
}
static void OnNet_About ( GtkWidget * widget , gpointer user_data ) {
ConfPlugin ( NETabout , NetConfS , Config . Net , " NETabout " , NetDlg ) ;
}
static void OnPluginPath_Changed ( GtkWidget * wdg , gpointer data ) {
gchar * path ;
path = gtk_file_chooser_get_current_folder ( GTK_FILE_CHOOSER ( wdg ) ) ;
2013-02-17 16:42:04 +01:00
GSList * l = gtk_file_chooser_get_filenames ( GTK_FILE_CHOOSER ( wdg ) ) ;
//printf(("%s and %s\n"), path, l->data);
if ( l ) path = l - > data ;
2012-11-18 19:15:59 +01:00
strcpy ( Config . PluginsDir , path ) ;
2013-02-17 16:42:04 +01:00
UpdatePluginsBIOS ( ) ;
2012-11-18 19:15:59 +01:00
UpdatePluginsBIOS_UpdateGUI ( data ) ;
g_free ( path ) ;
}
static void OnBiosPath_Changed ( GtkWidget * wdg , gpointer data ) {
gchar * foldername ;
foldername = gtk_file_chooser_get_current_folder ( GTK_FILE_CHOOSER ( wdg ) ) ;
2013-02-17 16:42:04 +01:00
GSList * l = gtk_file_chooser_get_filenames ( GTK_FILE_CHOOSER ( wdg ) ) ;
//printf(("%s and %s\n"), foldername, l->data);
if ( l ) foldername = l - > data ;
2012-11-18 19:15:59 +01:00
strcpy ( Config . BiosDir , foldername ) ;
UpdatePluginsBIOS ( ) ;
UpdatePluginsBIOS_UpdateGUI ( data ) ;
g_free ( foldername ) ;
}
void OnConf_Clicked ( GtkDialog * dialog , gint arg1 , gpointer user_data ) {
GetComboText ( GpuConfS . Combo , GpuConfS . plist , Config . Gpu ) ;
GetComboText ( SpuConfS . Combo , SpuConfS . plist , Config . Spu ) ;
GetComboText ( CdrConfS . Combo , CdrConfS . plist , Config . Cdr ) ;
2013-02-14 20:18:22 +01:00
# ifdef ENABLE_SIO1API
GetComboText ( Sio1ConfS . Combo , Sio1ConfS . plist , Config . Sio1 ) ;
# endif
2012-11-18 19:15:59 +01:00
GetComboText ( Pad1ConfS . Combo , Pad1ConfS . plist , Config . Pad1 ) ;
GetComboText ( Pad2ConfS . Combo , Pad2ConfS . plist , Config . Pad2 ) ;
GetComboText ( BiosConfS . Combo , BiosConfS . plist , Config . Bios ) ;
SaveConfig ( ) ;
gtk_widget_destroy ( ConfDlg ) ;
ConfDlg = NULL ;
}
# 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 ] ) ; \
}
void populate_combo_box ( GtkWidget * widget , GList * list ) {
GtkListStore * store ;
GtkCellRenderer * renderer ;
store = gtk_list_store_new ( 1 , G_TYPE_STRING ) ;
// Clear existing data from combo box
gtk_cell_layout_clear ( GTK_CELL_LAYOUT ( widget ) ) ;
renderer = gtk_cell_renderer_text_new ( ) ;
gtk_cell_layout_pack_start ( GTK_CELL_LAYOUT ( widget ) , renderer , FALSE ) ;
gtk_cell_layout_add_attribute ( GTK_CELL_LAYOUT ( widget ) , renderer , " text " , 0 ) ;
while ( list ! = NULL ) {
GtkTreeIter iter ;
gtk_list_store_append ( store , & iter ) ;
gtk_list_store_set ( store , & iter , 0 , ( char * ) list - > data , - 1 ) ;
list = list - > next ;
}
gtk_combo_box_set_model ( GTK_COMBO_BOX ( widget ) , GTK_TREE_MODEL ( store ) ) ;
}
# define ConfCreatePConf(name, type) \
/* Populate the relevant combo widget with the list of plugins. \
If no plugins available , disable the combo and its controls . \
Note that the Bios plugin has no About / Conf control . */ \
2013-02-17 16:42:04 +01:00
type # # ConfS . Combo = GTK_WIDGET ( gtk_builder_get_object ( builder , " GtkCombo_ " name ) ) ; \
2012-11-18 19:15:59 +01:00
if ( type # # ConfS . glist ! = NULL ) { \
populate_combo_box ( type # # ConfS . Combo , type # # ConfS . glist ) ; \
FindComboText ( type # # ConfS . Combo , type # # ConfS . plist , Config . type ) ; \
gtk_widget_set_sensitive ( type # # ConfS . Combo , TRUE ) ; \
if ( g_ascii_strcasecmp ( name , " Bios " ) ! = 0 ) { \
2013-02-17 16:42:04 +01:00
controlwidget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_Conf " name ) ) ; \
2012-11-18 19:15:59 +01:00
gtk_widget_set_sensitive ( controlwidget , TRUE ) ; \
2013-02-17 16:42:04 +01:00
controlwidget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_About " name ) ) ; \
2012-11-18 19:15:59 +01:00
gtk_widget_set_sensitive ( controlwidget , TRUE ) ; \
} \
} else { \
if ( g_ascii_strcasecmp ( name , " Bios " ) ! = 0 ) { \
2013-02-17 16:42:04 +01:00
gtk_combo_box_set_model ( GTK_COMBO_BOX ( type # # ConfS . Combo ) , NULL ) ; \
2012-11-18 19:15:59 +01:00
gtk_widget_set_sensitive ( type # # ConfS . Combo , FALSE ) ; \
2013-02-17 16:42:04 +01:00
controlwidget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_Conf " name ) ) ; \
2012-11-18 19:15:59 +01:00
gtk_widget_set_sensitive ( controlwidget , FALSE ) ; \
2013-02-17 16:42:04 +01:00
controlwidget = GTK_WIDGET ( gtk_builder_get_object ( builder , " btn_About " name ) ) ; \
2012-11-18 19:15:59 +01:00
gtk_widget_set_sensitive ( controlwidget , FALSE ) ; \
} \
}
int plugin_is_available ( gchar * plugin ) {
int retval ;
gchar * pluginfile ;
struct stat stbuf ;
pluginfile = g_strconcat ( getenv ( " HOME " ) , PLUGINS_DIR , plugin , NULL ) ;
if ( stat ( pluginfile , & stbuf ) = = - 1 )
retval = FALSE ;
else
retval = TRUE ;
g_free ( pluginfile ) ;
return retval ;
}
int plugins_configured ( ) {
// make sure there are choices for all of the plugins!!
if ( all_config_set ( ) = = FALSE )
return FALSE ;
// and make sure they can all be accessed
// if they can't be, wipe the variable and return FALSE
if ( plugin_is_available ( Config . Gpu ) = = FALSE ) { Config . Gpu [ 0 ] = ' \0 ' ; return FALSE ; }
if ( plugin_is_available ( Config . Spu ) = = FALSE ) { Config . Spu [ 0 ] = ' \0 ' ; return FALSE ; }
if ( plugin_is_available ( Config . Cdr ) = = FALSE ) { Config . Cdr [ 0 ] = ' \0 ' ; return FALSE ; }
2013-02-14 20:18:22 +01:00
# ifdef ENABLE_SIO1API
if ( plugin_is_available ( Config . Sio1 ) = = FALSE ) { Config . Sio1 [ 0 ] = ' \0 ' ; return FALSE ; }
# endif
2012-11-18 19:15:59 +01:00
if ( plugin_is_available ( Config . Pad1 ) = = FALSE ) { Config . Pad1 [ 0 ] = ' \0 ' ; return FALSE ; }
if ( plugin_is_available ( Config . Pad2 ) = = FALSE ) { Config . Pad2 [ 0 ] = ' \0 ' ; return FALSE ; }
// if everything is happy, return TRUE
return TRUE ;
}
int is_valid_bios_file ( gchar * filename ) {
int valid ;
struct stat buf ;
if ( ( stat ( filename , & buf ) = = - 1 ) | | ( buf . st_size ! = ( 1024 * 512 ) ) )
valid = FALSE ;
else {
valid = TRUE ;
}
return valid ;
}
// Add the name of the BIOS file to the drop-down list. This will
// be the filename, not the full path to the file
void add_bios_to_list ( gchar * bios_name , gchar * internal_name ) {
BiosConfS . plugins + = 2 ;
strcpy ( BiosConfS . plist [ BiosConfS . plugins - 1 ] , bios_name ) ;
strcpy ( BiosConfS . plist [ BiosConfS . plugins - 2 ] , internal_name ) ;
BiosConfS . glist = g_list_append ( BiosConfS . glist , BiosConfS . plist [ BiosConfS . plugins - 1 ] ) ;
}
void scan_bios_dir ( gchar * dirname ) {
DIR * dir ;
struct dirent * ent ;
gchar * filename ;
dir = opendir ( dirname ) ;
if ( dir = = NULL ) {
SysMessage ( _ ( " Could not open BIOS directory: '%s' \n " ) , dirname ) ;
return ;
}
while ( ( ent = readdir ( dir ) ) ! = NULL ) {
filename = g_build_filename ( dirname , ent - > d_name , NULL ) ;
if ( is_valid_bios_file ( filename ) )
add_bios_to_list ( g_path_get_basename ( filename ) , g_path_get_basename ( filename ) ) ;
g_free ( filename ) ;
}
closedir ( dir ) ;
}
void UpdatePluginsBIOS ( ) {
DIR * dir ;
struct dirent * ent ;
void * Handle ;
char name [ 256 ] ;
gchar * linkname ;
2013-02-14 20:18:22 +01:00
GpuConfS . plugins = 0 ;
SpuConfS . plugins = 0 ;
CdrConfS . plugins = 0 ;
# ifdef ENABLE_SIO1API
Sio1ConfS . plugins = 0 ;
# endif
Pad1ConfS . plugins = 0 ;
Pad2ConfS . plugins = 0 ;
BiosConfS . plugins = 0 ;
GpuConfS . glist = NULL ;
SpuConfS . glist = NULL ;
CdrConfS . glist = NULL ;
# ifdef ENABLE_SIO1API
Sio1ConfS . glist = NULL ;
# endif
Pad1ConfS . glist = NULL ;
Pad2ConfS . glist = NULL ;
BiosConfS . glist = NULL ;
GpuConfS . plist [ 0 ] [ 0 ] = ' \0 ' ;
SpuConfS . plist [ 0 ] [ 0 ] = ' \0 ' ;
CdrConfS . plist [ 0 ] [ 0 ] = ' \0 ' ;
# ifdef ENABLE_SIO1API
Sio1ConfS . plist [ 0 ] [ 0 ] = ' \0 ' ;
# endif
Pad1ConfS . plist [ 0 ] [ 0 ] = ' \0 ' ;
Pad2ConfS . plist [ 0 ] [ 0 ] = ' \0 ' ;
BiosConfS . plist [ 0 ] [ 0 ] = ' \0 ' ;
2012-11-18 19:15:59 +01:00
// Load and get plugin info
dir = opendir ( Config . PluginsDir ) ;
if ( dir = = NULL ) {
printf ( _ ( " Could not open directory: '%s' \n " ) , Config . PluginsDir ) ;
return ;
}
while ( ( ent = readdir ( dir ) ) ! = NULL ) {
long type , v ;
linkname = g_build_filename ( Config . PluginsDir , ent - > d_name , NULL ) ;
// only libraries past this point, not config tools
if ( strstr ( linkname , " .so " ) = = NULL & & strstr ( linkname , " .dylib " ) = = NULL )
continue ;
Handle = dlopen ( linkname , RTLD_NOW ) ;
if ( Handle = = NULL ) {
printf ( " %s \n " , dlerror ( ) ) ;
g_free ( linkname ) ;
continue ;
}
PSE_getLibType = ( PSEgetLibType ) dlsym ( Handle , " PSEgetLibType " ) ;
if ( PSE_getLibType = = NULL ) {
if ( strstr ( linkname , " gpu " ) ! = NULL ) type = PSE_LT_GPU ;
else if ( strstr ( linkname , " cdr " ) ! = NULL ) type = PSE_LT_CDR ;
2013-02-14 20:18:22 +01:00
# ifdef ENABLE_SIO1API
else if ( strstr ( linkname , " sio1 " ) ! = NULL ) type = PSE_LT_SIO1 ;
# endif
2012-11-18 19:15:59 +01:00
else if ( strstr ( linkname , " spu " ) ! = NULL ) type = PSE_LT_SPU ;
else if ( strstr ( linkname , " pad " ) ! = NULL ) type = PSE_LT_PAD ;
else { g_free ( linkname ) ; continue ; }
}
else type = PSE_getLibType ( ) ;
PSE_getLibName = ( PSEgetLibName ) dlsym ( Handle , " PSEgetLibName " ) ;
if ( PSE_getLibName ! = NULL ) {
sprintf ( name , " %s " , PSE_getLibName ( ) ) ;
PSE_getLibVersion = ( PSEgetLibVersion ) dlsym ( Handle , " PSEgetLibVersion " ) ;
if ( PSE_getLibVersion ! = 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 ) ;
2013-02-14 20:18:22 +01:00
# ifdef ENABLE_SIO1API
if ( type & PSE_LT_SIO1 )
ComboAddPlugin ( Sio1 ) ;
# endif
2012-11-18 19:15:59 +01:00
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 ) ;
}
}
g_free ( linkname ) ;
}
closedir ( dir ) ;
scan_bios_dir ( Config . BiosDir ) ;
// The BIOS list always contains the PCSXR internal BIOS
add_bios_to_list ( _ ( " Simulate PSX BIOS " ) , " HLE " ) ;
}
static void UpdatePluginsBIOS_UpdateGUI ( ) {
// Populate the plugin combo boxes
ConfCreatePConf ( " Gpu " , Gpu ) ;
ConfCreatePConf ( " Spu " , Spu ) ;
ConfCreatePConf ( " Pad1 " , Pad1 ) ;
ConfCreatePConf ( " Pad2 " , Pad2 ) ;
ConfCreatePConf ( " Cdr " , Cdr ) ;
2013-02-14 20:18:22 +01:00
# ifdef ENABLE_SIO1API
ConfCreatePConf ( " Sio1 " , Sio1 ) ;
# endif
2012-11-18 19:15:59 +01:00
ConfCreatePConf ( " Bios " , Bios ) ;
}
static void FindNetPlugin ( ) {
DIR * dir ;
struct dirent * ent ;
void * Handle ;
char plugin [ MAXPATHLEN ] , name [ MAXPATHLEN ] ;
NetConfS . plugins = 0 ;
2020-05-22 00:50:40 +02:00
NetConfS . glist = NULL ;
2012-11-18 19:15:59 +01:00
NetConfS . plugins + = 2 ;
strcpy ( NetConfS . plist [ NetConfS . plugins - 1 ] , " Disabled " ) ;
strcpy ( NetConfS . plist [ NetConfS . plugins - 2 ] , " Disabled " ) ;
NetConfS . glist = g_list_append ( NetConfS . glist , NetConfS . plist [ NetConfS . plugins - 1 ] ) ;
dir = opendir ( Config . PluginsDir ) ;
if ( dir = = NULL )
SysMessage ( _ ( " Could not open directory: '%s' \n " ) , Config . PluginsDir ) ;
else {
/* ADB TODO Replace the following with a function */
while ( ( ent = readdir ( dir ) ) ! = NULL ) {
long type , v ;
sprintf ( plugin , " %s/%s " , Config . PluginsDir , ent - > d_name ) ;
if ( strstr ( plugin , " .so " ) = = NULL & & strstr ( plugin , " .dylib " ) = = NULL )
continue ;
Handle = dlopen ( plugin , RTLD_NOW ) ;
if ( Handle = = NULL ) continue ;
PSE_getLibType = ( PSEgetLibType ) dlsym ( Handle , " PSEgetLibType " ) ;
if ( PSE_getLibType = = NULL ) {
if ( strstr ( plugin , " net " ) ! = NULL ) type = PSE_LT_NET ;
else continue ;
}
else type = PSE_getLibType ( ) ;
PSE_getLibName = ( PSEgetLibName ) dlsym ( Handle , " PSEgetLibName " ) ;
if ( PSE_getLibName ! = NULL ) {
sprintf ( name , " %s " , PSE_getLibName ( ) ) ;
PSE_getLibVersion = ( PSEgetLibVersion ) dlsym ( Handle , " PSEgetLibVersion " ) ;
if ( PSE_getLibVersion ! = 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_NET ) {
ComboAddPlugin ( Net ) ;
}
}
closedir ( dir ) ;
ConfCreatePConf ( " Net " , Net ) ;
}
}
GtkWidget * CpuDlg ;
2017-07-17 22:22:35 +02:00
GtkWidget * PgxpDlg ;
2012-11-18 19:15:59 +01:00
GList * psxglist ;
char * psxtypes [ ] = {
" NTSC " ,
" PAL "
} ;
// When the auto-detect CPU type is selected, disable the NTSC/PAL selection
static void OnCpu_PsxAutoClicked ( GtkWidget * widget , gpointer user_data ) {
GtkWidget * combo ;
2013-02-17 16:42:04 +01:00
combo = GTK_WIDGET ( gtk_builder_get_object ( builder , " GtkCombo_PsxType " ) ) ;
2012-11-18 19:15:59 +01:00
gtk_widget_set_sensitive ( combo ,
! ( gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( widget ) ) ) ) ;
}
2014-04-09 08:57:12 +02:00
// When the interpreter core is deselected, disable the debugger checkbox & rewind
2012-11-18 19:15:59 +01:00
static void OnCpu_CpuClicked ( GtkWidget * widget , gpointer user_data ) {
2014-04-09 08:57:12 +02:00
GtkWidget * check , * rew ;
2013-02-17 16:42:04 +01:00
check = GTK_WIDGET ( gtk_builder_get_object ( builder , " GtkCheckButton_Dbg " ) ) ;
2014-04-09 08:57:12 +02:00
rew = GTK_WIDGET ( gtk_builder_get_object ( builder , " frame_rew " ) ) ;
2012-11-18 19:15:59 +01:00
// Debugger is only working with interpreter not recompiler, so let's set it
2014-04-09 08:57:12 +02:00
if ( ! gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( widget ) ) ) {
2012-11-18 19:15:59 +01:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( check ) , FALSE ) ;
2014-04-09 08:57:12 +02:00
}
2012-11-18 19:15:59 +01:00
gtk_widget_set_sensitive ( check ,
gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( widget ) ) ) ;
2014-04-09 08:57:12 +02:00
gtk_widget_set_sensitive ( rew ,
gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( widget ) ) ) ;
2012-11-18 19:15:59 +01:00
}
2017-07-18 10:35:30 +02:00
// When overclock checkbutton is changed, enable/disable the selection spinbutton
static void OnCpu_OverClockClicked ( GtkWidget * widget , gpointer user_data ) {
GtkWidget * spin ;
spin = GTK_WIDGET ( gtk_builder_get_object ( builder , " GtkSpinButton_PsxClock " ) ) ;
gtk_widget_set_sensitive ( spin , gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( widget ) ) ) ;
}
2012-11-18 19:15:59 +01:00
void OnCpu_Clicked ( GtkDialog * dialog , gint arg1 , gpointer user_data ) {
GtkWidget * widget ;
2014-04-09 08:57:12 +02:00
long unsigned int tmp ;
2012-11-18 19:15:59 +01:00
long t ;
2013-02-17 16:42:04 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " GtkCombo_PsxType " ) ) ;
2012-11-18 19:15:59 +01:00
// If nothing chosen, default to NTSC
tmp = gtk_combo_box_get_active ( GTK_COMBO_BOX ( widget ) ) ;
2020-05-22 00:50:40 +02:00
if ( tmp = = - 1 )
2012-11-18 19:15:59 +01:00
tmp = PSX_TYPE_NTSC ;
if ( ! strcmp ( " NTSC " , psxtypes [ tmp ] ) )
Config . PsxType = PSX_TYPE_NTSC ;
else
Config . PsxType = PSX_TYPE_PAL ;
2014-02-04 11:15:07 +01:00
sscanf ( gtk_entry_get_text ( GTK_ENTRY ( gtk_builder_get_object ( builder , " GtkEntry_RewindCount " ) ) ) , " %lu " , & tmp ) ;
Config . RewindCount = tmp ;
sscanf ( gtk_entry_get_text ( GTK_ENTRY ( gtk_builder_get_object ( builder , " GtkEntry_RewindInterval " ) ) ) , " %lu " , & tmp ) ;
Config . RewindInterval = tmp ;
2016-03-30 16:07:35 +02:00
sscanf ( gtk_entry_get_text ( GTK_ENTRY ( gtk_builder_get_object ( builder , " GtkEntry_AltSpeed1 " ) ) ) , " %lu " , & tmp ) ;
Config . AltSpeed1 = tmp ;
sscanf ( gtk_entry_get_text ( GTK_ENTRY ( gtk_builder_get_object ( builder , " GtkEntry_AltSpeed2 " ) ) ) , " %lu " , & tmp ) ;
Config . AltSpeed2 = tmp ;
2012-11-18 19:15:59 +01:00
Config . Xa = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_Xa " ) ) ) ;
2013-02-14 20:18:22 +01:00
Config . SioIrq = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_SioIrq " ) ) ) ;
2012-11-18 19:15:59 +01:00
Config . Mdec = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_Mdec " ) ) ) ;
2014-04-16 20:04:29 +02:00
Config . Cdda = gtk_combo_box_get_active ( GTK_COMBO_BOX ( gtk_builder_get_object ( builder , " GtkCombo_CDDA " ) ) ) ;
2012-11-18 19:15:59 +01:00
Config . SlowBoot = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_SlowBoot " ) ) ) ;
Config . PsxAuto = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_PsxAuto " ) ) ) ;
2020-05-22 00:50:40 +02:00
Config . GdbServer = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_GdbServer " ) ) ) ;
2012-11-18 19:15:59 +01:00
t = Config . Debug ;
Config . Debug = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_Dbg " ) ) ) ;
if ( t ! = Config . Debug ) {
if ( Config . Debug ) StartDebugger ( ) ;
else StopDebugger ( ) ;
}
2020-05-23 01:06:07 +02:00
if ( Config . GdbServer ) {
GdbStartServer ( ) ;
}
2012-11-18 19:15:59 +01:00
t = Config . Cpu ;
Config . Cpu = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_Cpu " ) ) ) ;
if ( t ! = Config . Cpu ) {
psxCpu - > Shutdown ( ) ;
# ifdef PSXREC
if ( Config . Cpu = = CPU_INTERPRETER ) {
psxCpu = & psxInt ;
}
else psxCpu = & psxRec ;
# else
psxCpu = & psxInt ;
# endif
if ( psxCpu - > Init ( ) = = - 1 ) {
SysClose ( ) ;
exit ( 1 ) ;
}
2017-07-18 10:35:30 +02:00
psxCpu - > SetPGXPMode ( Config . PGXP_Mode ) ;
2012-11-18 19:15:59 +01:00
psxCpu - > Reset ( ) ;
}
Config . PsxOut = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_PsxOut " ) ) ) ;
Config . SpuIrq = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_SpuIrq " ) ) ) ;
Config . RCntFix = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_RCntFix " ) ) ) ;
2013-11-28 15:31:39 +01:00
Config . VSyncWA = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_VSyncWA " ) ) ) ;
2013-11-28 12:34:19 +01:00
Config . NoMemcard = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_NoMemcard " ) ) ) ;
2012-11-18 19:15:59 +01:00
Config . Widescreen = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_Widescreen " ) ) ) ;
2014-07-24 06:06:57 +02:00
Config . HackFix = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_HackFix " ) ) ) ;
2016-03-31 22:27:13 +02:00
2017-07-18 10:35:30 +02:00
Config . OverClock = gtk_toggle_button_get_active (
GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_OverClock " ) ) ) ;
Config . PsxClock = gtk_spin_button_get_value (
GTK_SPIN_BUTTON ( gtk_builder_get_object ( builder , " GtkSpinButton_PsxClock " ) ) ) ;
Config . MemHack = gtk_toggle_button_get_active (
GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_MemHack " ) ) ) ;
SaveConfig ( ) ;
2012-11-18 19:15:59 +01:00
gtk_widget_destroy ( CpuDlg ) ;
CpuDlg = NULL ;
}
void OnConf_Cpu ( ) {
2014-02-04 11:15:07 +01:00
GtkWidget * widget ;
char buf [ 25 ] ;
2012-11-18 19:15:59 +01:00
builder = gtk_builder_new ( ) ;
2020-05-22 00:50:40 +02:00
2017-07-17 15:43:15 +02:00
if ( ! gtk_builder_add_from_resource ( builder , " /org/pcsxr/gui/pcsxr.ui " , NULL ) ) {
2012-11-18 19:15:59 +01:00
g_warning ( " Error: interface could not be loaded! " ) ;
return ;
}
2013-02-17 16:42:04 +01:00
CpuDlg = GTK_WIDGET ( gtk_builder_get_object ( builder , " CpuDlg " ) ) ;
2012-11-18 19:15:59 +01:00
gtk_widget_show ( CpuDlg ) ;
2014-02-04 11:15:07 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " GtkCombo_PsxType " ) ) ;
gtk_combo_box_set_active ( GTK_COMBO_BOX ( widget ) , Config . PsxType ) ;
gtk_widget_set_sensitive ( GTK_WIDGET ( widget ) , ! Config . PsxAuto ) ;
2014-04-09 08:57:12 +02:00
snprintf ( buf , sizeof ( buf ) , " %u " , Config . RewindCount ) ;
2014-02-04 11:15:07 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " GtkEntry_RewindCount " ) ) ;
gtk_entry_set_text ( GTK_ENTRY ( widget ) , buf ) ;
2014-04-09 08:57:12 +02:00
snprintf ( buf , sizeof ( buf ) , " %u " , Config . RewindInterval ) ;
2014-02-04 11:15:07 +01:00
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " GtkEntry_RewindInterval " ) ) ;
gtk_entry_set_text ( GTK_ENTRY ( widget ) , buf ) ;
2012-11-18 19:15:59 +01:00
2014-04-09 08:57:12 +02:00
// Calculate estimated memory usage
snprintf ( buf , sizeof ( buf ) , " %u " , ( ( unsigned int ) ( ( ( float ) Config . RewindCount ) * 4.2f ) ) ) ;
gtk_entry_set_text ( GTK_ENTRY ( gtk_builder_get_object ( builder , " GtkEntry_RewindMem " ) ) ,
buf ) ;
// Enabled only if interpreter
gtk_widget_set_sensitive ( GTK_WIDGET ( gtk_builder_get_object ( builder , " frame_rew " ) ) , Config . Cpu ) ;
2016-03-30 16:07:35 +02:00
snprintf ( buf , sizeof ( buf ) , " %u " , Config . AltSpeed1 ) ;
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " GtkEntry_AltSpeed1 " ) ) ;
gtk_entry_set_text ( GTK_ENTRY ( widget ) , buf ) ;
snprintf ( buf , sizeof ( buf ) , " %u " , Config . AltSpeed2 ) ;
widget = GTK_WIDGET ( gtk_builder_get_object ( builder , " GtkEntry_AltSpeed2 " ) ) ;
gtk_entry_set_text ( GTK_ENTRY ( widget ) , buf ) ;
2012-11-18 19:15:59 +01:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_Xa " ) ) , Config . Xa ) ;
2013-02-14 20:18:22 +01:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_SioIrq " ) ) , Config . SioIrq ) ;
2012-11-18 19:15:59 +01:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_Mdec " ) ) , Config . Mdec ) ;
2014-04-16 20:04:29 +02:00
gtk_combo_box_set_active ( GTK_COMBO_BOX ( gtk_builder_get_object ( builder , " GtkCombo_CDDA " ) ) , Config . Cdda ) ;
2012-11-18 19:15:59 +01:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_SlowBoot " ) ) , Config . SlowBoot ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_PsxAuto " ) ) , Config . PsxAuto ) ;
2012-11-20 22:01:10 +01:00
g_signal_connect_data ( G_OBJECT ( gtk_builder_get_object ( builder , " GtkCheckButton_PsxAuto " ) ) , " toggled " ,
2012-11-18 19:15:59 +01:00
G_CALLBACK ( OnCpu_PsxAutoClicked ) , builder , NULL , G_CONNECT_AFTER ) ;
# ifdef PSXREC
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_Cpu " ) ) , Config . Cpu ) ;
2012-11-20 22:01:10 +01:00
g_signal_connect_data ( G_OBJECT ( gtk_builder_get_object ( builder , " GtkCheckButton_Cpu " ) ) , " toggled " ,
2012-11-18 19:15:59 +01:00
G_CALLBACK ( OnCpu_CpuClicked ) , builder , NULL , G_CONNECT_AFTER ) ;
# else
Config . Cpu = CPU_INTERPRETER ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_Cpu " ) ) , TRUE ) ;
gtk_widget_set_sensitive ( GTK_WIDGET ( gtk_builder_get_object ( builder , " GtkCheckButton_Cpu " ) ) , FALSE ) ;
# endif
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_Dbg " ) ) , Config . Cpu & & Config . Debug ) ;
gtk_widget_set_sensitive ( GTK_WIDGET ( gtk_builder_get_object ( builder , " GtkCheckButton_Dbg " ) ) , Config . Cpu ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_PsxOut " ) ) , Config . PsxOut ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_SpuIrq " ) ) , Config . SpuIrq ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_RCntFix " ) ) , Config . RCntFix ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_VSyncWA " ) ) , Config . VSyncWA ) ;
2013-11-28 12:34:19 +01:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_NoMemcard " ) ) , Config . NoMemcard ) ;
2012-11-18 19:15:59 +01:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_Widescreen " ) ) , Config . Widescreen ) ;
2014-07-24 06:06:57 +02:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( gtk_builder_get_object ( builder , " GtkCheckButton_HackFix " ) ) , Config . HackFix ) ;
2012-11-18 19:15:59 +01:00
2017-07-18 10:35:30 +02:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON (
gtk_builder_get_object ( builder , " GtkCheckButton_OverClock " ) ) , Config . OverClock ) ;
gtk_spin_button_set_value ( GTK_SPIN_BUTTON (
gtk_builder_get_object ( builder , " GtkSpinButton_PsxClock " ) ) , Config . PsxClock ) ;
OnCpu_OverClockClicked ( GTK_WIDGET (
gtk_builder_get_object ( builder , " GtkCheckButton_OverClock " ) ) , NULL ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON (
gtk_builder_get_object ( builder , " GtkCheckButton_MemHack " ) ) , Config . MemHack ) ;
g_signal_connect_data ( G_OBJECT ( gtk_builder_get_object ( builder , " GtkCheckButton_OverClock " ) ) , " toggled " ,
G_CALLBACK ( OnCpu_OverClockClicked ) , builder , NULL , G_CONNECT_AFTER ) ;
2012-11-18 19:15:59 +01:00
// Setup a handler for when Close or Cancel is clicked
2012-11-20 22:01:10 +01:00
g_signal_connect_data ( G_OBJECT ( CpuDlg ) , " response " ,
2017-07-18 10:35:30 +02:00
G_CALLBACK ( OnCpu_Clicked ) , builder , ( GClosureNotify ) g_object_unref , G_CONNECT_AFTER ) ;
2012-11-18 19:15:59 +01:00
}
2017-07-10 15:14:43 +02:00
2017-07-18 10:35:30 +02:00
//When a different PGXP mode is selected, display some informational text
2017-07-17 22:22:35 +02:00
static void OnPgxp_ModeChanged ( GtkWidget * widget , gpointer user_data ) {
uint8_t mode ;
mode = gtk_combo_box_get_active ( GTK_COMBO_BOX (
gtk_builder_get_object ( builder , " PGXP_Mode " ) ) ) ;
switch ( mode ) {
case 0 :
gtk_label_set_text ( GTK_LABEL ( gtk_builder_get_object ( builder , " PGXP_Mode_title " ) ) ,
_ ( " Disabled " ) ) ;
gtk_label_set_text ( GTK_LABEL ( gtk_builder_get_object ( builder , " PGXP_Mode_description " ) ) ,
_ ( " PGXP is not mirroring any functions currently. " ) ) ;
break ;
case 1 :
gtk_label_set_text ( GTK_LABEL ( gtk_builder_get_object ( builder , " PGXP_Mode_title " ) ) ,
_ ( " Memory operations only " ) ) ;
gtk_label_set_text ( GTK_LABEL ( gtk_builder_get_object ( builder , " PGXP_Mode_description " ) ) ,
_ ( " PGXP is mirroring load, store and processor transfer operations of the CPU and GTE. " ) ) ;
break ;
case 2 :
gtk_label_set_text ( GTK_LABEL ( gtk_builder_get_object ( builder , " PGXP_Mode_title " ) ) ,
_ ( " Memory and CPU arithmetic operations " ) ) ;
gtk_label_set_text ( GTK_LABEL ( gtk_builder_get_object ( builder , " PGXP_Mode_description " ) ) ,
_ ( " PGXP is mirroring load, store and transfer operations of the CPU and GTE and arithmetic/logic functions of the PSX CPU. \n (WARNING: This mode is currently unfinished and may cause incorrect behaviour in some games). " ) ) ;
break ;
default :
gtk_label_set_text ( GTK_LABEL ( gtk_builder_get_object ( builder , " PGXP_Mode_title " ) ) ,
_ ( " Error " ) ) ;
gtk_label_set_text ( GTK_LABEL ( gtk_builder_get_object ( builder , " PGXP_Mode_description " ) ) ,
_ ( " Unknown mode. " ) ) ;
}
}
static void OnPgxp_Clicked ( GtkDialog * dialog , gint arg1 , gpointer user_data ) {
Config . PGXP_GTE = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON (
gtk_builder_get_object ( builder , " PGXP_GTE " ) ) ) ;
Config . PGXP_Cache = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON (
gtk_builder_get_object ( builder , " PGXP_Cache " ) ) ) ;
Config . PGXP_Texture = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON (
gtk_builder_get_object ( builder , " PGXP_Texture " ) ) ) ;
Config . PGXP_Mode = gtk_combo_box_get_active ( GTK_COMBO_BOX (
gtk_builder_get_object ( builder , " PGXP_Mode " ) ) ) ;
EmuSetPGXPMode ( Config . PGXP_Mode ) ;
SaveConfig ( ) ;
gtk_widget_destroy ( PgxpDlg ) ;
PgxpDlg = NULL ;
}
2017-07-10 15:14:43 +02:00
void OnConf_Pgxp ( ) {
2017-07-17 22:22:35 +02:00
GtkWidget * widget ;
char buf [ 25 ] ;
builder = gtk_builder_new ( ) ;
if ( ! gtk_builder_add_from_resource ( builder , " /org/pcsxr/gui/pcsxr.ui " , NULL ) ) {
g_warning ( " Error: interface could not be loaded! " ) ;
return ;
}
PgxpDlg = GTK_WIDGET ( gtk_builder_get_object ( builder , " PgxpDlg " ) ) ;
gtk_widget_show ( PgxpDlg ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON (
gtk_builder_get_object ( builder , " PGXP_GTE " ) ) , Config . PGXP_GTE ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON (
gtk_builder_get_object ( builder , " PGXP_Cache " ) ) , Config . PGXP_Cache ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON (
gtk_builder_get_object ( builder , " PGXP_Texture " ) ) , Config . PGXP_Texture ) ;
gtk_combo_box_set_active ( GTK_COMBO_BOX (
gtk_builder_get_object ( builder , " PGXP_Mode " ) ) , Config . PGXP_Mode ) ;
OnPgxp_ModeChanged ( NULL , NULL ) ;
g_signal_connect_data ( G_OBJECT ( gtk_builder_get_object ( builder , " PGXP_Mode " ) ) , " changed " ,
G_CALLBACK ( OnPgxp_ModeChanged ) , builder , NULL , G_CONNECT_AFTER ) ;
g_signal_connect_data ( G_OBJECT ( PgxpDlg ) , " response " ,
G_CALLBACK ( OnPgxp_Clicked ) , builder , ( GClosureNotify ) g_object_unref , G_CONNECT_AFTER ) ;
2017-07-10 15:14:43 +02:00
}