Filewatcher File Search
FTP Search
  
Directory (beta)
  
Content Search (beta)
   
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
Results 1 - 1
Help - FTP Sites List - Software Dir.
Searching half a billion files worldwide
© 1997-2008 IT MARUHN