talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 3eaaa6109cebff3a6b04fdc016ef12f16e0bd6ca
parent 94b0007b0a27c51fa47aee576a067411303b66d2
Author: Oliver Lowe <o@olowe.co>
Date:   Sat, 16 Aug 2025 15:17:34 +1000

Remove more unused tag logic

Diffstat:
Msrc/Makefile.am | 2--
Msrc/common/Makefile.am | 1-
Dsrc/common/tags.c | 255-------------------------------------------------------------------------------
Msrc/common/tags.h | 16+++-------------
Dsrc/edittags.c | 787-------------------------------------------------------------------------------
Dsrc/edittags.h | 26--------------------------
Msrc/folder.c | 2--
Msrc/imap.c | 155++-----------------------------------------------------------------------------
Msrc/matcher.c | 38--------------------------------------
Msrc/msgcache.c | 156++-----------------------------------------------------------------------------
Msrc/prefs_filtering_action.c | 16+---------------
Msrc/textview.c | 85-------------------------------------------------------------------------------
12 files changed, 9 insertions(+), 1530 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am @@ -66,7 +66,6 @@ claws_mail_SOURCES = \ compose.c \ customheader.c \ displayheader.c \ - edittags.c \ entity.c \ export.c \ folder.c \ @@ -170,7 +169,6 @@ claws_mailinclude_HEADERS = \ compose.h \ customheader.h \ displayheader.h \ - edittags.h \ entity.h \ export.h \ folder.h \ diff --git a/src/common/Makefile.am b/src/common/Makefile.am @@ -35,7 +35,6 @@ libclawscommon_la_SOURCES = $(arch_sources) \ string_match.c \ stringtable.c \ claws.c \ - tags.c \ template.c \ utils.c \ uuencode.c \ diff --git a/src/common/tags.c b/src/common/tags.c @@ -1,255 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 2007-2012 The Claws Mail Team - * - * 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 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - -#include <glib.h> -#include <glib/gi18n.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <sys/types.h> -#if HAVE_SYS_WAIT_H -# include <sys/wait.h> -#endif -#include <signal.h> -#include <unistd.h> - -#include "defs.h" -#include "utils.h" -#include "tags.h" -#include "file-utils.h" - -static GHashTable *tags_table = NULL; -static GHashTable *tags_reverse_table = NULL; - -static int tag_max_id = 0; - -void tags_read_tags(void) -{ - gchar *file = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, - TAGS_RC, NULL); - gchar tmp[255]; - gint id; - FILE *fp = g_fopen(file, "rb"); - - g_free(file); - - if (tags_table == NULL) - tags_table = g_hash_table_new_full( - g_direct_hash, g_direct_equal, - NULL, g_free); - if (tags_reverse_table == NULL) - tags_reverse_table = g_hash_table_new_full( - g_str_hash, g_str_equal, - g_free, NULL); - - if (!fp) - return; - if (fscanf(fp, "max_id %d\n", &tag_max_id) != 1) { - fclose(fp); - return; - } - while (fgets(tmp, sizeof(tmp), fp) != NULL) { - gchar *sep = strchr(tmp, '\t'); - gchar *tag_name = sep?(sep+1):NULL; - - if (!tag_name || !sep) - continue; - g_strstrip(tag_name); - *(sep) = '\0'; - if (IS_NOT_RESERVED_TAG(tag_name)) { - id = atoi(tmp); - g_hash_table_insert(tags_table, - GINT_TO_POINTER(id), g_strdup(tag_name)); - g_hash_table_insert(tags_reverse_table, - g_strdup(tag_name), GINT_TO_POINTER(id)); - } - } - - fclose(fp); -} - -typedef struct _TagWriteData -{ - FILE *fp; - gboolean error; -} TagWriteData; - -static void tag_write(gpointer key, gpointer value, gpointer user_data) -{ - TagWriteData *data = (TagWriteData *)user_data; - const gchar *str = value; - gint id = GPOINTER_TO_INT(key); - - if (data->error) - return; - - if (fprintf(data->fp, "%d\t%s\n", id, str) <= 0) { - FILE_OP_ERROR("tagsrc", "fprintf"); - data->error = TRUE; - } -} - -void tags_write_tags(void) -{ - gchar *file = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, - TAGS_RC, ".tmp", NULL); - gchar *file_new = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, - TAGS_RC, NULL); - TagWriteData data; - - FILE *fp = g_fopen(file, "wb"); - - if (!fp) { - FILE_OP_ERROR(file, "g_fopen"); - g_free(file); - g_free(file_new); - return; - } - - data.fp = fp; - data.error = FALSE; - - if (fprintf(data.fp, "max_id %d\n", tag_max_id) <= 0) { - FILE_OP_ERROR("tagsrc", "fprintf"); - data.error = TRUE; - } else { - g_hash_table_foreach(tags_table, tag_write, &data); - } - - if (data.error) { - fclose(fp); - g_free(file); - g_free(file_new); - return; - } - - if (safe_fclose(fp) == EOF) { - FILE_OP_ERROR(file, "fclose"); - g_free(file); - g_free(file_new); - return; - } - - if (rename_force(file, file_new) < 0) { - FILE_OP_ERROR(file, "rename_force"); - } - - g_free(file); - g_free(file_new); -} - -gint tags_add_tag(const gchar *tag) -{ - if (!tag || !(*tag)) - return -1; - - if (g_hash_table_lookup(tags_reverse_table, tag)) - return -1; - - if (IS_NOT_RESERVED_TAG(tag)) { - tag_max_id++; - g_hash_table_insert(tags_table, GINT_TO_POINTER(tag_max_id), - g_strdup(tag)); - g_hash_table_insert(tags_reverse_table, g_strdup(tag), - GINT_TO_POINTER(tag_max_id)); - - return tag_max_id; - } else { - return -1; - } -} - -void tags_remove_tag(gint id) -{ - gchar *old_tag = g_hash_table_lookup(tags_table, GINT_TO_POINTER(id)); - - if (old_tag) { - g_hash_table_remove(tags_reverse_table, old_tag); - } - g_hash_table_remove(tags_table, GINT_TO_POINTER(id)); -} - -/* extern decl. to avoid including ../prefs_filtering.h */ -extern void prefs_filtering_rename_tag(const gchar *old_tag, const gchar *new_tag); - -void tags_update_tag(gint id, const gchar *tag) -{ - gchar *old_tag = g_hash_table_lookup(tags_table, GINT_TO_POINTER(id)); - - if (IS_NOT_RESERVED_TAG(tag)) { - if (old_tag) { - prefs_filtering_rename_tag(old_tag, tag); - g_hash_table_remove(tags_reverse_table, old_tag); - } - - g_hash_table_replace(tags_table, GINT_TO_POINTER(id), - g_strdup(tag)); - g_hash_table_insert(tags_reverse_table, g_strdup(tag), - GINT_TO_POINTER(id)); - } -} - -const gchar *tags_get_tag(gint id) -{ - return (const gchar *)g_hash_table_lookup(tags_table, - GINT_TO_POINTER(id)); -} - -gint tags_get_id_for_str(const gchar *str) -{ - gpointer id_ptr; - if ((id_ptr = g_hash_table_lookup(tags_reverse_table, str)) != NULL) - return GPOINTER_TO_INT(id_ptr); - else - return -1; -} - -typedef struct _TagListData { - GSList *list; -} TagListData; - -static void tag_add_list(gpointer key, gpointer value, gpointer user_data) -{ - TagListData *data = (TagListData *)user_data; - - data->list = g_slist_prepend(data->list, GINT_TO_POINTER(key)); -} - -GSList *tags_get_list(void) -{ - TagListData data; - data.list = NULL; - - g_hash_table_foreach(tags_table, tag_add_list, &data); - - data.list = g_slist_reverse(data.list); - - return data.list; -} - -guint tags_get_size(void) -{ - return g_hash_table_size(tags_table); -} diff --git a/src/common/tags.h b/src/common/tags.h @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * */ #ifndef __TAGS_H__ @@ -34,16 +34,6 @@ strcmp((tag), "NotJunk") && \ strcmp((tag), "NoJunk") && \ strcmp((tag), "Junk") && \ - strcmp((tag), "$Forwarded")) - -void tags_read_tags(void); -void tags_write_tags(void); -gint tags_add_tag(const gchar *tag); -void tags_remove_tag(gint id); -void tags_update_tag(gint id, const gchar *tag); -const gchar *tags_get_tag(gint id); -gint tags_get_id_for_str(const gchar *str); -GSList *tags_get_list(void); -guint tags_get_size(void); + strcmp((tag), "$Forwarded")) -#endif +#endif diff --git a/src/edittags.c b/src/edittags.c @@ -1,787 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 2007-2024 Colin Leroy and The Claws Mail Team - * - * 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 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - -#include "defs.h" - -#include <glib.h> -#include <glib/gi18n.h> -#include <gtk/gtk.h> -#include <gdk/gdkkeysyms.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> - -#include "menu.h" -#include "edittags.h" -#include "prefs_gtk.h" -#include "utils.h" -#include "gtkutils.h" -#include "inputdialog.h" -#include "manage_window.h" -#include "mainwindow.h" -#include "prefs_common.h" -#include "alertpanel.h" -#include "summaryview.h" -#include "tags.h" -#include "manual.h" - -enum { - TAG_SELECTED, - TAG_SELECTED_INCONSISTENT, - TAG_NAME, - TAG_DATA, - N_TAG_EDIT_COLUMNS -}; - -static gint tag_cmp_func (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer userdata) - { - gchar *name1, *name2; - gint res; - - gtk_tree_model_get(model, a, TAG_NAME, &name1, -1); - gtk_tree_model_get(model, b, TAG_NAME, &name2, -1); - - if (name1 == NULL) - return name2 == NULL ? 0:1; - - if (name2 == NULL) - return 1; - - res = g_utf8_collate(name1,name2); - g_free(name1); - g_free(name2); - - return res; -} - -static void tags_window_create(void); - -static struct TagsWindow -{ - GtkWidget *window; - GtkWidget *hbox1; - GtkWidget *vbox1; - GtkWidget *label; - GtkWidget *taglist; - GtkWidget *close_btn; - GtkWidget *add_entry; - GtkWidget *add_btn; - GtkWidget *del_btn; - GSList *msglist; - gboolean has_tag_col; - GdkCursor *watch_cursor; - gboolean busy; -} tagswindow; - -#define TAGS_WINDOW_LOCK() { \ - gdk_window_set_cursor(gtk_widget_get_window(tagswindow.window), tagswindow.watch_cursor); \ - tagswindow.busy = TRUE; \ -} - -#define TAGS_WINDOW_UNLOCK() { \ - gdk_window_set_cursor(gtk_widget_get_window(tagswindow.window), NULL); \ - tagswindow.busy = FALSE; \ -} - -static void tags_window_load_tags (void); -static void tags_window_insert_check_column(GtkWidget *list_view); -static void new_tag_set_add_sensitivity(void); - -void tags_window_open(GSList *msglist) -{ - if (!tagswindow.window) - tags_window_create(); - - manage_window_set_transient(GTK_WINDOW(tagswindow.window)); - gtk_widget_grab_focus(tagswindow.close_btn); - - tagswindow.msglist = msglist; - tags_window_load_tags(); - - if (msglist != NULL && !tagswindow.has_tag_col) { - tags_window_insert_check_column(tagswindow.taglist); - tagswindow.has_tag_col = TRUE; - } - if (msglist == NULL && tagswindow.has_tag_col) { - gtk_tree_view_remove_column(GTK_TREE_VIEW(tagswindow.taglist), - gtk_tree_view_get_column(GTK_TREE_VIEW(tagswindow.taglist), 0)); - tagswindow.has_tag_col = FALSE; - } - if (msglist == NULL) { - gtk_widget_hide(tagswindow.label); - gtk_widget_show(tagswindow.del_btn); - gtk_window_set_title(GTK_WINDOW(tagswindow.window), - C_("Window title", "Tags configuration")); - } else { - gtk_widget_show(tagswindow.label); - gtk_widget_hide(tagswindow.del_btn); - gtk_window_set_title(GTK_WINDOW(tagswindow.window), - C_("Window title", "Modify tags")); - } - - gtk_widget_show(tagswindow.window); - gtk_widget_grab_focus(tagswindow.taglist); - gtk_window_set_modal(GTK_WINDOW(tagswindow.window), TRUE); -} - -static GtkListStore* tags_window_create_data_store(void) -{ - GtkListStore *store = gtk_list_store_new(N_TAG_EDIT_COLUMNS, - G_TYPE_BOOLEAN, - G_TYPE_BOOLEAN, - G_TYPE_STRING, - G_TYPE_POINTER, - -1); - GtkTreeSortable *sortable = GTK_TREE_SORTABLE(store); - - gtk_tree_sortable_set_sort_func(sortable, 0, tag_cmp_func, - NULL, NULL); - - return store; -} - -static void tags_selected_toggled(GtkCellRendererToggle *widget, - gchar *path, - GtkWidget *list_view); -static void tags_selected_edited(GtkCellRendererText *widget, - gchar *arg1, gchar *arg2, - GtkWidget *list_view); - -static void tags_window_insert_check_column(GtkWidget *list_view) -{ - GtkTreeViewColumn *column; - GtkCellRenderer *renderer; - - renderer = gtk_cell_renderer_toggle_new(); - g_object_set(renderer, - "radio", FALSE, - "activatable", TRUE, - NULL); - column = gtk_tree_view_column_new_with_attributes - ("", - renderer, - "active", TAG_SELECTED, - "inconsistent", TAG_SELECTED_INCONSISTENT, - NULL); - gtk_tree_view_column_set_alignment (column, 0.5); - gtk_tree_view_insert_column(GTK_TREE_VIEW(list_view), column, 0); - g_signal_connect(G_OBJECT(renderer), "toggled", - G_CALLBACK(tags_selected_toggled), - list_view); -} - -static void tags_window_create_list_view_columns(GtkWidget *list_view) -{ - GtkTreeViewColumn *column; - GtkCellRenderer *renderer; - - renderer = gtk_cell_renderer_text_new(); - g_object_set(G_OBJECT(renderer), "editable", TRUE, NULL); - - column = gtk_tree_view_column_new_with_attributes - (_("Tag"), - renderer, - "text", TAG_NAME, - NULL); - gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_set_search_column(GTK_TREE_VIEW(list_view), - TAG_NAME); - g_signal_connect(G_OBJECT(renderer), "edited", - G_CALLBACK(tags_selected_edited), - list_view); - -} - -static GtkWidget *tags_popup_menu = NULL; - -static void tags_popup_delete (GtkAction *action, gpointer data) -{ - GtkTreeIter sel; - GtkTreeModel *model; - gint id; - SummaryView *summaryview = NULL; - GtkTreeSelection *selection = gtk_tree_view_get_selection - (GTK_TREE_VIEW(tagswindow.taglist)); - model = gtk_tree_view_get_model(GTK_TREE_VIEW(tagswindow.taglist)); - - if (!gtk_tree_selection_get_selected(selection, NULL, &sel)) - return; - - if (alertpanel(_("Delete tag"), - _("Do you really want to delete this tag?"), - NULL, _("_Cancel"), "edit-delete", _("D_elete"), NULL, NULL, - ALERTFOCUS_FIRST) != G_ALERTALTERNATE) - return; - - TAGS_WINDOW_LOCK(); - - /* XXX: Here's the reason why we need to store the original - * pointer: we search the slist for it. */ - gtk_tree_model_get(model, &sel, - TAG_DATA, &id, - -1); - - /* Even though this is not documented, gtk_tree_model_get() - * seems to invalidate the GtkTreeIter that is passed to it, - * so we need to reacquire it. */ - if (!gtk_tree_selection_get_selected(selection, NULL, &sel)) - return; - - gtk_list_store_remove(GTK_LIST_STORE(model), &sel); - tags_remove_tag(id); - tags_write_tags(); - TAGS_WINDOW_UNLOCK(); -} - -static void tags_popup_delete_all (GtkAction *action, gpointer data) -{ - GSList *cur, *tags; - GtkTreeModel *model; - SummaryView *summaryview = NULL; - - if (alertpanel(_("Delete all tags"), - _("Do you really want to delete all tags?"), - NULL, _("_Cancel"), "edit-delete", _("D_elete"), NULL, NULL, - ALERTFOCUS_FIRST) != G_ALERTALTERNATE) - return; - - TAGS_WINDOW_LOCK(); - - model = gtk_tree_view_get_model(GTK_TREE_VIEW(tagswindow.taglist)); - gtk_list_store_clear(GTK_LIST_STORE(model)); - - g_slist_free(tags); - tags_write_tags(); - - TAGS_WINDOW_UNLOCK(); -} - -static GtkActionEntry tags_popup_actions[] = -{ - { "EditTags", NULL, "EditTags", NULL, NULL, NULL }, - { "EditTags/Delete", NULL, N_("_Delete"), NULL, "Delete tag", G_CALLBACK(tags_popup_delete) }, - { "EditTags/DeleteAll", NULL, N_("Delete _all"), NULL, "Delete all tags", G_CALLBACK(tags_popup_delete_all) } -}; - -static gint tags_list_btn_pressed(GtkWidget *widget, GdkEventButton *event, - GtkTreeView *list_view) -{ - GtkUIManager *gui_manager = gtkut_ui_manager(); - - if (tagswindow.busy) - return FALSE; - - if (event && event->button == 3) { - GtkTreeModel *model = gtk_tree_view_get_model(list_view); - GtkTreeIter iter; - gboolean non_empty; - - if (!tags_popup_menu) { - (void) cm_menu_create_action_group("EditTags", tags_popup_actions, - G_N_ELEMENTS(tags_popup_actions), (gpointer)list_view); - - MENUITEM_ADDUI("/Menus", "EditTags", "EditTags", GTK_UI_MANAGER_MENU) - MENUITEM_ADDUI("/Menus/EditTags", "Delete", "EditTags/Delete", - GTK_UI_MANAGER_MENUITEM) - MENUITEM_ADDUI("/Menus/EditTags", "DeleteAll", "EditTags/DeleteAll", - GTK_UI_MANAGER_MENUITEM) - - tags_popup_menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM( - gtk_ui_manager_get_widget(gui_manager, "/Menus/EditTags")) ); - } - - /* grey out popup menu items if list is empty */ - non_empty = gtk_tree_model_get_iter_first(model, &iter); - cm_menu_set_sensitive("EditTags/Delete", non_empty); - cm_menu_set_sensitive("EditTags/DeleteAll", non_empty); - - gtk_menu_popup_at_pointer(GTK_MENU(tags_popup_menu), NULL); - - return FALSE; - } - return FALSE; -} - -static gboolean tags_list_popup_menu(GtkWidget *widget, gpointer data) -{ - GtkTreeView *list_view = (GtkTreeView *)data; - GdkEventButton event; - - event.button = 3; - event.time = gtk_get_current_event_time(); - - tags_list_btn_pressed(NULL, &event, list_view); - - return TRUE; -} - -static GtkWidget *tags_window_list_view_create (void) -{ - GtkTreeView *list_view; - GtkTreeSelection *selector; - GtkTreeModel *model; - - model = GTK_TREE_MODEL(tags_window_create_data_store()); - list_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(model)); - gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model), TAG_NAME, GTK_SORT_ASCENDING); - g_object_unref(model); - - selector = gtk_tree_view_get_selection(list_view); - gtk_tree_selection_set_mode(selector, GTK_SELECTION_BROWSE); - - /* create the columns */ - tags_window_create_list_view_columns(GTK_WIDGET(list_view)); - - g_signal_connect(G_OBJECT(list_view), "popup-menu", - G_CALLBACK(tags_list_popup_menu), list_view); - g_signal_connect(G_OBJECT(list_view), "button-press-event", - G_CALLBACK(tags_list_btn_pressed), list_view); - return GTK_WIDGET(list_view); - -} - -static void tags_window_list_view_clear_tags(GtkWidget *list_view); - -static void tags_window_close(void) -{ - if (tagswindow.busy) - return; - - if (tagswindow.msglist) - g_slist_free(tagswindow.msglist); - tagswindow.msglist = NULL; - TAGS_WINDOW_LOCK(); - TAGS_WINDOW_UNLOCK(); - tags_window_list_view_clear_tags(tagswindow.taglist); - gtk_widget_hide(tagswindow.window); - gtk_window_set_modal(GTK_WINDOW(tagswindow.window), FALSE); -} - -static void tags_window_close_cb(GtkWidget *widget, - gpointer data) -{ - tags_window_close(); -} - -static void tags_window_list_view_insert_tag(GtkWidget *list_view, - GtkTreeIter *row_iter, - gint tag); - -typedef struct FindTagInStore { - gint tag_id; - GtkTreePath *path; - GtkTreeIter iter; -} FindTagInStore; - -static gboolean find_tag_in_store(GtkTreeModel *model, - GtkTreePath *path, - GtkTreeIter *iter, - FindTagInStore *data) -{ - gpointer tmp; - gtk_tree_model_get(model, iter, TAG_DATA, &tmp, -1); - - if (data->tag_id == GPOINTER_TO_INT(tmp)) { - data->path = path; /* signal we found it */ - data->iter = *iter; - return TRUE; - } - - return FALSE; -} - -static void tags_window_add_tag(void) -{ - gchar *new_tag = gtk_editable_get_chars(GTK_EDITABLE(tagswindow.add_entry), 0, -1); - if (!new_tag) - return; - g_strstrip(new_tag); - if (*new_tag) { - gint id; - FindTagInStore fis; - if (!(IS_NOT_RESERVED_TAG(new_tag))) { - alertpanel_error(_("You entered a reserved tag name, please choose another instead.")); - g_free(new_tag); - return; - } - id = tags_get_id_for_str(new_tag); - TAGS_WINDOW_LOCK(); - if (id == -1) { - id = tags_add_tag(new_tag); - tags_write_tags(); - tags_window_list_view_insert_tag(tagswindow.taglist, NULL, id); - } - fis.tag_id = id; - fis.path = NULL; - gtk_tree_model_foreach(gtk_tree_view_get_model - (GTK_TREE_VIEW(tagswindow.taglist)), - (GtkTreeModelForeachFunc) find_tag_in_store, - &fis); - if (fis.path) { - GtkTreeSelection *selection; - GtkTreePath* path; - GtkTreeModel *model = gtk_tree_view_get_model( - GTK_TREE_VIEW(tagswindow.taglist)); - - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tagswindow.taglist)); - gtk_tree_selection_select_iter(selection, &fis.iter); - path = gtk_tree_model_get_path(model, &fis.iter); - /* XXX returned path may not be valid??? create new one to be sure */ - gtk_tree_view_set_cursor(GTK_TREE_VIEW(tagswindow.taglist), path, NULL, FALSE); - tags_window_list_view_insert_tag(tagswindow.taglist, &fis.iter, id); - gtk_tree_path_free(path); - } - TAGS_WINDOW_UNLOCK(); - } - g_free(new_tag); -} - -static void tags_window_add_tag_cb(GtkWidget *widget, gpointer data) -{ - if (tagswindow.busy) - return; - tags_window_add_tag(); - gtk_entry_set_text(GTK_ENTRY(tagswindow.add_entry), ""); - gtk_widget_grab_focus(tagswindow.taglist); -} - -static void tags_window_del_tag_cb(GtkWidget *widget, gpointer data) -{ - if (tagswindow.busy) - return; - tags_popup_delete(NULL, NULL); - gtk_widget_grab_focus(tagswindow.taglist); -} - -static gboolean tags_window_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data) -{ - if (tagswindow.busy) - return FALSE; - if (event && event->keyval == GDK_KEY_Escape) - tags_window_close(); - else if (event && event->keyval == GDK_KEY_Delete) - tags_popup_delete(NULL, NULL); - return FALSE; -} - -static gboolean tags_window_add_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data) -{ - if (tagswindow.busy) - return FALSE; - - if (event && (event->keyval == GDK_KEY_KP_Enter || event->keyval == GDK_KEY_Return)) { - tags_window_add_tag(); - gtk_entry_set_text(GTK_ENTRY(tagswindow.add_entry), ""); - gtk_widget_grab_focus(tagswindow.taglist); - } - - return FALSE; -} - -/*! - *\brief Save Gtk object size to prefs dataset - */ -static void tags_window_size_allocate_cb(GtkWidget *widget, - GtkAllocation *allocation) -{ - cm_return_if_fail(allocation != NULL); - - gtk_window_get_size(GTK_WINDOW(widget), - &prefs_common.tagswin_width, &prefs_common.tagswin_height); -} - -static void tags_window_create(void) -{ - GtkWidget *window; - GtkWidget *hbox1; - GtkWidget *vbox1; - GtkWidget *label; - GtkWidget *taglist; - GtkWidget *close_btn; - GtkWidget *scrolledwin; - GtkWidget *new_tag_label; - GtkWidget *new_tag_entry; - GtkWidget *add_btn; - GtkWidget *del_btn; - static GdkGeometry geometry; - - window = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "tags_window"); - - gtk_container_set_border_width(GTK_CONTAINER(window), 8); - gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); - gtk_window_set_resizable(GTK_WINDOW(window), TRUE); - gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG); - g_signal_connect(G_OBJECT(window), "delete_event", - G_CALLBACK(tags_window_close_cb), NULL); - g_signal_connect(G_OBJECT(window), "size_allocate", - G_CALLBACK(tags_window_size_allocate_cb), NULL); - g_signal_connect(G_OBJECT(window), "key_press_event", - G_CALLBACK(tags_window_key_pressed), NULL); - MANAGE_WINDOW_SIGNALS_CONNECT(window); - - vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); - hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); - - new_tag_label = gtk_label_new(_("New tag:")); - gtk_label_set_xalign(GTK_LABEL(new_tag_label), 0.0); - gtk_box_pack_start(GTK_BOX(hbox1), new_tag_label, FALSE, FALSE, 0); - - new_tag_entry = gtk_entry_new(); - gtk_box_pack_start(GTK_BOX(hbox1), new_tag_entry, FALSE, FALSE, 0); - g_signal_connect(G_OBJECT(new_tag_entry), "key_press_event", - G_CALLBACK(tags_window_add_key_pressed), NULL); - - add_btn = gtkut_stock_button("list-add", _("_Add")); - gtk_box_pack_start(GTK_BOX(hbox1), add_btn, FALSE, FALSE, 0); - CLAWS_SET_TIP(add_btn, - _("Add the new tag")); - - del_btn = gtkut_stock_button("edit-delete", _("D_elete")); - gtk_box_pack_start(GTK_BOX(hbox1), del_btn, FALSE, FALSE, 0); - CLAWS_SET_TIP(del_btn, - _("Delete the selected tag")); - - close_btn = gtkut_stock_button("window-close", _("_Close")); - gtk_box_pack_end(GTK_BOX(hbox1), close_btn, FALSE, FALSE, 0); - - gtk_widget_show(new_tag_label); - gtk_widget_show(new_tag_entry); - gtk_widget_show(close_btn); - gtk_widget_show(add_btn); - - g_signal_connect(G_OBJECT(close_btn), "clicked", - G_CALLBACK(tags_window_close_cb), NULL); - g_signal_connect(G_OBJECT(add_btn), "clicked", - G_CALLBACK(tags_window_add_tag_cb), NULL); - g_signal_connect(G_OBJECT(del_btn), "clicked", - G_CALLBACK(tags_window_del_tag_cb), NULL); - - taglist = tags_window_list_view_create(); - - label = gtk_label_new(_("Choose the tag(s) for the message(s).\n" - "Changes are immediately applied.")); - gtk_label_set_xalign(GTK_LABEL(label), 0.0); - gtk_box_pack_start(GTK_BOX(vbox1), label, FALSE, TRUE, 0); - - scrolledwin = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - gtk_container_add(GTK_CONTAINER(scrolledwin), taglist); - gtk_box_pack_start(GTK_BOX(vbox1), scrolledwin, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(vbox1), hbox1, FALSE, FALSE, 0); - - gtk_widget_show(scrolledwin); - gtk_widget_show(taglist); - gtk_widget_show(hbox1); - gtk_widget_show(vbox1); - gtk_widget_show(close_btn); - gtk_container_add(GTK_CONTAINER (window), vbox1); - - if (!geometry.min_height) { - geometry.min_width = 500; - geometry.min_height = 250; - } - - gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geometry, - GDK_HINT_MIN_SIZE); - gtk_window_set_default_size(GTK_WINDOW(window), prefs_common.tagswin_width, - prefs_common.tagswin_height); - - tagswindow.window = window; - tagswindow.hbox1 = hbox1; - tagswindow.vbox1 = vbox1; - tagswindow.label = label; - tagswindow.taglist = taglist; - tagswindow.close_btn = close_btn; - tagswindow.add_btn = add_btn; - tagswindow.add_entry = new_tag_entry; - tagswindow.del_btn = del_btn; - tagswindow.has_tag_col = FALSE; - tagswindow.watch_cursor = gdk_cursor_new_for_display( - gtk_widget_get_display(window), GDK_WATCH); - - g_signal_connect(G_OBJECT(new_tag_entry), "changed", - G_CALLBACK(new_tag_set_add_sensitivity), NULL); - new_tag_set_add_sensitivity(); -} - -static void tags_window_list_view_clear_tags(GtkWidget *list_view) -{ - GtkListStore *list_store = GTK_LIST_STORE(gtk_tree_view_get_model - (GTK_TREE_VIEW(list_view))); - gtk_list_store_clear(list_store); -} - - -static void tags_selected_toggled(GtkCellRendererToggle *widget, - gchar *path, - GtkWidget *list_view) -{ - GtkTreeIter iter; - GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(list_view)); - gboolean enabled = TRUE, set = FALSE; - gpointer tmp; - gint tag_id; - SummaryView *summaryview = NULL; - - if (tagswindow.busy) - return; - - if (mainwindow_get_mainwindow() != NULL) - summaryview = mainwindow_get_mainwindow()->summaryview; - - if (!gtk_tree_model_get_iter_from_string(model, &iter, path)) - return; - - gtk_tree_model_get(model, &iter, - TAG_SELECTED, &enabled, - TAG_DATA, &tmp, - -1); - - set = !enabled; - tag_id = GPOINTER_TO_INT(tmp); - - gtk_list_store_set(GTK_LIST_STORE(model), &iter, - TAG_SELECTED, set, - TAG_SELECTED_INCONSISTENT, FALSE, - -1); - - TAGS_WINDOW_LOCK(); - TAGS_WINDOW_UNLOCK(); -} - -static void tags_selected_edited(GtkCellRendererText *widget, - gchar *path, gchar *new_text, - GtkWidget *list_view) -{ - GtkTreeIter iter; - GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(list_view)); - gpointer tmp; - gint tag_id; - SummaryView *summaryview = NULL; - gboolean selected; - - if (tagswindow.busy) - return; - - if (mainwindow_get_mainwindow() != NULL) - summaryview = mainwindow_get_mainwindow()->summaryview; - - if (!gtk_tree_model_get_iter_from_string(model, &iter, path)) - return; - - if (!new_text || !*new_text) - return; - - gtk_tree_model_get(model, &iter, - TAG_SELECTED, &selected, - TAG_DATA, &tmp, - -1); - - tag_id = GPOINTER_TO_INT(tmp); - - TAGS_WINDOW_LOCK(); - - tags_update_tag(tag_id, new_text); - - gtk_list_store_set(GTK_LIST_STORE(model), &iter, - TAG_NAME, new_text, - -1); - TAGS_WINDOW_UNLOCK(); -} - -static void tags_window_get_selected_state(gint tag, gboolean *selected, gboolean *selected_inconsistent) -{ - GSList *cur = tagswindow.msglist; - gint num_mails = 0; - gint num_selected = 0; - for (; cur; cur = cur->next) { - MsgInfo *msginfo = (MsgInfo *)cur->data; - num_mails++; - if (msginfo->tags && g_slist_find(msginfo->tags, GINT_TO_POINTER(tag))) { - *selected = TRUE; - num_selected++; - } - } - if (num_selected > 0 && num_selected < num_mails) - *selected_inconsistent = TRUE; - else - *selected_inconsistent = FALSE; -} - -static void tags_window_list_view_insert_tag(GtkWidget *list_view, - GtkTreeIter *row_iter, - gint tag) -{ - GtkTreeIter iter; - GtkListStore *list_store = GTK_LIST_STORE(gtk_tree_view_get_model - (GTK_TREE_VIEW(list_view))); - const gchar *name = tags_get_tag(tag); - gboolean selected = FALSE, selected_inconsistent = FALSE; - - tags_window_get_selected_state(tag, &selected, &selected_inconsistent); - if (row_iter == NULL) { - /* append new */ - gtk_list_store_append(list_store, &iter); - gtk_list_store_set(list_store, &iter, - TAG_SELECTED, selected, - TAG_SELECTED_INCONSISTENT, selected_inconsistent, - TAG_NAME, name, - TAG_DATA, GINT_TO_POINTER(tag), - -1); - } else { - gtk_list_store_set(list_store, row_iter, - TAG_SELECTED, selected, - TAG_SELECTED_INCONSISTENT, selected_inconsistent, - TAG_NAME, name, - TAG_DATA, GINT_TO_POINTER(tag), - -1); - } -} - -static void new_tag_set_add_sensitivity() -{ - const gchar *newtag = gtk_entry_get_text((GtkEntry *)tagswindow.add_entry); - gchar *trim_text = g_strdup(newtag); - g_strstrip(trim_text); - gtk_widget_set_sensitive(tagswindow.add_btn, (*trim_text != 0)); - g_free(trim_text); - -} - -static void tags_window_load_tags (void) -{ - GSList *cur, *tags; - gint id; - tags_window_list_view_clear_tags(tagswindow.taglist); - - cur = tags = tags_get_list(); - for (; cur; cur = cur->next) { - id = GPOINTER_TO_INT(cur->data); - tags_window_list_view_insert_tag(tagswindow.taglist, NULL, id); - } - g_slist_free(tags); -} diff --git a/src/edittags.h b/src/edittags.h @@ -1,26 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 2007-2021 the Claws Mail team - * - * 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 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#ifndef __EDITTAGS_H__ -#define __EDITTAGS_H__ - -#include <glib.h> - -void tags_window_open(GSList *msglist); -#endif diff --git a/src/folder.c b/src/folder.c @@ -2596,8 +2596,6 @@ static void folder_item_read_cache(FolderItem *item) } else msgcache_read_mark(item->cache, mark_file); - msgcache_read_tags(item->cache, tags_file); - g_free(cache_file); g_free(mark_file); g_free(tags_file); diff --git a/src/imap.c b/src/imap.c @@ -1518,111 +1518,7 @@ typedef struct _TagsData { static void imap_commit_tags(FolderItem *item, MsgInfo *msginfo, GSList *tags_set, GSList *tags_unset) { - IMAPSession *session; - gint ok, can_create_tags; - Folder *folder = NULL; - TagsData *ht_data = NULL; - GSList *cur; - - g_return_if_fail(item != NULL); - g_return_if_fail(msginfo != NULL); - - folder = item->folder; - debug_print("getting session...\n"); - session = imap_session_get(folder); - - if (!session) { - debug_print("can't get session\n"); - return; - } - - ok = imap_select(session, IMAP_FOLDER(folder), item, - NULL, NULL, NULL, NULL, &can_create_tags, FALSE); - - if (ok != MAILIMAP_NO_ERROR) { - return; - } - - - if (IMAP_FOLDER_ITEM(item)->can_create_flags != ITEM_CAN_CREATE_FLAGS) - return; - - if (IMAP_FOLDER_ITEM(item)->batching) { - /* instead of performing an UID STORE command for each message change, - * as a lot of them can change "together", we just fill in hashtables - * and defer the treatment so that we're able to send only one - * command. - */ - debug_print("IMAP batch mode on, deferring tags change\n"); - for (cur = tags_set; cur; cur = cur->next) { - gint cur_tag = GPOINTER_TO_INT(cur->data); - if (cur_tag) { - ht_data = g_hash_table_lookup(IMAP_FOLDER_ITEM(item)->tags_set_table, - GINT_TO_POINTER(cur_tag)); - if (ht_data == NULL) { - ht_data = g_new0(TagsData, 1); - ht_data->str = g_strdup(tags_get_tag(cur_tag)); - ht_data->item = IMAP_FOLDER_ITEM(item); - g_hash_table_insert(IMAP_FOLDER_ITEM(item)->tags_set_table, - GINT_TO_POINTER(cur_tag), ht_data); - } - ht_data->msglist = g_slist_prepend(ht_data->msglist, GINT_TO_POINTER(msginfo->msgnum)); - } - } - for (cur = tags_unset; cur; cur = cur->next) { - gint cur_tag = GPOINTER_TO_INT(cur->data); - if (cur_tag) { - ht_data = g_hash_table_lookup(IMAP_FOLDER_ITEM(item)->tags_unset_table, - GINT_TO_POINTER(cur_tag)); - if (ht_data == NULL) { - ht_data = g_new0(TagsData, 1); - ht_data->str = g_strdup(tags_get_tag(cur_tag)); - ht_data->item = IMAP_FOLDER_ITEM(item); - g_hash_table_insert(IMAP_FOLDER_ITEM(item)->tags_unset_table, - GINT_TO_POINTER(cur_tag), ht_data); - } - ht_data->msglist = g_slist_prepend(ht_data->msglist, GINT_TO_POINTER(msginfo->msgnum)); - } - } - } else { - GSList *list_set = NULL; - GSList *list_unset = NULL; - GSList numlist; - - numlist.data = GINT_TO_POINTER(msginfo->msgnum); - numlist.next = NULL; - - debug_print("IMAP changing tags NOW\n"); - for (cur = tags_set; cur; cur = cur->next) { - gint cur_tag = GPOINTER_TO_INT(cur->data); - const gchar *str = tags_get_tag(cur_tag); - if (IS_NOT_RESERVED_TAG(str)) - list_set = g_slist_prepend(list_set, g_strdup(str)); - } - if (list_set) { - ok = imap_set_message_flags(session, - IMAP_FOLDER_ITEM(item), &numlist, 0, list_set, TRUE); - slist_free_strings_full(list_set); - if (ok != MAILIMAP_NO_ERROR) { - return; - } - } - - for (cur = tags_unset; cur; cur = cur->next) { - gint cur_tag = GPOINTER_TO_INT(cur->data); - const gchar *str = tags_get_tag(cur_tag); - if (IS_NOT_RESERVED_TAG(str)) - list_unset = g_slist_prepend(list_unset, g_strdup(str)); - } - if (list_unset) { - ok = imap_set_message_flags(session, - IMAP_FOLDER_ITEM(item), &numlist, 0, list_unset, FALSE); - slist_free_strings_full(list_unset); - if (ok != MAILIMAP_NO_ERROR) { - return; - } - } - } + fprintf(stderr, "TODO: delete imap_commit_tags\n"); } static gchar *imap_fetch_msg_full(Folder *folder, FolderItem *item, gint uid, @@ -3608,7 +3504,6 @@ static void *imap_get_uncached_messages_thread(void *data) GSList *newlist = NULL; GSList *llast = NULL; GSList *seq_list, *cur; - gboolean got_alien_tags = FALSE; debug_print("uncached_messages\n"); @@ -3647,7 +3542,7 @@ static void *imap_get_uncached_messages_thread(void *data) for(i = 0 ; i < carray_count(env_list) ; i += 2) { struct imap_fetch_env_info * info; MsgInfo * msginfo; - GSList *tags = NULL, *cur = NULL; + GSList *tags = NULL; info = carray_get(env_list, i); tags = carray_get(env_list, i+1); msginfo = imap_envelope_from_lep(info, item); @@ -3658,24 +3553,6 @@ static void *imap_get_uncached_messages_thread(void *data) g_slist_free(msginfo->tags); msginfo->tags = NULL; - for (cur = tags; cur; cur = cur->next) { - gchar *real_tag = imap_modified_utf7_to_utf8(cur->data, TRUE); - gint id = 0; - id = tags_get_id_for_str(real_tag); - if (id == -1) { - id = tags_add_tag(real_tag); - got_alien_tags = TRUE; - } - if (!g_slist_find(msginfo->tags, GINT_TO_POINTER(id))) { - msginfo->tags = g_slist_prepend( - msginfo->tags, - GINT_TO_POINTER(id)); - } - g_free(real_tag); - } - if (msginfo->tags) - msginfo->tags = g_slist_reverse(msginfo->tags); - slist_free_strings_full(tags); msginfo->folder = item; if (!newlist) llast = newlist = g_slist_append(newlist, msginfo); @@ -3684,14 +3561,9 @@ static void *imap_get_uncached_messages_thread(void *data) llast = llast->next; } } - imap_fetch_env_free(env_list); } - if (got_alien_tags) { - tags_write_tags(); - } - imap_lep_set_free(seq_list); session_set_access_time(SESSION(session)); @@ -5427,29 +5299,6 @@ bail: else if (wasnew) flags |= MSG_NEW; flags |= oldflags; - - if (tags_hash != NULL) { - GSList *tags = g_hash_table_lookup(tags_hash, GINT_TO_POINTER(msginfo->msgnum)); - GSList *cur; - - g_slist_free(msginfo->tags); - msginfo->tags = NULL; - - for (cur = tags; cur; cur = cur->next) { - gchar *real_tag = imap_modified_utf7_to_utf8(cur->data, TRUE); - gint id = 0; - id = tags_get_id_for_str(real_tag); - if (id == -1) { - id = tags_add_tag(real_tag); - got_alien_tags = TRUE; - } - msginfo->tags = g_slist_append( - msginfo->tags, - GINT_TO_POINTER(id)); - g_free(real_tag); - } - slist_free_strings_full(tags); - } } g_hash_table_insert(msgflags, msginfo, GINT_TO_POINTER(flags)); diff --git a/src/matcher.c b/src/matcher.c @@ -497,36 +497,6 @@ free_strs: } /*! - *\brief Find out if a tag matches a condition - * - *\param prop Matcher structure - *\param msginfo message to check - * - *\return gboolean TRUE if msginfo matches the condition in the - * matcher structure - */ -static gboolean matcherprop_tag_match(MatcherProp *prop, MsgInfo *msginfo, - const gchar *debug_context) -{ - gboolean ret = FALSE; - GSList *cur; - - if (msginfo == NULL || msginfo->tags == NULL) - return FALSE; - - for (cur = msginfo->tags; cur; cur = cur->next) { - const gchar *str = tags_get_tag(GPOINTER_TO_INT(cur->data)); - if (!str) - continue; - if (matcherprop_string_match(prop, str, debug_context)) { - ret = TRUE; - break; - } - } - return ret; -} - -/*! *\brief Find out if the string-ed list matches a condition * *\param prop Matcher structure @@ -744,14 +714,6 @@ static gboolean matcherprop_match(MatcherProp *prop, case MATCHCRITERIA_NOT_TO_AND_NOT_CC: return !matcherprop_string_match(prop, info->to, context_str[CONTEXT_TO]) && !matcherprop_string_match(prop, info->cc, context_str[CONTEXT_CC]); - case MATCHCRITERIA_TAG: - return matcherprop_tag_match(prop, info, context_str[CONTEXT_TAG]); - case MATCHCRITERIA_NOT_TAG: - return !matcherprop_tag_match(prop, info, context_str[CONTEXT_TAG]); - case MATCHCRITERIA_TAGGED: - return info->tags != NULL; - case MATCHCRITERIA_NOT_TAGGED: - return info->tags == NULL; case MATCHCRITERIA_AGE_GREATER: age_mult_hours = 24; /* Fallthrough intended */ diff --git a/src/msgcache.c b/src/msgcache.c @@ -38,7 +38,6 @@ #include "utils.h" #include "procmsg.h" #include "codeconv.h" -#include "tags.h" #include "prefs_common.h" #include "file-utils.h" @@ -854,99 +853,6 @@ bail_err: } } -void msgcache_read_tags(MsgCache *cache, const gchar *tags_file) -{ - FILE *fp; - MsgInfo *msginfo; - guint32 num; - gint map_len = -1; - char *cache_data = NULL; - struct stat st; - gboolean error = FALSE; - - swapping = TRUE; - - /* In case we can't open the mark file with MARK_VERSION, check if we can open it with the - * swapped MARK_VERSION. As msgcache_open_data_file swaps it too, if this succeeds, - * it means it's the old version (not little-endian) on a big-endian machine. The code has - * no effect on x86 as their file doesn't change. */ - - if ((fp = msgcache_open_data_file(tags_file, TAGS_VERSION, DATA_READ, NULL, 0)) == NULL) { - /* see if it isn't swapped ? */ - if ((fp = msgcache_open_data_file(tags_file, bswap_32(TAGS_VERSION), DATA_READ, NULL, 0)) == NULL) - return; - else - swapping = FALSE; /* yay */ - } - debug_print("reading %sswapped tags file.\n", swapping?"":"un"); - - if (msgcache_use_mmap_read) { - if (fstat(fileno(fp), &st) >= 0) - map_len = st.st_size; - else - map_len = -1; - if (map_len > 0) { - cache_data = mmap(NULL, map_len, PROT_READ, MAP_PRIVATE, fileno(fp), 0); - } - } else { - cache_data = NULL; - } - if (cache_data != NULL && cache_data != MAP_FAILED) { - int rem_len = map_len-ftell(fp); - char *walk_data = cache_data+ftell(fp); - - while(rem_len > 0) { - gint id = -1; - GET_CACHE_DATA_INT(num); - msginfo = g_hash_table_lookup(cache->msgnum_table, &num); - if(msginfo) { - g_slist_free(msginfo->tags); - msginfo->tags = NULL; - do { - GET_CACHE_DATA_INT(id); - if (id > 0) { - msginfo->tags = g_slist_prepend( - msginfo->tags, - GINT_TO_POINTER(id)); - } - } while (id > 0); - msginfo->tags = g_slist_reverse(msginfo->tags); - } - } - } else { - while (fread(&num, sizeof(num), 1, fp) == 1) { - gint id = -1; - if (swapping) - num = bswap_32(num); - msginfo = g_hash_table_lookup(cache->msgnum_table, &num); - if(msginfo) { - g_slist_free(msginfo->tags); - msginfo->tags = NULL; - do { - if (fread(&id, sizeof(id), 1, fp) != 1) - id = -1; - if (swapping) - id = bswap_32(id); - if (id > 0) { - msginfo->tags = g_slist_prepend( - msginfo->tags, - GINT_TO_POINTER(id)); - } - } while (id > 0); - msginfo->tags = g_slist_reverse(msginfo->tags); - } - } - } -bail_err: - if (cache_data != NULL && cache_data != MAP_FAILED) { - munmap(cache_data, map_len); - } - fclose(fp); - if (error) { - debug_print("error reading cache tags from %s\n", tags_file); - } -} - static int msgcache_write_cache(MsgInfo *msginfo, FILE *fp) { MsgTmpFlags flags = msginfo->flags.tmp_flags & MSG_CACHED_FLAG_MASK; @@ -990,23 +896,6 @@ static int msgcache_write_flags(MsgInfo *msginfo, FILE *fp) return w_err ? -1 : wrote; } -static int msgcache_write_tags(MsgInfo *msginfo, FILE *fp) -{ - GSList *cur = msginfo->tags; - int w_err = 0, wrote = 0; - - WRITE_CACHE_DATA_INT(msginfo->msgnum, fp); - for (; cur; cur = cur->next) { - gint id = GPOINTER_TO_INT(cur->data); - if (tags_get_tag(id) != NULL) { - WRITE_CACHE_DATA_INT(id, fp); - } - } - WRITE_CACHE_DATA_INT(-1, fp); - - return w_err ? -1 : wrote; -} - struct write_fps { FILE *cache_fp; @@ -1035,25 +924,18 @@ static void msgcache_write_func(gpointer key, gpointer value, gpointer user_data write_fps->cache_size += tmp; } if (write_fps->mark_fp) { - tmp= msgcache_write_flags(msginfo, write_fps->mark_fp); + tmp = msgcache_write_flags(msginfo, write_fps->mark_fp); if (tmp < 0) write_fps->error = 1; else write_fps->mark_size += tmp; - } - if (write_fps->tags_fp) { - tmp = msgcache_write_tags(msginfo, write_fps->tags_fp); - if (tmp < 0) - write_fps->error = 1; - else - write_fps->tags_size += tmp; } } gint msgcache_write(const gchar *cache_file, const gchar *mark_file, const gchar *tags_file, MsgCache *cache) { struct write_fps write_fps; - gchar *new_cache = NULL, *new_mark = NULL, *new_tags = NULL; + gchar *new_cache = NULL, *new_mark = NULL; int w_err = 0, wrote = 0; cm_return_val_if_fail(cache != NULL, -1); @@ -1062,8 +944,6 @@ gint msgcache_write(const gchar *cache_file, const gchar *mark_file, const gchar new_cache = g_strconcat(cache_file, ".new", NULL); if (mark_file) new_mark = g_strconcat(mark_file, ".new", NULL); - if (tags_file) - new_tags = g_strconcat(tags_file, ".new", NULL); write_fps.error = 0; write_fps.cache_size = 0; @@ -1078,7 +958,6 @@ gint msgcache_write(const gchar *cache_file, const gchar *mark_file, const gchar if (write_fps.cache_fp == NULL) { g_free(new_cache); g_free(new_mark); - g_free(new_tags); return -1; } WRITE_CACHE_DATA(CS_UTF_8, write_fps.cache_fp); @@ -1093,7 +972,6 @@ gint msgcache_write(const gchar *cache_file, const gchar *mark_file, const gchar unlink(new_cache); g_free(new_cache); g_free(new_mark); - g_free(new_tags); return -1; } @@ -1106,31 +984,13 @@ gint msgcache_write(const gchar *cache_file, const gchar *mark_file, const gchar unlink(new_cache); g_free(new_cache); g_free(new_mark); - g_free(new_tags); return -1; } } else { write_fps.mark_fp = NULL; } - if (tags_file) { - write_fps.tags_fp = msgcache_open_data_file(new_tags, TAGS_VERSION, - DATA_WRITE, NULL, 0); - if (write_fps.tags_fp == NULL) { - if (write_fps.cache_fp) - fclose(write_fps.cache_fp); - if (write_fps.mark_fp) - fclose(write_fps.mark_fp); - unlink(new_cache); - unlink(new_mark); - g_free(new_cache); - g_free(new_mark); - g_free(new_tags); - return -1; - } - } else { - write_fps.tags_fp = NULL; - } + write_fps.tags_fp = NULL; if (write_fps.cache_fp || write_fps.mark_fp) debug_print("\tWriting message cache to %s and %s...\n", new_cache, new_mark); @@ -1143,8 +1003,6 @@ gint msgcache_write(const gchar *cache_file, const gchar *mark_file, const gchar write_fps.cache_size = ftell(write_fps.cache_fp); if (write_fps.mark_fp) write_fps.mark_size = ftell(write_fps.mark_fp); - if (write_fps.tags_fp) - write_fps.tags_size = ftell(write_fps.tags_fp); /* write data to the files */ g_hash_table_foreach(cache->msgnum_table, msgcache_write_func, (gpointer)&write_fps); @@ -1154,18 +1012,13 @@ gint msgcache_write(const gchar *cache_file, const gchar *mark_file, const gchar write_fps.error |= (safe_fclose(write_fps.cache_fp) != 0); if (write_fps.mark_fp) write_fps.error |= (safe_fclose(write_fps.mark_fp) != 0); - if (write_fps.tags_fp) - write_fps.error |= (safe_fclose(write_fps.tags_fp) != 0); - if (write_fps.error != 0) { /* in case of error, forget all */ unlink(new_cache); unlink(new_mark); - unlink(new_tags); g_free(new_cache); g_free(new_mark); - g_free(new_tags); return -1; } else { /* switch files */ @@ -1173,14 +1026,11 @@ gint msgcache_write(const gchar *cache_file, const gchar *mark_file, const gchar move_file(new_cache, cache_file, TRUE); if (mark_file) move_file(new_mark, mark_file, TRUE); - if (tags_file) - move_file(new_tags, tags_file, TRUE); cache->last_access = time(NULL); } g_free(new_cache); g_free(new_mark); - g_free(new_tags); debug_print("msgcache_write() done.\n"); return 0; } diff --git a/src/prefs_filtering_action.c b/src/prefs_filtering_action.c @@ -330,7 +330,6 @@ static void prefs_filtering_action_create(void) GtkWidget *dest_entry; GtkWidget *dest_btn; GtkWidget *score_entry; - GtkWidget *tags_combo; GtkWidget *reg_hbox; GtkWidget *btn_hbox; @@ -498,18 +497,6 @@ static void prefs_filtering_action_create(void) score_entry = gtk_spin_button_new_with_range(-1000, 1000, 1); gtk_box_pack_start(GTK_BOX(hbox1), score_entry, FALSE, FALSE, 0); - tags_combo = gtk_combo_box_text_new (); - gtk_size_group_add_widget(size_action, tags_combo); - - for (tmp = tags = tags_get_list() ; tmp != NULL; - tmp = tmp->next) { - gchar *name = g_strdup(tags_get_tag(GPOINTER_TO_INT(tmp->data))); - - gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(tags_combo), (gpointer) name); - g_free(name); - } - g_slist_free(tags); - prefs_filtering_action_check_widget_width(tags_combo); gtk_combo_box_set_active(GTK_COMBO_BOX(tags_combo), 0); gtk_box_pack_start (GTK_BOX (hbox1), tags_combo, @@ -681,8 +668,7 @@ static void prefs_filtering_action_set_dialog(GSList *action_list) prefs_filtering_action_reset_dialog(); - combobox_set_sensitive(GTK_COMBO_BOX(filtering_action.action_combo), 9, - (tags_get_size() > 0) ? TRUE : FALSE); + combobox_set_sensitive(GTK_COMBO_BOX(filtering_action.action_combo), 9, FALSE); } /*! diff --git a/src/textview.c b/src/textview.c @@ -225,7 +225,6 @@ static void mail_to_uri_cb (GtkAction *action, TextView *textview); static void copy_mail_to_uri_cb (GtkAction *action, TextView *textview); -static void textview_show_tags(TextView *textview); static GtkActionEntry textview_link_popup_entries[] = { @@ -243,10 +242,6 @@ static GtkActionEntry textview_mail_popup_entries[] = {"TextviewPopupMail/Copy", NULL, N_("Copy this add_ress"), NULL, NULL, G_CALLBACK(copy_mail_to_uri_cb) }, }; -static void scrolled_cb (GtkAdjustment *adj, gpointer data) -{ -} - static void textview_size_allocate_cb (GtkWidget *widget, GtkAllocation *allocation, gpointer data) @@ -635,10 +630,6 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo) if (headers) { if (charcount > 0) gtk_text_buffer_insert(buffer, &iter, "\n", 1); - - if (procmime_mimeinfo_parent(mimeinfo) == NULL && - !prefs_common.display_header_pane) - textview_show_tags(textview); textview_show_header(textview, headers); procheader_header_array_destroy(headers); } @@ -2003,82 +1994,6 @@ bail: textview->avatar_type = 0; } -static gint textview_tag_cmp_list(gconstpointer a, gconstpointer b) -{ - gint id_a = GPOINTER_TO_INT(a); - gint id_b = GPOINTER_TO_INT(b); - const gchar *tag_a = tags_get_tag(id_a); - const gchar *tag_b = tags_get_tag(id_b); - - if (tag_a == NULL) - return tag_b == NULL ? 0:1; - - if (tag_b == NULL) - return 1; - - return g_utf8_collate(tag_a, tag_b); -} - - -static void textview_show_tags(TextView *textview) -{ - MsgInfo *msginfo = textview->messageview->msginfo; - GtkTextView *text = GTK_TEXT_VIEW(textview->text); - GtkTextBuffer *buffer = gtk_text_view_get_buffer(text); - GtkTextIter iter; - ClickableText *uri; - GSList *cur, *orig; - gboolean found_tag = FALSE; - - if (!msginfo->tags) - return; - - cur = orig = g_slist_sort(g_slist_copy(msginfo->tags), textview_tag_cmp_list); - - for (; cur; cur = cur->next) { - if (tags_get_tag(GPOINTER_TO_INT(cur->data)) != NULL) { - found_tag = TRUE; - break; - } - } - if (!found_tag) { - g_slist_free(orig); - return; - } - - gtk_text_buffer_get_end_iter (buffer, &iter); - gtk_text_buffer_insert_with_tags_by_name(buffer, - &iter, _("Tags: "), -1, - "header_title", "header", "tags", NULL); - - for (cur = orig; cur; cur = cur->next) { - const gchar *cur_tag = tags_get_tag(GPOINTER_TO_INT(cur->data)); - if (!cur_tag) - continue; - uri = g_new0(ClickableText, 1); - uri->uri = g_strdup(""); - uri->start = gtk_text_iter_get_offset(&iter); - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, - cur_tag, -1, - "link", "header", "tags", NULL); - uri->end = gtk_text_iter_get_offset(&iter); - uri->filename = g_strdup_printf("cm://search_tags:%s", cur_tag); - uri->data = NULL; - textview->uri_list = - g_slist_prepend(textview->uri_list, uri); - if (cur->next && tags_get_tag(GPOINTER_TO_INT(cur->next->data))) - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, ", ", 2, - "header", "tags", NULL); - else - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, " ", 1, - "header", "tags", NULL); - } - g_slist_free(orig); - - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, "\n", 1, - "header", "tags", NULL); -} - static void textview_show_header(TextView *textview, GPtrArray *headers) { GtkTextView *text = GTK_TEXT_VIEW(textview->text);