commit d8033992f65a492387234b516952087471be92e0
parent 397de38a9a4bea873d8f02c5638b47d88870ec9c
Author: Oliver Lowe <o@olowe.co>
Date: Thu, 14 Aug 2025 22:13:01 +1000
Start dropping NNTP support :(
Eternal September makes me sad and I was not even old enough to be
walking yet :(
Diffstat:
7 files changed, 0 insertions(+), 1107 deletions(-)
diff --git a/src/Makefile.am b/src/Makefile.am
@@ -76,7 +76,6 @@ claws_mail_SOURCES = \
foldersel.c \
folderutils.c \
folderview.c \
- grouplistdialog.c \
headerview.c \
html.c \
image_viewer.c \
@@ -99,7 +98,6 @@ claws_mail_SOURCES = \
mimeview.c \
msgcache.c \
news.c \
- news_gtk.c \
noticeview.c \
oauth2.c \
partial_download.c \
@@ -190,7 +188,6 @@ claws_mailinclude_HEADERS = \
foldersel.h \
folderutils.h \
folderview.h \
- grouplistdialog.h \
headerview.h \
html.h \
image_viewer.h \
@@ -215,7 +212,6 @@ claws_mailinclude_HEADERS = \
mimeview.h \
msgcache.h \
news.h \
- news_gtk.h \
noticeview.h \
oauth2.h \
partial_download.h \
diff --git a/src/grouplistdialog.c b/src/grouplistdialog.c
@@ -1,630 +0,0 @@
-/*
- * Claws Mail -- a GTK based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2024 the Claws Mail team and Hiroyuki Yamamoto
- *
- * 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 <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
-#include <string.h>
-
-#include "grouplistdialog.h"
-#include "mainwindow.h"
-#include "manage_window.h"
-#include "gtkutils.h"
-#include "utils.h"
-#include "news.h"
-#include "folder.h"
-#include "alertpanel.h"
-#include "recv.h"
-#include "socket.h"
-#include "prefs_common.h"
-
-#define GROUPLIST_DIALOG_WIDTH 450
-#define GROUPLIST_DIALOG_HEIGHT 400
-#define GROUPLIST_COL_NAME_WIDTH 250
-
-static gboolean ack;
-static gboolean locked;
-
-static GtkWidget *dialog;
-static GtkWidget *entry;
-static GtkWidget *ctree;
-static GtkWidget *status_label;
-static GtkWidget *ok_button;
-static GSList *group_list;
-static Folder *news_folder;
-
-static GSList *subscribed;
-
-static void grouplist_dialog_create (void);
-static void grouplist_dialog_set_list (const gchar *pattern,
- gboolean refresh);
-static void grouplist_search (void);
-static void grouplist_clear (void);
-static gboolean grouplist_recv_func (SockInfo *sock,
- gint count,
- gint read_bytes,
- gpointer data);
-static void grouplist_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-
-static gint window_deleted (GtkWidget *widget,
- GdkEventAny *event,
- gpointer data);
-static void ok_clicked (GtkWidget *widget,
- gpointer data);
-static void cancel_clicked (GtkWidget *widget,
- gpointer data);
-static void refresh_clicked (GtkWidget *widget,
- gpointer data);
-static gboolean key_pressed (GtkWidget *widget,
- GdkEventKey *event,
- gpointer data);
-static gboolean button_press_cb (GtkCMCTree *ctree,
- GdkEventButton *button,
- gpointer data);
-static void entry_activated (GtkEditable *editable);
-static void search_clicked (GtkWidget *widget,
- gpointer data);
-
-GSList *grouplist_dialog(Folder *folder)
-{
- GNode *node;
- FolderItem *item;
-
- if (dialog && gtk_widget_get_visible(dialog)) return NULL;
-
- if (!dialog)
- grouplist_dialog_create();
-
- news_folder = folder;
-
- gtk_widget_show(dialog);
- gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
- manage_window_set_transient(GTK_WINDOW(dialog));
- gtk_widget_grab_focus(ok_button);
- gtk_widget_grab_focus(ctree);
- GTK_EVENTS_FLUSH();
-
- subscribed = NULL;
- for (node = folder->node->children; node != NULL; node = node->next) {
- item = FOLDER_ITEM(node->data);
- subscribed = g_slist_append(subscribed, g_strdup(item->path));
- }
-
- grouplist_dialog_set_list(NULL, TRUE);
-
- if (ack) {
- gtk_window_set_keep_above(GTK_WINDOW(dialog), TRUE);
- gtk_main();
- }
-
- manage_window_focus_out(dialog, NULL, NULL);
- gtk_widget_hide(dialog);
-
- if (!ack) {
- slist_free_strings_full(subscribed);
- subscribed = NULL;
-
- for (node = folder->node->children; node != NULL;
- node = node->next) {
- item = FOLDER_ITEM(node->data);
- subscribed = g_slist_append(subscribed,
- g_strdup(item->path));
- }
- }
-
- grouplist_clear();
-
- return subscribed;
-}
-
-static void grouplist_dialog_create(void)
-{
- GtkWidget *grid;
- GtkWidget *hgrid;
- GtkWidget *msg_label;
- GtkWidget *search_button;
- GtkWidget *cancel_button;
- GtkWidget *refresh_button;
- GtkWidget *scrolledwin;
- static GdkGeometry geometry;
- gchar *titles[3];
- gint i;
-
- dialog = gtk_dialog_new();
- gtk_window_set_resizable(GTK_WINDOW(dialog), TRUE);
- gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
- gtk_window_set_title(GTK_WINDOW(dialog), _("Newsgroup subscription"));
- g_signal_connect(G_OBJECT(dialog), "delete_event",
- G_CALLBACK(window_deleted), NULL);
- g_signal_connect(G_OBJECT(dialog), "key_press_event",
- G_CALLBACK(key_pressed), NULL);
- g_signal_connect(G_OBJECT(dialog), "size_allocate",
- G_CALLBACK(grouplist_size_allocate), NULL);
- MANAGE_WINDOW_SIGNALS_CONNECT(dialog);
-
- grid = gtk_grid_new();
- gtk_grid_set_row_spacing(GTK_GRID(grid), 8);
- gtk_container_set_border_width(GTK_CONTAINER(grid), 8);
- gtk_orientable_set_orientation(GTK_ORIENTABLE(grid),
- GTK_ORIENTATION_VERTICAL);
- gtk_container_add(GTK_CONTAINER(
- gtk_dialog_get_content_area(GTK_DIALOG(dialog))), grid);
-
- msg_label = gtk_label_new(_("Select newsgroups for subscription:"));
- gtk_widget_set_hexpand(msg_label, TRUE);
- gtk_widget_set_vexpand(msg_label, FALSE);
- gtk_widget_set_halign(msg_label, GTK_ALIGN_START);
- gtk_container_add(GTK_CONTAINER(grid), msg_label);
-
- hgrid = gtk_grid_new();
- gtk_grid_set_column_spacing(GTK_GRID(hgrid), 8);
- gtk_orientable_set_orientation(GTK_ORIENTABLE(hgrid),
- GTK_ORIENTATION_HORIZONTAL);
- gtk_widget_set_hexpand(hgrid, TRUE);
- gtk_widget_set_vexpand(hgrid, FALSE);
- gtk_container_add(GTK_CONTAINER(grid), hgrid);
-
- msg_label = gtk_label_new(_("Find groups:"));
- gtk_container_add(GTK_CONTAINER(hgrid), msg_label);
-
- entry = gtk_entry_new();
- gtk_widget_set_hexpand(entry, TRUE);
- gtk_container_add(GTK_CONTAINER(hgrid), entry);
- g_signal_connect(G_OBJECT(entry), "activate",
- G_CALLBACK(entry_activated), NULL);
-
- search_button = gtk_button_new_with_label(_(" Search "));
- gtk_container_add(GTK_CONTAINER(hgrid), search_button);
-
- g_signal_connect(G_OBJECT(search_button), "clicked",
- G_CALLBACK(search_clicked), NULL);
-
- scrolledwin = gtk_scrolled_window_new(NULL, NULL);
- gtk_widget_set_hexpand(scrolledwin, TRUE);
- gtk_widget_set_vexpand(scrolledwin, TRUE);
- gtk_container_add(GTK_CONTAINER(grid), scrolledwin);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrolledwin),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
-
- titles[0] = _("Newsgroup name");
- titles[1] = _("Messages");
- titles[2] = _("Type");
- ctree = gtk_sctree_new_with_titles(3, 0, titles);
- gtk_container_add(GTK_CONTAINER(scrolledwin), ctree);
- gtk_cmclist_set_column_width
- (GTK_CMCLIST(ctree), 0, GROUPLIST_COL_NAME_WIDTH);
- gtk_cmclist_set_column_auto_resize(GTK_CMCLIST(ctree), 0, TRUE);
- gtk_cmclist_set_selection_mode(GTK_CMCLIST(ctree), GTK_SELECTION_MULTIPLE);
-
- gtk_cmctree_set_expander_style(GTK_CMCTREE(ctree),
- GTK_CMCTREE_EXPANDER_TRIANGLE);
-
- for (i = 0; i < 3; i++)
- gtk_widget_set_can_focus(GTK_CMCLIST(ctree)->column[i].button, FALSE);
- g_signal_connect(G_OBJECT(ctree), "button-press-event",
- G_CALLBACK(button_press_cb), NULL);
-
- status_label = gtk_label_new("");
- gtk_widget_set_hexpand(status_label, TRUE);
- gtk_widget_set_vexpand(status_label, FALSE);
- gtk_widget_set_halign(status_label, GTK_ALIGN_START);
- gtk_container_add(GTK_CONTAINER(grid), status_label);
-
- refresh_button = gtk_dialog_add_button(GTK_DIALOG(dialog), _("_Refresh"),
- GTK_RESPONSE_NONE);
- cancel_button = gtk_dialog_add_button(GTK_DIALOG(dialog),_("_Cancel"),
- GTK_RESPONSE_NONE);
- ok_button = gtk_dialog_add_button(GTK_DIALOG(dialog),_("_OK"),
- GTK_RESPONSE_NONE);
- gtk_widget_grab_default(ok_button);
-
- g_signal_connect(G_OBJECT(ok_button), "clicked",
- G_CALLBACK(ok_clicked), NULL);
- g_signal_connect(G_OBJECT(cancel_button), "clicked",
- G_CALLBACK(cancel_clicked), NULL);
- g_signal_connect(G_OBJECT(refresh_button), "clicked",
- G_CALLBACK(refresh_clicked), NULL);
-
- if (!geometry.min_width) {
- geometry.min_width = GROUPLIST_DIALOG_WIDTH;
- geometry.min_height = GROUPLIST_DIALOG_HEIGHT;
- }
-
- gtk_window_set_geometry_hints(GTK_WINDOW(dialog), NULL, &geometry,
- GDK_HINT_MIN_SIZE);
- gtk_window_set_default_size(GTK_WINDOW(dialog),
- prefs_common.news_subscribe_width,
- prefs_common.news_subscribe_height);
-
- gtk_widget_show_all(gtk_dialog_get_content_area(GTK_DIALOG(dialog)));
-}
-
-static GHashTable *branch_node_table;
-
-static void grouplist_hash_init(void)
-{
- branch_node_table = g_hash_table_new(g_str_hash, g_str_equal);
-}
-
-static void grouplist_hash_done(void)
-{
- hash_free_strings(branch_node_table);
- g_hash_table_destroy(branch_node_table);
-}
-
-static GtkCMCTreeNode *grouplist_hash_get_branch_node(const gchar *name)
-{
- return g_hash_table_lookup(branch_node_table, name);
-}
-
-static void grouplist_hash_set_branch_node(const gchar *name,
- GtkCMCTreeNode *node)
-{
- g_hash_table_insert(branch_node_table, g_strdup(name), node);
-}
-
-static gchar *grouplist_get_parent_name(const gchar *name)
-{
- gchar *p;
-
- p = strrchr(name, '.');
- if (!p)
- return g_strdup("");
- return g_strndup(name, p - name);
-}
-
-static GtkCMCTreeNode *grouplist_create_parent(const gchar *name,
- const gchar *pattern)
-{
- GtkCMCTreeNode *parent;
- GtkCMCTreeNode *node;
- gchar *cols[3];
- gchar *parent_name;
-
- if (*name == '\0') return NULL;
- node = grouplist_hash_get_branch_node(name);
- if (node != NULL) return node;
-
- cols[0] = (gchar *)name;
- cols[1] = cols[2] = "";
-
- parent_name = grouplist_get_parent_name(name);
- parent = grouplist_create_parent(parent_name, pattern);
-
- node = parent ? GTK_CMCTREE_ROW(parent)->children
- : GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list);
- node = gtk_sctree_insert_node(GTK_CMCTREE(ctree), parent, node,
- cols, 0, NULL, NULL,
- FALSE, FALSE);
- if (parent && g_pattern_match_simple(pattern, parent_name) == FALSE)
- gtk_cmctree_expand(GTK_CMCTREE(ctree), parent);
- gtk_cmctree_node_set_selectable(GTK_CMCTREE(ctree), node, FALSE);
-
- grouplist_hash_set_branch_node(name, node);
-
- g_free(parent_name);
-
- return node;
-}
-
-static GtkCMCTreeNode *grouplist_create_branch(NewsGroupInfo *ginfo,
- const gchar *pattern)
-{
- GtkCMCTreeNode *node;
- GtkCMCTreeNode *parent;
- gchar *name = (gchar *)ginfo->name;
- gchar *parent_name;
- gchar *count_str;
- gchar *cols[3];
- gint count;
-
- count = ginfo->last - ginfo->first;
- if (count < 0)
- count = 0;
- count_str = itos(count);
-
- cols[0] = ginfo->name;
- cols[1] = count_str;
- if (ginfo->type == 'y')
- cols[2] = "";
- else if (ginfo->type == 'm')
- cols[2] = _("moderated");
- else if (ginfo->type == 'n')
- cols[2] = _("read-only");
- else
- cols[2] = _("unknown");
-
- parent_name = grouplist_get_parent_name(name);
- parent = grouplist_create_parent(parent_name, pattern);
- node = grouplist_hash_get_branch_node(name);
- if (node) {
- gtk_cmctree_set_node_info(GTK_CMCTREE(ctree), node, cols[0], 0,
- NULL, NULL, FALSE, FALSE);
- gtk_cmctree_node_set_text(GTK_CMCTREE(ctree), node, 1, cols[1]);
- gtk_cmctree_node_set_text(GTK_CMCTREE(ctree), node, 2, cols[2]);
- } else {
- node = parent ? GTK_CMCTREE_ROW(parent)->children
- : GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list);
- node = gtk_sctree_insert_node(GTK_CMCTREE(ctree), parent, node,
- cols, 0, NULL, NULL,
- TRUE, FALSE);
- if (parent &&
- g_pattern_match_simple(pattern, parent_name) == FALSE)
- gtk_cmctree_expand(GTK_CMCTREE(ctree), parent);
- }
- gtk_cmctree_node_set_selectable(GTK_CMCTREE(ctree), node, TRUE);
- if (node)
- gtk_cmctree_node_set_row_data(GTK_CMCTREE(ctree), node, ginfo);
-
- g_free(parent_name);
-
- return node;
-}
-
-static void grouplist_expand_upwards(GtkCMCTree *ctree, const gchar *name) {
- const gchar *ptr;
- gchar *newname=g_malloc0(strlen(name) + 1);
- GtkCMCTreeNode *node;
-
- for (ptr=name; *ptr; ptr++) {
- if (*ptr == '.') {
- node = grouplist_hash_get_branch_node(newname);
- if (node != NULL)
- gtk_cmctree_expand(ctree, node);
- }
- newname[ptr-name] = *ptr;
- }
- g_free(newname);
-}
-
-static void grouplist_dialog_set_list(const gchar *pattern, gboolean refresh)
-{
- static GdkCursor *watch_cursor = NULL;
- GSList *cur;
- GtkCMCTreeNode *node;
- GPatternSpec *pspec;
- GdkWindow *window;
-
- if (locked) return;
- locked = TRUE;
-
- if (!pattern || *pattern == '\0')
- pattern = "*";
-
- window = gtk_widget_get_window(dialog);
- if (!watch_cursor)
- watch_cursor = gdk_cursor_new_for_display(
- gdk_window_get_display(window), GDK_WATCH);
- gdk_window_set_cursor(window, watch_cursor);
- main_window_cursor_wait(mainwindow_get_mainwindow());
- GTK_EVENTS_FLUSH();
-
- if (refresh) {
- ack = TRUE;
- grouplist_clear();
- recv_set_ui_func(grouplist_recv_func, NULL);
- group_list = news_get_group_list(news_folder);
- group_list = g_slist_reverse(group_list);
- recv_set_ui_func(NULL, NULL);
- if (group_list == NULL && ack == TRUE) {
- alertpanel_error(_("Can't retrieve newsgroup list."));
- locked = FALSE;
- gdk_window_set_cursor(window, NULL);
- main_window_cursor_normal(mainwindow_get_mainwindow());
- return;
- }
- } else
- gtk_cmclist_clear(GTK_CMCLIST(ctree));
-
- gtk_entry_set_text(GTK_ENTRY(entry), pattern);
-
- grouplist_hash_init();
-
- gtk_cmclist_freeze(GTK_CMCLIST(ctree));
-
- pspec = g_pattern_spec_new(pattern);
-
- for (cur = group_list; cur != NULL ; cur = cur->next) {
- NewsGroupInfo *ginfo = (NewsGroupInfo *)cur->data;
-#if GLIB_CHECK_VERSION(2,70,0)
- if (g_pattern_spec_match_string(pspec, ginfo->name)) {
-#else
- if (g_pattern_match_string(pspec, ginfo->name)) {
-#endif
- node = grouplist_create_branch(ginfo, pattern);
- if (g_slist_find_custom(subscribed, ginfo->name,
- (GCompareFunc)g_ascii_strcasecmp)
- != NULL)
- gtk_cmctree_select(GTK_CMCTREE(ctree), node);
- }
- }
- for (cur = subscribed; cur; cur = g_slist_next(cur))
- grouplist_expand_upwards(GTK_CMCTREE(ctree), (gchar *)cur->data);
-
- g_pattern_spec_free(pspec);
-
- gtk_cmclist_thaw(GTK_CMCLIST(ctree));
-
- grouplist_hash_done();
-
- gtk_label_set_text(GTK_LABEL(status_label), _("Done."));
-
- gdk_window_set_cursor(window, NULL);
- main_window_cursor_normal(mainwindow_get_mainwindow());
-
- locked = FALSE;
-}
-
-static void grouplist_search(void)
-{
- gchar *str;
-
- if (locked) return;
-
- str = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
- grouplist_dialog_set_list(str, FALSE);
- g_free(str);
-}
-
-static void grouplist_clear(void)
-{
- gtk_cmclist_clear(GTK_CMCLIST(ctree));
- gtk_entry_set_text(GTK_ENTRY(entry), "");
- news_group_list_free(group_list);
- group_list = NULL;
-}
-
-static gboolean grouplist_recv_func(SockInfo *sock, gint count, gint read_bytes,
- gpointer data)
-{
- gchar buf[BUFFSIZE];
-
- g_snprintf(buf, sizeof(buf),
- _("%d newsgroups received (%s read)"),
- count, to_human_readable((goffset)read_bytes));
- gtk_label_set_text(GTK_LABEL(status_label), buf);
- GTK_EVENTS_FLUSH();
- if (ack == FALSE)
- return FALSE;
- else
- return TRUE;
-}
-
-static void grouplist_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
-{
- cm_return_if_fail( allocation != NULL );
-
- gtk_window_get_size(GTK_WINDOW(widget),
- &prefs_common.news_subscribe_width, &prefs_common.news_subscribe_height);
-}
-
-static gint window_deleted(GtkWidget *widget, GdkEventAny *event, gpointer data)
-{
- ack = FALSE;
- if (gtk_main_level() > 1)
- gtk_main_quit();
-
- return TRUE;
-}
-
-static void ok_clicked(GtkWidget *widget, gpointer data)
-{
- ack = TRUE;
- if (gtk_main_level() > 1)
- gtk_main_quit();
-}
-
-static void cancel_clicked(GtkWidget *widget, gpointer data)
-{
- ack = FALSE;
- if (gtk_main_level() > 1)
- gtk_main_quit();
-}
-
-static void refresh_clicked(GtkWidget *widget, gpointer data)
-{
- gchar *str;
-
- if (locked) return;
-
- news_remove_group_list_cache(news_folder);
-
- str = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
- grouplist_dialog_set_list(str, TRUE);
- g_free(str);
-}
-
-static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
-{
- if (event && event->keyval == GDK_KEY_Escape)
- cancel_clicked(NULL, NULL);
- return FALSE;
-}
-
-/* clist/ctree clear old selection on click (gtk2 only)
- * - intercept all button clicks (always return TRUE)
- * - only allow left button single click
- * - handle click on expander
- * - update "subscribed" list and un-/select row
- */
-static gboolean button_press_cb(GtkCMCTree *ctree, GdkEventButton *button,
- gpointer data)
-{
- gint row, col;
- GtkCMCTreeNode *node;
- NewsGroupInfo *ginfo;
- GSList *list;
-
- if (button->type != GDK_BUTTON_PRESS) return TRUE;
- if (button->button != 1) return TRUE;
- if (button->window != GTK_CMCLIST(ctree)->clist_window) return TRUE;
-
- if (!gtk_cmclist_get_selection_info(GTK_CMCLIST(ctree),
- button->x, button->y, &row, &col))
- return TRUE;
- node = gtk_cmctree_node_nth(ctree, row);
- if (!node) return TRUE;
-
- if (gtk_cmctree_is_hot_spot(ctree, button->x, button->y)) {
- gtk_cmctree_toggle_expansion(ctree, node);
- return TRUE;
- }
-
- ginfo = gtk_cmctree_node_get_row_data(ctree, node);
- if (!ginfo) return TRUE;
-
- list = g_slist_find_custom(subscribed, ginfo->name,
- (GCompareFunc)g_ascii_strcasecmp);
- if (list) {
- /*
- * Make a copy so we can g_free() it after we remove
- * list from the subscribed list. Calling g_free()
- * first triggers a use-after-free Coverity issue.
- */
- gpointer tmpdata = list->data;
- subscribed = g_slist_remove(subscribed, list->data);
- g_free(tmpdata);
- gtk_cmclist_unselect_row(GTK_CMCLIST(ctree), row, 0);
- } else {
- subscribed = g_slist_append(subscribed, g_strdup(ginfo->name));
- gtk_cmclist_select_row(GTK_CMCLIST(ctree), row, 0);
- }
-
- return TRUE;
-}
-
-static void entry_activated(GtkEditable *editable)
-{
- grouplist_search();
-}
-
-static void search_clicked(GtkWidget *widget, gpointer data)
-{
- grouplist_search();
-}
diff --git a/src/grouplistdialog.h b/src/grouplistdialog.h
@@ -1,29 +0,0 @@
-/*
- * Claws Mail -- a GTK based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2012 Hiroyuki Yamamoto 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/>.
- *
- */
-
-#ifndef __GROUPLISTDIALOG_H__
-#define __GROUPLISTDIALOG_H__
-
-#include <glib.h>
-
-#include "folder.h"
-
-GSList *grouplist_dialog (Folder *folder);
-
-#endif /* __GROUPLISTDIALOG_H__ */
diff --git a/src/main.c b/src/main.c
@@ -109,7 +109,6 @@
#include "prefs_toolbar.h"
#include "mh_gtk.h"
#include "imap_gtk.h"
-#include "news_gtk.h"
#include "matcher.h"
#include "tags.h"
#include "hooks.h"
@@ -736,7 +735,6 @@ int main(int argc, char *argv[])
mh_gtk_init();
imap_gtk_init();
- news_gtk_init();
mainwin = main_window_create();
diff --git a/src/news.c b/src/news.c
@@ -36,7 +36,6 @@
#include "nntp-thread.h"
#include "news.h"
-#include "news_gtk.h"
#include "socket.h"
#include "recv.h"
#include "procmsg.h"
@@ -1361,7 +1360,6 @@ static gboolean news_scan_required(Folder *folder, FolderItem *item)
void news_synchronise(FolderItem *item, gint days)
{
- news_gtk_synchronise(item, days);
}
static gint news_rename_folder(Folder *folder, FolderItem *item,
diff --git a/src/news_gtk.c b/src/news_gtk.c
@@ -1,409 +0,0 @@
-/*
- * Claws Mail -- a GTK based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2022 the Claws Mail team and Hiroyuki Yamamoto
- *
- * 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 "utils.h"
-#include "folder.h"
-#include "folderview.h"
-#include "menu.h"
-#include "account.h"
-#include "alertpanel.h"
-#include "grouplistdialog.h"
-#include "prefs_common.h"
-#include "news_gtk.h"
-#include "common/hooks.h"
-#include "inc.h"
-#include "news.h"
-#include "statusbar.h"
-#include "inputdialog.h"
-
-static void subscribe_newsgroup_cb(GtkAction *action, gpointer data);
-static void unsubscribe_newsgroup_cb(GtkAction *action, gpointer data);
-static void rename_newsgroup_cb(GtkAction *action, gpointer data);
-static void update_tree_cb(GtkAction *action, gpointer data);
-static void download_cb(GtkAction *action, gpointer data);
-static void sync_cb(GtkAction *action, gpointer data);
-
-static GtkActionEntry news_popup_entries[] =
-{
- {"FolderViewPopup/Subscribe", NULL, N_("_Subscribe to newsgroup..."), NULL, NULL, G_CALLBACK(subscribe_newsgroup_cb) },
- {"FolderViewPopup/Unsubscribe", NULL, N_("_Unsubscribe newsgroup"), NULL, NULL, G_CALLBACK(unsubscribe_newsgroup_cb) },
-
- {"FolderViewPopup/Synchronise", NULL, N_("Synchronise"), NULL, NULL, G_CALLBACK(sync_cb) },
- {"FolderViewPopup/DownloadMessages", NULL, N_("Down_load messages"), NULL, NULL, G_CALLBACK(download_cb) },
- {"FolderViewPopup/RenameFolder", NULL, N_("_Rename folder..."), NULL, NULL, G_CALLBACK(rename_newsgroup_cb) },
-
- {"FolderViewPopup/CheckNewMessages", NULL, N_("_Check for new messages"), NULL, NULL, G_CALLBACK(update_tree_cb) },
-
-};
-
-static void set_sensitivity(GtkUIManager *ui_manager, FolderItem *item);
-static void add_menuitems(GtkUIManager *ui_manager, FolderItem *item);
-
-static FolderViewPopup news_popup =
-{
- "news",
- "<NewsFolder>",
- news_popup_entries,
- G_N_ELEMENTS(news_popup_entries),
- NULL, 0,
- NULL, 0, 0, NULL,
- add_menuitems,
- set_sensitivity
-};
-
-void news_gtk_init(void)
-{
- folderview_register_popup(&news_popup);
-}
-
-static void add_menuitems(GtkUIManager *ui_manager, FolderItem *item)
-{
- MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "Subscribe", "FolderViewPopup/Subscribe", GTK_UI_MANAGER_MENUITEM)
- MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "Unsubscribe", "FolderViewPopup/Unsubscribe", GTK_UI_MANAGER_MENUITEM)
- MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "SeparatorNews1", "FolderViewPopup/---", GTK_UI_MANAGER_SEPARATOR)
- MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "Synchronise", "FolderViewPopup/Synchronise", GTK_UI_MANAGER_MENUITEM)
- MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "DownloadMessages", "FolderViewPopup/DownloadMessages", GTK_UI_MANAGER_MENUITEM)
- MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "RenameFolder", "FolderViewPopup/RenameFolder", GTK_UI_MANAGER_MENUITEM)
- MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "SeparatorNews2", "FolderViewPopup/---", GTK_UI_MANAGER_SEPARATOR)
- MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "CheckNewMessages", "FolderViewPopup/CheckNewMessages", GTK_UI_MANAGER_MENUITEM)
- MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "SeparatorNews3", "FolderViewPopup/---", GTK_UI_MANAGER_SEPARATOR)
-}
-
-static void set_sensitivity(GtkUIManager *ui_manager, FolderItem *item)
-{
- MainWindow *mainwin = mainwindow_get_mainwindow();
-
-#define SET_SENS(name, sens) \
- cm_menu_set_sensitive_full(ui_manager, "Popup/"name, sens)
-
- SET_SENS("FolderViewPopup/Subscribe",
- folder_item_parent(item) == NULL
- && mainwin->lock_count == 0
- && news_folder_locked(item->folder) == 0);
- SET_SENS("FolderViewPopup/Unsubscribe",
- folder_item_parent(item) != NULL
- && mainwin->lock_count == 0
- && news_folder_locked(item->folder) == 0);
- SET_SENS("FolderViewPopup/CheckNewMessages",
- folder_item_parent(item) == NULL
- && mainwin->lock_count == 0
- && news_folder_locked(item->folder) == 0);
- SET_SENS("FolderViewPopup/Synchronise",
- item ? (folder_item_parent(item) != NULL
- && folder_want_synchronise(item->folder))
- : FALSE);
- SET_SENS("FolderViewPopup/DownloadMessages",
- item ? (folder_item_parent(item) != NULL
- && !item->no_select)
- : FALSE);
- SET_SENS("FolderViewPopup/RenameFolder",
- folder_item_parent(item) != NULL
- && mainwin->lock_count == 0
- && news_folder_locked(item->folder) == 0);
-#undef SET_SENS
-}
-
-static FolderItem *news_find_child_item(FolderItem *item, const gchar *path)
-{
- GNode *node;
- FolderItem *child;
-
- for (node = item->node->children; node != NULL; node = node->next) {
- child = FOLDER_ITEM(node->data);
- if (g_strcmp0(child->path, path) == 0) {
- return child;
- }
- }
-
- return NULL;
-}
-
-static void subscribe_newsgroup_cb(GtkAction *action, gpointer data)
-{
- FolderView *folderview = (FolderView *)data;
- Folder *folder;
- FolderItem *item;
- FolderItem *rootitem;
- FolderItem *newitem;
- GSList *new_subscr;
- GSList *cur;
- GNode *gnode;
- MainWindow *mainwin = mainwindow_get_mainwindow();
-
- if ((item = folderview_get_selected_item(folderview)) == NULL) return;
-
- if (mainwin->lock_count || news_folder_locked(item->folder))
- return;
-
- folder = item->folder;
- cm_return_if_fail(folder != NULL);
- cm_return_if_fail(FOLDER_TYPE(folder) == F_NEWS);
- cm_return_if_fail(folder->account != NULL);
-
- if ((rootitem = folder_item_parent(item)) == NULL)
- rootitem = item;
-
- new_subscr = grouplist_dialog(folder);
-
- /* remove unsubscribed newsgroups */
- for (gnode = folder->node->children; gnode != NULL; ) {
- GNode *next = gnode->next;
-
- item = FOLDER_ITEM(gnode->data);
- if (g_slist_find_custom(new_subscr, item->path,
- (GCompareFunc)g_ascii_strcasecmp) != NULL) {
- gnode = next;
- continue;
- }
-
- if (folderview_get_opened_item(folderview) == item) {
- summary_clear_all(folderview->summaryview);
- folderview_close_opened(folderview, TRUE);
- }
-
- folderview_remove_item(folderview, item);
- folder_item_remove(item);
-
- gnode = next;
- }
-
- folderview_freeze(folderview);
-
- /* add subscribed newsgroups */
- for (cur = new_subscr; cur != NULL; cur = cur->next) {
- gchar *name = (gchar *)cur->data;
- FolderUpdateData hookdata;
-
- if (news_find_child_item(rootitem, name) != NULL)
- continue;
-
- newitem = folder_item_new(folder, name, name);
- folder_item_append(rootitem, newitem);
-
- hookdata.folder = newitem->folder;
- hookdata.update_flags = FOLDER_TREE_CHANGED | FOLDER_ADD_FOLDERITEM;
- hookdata.item = newitem;
- hookdata.item2 = NULL;
- hooks_invoke(FOLDER_UPDATE_HOOKLIST, &hookdata);
- }
-
- folderview_thaw(folderview);
-
- slist_free_strings_full(new_subscr);
-
- folder_write_list();
-}
-
-static void unsubscribe_newsgroup_cb(GtkAction *action, gpointer data)
-{
- FolderView *folderview = (FolderView *)data;
- FolderItem *item;
- gchar *name;
- gchar *message;
- gchar *old_id;
- AlertValue avalue;
- MainWindow *mainwin = mainwindow_get_mainwindow();
-
- if (!folderview->selected) return;
-
- item = folderview_get_selected_item(folderview);
- cm_return_if_fail(item != NULL);
-
- if (mainwin->lock_count || news_folder_locked(item->folder))
- return;
-
- cm_return_if_fail(item->folder != NULL);
- cm_return_if_fail(FOLDER_TYPE(item->folder) == F_NEWS);
- cm_return_if_fail(item->folder->account != NULL);
-
- old_id = folder_item_get_identifier(item);
-
- name = trim_string(item->path, 32);
- message = g_strdup_printf(_("Really unsubscribe newsgroup '%s'?"), name);
- avalue = alertpanel_full(_("Unsubscribe newsgroup"), message,
- NULL, _("_Cancel"), NULL, _("_Unsubscribe"), NULL, NULL,
- ALERTFOCUS_FIRST, FALSE, NULL, ALERT_WARNING);
- g_free(message);
- if (avalue != G_ALERTALTERNATE) {
- g_free(old_id);
- g_free(name);
- return;
- }
-
- if (item == folderview_get_opened_item(folderview)) {
- summary_clear_all(folderview->summaryview);
- folderview_close_opened(folderview, TRUE);
- }
-
- if(item->folder->klass->remove_folder(item->folder, item) < 0) {
- folder_item_scan(item);
- alertpanel_error(_("Can't remove the folder '%s'."), name);
- g_free(old_id);
- g_free(name);
- return;
- }
- g_free(name);
-
- folder_write_list();
-
- prefs_filtering_delete_path(old_id);
- g_free(old_id);
-}
-
-static void rename_newsgroup_cb(GtkAction *action, gpointer data)
-{
- FolderView *folderview = (FolderView *)data;
- FolderItem *item;
- gchar *new_folder;
- gchar *name;
- gchar *message;
-
- item = folderview_get_selected_item(folderview);
- cm_return_if_fail(item != NULL);
- cm_return_if_fail(item->path != NULL);
- cm_return_if_fail(item->folder != NULL);
-
- name = trim_string(item->name, 32);
- message = g_strdup_printf(_("Input new name for '%s':"), name);
- new_folder = input_dialog(_("Rename newsgroup folder"), message, item->name);
- g_free(message);
- g_free(name);
-
- if (!new_folder) return;
- AUTORELEASE_STR(new_folder, {g_free(new_folder); return;});
-
- if (strchr(new_folder, G_DIR_SEPARATOR) != NULL) {
- alertpanel_error(_("'%c' can't be included in folder name."),
- G_DIR_SEPARATOR);
- return;
- }
-
- if (folder_find_child_item_by_name(folder_item_parent(item), new_folder)) {
- name = trim_string(new_folder, 32);
- alertpanel_error(_("The folder '%s' already exists."), name);
- g_free(name);
- return;
- }
-
- if (folder_item_rename(item, new_folder) < 0) {
- alertpanel_error(_("The folder could not be renamed.\n"
- "The new folder name is not allowed."));
- return;
- }
-
- folder_write_list();
-}
-
-static void update_tree_cb(GtkAction *action, gpointer data)
-{
- FolderView *folderview = (FolderView *)data;
- FolderItem *item;
- MainWindow *mainwin = mainwindow_get_mainwindow();
-
- item = folderview_get_selected_item(folderview);
- cm_return_if_fail(item != NULL);
-
- if (mainwin->lock_count || news_folder_locked(item->folder))
- return;
-
- summary_show(folderview->summaryview, NULL, FALSE);
-
- cm_return_if_fail(item->folder != NULL);
-
- folderview_check_new(item->folder);
-}
-
-static void sync_cb(GtkAction *action, gpointer data)
-{
- FolderView *folderview = (FolderView *)data;
- FolderItem *item;
-
- item = folderview_get_selected_item(folderview);
- cm_return_if_fail(item != NULL);
- folder_synchronise(item->folder);
-}
-
-void news_gtk_synchronise(FolderItem *item, gint days)
-{
- MainWindow *mainwin = mainwindow_get_mainwindow();
- FolderView *folderview = mainwin->folderview;
- GSList *mlist;
- GSList *cur;
- gint num = 0;
- gint total = 0;
- time_t t = time(NULL);
-
- cm_return_if_fail(item != NULL);
- cm_return_if_fail(item->folder != NULL);
-
- if (mainwin->lock_count || news_folder_locked(item->folder))
- return;
-
- total = item->total_msgs;
-
- main_window_cursor_wait(mainwin);
- inc_lock();
- main_window_lock(mainwin);
- gtk_widget_set_sensitive(folderview->ctree, FALSE);
- main_window_progress_on(mainwin);
- GTK_EVENTS_FLUSH();
-
- mlist = folder_item_get_msg_list(item);
- for (cur = mlist; cur != NULL; cur = cur->next) {
- MsgInfo *msginfo = (MsgInfo *)cur->data;
- gint age = (t - msginfo->date_t) / (60*60*24);
- if (days == 0 || age <= days)
- folder_item_fetch_msg_full(msginfo->folder, msginfo->msgnum, TRUE, TRUE);
- statusbar_progress_all(num++,total, 100);
- if (num % 100 == 0)
- GTK_EVENTS_FLUSH();
- }
-
- statusbar_progress_all(0,0,0);
- procmsg_msg_list_free(mlist);
- folder_set_ui_func(item->folder, NULL, NULL);
- main_window_progress_off(mainwin);
- gtk_widget_set_sensitive(folderview->ctree, TRUE);
- main_window_unlock(mainwin);
- inc_unlock();
- main_window_cursor_normal(mainwin);
-}
-
-static void download_cb(GtkAction *action, gpointer data)
-{
- FolderView *folderview = (FolderView *)data;
- FolderItem *item;
-
- if (!folderview->selected) return;
-
- item = folderview_get_selected_item(folderview);
- news_gtk_synchronise(item, 0);
-}
diff --git a/src/news_gtk.h b/src/news_gtk.h
@@ -1,31 +0,0 @@
-/*
- * Claws Mail -- a GTK based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2012 Hiroyuki Yamamoto & 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 NEWS_GTK_H
-#define NEWS_GTK_H
-
-#ifdef HAVE_CONFIG_H
-#include "claws-features.h"
-#endif
-
-#include "folder.h"
-
-void news_gtk_init(void);
-void news_gtk_synchronise(FolderItem *item, gint days);
-#endif /* NEWS_GTK_H */