Fix #442: Path filter combobox not initialised
[geeqie.git] / src / ui_pathsel.c
index 4f8cdc4..88f3924 100644 (file)
@@ -1,13 +1,22 @@
 /*
- * (SLIK) SimpLIstic sKin functions
- * (C) 2006 John Ellis
- * Copyright (C) 2008 The Geeqie Team
+ * Copyright (C) 2006 John Ellis
+ * Copyright (C) 2008 - 2016 The Geeqie Team
  *
  * Author: John Ellis
  *
- * This software is released under the GNU General Public License (GNU GPL).
- * Please read the included file COPYING for more information.
- * This software comes with no warranty of any kind, use at your own risk!
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
 #ifdef HAVE_CONFIG_H
@@ -39,6 +48,7 @@
 #include "ui_utildlg.h"
 #include "ui_tabcomp.h"
 #include "ui_tree_edit.h"
+#include "uri_utils.h"
 
 
 #define DEST_WIDTH 250
@@ -66,7 +76,7 @@ struct _Dest_Data
        GList *filter_text_list;
        GtkWidget *filter_combo;
 
-       gint show_hidden;
+       gboolean show_hidden;
        GtkWidget *hidden_button;
 
        GtkWidget *bookmark_list;
@@ -113,7 +123,7 @@ static void dest_free_data(GtkWidget *widget, gpointer data)
        g_free(dd);
 }
 
-static gint dest_check_filter(const gchar *filter, const gchar *file)
+static gboolean dest_check_filter(const gchar *filter, const gchar *file)
 {
        const gchar *f_ptr = filter;
        const gchar *strt_ptr;
@@ -135,7 +145,7 @@ static gint dest_check_filter(const gchar *filter, const gchar *file)
                if (*f_ptr != '\0' && f_ptr[1] == ' ') f_ptr++; /* skip space immediately after separator */
                f_ptr++;
                /* FIXME: utf8 */
-               if (l >= i && strncasecmp(file + l - i, strt_ptr, i) == 0) return TRUE;
+               if (l >= i && g_ascii_strncasecmp(file + l - i, strt_ptr, i) == 0) return TRUE;
                }
        return FALSE;
 }
@@ -144,12 +154,12 @@ static gint dest_check_filter(const gchar *filter, const gchar *file)
 #define CASE_SORT strcmp
 #endif
 
-static gint dest_sort_cb(void *a, void *b)
+static gint dest_sort_cb(gpointer a, gpointer b)
 {
        return CASE_SORT((gchar *)a, (gchar *)b);
 }
 
-static gint is_hidden(const gchar *name)
+static gboolean is_hidden(const gchar *name)
 {
        if (name[0] != '.') return FALSE;
        if (name[1] == '\0') return FALSE;
@@ -272,7 +282,7 @@ static void dest_populate(Dest_Data *dd, const gchar *path)
        dd->path = g_strdup(path);
 }
 
-static void dest_change_dir(Dest_Data *dd, const gchar *path, gint retain_name)
+static void dest_change_dir(Dest_Data *dd, const gchar *path, gboolean retain_name)
 {
        const gchar *old_name = NULL;
        gchar *full_path;
@@ -290,7 +300,7 @@ static void dest_change_dir(Dest_Data *dd, const gchar *path, gint retain_name)
                new_directory = g_path_get_dirname(full_path);
        else
                new_directory = g_strdup(full_path);
-       
+
        gtk_entry_set_text(GTK_ENTRY(dd->entry), full_path);
 
        dest_populate(dd, new_directory);
@@ -330,9 +340,7 @@ static void dest_dnd_set_data(GtkWidget *view,
                              guint info, guint time, gpointer data)
 {
        gchar *path = NULL;
-       gchar *uri_text = NULL;
        GList *list = NULL;
-       gint length = 0;
        GtkTreeModel *model;
        GtkTreeSelection *selection;
        GtkTreeIter iter;
@@ -345,23 +353,16 @@ static void dest_dnd_set_data(GtkWidget *view,
 
        list = g_list_append(list, path);
 
-       switch (info)
+       gchar **uris = uris_from_pathlist(list);
+       gboolean ret = gtk_selection_data_set_uris(selection_data, uris);
+       if (!ret)
                {
-               case TARGET_URI_LIST:
-                       uri_text = uri_text_from_list(list, &length, FALSE);
-                       break;
-               case TARGET_TEXT_PLAIN:
-                       uri_text = uri_text_from_list(list, &length, TRUE);
-                       break;
+               char *str = g_strjoinv("\r\n", uris);
+               ret = gtk_selection_data_set_text(selection_data, str, -1);
+               g_free(str);
                }
 
        string_list_free(list);
-
-       if (!uri_text) return;
-
-       gtk_selection_data_set(selection_data, selection_data->target,
-                              8, (guchar *)uri_text, length);
-       g_free(uri_text);
 }
 
 static void dest_dnd_init(Dest_Data *dd)
@@ -429,13 +430,13 @@ static gint dest_view_rename_cb(TreeEditData *ted, const gchar *old, const gchar
        if (isname(new_path))
                {
                buf = g_strdup_printf(_("A file with name %s already exists."), new);
-               warning_dialog("Rename failed", buf, GTK_STOCK_DIALOG_INFO, dd->entry);
+               warning_dialog(_("Rename failed"), buf, GTK_STOCK_DIALOG_INFO, dd->entry);
                g_free(buf);
                }
        else if (!rename_file(old_path, new_path))
                {
                buf = g_strdup_printf(_("Failed to rename %s to %s."), old, new);
-               warning_dialog("Rename failed", buf, GTK_STOCK_DIALOG_ERROR, dd->entry);
+               warning_dialog(_("Rename failed"), buf, GTK_STOCK_DIALOG_ERROR, dd->entry);
                g_free(buf);
                }
        else
@@ -533,7 +534,7 @@ static void dest_view_delete(Dest_Data *dd, GtkTreeView *view)
                generic_dialog_close(gd);
                }
 
-       dd->gd = generic_dialog_new(_("Delete file"), GQ_WMCLASS, "dlg_confirm",
+       dd->gd = generic_dialog_new(_("Delete file"), "dlg_confirm",
                                    dd->entry, TRUE,
                                    dest_view_delete_dlg_cancel, dl);
 
@@ -607,8 +608,8 @@ static void dest_popup_position_cb(GtkMenu *menu, gint *x, gint *y,
        popup_menu_position_clamp(menu, x, y, 0);
 }
 
-static gint dest_popup_menu(Dest_Data *dd, GtkTreeView *view,
-                           gint button, guint32 time, gint local)
+static gboolean dest_popup_menu(Dest_Data *dd, GtkTreeView *view,
+                               guint button, guint32 time, gboolean local)
 {
        GtkWidget *menu;
 
@@ -619,7 +620,7 @@ static gint dest_popup_menu(Dest_Data *dd, GtkTreeView *view,
                GtkTreeModel *model;
                GtkTreeIter iter;
                gchar *text;
-               gint normal_dir;
+               gboolean normal_dir;
 
                model = gtk_tree_view_get_model(view);
                gtk_tree_model_get_iter(model, &iter, dd->right_click_path);
@@ -660,7 +661,7 @@ static gint dest_popup_menu(Dest_Data *dd, GtkTreeView *view,
        return TRUE;
 }
 
-static gint dest_press_cb(GtkWidget *view, GdkEventButton *event, gpointer data)
+static gboolean dest_press_cb(GtkWidget *view, GdkEventButton *event, gpointer data)
 {
        Dest_Data *dd = data;
        GtkTreePath *tpath;
@@ -695,9 +696,9 @@ static gboolean dest_keypress_cb(GtkWidget *view, GdkEventKey *event, gpointer d
 
        switch (event->keyval)
                {
-               case GDK_F10:
+               case GDK_KEY_F10:
                        if (!(event->state & GDK_CONTROL_MASK)) return FALSE;
-               case GDK_Menu:
+               case GDK_KEY_Menu:
                        dest_view_store_selection(dd, GTK_TREE_VIEW(view));
                        dest_popup_menu(dd, GTK_TREE_VIEW(view), 0, event->time, TRUE);
                        return TRUE;
@@ -710,7 +711,7 @@ static gboolean dest_keypress_cb(GtkWidget *view, GdkEventKey *event, gpointer d
                                return TRUE;
                                }
                        break;
-               case GDK_Delete:
+               case GDK_KEY_Delete:
                        dest_view_store_selection(dd, GTK_TREE_VIEW(view));
                        dest_view_delete(dd, GTK_TREE_VIEW(view));
                        return TRUE;
@@ -734,12 +735,15 @@ static void dest_new_dir_cb(GtkWidget *widget, gpointer data)
        gchar *path;
        gchar *buf;
        const gchar *tmp;
-       gint from_text = FALSE;
+       gboolean from_text = FALSE;
 
        tmp = gtk_entry_get_text(GTK_ENTRY(dd->entry));
        if (!isname(tmp))
                {
-               path = g_strdup(tmp);
+               buf = remove_trailing_slash(tmp);
+               path = g_strdup(buf);
+               g_free(buf);
+               buf = remove_level_from_path(path);
                from_text = TRUE;
                }
        else
@@ -764,7 +768,11 @@ static void dest_new_dir_cb(GtkWidget *widget, gpointer data)
                GtkListStore *store;
                const gchar *text;
 
-               if (from_text) gtk_entry_set_text(GTK_ENTRY(dd->entry), dd->path);
+               if (from_text)
+                       {
+                       dest_populate(dd, buf);
+                       g_free(buf);
+                       }
 
                store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dd->d_view)));
 
@@ -778,6 +786,7 @@ static void dest_new_dir_cb(GtkWidget *widget, gpointer data)
 
                tree_edit_by_path(GTK_TREE_VIEW(dd->d_view), dd->right_click_path, 0, text,
                                  dest_view_rename_cb, dd);
+               gtk_entry_set_text(GTK_ENTRY(dd->entry), path);
                }
 
        g_free(path);
@@ -897,7 +906,7 @@ static void dest_filter_list_sync(Dest_Data *dd)
 
        if (!dd->filter_list || !dd->filter_combo) return;
 
-       entry = GTK_BIN(dd->filter_combo)->child;
+       entry = gtk_bin_get_child(GTK_BIN(dd->filter_combo));
        old_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry)));
 
        store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(dd->filter_combo)));
@@ -930,7 +939,7 @@ static void dest_filter_list_sync(Dest_Data *dd)
        g_free(old_text);
 }
 
-static void dest_filter_add(Dest_Data *dd, const gchar *filter, const gchar *description, gint set)
+static void dest_filter_add(Dest_Data *dd, const gchar *filter, const gchar *description, gboolean set)
 {
        GList *work;
        gchar *buf;
@@ -964,7 +973,7 @@ static void dest_filter_add(Dest_Data *dd, const gchar *filter, const gchar *des
                }
        dd->filter_text_list = uig_list_insert_link(dd->filter_text_list, g_list_last(dd->filter_text_list), buf);
 
-       if (set) gtk_entry_set_text(GTK_ENTRY(GTK_BIN(dd->filter_combo)->child), filter);
+       if (set) gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(dd->filter_combo))), filter);
        dest_filter_list_sync(dd);
 }
 
@@ -986,7 +995,7 @@ static void dest_filter_changed_cb(GtkEditable *editable, gpointer data)
        const gchar *buf;
        gchar *path;
 
-       entry = GTK_BIN(dd->filter_combo)->child;
+       entry = gtk_bin_get_child(GTK_BIN(dd->filter_combo));
        buf = gtk_entry_get_text(GTK_ENTRY(entry));
 
        g_free(dd->filter);
@@ -1032,10 +1041,6 @@ GtkWidget *path_selection_new_with_files(GtkWidget *entry, const gchar *path,
        GtkCellRenderer *renderer;
 
        dd = g_new0(Dest_Data, 1);
-       dd->show_hidden = FALSE;
-       dd->select_func = NULL;
-       dd->select_data = NULL;
-       dd->gd = NULL;
 
        table = gtk_table_new(4, (filter != NULL) ? 3 : 1, FALSE);
        gtk_table_set_col_spacings(GTK_TABLE(table), PREF_PAD_GAP);
@@ -1140,17 +1145,16 @@ GtkWidget *path_selection_new_with_files(GtkWidget *entry, const gchar *path,
 
                store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
 
-               dd->filter_combo = gtk_combo_box_entry_new_with_model(GTK_TREE_MODEL(store),
-                                                                     FILTER_COLUMN_FILTER);
+               dd->filter_combo = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(store));
+               gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(dd->filter_combo),
+                                                                                                               FILTER_COLUMN_FILTER);
+
                g_object_unref(store);
                gtk_cell_layout_clear(GTK_CELL_LAYOUT(dd->filter_combo));
                renderer = gtk_cell_renderer_text_new();
                gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(dd->filter_combo), renderer, TRUE);
                gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(dd->filter_combo), renderer,
                                               "text", FILTER_COLUMN_NAME, NULL);
-#if 0
-               gtk_combo_set_case_sensitive(GTK_COMBO(dd->filter_combo), TRUE);
-#endif
                gtk_box_pack_start(GTK_BOX(hbox2), dd->filter_combo, TRUE, TRUE, 0);
                gtk_widget_show(dd->filter_combo);
 
@@ -1204,7 +1208,7 @@ GtkWidget *path_selection_new_with_files(GtkWidget *entry, const gchar *path,
                dest_filter_clear(dd);
                dest_filter_add(dd, filter, filter_desc, TRUE);
 
-               dd->filter = g_strdup(gtk_entry_get_text(GTK_ENTRY(GTK_BIN(dd->filter_combo)->child)));
+               dd->filter = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(dd->filter_combo)))));
                }
 
        if (path && path[0] == G_DIR_SEPARATOR && isdir(path))
@@ -1231,7 +1235,7 @@ GtkWidget *path_selection_new_with_files(GtkWidget *entry, const gchar *path,
 
        if (dd->filter_combo)
                {
-               g_signal_connect(G_OBJECT(GTK_BIN(dd->filter_combo)->child), "changed",
+               g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN(dd->filter_combo))), "changed",
                                 G_CALLBACK(dest_filter_changed_cb), dd);
                }
        g_signal_connect(G_OBJECT(dd->entry), "changed",
@@ -1282,7 +1286,7 @@ void path_selection_add_select_func(GtkWidget *entry,
        dd->select_data = data;
 }
 
-void path_selection_add_filter(GtkWidget *entry, const gchar *filter, const gchar *description, gint set)
+void path_selection_add_filter(GtkWidget *entry, const gchar *filter, const gchar *description, gboolean set)
 {
        Dest_Data *dd = g_object_get_data(G_OBJECT(entry), "destination_data");
 
@@ -1300,3 +1304,4 @@ void path_selection_clear_filter(GtkWidget *entry)
 
        dest_filter_clear(dd);
 }
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */