diff -w -b -B -u -U 5 -r -P -x *~ -x *.pot -x po2tbl.sed -x cat-id-tbl.c gtk+-1.2.9/gtk/gtkfilesel.c gtk+-1.2.9.quicklink/gtk/gtkfilesel.c --- gtk+-1.2.9/gtk/gtkfilesel.c Fri Feb 16 05:36:19 2001 +++ gtk+-1.2.9.quicklink/gtk/gtkfilesel.c Fri Mar 9 14:18:24 2001 @@ -54,10 +54,55 @@ #include "gtkoptionmenu.h" #include "gtkclist.h" #include "gtkdialog.h" #include "gtkintl.h" +/*doj*/ +#include "gtkpixmap.h" + +static char * quicklink_left_xpm[] = { + "7 10 5 1", + " c None", + ". c #FFAAAA", + "+ c #FF7777", + "@ c #FF0000", + "# c #B70000", + " .+ ", + " .@# ", + " .@@# ", + " .@@@# ", + ".@@@@# ", + "+@@@@# ", + " #@@@# ", + " #@@# ", + " #@# ", + " ## "}; + +static char * quicklink_right_xpm[] = { + "7 10 5 1", + " c None", + ". c #FFAAAA", + "+ c #FF0000", + "@ c #FF7777", + "# c #B70000", + ".. ", + ".+@ ", + ".++@ ", + ".+++@ ", + ".++++@ ", + ".++++# ", + ".+++# ", + ".++# ", + ".+# ", + "@# "}; + +static char *quicklink_configfile=".quicklinkrc"; + +#define QUICKLINK_LIST_WIDTH 180 +#define QUICKLINK_LIST_HEIGHT 180 +/*doj*/ + #define DIR_LIST_WIDTH 180 #define DIR_LIST_HEIGHT 180 #define FILE_LIST_WIDTH 180 #define FILE_LIST_HEIGHT 180 @@ -333,11 +378,22 @@ static void gtk_file_selection_create_dir (GtkWidget *widget, gpointer data); static void gtk_file_selection_delete_file (GtkWidget *widget, gpointer data); static void gtk_file_selection_rename_file (GtkWidget *widget, gpointer data); - +/*doj*/ +static void quicklink_chdir(GtkCList *clist, + gint row, + gint column, + GdkEventButton *event, + gpointer data); +static void quicklink_toggle_button(GtkWidget *widget, gpointer data); +static void quicklink_remove(GtkWidget *widget, gpointer data); +static void quicklink_add(GtkWidget *widget, gpointer data); +static void quicklink_free_dirlist(GtkFileSelection *fs); +static void quicklink_readconfig(GtkFileSelection *fs); +/*doj*/ static GtkWindowClass *parent_class = NULL; /* Saves errno when something cmpl does fails. */ static gint cmpl_errno; @@ -389,45 +445,155 @@ GtkWidget *pulldown_hbox; GtkWidget *scrolled_win; char *dir_title [2]; char *file_title [2]; + char *ql_title[2]; /*doj*/ filesel->cmpl_state = cmpl_init_state (); /* The dialog-sized vertical box */ - filesel->main_vbox = gtk_vbox_new (FALSE, 10); + filesel->main_vbox = gtk_vbox_new (FALSE, 5); gtk_container_set_border_width (GTK_CONTAINER (filesel), 10); gtk_container_add (GTK_CONTAINER (filesel), filesel->main_vbox); gtk_widget_show (filesel->main_vbox); /* The horizontal box containing create, rename etc. buttons */ filesel->button_area = gtk_hbutton_box_new (); - gtk_button_box_set_layout(GTK_BUTTON_BOX(filesel->button_area), GTK_BUTTONBOX_START); + gtk_button_box_set_layout(GTK_BUTTON_BOX(filesel->button_area), + GTK_BUTTONBOX_START); gtk_button_box_set_spacing(GTK_BUTTON_BOX(filesel->button_area), 0); gtk_box_pack_start (GTK_BOX (filesel->main_vbox), filesel->button_area, FALSE, FALSE, 0); gtk_widget_show (filesel->button_area); - gtk_file_selection_show_fileop_buttons(filesel); + /*doj*/ + /* Add Dir to QL */ + filesel->quicklink_add=gtk_button_new_with_label(_("Add Dir to QL")); + gtk_box_pack_start(GTK_BOX (filesel->button_area), filesel->quicklink_add, + FALSE, FALSE, 0); + gtk_signal_connect (GTK_OBJECT (filesel->quicklink_add), "clicked", + (GtkSignalFunc) quicklink_add, + (gpointer) filesel); + + /* Remove Dir from QL */ + filesel->quicklink_rem=gtk_button_new_with_label(_("Remove Dir from QL")); + gtk_box_pack_start(GTK_BOX (filesel->button_area), filesel->quicklink_rem, + FALSE, FALSE, 0); + gtk_signal_connect (GTK_OBJECT (filesel->quicklink_rem), "clicked", + (GtkSignalFunc) quicklink_remove, + (gpointer) filesel); + /*doj*/ + + /* Create Directory */ + filesel->fileop_c_dir = gtk_button_new_with_label (_("Create Dir")); + gtk_signal_connect (GTK_OBJECT (filesel->fileop_c_dir), "clicked", + (GtkSignalFunc) gtk_file_selection_create_dir, + (gpointer) filesel); + gtk_box_pack_start (GTK_BOX (filesel->button_area), + filesel->fileop_c_dir, TRUE, TRUE, 0); + + /* Delete File */ + filesel->fileop_del_file = gtk_button_new_with_label (_("Delete File")); + gtk_signal_connect (GTK_OBJECT (filesel->fileop_del_file), "clicked", + (GtkSignalFunc) gtk_file_selection_delete_file, + (gpointer) filesel); + gtk_box_pack_start (GTK_BOX (filesel->button_area), + filesel->fileop_del_file, TRUE, TRUE, 0); + + /* Rename File */ + filesel->fileop_ren_file = gtk_button_new_with_label (_("Rename File")); + gtk_signal_connect (GTK_OBJECT (filesel->fileop_ren_file), "clicked", + (GtkSignalFunc) gtk_file_selection_rename_file, + (gpointer) filesel); + gtk_box_pack_start (GTK_BOX (filesel->button_area), + filesel->fileop_ren_file, TRUE, TRUE, 0); /* hbox for pulldown menu */ pulldown_hbox = gtk_hbox_new (TRUE, 5); - gtk_box_pack_start (GTK_BOX (filesel->main_vbox), pulldown_hbox, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (filesel->main_vbox), pulldown_hbox, + FALSE, FALSE, 0); gtk_widget_show (pulldown_hbox); /* Pulldown menu */ filesel->history_pulldown = gtk_option_menu_new (); gtk_widget_show (filesel->history_pulldown); gtk_box_pack_start (GTK_BOX (pulldown_hbox), filesel->history_pulldown, FALSE, FALSE, 0); /* The horizontal box containing the directory and file listboxes */ list_hbox = gtk_hbox_new (FALSE, 5); - gtk_box_pack_start (GTK_BOX (filesel->main_vbox), list_hbox, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (filesel->main_vbox), list_hbox, + TRUE, TRUE, 0); gtk_widget_show (list_hbox); + /*doj*/ + /* box where all quicklink widget reside */ + filesel->quicklink_mainbox=gtk_hbox_new(FALSE, 0); + gtk_widget_show(filesel->quicklink_mainbox); + gtk_box_pack_start(GTK_BOX(list_hbox), filesel->quicklink_mainbox, + TRUE, TRUE, 0); + gtk_container_set_border_width(GTK_CONTAINER(filesel->quicklink_mainbox), 5); + + /* quicklink toggle button */ + filesel->quicklink_toggle=gtk_button_new(); + gtk_widget_show(filesel->quicklink_toggle); + gtk_box_pack_start(GTK_BOX (filesel->quicklink_mainbox), filesel->quicklink_toggle, + FALSE, TRUE, 0); + gtk_signal_connect (GTK_OBJECT (filesel->quicklink_toggle), "clicked", + (GtkSignalFunc) quicklink_toggle_button, + (gpointer) filesel); + + /* the box to hold the two pixmaps */ + filesel->quicklink_toggle_box=gtk_hbox_new(TRUE,0); + gtk_container_add(GTK_CONTAINER(filesel->quicklink_toggle), + filesel->quicklink_toggle_box); + gtk_widget_show(filesel->quicklink_toggle_box); + + /* the colormap used to create pixmaps */ + filesel->quicklink_toggle_cm=gtk_widget_get_colormap(filesel->quicklink_toggle); + + /* the two gdk pixmaps */ + filesel->quicklink_toggle_pixLeft=gdk_pixmap_colormap_create_from_xpm_d(NULL, filesel->quicklink_toggle_cm, &filesel->quicklink_toggle_maskLeft, NULL, quicklink_left_xpm); + + filesel->quicklink_toggle_pixRight=gdk_pixmap_colormap_create_from_xpm_d(NULL, filesel->quicklink_toggle_cm, &filesel->quicklink_toggle_maskRight, NULL, quicklink_right_xpm); + + /* finally the two gtk pixmaps widgets */ + filesel->quicklink_toggle_pixmapLeft=gtk_pixmap_new(filesel->quicklink_toggle_pixLeft, + filesel->quicklink_toggle_maskLeft); + gtk_box_pack_start_defaults(GTK_BOX(filesel->quicklink_toggle_box), + filesel->quicklink_toggle_pixmapLeft); + + filesel->quicklink_toggle_pixmapRight=gtk_pixmap_new(filesel->quicklink_toggle_pixRight, + filesel->quicklink_toggle_maskRight); + gtk_box_pack_start_defaults(GTK_BOX(filesel->quicklink_toggle_box), + filesel->quicklink_toggle_pixmapRight); + + /* Scrollpane */ + filesel->quicklink_scrollpane=gtk_scrolled_window_new(NULL, NULL); + gtk_box_pack_start_defaults(GTK_BOX (filesel->quicklink_mainbox), + filesel->quicklink_scrollpane); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (filesel->quicklink_scrollpane), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + + /* List */ + ql_title[0] = _("Quick Links"); + ql_title[1] = NULL; + filesel->quicklink_clist=gtk_clist_new_with_titles(1, ql_title); + gtk_widget_set_usize (filesel->quicklink_clist, + QUICKLINK_LIST_WIDTH, QUICKLINK_LIST_HEIGHT); + gtk_widget_show(filesel->quicklink_clist); + gtk_container_add(GTK_CONTAINER(filesel->quicklink_scrollpane), + filesel->quicklink_clist); + gtk_clist_set_selection_mode (GTK_CLIST(filesel->quicklink_clist), + GTK_SELECTION_SINGLE); + gtk_clist_column_title_passive(GTK_CLIST(filesel->quicklink_clist), 0); + gtk_signal_connect (GTK_OBJECT (filesel->quicklink_clist), "select-row", + (GtkSignalFunc) quicklink_chdir, + (gpointer) filesel); + /*doj*/ + /* The directories clist */ dir_title[0] = _("Directories"); dir_title[1] = NULL; filesel->dir_list = gtk_clist_new_with_titles (1, (gchar**) dir_title); gtk_widget_set_usize (filesel->dir_list, DIR_LIST_WIDTH, DIR_LIST_HEIGHT); @@ -439,11 +605,12 @@ scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_container_add (GTK_CONTAINER (scrolled_win), filesel->dir_list); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5); - gtk_box_pack_start (GTK_BOX (list_hbox), scrolled_win, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (list_hbox), scrolled_win, + TRUE, TRUE, 0); gtk_widget_show (filesel->dir_list); gtk_widget_show (scrolled_win); /* The files clist */ file_title[0] = _("Files"); @@ -458,43 +625,52 @@ scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_container_add (GTK_CONTAINER (scrolled_win), filesel->file_list); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5); - gtk_box_pack_start (GTK_BOX (list_hbox), scrolled_win, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (list_hbox), scrolled_win, + TRUE, TRUE, 0); gtk_widget_show (filesel->file_list); gtk_widget_show (scrolled_win); + /* the OK/Cancel Button area and the Selection Box are packed to the end + of filesel->main_vbox, because some programs (Gimp) don't insert + into the action area, but directly into filesel->main_vbox + */ /* action area for packing buttons into. */ filesel->action_area = gtk_hbox_new (TRUE, 0); gtk_box_pack_start (GTK_BOX (filesel->main_vbox), filesel->action_area, FALSE, FALSE, 0); gtk_widget_show (filesel->action_area); - /* The OK/Cancel button area */ + /* The OK/Cancel button area (packed later, but needed here) */ confirm_area = gtk_hbutton_box_new (); gtk_button_box_set_layout(GTK_BUTTON_BOX(confirm_area), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(confirm_area), 5); - gtk_box_pack_end (GTK_BOX (filesel->main_vbox), confirm_area, FALSE, FALSE, 0); gtk_widget_show (confirm_area); + gtk_box_pack_end(GTK_BOX (filesel->main_vbox), confirm_area, + FALSE, FALSE, 0); /* The OK button */ filesel->ok_button = gtk_button_new_with_label (_("OK")); GTK_WIDGET_SET_FLAGS (filesel->ok_button, GTK_CAN_DEFAULT); - gtk_box_pack_start (GTK_BOX (confirm_area), filesel->ok_button, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (confirm_area), filesel->ok_button, + TRUE, TRUE, 0); gtk_widget_grab_default (filesel->ok_button); gtk_widget_show (filesel->ok_button); /* The Cancel button */ filesel->cancel_button = gtk_button_new_with_label (_("Cancel")); GTK_WIDGET_SET_FLAGS (filesel->cancel_button, GTK_CAN_DEFAULT); - gtk_box_pack_start (GTK_BOX (confirm_area), filesel->cancel_button, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (confirm_area), filesel->cancel_button, + TRUE, TRUE, 0); gtk_widget_show (filesel->cancel_button); /* The selection entry widget */ entry_vbox = gtk_vbox_new (FALSE, 2); - gtk_box_pack_end (GTK_BOX (filesel->main_vbox), entry_vbox, FALSE, FALSE, 0); + gtk_box_pack_end(GTK_BOX (filesel->main_vbox), entry_vbox, + FALSE, FALSE, 0); gtk_widget_show (entry_vbox); filesel->selection_text = label = gtk_label_new (""); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_box_pack_start (GTK_BOX (entry_vbox), label, FALSE, FALSE, 0); @@ -507,110 +683,97 @@ (GtkSignalFunc) gtk_widget_grab_default, GTK_OBJECT (filesel->ok_button)); gtk_signal_connect_object (GTK_OBJECT (filesel->selection_entry), "activate", (GtkSignalFunc) gtk_button_clicked, GTK_OBJECT (filesel->ok_button)); - gtk_box_pack_start (GTK_BOX (entry_vbox), filesel->selection_entry, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (entry_vbox), filesel->selection_entry, + TRUE, TRUE, 0); gtk_widget_show (filesel->selection_entry); if (!cmpl_state_okay (filesel->cmpl_state)) { gchar err_buf[256]; - - sprintf (err_buf, _("Directory unreadable: %s"), cmpl_strerror (cmpl_errno)); - + g_snprintf(err_buf, 256, _("Directory unreadable: %s"), cmpl_strerror (cmpl_errno)); gtk_label_set_text (GTK_LABEL (filesel->selection_text), err_buf); } else { gtk_file_selection_populate (filesel, "", FALSE); } + /*doj*/ + /* more stuff to initialize */ + filesel->quicklink_toggle_state=TRUE; + gtk_file_selection_show_fileop_buttons(filesel); + quicklink_readconfig(filesel); + quicklink_toggle_button(NULL, (gpointer)filesel); + /*doj*/ + + /* finished */ gtk_widget_grab_focus (filesel->selection_entry); } GtkWidget* gtk_file_selection_new (const gchar *title) { GtkFileSelection *filesel; filesel = gtk_type_new (GTK_TYPE_FILE_SELECTION); gtk_window_set_title (GTK_WINDOW (filesel), title); + gtk_window_set_policy(GTK_WINDOW(filesel), FALSE, TRUE, TRUE); return GTK_WIDGET (filesel); } void gtk_file_selection_show_fileop_buttons (GtkFileSelection *filesel) { g_return_if_fail (filesel != NULL); g_return_if_fail (GTK_IS_FILE_SELECTION (filesel)); - /* delete, create directory, and rename */ - if (!filesel->fileop_c_dir) + /*doj*/ + if(!filesel->fileop_show) { - filesel->fileop_c_dir = gtk_button_new_with_label (_("Create Dir")); - gtk_signal_connect (GTK_OBJECT (filesel->fileop_c_dir), "clicked", - (GtkSignalFunc) gtk_file_selection_create_dir, - (gpointer) filesel); - gtk_box_pack_start (GTK_BOX (filesel->button_area), - filesel->fileop_c_dir, TRUE, TRUE, 0); - gtk_widget_show (filesel->fileop_c_dir); - } - - if (!filesel->fileop_del_file) + if(filesel->quicklink_toggle_state) { - filesel->fileop_del_file = gtk_button_new_with_label (_("Delete File")); - gtk_signal_connect (GTK_OBJECT (filesel->fileop_del_file), "clicked", - (GtkSignalFunc) gtk_file_selection_delete_file, - (gpointer) filesel); - gtk_box_pack_start (GTK_BOX (filesel->button_area), - filesel->fileop_del_file, TRUE, TRUE, 0); - gtk_widget_show (filesel->fileop_del_file); + gtk_widget_show(filesel->quicklink_add); + gtk_widget_show(filesel->quicklink_rem); } - if (!filesel->fileop_ren_file) - { - filesel->fileop_ren_file = gtk_button_new_with_label (_("Rename File")); - gtk_signal_connect (GTK_OBJECT (filesel->fileop_ren_file), "clicked", - (GtkSignalFunc) gtk_file_selection_rename_file, - (gpointer) filesel); - gtk_box_pack_start (GTK_BOX (filesel->button_area), - filesel->fileop_ren_file, TRUE, TRUE, 0); + gtk_widget_show (filesel->fileop_c_dir); + gtk_widget_show (filesel->fileop_del_file); gtk_widget_show (filesel->fileop_ren_file); - } - gtk_widget_queue_resize(GTK_WIDGET(filesel)); + filesel->fileop_show=TRUE; + } + /*doj*/ } void gtk_file_selection_hide_fileop_buttons (GtkFileSelection *filesel) { g_return_if_fail (filesel != NULL); g_return_if_fail (GTK_IS_FILE_SELECTION (filesel)); - if (filesel->fileop_ren_file) + /*doj*/ + if(filesel->fileop_show) { - gtk_widget_destroy (filesel->fileop_ren_file); - filesel->fileop_ren_file = NULL; - } - - if (filesel->fileop_del_file) + if(filesel->quicklink_toggle_state) { - gtk_widget_destroy (filesel->fileop_del_file); - filesel->fileop_del_file = NULL; + gtk_widget_hide(filesel->quicklink_add); + gtk_widget_hide(filesel->quicklink_rem); } - if (filesel->fileop_c_dir) - { - gtk_widget_destroy (filesel->fileop_c_dir); - filesel->fileop_c_dir = NULL; + gtk_widget_hide(filesel->fileop_c_dir); + gtk_widget_hide(filesel->fileop_del_file); + gtk_widget_hide(filesel->fileop_ren_file); + + filesel->fileop_show=FALSE; } + /*doj*/ } - - void gtk_file_selection_set_filename (GtkFileSelection *filesel, const gchar *filename) { char buf[MAXPATHLEN]; @@ -706,10 +869,12 @@ } cmpl_free_state (filesel->cmpl_state); filesel->cmpl_state = NULL; + quicklink_free_dirlist(filesel); /*doj*/ + if (GTK_OBJECT_CLASS (parent_class)->destroy) (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); } /* Begin file operations callbacks */ @@ -2769,6 +2934,334 @@ { if(err == CMPL_ERRNO_TOO_LONG) return "Name too long"; else return g_strerror (err); +} + +/* strips a trailing / of str */ +static void +quicklink_stripslash(char *str) +{ + gint i; + + g_return_if_fail(str != NULL); + + i=strlen(str); + if(i>1) + { + if(str[i-1]=='/') + str[i-1]=0; + } +} + +/* clear the dirlist */ +static void +quicklink_free_dirlist(GtkFileSelection *fs) +{ + /* assertions checks */ + g_return_if_fail (fs != NULL); + g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); + + /* clear list */ + g_list_foreach(fs->quicklink_dirlist, + (GFunc)g_free, + NULL); + g_list_free(fs->quicklink_dirlist); + fs->quicklink_dirlist=NULL; +} + +/* check if dirname is a directory */ +static gboolean +quicklink_isdir(const char *dirname) +{ + struct stat buf; + + g_return_val_if_fail(dirname != NULL, FALSE); + + if(stat(dirname, &buf) < 0) + g_warning("gtkfileselection.c:quicklink_isdir(): could not stat %s: %s", dirname, strerror(errno)); + else + if(S_ISDIR(buf.st_mode)) + return TRUE; + + return FALSE; +} + +/* add *item into the gtk widget clist + used with the foreach() loop of GList +*/ +static void +quicklink_clist_add(gchar *item, GtkFileSelection *fs) +{ + gint row; + + g_return_if_fail(item != NULL); + g_return_if_fail(fs != NULL); + g_return_if_fail(GTK_IS_FILE_SELECTION(fs)); + + row=gtk_clist_append(GTK_CLIST(fs->quicklink_clist), &item); + gtk_clist_set_row_data(GTK_CLIST(fs->quicklink_clist), row, item); +} + +static void +quicklink_readconfig(GtkFileSelection *fs) +{ + gchar filename[PATH_MAX]; + FILE *f; + + g_return_if_fail(fs != NULL); + g_return_if_fail(GTK_IS_FILE_SELECTION(fs)); + + /* get the correct filename and open it */ + g_snprintf(filename, PATH_MAX, "%s/%s", g_get_home_dir(), quicklink_configfile); + f=fopen(filename, "r"); + if(f==NULL) + g_warning("gtkfilesel.c:quicklink_readconfig(): could not open %s/%s: %s", + g_get_home_dir(), quicklink_configfile, + strerror(errno)); + else + { + /* clear clist widget */ + gtk_clist_freeze(GTK_CLIST(fs->quicklink_clist)); + gtk_clist_clear(GTK_CLIST(fs->quicklink_clist)); + /* clear glist */ + quicklink_free_dirlist(fs); + + /* read the config file */ + while(!feof(f) && !ferror(f)) + { + fgets(filename, PATH_MAX, f); /* read one line */ + if(feof(f)) /* file end ? */ + break; + + g_strchomp(filename); /* strip newline */ + quicklink_stripslash(filename); + + /* check if directory */ + if(quicklink_isdir(filename)) + fs->quicklink_dirlist=g_list_append(fs->quicklink_dirlist, + g_strdup(filename)); + else + g_warning("gtkfilesel.c:quicklink_readconfig(): could not add %s to quicklink: no directory\n", filename); + + } /* while(!feof(f) && !ferror(f)) */ + + if(fclose(f) < 0) + g_warning("gtkfilesel.c:quicklink_readconfig(): could not close %s/%s: %s", + g_get_home_dir(), quicklink_configfile, + strerror(errno)); + + /* and fill with the new list */ + g_list_foreach(fs->quicklink_dirlist, + (GFunc)quicklink_clist_add, + fs); + gtk_clist_thaw(GTK_CLIST(fs->quicklink_clist)); + fs->quicklink_clist_row=-1; + } +} + +/* write an entry into the config file + used with the foreach() loop of GList +*/ +static void +quicklink_writeconfig_anitem(gchar *item, FILE *f) +{ + g_return_if_fail(item != NULL); + g_return_if_fail(f != NULL); + + fprintf(f, "%s\n", item); +} + +/* write the current config */ +static void +quicklink_writeconfig(GtkFileSelection *fs) +{ + gchar filename[PATH_MAX]; + FILE *f; + + g_return_if_fail(fs != NULL); + g_return_if_fail(GTK_IS_FILE_SELECTION(fs)); + + /* get the correct filename and open it */ + g_snprintf(filename, PATH_MAX, "%s/%s", g_get_home_dir(), quicklink_configfile); + f=fopen(filename, "w"); + if(f==NULL) + g_warning("gtkfilesel.c:quicklink_writeconfig(): could not open %s/%s: %s", + g_get_home_dir(), quicklink_configfile, + strerror(errno)); + else + { + g_list_foreach(fs->quicklink_dirlist, + (GFunc)quicklink_writeconfig_anitem, + f); + + if(fclose(f) < 0) + g_warning("gtkfilesel.c:quicklink_writeconfig(): could not close %s/%s: %s", + g_get_home_dir(), quicklink_configfile, + strerror(errno)); + } +} + +/* signalfunction for button "Add Dir" */ +static void +quicklink_add(GtkWidget *widget, gpointer data) +{ + gchar *f=NULL, *filename=NULL; + GtkFileSelection *fs=data; + + g_return_if_fail(fs != NULL); + g_return_if_fail(GTK_IS_FILE_SELECTION(fs)); + /* we don't need *widget */ + + f=gtk_file_selection_get_filename(fs); + g_return_if_fail(f != NULL); + + /* check if directory */ + if(! quicklink_isdir(f)) + return; + + filename=g_strdup(f); + g_return_if_fail(filename != NULL); + + quicklink_stripslash(filename); + + /* check if already included in the list */ + if(g_list_find_custom(fs->quicklink_dirlist, + filename, + (GCompareFunc)g_strcasecmp) + ) + { + g_free(filename); + return; + } + + /* insert into the GList */ + fs->quicklink_dirlist=g_list_insert_sorted(fs->quicklink_dirlist, + filename, + (GCompareFunc) g_strcasecmp); + + /* and write the new configs */ + quicklink_writeconfig(fs); + quicklink_readconfig(fs); +} + +/* signalfunction for button "Remove Dir" */ +static void +quicklink_remove(GtkWidget *widget, gpointer data) +{ + GtkFileSelection *fs=data; + + g_return_if_fail(fs != NULL); + g_return_if_fail(GTK_IS_FILE_SELECTION(fs)); + /* we don't need *widget */ + + if(fs->quicklink_clist_row>=0) + { + /* get the text pointer to remove */ + gchar *text=gtk_clist_get_row_data(GTK_CLIST(fs->quicklink_clist), + fs->quicklink_clist_row); + g_return_if_fail(text != NULL); + + /* remove from list */ + fs->quicklink_dirlist=g_list_remove(fs->quicklink_dirlist, text); + g_free(text); + + /* deselect row */ + fs->quicklink_clist_row=-1; + + /* write new configs */ + quicklink_writeconfig(fs); + quicklink_readconfig(fs); + } +} + +/* signalfunction for clist widget selection */ +static void +quicklink_chdir(GtkCList *clist, + gint row, + gint column, + GdkEventButton *event, + gpointer data) +{ + GtkFileSelection *fs = NULL; + gchar *filename=NULL, *temp = NULL; + + /* assertions checks */ + g_return_if_fail (GTK_IS_CLIST (clist)); + g_return_if_fail(data != NULL); + + fs = GTK_FILE_SELECTION (data); + g_return_if_fail (fs != NULL); + g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); + + /* update currenty selected row */ + fs->quicklink_clist_row=row; + + /* get selected filename */ + gtk_clist_get_text (GTK_CLIST (fs->quicklink_clist), row, 0, &temp); + g_return_if_fail(temp != NULL); + + /* make a copy with trailing / */ + filename = g_strdup_printf("%s/", temp); + g_return_if_fail(filename != NULL); + + /* update selection entry */ + gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), filename); + + /* and check for double click */ + if (event) + if(event->type==GDK_2BUTTON_PRESS) + gtk_file_selection_set_filename(fs, filename); + + g_free (filename); +} + +/* signal function for toggle button + show or hide the quicklink dialog +*/ +static void +quicklink_toggle_button(GtkWidget *widget, gpointer data) +{ + GtkFileSelection *fs=data; + + g_return_if_fail (fs != NULL); + g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); + /* we don't need widget */ + + /* update state */ + fs->quicklink_toggle_state=!fs->quicklink_toggle_state; + + /* see if we should show or hide */ + if(fs->quicklink_toggle_state) + { + /* show Quick Link list */ + gtk_widget_show(fs->quicklink_scrollpane); + + /* show correct pixmap */ + gtk_widget_show(fs->quicklink_toggle_pixmapRight); + gtk_widget_hide(fs->quicklink_toggle_pixmapLeft); + + /* show buttons if needed */ + if(fs->fileop_show) + { + gtk_widget_show(fs->quicklink_add); + gtk_widget_show(fs->quicklink_rem); + } + } + else + { + /* hide Quick Link list */ + gtk_widget_hide(fs->quicklink_scrollpane); + + /* show correct pixmap */ + gtk_widget_show(fs->quicklink_toggle_pixmapLeft); + gtk_widget_hide(fs->quicklink_toggle_pixmapRight); + + /* hide buttons */ + if(fs->fileop_show) + { + gtk_widget_hide(fs->quicklink_rem); + gtk_widget_hide(fs->quicklink_add); + } + } } diff -w -b -B -u -U 5 -r -P -x *~ -x *.pot -x po2tbl.sed -x cat-id-tbl.c gtk+-1.2.9/gtk/gtkfilesel.h gtk+-1.2.9.quicklink/gtk/gtkfilesel.h --- gtk+-1.2.9/gtk/gtkfilesel.h Wed Feb 24 08:34:31 1999 +++ gtk+-1.2.9.quicklink/gtk/gtkfilesel.h Fri Mar 9 14:18:24 2001 @@ -72,10 +72,31 @@ GtkWidget *fileop_ren_file; GtkWidget *button_area; GtkWidget *action_area; + /*doj*/ + gboolean fileop_show; + + GtkWidget *quicklink_add; + GtkWidget *quicklink_rem; + GtkWidget *quicklink_mainbox; + GtkWidget *quicklink_toggle; + gboolean quicklink_toggle_state; + GdkColormap *quicklink_toggle_cm; + GtkWidget *quicklink_toggle_box; + GdkBitmap *quicklink_toggle_maskLeft; + GdkBitmap *quicklink_toggle_maskRight; + GdkPixmap *quicklink_toggle_pixLeft; + GdkPixmap *quicklink_toggle_pixRight; + GtkWidget *quicklink_toggle_pixmapLeft; + GtkWidget *quicklink_toggle_pixmapRight; + GtkWidget *quicklink_scrollpane; + GtkWidget *quicklink_clist; + gint quicklink_clist_row; + GList *quicklink_dirlist; + /*doj*/ }; struct _GtkFileSelectionClass { GtkWindowClass parent_class;