diff -Naur literocks-20210924/src/Makefile arox-20220907/src/Makefile --- literocks-20210924/src/Makefile 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/Makefile 2021-10-16 20:24:12.000000000 -0400 @@ -9,7 +9,7 @@ # This ensures we get the header files for GTK 2.4 with0launch: - 0launch --source --main=/literocks/build --wrapper='make -C' ../literocks-src.xml + 0launch --source --main=/arox/build --wrapper='make -C' ../arox-src.xml clean: cd ${BUILDDIR} && ${MAKE} clean diff -Naur literocks-20210924/src/Makefile.in arox-20220907/src/Makefile.in --- literocks-20210924/src/Makefile.in 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/Makefile.in 2021-10-16 20:22:46.000000000 -0400 @@ -19,7 +19,7 @@ ############ Things to change for different programs -PROG = literocks +PROG = arox SRCS = abox.c action.c appmenu.c bind.c bookmarks.c \ bulk_rename.c cell_icon.c choices.c collection.c dir.c \ @@ -47,9 +47,9 @@ ${CC} -o "${PROG}" ${OBJECTS} ${LDFLAGS} mv "${PROG}" "${PLATFORM_DIR}" -(cd "${PLATFORM_DIR}" && \ - objcopy --only-keep-debug literocks literocks.dbg && \ -# strip literocks && \ - objcopy --add-gnu-debuglink=literocks.dbg literocks) + objcopy --only-keep-debug arox arox.dbg && \ +# strip arox && \ + objcopy --add-gnu-debuglink=arox.dbg arox) clean: rm -f *.o Makefile.bak diff -Naur literocks-20210924/src/action.c arox-20220907/src/action.c --- literocks-20210924/src/action.c 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/action.c 2021-10-20 04:39:53.000000000 -0400 @@ -1596,7 +1596,7 @@ { /* (just been created then) */ lchown(safe_dest, info.st_uid, info.st_gid); - xattr_copy(safe_path, safe_dest); +// xattr_copy(safe_path, safe_dest); send_check_path(safe_dest); } diff -Naur literocks-20210924/src/appmenu.c arox-20220907/src/appmenu.c --- literocks-20210924/src/appmenu.c 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/appmenu.c 2021-10-16 22:26:39.000000000 -0400 @@ -317,11 +317,6 @@ widgets = g_list_reverse(widgets); current_items = g_list_concat(widgets, current_items); - item = gtk_menu_item_new_with_label(_("Customise Menu...")); - current_items = g_list_prepend(current_items, item); - g_signal_connect(item, "activate", G_CALLBACK(customise_type), type); - - gtk_widget_show(item); } static inline gboolean is_dir(const char *dir) diff -Naur literocks-20210924/src/choices.c arox-20220907/src/choices.c --- literocks-20210924/src/choices.c 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/choices.c 2021-10-16 20:21:11.000000000 -0400 @@ -58,8 +58,7 @@ dirs = g_slist_append(dirs, dir); - for (const gchar * const *d = g_get_system_data_dirs(); *d; d++) - dirs = g_slist_append(dirs, g_build_filename(*d, APPNAME, NULL)); + dirs = g_slist_append(dirs, g_build_filename("/etc", APPNAME, NULL)); } void choices_free_list(GPtrArray *list) diff -Naur literocks-20210924/src/collection.c arox-20220907/src/collection.c --- literocks-20210924/src/collection.c 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/collection.c 2021-10-16 20:20:30.000000000 -0400 @@ -35,8 +35,8 @@ #include "filer.h" #include "options.h" -#define MIN_WIDTH 80 -#define MIN_HEIGHT 60 +#define MIN_WIDTH 140 +#define MIN_HEIGHT 80 #define MINIMUM_ITEMS 16 #define MAX_WINKS 7 /* Should be an odd number */ diff -Naur literocks-20210924/src/config.h.in arox-20220907/src/config.h.in --- literocks-20210924/src/config.h.in 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/config.h.in 2021-10-16 19:21:35.000000000 -0400 @@ -1,6 +1,6 @@ /* The configure script will auto-generate config.h from config.h.in */ -#define APPNAME "literocks" +#define APPNAME "arox" #define VERSION "Unknown" #define GTK_VERSION "Unknown" @@ -51,7 +51,7 @@ #ifdef HAVE_LIBINTL_H # include -# define _(String) dgettext("literocks", String) +# define _(String) dgettext("arox", String) #else # define _(String) (String) #endif diff -Naur literocks-20210924/src/configure arox-20220907/src/configure --- literocks-20210924/src/configure 2021-10-20 08:22:53.000000000 -0400 +++ arox-20220907/src/configure 2021-12-05 19:56:50.000000000 -0500 @@ -4848,7 +4848,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking extracting version information" >&5 $as_echo_n "checking extracting version information... " >&6; } -VERSION="20211020" +VERSION="20211206" cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" diff -Naur literocks-20210924/src/configure.in arox-20220907/src/configure.in --- literocks-20210924/src/configure.in 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/configure.in 2021-12-05 19:55:59.000000000 -0500 @@ -193,7 +193,7 @@ dnl Extract version info from AppInfo.xml AC_MSG_CHECKING(extracting version information) [ -VERSION="2.11.h" +VERSION="20211206" ] AC_DEFINE_UNQUOTED(VERSION, "$VERSION") AC_MSG_RESULT(version $VERSION) diff -Naur literocks-20210924/src/diritem.c arox-20220907/src/diritem.c --- literocks-20210924/src/diritem.c 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/diritem.c 2021-10-20 04:36:25.000000000 -0400 @@ -43,7 +43,6 @@ #include "options.h" #include "fscache.h" #include "pixmaps.h" -#include "xtypes.h" #define RECENT_DELAY (5 * 60) /* Time in seconds to consider a file recent */ #define ABOUT_NOW(time) (diritem_recent_time - time < RECENT_DELAY) @@ -129,9 +128,6 @@ if (ABOUT_NOW(item->mtime) || ABOUT_NOW(item->ctime)) item->flags |= ITEM_FLAG_RECENT; - if (xattr_have(path)) - item->flags |= ITEM_FLAG_HAS_XATTR; - if (item->label) { g_mutex_lock(&m_diritems); diff -Naur literocks-20210924/src/display.c arox-20220907/src/display.c --- literocks-20210924/src/display.c 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/display.c 2021-10-20 04:32:23.000000000 -0400 @@ -54,7 +54,6 @@ #include "dir.h" #include "diritem.h" #include "view_iface.h" -#include "xtypes.h" /* Options bits */ static Option o_display_caps_first; @@ -87,7 +86,6 @@ Option o_display_inherit_options; static Option o_filer_change_size_num; Option o_vertical_order_small, o_vertical_order_large; -Option o_xattr_show; Option o_view_alpha; Option o_use_background_colour; Option o_background_colour; @@ -114,7 +112,6 @@ option_add_int(&o_display_sort_by, "display_sort_by", SORT_NAME); option_add_int(&o_display_show_hidden, "display_show_hidden", TRUE); option_add_int(&o_enable_dot_hidden_file, "enable_dot_hidden_file", FALSE); - option_add_int(&o_xattr_show, "xattr_show", TRUE); option_add_int(&o_huge_size, "huge_size", HUGE_SIZE); option_add_int(&o_display_size, "display_icon_size", AUTO_SIZE_ICONS); @@ -407,11 +404,6 @@ draw_mini_emblem_on_icon(cr, style, ROX_STOCK_SYMLINK, &image_x, area->y, area->height, NULL); } - if ((item->flags & ITEM_FLAG_HAS_XATTR) && o_xattr_show.int_value) - { - draw_mini_emblem_on_icon(cr, style, ROX_STOCK_XATTR, - &image_x, area->y, area->height, item->label); - } } else if (area->width <= ICON_WIDTH && area->height <= ICON_HEIGHT) { @@ -428,11 +420,6 @@ draw_emblem_on_icon(window, style, ROX_STOCK_SYMLINK, &image_x, area->y + 2, NULL); } - if ((item->flags & ITEM_FLAG_HAS_XATTR) && o_xattr_show.int_value) - { - draw_emblem_on_icon(window, style, ROX_STOCK_XATTR, - &image_x, area->y + 2, item->label); - } } else { @@ -453,11 +440,6 @@ draw_emblem_on_icon(window, style, ROX_STOCK_SYMLINK, &image_x, emb_y + height / 19, NULL); } - if ((item->flags & ITEM_FLAG_HAS_XATTR) && o_xattr_show.int_value) - { - draw_emblem_on_icon(window, style, ROX_STOCK_XATTR, - &image_x, emb_y + height / 19, item->label); - } } cairo_destroy(cr); @@ -899,7 +881,6 @@ o_display_show_full_type.has_changed || o_vertical_order_small.has_changed || o_vertical_order_large.has_changed || - o_xattr_show.has_changed || o_view_alpha.has_changed || o_use_background_colour.has_changed || o_background_colour.has_changed || diff -Naur literocks-20210924/src/display.h arox-20220907/src/display.h --- literocks-20210924/src/display.h 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/display.h 2021-10-20 08:12:18.000000000 -0400 @@ -38,7 +38,6 @@ extern Option o_small_width; extern Option o_max_length; extern Option o_vertical_order_small, o_vertical_order_large; -extern Option o_xattr_show; extern Option o_view_alpha; extern Option o_use_background_colour; extern Option o_background_colour; diff -Naur literocks-20210924/src/filer.c arox-20220907/src/filer.c --- literocks-20210924/src/filer.c 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/filer.c 2021-10-20 04:40:34.000000000 -0400 @@ -58,7 +58,6 @@ #include "view_details.h" #include "action.h" #include "bookmarks.h" -#include "xtypes.h" #include "usericons.h" static XMLwrapper *groups = NULL; @@ -3917,30 +3916,6 @@ return file_hidden; } - /*** Test disabled for now. The flags aren't set on the first pass... - */ -#if 0 - /* Most files will not have extended attributes, so this should - * be quick. */ - if(item->flags & ITEM_FLAG_HAS_XATTR) { - gchar *path, *val; - int len; - gboolean hidden=FALSE; - - path=g_build_filename(dir, item->leafname, NULL); - val=xattr_get(path, XATTR_HIDDEN, &len); - if(val) { - hidden=atoi(val) || (strcmp(val, "true")==0); - g_free(val); - } - g_free(path); - - if(hidden) - return TRUE; - } -#endif - - /* Otherwise not hidden */ return FALSE; } diff -Naur literocks-20210924/src/global.h arox-20220907/src/global.h --- literocks-20210924/src/global.h 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/global.h 2022-09-07 02:11:42.722606000 -0400 @@ -164,18 +164,33 @@ #define SOAP_ENV_NS_OLD "http://www.w3.org/2001/06/soap-envelope" #define SOAP_ENV_NS "http://www.w3.org/2001/12/soap-envelope" #define SOAP_RPC_NS "http://www.w3.org/2001/12/soap-rpc" -#define ROX_NS "http://literocks.jun7.github.com/SOAP/literocks" +#define ROX_NS "http://www.absolutelinux.org/index.html" /* Stock icons */ -#define ROX_STOCK_SHOW_DETAILS "rox-show-details" -#define ROX_STOCK_SHOW_HIDDEN "rox-show-hidden" +#define ROX_STOCK_BOOKMARKS "arox-bookmarks" +#define ROX_STOCK_COMPRESS "arox-compress" +#define ROX_STOCK_SHARE "arox-share" +#define ROX_STOCK_COPY "arox-copy" +#define ROX_STOCK_COPYHERE "arox-copy-here" +#define ROX_STOCK_COUNT "arox-count" +#define ROX_STOCK_DELETE "arox-delete" +#define ROX_STOCK_FIND "arox-find" +#define ROX_STOCK_HOME "arox-home" +#define ROX_STOCK_ICON "arox-icon" +#define ROX_STOCK_LINK "arox-link" #define ROX_STOCK_MOUNT "rox-mount" #define ROX_STOCK_MOUNTED "rox-mounted" -#define ROX_STOCK_XATTR "rox-xattr" +#define ROX_STOCK_PERMISSIONS "arox-permissions" +#define ROX_STOCK_PROPERTIES "arox-properties" +#define ROX_STOCK_REFRESH "arox-refresh" +#define ROX_STOCK_RENAME "arox-rename" +#define ROX_STOCK_RESIZE "arox-resize" +#define ROX_STOCK_SENDTO "arox-send-to" +#define ROX_STOCK_SHOW_DETAILS "arox-show-details" +#define ROX_STOCK_SHOW_HIDDEN "arox-show-hidden" +#define ROX_STOCK_QTFM "arox-qtfm" #define ROX_STOCK_SYMLINK "rox-symlink" - -/* Re-use an existing icon for a slightly different purpose */ -#define ROX_STOCK_BOOKMARKS GTK_STOCK_JUMP_TO +#define ROX_STOCK_XATTR "rox-xattr" #define D(f, ...) g_print("#"#f"\n", __VA_ARGS__); #define DD(a) g_print("#"#a"\n"); diff -Naur literocks-20210924/src/infobox.c arox-20220907/src/infobox.c --- literocks-20210924/src/infobox.c 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/infobox.c 2021-10-20 04:37:44.000000000 -0400 @@ -43,7 +43,6 @@ #include "xml.h" #include "mount.h" #include "pixmaps.h" -#include "xtypes.h" #include "filer.h" typedef struct _FileStatus FileStatus; @@ -649,14 +648,6 @@ if (item->mime_type) add_row(store, "", mime_type_comment(item->mime_type)); - if (xattr_supported(NULL)) { - add_row(store, _("Extended attributes:"), - (item->flags & ITEM_FLAG_HAS_XATTR) - ? _("Present") - : xattr_supported(path) ? _("None") - : _("Not supported")); - } - if (item->flags & ITEM_FLAG_SYMLINK) { GtkTreeIter iter; diff -Naur literocks-20210924/src/main.c arox-20220907/src/main.c --- literocks-20210924/src/main.c 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/main.c 2021-10-21 21:03:05.000000000 -0400 @@ -89,8 +89,8 @@ const char *home_dir, *app_dir; #define COPYING \ - N_("Copyright (C) 2005 Thomas Leonard.\n" \ - "ROX-Filer comes with ABSOLUTELY NO WARRANTY,\n" \ + N_("Copyright (C) 2021 Paul Sherman.\n" \ + "arox comes with ABSOLUTELY NO WARRANTY,\n" \ "to the extent permitted by law.\n" \ "You may redistribute copies of ROX-Filer\n" \ "under the terms of the GNU General Public License.\n" \ @@ -98,10 +98,10 @@ "see the file named COPYING.\n") #ifdef HAVE_GETOPT_LONG -# define USAGE N_("Try `ROX-Filer/AppRun --help' for more information.\n") +# define USAGE N_("Try `arox/AppRun --help' for more information.\n") # define SHORT_ONLY_WARNING "" #else -# define USAGE N_("Try `ROX-Filer/AppRun -h' for more information.\n") +# define USAGE N_("Try `arox/AppRun -h' for more information.\n") # define SHORT_ONLY_WARNING \ _("NOTE: Your system does not support long options - \n" \ "you must use the short versions instead.\n\n") @@ -109,7 +109,7 @@ #define BUGS_TO "" -#define HELP N_("Usage: ROX-Filer/AppRun [OPTION]... [FILE]...\n" \ +#define HELP N_("Usage: arox/AppRun [OPTION]... [FILE]...\n" \ "Open each directory or file listed, or the current working\n" \ "directory if no arguments are given.\n\n" \ " -d, --dir=DIR open DIR as directory (not application)\n" \ @@ -124,7 +124,7 @@ " -v, --version display the version information and exit\n" \ " -x, --examine=FILE FILE has changed - re-examine it\n" \ "\nReport bugs to %s.\n" \ - "Home page (including updated versions): http://rox.sourceforge.net/\n") + "Home page (including updated versions): https://www.absolutelinux.org/\n") #define SHORT_OPS "c:d:t:b:l:r:B:op:s:hvnux:m:D:RSU:" @@ -249,7 +249,7 @@ home_dir = g_get_home_dir(); home_dir_len = strlen(home_dir); - app_dir = g_strdup(getenv("APP_DIR")); + app_dir = "/usr/libexec/arox"; /* Get internationalisation up and running. This requires the * choices system, to discover the user's preferred language. @@ -360,7 +360,7 @@ new_copy = TRUE; break; case 'v': - g_print("ROX-Filer %s\n", VERSION); + g_print("arox %s\n", VERSION); g_print("%s", _(COPYING)); show_features(); return EXIT_SUCCESS; @@ -765,7 +765,7 @@ if(window_with_focus) filename=make_path(window_with_focus->sym_path, APPNAME); else - filename=APPNAME; + filename="arox"; image = type_to_icon(application_x_shellscript); /* Create a save box to save the script */ diff -Naur literocks-20210924/src/menu.c arox-20220907/src/menu.c --- literocks-20210924/src/menu.c 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/menu.c 2022-09-07 03:28:02.099030176 -0400 @@ -53,7 +53,6 @@ #include "choices.h" #include "gtksavebox.h" #include "mount.h" -#include "minibuffer.h" #include "i18n.h" #include "dir.h" #include "diritem.h" @@ -65,7 +64,6 @@ #include "bookmarks.h" #include "bulk_rename.h" #include "xtypes.h" -#include "log.h" #include "dnd.h" typedef enum { @@ -73,20 +71,19 @@ FILE_RENAME_ITEM, FILE_LINK_ITEM, FILE_OPEN_FILE, + COPY_PATH, FILE_PROPERTIES, - FILE_RUN_ACTION, FILE_SET_ICON, FILE_SEND_TO, FILE_DELETE, FILE_USAGE, FILE_CHMOD_ITEMS, FILE_FIND, + FILE_COMPRESS_ITEM, + FILE_SHARE_ITEM, FILE_SET_TYPE, FILE_COPY_TO_CLIPBOARD, FILE_CUT_TO_CLIPBOARD, -#if defined(HAVE_GETXATTR) || defined(HAVE_ATTROPEN) - FILE_XATTRS, -#endif } FileOp; typedef void (*ActionFn)(GList *paths, @@ -146,42 +143,36 @@ static void set_with(gpointer data, guint action, GtkWidget *widget); static void set_sort(gpointer data, guint action, GtkWidget *widget); -static void reverse_sort(gpointer data, guint action, GtkWidget *widget); static void filter_directories(gpointer data, guint action, GtkWidget *widget); static void hidden(gpointer data, guint action, GtkWidget *widget); -static void only_dirs(gpointer data, guint action, GtkWidget *widget); + static void show_thumbs(gpointer data, guint action, GtkWidget *widget); static void refresh(gpointer data, guint action, GtkWidget *widget); static void refresh_thumbs(gpointer data, guint action, GtkWidget *widget); -static void save_settings(gpointer data, guint action, GtkWidget *widget); -static void save_settings_parent(gpointer data, guint action, GtkWidget *widget); static void file_op(gpointer data, FileOp action, GtkWidget *widget); - static void select_all(gpointer data, guint action, GtkWidget *widget); static void clear_selection(gpointer data, guint action, GtkWidget *widget); -static void invert_selection(gpointer data, guint action, GtkWidget *widget); + static void new_directory(gpointer data, guint action, GtkWidget *widget); static void new_file(gpointer data, guint action, GtkWidget *widget); static void customise_new(gpointer data); static GList *add_sendto_shared(GtkWidget *menu, const gchar *type, const gchar *subtype, CallbackFn swapped_func); -static void customise_directory_menu(gpointer data); static void xterm_here(gpointer data, guint action, GtkWidget *widget); +static void find_from_here(gpointer data, guint action, GtkWidget *widget); static void open_parent_same(gpointer data, guint action, GtkWidget *widget); static void open_parent(gpointer data, guint action, GtkWidget *widget); static void home_directory(gpointer data, guint action, GtkWidget *widget); static void show_bookmarks(gpointer data, guint action, GtkWidget *widget); -static void show_log(gpointer data, guint action, GtkWidget *widget); static void new_window(gpointer data, guint action, GtkWidget *widget); /* static void new_user(gpointer data, guint action, GtkWidget *widget); */ static void close_window(gpointer data, guint action, GtkWidget *widget); static void follow_symlinks(gpointer data, guint action, GtkWidget *widget); /* (action used in this - MiniType) */ -static void mini_buffer(gpointer data, guint action, GtkWidget *widget); static void resize(gpointer data, guint action, GtkWidget *widget); /* clipboard */ @@ -189,17 +180,15 @@ static void clipboard_clear(GtkClipboard *clipboard, gpointer user_data); static void paste_from_clipboard(gpointer data, guint action, GtkWidget *widget); +static void show_about_dialog(); + #define MENUS_NAME "menus2" static GtkWidget *filer_menu = NULL; /* The popup filer menu */ static GtkWidget *filer_file_item; /* The File '' label */ static GtkWidget *filer_file_menu; /* The File '' menu */ static GtkWidget *file_shift_item; /* Shift Open label */ -static GtkWidget *filer_auto_size_menu; /* The Automatic item */ static GtkWidget *filer_hidden_menu; /* The Show Hidden item */ -static GtkWidget *filer_files_only_menu; -static GtkWidget *filer_dirs_only_menu; -static GtkWidget *filer_filter_dirs_menu;/* The Filter Dirs item */ /* The Sort items */ static GtkWidget *filer_sort_name_menu; @@ -212,15 +201,10 @@ static GtkWidget *filer_sort_owner_menu; static GtkWidget *filer_sort_group_menu; -static GtkWidget *filer_reverse_menu; /* The Reversed item */ static GtkWidget *filer_thumb_menu; /* The Show Thumbs item */ static GtkWidget *filer_new_window; /* The New Window item */ static GtkWidget *filer_new_menu; /* The New submenu */ static GtkWidget *filer_follow_sym; /* Follow symbolic links item */ -static GtkWidget *filer_set_type; /* Set type item */ -#if defined(HAVE_GETXATTR) || defined(HAVE_ATTROPEN) -static GtkWidget *filer_xattrs; /* Extended attributes item */ -#endif //working buffers static GtkWidget *current; @@ -377,13 +361,9 @@ /* Shade items that only work on single files */ static void shade_file_menu_items(gboolean shaded) { - menu_set_items_shaded(filer_file_menu, shaded, 2, 1); /* Duplicate... */ - menu_set_items_shaded(filer_file_menu, shaded, 4, 1); /* Link... */ - menu_set_items_shaded(filer_file_menu, shaded, 7, 1); /* Shift Open */ - menu_set_items_shaded(filer_file_menu, shaded, 10, 2); /* Set Run Action... + Set Icon... */ -#if defined(HAVE_GETXATTR) || defined(HAVE_ATTROPEN) - menu_set_items_shaded(filer_file_menu, shaded, 12, 1); /* Extended Attributes... */ -#endif +// menu_set_items_shaded(filer_file_menu, shaded, 2, 1); /* Duplicate... */ +// menu_set_items_shaded(filer_file_menu, shaded, 4, 1); /* Link... */ +// menu_set_items_shaded(filer_file_menu, shaded, 7, 1); /* Shift Open */ } /* 'data' is an array of three ints: @@ -645,7 +625,7 @@ adi(N_("Icons With Permissions"), set_with , DETAILS_PERMISSIONS); adi(N_("Icons With Types" ), set_with , DETAILS_TYPE); - ads(N_("List View"), view_type, VIEW_TYPE_DETAILS, ROX_STOCK_SHOW_DETAILS); + adi(N_("List View"), view_type, VIEW_TYPE_DETAILS); add_separator(); @@ -653,8 +633,6 @@ sta(GDK_KEY_plus, 0); ads(N_("Smaller Icons"), change_size, -1, GTK_STOCK_ZOOM_OUT); sta(GDK_KEY_minus, 0); - adt(N_("Automatic"), change_size_auto, 0, &filer_auto_size_menu); - sta(GDK_KEY_equal, 0); add_separator(); @@ -667,95 +645,67 @@ sg = adr(N_("Sort by Size" ), set_sort, SORT_SIZE , sg, &filer_sort_size_menu ); sg = adr(N_("Sort by permissions" ), set_sort, SORT_PERM , sg, &filer_sort_perm_menu ); sg = adr(N_("Sort by Owner" ), set_sort, SORT_OWNER, sg, &filer_sort_owner_menu ); - adr(N_("Sort by Group" ), set_sort, SORT_GROUP, sg, &filer_sort_group_menu ); - - adt(N_("Reversed"), reverse_sort, 0, &filer_reverse_menu); - + sg = adr(N_("Sort by Group" ), set_sort, SORT_GROUP, sg, &filer_sort_group_menu ); add_separator(); - adt(N_("Show Hidden"), hidden, 0, &filer_hidden_menu); sta(GDK_KEY_h, GDK_CONTROL_MASK); - adt(N_("Show Only Files" ), only_dirs, 0, &filer_files_only_menu); - adt(N_("Show Only Directories" ), only_dirs, 1, &filer_dirs_only_menu); - adi(N_("Filter Files..." ), mini_buffer, MINI_FILTER); - adi(N_("Temp Filter..." ), mini_buffer, MINI_TEMP_FILTER); - adt(N_("Filter Directories With Files"), filter_directories, 0, &filer_filter_dirs_menu); adt(N_("Show Thumbnails" ), show_thumbs , 0, &filer_thumb_menu); - ads(N_("Refresh" ), refresh , 0, GTK_STOCK_REFRESH); - ads(N_("Refresh Thumbs" ), refresh_thumbs, 0, GTK_STOCK_REFRESH); + ads(N_("Refresh" ), refresh , 0, ROX_STOCK_REFRESH); + ads(N_("Refresh Thumbs" ), refresh_thumbs, 0, ROX_STOCK_REFRESH); +/////////////////////////////////////////////////////////////////////////////////////// - adi(N_("Save Display Settings..." ), save_settings, 0); - adi(N_("Save Display Settings to parent ..."), save_settings_parent, 0); filer_file_menu = start_menu("File", filer_menu); filer_file_item = BINC(current); - - ads(N_("Copy"), file_op, FILE_COPY_TO_CLIPBOARD, GTK_STOCK_COPY); + ads(N_("Copy"), file_op, FILE_COPY_TO_CLIPBOARD, ROX_STOCK_COPY); sta(GDK_KEY_c, GDK_CONTROL_MASK); - ads(N_("Cut" ), file_op, FILE_CUT_TO_CLIPBOARD, GTK_STOCK_CUT); - sta(GDK_KEY_x, GDK_CONTROL_MASK); - ads(N_("Duplicate..."), file_op, FILE_DUPLICATE_ITEM, GTK_STOCK_COPY); + ads(N_("Copy Here"), file_op, FILE_DUPLICATE_ITEM, ROX_STOCK_COPYHERE); sta(GDK_KEY_d, GDK_CONTROL_MASK); - adi(N_("Rename..."), file_op, FILE_RENAME_ITEM); - adi(N_("Link..." ), file_op, FILE_LINK_ITEM); - ads(N_("Delete" ), file_op, FILE_DELETE, GTK_STOCK_DELETE); + ads(N_("Rename..."), file_op, FILE_RENAME_ITEM, ROX_STOCK_RENAME); + ads(N_("Link..." ), file_op, FILE_LINK_ITEM, ROX_STOCK_LINK); + ads(N_("Compress..."), file_op, FILE_COMPRESS_ITEM, ROX_STOCK_COMPRESS); + ads(N_("Share..."), file_op, FILE_SHARE_ITEM, ROX_STOCK_SHARE); + ads(N_("Delete" ), file_op, FILE_DELETE, ROX_STOCK_DELETE); sta(GDK_KEY_Delete, 0); - add_separator(); - + + file_shift_item = adi(N_("Shift Open"), file_op, FILE_OPEN_FILE); adi(N_("Send To..."), file_op, FILE_SEND_TO); - add_separator(); - - ads(N_("Set Run Action..."), file_op, FILE_RUN_ACTION, GTK_STOCK_EXECUTE); - sta(GDK_KEY_asterisk, 0); - adi(N_("Set Icon..." ), file_op, FILE_SET_ICON); -#if defined(HAVE_GETXATTR) || defined(HAVE_ATTROPEN) - filer_xattrs = - ads(N_("Extended attributes..."), file_op, FILE_XATTRS, ROX_STOCK_XATTR); -#endif - ads(N_("Properties" ), file_op, FILE_PROPERTIES, GTK_STOCK_PROPERTIES); + ads("Copy Path" , file_op, COPY_PATH, GTK_STOCK_PASTE); + sta(GDK_KEY_F5, 0); + ads(N_("Properties" ), file_op, FILE_PROPERTIES, ROX_STOCK_PROPERTIES); sta(GDK_KEY_p, GDK_CONTROL_MASK); - adi(N_("Count" ), file_op, FILE_USAGE); - filer_set_type = - adi(N_("Set Type..."), file_op, FILE_SET_TYPE); - adi(N_("Permissions"), file_op, FILE_CHMOD_ITEMS); + ads(N_("Count" ), file_op, FILE_USAGE, ROX_STOCK_COUNT); + ads(N_("Permissions"), file_op, FILE_CHMOD_ITEMS,ROX_STOCK_PERMISSIONS); add_separator(); - ads(N_("Find"), file_op, FILE_FIND, GTK_STOCK_FIND); + ads(N_("Find"), find_from_here, FILE_FIND, ROX_STOCK_FIND); sta(GDK_KEY_f, GDK_CONTROL_MASK); - +//////////////////////////////////////////////////////////////////////////////// start_menu(N_("Select"), filer_menu); adi(N_("Select All" ), select_all, 0); sta(GDK_KEY_a, GDK_CONTROL_MASK); adi(N_("Clear Selection" ), clear_selection, 0); - adi(N_("Invert Selection" ), invert_selection, 0); - adi(N_("Select by Name..."), mini_buffer, MINI_SELECT_BY_NAME); - sta(GDK_KEY_period, 0); - adi(N_("Reg Select..." ), mini_buffer, MINI_REG_SELECT); - sta(GDK_KEY_asciicircum, 0); - adi(N_("Select If..." ), mini_buffer, MINI_SELECT_IF); - sta(GDK_KEY_question, GDK_SHIFT_MASK); - +//////////////////////////////////////////////////////////////////////////////// start_menu(NULL, filer_menu); ads(N_("Options..."), menu_show_options, 0, GTK_STOCK_PREFERENCES); ads(N_("Paste"), paste_from_clipboard, 0, GTK_STOCK_PASTE); sta(GDK_KEY_v, GDK_CONTROL_MASK); +//////////////////////////////////////////////////////////////////////////////// filer_new_menu = start_menu(N_("New"), filer_menu); - ads(N_("Directory" ), new_directory, 0, GTK_STOCK_DIRECTORY); ads(N_("Blank file" ), new_file , 0, GTK_STOCK_NEW); - adi(N_("Customise Menu..."), customise_new, 0); - +// adi(N_("Customise Menu..."), customise_new, 0); +//////////////////////////////////////////////////////////////////////////////// start_menu(N_("Window"), filer_menu); - ads(N_("Parent, New Window" ), open_parent , 0, GTK_STOCK_GO_UP); adi(N_("Parent, Same Window" ), open_parent_same, 0); filer_new_window = @@ -764,44 +714,33 @@ sta(GDK_KEY_Home, GDK_CONTROL_MASK); ads(N_("Show Bookmarks" ), show_bookmarks , 0, ROX_STOCK_BOOKMARKS); sta(GDK_KEY_b, GDK_CONTROL_MASK); - ads(N_("Show Log" ), show_log , 0, GTK_STOCK_INFO); filer_follow_sym = adi(N_("Follow Symbolic Links"), follow_symlinks , 0); adi(N_("Resize Window" ), resize , 0); sta(GDK_KEY_e, GDK_CONTROL_MASK); ads(N_("Close Window" ), close_window , 0, GTK_STOCK_CLOSE); sta(GDK_KEY_q, GDK_CONTROL_MASK); - + add_separator(); - - adi(N_("Enter Path..." ), mini_buffer, MINI_PATH); - sta(GDK_KEY_slash, 0); - adi(N_("Shell Command..." ), mini_buffer, MINI_SHELL); - sta(GDK_KEY_exclam, GDK_SHIFT_MASK); - adi(N_("Terminal Here" ), xterm_here , FALSE); - sta(GDK_KEY_grave, 0); - adi(N_("Switch to Terminal"), xterm_here , TRUE); - + + adi(N_("Terminal Here" ), xterm_here, FALSE); + sta(GDK_KEY_F4, 0); + adi(N_("Switch to Terminal"), xterm_here, TRUE); +/////////////////////////////////////////////////////////////////////////////////// start_menu(N_("Help"), filer_menu); - adi(N_("About "APPNAME"..."), menu_rox_help, HELP_ABOUT); - ads(N_("Show Help Files" ), menu_rox_help, HELP_DIR, GTK_STOCK_HELP); - sta(GDK_KEY_F1, 0); - adi(N_("About "APPNAME"..."), menu_rox_help, HELP_MANUAL); + adi(N_("About "APPNAME"..."), show_about_dialog, 0); + adi(N_(APPNAME " Manual"), menu_rox_help, HELP_MANUAL); +//////////////////////////////////////////////////////////////////////////////////// start_menu(NULL, filer_menu); - adi(N_("Customise Dir Menu..."), customise_directory_menu, 0); - - g_signal_connect(filer_menu, "selection-done", G_CALLBACK(menu_closed), NULL); g_signal_connect(filer_file_menu, "selection-done", G_CALLBACK(menu_closed), NULL); - g_signal_connect(filer_keys, "accel_changed", G_CALLBACK(save_menus), NULL); - //for accel update_new_files_menu(); update_directory_menu(); @@ -934,15 +873,6 @@ gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(filer_hidden_menu), filer_window->show_hidden); - gtk_check_menu_item_set_active( - GTK_CHECK_MENU_ITEM(filer_files_only_menu), - filer_window->files_only); - gtk_check_menu_item_set_active( - GTK_CHECK_MENU_ITEM(filer_dirs_only_menu), - filer_window->dirs_only); - gtk_check_menu_item_set_active( - GTK_CHECK_MENU_ITEM(filer_filter_dirs_menu), - filer_window->filter_directories); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(filer_sort_name_menu ), filer_window->sort_type == SORT_NAME ); @@ -963,12 +893,6 @@ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(filer_sort_group_menu ), filer_window->sort_type == SORT_GROUP); - gtk_check_menu_item_set_active( - GTK_CHECK_MENU_ITEM(filer_reverse_menu), - filer_window->sort_order != GTK_SORT_ASCENDING); - gtk_check_menu_item_set_active( - GTK_CHECK_MENU_ITEM(filer_auto_size_menu), - filer_window->display_style_wanted == AUTO_SIZE_ICONS); buffer = g_string_new(NULL); switch (n_selected) @@ -990,10 +914,6 @@ -1, NULL) ? file_item->leafname : _("(bad utf-8)")); - if (!can_set_run_action(file_item)) - menu_set_items_shaded(filer_file_menu, - TRUE, 10, 1); - break; default: shade_file_menu_items(TRUE); g_string_printf(buffer, _("%d items"), @@ -1021,12 +941,6 @@ !o_unique_filer_windows.int_value); gtk_widget_set_sensitive(filer_follow_sym, strcmp(filer_window->sym_path, filer_window->real_path) != 0); - gtk_widget_set_sensitive(filer_set_type, - xattr_supported(filer_window->real_path)); -#if defined(HAVE_GETXATTR) || defined(HAVE_ATTROPEN) - gtk_widget_set_sensitive(filer_xattrs, - xattr_supported(filer_window->real_path) && n_selected <= 1); -#endif if (n_selected && o_menu_quick.int_value) popup_menu = (state & GDK_CONTROL_MASK) @@ -1094,14 +1008,17 @@ else shift_action = N_("Open unmounted"); } - else if (item->flags & ITEM_FLAG_SYMLINK) - shift_action = N_("Show Target"); - else if (item->base_type == TYPE_DIRECTORY) - shift_action = N_("Look Inside"); - else if (item->base_type == TYPE_FILE) - shift_action = N_("Open As Text"); + else if (item->flags & ITEM_FLAG_SYMLINK) { + shift_action = N_("Show Target"); + } + else if (item->base_type == TYPE_DIRECTORY) { + shift_action = N_("Look Inside"); + } + else if (item->base_type == TYPE_FILE) { + shift_action = N_("Open As Text"); + } } - gtk_label_set_text(GTK_LABEL(menu_item), + gtk_label_set_markup(GTK_LABEL(menu_item), shift_action ? _(shift_action) : _("Shift Open")); gtk_widget_set_sensitive(menu_item, shift_action != NULL || next); @@ -1130,22 +1047,6 @@ display_change_size(window_with_focus, action == 1); } -static void change_size_auto(gpointer data, guint action, GtkWidget *widget) -{ - g_return_if_fail(window_with_focus != NULL); - - if (updating_menu) - return; - - if (window_with_focus->display_style_wanted == AUTO_SIZE_ICONS) - display_set_layout(window_with_focus, - window_with_focus->display_style, - window_with_focus->details_type, FALSE); - else - display_set_layout(window_with_focus, AUTO_SIZE_ICONS, - window_with_focus->details_type, FALSE); -} - static void set_with(gpointer data, guint action, GtkWidget *widget) { DisplayStyle size; @@ -1181,26 +1082,6 @@ wink_if(window_with_focus); } -static void reverse_sort(gpointer data, guint action, GtkWidget *widget) -{ - GtkSortType order; - - if (updating_menu) - return; - - g_return_if_fail(window_with_focus != NULL); - - order = window_with_focus->sort_order; - if (order == GTK_SORT_ASCENDING) - order = GTK_SORT_DESCENDING; - else - order = GTK_SORT_ASCENDING; - - display_set_sort_type(window_with_focus, window_with_focus->sort_type, - order); - wink_if(window_with_focus); -} - static void hidden(gpointer data, guint action, GtkWidget *widget) { if (updating_menu) @@ -1211,26 +1092,6 @@ display_set_hidden(window_with_focus, !window_with_focus->show_hidden); } -static void only_dirs(gpointer data, guint action, GtkWidget *widget) -{ - if (updating_menu) - return; - - g_return_if_fail(window_with_focus != NULL); - FilerWindow *fw = window_with_focus; - - if (action) //dir - { - fw->dirs_only = !fw->dirs_only; - fw->files_only = FALSE; - } - else //faile - { - fw->dirs_only = FALSE; - fw->files_only = !fw->files_only; - } - display_update_hidden(fw); -} static void filter_directories(gpointer data, guint action, GtkWidget *widget) { @@ -1267,20 +1128,6 @@ filer_refresh_thumbs(window_with_focus); } -static void save_settings(gpointer data, guint action, GtkWidget *widget) -{ - g_return_if_fail(window_with_focus != NULL); - - filer_save_settings(window_with_focus, FALSE); -} - -static void save_settings_parent(gpointer data, guint action, GtkWidget *widget) -{ - g_return_if_fail(window_with_focus != NULL); - - filer_save_settings(window_with_focus, TRUE); -} - static void delete(FilerWindow *filer_window) { GList *paths; @@ -1305,30 +1152,6 @@ destroy_glist(&paths); } -static void set_type_items(FilerWindow *filer_window) -{ - GList *paths, *p; - int npass=0, nfail=0; - - paths = filer_selected_items(filer_window); - for(p=paths; p; p=g_list_next(p)) { - if(xattr_supported((const char *) p->data)) - npass++; - else - nfail++; - } - if(npass==0) - report_error(_("Extended attributes, used to store types, are not supported for this " - "file or files.\n" - "This may be due to lack of support from the filesystem or the C library, " - "or it may simply be that the filesystem needs to be mounted with " - "the right mount option ('user_xattr' on Linux).")); - else if(nfail>0) - report_error(_("Setting type not supported for some of these files")); - if(npass>0) - action_settype(paths, FALSE, NULL); - destroy_glist(&paths); -} static void find(FilerWindow *filer_window) { @@ -1578,16 +1401,6 @@ return TRUE; } -static void run_action(DirItem *item) -{ - if (can_set_run_action(item)) - type_set_handler_dialog(item->mime_type); - else - report_error( - _("You can only set the run action for a " - "regular file")); -} - void open_home(gpointer data, guint action, GtkWidget *widget) { filer_opendir(home_dir, NULL, NULL, FALSE); @@ -1609,21 +1422,6 @@ view_clear_selection(window_with_focus->view); } -static gboolean invert_cb(ViewIter *iter, gpointer data) -{ - return !view_get_selected((ViewIface *) data, iter); -} - -static void invert_selection(gpointer data, guint action, GtkWidget *widget) -{ - g_return_if_fail(window_with_focus != NULL); - - window_with_focus->temp_item_selected = FALSE; - - view_select_if(window_with_focus->view, invert_cb, - window_with_focus->view); -} - void menu_show_options(gpointer data, guint action, GtkWidget *widget) { GtkWidget *win; @@ -1832,23 +1630,6 @@ g_free(base); } -static void customise_directory_menu(gpointer data) -{ - char *path; - char *leaf = g_strconcat(".", inode_directory->media_type, NULL); - - path = choices_find_xdg_path_save(leaf, "SendTo", TRUE); - g_free(leaf); - - mkdir(path, 0755); - filer_opendir(path, NULL, NULL, FALSE); - g_free(path); - - info_message( - _("Symlink any programs you want into this directory. \n\n" - "Tip: Directories and `Set Icon' may make it more usefull.")); -} - void show_menu_new(FilerWindow *filer_window) { window_with_focus = filer_window; @@ -2076,11 +1857,6 @@ for (; list; list = g_list_delete_link(list, list)) gtk_menu_shell_append(GTK_MENU_SHELL(menu), list->data); - item = gtk_menu_item_new_with_label(_("Customise...")); - g_signal_connect_swapped(item, "activate", - G_CALLBACK(customise_send_to), NULL); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); - g_signal_connect(menu, "selection-done", G_CALLBACK(menu_closed), NULL); popup_menu = menu; @@ -2101,12 +1877,6 @@ g_list_free(widgets); } - item = gtk_menu_item_new_with_label(_("Customise Dir menu...")); - g_signal_connect_swapped(item, "activate", - G_CALLBACK(customise_directory_menu), NULL); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); - - g_signal_connect(menu, "selection-done", G_CALLBACK(menu_closed), NULL); popup_menu = menu; @@ -2135,6 +1905,15 @@ gtk_widget_destroy(window_with_focus->window); } +static void find_from_here(gpointer data, guint action, GtkWidget *widget) +{ + g_return_if_fail(window_with_focus != NULL); + char* disp_path = window_with_focus->sym_path; + char* cmd = g_strdup_printf( "/usr/local/bin/ff.py \'%s\'", disp_path ); + g_spawn_command_line_async( cmd, NULL ); + g_free( cmd ); +} + static void home_directory(gpointer data, guint action, GtkWidget *widget) { g_return_if_fail(window_with_focus != NULL); @@ -2149,13 +1928,6 @@ bookmarks_show_menu(window_with_focus, NULL); } -static void show_log(gpointer data, guint action, GtkWidget *widget) -{ - g_return_if_fail(window_with_focus != NULL); - - log_show_window(); -} - static void follow_symlinks(gpointer data, guint action, GtkWidget *widget) { g_return_if_fail(window_with_focus != NULL); @@ -2212,48 +1984,15 @@ gtk_widget_destroy(window_with_focus->window); } -static void mini_buffer(gpointer data, guint action, GtkWidget *widget) -{ - MiniType type = (MiniType) action; - - g_return_if_fail(window_with_focus != NULL); - - /* Item needs to remain selected... */ - if (type == MINI_SHELL) - window_with_focus->temp_item_selected = FALSE; - - minibuffer_show(window_with_focus, type, 0); -} - void menu_rox_help(gpointer data, guint action, GtkWidget *widget) { if (action == HELP_ABOUT) infobox_new(app_dir); - else if (action == HELP_DIR) - filer_opendir(make_path(app_dir, "Help"), NULL, NULL, FALSE); else if (action == HELP_MANUAL) { gchar *manual = NULL; - - if (current_lang) - { - manual = g_strconcat(app_dir, "/Help/Manual-", - current_lang, ".html", NULL); - if (!file_exists(manual) && strchr(current_lang, '_')) - { - /* Try again without the territory */ - strcpy(strrchr(manual, '_'), ".html"); - } - if (!file_exists(manual)) - null_g_free(&manual); - } - - if (!manual) - manual = g_strconcat(app_dir, - "/Help/Manual.html", NULL); - + manual = g_strconcat("/usr/doc/arox/arox_manual.html", NULL); run_by_path(manual); - g_free(manual); } else @@ -2354,16 +2093,21 @@ uri_list = g_strsplit_set(tmp, "\r\n", -1); g_free(tmp); } - + /* Either one local URI, or a list. If everything in the list * isn't local then we are stuck. */ GQueue gq = G_QUEUE_INIT; - for (gchar **uri_iter = uri_list + 1; *uri_iter; uri_iter++) +// gchar* name; +// GdkAtom atom; +// atom = gtk_selection_data_get_data_type(selection); +// name = gdk_atom_name(atom); +// info_message((name)); + for (gchar **uri_iter = uri_list; *uri_iter; uri_iter++) { - if (**uri_iter == '\0') continue; + if (**uri_iter == '\0') continue; char *path = get_local_path((EscapedPath *) *uri_iter); if (path) { @@ -2405,7 +2149,6 @@ "different machine - they will be " "ignored - sorry"); } - if (!gq.head) { if (ignore_no_local_paths == FALSE) @@ -2426,8 +2169,8 @@ destroy_glist(&gq.head); } - if (error) - delayed_error(_("Error getting file list: %s"), error); +// if (error) +// delayed_error(_("Error getting file list: %s"), error); g_strfreev(uri_list); gtk_selection_data_free(selection); @@ -2459,23 +2202,21 @@ case FILE_LINK_ITEM: prompt = _("Symlink ... ?"); break; + case FILE_COMPRESS_ITEM: + prompt = _("Compress ... ?"); + break; + case FILE_SHARE_ITEM: + prompt = _("Share ... ?"); + break; case FILE_OPEN_FILE: prompt = _("Shift Open ... ?"); break; + case COPY_PATH: + prompt = _("Copy what path ... ?"); + break; case FILE_PROPERTIES: prompt = _("Properties of ... ?"); break; -#if defined(HAVE_GETXATTR) || defined(HAVE_ATTROPEN) - case FILE_XATTRS: - prompt = _("Extended attributes of ... ?"); - break; -#endif - case FILE_SET_TYPE: - prompt = _("Set type of ... ?"); - break; - case FILE_RUN_ACTION: - prompt = _("Set run action for ... ?"); - break; case FILE_SET_ICON: prompt = _("Set icon for ... ?"); break; @@ -2523,9 +2264,6 @@ case FILE_CHMOD_ITEMS: chmod_items(window_with_focus); return; - case FILE_SET_TYPE: - set_type_items(window_with_focus); - return; case FILE_FIND: find(window_with_focus); return; @@ -2607,11 +2345,56 @@ _("Duplicate"), copy_cb, GDK_ACTION_COPY); break; + + case COPY_PATH: + gtk_clipboard_clear(gtk_clipboard_get(GDK_SELECTION_PRIMARY)); + gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY), path, strlen(path)); + gtk_clipboard_clear(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)); + gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), path, strlen(path)); + gtk_clipboard_store(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)); + break; + case FILE_RENAME_ITEM: src_dest_action_item(path, di_image(item), _("Rename"), rename_cb, GDK_ACTION_MOVE); break; + + case FILE_COMPRESS_ITEM: + ; + printf("%s \n", path); + const char* open_cmd = "/usr/local/bin/atool-compress"; + + if (n_selected > 1) + { + GList *items = NULL; + ViewIter iter; + + view_get_iter(window_with_focus->view, &iter, VIEW_ITER_SELECTED); + while ((item = iter.next(&iter))) + items = g_list_prepend(items, item->leafname); + items = g_list_reverse(items); + + char* cmd = g_strdup_printf( "%s \'%s\'", open_cmd, items ); + g_list_free(items); + break; + } + else + ; + char* cmd = g_strdup_printf( "%s \'%s\'", open_cmd, path ); + g_spawn_command_line_async( cmd, NULL ); + g_free( cmd ); + break; + + case FILE_SHARE_ITEM: + ; + printf("%s \n", path); + const char* open_cmd1 = "/usr/local/bin/woof-arox"; + char* cmd1 = g_strdup_printf( "%s \'%s\'", open_cmd1, path ); + g_spawn_command_line_async( cmd1, NULL ); + g_free( cmd1 ); + break; + case FILE_LINK_ITEM: src_dest_action_item(path, di_image(item), _("Symlink"), link_cb, @@ -2621,18 +2404,9 @@ filer_openitem(window_with_focus, &iter, OPEN_SAME_WINDOW | OPEN_SHIFT); break; - case FILE_RUN_ACTION: - run_action(item); - break; case FILE_SET_ICON: icon_set_handler_dialog(item, path); break; -#if defined(HAVE_GETXATTR) || defined(HAVE_ATTROPEN) - case FILE_XATTRS: - if(access(path, R_OK) == 0) - xattrs_browser(item, path); - break; -#endif default: g_warning("Unknown action!"); return; @@ -2681,3 +2455,34 @@ return g_list_append(NULL, align); } + +static void show_about_dialog() +{ + GtkWidget *about_dialog; + gchar *artists[] = {_("Several additional icons created or edited\nby Paul Sherman "), NULL}; + gchar *authors[] = {_("A Rox-Filer adaptation \nwritten for use in Absolute Linux by Paul Sherman.\n\nA third-generation fork of Rox-Filer, \n Rox-Filer - \nhttp://rox.sourceforge.net/desktop/ROX-Filer\n\n literocks (dimkr) - \n http://github.com/dimkr/literocks/commits/master\n\n literocks (jun7) - \nhttp://github.com/jun7/literocks\n\nArox (part of Absolute Linux) - \n https://www.absolutelinux.org"), NULL}; + + about_dialog = gtk_about_dialog_new (); + gtk_window_set_icon_name (GTK_WINDOW (about_dialog), "arox"); + g_object_set (about_dialog, + "artists", artists, + "authors", authors, + "comments", "\n\nFile Manager / Thumbnail Viewer\n\n", + "copyright", "Copyright (c) 2019-2021\nPaul Sherman", + "logo-icon-name", APPNAME, + "program-name", APPNAME, + "version", VERSION, + NULL); + gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(about_dialog), "https://www.absolutelinux.org"); + gtk_about_dialog_set_website_label(GTK_ABOUT_DIALOG(about_dialog), "Absolute Linux Homepage"); + gtk_about_dialog_set_license(GTK_ABOUT_DIALOG(about_dialog), "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. \n\nThis 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. \n\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA"); + gtk_about_dialog_set_wrap_license(GTK_ABOUT_DIALOG(about_dialog), TRUE); + + + gtk_dialog_run (GTK_DIALOG (about_dialog)); + gtk_widget_destroy (about_dialog); +} + + + + diff -Naur literocks-20210924/src/pixmaps.c arox-20220907/src/pixmaps.c --- literocks-20210924/src/pixmaps.c 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/pixmaps.c 2022-09-07 02:19:05.288647000 -0400 @@ -86,7 +86,6 @@ gchar *thumb_dir = "normal"; Option o_pixmap_thumb_file_size; -Option o_video_thumbnailer; Option o_purge_days; @@ -106,12 +105,30 @@ static guint next_order = 0; static const char *stocks[] = { - ROX_STOCK_SHOW_DETAILS, - ROX_STOCK_SHOW_HIDDEN, + ROX_STOCK_BOOKMARKS, + ROX_STOCK_COMPRESS, + ROX_STOCK_SHARE, + ROX_STOCK_COPY, + ROX_STOCK_COPYHERE, + ROX_STOCK_COUNT, + ROX_STOCK_DELETE, + ROX_STOCK_FIND, + ROX_STOCK_HOME, + ROX_STOCK_ICON, + ROX_STOCK_LINK, ROX_STOCK_MOUNT, ROX_STOCK_MOUNTED, + ROX_STOCK_PERMISSIONS, + ROX_STOCK_PROPERTIES, + ROX_STOCK_REFRESH, + ROX_STOCK_RENAME, + ROX_STOCK_RESIZE, + ROX_STOCK_SENDTO, + ROX_STOCK_SHOW_DETAILS, + ROX_STOCK_SHOW_HIDDEN, + ROX_STOCK_QTFM, ROX_STOCK_SYMLINK, - ROX_STOCK_XATTR, + ROX_STOCK_XATTR }; /* Static prototypes */ @@ -172,7 +189,6 @@ int i; option_add_int(&o_pixmap_thumb_file_size, "thumb_file_size", PIXMAP_THUMB_SIZE); - option_add_string(&o_video_thumbnailer, "video_thumbnailer", "ffmpegthumbnailer -i \"$1\" -o \"$2\" -s $3"); option_add_int(&o_purge_days, "purge_days", 90); option_add_notify(options_changed); @@ -300,7 +316,6 @@ { gchar *thumb_prog = NULL; if (!strcmp(type->media_type, "image") - || (!strcmp(type->media_type, "video") && *o_video_thumbnailer.value) || (thumb_prog = thumbnail_program(type))) { g_free(thumb_prog); @@ -373,7 +388,6 @@ /* Only attempt to load 'images' types ourselves */ if (thumb_prog == NULL && strcmp(type->media_type, "image") - && (strcmp(type->media_type, "video") || !*o_video_thumbnailer.value) ) { callback(data, NULL); return; /* Don't know how to handle this type */ @@ -418,18 +432,8 @@ _exit(1); } - if (!strcmp(type->media_type, "video") && *o_video_thumbnailer.value) - { - execlp("sh", "sh", "-c", o_video_thumbnailer.value, "sh", - rpath, - thumb_path_mk(rpath), - g_strdup_printf("%d", thumb_size), - NULL); - _exit(1); - } - else - create_thumbnail(rpath, type); + create_thumbnail(rpath, type); _exit(0); } @@ -463,9 +467,9 @@ g_free(path); mode_t old_mask = umask(0077); - //At least we don't need extensions being '.jpg' - gdk_pixbuf_save(thumb, thumbpath, "jpeg", NULL, - "quality", "77", + // keep thumbs as PNG to enable transparency + gdk_pixbuf_save(thumb, thumbpath, "png", NULL, + "compression", "9", NULL); umask(old_mask); @@ -485,7 +489,7 @@ g_free(uri); const char *dir = thumbdir(); - ans = g_strdup_printf("%s/%s.jpg", dir, md5); + ans = g_strdup_printf("%s/%s.png", dir, md5); g_free(md5); if (mkdirif && !g_file_test(dir, G_FILE_TEST_EXISTS)) @@ -1000,6 +1004,7 @@ goto out; } + time_t checktime = o_purge_days.int_value ? time(0) - (o_purge_days.int_value * 3600 * 24): 0; struct stat info; @@ -1010,12 +1015,12 @@ continue; if (o_purge_days.int_value - && !mc_lstat(make_path(path, ent->d_name), &info) - && info.st_atime > checktime) +// && !mc_lstat(make_path(path, ent->d_name), &info) + && info.st_atime > checktime){ continue; - - list = g_list_prepend(list, - g_strconcat(path, ent->d_name, NULL)); + } + + list = g_list_prepend(list, g_strconcat(path, ent->d_name, NULL)); } closedir(dir); diff -Naur literocks-20210924/src/toolbar.c arox-20220907/src/toolbar.c --- literocks-20210924/src/toolbar.c 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/toolbar.c 2021-12-02 20:30:47.000000000 -0500 @@ -70,26 +70,20 @@ /* Static prototypes */ static void toolbar_close_clicked(GtkWidget *widget, FilerWindow *filer_window); +static void toolbar_qtfm_clicked(GtkWidget *widget, FilerWindow *filer_window); static void toolbar_up_clicked(GtkWidget *widget, FilerWindow *filer_window); static void toolbar_home_clicked(GtkWidget *widget, FilerWindow *filer_window); static void toolbar_bookmarks_clicked(GtkWidget *widget, FilerWindow *filer_window); -static void toolbar_help_clicked(GtkWidget *widget, FilerWindow *filer_window); -static void toolbar_settings_clicked(GtkWidget *widget, FilerWindow *filer_window); static void toolbar_refresh_clicked(GtkWidget *widget, FilerWindow *filer_window); static void toolbar_size_clicked(GtkWidget *widget, FilerWindow *filer_window); -static void toolbar_autosize_clicked(GtkWidget *widget, FilerWindow *filer_window); static void toolbar_details_clicked(GtkWidget *widget, FilerWindow *filer_window); static void toolbar_hidden_clicked(GtkWidget *widget, FilerWindow *filer_window); -static void toolbar_dirs_clicked(GtkWidget *widget, - FilerWindow *filer_window); static void toolbar_select_clicked(GtkWidget *widget, FilerWindow *filer_window); -static void toolbar_new_clicked(GtkWidget *widget, - FilerWindow *filer_window); static void toolbar_sort_clicked(GtkWidget *widget, FilerWindow *filer_window); static GtkWidget *add_button(GtkWidget *bar, Tool *tool, @@ -113,9 +107,6 @@ static GList *build_tool_options(Option *option, xmlNode *node, guchar *label); static Tool all_tools[] = { - {N_("Close"), GTK_STOCK_CLOSE, N_("Close filer window"), - toolbar_close_clicked, DROP_NONE, FALSE, - FALSE}, {N_("Up"), GTK_STOCK_GO_UP, N_("Change to parent directory\n" " Right: Open parent directory\n" @@ -123,11 +114,9 @@ toolbar_up_clicked, DROP_TO_PARENT, TRUE, FALSE}, - {N_("Home"), GTK_STOCK_HOME, N_("Change to home directory\n" - " Right: Open home directory\n" - " Middle: Change to first bookmark"), - toolbar_home_clicked, DROP_TO_HOME, TRUE, - FALSE}, + {N_("Home"), ROX_STOCK_HOME, N_("Change to home directory"), + toolbar_home_clicked, DROP_TO_HOME, TRUE, + FALSE}, {N_("Jump"), ROX_STOCK_BOOKMARKS, N_("Bookmarks menu\n" " Right: Edit Bookmarks\n" @@ -135,73 +124,32 @@ toolbar_bookmarks_clicked, DROP_BOOKMARK, FALSE, TRUE}, - {N_("Scan"), GTK_STOCK_REFRESH, N_("Rescan directory contents\n" - " Middle: Delete/re-create thumbnail cache"), - toolbar_refresh_clicked, DROP_NONE, TRUE, - FALSE}, - - {N_("Size┼"), GTK_STOCK_ZOOM_IN, N_("Change icon size\n" - " Right: Change to smaller\n" - " Middle: Change to Auto Size\n" - " Scroll: Temporary huge zoom\n" - "Current size:\n" - " ┘ : Huge\n" - " ┤ : Large\n" - " ┐ : Small\n" - " ┌, ├ : Auto"), + {N_("Icon size"), ROX_STOCK_RESIZE, N_("Change icon size\n" + " Left: Larger\n" + " Right: smaller"), toolbar_size_clicked, DROP_NONE, TRUE, FALSE}, - {N_("Auto"), GTK_STOCK_ZOOM_FIT, N_("Automatic size mode"), - toolbar_autosize_clicked, DROP_NONE, TRUE, - FALSE}, - {N_("List"), ROX_STOCK_SHOW_DETAILS, N_("Show extra details\n" " Right: Rotate Icons with details\n" " Middle: Return to normal Icons View"), toolbar_details_clicked, DROP_NONE, TRUE, FALSE}, - {N_("Sort"), GTK_STOCK_SORT_ASCENDING, N_("Change sort criteria"), - toolbar_sort_clicked, DROP_NONE, FALSE, - FALSE}, - {N_("Hide"), ROX_STOCK_SHOW_HIDDEN, N_("Left: Show/hide hidden files\n" "Right: Show/hide thumbnails"), toolbar_hidden_clicked, DROP_NONE, TRUE, FALSE}, - {N_("Dirs"), GTK_STOCK_DIRECTORY, N_("Left: Show only directories\n" - "Right: Show only files"), - toolbar_dirs_clicked, DROP_NONE, FALSE, - FALSE}, - - {N_("Select"), GTK_STOCK_SELECT_ALL, N_("Left: Select all\n" - "Right: Invert selection"), - toolbar_select_clicked, DROP_NONE, FALSE, - FALSE}, - - {N_("New"), GTK_STOCK_ADD, N_("Left: New Directory\n" - "Middle: New Blank file\n" - "Right: Menu"), - toolbar_new_clicked, DROP_NONE, FALSE, - FALSE}, - - {N_("○"), GTK_STOCK_SAVE, N_("Save Current Display Settings...\n" - " Right: for parent/* \n" - " Middle: Clear to default settings\n" - "Under:\n" - " ▽: No settings\n" - " ▼: Own settings\n" - " ▶: Parent settings\n" - " ▷: Far parent settings" - ), - toolbar_settings_clicked, DROP_NONE, TRUE, - FALSE}, - - {N_("Help"), GTK_STOCK_HELP, N_("Show help"), - toolbar_help_clicked, DROP_NONE, TRUE, + {"QTFM", ROX_STOCK_QTFM, "Open with qtFM", + toolbar_qtfm_clicked, DROP_NONE, TRUE, + FALSE}, + + {N_("Scan"), ROX_STOCK_REFRESH, N_("Refresh directory contents\n" + " Middle: Delete/re-create thumbnail cache"), + toolbar_refresh_clicked, DROP_NONE, TRUE, FALSE}, + }; @@ -304,27 +252,6 @@ g_free(label); } -//static int in_idle_update = 0; -//static gboolean idle_update_cb(gpointer p) -//{ -// o_toolbar.has_changed = TRUE; -// option_notify(); -// o_toolbar.has_changed = FALSE; -// -// in_idle_update = 0; -// return FALSE; -//} -//static void idle_update() -//{ -// if (in_idle_update) return; -// in_idle_update = 1; -// -// g_idle_add(idle_update_cb, NULL); -//} - -/* Create, destroy or recreate toolbar for this window so that it - * matches the option setting. - */ void toolbar_update_toolbar(FilerWindow *filer_window) { g_return_if_fail(filer_window != NULL); @@ -350,8 +277,6 @@ create_toolbar(filer_window->toolbar, filer_window); gtk_widget_show_all(filer_window->toolbar); -// g_signal_connect_swapped(filer_window->toolbar, "style-changed", -// G_CALLBACK(idle_update), NULL); } filer_target_mode(filer_window, NULL, NULL, NULL); @@ -401,29 +326,6 @@ return ret; } -static void toolbar_help_clicked(GtkWidget *widget, FilerWindow *filer_window) -{ - if (get_release() != 1) - menu_rox_help(NULL, HELP_MANUAL, NULL); - else - filer_opendir(make_path(app_dir, "Help"), NULL, NULL, FALSE); -} - -static void toolbar_settings_clicked(GtkWidget *widget, FilerWindow *fw) -{ - gint eb = get_release(); - - if (eb == 1) - filer_save_settings(fw, FALSE); - else if (eb == 2) - { - filer_clear_settings(fw); - display_update_hidden(fw); - } - else - filer_save_settings(fw, TRUE); -} - static void toolbar_refresh_clicked(GtkWidget *widget, FilerWindow *filer_window) { @@ -441,20 +343,7 @@ static void toolbar_home_clicked(GtkWidget *widget, FilerWindow *filer_window) { - gint eb = get_release(); - - if (eb == 2) - { - gchar *staticret = bookmarks_get_top(); - if (staticret) - filer_change_to(filer_window, staticret, NULL); - } - else if (NEW_WIN_BUTTON(eb)) - { - filer_opendir(home_dir, filer_window, NULL, FALSE); - } - else - filer_change_to(filer_window, home_dir, NULL); + filer_change_to(filer_window, home_dir, NULL); } static void toolbar_bookmarks_clicked(GtkWidget *widget, @@ -521,12 +410,6 @@ } } -static void toolbar_autosize_clicked(GtkWidget *widget, FilerWindow *filer_window) -{ - display_set_layout(filer_window, AUTO_SIZE_ICONS, filer_window->details_type, - TRUE); -} - static void toolbar_size_clicked(GtkWidget *widget, FilerWindow *filer_window) { gint eb = get_release(); @@ -675,26 +558,6 @@ } } -static void toolbar_dirs_clicked(GtkWidget *widget, - FilerWindow *filer_window) -{ - switch (get_release()) - { - case 1: - filer_window->dirs_only = !filer_window->dirs_only; - filer_window->files_only = FALSE; - break; - case 2: - filer_window->dirs_only = FALSE; - filer_window->files_only = FALSE; - break; - default: - filer_window->dirs_only = FALSE; - filer_window->files_only = !filer_window->files_only; - } - display_update_hidden(filer_window); -} - static gboolean invert_cb(ViewIter *iter, gpointer data) { return !view_get_selected((ViewIface *) data, iter); @@ -858,23 +721,6 @@ return TRUE; } -static void toolbar_new_clicked(GtkWidget *widget, FilerWindow *filer_window) -{ - GdkEvent *event; - - event = get_current_event(GDK_BUTTON_RELEASE); - if (event->type == GDK_BUTTON_RELEASE) - { - if (((GdkEventButton *) event)->button == 1) - show_new_directory(filer_window); - else if (((GdkEventButton *) event)->button == 2) - show_new_file(filer_window); - else - show_menu_new(filer_window); - } - gdk_event_free(event); -} - /* If filer_window is NULL, the toolbar is for the options window */ static void create_toolbar(GtkWidget *bar, FilerWindow *filer_window) { @@ -1139,9 +985,6 @@ g_signal_connect(button, "scroll_event", G_CALLBACK(toolbar_button_scroll), NULL); - if (tool->clicked == toolbar_settings_clicked) - if (o_toolbar.int_value != TOOLBAR_NORMAL) - filer_window->toolbar_settings_text = GTK_LABEL(lbl); } else { @@ -1326,3 +1169,18 @@ return g_list_append(NULL, option->widget); } + +static void toolbar_qtfm_clicked(GtkWidget *widget, FilerWindow *filer_window) +{ + GdkEvent *event; + + event = get_current_event(GDK_BUTTON_RELEASE); + if (event->type == GDK_BUTTON_RELEASE && ((GdkEventButton *) event)->button == 1) + { + const char* open_cmd = "qtfm"; + char* cmd = g_strdup_printf( "%s \'%s\'", open_cmd, filer_window->sym_path ); + g_spawn_command_line_async( cmd, NULL ); + g_free( cmd ); + } + gdk_event_free(event); +} diff -Naur literocks-20210924/src/type.c arox-20220907/src/type.c --- literocks-20210924/src/type.c 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/type.c 2021-10-16 19:39:29.000000000 -0400 @@ -67,16 +67,16 @@ /* Colours for file types (same order as base types) */ static gchar *opt_type_colours[][2] = { - {"display_err_colour", "#ff0000"}, + {"display_err_colour", "#dddd00"}, {"display_unkn_colour", "#ffe700"}, - {"display_dir_colour", "#61fffe"}, + {"display_dir_colour", "#333333"}, {"display_pipe_colour", "#dccbff"}, {"display_sock_colour", "#ff90ff"}, - {"display_file_colour", "#ffffff"}, + {"display_file_colour", "#000000"}, {"display_cdev_colour", "#ffc488"}, {"display_bdev_colour", "#ffe9cf"}, {"display_door_colour", "#ff00ff"}, - {"display_exec_colour", "#75ff66"}, + {"display_exec_colour", "#ff0000"}, {"display_adir_colour", "#00e100"} }; #define NUM_TYPE_COLOURS\ @@ -94,6 +94,7 @@ static char *get_action_save_path(GtkWidget *dialog); static MIME_type *get_mime_type(const gchar *type_name, gboolean can_create); static gboolean remove_handler_with_confirm(const guchar *path); +static void set_icon_theme(void); /* Hash of all allocated MIME types, indexed by "media/subtype". * MIME_type structs are never freed; this table prevents memory leaks @@ -122,8 +123,9 @@ void type_init(void) { + int i; + icon_theme = gtk_icon_theme_new(); type_hash = g_hash_table_new(g_str_hash, g_str_equal); - icon_theme = gtk_icon_theme_get_default(); text_plain = get_mime_type("text/plain", TRUE); inode_directory = get_mime_type("inode/directory", TRUE); @@ -142,12 +144,12 @@ option_add_int(&o_display_colour_types, "display_colour_types", TRUE); - for (int i = 0; i < NUM_TYPE_COLOURS; i++) + for (i = 0; i < NUM_TYPE_COLOURS; i++) option_add_string(&o_type_colours[i], opt_type_colours[i][0], opt_type_colours[i][1]); alloc_type_colours(); - + set_icon_theme(); option_add_notify(options_changed); } @@ -1260,6 +1262,16 @@ return type->comment; } +static void set_icon_theme(void) +{ +// icon_theme = gtk_icon_theme_get_default(); + + const char* iconpath = "/usr/share/icons"; + gtk_icon_theme_set_custom_theme (icon_theme, "arox"); + gtk_icon_theme_set_search_path(icon_theme, &iconpath, 1); + gtk_icon_theme_rescan_if_needed(icon_theme); +} + GdkPixbuf *theme_load_icon(const gchar *icon_name, gint size, GtkIconLookupFlags flags, GError **perror) { @@ -1270,4 +1282,3 @@ flags, NULL); } - diff -Naur literocks-20210924/src/view_details.c arox-20220907/src/view_details.c --- literocks-20210924/src/view_details.c 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/view_details.c 2021-10-16 19:47:14.000000000 -0400 @@ -175,7 +175,14 @@ if (filer_window->sort_type != SORT_UNKNOWN) view_details_sort((ViewIface *) view_details); - + + GdkColor colorBlack; + colorBlack.red=0; + colorBlack.green=0; + colorBlack.blue=0; + gtk_widget_modify_text(GTK_WIDGET(view_details), + GTK_STATE_NORMAL, &colorBlack); + details_update_header_visibility(view_details); return GTK_WIDGET(view_details); diff -Naur literocks-20210924/src/xtypes.c arox-20220907/src/xtypes.c --- literocks-20210924/src/xtypes.c 2021-09-23 06:58:17.000000000 -0400 +++ arox-20220907/src/xtypes.c 2021-10-20 04:28:21.000000000 -0400 @@ -45,240 +45,6 @@ #include "gui_support.h" #include "run.h" -#if defined(HAVE_GETXATTR) -/* Linux implementation */ - -#include - -static int (*dyn_setxattr)(const char *path, const char *name, - const void *value, size_t size, int flags) = NULL; -static ssize_t (*dyn_getxattr)(const char *path, const char *name, - void *value, size_t size) = NULL; -static ssize_t (*dyn_listxattr)(const char *path, char *list, - size_t size) = NULL; -static int (*dyn_removexattr)(const char *path, - const char *name) = NULL; - -void xattr_init(void) -{ - void *libc; - - libc = dlopen("libc.so.6", RTLD_LAZY | RTLD_NOLOAD); - if (!libc) - { - /* Try a different name for uClib support */ - libc = dlopen("libc.so", RTLD_LAZY | RTLD_NOLOAD); - } - - if (!libc) - return; /* Give up on xattr support */ - - dyn_setxattr = (void *) dlsym(libc, "setxattr"); - dyn_getxattr = (void *) dlsym(libc, "getxattr"); - dyn_listxattr = (void *) dlsym(libc, "listxattr"); - dyn_removexattr = (void *) dlsym(libc, "removexattr"); -} - -int xattr_supported(const char *path) -{ - char buf[1]; - ssize_t nent; - - if (!dyn_getxattr) - return FALSE; - - if(path) { - errno=0; - nent=dyn_getxattr(path, XATTR_MIME_TYPE, buf, sizeof(buf)); - - if(nent<0 && errno==ENOTSUP) - return FALSE; - } - - return TRUE; -} - -int xattr_have(const char *path) -{ - ssize_t nent; - - if (!dyn_listxattr) - return FALSE; - - errno=0; - nent=dyn_listxattr(path, NULL, 0); - - if(nent<0 && errno==ERANGE) - return TRUE; - - return (nent>0); -} - -gchar *xattr_get(const char *path, const char *attr, int *len) -{ - ssize_t size; - gchar *buf; - - if (!dyn_getxattr) - return NULL; - - size = dyn_getxattr(path, attr, "", 0); - if (size > 0) - { - int new_size; - - buf = g_new(gchar, size + 1); - new_size = dyn_getxattr(path, attr, buf, size); - - if(size == new_size) - { - buf[size] = '\0'; - - if(len) - *len=(int) size; - - return buf; - } - - g_free(buf); - } - - return NULL; - -} - -/* 0 on success */ -int xattr_set(const char *path, const char *attr, - const char *value, int value_len) -{ - if (!dyn_setxattr) - { - errno = ENOSYS; - return 1; /* Set attr failed */ - } - - if(value && value_len<0) - value_len = strlen(value); - - return dyn_setxattr(path, attr, value, value_len, 0); -} - -/* 0 on success */ -int xattr_rem(const char *path, const char *attr) -{ - if(!dyn_setxattr) - { - errno = ENOSYS; - return 1; - } - - return dyn_removexattr(path, attr); -} - -#elif defined(HAVE_ATTROPEN) - -/* Solaris 9 implementation */ - -void xattr_init(void) -{ -} - -int xattr_supported(const char *path) -{ -#ifdef _PC_XATTR_ENABLED - if(!path) - return TRUE; - - return pathconf(path, _PC_XATTR_ENABLED); -#else - return FALSE; -#endif -} - -int xattr_have(const char *path) -{ -#ifdef _PC_XATTR_EXISTS - return pathconf(path, _PC_XATTR_EXISTS)>0; -#else - return FALSE; -#endif -} - -#define MAX_ATTR_SIZE BUFSIZ -gchar *xattr_get(const char *path, const char *attr, int *len) -{ - int fd; - char *buf=NULL; - int nb; - -#ifdef _PC_XATTR_EXISTS - if(!pathconf(path, _PC_XATTR_EXISTS)) - return NULL; -#endif - - fd=attropen(path, attr, O_RDONLY); - - if(fd>=0) { - buf = g_new(gchar, MAX_ATTR_SIZE); - nb=read(fd, buf, MAX_ATTR_SIZE); - if(nb>0) { - buf[nb]=0; - } - close(fd); - - if(len) - *len=nb; - } - - return buf; -} - -int xattr_set(const char *path, const char *attr, - const char *value, int value_len) -{ - int fd; - int nb; - - if(value && value_len<0) - value_len = strlen(value); - - fd=attropen(path, attr, O_WRONLY|O_CREAT, 0644); - if(fd>0) { - - nb=write(fd, value, value_len); - if(nb==value_len) - ftruncate(fd, (off_t) nb); - - close(fd); - - if(nb>0) - return 0; - } - - return 1; /* Set type failed */ -} - -int xattr_rem(const char *path, const char *attr) -{ - int fd; - int er; - - fd=attropen(path, ".", O_WRONLY); - if(fd>0) { - - er=unlinkat(fd, attr, 0); - close(fd); - - if(er<0) - return 0; - } - - return 1; -} - -#else -/* No extended attributes available */ - void xattr_init(void) { } @@ -311,7 +77,6 @@ errno = ENOSYS; return 1; } -#endif MIME_type *xtype_get(const char *path) { @@ -367,460 +132,3 @@ } return col; } - -/* Extended attributes browser */ -#if defined(HAVE_GETXATTR) /* Linux-only for now */ - -enum -{ - COLUMN_NAME, - COLUMN_VALUE, - COLUMN_EDNAM, - COLUMN_EDVAL, - COLUMN_RMABL -}; - -enum -{ - MODE_CREATE, - MODE_REPLACE, - MODE_REMOVE -}; - -typedef struct -{ - gchar *name; - gchar *value; - int mode; - int user; -} -XAttr; - -GArray* xattr_list(const char *path) -{ - ssize_t len; - gchar *list; - gchar *l; - GArray *xarr; - XAttr at; - - xarr = g_array_sized_new(FALSE,FALSE,sizeof(XAttr),0); - - len = dyn_listxattr(path, NULL, 0); - if(len <= 0) - return xarr; - - list = g_new(gchar, len); - len = dyn_listxattr(path, list, len); - if(len < 0) - return xarr; - - for(l=list;l != list + len;l = strchr(l,'\0')+1) { - if(*l == '\0') - continue; - - if(g_regex_match_simple("^user\\.",l,0,0) == TRUE) - at.user = 1; - else - at.user = 0; - - at.name = g_strdup_printf("%s",l); - at.value = xattr_get(path, at.name, NULL); - if(at.value == NULL) - at.value = g_strdup(""); - - g_array_append_vals(xarr, &at, 1); - } - - g_free(list); - - return xarr; -} - - -void xattr_copy(const char *src_path, const char *dest_path) { - if (!dyn_listxattr) return; - - GArray *arr = xattr_list(src_path); - - int i; - for(i = 0; i < arr->len; i++) { - XAttr at = g_array_index(arr, XAttr, i); - xattr_set(dest_path, at.name, at.value, -1); - - g_free(at.name); - g_free(at.value); - } - - g_array_free(arr, TRUE); -} - - -GArray* compare_arrays(GArray *old, GArray *new) -{ - gint i,j; - gboolean flag; - GArray *A; - XAttr at; - - A = g_array_sized_new(FALSE,FALSE,sizeof(XAttr),0); - - /* Inefficient, good for small number of xattrs */ - for(i=0;ilen;i++) { - if(g_array_index(new, XAttr, i).user == 0) - continue; - flag = FALSE; - at.name = g_array_index(new, XAttr, i).name; - for(j=0;jlen;j++) { - if(g_strcmp0(at.name,g_array_index(old, XAttr, j).name) == 0) { - flag = TRUE; - if(g_strcmp0(g_array_index(new, XAttr, i).value, - g_array_index(old, XAttr, j).value) != 0) { - at.value = g_array_index(new, XAttr, i).value; - at.mode = MODE_REPLACE; - g_array_append_vals(A, &at, 1); - } - g_array_remove_index(old, j); - break; - } - } - if(flag == FALSE) { - at.value = g_array_index(new, XAttr, i).value; - at.mode = MODE_CREATE; - g_array_append_vals(A, &at, 1); - } - } - - for(j=0;jlen;j++) { - if(g_array_index(old, XAttr, j).user == 0) - continue; - at.name = g_array_index(old, XAttr, j).name; - at.mode = MODE_REMOVE; - g_array_append_vals(A, &at, 1); - } - - return A; -} - -GArray* copy_array(GArray *A) -{ - gint i; - GArray *B; - guint len = A->len; - XAttr at; - - B = g_array_sized_new(FALSE,FALSE,sizeof(XAttr),len); - for(i=0;ilen;i++) { - if(g_array_index(arr,XAttr,i).user == 1) - { - edit = TRUE; - rmable = TRUE; - } - else - { - edit = FALSE; - rmable = FALSE; - } - - name = g_array_index(arr,XAttr,i).name; - value = g_array_index(arr,XAttr,i).value; - u8nam = to_utf8(name); - u8val = to_utf8(value); - if(!g_utf8_validate(value,-1,NULL)) - edit = FALSE; - - gtk_list_store_append(model,&iter); - gtk_list_store_set(model,&iter,COLUMN_NAME,u8nam,COLUMN_VALUE,u8val, - COLUMN_EDNAM,FALSE,COLUMN_EDVAL,edit,COLUMN_RMABL,rmable,-1); - g_free(u8nam); - g_free(u8val); - } - return GTK_TREE_MODEL(model); -} - -static void dialog_response(GtkWidget *dialog, gint response, gpointer data) -{ - switch(response) { - case GTK_RESPONSE_CLOSE: { - g_array_free(((gpointer *)data)[1],TRUE); - g_array_free(((gpointer *)data)[3],TRUE); - g_free(((gpointer *)data)[4]); - g_free(data); - gtk_widget_destroy(dialog); - } - break; - - case GTK_RESPONSE_APPLY: { - GArray *arr = (GArray *)((gpointer *)data)[1]; - GArray *arr_old = (GArray *)((gpointer *)data)[3]; - GArray *changes; - gchar *rp, *path = (gchar *)((gpointer *)data)[4]; - GtkTreeView *tree = (GtkTreeView *)((gpointer *)data)[2]; - gint i, mod; - /*g_print("OLD\n");*/ - /*for(i=0;ilen;i++)*/ - /*g_print("%s: %s %d\n",*/ - /*g_array_index(arr_old, XAttr, i).name,*/ - /*g_array_index(arr_old, XAttr, i).value,*/ - /*g_array_index(arr_old, XAttr, i).user); */ - /*g_print("NEW\n");*/ - /*for(i=0;ilen;i++)*/ - /*g_print("%s: %s %d\n",*/ - /*g_array_index(arr, XAttr, i).name,*/ - /*g_array_index(arr, XAttr, i).value,*/ - /*g_array_index(arr, XAttr, i).user); */ - /*g_print("CHANGES\n");*/ - changes = compare_arrays(arr_old, arr); - for(i=0;ilen;i++) { - /*g_print("%s %d\n",g_array_index(changes,XAttr,i).name,g_array_index(changes,XAttr,i).mode);*/ - mod = g_array_index(changes,XAttr,i).mode; - switch(mod) { - case MODE_CREATE: - case MODE_REPLACE: - xattr_set(path,g_array_index(changes,XAttr,i).name,g_array_index(changes,XAttr,i).value,-1); - break; - case MODE_REMOVE: - xattr_rem(path,g_array_index(changes,XAttr,i).name); - break; - default: - break; - } - } - - rp = pathdup(path); - if (changes->len > 0 && strcmp(rp, path)) - /* When a symlink file is changed, - * in actuality, changed file is lenked file, not the symlink file. - * So without this, no update runs. */ - examine(path); - - g_free(rp); - g_array_free(arr,TRUE); - g_array_free(arr_old,TRUE); - g_array_free(changes,TRUE); - arr = xattr_list(path); - arr_old = copy_array(arr); - ((gpointer *)data)[1] = arr; - ((gpointer *)data)[3] = arr_old; - ((gpointer *)data)[0] = create_model(arr); - gtk_tree_view_set_model(tree, (GtkTreeModel *)((gpointer *)data)[0]); - } - break; - } -} - -static void add_item(GtkWidget *button, gpointer data) -{ - XAttr item; - GtkTreeIter iter; - GtkTreeModel *model = (GtkTreeModel *)((gpointer *)data)[0]; - GArray *arr = (GArray *)((gpointer *)data)[1]; - - item.name = g_strdup("user."); - item.value = g_strdup(""); - item.user = 1; - g_array_append_vals(arr,&item,1); - - gtk_list_store_append(GTK_LIST_STORE(model),&iter); - gtk_list_store_set(GTK_LIST_STORE(model),&iter, - COLUMN_NAME,item.name,COLUMN_VALUE,item.value,COLUMN_EDNAM,TRUE, - COLUMN_EDVAL,TRUE,COLUMN_RMABL,TRUE,-1); -} - -static void remove_item(GtkWidget *button, gpointer data) -{ - GtkTreeIter iter; - GtkTreeView *treeview = (GtkTreeView *)((gpointer *)data)[2]; - GtkTreeModel *model = gtk_tree_view_get_model(treeview); - GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); - GArray *arr = (GArray *)((gpointer *)data)[1]; - - if (gtk_tree_selection_get_selected(selection, NULL, &iter)) { - gint i; - GtkTreePath *path; - gboolean rmable; - - gtk_tree_model_get(model, &iter, COLUMN_RMABL, &rmable, -1); - if(rmable == TRUE) { - path = gtk_tree_model_get_path(model, &iter); - i = gtk_tree_path_get_indices(path)[0]; - gtk_list_store_remove(GTK_LIST_STORE(model), &iter); - - g_array_remove_index(arr,i); - - gtk_tree_path_free(path); - } - } -} - -static void cell_edited(GtkCellRendererText *cell, const gchar *path_string, const gchar *new_text, gpointer data) -{ - GArray *arr = (GArray *)((gpointer *)data)[1]; - GtkTreeModel *model = (GtkTreeModel *)((gpointer *)data)[0]; - GtkTreePath *path = gtk_tree_path_new_from_string(path_string); - GtkTreeIter iter; - - gint column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cell), "column")); - - gtk_tree_model_get_iter(model, &iter, path); - - switch (column) { - case COLUMN_NAME: - { - gint i; - gchar *old_text, *ascii; - - gtk_tree_model_get(model, &iter, column, &old_text, -1); - g_free(old_text); - - i = gtk_tree_path_get_indices(path)[0]; - g_free(g_array_index(arr, XAttr, i).name); - ascii = g_str_to_ascii(new_text,"C"); - if(g_regex_match_simple("^user\\.",ascii,0,0) == TRUE) - g_array_index(arr, XAttr, i).name = g_strdup(ascii); - else - g_array_index(arr, XAttr, i).name = g_strdup_printf("user.%s",ascii); - g_free(ascii); - - gtk_list_store_set(GTK_LIST_STORE(model), &iter, column, - g_array_index(arr, XAttr, i).name, -1); - - } - break; - - case COLUMN_VALUE: - { - gint i; - gchar *old_text; - - gtk_tree_model_get(model, &iter, column, &old_text, -1); - g_free(old_text); - - i = gtk_tree_path_get_indices(path)[0]; - g_free(g_array_index(arr, XAttr, i).value); - g_array_index(arr, XAttr, i).value = g_strdup(new_text); - - gtk_list_store_set(GTK_LIST_STORE(model), &iter, column, - g_array_index(arr, XAttr, i).value, -1); - } - break; - } - - gtk_tree_path_free(path); -} - -void xattrs_browser(DirItem *item, const guchar *path) -{ - GtkDialog *dialog; - GtkWidget *content, *hbox, *name; - GtkWidget *sw; - GtkWidget *tree; - GtkWidget *but; - GtkTreeModel *mod; - GArray *arr, *arr_old; - GtkCellRenderer *ren; - gpointer *data; - - g_return_if_fail(item != NULL && path != NULL); - - data = g_new(gpointer, 5); - arr = xattr_list(path); - arr_old = copy_array(arr); /* keep original attribute list */ - - dialog = GTK_DIALOG(gtk_dialog_new()); - gtk_window_set_title(GTK_WINDOW(dialog), _("Extended attributes")); - gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE); - gtk_window_set_default_size(GTK_WINDOW(dialog),500,390); - - content = gtk_dialog_get_content_area(dialog); - - hbox = gtk_hbox_new(FALSE,4); - gtk_box_pack_start(GTK_BOX(content), hbox, FALSE, TRUE, 4); - gtk_box_pack_start(GTK_BOX(hbox), - gtk_image_new_from_pixbuf(di_image(item)->pixbuf), - FALSE, FALSE, 4); - - if (g_utf8_validate(item->leafname, -1, NULL)) - name = gtk_label_new(item->leafname); - else - { - guchar *u8; - - u8 = to_utf8(item->leafname); - name = gtk_label_new(u8); - g_free(u8); - } - gtk_label_set_line_wrap(GTK_LABEL(name), TRUE); - gtk_label_set_line_wrap_mode(GTK_LABEL(name), PANGO_WRAP_WORD_CHAR); - gtk_box_pack_start(GTK_BOX(hbox), name, FALSE, TRUE, 4); - - make_heading(name, PANGO_SCALE_X_LARGE); - - sw = gtk_scrolled_window_new(NULL,NULL); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), - GTK_SHADOW_ETCHED_IN); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), - GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); - gtk_box_pack_start(GTK_BOX(content),sw,TRUE,TRUE,0); - - mod = create_model(arr); - tree = gtk_tree_view_new_with_model(mod); - /* wrapper for variable passing */ - data[0] = mod; data[1] = arr; data[2] = tree; data[3] = arr_old; data[4] = g_strdup(path); - gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree),TRUE); - gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)), - GTK_SELECTION_SINGLE); - /* add columns */ - ren = gtk_cell_renderer_text_new(); - g_signal_connect(ren, "edited", G_CALLBACK(cell_edited), data); - g_object_set_data(G_OBJECT(ren),"column",GINT_TO_POINTER(0)); - gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(tree),-1, - "Name",ren,"text",COLUMN_NAME,"editable",COLUMN_EDNAM,"sensitive",COLUMN_EDNAM,NULL); - ren = gtk_cell_renderer_text_new(); - g_signal_connect(ren, "edited", G_CALLBACK(cell_edited), data); - g_object_set_data(G_OBJECT(ren),"column",GINT_TO_POINTER(1)); - gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(tree),-1, - "Value",ren,"text",COLUMN_VALUE,"editable",COLUMN_EDVAL,"sensitive",COLUMN_EDVAL,NULL); - g_object_unref(mod); - gtk_container_add(GTK_CONTAINER(sw),tree); - - hbox = gtk_hbox_new(FALSE,4); - but = gtk_button_new_from_stock(GTK_STOCK_ADD); - g_signal_connect(but, "clicked", G_CALLBACK(add_item), data); - gtk_box_pack_start(GTK_BOX(hbox),but,FALSE,FALSE,0); - but = gtk_button_new_from_stock(GTK_STOCK_REMOVE); - g_signal_connect(but, "clicked", G_CALLBACK(remove_item), data); - gtk_box_pack_start(GTK_BOX(hbox),but,FALSE,FALSE,0); - gtk_box_pack_start(GTK_BOX(content),hbox,FALSE,FALSE,0); - - gtk_dialog_add_button(dialog,GTK_STOCK_APPLY,GTK_RESPONSE_APPLY); - gtk_dialog_add_button(dialog,GTK_STOCK_CLOSE,GTK_RESPONSE_CLOSE); - g_signal_connect(dialog, "response", G_CALLBACK(dialog_response), data); - gtk_dialog_set_default_response(dialog, GTK_RESPONSE_OK); - gtk_widget_show_all(GTK_WIDGET(dialog)); -} -#endif