add an easy way to open any folder on start-up
authorPaul <paul@claws-mail.org>
Mon, 2 Jan 2023 17:27:07 +0000 (17:27 +0000)
committerPaul <paul@claws-mail.org>
Mon, 2 Jan 2023 17:27:07 +0000 (17:27 +0000)
src/folderview.c
src/main.c
src/prefs_common.c
src/prefs_common.h
src/prefs_summaries.c

index 8c9cb63d742f5bd66903db5954b74dd65eaa0ed7..73425b348e18b0b42f000dd733fff40fa1e71652 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Claws Mail -- a GTK based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2022 the Claws Mail team and Hiroyuki Yamamoto
+ * Copyright (C) 1999-2023 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
@@ -189,6 +189,8 @@ static void folderview_search_cb    (GtkAction      *action,
                                         gpointer        data);
 static void folderview_run_processing_cb(GtkAction     *action,
                                         gpointer        data);
+static void folderview_startup_folder_cb(GtkAction     *action,
+                                        gpointer        data);
 
 static void folderview_property_cb     (GtkAction      *action,
                                         gpointer        data);
@@ -252,6 +254,7 @@ static GtkActionEntry folderview_common_popup_entries[] =
        {"FolderViewPopup/---",              NULL, "---", NULL, NULL , NULL},
        {"FolderViewPopup/RunProcessing",    NULL, N_("R_un processing rules"), NULL, NULL, G_CALLBACK(folderview_run_processing_cb) },
        {"FolderViewPopup/SearchFolder",     NULL, N_("_Search folder..."), NULL, NULL, G_CALLBACK(folderview_search_cb) },
+       {"FolderViewPopup/OpenFolder",       NULL, N_("Open on start-up"), NULL, NULL, G_CALLBACK(folderview_startup_folder_cb) },
        {"FolderViewPopup/Properties",       NULL, N_("_Properties..."), NULL, NULL, G_CALLBACK(folderview_property_cb) },
        {"FolderViewPopup/Processing",       NULL, N_("Process_ing..."), NULL, NULL, G_CALLBACK(folderview_processing_cb) },
        {"FolderViewPopup/EmptyTrash",       NULL, N_("Empty _trash..."), NULL, NULL, G_CALLBACK(folderview_empty_trash_cb) },
@@ -1956,6 +1959,7 @@ static void folderview_set_sens_and_popup_menu(FolderView *folderview, gint row,
        MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "Separator1", "FolderViewPopup/---", GTK_UI_MANAGER_SEPARATOR)
        MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "RunProcessing", "FolderViewPopup/RunProcessing", GTK_UI_MANAGER_MENUITEM)
        MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "SearchFolder", "FolderViewPopup/SearchFolder", GTK_UI_MANAGER_MENUITEM)
+       MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "OpenFolder", "FolderViewPopup/OpenFolder", GTK_UI_MANAGER_MENUITEM)
        MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "Properties", "FolderViewPopup/Properties", GTK_UI_MANAGER_MENUITEM)
        MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "Processing", "FolderViewPopup/Processing", GTK_UI_MANAGER_MENUITEM)
 
@@ -2574,6 +2578,20 @@ static void folderview_search_cb(GtkAction *action, gpointer data)
        summary_search(folderview->summaryview);
 }
 
+static void folderview_startup_folder_cb(GtkAction *action, gpointer data)
+{
+       FolderView *folderview = (FolderView *)data;
+       FolderItem *item;
+
+       if (!folderview->selected) return;
+
+       item = folderview_get_selected_item(folderview);
+
+       prefs_common.goto_last_folder_on_startup = FALSE;
+       prefs_common.goto_folder_on_startup = TRUE;
+       prefs_common.startup_folder = folder_item_get_identifier(item);
+}
+
 static void folderview_run_processing_cb(GtkAction *action, gpointer data)
 {
        FolderView *folderview = (FolderView *)data;
index 932da3ae022e3845329caabed0a6e09e4578f2e4..e0205c4b5c2f9940c4bf2d012c11f6c493a33417 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Claws Mail -- a GTK based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2022 the Claws Mail team and Hiroyuki Yamamoto
+ * Copyright (C) 1999-2023 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
@@ -1605,7 +1605,11 @@ int main(int argc, char *argv[])
        folderview_thaw(mainwin->folderview);
        main_window_cursor_normal(mainwin);
 
-       if (!cmd.target && prefs_common.goto_last_folder_on_startup &&
+       if (!cmd.target && prefs_common.goto_folder_on_startup &&
+           folder_find_item_from_identifier(prefs_common.startup_folder) != NULL &&
+           !claws_crashed()) {
+               cmd.target = prefs_common.startup_folder;
+       } else if (!cmd.target && prefs_common.goto_last_folder_on_startup &&
            folder_find_item_from_identifier(prefs_common.last_opened_folder) != NULL &&
            !claws_crashed()) {
                cmd.target = prefs_common.last_opened_folder;
index 02eb41c0abfe805534aa2dff260ff00db19956d4..4de16db40f23f0deafcd25a11f29562216aa682d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Claws Mail -- a GTK based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2022 the Claws Mail team and Hiroyuki Yamamoto
+ * Copyright (C) 1999-2023 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
@@ -1212,6 +1212,10 @@ static PrefParam param[] = {
        P_STRING, NULL, NULL, NULL },
        {"goto_last_folder_on_startup", "FALSE", &prefs_common.goto_last_folder_on_startup,
        P_BOOL, NULL, NULL, NULL },
+       {"startup_folder", "", &prefs_common.startup_folder,
+       P_STRING, NULL, NULL, NULL },
+       {"goto_folder_on_startup", "FALSE", &prefs_common.goto_folder_on_startup,
+       P_BOOL, NULL, NULL, NULL },
        {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
         NULL, NULL, NULL},
        {"summary_quicksearch_dynamic", "0", &prefs_common.summary_quicksearch_dynamic, P_INT,
index 0d5220f02c76d84b18937859773d5bb7663735e8..30e15c424a7654e25c4481591314a7d69c4f47ce 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Claws Mail -- a GTK based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2022 the Claws Mail team and Hiroyuki Yamamoto
+ * Copyright (C) 1999-2023 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
@@ -277,6 +277,8 @@ struct _PrefsCommon
 
        gchar *last_opened_folder;
        gboolean goto_last_folder_on_startup;
+       gchar *startup_folder;
+       gboolean goto_folder_on_startup;
 
        ToolbarStyle toolbar_style;
        gboolean show_statusbar;
index 4939830a53ab4d73372ddba10953255e0b8e9e2f..eb75163c8a4ef105b44c1078f610c4a46fbe57bb 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Claws Mail -- a GTK based, lightweight, and fast e-mail client
- * Copyright (C) 2005-2022 Colin Leroy and The Claws Mail Team
+ * Copyright (C) 2005-2023 the Claws Mail Team and Colin Leroy
  *
  * 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
@@ -31,6 +31,7 @@
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
 
+#include "foldersel.h"
 #include "prefs_common.h"
 #include "prefs_gtk.h"
 #include "prefs_summary_open.h"
@@ -59,6 +60,9 @@ typedef struct _SummariesPage
        GtkWidget *entry_datefmt;
 
        GtkWidget *checkbtn_reopen_last_folder;
+       GtkWidget *checkbtn_startup_folder;
+       GtkWidget *startup_folder_entry;
+       GtkWidget *startup_folder_select;
        GtkWidget *checkbtn_always_show_msg;
        GtkWidget *checkbtn_show_on_folder_open;
        GtkWidget *checkbtn_show_on_search_results;
@@ -111,6 +115,41 @@ static void mark_as_read_toggled           (GtkToggleButton *button,
 static void always_show_msg_toggled            (GtkToggleButton *button,
                                                 gpointer user_data);
 
+static void reopen_last_folder_toggled(GtkToggleButton *toggle_btn, GtkWidget *widget)
+{
+       gboolean is_active;
+
+       is_active = gtk_toggle_button_get_active(toggle_btn);
+       gtk_widget_set_sensitive(widget, !is_active);
+       if (is_active)
+               prefs_common.goto_folder_on_startup = FALSE;
+}
+
+static void startup_folder_toggled(GtkToggleButton *toggle_btn, GtkWidget *widget)
+{
+       gboolean is_active;
+
+       is_active = gtk_toggle_button_get_active(toggle_btn);
+       gtk_widget_set_sensitive(widget, !is_active);
+       if (is_active)
+               prefs_common.goto_last_folder_on_startup = FALSE;
+}
+
+static void foldersel_cb(GtkWidget *widget, gpointer data)
+{
+       GtkWidget *entry = (GtkWidget *) data;
+       FolderItem *item;
+       gchar *item_id;
+       gint newpos = 0;
+       
+       item = foldersel_folder_sel(NULL, FOLDER_SEL_ALL, NULL, FALSE, NULL);
+       if (item && (item_id = folder_item_get_identifier(item)) != NULL) {
+               gtk_editable_delete_text(GTK_EDITABLE(entry), 0, -1);
+               gtk_editable_insert_text(GTK_EDITABLE(entry), item_id, strlen(item_id), &newpos);
+               g_free(item_id);
+       }
+}
+
 static GtkWidget *date_format_create(GtkButton *button, void *data)
 {
        static GtkWidget *datefmt_win = NULL;
@@ -339,6 +378,9 @@ static void prefs_summaries_create_widget(PrefsPage *_page, GtkWindow *window,
        GtkWidget *entry_datefmt;
        GtkWidget *button_dispitem;
        GtkWidget *checkbtn_reopen_last_folder;
+       GtkWidget *checkbtn_startup_folder;
+       GtkWidget *startup_folder_entry;
+       GtkWidget *startup_folder_select;
        GtkWidget *checkbtn_always_show_msg;
        GtkWidget *checkbtn_show_on_folder_open;
        GtkWidget *checkbtn_show_on_search_results;
@@ -414,6 +456,31 @@ static void prefs_summaries_create_widget(PrefsPage *_page, GtkWindow *window,
                (vbox1, checkbtn_reopen_last_folder,
                 _("Open last opened folder at start-up"));
 
+       hbox0 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
+       gtk_widget_show(hbox0);
+       gtk_box_pack_start(GTK_BOX(vbox1), hbox0, FALSE, FALSE, 0);
+
+       PACK_CHECK_BUTTON
+               (hbox0, checkbtn_startup_folder,
+                _("Open selected folder at start-up"));
+
+       startup_folder_entry = gtk_entry_new();
+       gtk_widget_show(startup_folder_entry);
+       gtk_box_pack_start(GTK_BOX(hbox0), startup_folder_entry, TRUE, TRUE, 0);
+       startup_folder_select = gtkut_get_browse_directory_btn(_("_Browse"));
+       gtk_widget_show(startup_folder_select);
+       gtk_box_pack_start(GTK_BOX(hbox0), startup_folder_select, FALSE, FALSE, 0);
+
+       SET_TOGGLE_SENSITIVITY(checkbtn_startup_folder, startup_folder_entry)
+       SET_TOGGLE_SENSITIVITY(checkbtn_startup_folder, startup_folder_select)
+
+       g_signal_connect(G_OBJECT(checkbtn_reopen_last_folder), "toggled",
+                        G_CALLBACK(reopen_last_folder_toggled), checkbtn_startup_folder);
+       g_signal_connect(G_OBJECT(checkbtn_startup_folder), "toggled",
+                        G_CALLBACK(startup_folder_toggled), checkbtn_reopen_last_folder);
+       g_signal_connect(G_OBJECT(startup_folder_select), "clicked",
+                        G_CALLBACK(foldersel_cb), startup_folder_entry);
+
        PACK_CHECK_BUTTON
                (vbox1, checkbtn_run_processingrules_mark_all_read,
                 _("Run processing rules before marking all messages in a folder as read or unread"));
@@ -681,6 +748,8 @@ static void prefs_summaries_create_widget(PrefsPage *_page, GtkWindow *window,
        prefs_summaries->checkbtn_threadsubj = checkbtn_threadsubj;
        prefs_summaries->entry_datefmt = entry_datefmt;
        prefs_summaries->checkbtn_reopen_last_folder = checkbtn_reopen_last_folder;
+       prefs_summaries->checkbtn_startup_folder = checkbtn_startup_folder;
+       prefs_summaries->startup_folder_entry = startup_folder_entry;
 
        prefs_summaries->checkbtn_always_show_msg = checkbtn_always_show_msg;
        prefs_summaries->checkbtn_show_on_folder_open = checkbtn_show_on_folder_open;
@@ -731,6 +800,10 @@ static void prefs_summaries_create_widget(PrefsPage *_page, GtkWindow *window,
                        prefs_common.date_format?prefs_common.date_format:"");  
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_reopen_last_folder),
                        prefs_common.goto_last_folder_on_startup);
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_startup_folder),
+                       prefs_common.goto_folder_on_startup);
+       gtk_entry_set_text(GTK_ENTRY(startup_folder_entry),
+                          prefs_common.startup_folder?prefs_common.startup_folder:"");
 
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_always_show_msg),
                        prefs_common.always_show_msg);
@@ -809,6 +882,10 @@ static void prefs_summaries_save(PrefsPage *_page)
 
        prefs_common.goto_last_folder_on_startup = gtk_toggle_button_get_active(
                GTK_TOGGLE_BUTTON(page->checkbtn_reopen_last_folder));
+       prefs_common.goto_folder_on_startup = gtk_toggle_button_get_active(
+               GTK_TOGGLE_BUTTON(page->checkbtn_startup_folder));
+       prefs_common.startup_folder = gtk_editable_get_chars(
+                       GTK_EDITABLE(page->startup_folder_entry), 0, -1);
 
        prefs_common.always_show_msg = gtk_toggle_button_get_active(
                GTK_TOGGLE_BUTTON(page->checkbtn_always_show_msg));