fix bug 4239, 'Preferences: Text Options Header Display modal is not modal' (sic)
[claws.git] / src / prefs_actions.c
index 0aaa35137e1f2650904293cc033636c6ab6f64cb..4b07b7e9e6ba4b988228aa55ae32d6a7c14bd7c2 100644 (file)
@@ -51,6 +51,7 @@
 #include "prefs_filtering_action.h"
 #include "matcher_parser.h"
 #include "prefs_toolbar.h"
+#include "file-utils.h"
 
 enum {
        PREFS_ACTIONS_STRING,   /*!< string pointer managed by list store, 
@@ -207,6 +208,7 @@ static void prefs_actions_create(MainWindow *mainwin)
        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);
 
        vbox = gtk_vbox_new(FALSE, 6);
        gtk_widget_show(vbox);
@@ -334,7 +336,7 @@ static void prefs_actions_create(MainWindow *mainwin)
        CLAWS_SET_TIP(subst_btn,
                        _("Replace the selected action in list with the action above"));
 
-       del_btn = gtk_button_new_with_mnemonic (_("Re_move"));
+       del_btn = gtk_button_new_with_mnemonic (_("D_elete"));
        gtk_button_set_image(GTK_BUTTON(del_btn),
                        gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_BUTTON));
        gtk_widget_show(del_btn);
@@ -443,8 +445,8 @@ void prefs_actions_read_config(void)
        debug_print("Reading actions configurations...\n");
 
        rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, ACTIONS_RC, NULL);
-       if ((fp = g_fopen(rcpath, "rb")) == NULL) {
-               if (ENOENT != errno) FILE_OP_ERROR(rcpath, "fopen");
+       if ((fp = claws_fopen(rcpath, "rb")) == NULL) {
+               if (ENOENT != errno) FILE_OP_ERROR(rcpath, "claws_fopen");
                g_free(rcpath);
                return;
        }
@@ -457,7 +459,7 @@ void prefs_actions_read_config(void)
                g_free(act);
        }
 
-       while (fgets(buf, sizeof(buf), fp) != NULL) {
+       while (claws_fgets(buf, sizeof(buf), fp) != NULL) {
                const gchar *src_codeset = conv_get_locale_charset_str();
                const gchar *dest_codeset = CS_UTF_8;
                gchar *tmp;
@@ -478,7 +480,7 @@ void prefs_actions_read_config(void)
                else
                        g_free(tmp);
        }
-       fclose(fp);
+       claws_fclose(fp);
 }
 
 void prefs_actions_write_config(void)
@@ -508,9 +510,9 @@ void prefs_actions_write_config(void)
                        act = g_strdup(act);
                }
 
-               if (fputs(act, pfile->fp) == EOF ||
-                   fputc('\n', pfile->fp) == EOF) {
-                       FILE_OP_ERROR(rcpath, "fputs || fputc");
+               if (claws_fputs(act, pfile->fp) == EOF ||
+                   claws_fputc('\n', pfile->fp) == EOF) {
+                       FILE_OP_ERROR(rcpath, "claws_fputs || claws_fputc");
                        prefs_file_close_revert(pfile);
                        g_free(act);
                        g_free(rcpath);
@@ -591,7 +593,7 @@ static void prefs_actions_set_list(void)
 static gint prefs_actions_clist_set_row(gint row)
 {
        const gchar *entry_text;
-       gint len, action_nb;
+       gint len;
        gchar action[PREFSBUFSIZE];
        gchar *new_action;
 
@@ -611,12 +613,6 @@ static gint prefs_actions_clist_set_row(gint row)
                return -1;
        }
 
-       action_nb = prefs_actions_find_by_name(entry_text);
-       if ((action_nb != -1) && ((row == -1) || (row != action_nb + 1))) {
-               alertpanel_error(_("There is an action with this name already."));
-               return -1;
-       }
-       
        strncpy(action, entry_text, PREFSBUFSIZE - 1);
 
        while (strstr(action, "//")) {
@@ -712,7 +708,7 @@ static void prefs_actions_delete_cb(gpointer gtk_action, gpointer data)
 
        if (alertpanel(_("Delete action"),
                       _("Do you really want to delete this action?"),
-                      GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL) != G_ALERTALTERNATE)
+                      GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL, ALERTFOCUS_FIRST) != G_ALERTALTERNATE)
                return;
 
        /* XXX: Here's the reason why we need to store the original 
@@ -733,7 +729,7 @@ static void prefs_actions_delete_all_cb(gpointer gtk_action, gpointer data)
 
        if (alertpanel(_("Delete all actions"),
                          _("Do you really want to delete all the actions?"),
-                         GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL) != G_ALERTDEFAULT)
+                         GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL, ALERTFOCUS_FIRST) != G_ALERTDEFAULT)
           return;
 
        list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(actions.actions_list_view)));
@@ -897,13 +893,13 @@ static void prefs_actions_cancel(GtkWidget *w, gpointer data)
 
        if (modified && alertpanel(_("Entry not saved"),
                                 _("The entry was not saved. Close anyway?"),
-                                GTK_STOCK_CLOSE, _("+_Continue editing"),
-                                NULL) != G_ALERTDEFAULT) {
+                                GTK_STOCK_CLOSE, _("_Continue editing"), NULL,
+                                ALERTFOCUS_SECOND) != G_ALERTDEFAULT) {
                return;
        } else if (modified_list && alertpanel(_("Actions list not saved"),
                                 _("The actions list has been modified. Close anyway?"),
-                                GTK_STOCK_CLOSE, _("+_Continue editing"), 
-                                NULL) != G_ALERTDEFAULT) {
+                                GTK_STOCK_CLOSE, _("_Continue editing"), NULL,
+                                ALERTFOCUS_SECOND) != G_ALERTDEFAULT) {
                return;
        }
        modified = FALSE;
@@ -928,8 +924,8 @@ static void prefs_actions_ok(GtkWidget *widget, gpointer data)
 
        if (modified && alertpanel(_("Entry not saved"),
                                 _("The entry was not saved. Close anyway?"),
-                                GTK_STOCK_CLOSE, _("+_Continue editing"),
-                                NULL) != G_ALERTDEFAULT) {
+                                GTK_STOCK_CLOSE, _("_Continue editing"),
+                                NULL, ALERTFOCUS_SECOND) != G_ALERTDEFAULT) {
                return;
        } 
        modified = FALSE;
@@ -1086,7 +1082,7 @@ static GtkWidget *prefs_actions_popup_menu = NULL;
 
 static GtkActionEntry prefs_actions_popup_entries[] =
 {
-       {"PrefsActionsPopup",                   NULL, "PrefsActionsPopup" },
+       {"PrefsActionsPopup",                   NULL, "PrefsActionsPopup", NULL, NULL, NULL },
        {"PrefsActionsPopup/Delete",            NULL, N_("_Delete"), NULL, NULL, G_CALLBACK(prefs_actions_delete_cb) },
        {"PrefsActionsPopup/DeleteAll", NULL, N_("Delete _all"), NULL, NULL, G_CALLBACK(prefs_actions_delete_all_cb) },
        {"PrefsActionsPopup/Duplicate", NULL, N_("D_uplicate"), NULL, NULL, G_CALLBACK(prefs_actions_duplicate_cb) },
@@ -1299,7 +1295,7 @@ static void prefs_action_filterbtn_cb(GtkWidget *widget, gpointer data)
        if(modified && alertpanel(_("Entry was modified"),
                        _("Opening the filter action dialog will clear current modifications "
                        "of the command line."),
-                       GTK_STOCK_CANCEL, _("+_Continue editing"), NULL) != G_ALERTDEFAULT)
+                       GTK_STOCK_CANCEL, _("_Continue editing"), NULL, ALERTFOCUS_SECOND) != G_ALERTDEFAULT)
                return;
 */
        action_str = gtk_editable_get_chars(GTK_EDITABLE(actions.cmd_entry), 0, -1);
@@ -1368,6 +1364,7 @@ void prefs_actions_rename_path(const gchar *old_path, const gchar *new_path)
 
                g_strfreev(tokens);
        }
+       prefs_actions_write_config();
 }
 
 gint prefs_actions_find_by_name(const gchar *name)