static void path_list_recursive_append(GList **list, GList *dirs) { GList *work; work = dirs; while (work) { const gchar *path = work->data; GList *f = NULL; GList *d = NULL; if (path_list(path, &f, &d)) { f = path_list_filter(f, FALSE); f = path_list_sort(f); *list = g_list_concat(*list, f); d = path_list_filter(d, TRUE); d = path_list_sort(d); path_list_recursive_append(list, d); path_list_free(d); } work = work->next; } }
static void command_done (CommandData *cdata) { if (cdata == NULL) return; if ((cdata->temp_dir != NULL) && path_is_dir (cdata->temp_dir)) { char *argv[4]; argv[0] = "rm"; argv[1] = "-rf"; argv[2] = cdata->temp_dir; argv[3] = NULL; g_spawn_sync (g_get_tmp_dir (), argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL, NULL, NULL); } g_free (cdata->command); if (cdata->app != NULL) g_object_unref (cdata->app); path_list_free (cdata->file_list); g_free (cdata->temp_dir); if (cdata->process != NULL) g_object_unref (cdata->process); CommandList = g_list_remove (CommandList, cdata); g_free (cdata); }
static void gth_monitor_finalize (GObject *object) { GthMonitor *monitor = GTH_MONITOR (object); if (monitor->priv != NULL) { GthMonitorPrivateData *priv = monitor->priv; int i; if (priv->vfs_monitors != NULL) { g_list_foreach (priv->vfs_monitors, (GFunc) monitor_handle_destroy, NULL); g_list_free (priv->vfs_monitors); priv->vfs_monitors = NULL; } for (i = 0; i < MONITOR_EVENT_NUM; i++) path_list_free (priv->monitor_events[i]); /**/ g_free (monitor->priv); monitor->priv = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); }
static void info_window_destroy_cb(GtkWidget *widget, gpointer data) { InfoData *id = data; info_tabs_free(id); path_list_free(id->list); g_free(id); }
void bookmark_list_free (BookmarkList *book_list) { g_return_if_fail (book_list != NULL); if (book_list->list != NULL) path_list_free (book_list->list); g_free (book_list); }
static gboolean egg_tree_multi_drag_motion_event (GtkWidget *widget, GdkEventMotion *event, gpointer data) { EggTreeMultiDndData *priv_data; priv_data = g_object_get_data (G_OBJECT (widget), EGG_TREE_MULTI_DND_STRING); if (gtk_drag_check_threshold (widget, priv_data->x, priv_data->y, event->x, event->y)) { GList *path_list = NULL; GtkTreeSelection *selection; GtkTreeModel *model; GdkDragContext *context; TreeViewDragInfo *di; di = get_info (GTK_TREE_VIEW (widget)); if (di == NULL) return FALSE; selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)); stop_drag_check (widget); gtk_tree_selection_selected_foreach (selection, selection_foreach, &path_list); path_list = g_list_reverse (path_list); model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget)); if (egg_tree_multi_drag_source_row_draggable (EGG_TREE_MULTI_DRAG_SOURCE (model), path_list)) { context = gtk_drag_begin (widget, #if GTK_CHECK_VERSION (2, 14, 0) gtk_drag_source_get_target_list (widget), #else di->source_target_list, #endif di->source_actions, priv_data->pressed_button, (GdkEvent*)event); set_context_data (context, path_list); gtk_drag_set_icon_default (context); } else { path_list_free (path_list); } } return TRUE; }
static void bookmarks_free_data (Bookmarks *bookmarks) { if (bookmarks->list != NULL) { path_list_free (bookmarks->list); bookmarks->list = NULL; } g_hash_table_foreach_remove (bookmarks->names, remove_all, NULL); g_hash_table_foreach_remove (bookmarks->tips, remove_all, NULL); }
static gboolean egg_tree_multi_drag_motion_event (GtkWidget *widget, GdkEventMotion *event, gpointer data) { EggTreeMultiDndData *priv_data; priv_data = g_object_get_data (G_OBJECT (widget), EGG_TREE_MULTI_DND_STRING); if (gtk_drag_check_threshold (widget, priv_data->x, priv_data->y, event->x, event->y)) { GList *path_list = NULL; GtkTreeSelection *selection; GtkTreeModel *model; GdkDragContext *context; stop_drag_check (widget); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)); gtk_tree_selection_selected_foreach (selection, selection_foreach, &path_list); if (path_list == NULL) return FALSE; path_list = g_list_reverse (path_list); model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget)); if (egg_tree_multi_drag_source_row_draggable (EGG_TREE_MULTI_DRAG_SOURCE (model), path_list)) { GtkTargetList *target_list = gtk_target_list_new (target_table, G_N_ELEMENTS (target_table)); context = gtk_drag_begin (widget, target_list, GDK_ACTION_COPY, priv_data->pressed_button, (GdkEvent*)event); set_context_data (context, path_list); gtk_drag_set_icon_default (context); gtk_target_list_unref (target_list); } else { path_list_free (path_list); } } return TRUE; }
/* called when the main dialog is closed. */ static void destroy_cb (GtkWidget *widget, DialogData *data) { if (! data->extract_clicked) { fr_window_pop_message (data->window); fr_window_stop_batch (data->window); } path_list_free (data->selected_files); g_free (data->base_dir_for_selection); g_object_unref (data->settings); g_free (data); }
void activate_action_view_or_open (GtkAction *action, gpointer data) { FrWindow *window = data; GList *file_list; file_list = fr_window_get_file_list_selection (window, FALSE, NULL); if (file_list == NULL) return; fr_window_open_files (window, file_list, FALSE); path_list_free (file_list); }
/* called when the main dialog is closed. */ static void open_with__destroy_cb (GtkWidget *widget, DialogData *data) { if (data->app_list != NULL) g_list_free (data->app_list); if (data->file_list != NULL) path_list_free (data->file_list); g_object_unref (data->builder); g_object_unref (data->settings); g_free (data); }
void bookmark_list_set (BookmarkList *book_list, GList *list) { GList *scan; g_return_if_fail (book_list != NULL); gtk_list_store_clear (book_list->list_store); if (book_list->list) path_list_free (book_list->list); /* Copy the list of paths. */ book_list->list = NULL; for (scan = list; scan; scan = scan->next) book_list->list = g_list_prepend ( book_list->list, g_strdup ((char*) scan->data)); book_list->list = g_list_reverse (book_list->list); /* Insert the bookmarks in the list. */ for (scan = book_list->list; scan; scan = scan->next) { char *name = scan->data; char *display_name; GtkTreeIter iter; GdkPixbuf *pixbuf; display_name = get_uri_display_name (name); if (display_name == NULL) display_name = g_strdup (_("(Invalid Name)")); if (book_list->menu_icons) pixbuf = gtk_widget_render_icon (book_list->list_view, get_stock_id_for_uri (name), GTK_ICON_SIZE_MENU, NULL); else pixbuf = get_icon_for_uri (book_list->list_view, name); gtk_list_store_append (book_list->list_store, &iter); gtk_list_store_set (book_list->list_store, &iter, BOOK_LIST_COLUMN_ICON, pixbuf, BOOK_LIST_COLUMN_NAME, display_name, BOOK_LIST_COLUMN_PATH, name, -1); g_free (display_name); g_object_unref (pixbuf); } }
static void cache_maintain_home_close (CMData * cm) { if (cm->idle_id != -1) gtk_idle_remove (cm->idle_id); if (cm->gd) generic_dialog_close (cm->gd); path_list_free (cm->list); g_list_free (cm->done_list); g_free (cm); }
void open_with_cb (GtkWidget *widget, void *callback_data) { FrWindow *window = callback_data; GList *file_list; file_list = fr_window_get_file_list_selection (window, FALSE, NULL); if (file_list == NULL) return; fr_window_open_files (window, file_list, TRUE); path_list_free (file_list); }
GList *path_list_recursive(const gchar *path) { GList *list = NULL; GList *d = NULL; if (!path_list(path, &list, &d)) return NULL; list = path_list_filter(list, FALSE); list = path_list_sort(list); d = path_list_filter(d, TRUE); d = path_list_sort(d); path_list_recursive_append(&list, d); path_list_free(d); return list; }
static gboolean remove_if_present (GList **monitor_events, MonitorEventType type, const char *path) { GList *list, *link; list = monitor_events[type]; link = path_list_find_path (list, path); if (link != NULL) { monitor_events[type] = g_list_remove_link (list, link); path_list_free (link); return TRUE; } return FALSE; }
static void file_data_multiple_free (FileDataMult * fdm) { if (fdm->progress) { gtk_grab_remove (fdm->progress); gtk_widget_destroy (fdm->progress); } if (fdm->count > 0 && !fdm->copy) thumbview_refresh (); path_list_free (fdm->source_list); g_free (fdm->dest_base); g_free (fdm->dest); g_free (fdm); }
static gboolean rb_tree_dnd_motion_notify_event_cb (GtkWidget *widget, GdkEventMotion *event, gpointer data) { RbTreeDndData *priv_data; priv_data = g_object_get_data (G_OBJECT (widget), RB_TREE_DND_STRING); if (gtk_drag_check_threshold (widget, priv_data->x, priv_data->y, event->x, event->y)) { GList *path_list = NULL; GtkTreeSelection *selection; GtkTreeModel *model; GdkDragContext *context; selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)); stop_drag_check (widget); gtk_tree_selection_selected_foreach (selection, selection_foreach, &path_list); path_list = g_list_reverse (path_list); model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget)); if (rb_tree_drag_source_row_draggable (RB_TREE_DRAG_SOURCE (model), path_list)) { rb_debug ("drag begin"); context = gtk_drag_begin (widget, priv_data->source_target_list, priv_data->source_actions, priv_data->pressed_button, (GdkEvent*)event); set_context_data (context, path_list); gtk_drag_set_icon_default (context); } else { path_list_free (path_list); } } return TRUE; }
static gboolean on_motion_event( GtkWidget *widget, GdkEventMotion *event, EggTreeMultiDragSource *drag_source ) { EggTreeMultiDndData *priv_data; priv_data = g_object_get_data( G_OBJECT( widget ), EGG_TREE_MULTI_DND_STRING ); if( gtk_drag_check_threshold( widget, priv_data->x, priv_data->y, event->x, event->y )){ GList *path_list = NULL; GtkTreeSelection *selection; GtkTreeModel *model; GdkDragContext *context; stop_drag_check( widget ); selection = gtk_tree_view_get_selection( GTK_TREE_VIEW( widget )); gtk_tree_selection_selected_foreach( selection, ( GtkTreeSelectionForeachFunc ) selection_foreach, &path_list ); path_list = g_list_reverse( path_list ); model = gtk_tree_view_get_model( GTK_TREE_VIEW( widget )); if( egg_tree_multi_drag_source_row_draggable( EGG_TREE_MULTI_DRAG_SOURCE( model ), path_list )){ GtkTargetList *target_list = v_get_target_list( drag_source ); GdkDragAction actions = v_get_drag_actions( drag_source ); context = gtk_drag_begin( widget, target_list, actions, priv_data->pressed_button, ( GdkEvent * ) event ); set_treeview_data( widget, path_list ); gtk_drag_set_icon_default( context ); v_free_target_list( drag_source, target_list ); } else { path_list_free( path_list ); } } return( TRUE ); }
void slideshow_free(SlideShowData *ss) { if (!ss) return; slideshow_timer_reset(ss, FALSE); if (ss->stop_func) ss->stop_func(ss, ss->stop_data); if (ss->path_list) path_list_free(ss->path_list); if (ss->cd) collection_unref(ss->cd); g_free(ss->layout_path); g_list_free(ss->list); g_list_free(ss->list_done); g_free(ss->slide_path); g_free(ss); }
static void gth_file_list_op_free (GthFileListOp *op) { switch (op->type) { case GTH_FILE_LIST_OP_TYPE_UPDATE_COMMENT: case GTH_FILE_LIST_OP_TYPE_UPDATE_THUMB: g_free (op->file.uri); break; case GTH_FILE_LIST_OP_TYPE_RENAME: case GTH_FILE_LIST_OP_TYPE_UPDATE_THUMB_LIST: path_list_free (op->file.uri_list); break; case GTH_FILE_LIST_OP_TYPE_ADD_LIST: case GTH_FILE_LIST_OP_TYPE_SET_LIST: file_data_list_free (op->file.fd_list); break; default: break; } g_free (op); }
static void dest_dnd_set_data(GtkWidget *view, GdkDragContext *context, GtkSelectionData *selection_data, 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; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); if (!gtk_tree_selection_get_selected(selection, &model, &iter)) return; gtk_tree_model_get(model, &iter, 1, &path, -1); if (!path) return; list = g_list_append(list, path); switch (info) { 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; } 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); }
void filter_rebuild(void) { GList *work; path_list_free(extension_list); extension_list = NULL; work = filter_list; while (work) { FilterEntry *fe; fe = work->data; work = work->next; if (fe->enabled) { GList *ext; ext = filter_to_list(fe->extensions); if (ext) extension_list = g_list_concat(extension_list, ext); } } }
/* This checks relative caches in dir/.thumbnails and * removes them if they have no source counterpart. */ gint cache_maintain_dir (CacheType type, const gchar * dir, gint recursive, gint clear) { GList *list = NULL; gchar *cachedir; gint still_have_a_file = FALSE; GList *work; if (type != CACHE_THUMBS) return FALSE; cachedir = g_strconcat (dir, "/", PORNVIEW_CACHE_DIR, NULL); path_list (cachedir, &list, NULL); work = list; while (work) { const gchar *path; gchar *source; path = work->data; work = work->next; source = g_strconcat (dir, "/", filename_from_path (path), NULL); if (clear || extension_truncate (source, PORNVIEW_CACHE_THUMB_EXT)) { if (!clear && isfile (source)) { still_have_a_file = TRUE; } else { if (unlink (path) < 0) { still_have_a_file = TRUE; } } } else { still_have_a_file = TRUE; } g_free (source); } path_list_free (list); g_free (cachedir); if (recursive) { list = NULL; path_list (dir, NULL, &list); work = list; while (work) { const gchar *path = work->data; work = work->next; still_have_a_file |= cache_maintain_dir (type, path, recursive, clear); } path_list_free (list); } return still_have_a_file; }
static void fr_command_jar_add (FrCommand *comm, const char *from_file, GList *file_list, const char *base_dir, gboolean update, gboolean recursive) { FrProcess *proc = comm->process; GList *zip_list = NULL, *jardata_list = NULL, *jar_list = NULL; GList *scan; char *tmp_dir; for (scan = file_list; scan; scan = scan->next) { char *filename = scan->data; char *path = build_uri (base_dir, filename, NULL); char *package = NULL; if (file_extension_is (filename, ".java")) package = get_package_name_from_java_file (path); else if (file_extension_is (filename, ".class")) package = get_package_name_from_class_file (path); if ((package == NULL) || (strlen (package) == 0)) zip_list = g_list_append (zip_list, g_strdup (filename)); else { JarData *newdata = g_new0 (JarData, 1); newdata->package_minus_one_level = remove_level_from_path (package); newdata->link_name = g_strdup (file_name_from_path (package)); newdata->rel_path = remove_level_from_path (filename); newdata->filename = g_strdup (file_name_from_path (filename)); jardata_list = g_list_append (jardata_list, newdata); } g_free (package); g_free (path); } tmp_dir = get_temp_work_dir (NULL); for (scan = jardata_list; scan ; scan = scan->next) { JarData *jdata = scan->data; char *pack_path; char *old_link; char *link_name; int retval; pack_path = build_uri (tmp_dir, jdata->package_minus_one_level, NULL); if (! make_directory_tree_from_path (pack_path, 0755, NULL)) { g_free (pack_path); continue; } old_link = build_uri (base_dir, jdata->rel_path, NULL); link_name = g_build_filename (pack_path, jdata->link_name, NULL); retval = symlink (old_link, link_name); if ((retval != -1) || (errno == EEXIST)) jar_list = g_list_append (jar_list, g_build_filename (jdata->package_minus_one_level, jdata->link_name, jdata->filename, NULL)); g_free (link_name); g_free (old_link); g_free (pack_path); } if (zip_list != NULL) parent_class->add (comm, NULL, zip_list, base_dir, update, FALSE); if (jar_list != NULL) parent_class->add (comm, NULL, jar_list, tmp_dir, update, FALSE); fr_process_begin_command (proc, "rm"); fr_process_set_working_dir (proc, "/"); fr_process_add_arg (proc, "-r"); fr_process_add_arg (proc, "-f"); fr_process_add_arg (proc, tmp_dir); fr_process_end_command (proc); fr_process_set_sticky (proc, TRUE); for (scan = jardata_list; scan ; scan = scan->next) { JarData *jdata = scan->data; g_free (jdata->filename); g_free (jdata->package_minus_one_level); g_free (jdata->link_name); g_free (jdata->rel_path); } path_list_free (jardata_list); path_list_free (jar_list); path_list_free (zip_list); g_free (tmp_dir); }
static gboolean egg_tree_multi_drag_motion_event (GtkWidget *widget, GdkEventMotion *event, gpointer data) { EggTreeMultiDndData *priv_data; priv_data = g_object_get_data (G_OBJECT (widget), EGG_TREE_MULTI_DND_STRING); if (gtk_drag_check_threshold (widget, priv_data->x, priv_data->y, event->x, event->y)) { GList *path_list = NULL; GtkTreeSelection *selection; GtkTreeModel *model; GdkDragContext *context; TreeViewDragInfo *di; di = get_info (GTK_TREE_VIEW (widget)); if (di == NULL) return FALSE; selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)); if (priv_data->motion_notify_handler) { g_signal_handler_disconnect (widget, priv_data->motion_notify_handler); priv_data->motion_notify_handler = 0; } if (priv_data->button_release_handler) { g_signal_handler_disconnect (widget, priv_data->button_release_handler); priv_data->button_release_handler = 0; } stop_drag_check (widget); gtk_tree_selection_selected_foreach (selection, selection_foreach, &path_list); path_list = g_list_reverse (path_list); model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget)); if (egg_tree_multi_drag_source_row_draggable (EGG_TREE_MULTI_DRAG_SOURCE (model), path_list)) { gulong sig; /* This is to disconnect the default signal handler for treeviews as * it sometimes gives a warning. The default handler just sets the * icon which we do as well in our callback so it is fine. */ sig = g_signal_connect (widget, "drag-begin", G_CALLBACK (egg_tree_multi_drag_begin), NULL); context = gtk_drag_begin (widget, gtk_drag_source_get_target_list (widget), di->source_actions, priv_data->pressed_button, (GdkEvent*)event); g_signal_handler_disconnect (widget, sig); set_context_data (context, path_list); } else { path_list_free (path_list); } } return TRUE; }
static gboolean proc_monitor_events (gpointer data) { GthMonitor *monitor = data; GthMonitorPrivateData *priv = monitor->priv; GList *dir_created_list, *dir_deleted_list; GList *file_created_list, *file_deleted_list, *file_changed_list; GList *scan; if (priv->update_changes_timeout != 0) g_source_remove (priv->update_changes_timeout); priv->update_changes_timeout = 0; dir_created_list = priv->monitor_events[MONITOR_EVENT_DIR_CREATED]; priv->monitor_events[MONITOR_EVENT_DIR_CREATED] = NULL; dir_deleted_list = priv->monitor_events[MONITOR_EVENT_DIR_DELETED]; priv->monitor_events[MONITOR_EVENT_DIR_DELETED] = NULL; file_created_list = priv->monitor_events[MONITOR_EVENT_FILE_CREATED]; priv->monitor_events[MONITOR_EVENT_FILE_CREATED] = NULL; file_deleted_list = priv->monitor_events[MONITOR_EVENT_FILE_DELETED]; priv->monitor_events[MONITOR_EVENT_FILE_DELETED] = NULL; file_changed_list = priv->monitor_events[MONITOR_EVENT_FILE_CHANGED]; priv->monitor_events[MONITOR_EVENT_FILE_CHANGED] = NULL; if (priv->update_changes_timeout != 0) g_source_remove (priv->update_changes_timeout); /**/ for (scan = dir_created_list; scan; scan = scan->next) { char *path = scan->data; const char *name = file_name_from_path (path); /* ignore hidden directories. */ if (name[0] == '.') continue; all_windows_notify_directory_new (path); } path_list_free (dir_created_list); /**/ for (scan = dir_deleted_list; scan; scan = scan->next) { char *path = scan->data; all_windows_notify_directory_delete (path); } path_list_free (dir_deleted_list); /**/ if (file_created_list != NULL) { all_windows_notify_files_created (file_created_list); path_list_free (file_created_list); } if (file_deleted_list != NULL) { all_windows_notify_files_deleted (file_deleted_list); path_list_free (file_deleted_list); } if (file_changed_list != NULL) { all_windows_notify_files_changed (file_changed_list); path_list_free (file_changed_list); } return FALSE; }
/* Create the windows. */ static void prepare_app (void) { CORBA_Object factory; gboolean use_factory = FALSE; CORBA_Environment env; GNOME_GThumb_Application app; GList *scan; factory = bonobo_activation_activate_from_id ("OAFIID:GNOME_GThumb_Application_Factory", Bonobo_ACTIVATION_FLAG_EXISTING_ONLY, NULL, NULL); if (factory != NULL) { use_factory = TRUE; CORBA_exception_init (&env); app = bonobo_activation_activate_from_id ("OAFIID:GNOME_GThumb_Application", 0, NULL, &env); } if (session_is_restored ()) { load_session (use_factory, app, &env); return; } if (ImportPhotos) { if (use_factory) GNOME_GThumb_Application_import_photos (app, &env); else gth_browser_activate_action_file_camera_import (NULL, NULL); } else if (! view_comline_catalog && (n_dir_urls == 0) && (n_file_urls == 0)) { open_browser_window (NULL, TRUE, use_factory, app, &env); } else if (view_single_image) { if (use_factory && eel_gconf_get_boolean (PREF_SINGLE_WINDOW, FALSE)) { GNOME_GThumb_Application_load_image (app, file_urls->data, &env); } else { if (UseViewer) open_viewer_window (file_urls->data, use_factory, app, &env); else open_browser_window (file_urls->data, TRUE, use_factory, app, &env); } } else if (view_comline_catalog) { char *catalog_path; char *catalog_uri; ViewFirstImage = TRUE; HideSidebar = TRUE; catalog_path = get_command_line_catalog_path (); catalog_uri = g_strconcat ("catalog://", remove_host_from_uri (catalog_path), NULL); open_browser_window (catalog_uri, TRUE, use_factory, app, &env); g_free (catalog_path); g_free (catalog_uri); } for (scan = dir_urls; scan; scan = scan->next) { /* Go to the specified directory. */ open_browser_window (scan->data, TRUE, use_factory, app, &env); } path_list_free (file_urls); path_list_free (dir_urls); /**/ if (use_factory) { bonobo_object_release_unref (app, &env); CORBA_exception_free (&env); gdk_notify_startup_complete (); exit (0); } else gth_application = gth_application_new (gdk_screen_get_default ()); }
static int extract_cb (GtkWidget *w, DialogData *data) { FrWindow *window = data->window; gboolean do_not_extract = FALSE; char *extract_to_dir; gboolean overwrite; gboolean skip_newer; gboolean selected_files; gboolean pattern_files; gboolean junk_paths; GList *file_list; char *base_dir = NULL; GError *error = NULL; data->extract_clicked = TRUE; /* collect extraction options. */ extract_to_dir = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (data->dialog)); /* check directory existence. */ if (! uri_is_dir (extract_to_dir)) { if (! ForceDirectoryCreation) { GtkWidget *d; int r; char *folder_name; char *msg; folder_name = g_filename_display_name (extract_to_dir); msg = g_strdup_printf (_("Destination folder \"%s\" does not exist.\n\nDo you want to create it?"), folder_name); g_free (folder_name); d = _gtk_message_dialog_new (GTK_WINDOW (data->dialog), GTK_DIALOG_MODAL, GTK_STOCK_DIALOG_QUESTION, msg, NULL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, _("Create _Folder"), GTK_RESPONSE_YES, NULL); gtk_dialog_set_default_response (GTK_DIALOG (d), GTK_RESPONSE_YES); r = gtk_dialog_run (GTK_DIALOG (d)); gtk_widget_destroy (GTK_WIDGET (d)); g_free (msg); if (r != GTK_RESPONSE_YES) do_not_extract = TRUE; } if (! do_not_extract && ! ensure_dir_exists (extract_to_dir, 0755, &error)) { GtkWidget *d; d = _gtk_error_dialog_new (GTK_WINDOW (window), GTK_DIALOG_DESTROY_WITH_PARENT, NULL, _("Extraction not performed"), _("Could not create the destination folder: %s."), error->message); gtk_dialog_run (GTK_DIALOG (d)); gtk_widget_destroy (GTK_WIDGET (d)); g_error_free (error); return FALSE; } } if (do_not_extract) { GtkWidget *d; d = _gtk_message_dialog_new (GTK_WINDOW (window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_DIALOG_WARNING, _("Extraction not performed"), NULL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG (d), GTK_RESPONSE_OK); gtk_dialog_run (GTK_DIALOG (d)); gtk_widget_destroy (GTK_WIDGET (d)); if (fr_window_is_batch_mode (data->window)) gtk_widget_destroy (data->dialog); return FALSE; } /* check extraction directory permissions. */ if (uri_is_dir (extract_to_dir) && ! check_permissions (extract_to_dir, R_OK | W_OK)) { GtkWidget *d; char *utf8_path; utf8_path = g_filename_display_name (extract_to_dir); d = _gtk_error_dialog_new (GTK_WINDOW (window), GTK_DIALOG_DESTROY_WITH_PARENT, NULL, _("Extraction not performed"), _("You don't have the right permissions to extract archives in the folder \"%s\""), utf8_path); gtk_dialog_run (GTK_DIALOG (d)); gtk_widget_destroy (GTK_WIDGET (d)); g_free (utf8_path); g_free (extract_to_dir); return FALSE; } fr_window_set_extract_default_dir (window, extract_to_dir, TRUE); overwrite = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->e_overwrite_checkbutton)); skip_newer = ! gtk_toggle_button_get_inconsistent (GTK_TOGGLE_BUTTON (data->e_not_newer_checkbutton)) && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->e_not_newer_checkbutton)); junk_paths = ! gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->e_recreate_dir_checkbutton)); g_settings_set_boolean (data->settings, PREF_EXTRACT_OVERWRITE, overwrite); if (! gtk_toggle_button_get_inconsistent (GTK_TOGGLE_BUTTON (data->e_not_newer_checkbutton))) g_settings_set_boolean (data->settings, PREF_EXTRACT_SKIP_NEWER, skip_newer); g_settings_set_boolean (data->settings, PREF_EXTRACT_RECREATE_FOLDERS, ! junk_paths); selected_files = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->e_selected_radiobutton)); pattern_files = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->e_files_radiobutton)); /* create the file list. */ file_list = NULL; if (selected_files) { file_list = data->selected_files; data->selected_files = NULL; /* do not the list when destroying the dialog. */ } else if (pattern_files) { const char *pattern; pattern = gtk_entry_get_text (GTK_ENTRY (data->e_files_entry)); file_list = fr_window_get_file_list_pattern (window, pattern); if (file_list == NULL) { gtk_widget_destroy (data->dialog); g_free (extract_to_dir); return FALSE; } } if (selected_files) { base_dir = data->base_dir_for_selection; data->base_dir_for_selection = NULL; } else base_dir = NULL; /* close the dialog. */ gtk_widget_destroy (data->dialog); /* extract ! */ fr_window_archive_extract (window, file_list, extract_to_dir, base_dir, skip_newer, overwrite ? FR_OVERWRITE_YES : FR_OVERWRITE_NO, junk_paths, TRUE); path_list_free (file_list); g_free (extract_to_dir); g_free (base_dir); return TRUE; }
static gboolean egg_tree_multi_drag_motion_event (GtkWidget *widget, GdkEventMotion *event, gpointer data) { EggTreeMultiDndData *priv_data; priv_data = g_object_get_data (G_OBJECT (widget), EGG_TREE_MULTI_DND_STRING); if (! priv_data->pending_event) return FALSE; if (gtk_drag_check_threshold (widget, priv_data->x, priv_data->y, event->x, event->y)) { GList *path_list = NULL; GtkTreeSelection *selection; GtkTreeModel *model; GdkDragContext *context; stop_drag_check (widget); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)); gtk_tree_selection_selected_foreach (selection, selection_foreach, &path_list); if (path_list == NULL) return FALSE; path_list = g_list_reverse (path_list); model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget)); if (egg_tree_multi_drag_source_row_draggable (EGG_TREE_MULTI_DRAG_SOURCE (model), path_list)) { GtkTargetList *target_list; GtkTreePath *tree_path; int cell_x; int cell_y; target_list = gtk_target_list_new (target_table, G_N_ELEMENTS (target_table)); context = gtk_drag_begin_with_coordinates (widget, target_list, GDK_ACTION_COPY, priv_data->pressed_button, (GdkEvent*) event, event->x, event->y); set_context_data (context, path_list); if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), priv_data->x, priv_data->y, &tree_path, NULL, &cell_x, &cell_y)) { cairo_surface_t *drag_icon; drag_icon = gtk_tree_view_create_row_drag_icon (GTK_TREE_VIEW (widget), tree_path); if (path_list->next != NULL) { /* create a multi row drag icon */ const int icon_offset = DRAG_ICON_OFFSET; GdkRectangle icon_extents; cairo_surface_t *multi_drag_icon; cairo_t *cr; int n_icons, i, offset; n_icons = MIN (DRAG_ICON_MAX_ROWS, g_list_length (path_list)); _gtk_cairo_surface_extents (drag_icon, &icon_extents); multi_drag_icon = gdk_window_create_similar_surface (gtk_tree_view_get_bin_window (GTK_TREE_VIEW (widget)), CAIRO_CONTENT_COLOR_ALPHA, icon_extents.width + (icon_offset * (n_icons - 1)), icon_extents.height + (icon_offset * (n_icons - 1))); cr = cairo_create (multi_drag_icon); cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.0); cairo_rectangle(cr, 0, 0, icon_extents.width + icon_offset, icon_extents.height + icon_offset); cairo_fill (cr); offset = icon_offset * (n_icons - 1); for (i = 0; i < n_icons; i++) { cairo_set_source_surface (cr, drag_icon, -icon_extents.x + offset, -icon_extents.y + offset); cairo_rectangle (cr, offset, offset, icon_extents.width, icon_extents.height); cairo_fill (cr); offset -= icon_offset; } cairo_destroy (cr); cairo_surface_set_device_offset (multi_drag_icon, - (cell_x + 1), - (cell_y + 1)); gtk_drag_set_icon_surface (context, multi_drag_icon); cairo_surface_destroy (multi_drag_icon); } else { cairo_surface_set_device_offset (drag_icon, - (cell_x + 1), - (cell_y + 1)); gtk_drag_set_icon_surface (context, drag_icon); } cairo_surface_destroy (drag_icon); gtk_tree_path_free (tree_path); } else gtk_drag_set_icon_default (context); gtk_target_list_unref (target_list); } else { path_list_free (path_list); } } return TRUE; }