diff options
| author | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2009-04-16 06:22:51 +0000 |
|---|---|---|
| committer | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2009-04-16 06:22:51 +0000 |
| commit | 8139fbf8204882663446bcb06f68789353597820 (patch) | |
| tree | 6ea1f39932b33faee84d603e956470e37f135804 /plugins/dfcdrom/callbacks.c | |
| download | pcsxr-8139fbf8204882663446bcb06f68789353597820.tar.gz | |
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@23061 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'plugins/dfcdrom/callbacks.c')
| -rw-r--r-- | plugins/dfcdrom/callbacks.c | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/plugins/dfcdrom/callbacks.c b/plugins/dfcdrom/callbacks.c new file mode 100644 index 00000000..09f72f63 --- /dev/null +++ b/plugins/dfcdrom/callbacks.c @@ -0,0 +1,210 @@ +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#ifdef __linux__ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <fcntl.h> +#include <sys/stat.h> +#include <sys/ioctl.h> +#include <linux/cdrom.h> + +#include <gtk/gtk.h> + +#include "cdr.h" +#include "callbacks.h" +#include "interface.h" +#include "support.h" + +/* list of drives */ +GList * driveslist = NULL; + +/* private functions prototypes */ +void fill_drives_list(void); +int is_cdrom(char *device); + + +/*************************************************************************** + * Config Dialog. + ***************************************************************************/ + +void on_cfg_dialog_show (GtkWidget *widget, gpointer user_data) +{ + GtkWidget *devcombo; + GtkWidget *rmmenu; + GtkWidget *subQbtn; + GtkWidget *spinC; + GtkWidget *spinS; + + LoadConf(); + fill_drives_list(); + + devcombo = lookup_widget (GTK_WIDGET (widget), "cddev_combo"); + rmmenu = lookup_widget (GTK_WIDGET (widget), "readmode_optionmenu"); + subQbtn = lookup_widget (GTK_WIDGET (widget), "subQ_button"); + spinC = lookup_widget (GTK_WIDGET (widget), "spinCacheSize"); + spinS = lookup_widget (GTK_WIDGET (widget), "spinCdrSpeed"); + + /* show values */ + gtk_combo_set_popdown_strings (GTK_COMBO (devcombo), driveslist); + gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (devcombo)->entry), CdromDev); + gtk_option_menu_set_history (GTK_OPTION_MENU (rmmenu), ReadMode); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (subQbtn), UseSubQ); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(spinC), (float)CacheSize); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(spinS), (float)CdrSpeed); + + /* ??? is correct to free? it's a global... */ + g_list_free(driveslist); +} + + +void on_cfg_cancelbutton_clicked (GtkButton *button, gpointer user_data) +{ + gtk_widget_destroy (gtk_widget_get_toplevel (GTK_WIDGET (button))); + gtk_main_quit(); +} + + +void on_cfg_okbutton_clicked (GtkButton *button, gpointer user_data) +{ + GtkWidget *deventry; + GtkWidget *rmmenu; + GtkWidget *subQbtn; + GtkWidget *spinC; + GtkWidget *spinS; + char *tmp; + + deventry = lookup_widget (GTK_WIDGET (button), "cddev_entry"); + rmmenu = lookup_widget (GTK_WIDGET (button), "readmode_optionmenu"); + subQbtn = lookup_widget (GTK_WIDGET (button), "subQ_button"); + spinC = lookup_widget (GTK_WIDGET (button), "spinCacheSize"); + spinS = lookup_widget (GTK_WIDGET (button), "spinCdrSpeed"); + + tmp = gtk_entry_get_text (GTK_ENTRY (deventry)); + strcpy(CdromDev, tmp); + ReadMode = gtk_option_menu_get_history (GTK_OPTION_MENU(rmmenu)); + UseSubQ = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(subQbtn)); + CacheSize= gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(spinC)); + CdrSpeed = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(spinS)); + + SaveConf(); + + gtk_widget_destroy(gtk_widget_get_toplevel (GTK_WIDGET (button))); + gtk_main_quit(); +} + + +/*************************************************************************** + * About Dialog. + ***************************************************************************/ + +void on_abt_okbutton_clicked (GtkButton *button, gpointer user_data) +{ + gtk_widget_destroy (gtk_widget_get_toplevel (GTK_WIDGET (button))); + gtk_main_quit(); +} + + +/*************************************************************************** + * Private functions. + ***************************************************************************/ + +/* + * get_drives_list: retrieves available cd drives. At the moment it use a quite + * ugly "brute force" method: we check for the most common location for cdrom + * in /dev and chech if they are cdrom devices. + * If your cdrom path is not listed here you'll have to type it in the dialog + * entry yourself (or add it here and recompile). + * Are there any other common entry to add to the list? (especially scsi, I + * deliberately ignored old non standard cdroms... ) + * If you come up with a better method let me know!! + */ + +void fill_drives_list(void) +{ + int i = 0; + static char *cdrom_devices[]={ + "/dev/cdrom", + "/dev/cdroms/cdrom0", + "/dev/cdroms/cdrom1", + "/dev/cdroms/cdrom2", + "/dev/cdroms/cdrom3", + "/dev/hda", + "/dev/hdb", + "/dev/hdc", + "/dev/hdd", + "/dev/scd0", + "/dev/scd1", + "/dev/scd2", + "/dev/scd3", + "/dev/optcd", + NULL}; + + /* fisrt we put our current drive */ + driveslist = g_list_append(driveslist, CdromDev); + + /* scan cdrom_devices for real cdrom and add them to driveslist */ + while(cdrom_devices[i] != NULL){ + + /* check that is not our current dev (already in list) */ + if (strcmp(cdrom_devices[i], CdromDev) != 0){ + + /* check that is a cdrom device */ + if (is_cdrom(cdrom_devices[i])){ + driveslist = g_list_append(driveslist, cdrom_devices[i]); + } + } + ++i; + } + + return; +} + + +/* function to check if the device is a cdrom */ +int is_cdrom(char *device){ + struct stat st; + int fd = -1; + + /* check if the file exist */ + if (stat(device, &st) <0) return 0; + + /* check if is a block or char device */ + if (!S_ISCHR(st.st_mode) && !S_ISBLK(st.st_mode)) return 0; + + /* try to open the device file descriptor */ + if ((fd = open(device, O_RDONLY | O_NONBLOCK)) < 0) return 0; + + /* I need a method to check is a device is really a cdrom. + some problems/ideas are: + - different protocls (ide, scsi, old proprietary...) + - maybe we can use major number (see linux/major.h) to do some check. + major number can be retrieved with (st.st_rdev>>8) + scsi has SCSI_CDROM_MAJOR but does this cover all scsi drives? + beside IDE major is the same for hard disks and cdroms... + and DVDs? + - another idea is to parse /proc, but again IDE, scsi etc have + different files... I've not found a way to query "which cd drives + are available?" + + Now I use this ioctl which works also if the drive is empty, + I hope that is implemented for all the drives... here works + fine: at least doesn't let me to select my HD as cds ;) + */ + /* try a ioctl to see if it's a cdrom device */ + if (ioctl(fd, CDROM_GET_CAPABILITY, NULL) < 0){ + close(fd); + return 0; + } + + close(fd); + + /* yes, it seems a cd drive! */ + return 1; +} + +#endif |
