pkg://xcdroast-debuginfo-0.98a15-14.fc7.ppc.rpm:614443/
usr/
src/
debug/
xcdroast-0.98alpha15/
src/duplicate.c
info downloads
/*
duplicate.c
Duplicate CD functions
15.5.99 tn
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include "largefile.h"
#if HAVE_LOCALE_H
#include <locale.h>
#else
# define setlocale(Category, Locale)
#endif
#include "gettext.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#if ENABLE_NLS
# define _(String) gettext (String)
# define N_(String) gettext_noop (String)
#else
# define _(String) (String)
# define N_(String) (String)
#endif
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include "xcdrdata.h"
#include "xcdroast.h"
#include "main.h"
#include "../xpms/minidata.xpm"
#include "../xpms/miniaudio.xpm"
#include "../xpms/mininodata.xpm"
#include "../xpms/mininoaudio.xpm"
#include "../xpms/minitoc.xpm"
#include "../xpms/disc_eject.xpm"
#include "../xpms/disc_load.xpm"
extern GtkWidget *toplevel;
extern GtkWidget *sidespace;
extern GtkWidget *workspace;
extern GList *imagelist;
extern writerreader_devices_t **writerreaderdevs;
extern track_read_set_t trackreadset;
extern GList *tocfiles;
extern setup_data_t setupdata;
extern current_set_t curset;
extern cd_info_t cdinfo;
extern track_info_t **trackinfo;
extern gint wav_in;
extern GtkWidget *wav_quit_button;
extern gint wavplay_quit;
extern gint submenu;
GtkWidget *actionspace;
GtkCList *cdlist, *imglist, *play_clist;
GtkWidget *cdlist_l1, *cdlist_l2, *cdlist_l3, *cdlist_l4;
GtkWidget *vrylist_l1, *vrylist_l2, *vrylist_l3, *vrylist_l4;
GtkWidget *imglist_l1, *imglist_l2, *imglist_l3;
GtkWidget *crea_cd_mode_omenu, *crea_cd_burnfree_check;
guint side_handlers2[8];
GtkWidget *side_widgets2[8];
static GtkWidget *write_toc_menu;
static GtkWidget *edit_cdtext_btn;
static GtkWidget *dupl_cd_mode_omenu, *dupl_cd_burnfree_check;
static GtkWidget *rdr_spd_spin, *cdr_spd_spin;
/* some stuff for the select-functions of the sidebar buttons */
static guint side_handlers[7];
static GtkWidget *side_widgets[7];
static GtkWidget *locked_button;
extern void fill_read_tracks(gint dontupdatecd);
extern void fill_verify_tracks(gint dontupdateimglist);
extern void fill_write_tracks();
extern void fill_master_write_menu();
extern void reset_duplicate_buttons2(GtkWidget *exclude, gint fromunlock);
static void reset_duplicate_buttons(GtkWidget *exclude);
static void fill_read_menu();
static void fill_verify_menu();
static void fill_write_menu();
static void fill_delete_menu();
static void tocwrite_selected(GtkWidget *item, gpointer val);
void set_image_prefix_callback(GtkWidget *widget, gpointer data);
/* lock complete sidebar when doing stuff that takes a while (e.g. reload) */
void do_lock(gint plusgrab) {
int i;
if (submenu == 1) {
/* lock all and save currently selected button */
for (i = 0; i < 7; i++) {
gtk_signal_handler_block(GTK_OBJECT(side_widgets[i]),
side_handlers[i]);
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
side_widgets[i])) == 1) {
locked_button = side_widgets[i];
}
}
}
if (submenu == 2) {
/* lock all and save currently selected button */
for (i = 0; i < 8; i++) {
gtk_signal_handler_block(GTK_OBJECT(side_widgets2[i]),
side_handlers2[i]);
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
side_widgets2[i])) == 1) {
locked_button = side_widgets2[i];
}
}
}
/* grab the button, so everything else is not active */
if (plusgrab) {
gtk_grab_add(locked_button);
}
}
/* free the lock after we are done */
void do_unlock(gint plusgrab) {
int i;
if (plusgrab) {
gtk_grab_remove(locked_button);
}
if (submenu == 1) {
for (i = 0; i < 7; i++) {
gtk_signal_handler_unblock(GTK_OBJECT(side_widgets[i]),
side_handlers[i]);
}
reset_duplicate_buttons(locked_button);
}
if (submenu == 2) {
for (i = 0; i < 8; i++) {
gtk_signal_handler_unblock(GTK_OBJECT(side_widgets2[i]),
side_handlers2[i]);
}
reset_duplicate_buttons2(locked_button, 1);
}
}
/* fill the cd-info-list with data */
void fill_cdlist() {
GtkStyle *style;
gchar *data[2];
GdkPixmap *pixmap1, *pixmap2;
GdkBitmap *mask1, *mask2;
gint i, lcount;
gchar tmp[MAXLINE];
gchar tmp2[MAXLINE];
/* clean up first */
gtk_clist_clear(cdlist);
/* cd loaded? */
if (cdinfo.nr_tracks == -1) {
gtk_entry_set_text(GTK_ENTRY(cdlist_l1), _("No CD loaded"));
gtk_entry_set_text(GTK_ENTRY(cdlist_l2),"");
gtk_entry_set_text(GTK_ENTRY(cdlist_l3),"");
return;
}
if (cdinfo.nr_tracks == -2) {
gtk_entry_set_text(GTK_ENTRY(cdlist_l1), return_media_type(curset.reader_devnr));
gtk_entry_set_text(GTK_ENTRY(cdlist_l2),"");
gtk_entry_set_text(GTK_ENTRY(cdlist_l3),"");
return;
}
style = gtk_style_copy(gtk_widget_get_style(GTK_WIDGET(cdlist)));
pixmap1 = gdk_pixmap_create_from_xpm_d(cdlist->clist_window,
&mask1, &style->bg[GTK_STATE_NORMAL],(gchar **)minidata_xpm);
pixmap2 = gdk_pixmap_create_from_xpm_d(cdlist->clist_window,
&mask2, &style->bg[GTK_STATE_NORMAL],(gchar **)miniaudio_xpm);
data[0] = NULL;
lcount = 0;
for (i = 0; i < cdinfo.nr_tracks; i++) {
if (trackinfo[i]->type == 0) {
convert_frames2mbstring(trackinfo[i]->size,tmp2);
g_snprintf(tmp,MAXLINE,"%2d. %s [%s]",
trackinfo[i]->track_nr,
_("data track"), tmp2);
data[1] = convert_for_gtk2(tmp);
gtk_clist_append(cdlist,data);
gtk_clist_set_pixmap(cdlist,lcount,0,pixmap1,mask1);
lcount++;
} else {
convert_frames2minstring(trackinfo[i]->size,tmp2);
g_snprintf(tmp,MAXLINE,"%2d. %s [%s]",
trackinfo[i]->track_nr,
_("audio track"), tmp2);
data[1] = convert_for_gtk2(tmp);
gtk_clist_append(cdlist,data);
gtk_clist_set_pixmap(cdlist,lcount,0,pixmap2,mask2);
lcount++;
}
/* we have cd-text for this track? */
if (setupdata.option_displaycdtext) {
if (trackinfo[i]->title != NULL &&
trackinfo[i]->title[0] != '\0' ) {
g_snprintf(tmp,MAXLINE," CD-Text: %s",
trackinfo[i]->title);
data[1] = convert_for_gtk2(tmp);
gtk_clist_append(cdlist,data);
set_clist_row_font(cdlist,lcount, SLANTFONT);
lcount++;
}
}
/* have we a cddb-title for this track? */
if (trackinfo[i]->cddb_ttitle != NULL) {
g_snprintf(tmp,MAXLINE," CDDB: %s",
trackinfo[i]->cddb_ttitle);
data[1] = convert_for_gtk2(tmp);
gtk_clist_append(cdlist,data);
set_clist_row_font(cdlist,lcount, SLANTFONT);
lcount++;
} else
if (trackinfo[i]->volname != NULL) {
convert_kbytes2mbstring(trackinfo[i]->isosize*2,tmp2);
g_snprintf(tmp,MAXLINE," ISO9660: %s [%s]",
trackinfo[i]->volname,tmp2);
data[1] = convert_for_gtk2(tmp);
gtk_clist_append(cdlist,data);
set_clist_row_font(cdlist,lcount, SLANTFONT);
lcount++;
}
}
/* get cd-type */
determine_cd_type(tmp,0);
gtk_entry_set_text(GTK_ENTRY(cdlist_l1), tmp);
/* cd-label */
if (cdinfo.title && cdinfo.artist &&
cdinfo.title[0] != '\0' && setupdata.option_displaycdtext) {
g_snprintf(tmp,MAXLINE,"%s / %s", cdinfo.title, cdinfo.artist);
gtk_entry_set_text(GTK_ENTRY(cdlist_l2), tmp);
gtk_entry_set_position(GTK_ENTRY(cdlist_l2),0);
} else
if (cdinfo.cddb_dtitle != NULL) {
gtk_entry_set_text(GTK_ENTRY(cdlist_l2), cdinfo.cddb_dtitle);
gtk_entry_set_position(GTK_ENTRY(cdlist_l2),0);
} else {
gtk_entry_set_text(GTK_ENTRY(cdlist_l2),"");
}
/* cd-size */
convert_frames2mbminstring(cdinfo.total_size, tmp);
gtk_entry_set_text(GTK_ENTRY(cdlist_l3), tmp);
}
/* fill the image-info-list with data */
void fill_imglist() {
GtkStyle *style;
gchar *data[2];
GdkPixmap *pixmap1, *pixmap2, *pixmap3, *pixmap4, *pixmap5;
GdkBitmap *mask1, *mask2, *mask3, *mask4, *mask5;
gchar tmp[MAXLINE];
gchar tmp2[MAXLINE];
gchar basename[MAXLINE], oldbase[MAXLINE], fname[MAXLINE], *p;
GList *loop;
image_files_t *entry;
gint lcount, count;
gint sizecount;
/* clean up first */
gtk_clist_clear(imglist);
style = gtk_style_copy(gtk_widget_get_style(GTK_WIDGET(imglist)));
pixmap1 = gdk_pixmap_create_from_xpm_d(imglist->clist_window,
&mask1, &style->bg[GTK_STATE_NORMAL],(gchar **)minidata_xpm);
pixmap2 = gdk_pixmap_create_from_xpm_d(imglist->clist_window,
&mask2, &style->bg[GTK_STATE_NORMAL],(gchar **)miniaudio_xpm);
pixmap3 = gdk_pixmap_create_from_xpm_d(imglist->clist_window,
&mask3, &style->bg[GTK_STATE_NORMAL],(gchar **)mininodata_xpm);
pixmap4 = gdk_pixmap_create_from_xpm_d(imglist->clist_window,
&mask4, &style->bg[GTK_STATE_NORMAL],(gchar **)mininoaudio_xpm);
pixmap5 = gdk_pixmap_create_from_xpm_d(imglist->clist_window,
&mask5, &style->bg[GTK_STATE_NORMAL],(gchar **)minitoc_xpm);
data[0] = NULL;
strcpy(oldbase,"");
lcount = 0;
count = 1;
sizecount = 0;
loop = g_list_first(imagelist);
while (loop) {
entry = loop->data;
/* get the base-dirname */
strncpy(basename,entry->path,MAXLINE);
p = rindex(basename,'/');
*p = '\0';
if (strcmp(basename,"") == 0) {
strcpy(basename,"/");
}
strcpy(fname,p+1);
/* new path found? */
if (strcmp(basename,oldbase) != 0) {
g_snprintf(tmp,MAXLINE,"%s: %s",_("Path"), basename);
data[1] = convert_for_gtk2(tmp);
gtk_clist_append(imglist,data);
set_clist_row_font(imglist,lcount, BOLDFONT);
lcount++;
strcpy(oldbase,basename);
}
/* iso9600-track/ unknown */
if (entry->type == 0 || entry->type == 3) {
convert_frames2mbstring((gint)((off_t)entry->size/DATASECTORSIZE),
tmp2);
g_snprintf(tmp,MAXLINE,"%2d. %s [%s]",
count, fname, tmp2);
data[1] = convert_for_gtk2(tmp);
gtk_clist_append(imglist,data);
if (entry->readable == 1 && entry->type == 0) {
gtk_clist_set_pixmap(imglist,lcount,0,pixmap1,mask1);
} else {
gtk_clist_set_pixmap(imglist,lcount,0,pixmap3,mask3);
}
lcount++;
sizecount+=(gint)((off_t)entry->size >> 10);
count++;
}
/* valid/invalid wav-file */
if (entry->type == 1 || entry->type == 2) {
convert_frames2minstring((gint)((off_t)entry->size/CDDAFRAME), tmp2);
g_snprintf(tmp,MAXLINE,"%2d. %s [%s]",
count, fname, tmp2);
data[1] = convert_for_gtk2(tmp);
gtk_clist_append(imglist,data);
if (entry->readable == 1 && entry->type == 1) {
gtk_clist_set_pixmap(imglist,lcount,0,pixmap2,mask2);
} else {
gtk_clist_set_pixmap(imglist,lcount,0,pixmap4,mask4);
}
lcount++;
sizecount+=(gint)((off_t)entry->size >> 10);
count++;
}
/* toc-file */
if (entry->type == 4) {
g_snprintf(tmp,MAXLINE,"--. %s",fname);
data[1] = convert_for_gtk2(tmp);
gtk_clist_append(imglist,data);
gtk_clist_set_pixmap(imglist,lcount,0,pixmap5, mask5);
lcount++;
}
/* cd-text */
if (entry->title && entry->artist &&
strcmp(entry->title,"") && strcmp(entry->artist,"")) {
g_snprintf(tmp,MAXLINE," (%s / %s)",
entry->title, entry->artist);
data[1] = convert_for_gtk2(tmp);
gtk_clist_append(imglist,data);
set_clist_row_font(imglist,lcount, SLANTFONT);
lcount++;
} else
if (entry->title && strcmp(entry->title,"")) {
g_snprintf(tmp,MAXLINE," (%s)",
entry->title);
data[1] = convert_for_gtk2(tmp);
gtk_clist_append(imglist,data);
set_clist_row_font(imglist,lcount, SLANTFONT);
lcount++;
} else
if (entry->cddb_ttitle && strcmp(entry->cddb_ttitle,"")) {
g_snprintf(tmp,MAXLINE," (%s)",
entry->cddb_ttitle);
data[1] = convert_for_gtk2(tmp);
gtk_clist_append(imglist,data);
set_clist_row_font(imglist,lcount, SLANTFONT);
lcount++;
} else
if (entry->volname && strcmp(entry->volname,"")) {
if (entry->next_session_start > 0) {
g_snprintf(tmp,MAXLINE,
" (%s / ISO9660-multisession)",
entry->volname);
} else {
g_snprintf(tmp,MAXLINE," (%s / ISO9660)",
entry->volname);
}
data[1] = convert_for_gtk2(tmp);
gtk_clist_append(imglist,data);
set_clist_row_font(imglist,lcount, SLANTFONT);
lcount++;
} else
if (entry->type == 0 && entry->next_session_start > 0) {
strcpy(tmp," (ISO9660-multisession)");
data[1] = convert_for_gtk2(tmp);
gtk_clist_append(imglist,data);
set_clist_row_font(imglist,lcount, SLANTFONT);
lcount++;
}
loop = loop->next;
}
/* total size of files */
convert_kbytes2mbminstring(sizecount, tmp);
gtk_entry_set_text(GTK_ENTRY(imglist_l1), tmp);
}
/* callbacks for button in info-screen */
static void cddb_clicked(GtkWidget *widget, gpointer data) {
/* no cd loaded */
if (cdinfo.nr_tracks < 0) {
show_dialog(ICO_WARN,_("No CD loaded in read device"),T_OK,NULL,NULL,0);
return;
}
if (show_cddb_query(NULL, 0) == 0) {
/* new data received - update display */
fill_cdlist();
}
}
void edit_cdtext_clicked(GtkWidget *widget, gpointer data) {
gint mode;
mode = GPOINTER_TO_INT(data);
if (mode == 0)
show_edit_cdtext(mode, NULL);
else if (mode == 1) {
if (strcmp(curset.tocfile,"-") == 0) {
/* on-the-fly setting? */
show_edit_cdtext(3, write_toc_menu);
} else {
show_edit_cdtext(1, write_toc_menu);
}
}
else if (mode == 2)
show_edit_cdtext(mode, NULL);
}
static void update_clicked(GtkWidget *widget, gpointer data) {
GdkCursor *cursor;
do_lock(1);
/* change cursor to watch */
cursor = gdk_cursor_new(GDK_WATCH);
gdk_window_set_cursor(GTK_WIDGET(toplevel)->window,cursor);
while (gtk_events_pending())
gtk_main_iteration();
if (curset.reader_devnr != -1) {
get_cd_toc_and_volid(curset.reader_devnr);
fill_cdlist();
}
scan_imagedirs();
fill_imglist();
/* reset cursor */
gdk_window_set_cursor(GTK_WIDGET(toplevel)->window,NULL);
gdk_cursor_destroy (cursor);
do_unlock(1);
}
/* the update-button in the read menu */
static void update_readvrfy_clicked(GtkWidget *widget, gpointer read) {
GdkCursor *cursor;
gint isread;
isread = GPOINTER_TO_INT(read);
do_lock(1);
/* change cursor to watch */
cursor = gdk_cursor_new(GDK_WATCH);
gdk_window_set_cursor(GTK_WIDGET(toplevel)->window,cursor);
while (gtk_events_pending())
gtk_main_iteration();
if (curset.reader_devnr != -1) {
get_cd_toc_and_volid(curset.reader_devnr);
}
if (isread) {
fill_read_menu();
} else {
fill_verify_menu();
}
/* reset cursor */
gdk_window_set_cursor(GTK_WIDGET(toplevel)->window,NULL);
gdk_cursor_destroy (cursor);
do_unlock(1);
}
static void eject_clicked(GtkWidget *widget, gpointer load) {
GdkCursor *cursor;
do_lock(1);
/* change cursor to watch */
cursor = gdk_cursor_new(GDK_WATCH);
gdk_window_set_cursor(GTK_WIDGET(toplevel)->window,cursor);
while (gtk_events_pending())
gtk_main_iteration();
if (curset.reader_devnr != -1) {
if (GPOINTER_TO_INT(load))
load_cd(curset.reader_devnr);
else
eject_cd(curset.reader_devnr);
}
/* reset cursor */
gdk_window_set_cursor(GTK_WIDGET(toplevel)->window,NULL);
gdk_cursor_destroy (cursor);
/* after we ejected or loaded automatically update screen */
/* in which menu are we right now? */
/* info menu? */
if (submenu == 1 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets[0])) == 1) {
update_clicked(widget,0);
}
if (submenu == 2 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets2[0])) == 1) {
update_clicked(widget,0);
}
do_unlock(1);
}
/* callbacks for devices_setup_read */
static void readdev_selected(GtkWidget *item, gpointer devnr) {
GdkCursor *cursor;
gint i;
do_lock(1);
/* change cursor to watch */
cursor = gdk_cursor_new(GDK_WATCH);
gdk_window_set_cursor(GTK_WIDGET(toplevel)->window,cursor);
while (gtk_events_pending())
gtk_main_iteration();
curset.reader_devnr = GPOINTER_TO_INT(devnr);
i = get_writerreaderdevs_index(curset.reader_devnr);
/* update speed display */
if (rdr_spd_spin) {
gtk_spin_button_set_value(GTK_SPIN_BUTTON(rdr_spd_spin),
(gfloat)writerreaderdevs[i]->audioread_speed);
}
if (curset.reader_devnr != -1) {
get_cd_toc_and_volid(curset.reader_devnr);
}
/* in which menu are we right now? */
/* info menu? */
if (submenu == 1 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets[0])) == 1) {
fill_cdlist();
}
/* info menu 2? */
if (submenu == 2 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets2[0])) == 1) {
fill_cdlist();
}
/* read menu? */
if (submenu == 1 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets[1])) == 1) {
fill_read_menu();
}
/* read menu 2? */
if (submenu == 2 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets2[1])) == 1) {
fill_read_tracks(0);
}
/* verify menu? */
if (submenu == 1 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets[2])) == 1) {
fill_verify_menu();
}
/* verify menu2? */
if (submenu == 2 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets2[2])) == 1) {
fill_verify_tracks(1);
}
/* write menu? */
if (submenu == 1 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets[4])) == 1) {
fill_write_menu();
}
/* write menu2? */
if (submenu == 2 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets2[5])) == 1) {
fill_write_tracks();
}
/* reset cursor */
gdk_window_set_cursor(GTK_WIDGET(toplevel)->window,NULL);
gdk_cursor_destroy (cursor);
do_unlock(1);
}
static void readdev_speed(GtkWidget *item, GtkSpinButton *spin) {
gint i;
i = get_writerreaderdevs_index(curset.reader_devnr);
writerreaderdevs[i]->audioread_speed = gtk_spin_button_get_value_as_int(spin);
}
/* draw the device-setup-read line */
void devices_setup_read(gint row, GtkWidget *tbl, gint showspeed) {
GtkWidget *omenu;
GtkWidget *menu;
GtkWidget *menu_item;
GtkWidget *l1;
GtkWidget *eject_btn, *eject_xpm;
GtkWidget *load_btn, *load_xpm;
GdkPixmap *pmap;
GdkBitmap *mask;
GtkStyle *style;
gchar tmp[MAXLINE];
GtkWidget *speed1;
GtkObject *adj;
gint menuidx, menuhistory;
gint i;
rdr_spd_spin = NULL;
/* no reader so far selected? set default primary reader */
if (curset.reader_devnr == -1) {
curset.reader_devnr = setupdata.reader_devnr;
}
/* device still valid? */
if (get_writerreaderdevs_index(curset.reader_devnr) == -1) {
/* invalid device, pick the first available instead */
if (writerreaderdevs[0]) {
curset.reader_devnr = writerreaderdevs[0]->devnr;
}
}
/* read device */
l1 = rightjust_gtk_label_new(_("Read Device:"));
gtk_table_attach_defaults(GTK_TABLE(tbl),l1,0,4*4,row,row+1);
gtk_widget_show(l1);
omenu = gtk_option_menu_new ();
menu = gtk_menu_new();
menuidx = 0; menuhistory = -1;
i = 0;
while(writerreaderdevs[i] != NULL) {
if (convert_devnr2devstring(writerreaderdevs[i]->devnr,tmp) == 0) {
menu_item = gtk_menu_item_new_with_label(tmp);
gtk_signal_connect(GTK_OBJECT(menu_item),
"activate", GTK_SIGNAL_FUNC(readdev_selected),
GINT_TO_POINTER(writerreaderdevs[i]->devnr));
gtk_menu_append (GTK_MENU (menu), menu_item);
if (curset.reader_devnr == writerreaderdevs[i]->devnr) { menuhistory = menuidx; }
menuidx++;
gtk_widget_show (menu_item);
}
i++;
}
gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
if (menuhistory != -1) {
gtk_option_menu_set_history(GTK_OPTION_MENU (omenu), menuhistory);
} else {
/* if we are here we have an invalid reader setting */
/* set to default */
curset.reader_devnr = setupdata.reader_devnr;
gtk_option_menu_set_history(GTK_OPTION_MENU (omenu), 0);
}
gtk_table_attach_defaults(GTK_TABLE(tbl),omenu,4*4,12*4,row,row+1);
gtk_widget_show(omenu);
define_tooltip(omenu, _("Select the device you want use for all read-operations on CDs."));
if (showspeed) {
l1 = rightjust_gtk_label_new(_("Speed:"));
gtk_table_attach_defaults(GTK_TABLE(tbl),l1,12*4,15*4-1,row,row+1);
gtk_widget_show(l1);
adj = gtk_adjustment_new(0.0,0.0,64.0,1.0,1.0,1.0);
speed1 = gtk_spin_button_new(GTK_ADJUSTMENT(adj),0,0);
rdr_spd_spin = speed1;
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (readdev_speed),speed1);
gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(speed1),1);
gtk_table_attach_defaults(GTK_TABLE(tbl),speed1,15*4-1,16*4,row,row+1);
i = get_writerreaderdevs_index(curset.reader_devnr);
if (i >= 0) {
gtk_spin_button_set_value(GTK_SPIN_BUTTON(speed1),
(gfloat)writerreaderdevs[i]->audioread_speed);
} else {
gtk_widget_set_sensitive(speed1,FALSE);
}
gtk_widget_show(speed1);
define_tooltip(speed1, _("Select the speed which should be used for audio-extraction."));
if (!isroot() && !setupdata.root_option_change_readparam) {
gtk_widget_set_sensitive(speed1,FALSE);
}
} else {
/* if not showing speed, show eject/load buttons */
gtk_widget_realize(tbl);
style = gtk_widget_get_style(tbl);
pmap = gdk_pixmap_create_from_xpm_d(tbl->window, &mask,
&style->bg[GTK_STATE_NORMAL], (gchar **) disc_eject);
eject_xpm = gtk_pixmap_new(pmap,mask);
eject_btn = gtk_button_new();
gtk_signal_connect (GTK_OBJECT (eject_btn), "clicked",
GTK_SIGNAL_FUNC (eject_clicked), GINT_TO_POINTER(0));
gtk_table_attach_defaults(GTK_TABLE(tbl),eject_btn,
14*4,15*4,row,row+1);
gtk_widget_show(eject_btn);
gtk_container_add(GTK_CONTAINER(eject_btn), eject_xpm);
gtk_widget_show(eject_xpm);
define_tooltip(eject_btn, _("Ejects a CD from this device."));
pmap = gdk_pixmap_create_from_xpm_d(tbl->window, &mask,
&style->bg[GTK_STATE_NORMAL], (gchar **) disc_load);
load_xpm = gtk_pixmap_new(pmap,mask);
load_btn = gtk_button_new();
gtk_signal_connect (GTK_OBJECT (load_btn), "clicked",
GTK_SIGNAL_FUNC (eject_clicked), GINT_TO_POINTER(1));
gtk_table_attach_defaults(GTK_TABLE(tbl),load_btn,
15*4,16*4,row,row+1);
gtk_widget_show(load_btn);
gtk_container_add(GTK_CONTAINER(load_btn), load_xpm);
gtk_widget_show(load_xpm);
define_tooltip(load_btn, _("Loads a CD in this device."));
}
}
static void imagedir_selected(GtkWidget *item, gpointer val) {
GdkCursor *cursor;
do_lock(1);
/* change cursor to watch */
cursor = gdk_cursor_new(GDK_WATCH);
gdk_window_set_cursor(GTK_WIDGET(toplevel)->window,cursor);
while (gtk_events_pending())
gtk_main_iteration();
curset.image_index = GPOINTER_TO_INT(val);
/* which sub-menu are we in? */
/* read menu? */
if (submenu == 1 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets[1])) == 1) {
fill_read_menu();
}
if (submenu == 2 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets2[1])) == 1) {
fill_read_tracks(1);
}
/* verify menu? */
if (submenu == 1 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets[2])) == 1) {
fill_verify_menu();
}
/* verify menu2? */
if (submenu == 2 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets2[2])) == 1) {
fill_verify_tracks(0);
}
/* write menu? */
if (submenu == 1 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets[4])) == 1) {
fill_write_menu();
}
/* write menu2? */
if (submenu == 2 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets2[5])) == 1) {
fill_write_tracks();
}
/* delete menu? */
if (submenu == 1 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets[5])) == 1) {
fill_delete_menu();
}
/* delete menu2? */
if (submenu == 2 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets2[6])) == 1) {
fill_delete_menu();
}
/* master menu */
if (submenu == 2 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets2[4])) == 1) {
fill_master_write_menu();
}
/* reset cursor */
gdk_window_set_cursor(GTK_WIDGET(toplevel)->window,NULL);
gdk_cursor_destroy (cursor);
do_unlock(1);
}
/* draw the device-setup-image line */
void devices_setup_image(gint row, GtkWidget *tbl) {
GtkWidget *omenu;
GtkWidget *menu;
GtkWidget *menu_item;
GtkWidget *l1;
GList *loop;
gchar tmp[MAXLINE];
gint i, menuidx, menuhistory;
/* default curset.image_index is -1...so we are fine here */
/* image directory */
l1 = rightjust_gtk_label_new(_("Image Directory:"));
gtk_table_attach_defaults(GTK_TABLE(tbl),l1,0,4*4,row,row+1);
gtk_widget_show(l1);
omenu = gtk_option_menu_new ();
menu = gtk_menu_new();
/* automatic setting */
menuidx = 0; menuhistory = -1;
menu_item = gtk_menu_item_new_with_label(_("Automatic"));
gtk_signal_connect(GTK_OBJECT(menu_item),
"activate", GTK_SIGNAL_FUNC(imagedir_selected),
GINT_TO_POINTER(-1));
gtk_menu_append (GTK_MENU (menu), menu_item);
if (curset.image_index == -1) { menuhistory = menuidx; }
menuidx++;
gtk_widget_show (menu_item);
/* add image dirs */
i = 0;
loop = g_list_first(setupdata.image_dirs);
while(loop) {
strcpy(tmp,(gchar *)loop->data);
menu_item = gtk_menu_item_new_with_label(tmp);
gtk_signal_connect(GTK_OBJECT(menu_item),
"activate", GTK_SIGNAL_FUNC(imagedir_selected),
GINT_TO_POINTER(i));
gtk_menu_append (GTK_MENU (menu), menu_item);
if (curset.image_index == i) { menuhistory = menuidx; }
menuidx++;
gtk_widget_show (menu_item);
loop = loop->next;
i++;
}
gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
if (menuhistory != -1) {
gtk_option_menu_set_history(GTK_OPTION_MENU (omenu),menuhistory);
} else {
/* looks we got an invalid setting...set to default */
curset.image_index = -1;
gtk_option_menu_set_history(GTK_OPTION_MENU (omenu),0);
}
gtk_table_attach_defaults(GTK_TABLE(tbl),omenu,4*4,12*4,row,row+1);
gtk_widget_show(omenu);
define_tooltip(omenu, _("The directory on the harddrive you want to store/read tracks from. The setting \"Automatic\" selects all available directories at once."));
}
/* configure an optionmenu with writes modes for a given device */
void preselect_write_mode_menu(GtkWidget *omenu, gint devnr) {
gint i,j;
GtkMenuShell *menu_shell;
GtkWidget *menuitem;
GList *loop;
i = get_writerreaderdevs_index(devnr);
if (i == -1) {
gtk_widget_set_sensitive(omenu, FALSE);
return;
}
/* set write mode and update possible settings */
gtk_option_menu_set_history(GTK_OPTION_MENU (omenu),
writerreaderdevs[i]->writer_mode);
menu_shell = GTK_MENU_SHELL(GTK_OPTION_MENU (omenu)->menu);
/* loop through all given menu entries */
j = 0;
loop = g_list_first(menu_shell->children);
while(loop) {
menuitem = loop->data;
if (!writemode_supported(j, devnr)) {
gtk_widget_set_sensitive(menuitem, FALSE);
} else {
gtk_widget_set_sensitive(menuitem, TRUE);
}
j++;
loop = loop->next;
}
}
/* callbacks for devices_setup_write */
static void writedev_selected(GtkWidget *item, gpointer devnr) {
GdkCursor *cursor;
gint i;
do_lock(1);
/* change cursor to watch */
cursor = gdk_cursor_new(GDK_WATCH);
gdk_window_set_cursor(GTK_WIDGET(toplevel)->window,cursor);
while (gtk_events_pending())
gtk_main_iteration();
curset.writer_devnr = GPOINTER_TO_INT(devnr);
i = get_writerreaderdevs_index(curset.writer_devnr);
/* update speed display */
if (cdr_spd_spin) {
gtk_spin_button_set_value(GTK_SPIN_BUTTON(cdr_spd_spin),
(gfloat)writerreaderdevs[i]->writer_speed);
}
/* update any writer specific stuff for a given menu */
/* write menu? */
if (submenu == 1 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets[4])) == 1) {
if (dupl_cd_mode_omenu) {
preselect_write_mode_menu(dupl_cd_mode_omenu,
curset.writer_devnr);
}
if (dupl_cd_burnfree_check) {
if (!does_support_burnproof(curset.writer_devnr)) {
gtk_widget_set_sensitive(dupl_cd_burnfree_check,FALSE);
} else {
gtk_widget_set_sensitive(dupl_cd_burnfree_check,TRUE);
}
}
}
/* write menu2? */
if (submenu == 2 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets2[5])) == 1) {
if (crea_cd_mode_omenu) {
preselect_write_mode_menu(crea_cd_mode_omenu,
curset.writer_devnr);
}
if (crea_cd_burnfree_check) {
if (!does_support_burnproof(curset.writer_devnr)) {
gtk_widget_set_sensitive(crea_cd_burnfree_check,FALSE);
} else {
gtk_widget_set_sensitive(crea_cd_burnfree_check,TRUE);
}
}
}
/* master menu */
if (submenu == 2 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(side_widgets2[4])) == 1) {
if (crea_cd_mode_omenu) {
preselect_write_mode_menu(crea_cd_mode_omenu,
curset.writer_devnr);
}
if (crea_cd_burnfree_check) {
if (!does_support_burnproof(curset.writer_devnr)) {
gtk_widget_set_sensitive(crea_cd_burnfree_check,FALSE);
} else {
gtk_widget_set_sensitive(crea_cd_burnfree_check,TRUE);
}
}
}
/* reset cursor */
gdk_window_set_cursor(GTK_WIDGET(toplevel)->window,NULL);
gdk_cursor_destroy (cursor);
do_unlock(1);
}
static void writedev_speed(GtkWidget *item, GtkSpinButton *spin) {
gint i;
i = get_writerreaderdevs_index(curset.writer_devnr);
writerreaderdevs[i]->writer_speed = gtk_spin_button_get_value_as_int(spin);
}
/* draw the device-setup-write line */
void devices_setup_write(gint row, GtkWidget *tbl) {
GtkWidget *omenu;
GtkWidget *menu;
GtkWidget *menu_item;
GtkWidget *l1;
GtkWidget *speed1;
GtkObject *adj;
gint menuidx, menuhistory;
gchar tmp[MAXLINE];
gint i;
cdr_spd_spin = NULL;
/* select primary writer */
if (curset.writer_devnr == -1) {
curset.writer_devnr = setupdata.writer_devnr;
}
/* device still valid? */
if (get_writerreaderdevs_index(curset.writer_devnr) == -1) {
/* invalid device, pick the first available instead */
i = 0;
while(writerreaderdevs[i] != NULL) {
if (writerreaderdevs[i]->is_cdrwriter ||
writerreaderdevs[i]->is_dvdwriter) {
curset.writer_devnr = writerreaderdevs[i]->devnr;
break;
}
i++;
}
}
/* write device */
l1 = rightjust_gtk_label_new(_("Write Device:"));
gtk_table_attach_defaults(GTK_TABLE(tbl),l1,0,4*4,row,row+1);
gtk_widget_show(l1);
omenu = gtk_option_menu_new ();
menu = gtk_menu_new();
menuidx = 0; menuhistory = -1;
i = 0;
while(writerreaderdevs[i] != NULL) {
/* only show writers here */
if (writerreaderdevs[i]->is_cdrwriter ||
writerreaderdevs[i]->is_dvdwriter) {
if (convert_devnr2devstring(writerreaderdevs[i]->devnr,tmp) == 0) {
menu_item = gtk_menu_item_new_with_label(tmp);
gtk_signal_connect(GTK_OBJECT(menu_item),
"activate", GTK_SIGNAL_FUNC(writedev_selected),
GINT_TO_POINTER(writerreaderdevs[i]->devnr));
gtk_menu_append (GTK_MENU (menu), menu_item);
if (curset.writer_devnr == writerreaderdevs[i]->devnr) { menuhistory = menuidx; }
menuidx++;
gtk_widget_show (menu_item);
}
}
i++;
}
gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
if (menuhistory != -1) {
gtk_option_menu_set_history(GTK_OPTION_MENU (omenu),menuhistory);
} else {
/* nothing valid preselected */
curset.writer_devnr = setupdata.writer_devnr;
gtk_option_menu_set_history(GTK_OPTION_MENU (omenu), 0);
}
gtk_table_attach_defaults(GTK_TABLE(tbl),omenu,4*4,12*4,row,row+1);
gtk_widget_show(omenu);
define_tooltip(omenu, _("The Writer you want to use to burn any CDs or DVDs."));
l1 = rightjust_gtk_label_new(_("Speed:"));
gtk_table_attach_defaults(GTK_TABLE(tbl),l1,12*4,15*4-1,row,row+1);
gtk_widget_show(l1);
adj = gtk_adjustment_new(0.0,0.0,64.0,1.0,1.0,1.0);
speed1 = gtk_spin_button_new(GTK_ADJUSTMENT(adj),0,0);
cdr_spd_spin = speed1;
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (writedev_speed),speed1);
gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(speed1),1);
gtk_table_attach_defaults(GTK_TABLE(tbl),speed1,15*4-1,16*4,row,row+1);
i = get_writerreaderdevs_index(curset.writer_devnr);
if (i >= 0) {
gtk_spin_button_set_value(GTK_SPIN_BUTTON(speed1),
(gfloat)writerreaderdevs[i]->writer_speed);
} else {
gtk_widget_set_sensitive(speed1,FALSE);
}
gtk_widget_show(speed1);
define_tooltip(speed1, _("The speed you want to burn CDs with. (Depends on your current Writer)"));
if (!isroot() && !setupdata.root_option_change_writeparam) {
gtk_widget_set_sensitive(speed1,FALSE);
}
}
/* function to remove all selections on a clist */
void undo_selections(GtkWidget *clist, gint row, gint column,
GdkEventButton *event, gpointer data) {
gtk_clist_unselect_all(GTK_CLIST(clist));
}
/* draw the cd-info-menu */
void draw_info_menu() {
GtkWidget *hbox, *vbox;
GtkWidget *f1,*f2;
GtkWidget *b1, *b_update;
GtkWidget *e1;
GtkWidget *l1;
GtkWidget *tbl;
GtkWidget *cd_list, *img_list;
gchar *titles[2];
GtkWidget *scrolled_win;
/* prepare draw area */
clear_actionspace();
f1 = gtk_frame_new(_("Devices-Setup"));
set_font_and_color_frame(f1,BOLDFONT,NULL);
gtk_box_pack_start(GTK_BOX(actionspace),f1,FALSE,FALSE,5);
gtk_widget_show(f1);
tbl = gtk_table_new(1,16*4,TRUE);
gtk_table_set_col_spacing(GTK_TABLE(tbl),4*4-1,5);
gtk_table_set_col_spacing(GTK_TABLE(tbl),15*4-1,5);
gtk_container_set_border_width(GTK_CONTAINER (tbl),5);
gtk_container_add(GTK_CONTAINER(f1),tbl);
gtk_widget_show(tbl);
devices_setup_read(0, tbl, 0);
/* left and right info-frames */
tbl = gtk_table_new(1,2,TRUE);
gtk_table_set_col_spacings(GTK_TABLE(tbl),10);
gtk_box_pack_start(GTK_BOX(actionspace),tbl,TRUE,TRUE,10);
gtk_widget_show(tbl);
if (!curset.isProDVD) {
f1 = gtk_frame_new(_("CD-Information"));
} else {
f1 = gtk_frame_new(_("CD/DVD-Information"));
}
set_font_and_color_frame(f1,BOLDFONT,NULL);
gtk_table_attach_defaults(GTK_TABLE(tbl),f1,0,1,0,1);
gtk_widget_show(f1);
f2 = gtk_frame_new(_("Image-Information"));
set_font_and_color_frame(f2,BOLDFONT,NULL);
gtk_table_attach_defaults(GTK_TABLE(tbl),f2,1,2,0,1);
gtk_widget_show(f2);
/* button bar at the bottom */
hbox = gtk_hbox_new(TRUE,10);
gtk_box_pack_start(GTK_BOX(actionspace),hbox,FALSE,TRUE,10);
gtk_widget_show(hbox);
b1 = gtk_button_new_with_label(_("Query CDDB"));
gtk_box_pack_start(GTK_BOX(hbox),b1,TRUE,TRUE,10);
gtk_widget_show(b1);
gtk_signal_connect(GTK_OBJECT(b1), "clicked",
GTK_SIGNAL_FUNC(cddb_clicked), NULL);
define_tooltip(b1,_("Download the track titles for current CD. Requires a connection to the Internet."));
b1 = gtk_button_new_with_label(_("Edit titles for CD-Text"));
gtk_box_pack_start(GTK_BOX(hbox),b1,TRUE,TRUE,10);
gtk_widget_show(b1);
gtk_signal_connect(GTK_OBJECT(b1), "clicked",
GTK_SIGNAL_FUNC(edit_cdtext_clicked), GINT_TO_POINTER(0));
define_tooltip(b1,_("Edits the title and performer information before any tracks are read from the inserted CD. Only required to author a CD with CD-Text."));
/*
b1 = gtk_button_new_with_label(_("Eject CD"));
gtk_box_pack_start(GTK_BOX(hbox),b1,TRUE,TRUE,10);
gtk_widget_show(b1);
gtk_signal_connect(GTK_OBJECT(b1), "clicked",
GTK_SIGNAL_FUNC(eject_clicked), NULL);
define_tooltip(b1,_("Ejects the CD in the current read device."));
*/
b_update = gtk_button_new_with_label(_("Update"));
gtk_box_pack_start(GTK_BOX(hbox),b_update,TRUE,TRUE,10);
gtk_widget_show(b_update);
gtk_signal_connect(GTK_OBJECT(b_update), "clicked",
GTK_SIGNAL_FUNC(update_clicked), NULL);
define_tooltip(b_update,_("Refreshes the content of the information windows. (e.g. after a CD change)"));
/* left info frame */
vbox = gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(f1),vbox);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
gtk_widget_show(vbox);
scrolled_win = gtk_scrolled_window_new (NULL, NULL);
gtk_box_pack_start(GTK_BOX(vbox),scrolled_win,TRUE,TRUE,0);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
gtk_widget_show(scrolled_win);
titles[0] = g_strdup("");
titles[1] = _("Tracks");
cd_list = gtk_clist_new_with_titles(2,titles);
gtk_signal_connect(GTK_OBJECT(cd_list), "select_row",
GTK_SIGNAL_FUNC(undo_selections), NULL);
gtk_container_add (GTK_CONTAINER (scrolled_win), cd_list);
cdlist = GTK_CLIST(cd_list);
gtk_clist_set_column_width(cdlist, 0, 16);
gtk_clist_set_column_auto_resize(cdlist, 1, TRUE);
gtk_widget_show(cd_list);
tbl = gtk_table_new(3,8,TRUE);
gtk_table_set_row_spacings(GTK_TABLE(tbl),10);
gtk_table_set_col_spacings(GTK_TABLE(tbl),10);
gtk_box_pack_start(GTK_BOX(vbox),tbl,FALSE,FALSE,10);
gtk_widget_show(tbl);
l1 = rightjust_gtk_label_new(_("Type:"));
gtk_table_attach_defaults(GTK_TABLE(tbl),l1,0,2,0,1);
gtk_widget_show(l1);
e1 = gtk_entry_new();
cdlist_l1 = e1;
gtk_entry_set_editable(GTK_ENTRY(e1),FALSE);
gtk_table_attach_defaults(GTK_TABLE(tbl),e1,2,8,0,1);
gtk_widget_show(e1);
l1 = rightjust_gtk_label_new(_("Label:"));
gtk_table_attach_defaults(GTK_TABLE(tbl),l1,0,2,1,2);
gtk_widget_show(l1);
e1 = gtk_entry_new();
cdlist_l2 = e1;
gtk_entry_set_editable(GTK_ENTRY(e1),FALSE);
gtk_table_attach_defaults(GTK_TABLE(tbl),e1,2,8,1,2);
gtk_widget_show(e1);
l1 = rightjust_gtk_label_new(_("Size:"));
gtk_table_attach_defaults(GTK_TABLE(tbl),l1,0,2,2,3);
gtk_widget_show(l1);
e1 = gtk_entry_new();
cdlist_l3 = e1;
gtk_entry_set_editable(GTK_ENTRY(e1),FALSE);
gtk_table_attach_defaults(GTK_TABLE(tbl),e1,2,8,2,3);
gtk_widget_show(e1);
/* right info frame */
vbox = gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(f2),vbox);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
gtk_widget_show(vbox);
scrolled_win = gtk_scrolled_window_new (NULL, NULL);
gtk_box_pack_start(GTK_BOX(vbox),scrolled_win,TRUE,TRUE,0);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
gtk_widget_show(scrolled_win);
titles[0] = g_strdup("");
titles[1] = _("Images");
img_list = gtk_clist_new_with_titles(2,titles);
gtk_signal_connect(GTK_OBJECT(img_list), "select_row",
GTK_SIGNAL_FUNC(undo_selections), NULL);
gtk_container_add (GTK_CONTAINER (scrolled_win), img_list);
imglist = GTK_CLIST(img_list);
gtk_clist_set_column_width(imglist, 0, 16);
gtk_clist_set_column_auto_resize(imglist, 1, TRUE);
gtk_widget_show(img_list);
tbl = gtk_table_new(1,8,TRUE);
gtk_table_set_row_spacings(GTK_TABLE(tbl),10);
gtk_table_set_col_spacings(GTK_TABLE(tbl),10);
gtk_box_pack_start(GTK_BOX(vbox),tbl,FALSE,FALSE,10);
gtk_widget_show(tbl);
l1 = rightjust_gtk_label_new(_("Total Size:"));
gtk_table_attach_defaults(GTK_TABLE(tbl),l1,0,3,0,1);
gtk_widget_show(l1);
e1 = gtk_entry_new();
imglist_l1 = e1;
gtk_entry_set_editable(GTK_ENTRY(e1),FALSE);
gtk_table_attach_defaults(GTK_TABLE(tbl),e1,3,8,0,1);
gtk_widget_show(e1);
gtk_widget_show(actionspace);
while (gtk_events_pending())
gtk_main_iteration();
/* now update screen */
gtk_button_clicked(GTK_BUTTON(b_update));
}
/* calculate the space that would be recycled on the harddrive
when reading tracks and overwriting the ones with same names.
This is used to show the user what space really is free
dependant of the name he chooses for his files */
static gint get_free_space_by_overwriting_trackfiles(gint *biggest) {
track_read_param_t *trackparam;
gfloat per;
gint i;
gint overwrite;
gint overwritebiggest;
/* cd loaded? */
if (cdinfo.nr_tracks < 0) {
/* no cd in drive - no files to read */
*biggest = 0;
return 0;
}
/* free structure first */
clear_trackreadset();
/* fill structure */
trackreadset.nrtracks = cdinfo.nr_tracks;
for(i=0; i<cdinfo.nr_tracks; i++) {
/* allocate memory */
trackparam = g_new0(track_read_param_t,1);
trackparam->trackinfo_index = i;
trackparam->starttrack = trackinfo[i]->track_nr;
trackparam->endtrack = 0;
trackparam->tracktype = trackinfo[i]->type;
per = (gfloat)trackinfo[i]->size * 100.0 / cdinfo.total_size;
trackparam->percent = per;
if (trackparam->tracktype == 0) {
/* data track */
trackparam->kbyte = trackinfo[i]->size *
(DATASECTORSIZE/1024);
trackparam->frames = trackinfo[i]->size;
trackparam->startoffset = trackinfo[i]->start_sec;
if (i == cdinfo.nr_tracks-1) {
/* last track - leadout is track-end */
trackparam->endoffset = cdinfo.leadout - 2;
} else {
/* sub 150 (2 sec leadout),
sub 2 (2 run out sectors) */
trackparam->endoffset =
trackinfo[i+1]->start_sec -150-2;
}
} else {
/* audio */
trackparam->kbyte = trackinfo[i]->size *
CDDAFRAME/1024;
trackparam->frames = trackinfo[i]->size;
}
trackreadset.trackparams = g_list_append(
trackreadset.trackparams, trackparam);
}
/* assign diskspace */
allocate_track_filenames(&overwrite, &overwritebiggest);
*biggest = overwritebiggest;
return overwrite;
}
/* callbacks for button in read-screen */
static void readalltracks_clicked(GtkWidget *widget, gpointer data) {
gchar path[MAXLINE];
gchar tmp[MAXLINE];
track_read_param_t *trackparam;
gfloat per;
gint i, ret, sectorstoread;
gint overwrite, overwritebiggest, stat;
gint datacount, audiocount, sectsize;
GList *loop;
/* no cd-reader defined */
if (curset.reader_devnr == -1) {
show_dialog(ICO_ERROR,_("No CD-Reader defined in Setup"), T_OK, NULL, NULL, 0);
return;
}
datacount = 0;
audiocount = 0;
sectsize = get_sectorsize(curset.reader_devnr);
/* now check if our cd-information is still valid */
get_cd_toc_and_volid(curset.reader_devnr);
/* cd loaded? */
if (cdinfo.nr_tracks < 0) {
/* update screen ... */
fill_read_menu();
show_dialog(ICO_WARN,_("No CD loaded in read device"),T_OK,NULL,NULL,0);
return;
}
/* now check for cd-extra because we dont handle this
currently */
if (determine_cd_type(tmp,0) == 3) {
show_dialog(ICO_INFO,_("This test release does currently not\nsupport copying of CD-Extra."),T_OK,NULL,NULL,0);
return;
}
/* ok, the user wants to read all tracks */
/* lets check if the file-prefix-entry is up to date */
set_image_prefix_callback(imglist_l1, NULL);
/* free structure first */
clear_trackreadset();
/* fill structure */
trackreadset.nrtracks = cdinfo.nr_tracks;
for(i=0; i<cdinfo.nr_tracks; i++) {
/* allocate memory */
trackparam = g_new0(track_read_param_t,1);
trackparam->trackinfo_index = i;
trackparam->starttrack = trackinfo[i]->track_nr;
trackparam->endtrack = 0;
trackparam->tracktype = trackinfo[i]->type;
per = (gfloat)trackinfo[i]->size * 100.0 / cdinfo.total_size;
trackparam->percent = per;
if (trackparam->tracktype == 0) {
/* data track */
datacount++;
trackparam->kbyte = trackinfo[i]->size *
(DATASECTORSIZE/1024);
trackparam->frames = trackinfo[i]->size;
trackparam->startoffset = trackinfo[i]->start_sec;
if (i == cdinfo.nr_tracks-1) {
/* last track - leadout is track-end */
trackparam->endoffset = cdinfo.leadout - 2;
} else {
/* sub 150 (2 sec leadout),
sub 2 (2 run out sectors) */
trackparam->endoffset =
trackinfo[i+1]->start_sec -150-2;
}
/* now do a paranoia check */
/* in some cases we skip to much of a track */
sectorstoread = trackparam->endoffset -
trackparam->startoffset;
if (sectorstoread < trackinfo[i]->isosize) {
trackparam->endoffset =
trackparam->startoffset +
trackinfo[i]->isosize;
trackparam->kbyte = trackinfo[i]->isosize * 2;
dodebug(1,"readalltracks_clicked: corrected data track size from %d to %d sectors.\n", sectorstoread, trackinfo[i]->isosize);
}
} else {
/* audio */
audiocount++;
trackparam->kbyte = trackinfo[i]->size *
CDDAFRAME/1024;
trackparam->frames = trackinfo[i]->size;
}
trackreadset.trackparams = g_list_append(
trackreadset.trackparams, trackparam);
}
/* sectorsize firmware bug detection */
if (datacount > 0 && sectsize != 2048) {
ret = show_dialog(ICO_WARN,_("Your drive seems to have a faulty firmware which will not allow to read\ndata tracks reliably. Try to look for a firmwire upgrade or read your\ndata CDs with another drive. To continue is not recommended."), T_ANYWAY, T_CANCEL, NULL, 1);
if (ret == 1) {
/* abort */
return;
}
}
/* assign diskspace */
stat = allocate_track_filenames(&overwrite, &overwritebiggest);
if (stat == 1) {
/* not enough space */
ret = show_dialog(ICO_WARN,_("Not enough diskspace available!\nDo you want to continue anyway or to abort?"), T_ANYWAY, T_CANCEL, NULL, 1);
if (ret == 1) {
/* abort */
return;
}
}
/* no writeable dirs */
if (stat == 2) {
show_dialog(ICO_WARN,_("No image-directories with write permissions found.\nPlease check your settings in the Setup."), T_OK, NULL, NULL, 1);
return;
}
/* overwriting a link? */
if (stat == 3) {
/* FIX HERE USING GETTEXT FOR NEXT RELEASE */
show_dialog(ICO_WARN,"Not allowing to overwrite a symlink.\nChoose another \"File prefix\".", T_OK, NULL, NULL, 1);
return;
}
/* warn we are going to overwrite some files */
if (setupdata.option_overwritewarn == 1 && overwrite > 0) {
ret = show_dialog(ICO_WARN,_("You are going to overwrite old track images on your\nharddrive. Cancel now, if you don't want to do that\nand choose another \"File prefix\"."), T_ANYWAY, T_CANCEL, NULL, 1);
if (ret == 1) {
/* abort */
return;
}
}
/* assign now a toc-file name */
strcpy(path, "");
if (curset.image_index == -1) {
/* automatic setting */
loop = g_list_first(setupdata.image_dirs);
while(loop) {
strncpy(path,(gchar *)loop->data, MAXLINE);
/* dir writeable? */
if (is_dir_writeable(path) == 0) {
/* yes? take this */
break;
}
loop = loop->next;
}
} else {
strncpy(path,(gchar *)g_list_nth_data(setupdata.image_dirs,
curset.image_index), MAXLINE);
}
g_snprintf(tmp,MAXLINE,"%s/%s.toc",path,curset.file_prefix);
g_free(trackreadset.tocfile);
trackreadset.tocfile = g_strdup(tmp);
/* now all parameters for reading are set - lets begin */
show_and_do_read_tracks(curset.reader_devnr, 1);
}
/* fill the entries in the read_cd_menu */
static void fill_read_menu() {
gchar tmp[MAXLINE];
gchar tmp2[MAXLINE];
gchar tmp3[MAXLINE];
gint overwritefree, normalfree, biggestfree, overwritefreebiggest;
/* file prefix */
if (strcmp(curset.file_prefix,"") == 0) {
g_free(curset.file_prefix);
curset.file_prefix = g_strdup(IMGFILEPREFIX);
}
gtk_entry_set_text(GTK_ENTRY(imglist_l1), curset.file_prefix);
gtk_entry_set_position(GTK_ENTRY(imglist_l1), 0);
/*
gtk_entry_select_region(GTK_ENTRY(imglist_l1), 0,
GTK_ENTRY(imglist_l1)->text_length);
*/
/* now check if the current filename has any influence on
the available space */
overwritefree =
get_free_space_by_overwriting_trackfiles(&overwritefreebiggest);
/* free size */
normalfree = determine_free_space(&biggestfree);
convert_kbytes2mbminstring(normalfree,tmp3);
/* additional free space when overwriting files? */
if (cdinfo.nr_tracks > 0 && overwritefree > 0) {
convert_kbytes2mbstring(normalfree+overwritefree, tmp2);
g_snprintf(tmp,MAXLINE,"%s (%s)", tmp3, tmp2);
} else {
strcpy(tmp,tmp3);
}
gtk_entry_set_text(GTK_ENTRY(imglist_l2), tmp);
gtk_entry_set_position(GTK_ENTRY(imglist_l2), 0);
/* biggest free block */
convert_kbytes2mbminstring(biggestfree,tmp3);
if (cdinfo.nr_tracks > 0 && overwritefreebiggest > 0) {
convert_kbytes2mbstring(biggestfree+overwritefreebiggest, tmp2);
g_snprintf(tmp,MAXLINE,"%s (%s)", tmp3, tmp2);
} else {
strcpy(tmp,tmp3);
}
gtk_entry_set_text(GTK_ENTRY(imglist_l3), tmp);
gtk_entry_set_position(GTK_ENTRY(imglist_l3), 0);
/* cd loaded? */
if (cdinfo.nr_tracks == -1) {
gtk_entry_set_text(GTK_ENTRY(cdlist_l1), _("No CD loaded"));
gtk_entry_set_text(GTK_ENTRY(cdlist_l2),"");
gtk_entry_set_text(GTK_ENTRY(cdlist_l3),"");
gtk_entry_set_text(GTK_ENTRY(cdlist_l4),"");
return;
}
if (cdinfo.nr_tracks == -2) {
gtk_entry_set_text(GTK_ENTRY(cdlist_l1), return_media_type(curset.reader_devnr));
gtk_entry_set_text(GTK_ENTRY(cdlist_l2),"");
gtk_entry_set_text(GTK_ENTRY(cdlist_l3),"");
gtk_entry_set_text(GTK_ENTRY(cdlist_l4),"");
return;
}
/* cd-type */
determine_cd_type(tmp,0);
gtk_entry_set_text(GTK_ENTRY(cdlist_l1), tmp);
/* cd-label */
if (cdinfo.title && cdinfo.artist &&
cdinfo.title[0] != '\0' && setupdata.option_displaycdtext) {
g_snprintf(tmp,MAXLINE,"%s / %s", cdinfo.title, cdinfo.artist);
gtk_entry_set_text(GTK_ENTRY(cdlist_l2), tmp);
gtk_entry_set_position(GTK_ENTRY(cdlist_l2),0);
} else
if (cdinfo.cddb_dtitle != NULL) {
gtk_entry_set_text(GTK_ENTRY(cdlist_l2), cdinfo.cddb_dtitle);
gtk_entry_set_position(GTK_ENTRY(cdlist_l2),0);
} else {
gtk_entry_set_text(GTK_ENTRY(cdlist_l2),"");
}
/* cd-size */
convert_frames2mbminstring(cdinfo.total_size, tmp);
gtk_entry_set_text(GTK_ENTRY(cdlist_l3), tmp);
/* nr tracks */
g_snprintf(tmp,MAXLINE,"%d",cdinfo.nr_tracks);
gtk_entry_set_text(GTK_ENTRY(cdlist_l4), tmp);
}
void set_image_prefix_callback(GtkWidget *widget, gpointer data) {
gchar tmp[MAXLINE];
g_free(curset.file_prefix);
strcpy(tmp,gtk_entry_get_text(GTK_ENTRY(widget)));
/* now check for illegal chars */
if (remove_illegal_chars(tmp) == 1) {
gtk_entry_set_text(GTK_ENTRY(widget), tmp);
show_dialog(ICO_WARN,_("Illegal chars found in entry field.\nSubstituted them by \"_\" chars"),T_OK,NULL,NULL, 0);
}
curset.file_prefix = g_strdup(tmp);
/* empty-file? */
if (strcmp(curset.file_prefix,"") == 0) {
g_free(curset.file_prefix);
curset.file_prefix = g_strdup(IMGFILEPREFIX);
gtk_entry_set_text(GTK_ENTRY(widget), curset.file_prefix);