pkg://xcdroast-debuginfo-0.98a15-14.fc7.ppc.rpm:614443/
usr/
src/
debug/
xcdroast-0.98alpha15/
src/create.c
info downloads
/*
create.c
Create CD functions
20.11.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 <sys/stat.h>
#include <stdlib.h>
#include <fcntl.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
#define GTK_ENABLE_BROKEN
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <gdk/gdkkeysyms.h>
#include "xcdrdata.h"
#include "xcdroast.h"
#include "main.h"
#include "../xpms/minidata.xpm"
#include "../xpms/miniaudio.xpm"
#include "../xpms/mininodata.xpm"
#include "../xpms/masteradd.xpm"
#include "../xpms/masterdel.xpm"
extern gint debug;
extern gchar configdir[MAXLINE];
extern GtkWidget *toplevel;
extern GtkWidget *sidespace;
extern GtkWidget *workspace;
extern GtkWidget *actionspace;
extern gint wav_in;
extern GtkWidget *wav_quit_button;
extern gint wavplay_quit;
extern gint submenu;
extern track_read_set_t trackreadset;
extern writerreader_devices_t **writerreaderdevs;
extern setup_data_t setupdata;
extern current_set_t curset;
extern cd_info_t cdinfo;
extern track_info_t **trackinfo;
extern GtkCList *cdlist, *imglist;
extern GtkWidget *imglist_l1, *imglist_l2, *imglist_l3;
extern GtkWidget *cdlist_l1, *cdlist_l2, *cdlist_l3, *cdlist_l4;
extern GtkWidget *vrylist_l1, *vrylist_l2, *vrylist_l3, *vrylist_l4;
extern GList *imagelist;
extern GtkWidget *ctree_okbutton;
extern GtkWidget *crea_cd_mode_omenu, *crea_cd_burnfree_check;
/* some stuff for the select-functions of the sidebar buttons */
extern guint side_handlers2[8];
extern GtkWidget *side_widgets2[8];
GtkCList *imglist2;
GList *writelist;
GtkWidget *isoopts[24];
master_param_t masterparam;
gchar **charset_types;
gchar *master_fname1 = NULL;
gchar *master_fname2 = NULL;
GtkWidget *mkisofs_calc_timeout_dialog;
static GtkWidget *isoopt_omenu;
static GtkWidget *isoopt_cmenu;
static GtkWidget *isoopt_cmenu2;
static GtkWidget *bootable_frame1;
static GtkWidget *bootable_frame2;
static GtkWidget *isoheader[7];
static GtkWidget *master_avail_entry, *master_ms_button, *master_ms_button2;
static gint master_ms_button_signal, master_ms_button2_signal;
static gint session_current_state;
static GtkWidget *bootimg_entry, *master_loadsizetbl;
extern void draw_info_menu();
extern void draw_play_tracks_menu();
extern void draw_delete_menu();
extern void devices_setup_read(gint row, GtkWidget *tbl, gint showspeed);
extern void devices_setup_image(gint row, GtkWidget *tbl);
extern void devices_setup_write(gint row, GtkWidget *tbl);
extern void readoptions_selected(GtkWidget *item, gpointer nr);
extern void verifyoptions_selected(GtkWidget *item, gpointer nr);
extern void set_image_prefix_callback(GtkWidget *widget, gpointer data);
extern void writeoptions_selected(GtkWidget *item, gpointer nr);
extern void writemode_selected(GtkWidget *item, gpointer data);
extern void cdrtype_selected(GtkWidget *item, gpointer mode);
extern void show_atip_info(GtkWidget *widget, gpointer data);
extern void blankcd_clicked(GtkWidget *widget, gpointer data);
extern void adv_write_options_clicked(GtkWidget *widget, gpointer data);
extern void undo_selections(GtkWidget *clist, gint row, gint column,
GdkEventButton *event, gpointer data);
extern void do_lock(gint plusgrab);
extern void do_unlock(gint plusgrab);
extern void display_advisooptions();
static void fill_session_view(gint checkmedia);
static void set_sessionsize_unknown();
/* --------------- */
/* fill the entries in the read_tracks_menu */
void fill_read_tracks(gint dontupdatecd) {
gchar tmp[MAXLINE];
gchar tmp2[MAXLINE];
gchar tmp3[MAXLINE];
gchar titlestr[MAXLINE];
gint overwritefree, normalfree, biggestfree, overwritefreebiggest;
GtkStyle *style;
gchar *data[2];
GdkPixmap *pixmap1, *pixmap2;
GdkBitmap *mask1, *mask2;
gint i, lcount;
/* update cd-info */
if (curset.reader_devnr != -1) {
get_cd_toc_and_volid(curset.reader_devnr);
}
/* 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 - to complicated - REMOVED*/
overwritefree = 0;
overwritefreebiggest = 0;
/*
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);
/* dont change anything on the cd side */
if (dontupdatecd) return;
/* fill track-listing */
/* 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),"");
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),"");
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++) {
strcpy(titlestr,"");
/* we have cd-text for this track? */
if (setupdata.option_displaycdtext) {
if (trackinfo[i]->title != NULL &&
trackinfo[i]->title[0] != '\0' ) {
strcpy(titlestr, trackinfo[i]->title);
}
}
/* have we a cddb-title for this track? */
if (trackinfo[i]->cddb_ttitle != NULL) {
strcpy(titlestr, trackinfo[i]->cddb_ttitle);
} else
if (trackinfo[i]->volname != NULL) {
strcpy(titlestr, trackinfo[i]->volname);
}
if (trackinfo[i]->type == 0) {
convert_frames2mbstring(trackinfo[i]->size,tmp2);
if (strcmp(titlestr,"") == 0) {
strcpy(titlestr,_("data track"));
}
g_snprintf(tmp,MAXLINE,"%2d. %s [%s]",
trackinfo[i]->track_nr,
titlestr, 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);
if (strcmp(titlestr,"") == 0) {
strcpy(titlestr,_("audio track"));
}
g_snprintf(tmp,MAXLINE,"%2d. %s [%s]",
trackinfo[i]->track_nr,
titlestr, tmp2);
data[1] = convert_for_gtk2(tmp);
gtk_clist_append(cdlist,data);
gtk_clist_set_pixmap(cdlist,lcount,0,pixmap2,mask2);
lcount++;
}
}
/* 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_l1), tmp);
gtk_entry_set_position(GTK_ENTRY(cdlist_l1),0);
} else
if (cdinfo.cddb_dtitle != NULL) {
gtk_entry_set_text(GTK_ENTRY(cdlist_l1), cdinfo.cddb_dtitle);
gtk_entry_set_position(GTK_ENTRY(cdlist_l1),0);
} else {
gtk_entry_set_text(GTK_ENTRY(cdlist_l1),"");
}
/* nothing selected at first */
convert_frames2mbminstring(0, tmp);
gtk_entry_set_text(GTK_ENTRY(cdlist_l2), tmp);
}
/* update currently selected track-sizes */
static void update_read_size(gint clickrow) {
GList *sel;
gint row;
gint sizecount;
gchar tmp[MAXLINE];
sizecount = 0;
/* loop through all selected tracks */
sel = cdlist->selection;
while (sel) {
row = GPOINTER_TO_INT(sel->data);
sizecount += trackinfo[row]->size;
sel = sel->next;
}
convert_frames2mbminstring(sizecount, tmp);
gtk_entry_set_text(GTK_ENTRY(cdlist_l2), tmp);
}
/* callbacks for button in read-screen */
static void readsometracks_clicked(GtkWidget *widget, gpointer data) {
track_read_param_t *trackparam;
gfloat per;
gint ret, tcount, sizecount,nrtracks;
gint overwrite, overwritebiggest;
GList *sel;
gint row, sectorstoread,stat;
gint datacount, audiocount, sectsize;
/* 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_tracks(0);
show_dialog(ICO_WARN,_("No CD loaded in read device"),T_OK,NULL,NULL,0);
return;
}
sizecount = 0;
nrtracks = 0;
/* loop through all selected tracks to get number and sum of size */
sel = cdlist->selection;
while (sel) {
row = GPOINTER_TO_INT(sel->data);
sizecount += trackinfo[row]->size;
nrtracks++;
sel = sel->next;
}
/* no tracks selected */
if (nrtracks == 0) {
show_dialog(ICO_WARN,_("No tracks selected"),T_OK,NULL,NULL,0);
return;
}
/* 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 = nrtracks;
tcount = 0;
sel = cdlist->selection;
while (sel) {
row = GPOINTER_TO_INT(sel->data);
/* allocate memory */
trackparam = g_new0(track_read_param_t,1);
trackparam->trackinfo_index = row;
trackparam->starttrack = trackinfo[row]->track_nr;
trackparam->endtrack = 0;
trackparam->tracktype = trackinfo[row]->type;
per = (gfloat)trackinfo[row]->size * 100.0 / sizecount;
trackparam->percent = per;
if (trackparam->tracktype == 0) {
/* data track */
datacount++;
trackparam->kbyte = trackinfo[row]->size *
(DATASECTORSIZE/1024);
trackparam->frames = trackinfo[row]->size;
trackparam->startoffset = trackinfo[row]->start_sec;
if (row == 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[row+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[row]->isosize) {
trackparam->endoffset =
trackparam->startoffset +
trackinfo[row]->isosize;
trackparam->kbyte = trackinfo[row]->isosize * 2;
dodebug(1,"readsometracks_clicked: corrected data track size from %d to %d sectors.\n", sectorstoread, trackinfo[row]->isosize);
}
} else {
/* audio */
audiocount++;
trackparam->kbyte = trackinfo[row]->size *
CDDAFRAME/1024;
trackparam->frames = trackinfo[row]->size;
}
trackreadset.trackparams = g_list_append(
trackreadset.trackparams, trackparam);
sel = sel->next;
}
/* 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 an empty toc-filename */
g_free(trackreadset.tocfile);
trackreadset.tocfile = g_strdup("");
/* now all parameters for reading are set - lets begin */
show_and_do_read_tracks(curset.reader_devnr, 0);
}
static void read_select_all(GtkWidget *widget, gpointer data) {
gtk_clist_select_all(cdlist);
}
static void read_select_none(GtkWidget *widget, gpointer data) {
gtk_clist_unselect_all(cdlist);
}
static void read_select_row(GtkWidget *clist, gint row, gint col,
GdkEventButton *event, gpointer data) {
update_read_size(row);
}
/* draw read-tracks menu */
static void draw_read_tracks() {
GtkWidget *hbox, *vbox;
GtkWidget *f1,*f2, *f3;
GtkWidget *b1;
GtkWidget *e1;
GtkWidget *l1;
GtkWidget *tbl, *check, *dummy;
GtkCList *clist;
gchar *titles[2];
GtkWidget *scrolled_win, *list;
/* 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(2,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-2,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, 1);
devices_setup_image(1, tbl);
/* devices_setup_write(2, tbl); */
/* 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);
vbox = gtk_vbox_new(FALSE,10);
gtk_table_attach_defaults(GTK_TABLE(tbl),vbox,1,2,0,1);
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_box_pack_start(GTK_BOX(vbox),f2,TRUE,TRUE,0);
gtk_widget_show(f2);
f3 = gtk_frame_new(_("Read options"));
set_font_and_color_frame(f3,BOLDFONT,NULL);
gtk_box_pack_start(GTK_BOX(vbox),f3,FALSE,FALSE,0);
gtk_widget_show(f3);
gtk_widget_show(vbox);
/* button bar at the bottom */
hbox = gtk_hbox_new(FALSE,5);
gtk_box_pack_start(GTK_BOX(actionspace),hbox,FALSE,TRUE,10);
gtk_widget_show(hbox);
b1 = gtk_button_new_with_label(_("Select all"));
gtk_box_pack_start(GTK_BOX(hbox),b1,TRUE,TRUE,10);
gtk_signal_connect(GTK_OBJECT(b1),"clicked",
GTK_SIGNAL_FUNC(read_select_all), NULL);
define_tooltip(b1,_("Selects all tracks of the currently inserted CD for reading."));
gtk_widget_show(b1);
b1 = gtk_button_new_with_label(_("Select none"));
gtk_box_pack_start(GTK_BOX(hbox),b1,TRUE,TRUE,10);
gtk_signal_connect(GTK_OBJECT(b1),"clicked",
GTK_SIGNAL_FUNC(read_select_none), NULL);
define_tooltip(b1,_("Deselects all tracks of the currently inserted CD."));
gtk_widget_show(b1);
dummy = gtk_label_new("");
gtk_box_pack_start(GTK_BOX(hbox),dummy,FALSE,FALSE,10);
gtk_widget_show(dummy);
b1 = gtk_button_new_with_label(_("Read selected tracks"));
gtk_box_pack_start(GTK_BOX(hbox),b1,TRUE,TRUE,10);
gtk_widget_show(b1);
define_tooltip(b1,_("Reads all selected tracks from the CD and saves them in the Image Directory."));
gtk_signal_connect(GTK_OBJECT(b1), "clicked",
GTK_SIGNAL_FUNC(readsometracks_clicked), NULL);
/* left 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] = "";
titles[1] = _("Tracks");
list = gtk_clist_new_with_titles(2,titles);
gtk_container_add (GTK_CONTAINER (scrolled_win), list);
gtk_widget_realize(list);
clist = GTK_CLIST(list);
cdlist = clist;
gtk_signal_connect(GTK_OBJECT(clist), "select_row",
GTK_SIGNAL_FUNC(read_select_row),NULL);
gtk_signal_connect(GTK_OBJECT(clist), "unselect_row",
GTK_SIGNAL_FUNC(read_select_row),NULL);
gtk_clist_set_column_width(cdlist, 0, 16);
gtk_clist_set_column_auto_resize(cdlist, 1, TRUE);
if (setupdata.option_selectionmode == 0) {
gtk_clist_set_selection_mode (clist, GTK_SELECTION_MULTIPLE);
} else {
gtk_clist_set_selection_mode (clist, GTK_SELECTION_EXTENDED);
}
gtk_widget_show(list);
tbl = gtk_table_new(2,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(_("Label:"));
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(_("Selected:"));
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);
/* 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);
tbl = gtk_table_new(4,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(_("File prefix:"));
gtk_table_attach_defaults(GTK_TABLE(tbl),l1,0,4,0,1);
gtk_widget_show(l1);
e1 = gtk_entry_new();
imglist_l1 = e1;
gtk_signal_connect(GTK_OBJECT(e1), "activate",
GTK_SIGNAL_FUNC(set_image_prefix_callback),NULL);
gtk_table_attach_defaults(GTK_TABLE(tbl),e1,4,8,0,1);
gtk_widget_show(e1);
define_tooltip(e1, _("This is the prefix of the filenames of the tracks saved to the harddrive."));
l1 = rightjust_gtk_label_new(_("Free space:"));
gtk_table_attach_defaults(GTK_TABLE(tbl),l1,0,4,1,2);
gtk_widget_show(l1);
e1 = gtk_entry_new();
imglist_l2 = e1;
gtk_entry_set_editable(GTK_ENTRY(e1),FALSE);
gtk_table_attach_defaults(GTK_TABLE(tbl),e1,4,8,1,2);
gtk_widget_show(e1);
l1 = leftjust_gtk_label_new(_("biggest available block of that:"));
gtk_table_attach_defaults(GTK_TABLE(tbl),l1,1,8,2,3);
gtk_widget_show(l1);
e1 = gtk_entry_new();
imglist_l3 = e1;
gtk_entry_set_editable(GTK_ENTRY(e1),FALSE);
gtk_table_attach_defaults(GTK_TABLE(tbl),e1,4,8,3,4);
gtk_widget_show(e1);
/* options frame */
vbox = gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(f3),vbox);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
gtk_widget_show(vbox);
tbl = gtk_table_new(1,8,TRUE);
gtk_table_set_col_spacings(GTK_TABLE(tbl),10);
gtk_box_pack_start(GTK_BOX(vbox),tbl,FALSE,FALSE,10);
gtk_widget_show(tbl);
check = gtk_check_button_new_with_label(_("Do index scan"));
gtk_signal_connect(GTK_OBJECT(check),"clicked",
GTK_SIGNAL_FUNC(readoptions_selected),GINT_TO_POINTER(0));
gtk_table_attach_defaults(GTK_TABLE(tbl),check,1,8,0,1);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),
curset.indexscan);
define_tooltip(check, _("Scan the CD for indexes. If this option is enabled the copy will contain the same track indexes as the original CD. Please note that some drives may need a little time to scan."));
gtk_widget_show(check);
gtk_widget_show(actionspace);
/* fill entries */
fill_read_tracks(0);
}
/* fill the entries in the verify_tracks_menu */
void fill_verify_tracks(gint dontupdateimglist) {
gchar tmp[MAXLINE], tmp2[MAXLINE];
gchar titlestr[MAXLINE];
GList *loop;
GtkStyle *style;
gchar *data[2];
GdkPixmap *pixmap1, *pixmap2, *pixmap3;
GdkBitmap *mask1, *mask2, *mask3;
gchar basename[MAXLINE], imgdir[MAXLINE], fname[MAXLINE], *p;
gint lcount, count;
image_files_t *entry;
/* update cd-info */
if (curset.reader_devnr != -1) {
get_cd_toc_and_volid(curset.reader_devnr);
}
/* cd loaded? */
if (cdinfo.nr_tracks == -1) {
gtk_entry_set_text(GTK_ENTRY(vrylist_l1), _("No CD loaded"));
gtk_entry_set_text(GTK_ENTRY(vrylist_l2),"");
gtk_entry_set_text(GTK_ENTRY(vrylist_l3),"");
gtk_entry_set_text(GTK_ENTRY(vrylist_l4),"");
}
if (cdinfo.nr_tracks == -2) {
gtk_entry_set_text(GTK_ENTRY(vrylist_l1), return_media_type(curset.reader_devnr));
gtk_entry_set_text(GTK_ENTRY(vrylist_l2),"");
gtk_entry_set_text(GTK_ENTRY(vrylist_l3),"");
gtk_entry_set_text(GTK_ENTRY(vrylist_l4),"");
}
if (cdinfo.nr_tracks > 0) {
/* cd-type */
determine_cd_type(tmp,0);
gtk_entry_set_text(GTK_ENTRY(vrylist_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(vrylist_l2), tmp);
gtk_entry_set_position(GTK_ENTRY(vrylist_l2),0);
} else
if (cdinfo.cddb_dtitle != NULL) {
gtk_entry_set_text(GTK_ENTRY(vrylist_l2), cdinfo.cddb_dtitle);
gtk_entry_set_position(GTK_ENTRY(vrylist_l2),0);
} else {
gtk_entry_set_text(GTK_ENTRY(vrylist_l2),"");
}
/* cd-size */
convert_frames2mbminstring(cdinfo.total_size, tmp);
gtk_entry_set_text(GTK_ENTRY(vrylist_l3), tmp);
/* nr tracks */
g_snprintf(tmp,MAXLINE,"%d",cdinfo.nr_tracks);
gtk_entry_set_text(GTK_ENTRY(vrylist_l4), tmp);
}
/* now draw image-list */
if (dontupdateimglist) return;
/* 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);
data[0] = NULL;
strcpy(imgdir,"");
count = 1;
lcount = 0;
/* check image-selector */
if (curset.image_index != -1) {
/* no automatic setting? */
strncpy(imgdir,(gchar *)g_list_nth_data(setupdata.image_dirs,
curset.image_index), MAXLINE);
}
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);
if (strcmp(basename,imgdir) != 0 && imgdir[0] != '\0') {
/* skip not selected dirs */
loop = loop->next;
continue;
}
if (entry->readable == 0) {
/* dont display not readable files */
loop = loop->next;
continue;
}
strcpy(titlestr,"");
assign_trackname(titlestr, entry);
/* no title found - so use filename as title */
if (strcmp(titlestr,"") == 0) {
strcpy(titlestr,fname);
}
/* 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, titlestr, tmp2);
data[1] = convert_for_gtk2(tmp);
gtk_clist_append(imglist,data);
if (entry->type == 0) {
gtk_clist_set_pixmap(imglist,lcount,0,pixmap1,mask1);
} else {
gtk_clist_set_pixmap(imglist,lcount,0,pixmap3,mask3);
}
count++;
lcount++;
}
/* valid wav-file */
if (entry->type == 1) {
convert_frames2minstring((gint)((off_t)entry->size/CDDAFRAME), tmp2);
g_snprintf(tmp,MAXLINE,"%2d. %s [%s]",
count, titlestr, tmp2);
data[1] = convert_for_gtk2(tmp);
gtk_clist_append(imglist,data);
gtk_clist_set_pixmap(imglist,lcount,0,pixmap2,mask2);
lcount++;
count++;
}
loop = loop->next;
}
/* nothing selected - no size of files */
convert_kbytes2mbminstring(0, tmp);
gtk_entry_set_text(GTK_ENTRY(imglist_l1), tmp);
}
/* find out which trackfilename is in which row */
/* this is a little complicated because I have to recreate the
exact order of tracks as they are filled by fill_verify_tracks */
static gint get_trackname_from_row(gint row, gchar *tname) {
GList *loop;
image_files_t *entry;
gint count;
gchar basename[MAXLINE], imgdir[MAXLINE], fname[MAXLINE], *p;
strcpy(imgdir,"");
count = 0;
/* check image-selector */
if (curset.image_index != -1) {
/* no automatic setting? */
strncpy(imgdir,(gchar *)g_list_nth_data(setupdata.image_dirs,
curset.image_index), MAXLINE);
}
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);
if (strcmp(basename,imgdir) != 0 && imgdir[0] != '\0') {
/* skip not selected dirs */
loop = loop->next;
continue;
}
if (entry->readable == 0) {
/* dont display not readable files */
loop = loop->next;
continue;
}
if (entry->type == 0 || entry->type == 3 || entry->type == 1) {
/* matching row found */
if (count == row) {
strcpy(tname, entry->path);
return 0;
}
count++;
}
loop = loop->next;
}
/* no match */
return 1;
}
/* update currently selected track-sizes */
static void update_verify_size(gint clickrow) {
GList *sel;
gint row;
gint sizecount;
gchar tmp[MAXLINE];
sizecount = 0;
/* loop through all selected tracks */
sel = imglist->selection;
while (sel) {
row = GPOINTER_TO_INT(sel->data);
if (get_trackname_from_row(row, tmp) == 0) {
/* we get now the full track-filename in tmp */
/* now get its size (in bytes) */
sizecount+=(gint) ((off_t)get_size_from_imagelist(tmp) >>10);
}
sel = sel->next;
}
convert_kbytes2mbminstring(sizecount, tmp);
gtk_entry_set_text(GTK_ENTRY(imglist_l1), tmp);
}
/* callbacks for verify menu */
static void verifysometracks_clicked(GtkWidget *widget, gpointer data) {
track_read_param_t *trackparam;
GList *sellist;
gfloat per;
gint tcount, sizecount,nrtracks;
gint tracknr, size, type, sectorstoread;
GList *sel;
gint row, stat, stat2, abort;
gchar tmp[MAXLINE];
gchar volname[MAXLINE];
gchar *cell;
gchar *pt;
/* 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;
}
/* now check if our cd-information is still valid */
get_cd_toc_and_volid(curset.reader_devnr);
/* update screen ... */
fill_verify_tracks(1);
/* cd loaded? */
if (cdinfo.nr_tracks < 0) {
show_dialog(ICO_WARN,_("No CD loaded in read device"),T_OK,NULL,NULL,0);
return;
}
sizecount = 0;
nrtracks = 0;
/* loop through all selected tracks to get number */
sel = imglist->selection;
while (sel) {
row = GPOINTER_TO_INT(sel->data);
nrtracks++;
sel = sel->next;
}
/* no tracks selected */
if (nrtracks == 0) {
show_dialog(ICO_WARN,_("No tracks selected"),T_OK,NULL,NULL,0);
return;
}
/* check if all the tracks selected match the current cd */
abort = 0;
sellist = NULL;
sel = imglist->selection;
while (sel) {
row = GPOINTER_TO_INT(sel->data);
if (get_trackname_from_row(row, tmp) == 0) {
/* we get now the full track-filename in tmp */
/* check if track can be verified */
stat = check_vrfy_track(tmp);
stat2 = 0;
/* get image-title from list */
gtk_clist_get_text(imglist,row,1,&cell);
if (stat == 0) {
/* all ok */
sel = sel->next;
continue;
}
if (stat == 1) {
/* no info file */
/* perhaps its a self-mastered track? */
if (get_volname_from_imagelist(tmp,volname) == 0) {
if (cdinfo.nr_tracks == 1) {
pt = trackinfo[0]->volname;
if (pt) {
if (strcmp(volname,pt) == 0) {
/* ah nice, the isoname of the track does match the CD - allow verifying */
sel = sel->next;
continue;
}
} else {
/* special case, no volname at all set by both */
if (strcmp(volname,"") == 0) {
sel = sel->next;
continue;
}
}
}
}
g_snprintf(tmp,MAXLINE,_("No Info-file found for track \"%s\".\nTherefore verification is impossible.\nUnselecting this track..."),cell);
stat2 = show_dialog(ICO_WARN,tmp,T_OK,T_CANCEL,_("Verify anyway"),0);
}
if (stat == 2) {
/* track does not match to cd */
g_snprintf(tmp,MAXLINE,_("Track \"%s\" does\nnot fit to the currently inserted CD. Therefore verification\nis impossible. Unselecting this track..."),cell);
stat2 = show_dialog(ICO_WARN,tmp,T_OK,T_CANCEL,NULL,0);
}
if (stat == 3) {
/* dont verify audio */
g_snprintf(tmp,MAXLINE,_("Can't verify audio track \"%s\"\nbecause you choose not to verify audio tracks.\nUnselecting this track..."),cell);
stat2 = show_dialog(ICO_WARN,tmp,T_OK,T_CANCEL,NULL,0);
}
/* aborting selected */
if (stat2 == 1) {
abort = 1;
break;
}
/* no info file, but verify anyway */
if (stat2 == 2) {
sel = sel->next;
continue;
}
/* save track nr - we are not allowed to
unselect tracks while we parsing the
selection itself */
sellist = g_list_append(sellist, GINT_TO_POINTER(row));
}
sel = sel->next;
}
/* unselect all not fitting tracks */
sel = g_list_first(sellist);
while (sel) {
row = GPOINTER_TO_INT(sel->data);
gtk_clist_unselect_row(imglist, row, 0);
sel = sel->next;
}
g_list_free(sellist);
/* user aborted? */
if (abort) return;
/* now check if any tracks are still selected */
/* and calculate sum of size */
sizecount = 0;
nrtracks = 0;
/* loop through all selected tracks to get number */
sel = imglist->selection;
while (sel) {
row = GPOINTER_TO_INT(sel->data);
if (get_trackname_from_row(row, tmp) == 0) {
/* we get now the full track-filename in tmp */
/* now get its size (in bytes) */
sizecount+=(gint) ((off_t)get_size_from_imagelist(tmp) >> 10);
}
nrtracks++;
sel = sel->next;
}
/* no tracks selected */
if (nrtracks == 0) {
show_dialog(ICO_WARN,_("No tracks selected"),T_OK,NULL,NULL,0);
return;
}
/* so...if we are here, we have at least one selected track
that matches our CD */
/* free structure first */
clear_trackreadset();
/* fill structure */
trackreadset.nrtracks = nrtracks;
tcount = 0;
sel = imglist->selection;
while (sel) {
row = GPOINTER_TO_INT(sel->data);
if (get_trackname_from_row(row, tmp) != 0) {
sel = sel->next; continue;
}
/* we get now the full track-filename in tmp */
tracknr = get_tracknr_from_imagelist(tmp);
if (get_type_from_imagelist(tmp) == 1) {
/* audio */
type = 1;
} else {
/* data */
type = 0;
}
size = (gint) ((off_t)get_size_from_imagelist(tmp) >> 10);
/* no info-file, therefore tracknr 0 */
if (tracknr == 0) {
/* we can only guess what the track could be -
track 1 seems to be the most sensible choice */
tracknr = 1;
}
/* allocate memory */
trackparam = g_new0(track_read_param_t,1);
trackparam->trackinfo_index = tracknr-1;
trackparam->starttrack = tracknr;
trackparam->endtrack = 0;
trackparam->tracktype = type;
per = (gfloat)size / sizecount;
trackparam->percent = per;
g_free(trackparam->trackfile);
trackparam->trackfile = g_strdup(tmp);
if (type == 0) {
/* data track */
trackparam->kbyte = trackinfo[tracknr-1]->size *
(DATASECTORSIZE/1024);
trackparam->frames = trackinfo[tracknr-1]->size;
trackparam->startoffset = trackinfo[tracknr-1]->start_sec;
if (tracknr-1 == 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[tracknr]->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[tracknr-1]->isosize) {
trackparam->endoffset =
trackparam->startoffset +
trackinfo[tracknr-1]->isosize;
trackparam->kbyte = trackinfo[tracknr-1]->isosize * 2;
dodebug(1,"verifysometracks_clicked: corrected data track size from %d to %d sectors.\n", sectorstoread, trackinfo[tracknr-1]->isosize);
}
} else {
/* audio */
trackparam->kbyte = trackinfo[tracknr-1]->size *
CDDAFRAME/1024;
trackparam->frames = trackinfo[tracknr-1]->size;
}
trackreadset.trackparams = g_list_append(
trackreadset.trackparams, trackparam);
sel = sel->next;
}
/* assign an empty toc-filename */
g_free(trackreadset.tocfile);
trackreadset.tocfile = g_strdup("");
/* now all parameters for verifying are set - lets begin */
show_and_do_verify_tracks(curset.reader_devnr);
}
static void verify_select_all(GtkWidget *widget, gpointer data) {
gtk_clist_select_all(imglist);
}
static void verify_select_none(GtkWidget *widget, gpointer data) {
gtk_clist_unselect_all(imglist);
}
static void verify_select_row(GtkWidget *clist, gint row, gint col,
GdkEventButton *event, gpointer data) {
update_verify_size(row);
}
/* draw verify-tracks menu */
static void draw_verify_tracks() {
GtkWidget *hbox, *vbox;
GtkWidget *f1, *f2, *f3;
GtkWidget *b1;
GtkWidget *e1;
GtkWidget *l1, *dummy;
GtkWidget *tbl, *check;
gchar *titles[2];
GtkWidget *scrolled_win, *img_list;
/* 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(2,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-2,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, 1);
devices_setup_image(1, tbl);
/* 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);
vbox = gtk_vbox_new(FALSE,10);
gtk_table_attach_defaults(GTK_TABLE(tbl),vbox,0,1,0,1);
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_box_pack_start(GTK_BOX(vbox),f1,TRUE,TRUE,0);
gtk_widget_show(f1);
f3 = gtk_frame_new(_("Verify options"));
set_font_and_color_frame(f3,BOLDFONT,NULL);
gtk_box_pack_start(GTK_BOX(vbox),f3,FALSE,FALSE,0);
gtk_widget_show(f3);
f2 = gtk_frame_new(_("Tracks to verify"));
set_font_and_color_frame(f2,BOLDFONT,NULL);
gtk_table_attach_defaults(GTK_TABLE(tbl),f2,1,2,0,1);
gtk_widget_show(f2);
gtk_widget_show(vbox);
/* button bar at the bottom */
hbox = gtk_hbox_new(FALSE,5);
gtk_box_pack_start(GTK_BOX(actionspace),hbox,FALSE,TRUE,10);
gtk_widget_show(hbox);
b1 = gtk_button_new_with_label(_("Select all"));
gtk_box_pack_start(GTK_BOX(hbox),b1,TRUE,TRUE,10);
gtk_signal_connect(GTK_OBJECT(b1),"clicked",
GTK_SIGNAL_FUNC(verify_select_all), NULL);
define_tooltip(b1,_("Selects all displayed images on the harddrive for verifying."));
gtk_widget_show(b1);
b1 = gtk_button_new_with_label(_("Select none"));
gtk_box_pack_start(GTK_BOX(hbox),b1,TRUE,TRUE,10);
gtk_signal_connect(GTK_OBJECT(b1),"clicked",
GTK_SIGNAL_FUNC(verify_select_none), NULL);
define_tooltip(b1,_("Deselects all displayed images."));
gtk_widget_show(b1);
dummy = gtk_label_new("");
gtk_box_pack_start(GTK_BOX(hbox),dummy,FALSE,FALSE,10);
gtk_widget_show(dummy);
b1 = gtk_button_new_with_label(_("Verify selected tracks"));
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(verifysometracks_clicked), NULL);
define_tooltip(b1,_("If the images do match the currently inserted CD, start to read the images again and compare them with their copies on the harddrive."));
/* 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);
tbl = gtk_table_new(4,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();
vrylist_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();
vrylist_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();
vrylist_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);
l1 = rightjust_gtk_label_new(_("Tracks:"));
gtk_table_attach_defaults(GTK_TABLE(tbl),l1,0,2,3,4);
gtk_widget_show(l1);
e1 = gtk_entry_new();
vrylist_l4 = e1;
gtk_entry_set_editable(GTK_ENTRY(e1),FALSE);
gtk_table_attach_defaults(GTK_TABLE(tbl),e1,2,8,3,4);
gtk_widget_show(e1);
/* options frame */
vbox = gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(f3),vbox);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
gtk_widget_show(vbox);
tbl = gtk_table_new(2,8,TRUE);
gtk_table_set_col_spacings(GTK_TABLE(tbl),10);
gtk_box_pack_start(GTK_BOX(vbox),tbl,FALSE,FALSE,10);
gtk_widget_show(tbl);
check = gtk_check_button_new_with_label(_("Don't verify audio tracks"));
gtk_signal_connect(GTK_OBJECT(check),"clicked",
GTK_SIGNAL_FUNC(verifyoptions_selected),GINT_TO_POINTER(0));
gtk_table_attach_defaults(GTK_TABLE(tbl),check,1,8,0,1);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),
curset.noaudioverify);
gtk_widget_show(check);
define_tooltip(check, _("Skips verification of audio tracks, because a lot of CD readers are not able to read audio data reliably."));
check = gtk_check_button_new_with_label(_("Abort after verify fail"));
gtk_signal_connect(GTK_OBJECT(check),"clicked",
GTK_SIGNAL_FUNC(verifyoptions_selected),GINT_TO_POINTER(1));
gtk_table_attach_defaults(GTK_TABLE(tbl),check,1,8,1,2);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),
curset.verifyfailabort);
gtk_widget_show(check);
define_tooltip(check, _("Abort Verifying when one mismatch was found. Otherwise X-CD-Roast does continue to verify the other tracks anyway."));
/* right 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_container_add (GTK_CONTAIN