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:
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);