/*
- * (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
#include "ui_utildlg.h"
#include "ui_tabcomp.h"
#include "ui_tree_edit.h"
+#include "uri_utils.h"
#define DEST_WIDTH 250
GList *filter_text_list;
GtkWidget *filter_combo;
- gint show_hidden;
+ gboolean show_hidden;
GtkWidget *hidden_button;
GtkWidget *bookmark_list;
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;
}
if (*f_ptr != '\0' && f_ptr[1] == ' ') f_ptr++; /* skip space immediately after separator */
f_ptr++;
- if (l >= i && strncasecmp(file + l - i, strt_ptr, i) == 0) return TRUE;
+ /* FIXME: utf8 */
+ if (l >= i && g_ascii_strncasecmp(file + l - i, strt_ptr, i) == 0) return TRUE;
}
return FALSE;
}
#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;
&& dir->d_name[0] == '.' && dir->d_name[1] == '\0')
continue;
if (dir->d_name[0] == '.' && dir->d_name[1] == '.' && dir->d_name[2] == '\0'
- && pathl[0] == '/' && pathl[1] == '\0')
+ && pathl[0] == G_DIR_SEPARATOR && pathl[1] == '\0')
continue; /* no .. for root directory */
if (dd->show_hidden || !is_hidden(dir->d_name))
{
gchar *name = dir->d_name;
- gchar *filepath = g_strconcat(pathl, "/", name, NULL);
+ gchar *filepath = g_build_filename(pathl, name, NULL);
if (stat(filepath, &ent_sbuf) >= 0 && S_ISDIR(ent_sbuf.st_mode))
{
path_list = g_list_prepend(path_list, path_to_utf8(name));
}
else
{
- filepath = concat_dir_and_file(path, list->data);
+ filepath = g_build_filename(path, list->data, NULL);
}
gtk_list_store_append(store, &iter);
list = list->next;
}
- path_list_free(path_list);
+ string_list_free(path_list);
if (dd->f_view)
gchar *filepath;
const gchar *name = list->data;
- filepath = concat_dir_and_file(path, name);
+ filepath = g_build_filename(path, name, NULL);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, 0, name, 1, filepath, -1);
list = list->next;
}
- path_list_free(file_list);
+ string_list_free(file_list);
}
g_free(dd->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)
{
- gchar *old_name = NULL;
- gint s = 0;
+ const gchar *old_name = NULL;
+ gchar *full_path;
+ gchar *new_directory;
if (retain_name)
{
const gchar *buf = gtk_entry_get_text(GTK_ENTRY(dd->entry));
- if (!isdir(buf))
- {
- if (path && strcmp(path, "/") == 0)
- {
- old_name = g_strdup(filename_from_path(buf));
- }
- else
- {
- old_name = g_strconcat("/", filename_from_path(buf), NULL);
- s = 1;
- }
- }
+
+ if (!isdir(buf)) old_name = filename_from_path(buf);
}
- gtk_entry_set_text(GTK_ENTRY(dd->entry), path);
+ full_path = g_build_filename(path, old_name, NULL);
+ if (old_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, path);
+ dest_populate(dd, new_directory);
+ g_free(new_directory);
- /* remember filename */
if (old_name)
{
- gint pos = -1;
- gtk_editable_insert_text(GTK_EDITABLE(dd->entry), old_name, -1, &pos);
- gtk_editable_select_region(GTK_EDITABLE(dd->entry), strlen(path) + s, strlen(path) + strlen(old_name));
- g_free(old_name);
+ gchar *basename = g_path_get_basename(full_path);
+
+ gtk_editable_select_region(GTK_EDITABLE(dd->entry), strlen(full_path) - strlen(basename), strlen(full_path));
+ g_free(basename);
}
+
+ g_free(full_path);
}
/*
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;
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);
}
- path_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);
+ string_list_free(list);
}
static void dest_dnd_init(Dest_Data *dd)
if (!old_path) return FALSE;
buf = remove_level_from_path(old_path);
- new_path = concat_dir_and_file(buf, new);
+ new_path = g_build_filename(buf, new, NULL);
g_free(buf);
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
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);
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;
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);
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;
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;
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;
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
{
- buf = concat_dir_and_file(dd->path, _("New folder"));
+ buf = g_build_filename(dd->path, _("New folder"), NULL);
path = unique_filename(buf, NULL, " ", FALSE);
g_free(buf);
}
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)));
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);
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)));
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;
}
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);
}
static void dest_filter_clear(Dest_Data *dd)
{
- path_list_free(dd->filter_list);
+ string_list_free(dd->filter_list);
dd->filter_list = NULL;
- path_list_free(dd->filter_text_list);
+ string_list_free(dd->filter_text_list);
dd->filter_text_list = NULL;
dest_filter_add(dd, "*", _("All Files"), TRUE);
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);
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);
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));
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);
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] == '/' && isdir(path))
+ if (path && path[0] == G_DIR_SEPARATOR && isdir(path))
{
dest_populate(dd, path);
}
else
{
gchar *buf = remove_level_from_path(path);
- if (buf && buf[0] == '/' && isdir(buf))
+ if (buf && buf[0] == G_DIR_SEPARATOR && isdir(buf))
{
dest_populate(dd, buf);
}
gint pos = -1;
dest_populate(dd, (gchar *)homedir());
- if (path) gtk_editable_insert_text(GTK_EDITABLE(dd->entry), "/", -1, &pos);
+ if (path) gtk_editable_insert_text(GTK_EDITABLE(dd->entry), G_DIR_SEPARATOR_S, -1, &pos);
if (path) gtk_editable_insert_text(GTK_EDITABLE(dd->entry), path, -1, &pos);
}
g_free(buf);
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",
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");
dest_filter_clear(dd);
}
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */