fix bug 4239, 'Preferences: Text Options Header Display modal is not modal' (sic)
[claws.git] / src / prefs_display_header.c
index 46027331acb1fe2e651350bf7ade53d4b8a05b7d..f179d0ddc04681c169e289755274e5b16304a3c9 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2009 Hiroyuki Yamamoto and the Claws Mail team
+ * 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
@@ -19,6 +19,7 @@
 
 #ifdef HAVE_CONFIG_H
 #  include "config.h"
+#include "claws-features.h"
 #endif
 
 #include "defs.h"
@@ -40,6 +41,7 @@
 #include "displayheader.h"
 #include "utils.h"
 #include "gtkutils.h"
+#include "file-utils.h"
 
 enum {
        PREFS_HDR_HEADER,
@@ -93,20 +95,12 @@ static void prefs_display_header_insert_header              (GtkListStore *store,
 static GtkWidget *prefs_display_header_list_view_create        (const gchar *name);
 static void prefs_filtering_create_list_view_columns   (GtkWidget *list_view, 
                                                         const gchar *name);
-static void headers_list_model_row_changed             (GtkTreeModel *model, 
-                                                        GtkTreePath *path, 
-                                                        GtkTreeIter *iter, 
-                                                        GtkTreeView *list_view);
 static void headers_list_model_rows_reordered          (GtkTreeModel *model,
                                                         GtkTreePath  *path, 
                                                         GtkTreeIter  *iter,
                                                         gpointer      arg,
                                                         GtkTreeView  *list_view);
                                                         
-static void drag_begin (GtkTreeView *list_view,
-                        GdkDragContext *context,
-                        gpointer data);
-
 static void drag_end   (GtkTreeView *list_view,
                         GdkDragContext *context,
                         gpointer data);
@@ -117,6 +111,7 @@ static gchar *defaults[] =
        "From",
        "To",
        "Cc",
+       "Bcc",
        "Subject",
        "Date", 
        "Reply-To",
@@ -131,7 +126,7 @@ static gchar *defaults[] =
        "-Message-ID",
        "-In-Reply-To",
        "-References",
-       "-Mime-Version",
+       "-MIME-Version",
        "-Content-Type",
        "-Content-Transfer-Encoding",
        "-X-UIDL",
@@ -146,6 +141,7 @@ static gchar *defaults[] =
        "From",
        "To",
        "Cc",
+       "Bcc",
        "Subject",
        "Date", 
        "Newsgroups",
@@ -160,7 +156,7 @@ static gchar *defaults[] =
        "-Message-ID",
        "-In-Reply-To",
        "-References",
-       "-Mime-Version",
+       "-MIME-Version",
        "-Content-Type",
        "-Content-Transfer-Encoding",
        "-X-UIDL",
@@ -197,6 +193,7 @@ void prefs_display_header_open(void)
        prefs_display_header_set_dialog();
 
        gtk_widget_show(dispheader.window);
+       gtk_window_set_modal(GTK_WINDOW(dispheader.window), TRUE);
 }
 
 static void prefs_display_header_create(void)
@@ -235,8 +232,8 @@ static void prefs_display_header_create(void)
        window = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "prefs_display_header");
        gtk_container_set_border_width (GTK_CONTAINER (window), 8);
        gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
-       gtk_window_set_modal (GTK_WINDOW (window), TRUE);
        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);
@@ -282,9 +279,9 @@ static void prefs_display_header_create(void)
        gtk_widget_show (hdr_label);
        gtk_box_pack_start (GTK_BOX (hbox1), hdr_label, FALSE, FALSE, 0);
 
-       hdr_combo = gtk_combo_box_entry_new_text();
+       hdr_combo = gtk_combo_box_text_new_with_entry();
        for(i=0; i < 9 ; i++)
-               gtk_combo_box_append_text(GTK_COMBO_BOX (hdr_combo),
+               gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT (hdr_combo),
                        (*defaults[i] == '-') ? defaults[i]+1 : defaults[i]);
        gtk_combo_box_set_active(GTK_COMBO_BOX(hdr_combo), 0);
        gtk_widget_show (hdr_combo);
@@ -295,6 +292,47 @@ static void prefs_display_header_create(void)
        gtk_widget_show (list_view_hbox);
        gtk_box_pack_start (GTK_BOX (vbox1), list_view_hbox, TRUE, TRUE, 0);
 
+       /* hidden headers list */
+
+       list_view_hbox2 = gtk_hbox_new (FALSE, 8);
+       gtk_widget_show (list_view_hbox2);
+       gtk_box_pack_start (GTK_BOX (list_view_hbox), list_view_hbox2, TRUE, TRUE, 0);
+
+       list_view_scrolledwin = gtk_scrolled_window_new (NULL, NULL);
+       gtk_widget_set_size_request (list_view_scrolledwin, 200, 210);
+       gtk_widget_show (list_view_scrolledwin);
+       gtk_box_pack_start (GTK_BOX (list_view_hbox2), list_view_scrolledwin,
+                           TRUE, TRUE, 0);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (list_view_scrolledwin),
+                                       GTK_POLICY_AUTOMATIC,
+                                       GTK_POLICY_AUTOMATIC);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(list_view_scrolledwin),
+                                           GTK_SHADOW_IN);
+
+       hidden_headers_list_view = prefs_display_header_list_view_create
+                                       (_("Hidden headers"));
+       gtk_widget_show (hidden_headers_list_view);
+       gtk_container_add (GTK_CONTAINER (list_view_scrolledwin),
+                          hidden_headers_list_view);
+
+       btn_vbox = gtk_vbox_new (FALSE, 8);
+       gtk_widget_show (btn_vbox);
+       gtk_box_pack_start (GTK_BOX (list_view_hbox2), btn_vbox, FALSE, FALSE, 0);
+
+       reg_btn = gtk_button_new_from_stock (GTK_STOCK_ADD);
+       gtk_widget_show (reg_btn);
+       gtk_box_pack_start (GTK_BOX (btn_vbox), reg_btn, FALSE, TRUE, 0);
+       g_signal_connect (G_OBJECT (reg_btn), "clicked",
+                           G_CALLBACK
+                           (prefs_display_header_register_cb),
+                           GINT_TO_POINTER(TRUE));
+       del_btn = gtk_button_new_from_stock (GTK_STOCK_DELETE);
+       gtk_widget_show (del_btn);
+       gtk_box_pack_start (GTK_BOX (btn_vbox), del_btn, FALSE, TRUE, 0);
+       g_signal_connect (G_OBJECT       (del_btn), "clicked",
+                           G_CALLBACK (prefs_display_header_delete_cb),
+                           hidden_headers_list_view);
+
        /* display headers list */
 
        list_view_hbox1 = gtk_hbox_new (FALSE, 8);
@@ -318,10 +356,6 @@ static void prefs_display_header_create(void)
        gtk_container_add(GTK_CONTAINER(list_view_scrolledwin), headers_list_view);
        gtk_tree_view_set_reorderable(GTK_TREE_VIEW(headers_list_view), TRUE);
 
-       g_signal_connect(G_OBJECT(headers_list_view), "drag_begin",                      
-                        G_CALLBACK(drag_begin),
-                        headers_list_view);
-                        
        g_signal_connect(G_OBJECT(headers_list_view), "drag_end",                        
                         G_CALLBACK(drag_end),
                         headers_list_view);
@@ -361,49 +395,6 @@ static void prefs_display_header_create(void)
        g_signal_connect (G_OBJECT (down_btn), "clicked",
                          G_CALLBACK (prefs_display_header_down), NULL);
 
-       /* hidden headers list */
-
-       list_view_hbox2 = gtk_hbox_new (FALSE, 8);
-       gtk_widget_show (list_view_hbox2);
-       gtk_box_pack_start (GTK_BOX (list_view_hbox), list_view_hbox2, TRUE, TRUE, 0);
-
-       list_view_scrolledwin = gtk_scrolled_window_new (NULL, NULL);
-       gtk_widget_set_size_request (list_view_scrolledwin, 200, 210);
-       gtk_widget_show (list_view_scrolledwin);
-       gtk_box_pack_start (GTK_BOX (list_view_hbox2), list_view_scrolledwin,
-                           TRUE, TRUE, 0);
-       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (list_view_scrolledwin),
-                                       GTK_POLICY_AUTOMATIC,
-                                       GTK_POLICY_AUTOMATIC);
-       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(list_view_scrolledwin),
-                                           GTK_SHADOW_IN);
-
-       hidden_headers_list_view = prefs_display_header_list_view_create
-                                       (_("Hidden headers"));
-       gtk_widget_show (hidden_headers_list_view);
-       gtk_container_add (GTK_CONTAINER (list_view_scrolledwin),
-                          hidden_headers_list_view);
-
-       btn_vbox = gtk_vbox_new (FALSE, 8);
-       gtk_widget_show (btn_vbox);
-       gtk_box_pack_start (GTK_BOX (list_view_hbox2), btn_vbox, FALSE, FALSE, 0);
-
-       reg_btn = gtk_button_new_from_stock (GTK_STOCK_ADD);
-       gtk_widget_show (reg_btn);
-       gtk_box_pack_start (GTK_BOX (btn_vbox), reg_btn, FALSE, TRUE, 0);
-       g_signal_connect (G_OBJECT (reg_btn), "clicked",
-                           G_CALLBACK
-                           (prefs_display_header_register_cb),
-                           GINT_TO_POINTER(TRUE));
-       del_btn = gtk_button_new_from_stock (GTK_STOCK_DELETE);
-       gtk_widget_show (del_btn);
-       gtk_box_pack_start (GTK_BOX (btn_vbox), del_btn, FALSE, TRUE, 0);
-       g_signal_connect (G_OBJECT       (del_btn), "clicked",
-                           G_CALLBACK (prefs_display_header_delete_cb),
-                           hidden_headers_list_view);
-
-       
-
        PACK_CHECK_BUTTON (vbox, checkbtn_other_headers,
                           _("Show all unspecified headers"));
        SET_TOGGLE_SENSITIVITY (checkbtn_other_headers, list_view_hbox2);
@@ -433,8 +424,8 @@ void prefs_display_header_read_config(void)
 
        rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
                             DISPLAY_HEADER_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);
                prefs_common.disphdr_list = NULL;
                prefs_display_header_set_default();
@@ -450,7 +441,7 @@ void prefs_display_header_read_config(void)
                        g_slist_remove(prefs_common.disphdr_list, dp);
        }
 
-       while (fgets(buf, sizeof(buf), fp) != NULL) {
+       while (claws_fgets(buf, sizeof(buf), fp) != NULL) {
                g_strdelimit(buf, "\r\n", '\0');
                dp = display_header_prop_read_str(buf);
                if (dp)
@@ -458,7 +449,7 @@ void prefs_display_header_read_config(void)
                                g_slist_append(prefs_common.disphdr_list, dp);
        }
 
-       fclose(fp);
+       claws_fclose(fp);
 }
 
 static void prefs_display_header_write_config(void)
@@ -473,7 +464,7 @@ static void prefs_display_header_write_config(void)
                             DISPLAY_HEADER_RC, NULL);
 
        if ((pfile = prefs_write_open(rcpath)) == NULL) {
-               g_warning("failed to write configuration to file\n");
+               g_warning("failed to write configuration to file");
                g_free(rcpath);
                return;
        }
@@ -484,9 +475,9 @@ static void prefs_display_header_write_config(void)
                gchar *dpstr;
 
                dpstr = display_header_prop_get_str(dp);
-               if (fputs(dpstr, pfile->fp) == EOF ||
-                   fputc('\n', pfile->fp) == EOF) {
-                       FILE_OP_ERROR(rcpath, "fputs || fputc");
+               if (claws_fputs(dpstr, pfile->fp) == EOF ||
+                   claws_fputc('\n', pfile->fp) == EOF) {
+                       FILE_OP_ERROR(rcpath, "claws_fputs || claws_fputc");
                        prefs_file_close_revert(pfile);
                        g_free(rcpath);
                        g_free(dpstr);
@@ -498,7 +489,7 @@ static void prefs_display_header_write_config(void)
        g_free(rcpath);
 
        if (prefs_file_close(pfile) < 0) {
-               g_warning("failed to write configuration to file\n");
+               g_warning("failed to write configuration to file");
                return;
        }
 }
@@ -590,7 +581,7 @@ static void prefs_display_header_list_view_set_row(gboolean hidden)
        gchar *entry_text;
        GtkTreeModel *model;
 
-       entry_text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(dispheader.hdr_combo));
+       entry_text = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(dispheader.hdr_combo));
        if (!entry_text)
                entry_text = gtk_editable_get_chars(
                                GTK_EDITABLE(gtk_bin_get_child(GTK_BIN(dispheader.hdr_combo))),0,-1);
@@ -715,7 +706,7 @@ static gboolean prefs_display_header_key_pressed(GtkWidget *widget,
                                             GdkEventKey *event,
                                             gpointer data)
 {
-       if (event && event->keyval == GDK_Escape)
+       if (event && event->keyval == GDK_KEY_Escape)
                prefs_display_header_cancel();
        return FALSE;
 }
@@ -727,12 +718,14 @@ static void prefs_display_header_ok(void)
                        (GTK_TOGGLE_BUTTON(dispheader.other_headers));
        prefs_display_header_write_config();
        gtk_widget_hide(dispheader.window);
+       gtk_window_set_modal(GTK_WINDOW(dispheader.window), FALSE);
 }
 
 static void prefs_display_header_cancel(void)
 {
        prefs_display_header_read_config();
        gtk_widget_hide(dispheader.window);
+       gtk_window_set_modal(GTK_WINDOW(dispheader.window), FALSE);
 }
 
 static gint prefs_display_header_deleted(GtkWidget *widget, GdkEventAny *event,
@@ -798,17 +791,6 @@ static void prefs_filtering_create_list_view_columns(GtkWidget *list_view,
        gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column);          
 }
 
-/*!
- *\brief       Called as a result of a drag & drop
- */
-static void headers_list_model_row_changed(GtkTreeModel *model, 
-                                          GtkTreePath *path, 
-                                          GtkTreeIter *iter, 
-                                          GtkTreeView *list_view)
-{
-       prefs_display_header_set_list();
-}
-
 /*!
  *\brief       Called as a result of a gtk_list_store_swap()
  */
@@ -821,28 +803,13 @@ static void headers_list_model_rows_reordered(GtkTreeModel *model,
        prefs_display_header_set_list();
 }
 
-static void drag_begin(GtkTreeView *list_view,
-                     GdkDragContext *context,
-                     gpointer data)
-{
-       /* XXX unfortunately a completed drag & drop does not emit 
-        * a "rows_reordered" signal, but a "row_changed" signal.
-        * So during drag and drop, listen to "row_changed", and
-        * update the account list accordingly */
-
-       GtkTreeModel *model = gtk_tree_view_get_model(list_view);
-       g_signal_connect(G_OBJECT(model), "row_changed",
-                        G_CALLBACK(headers_list_model_row_changed),
-                        list_view);
-}
-
+/*!
+ *\brief       Called as a result of a drag & drop
+ */
 static void drag_end(GtkTreeView *list_view,
                    GdkDragContext *context,
                    gpointer data)
 {
-       GtkTreeModel *model = gtk_tree_view_get_model(list_view);
-       g_signal_handlers_disconnect_by_func(G_OBJECT(model),
-                                            G_CALLBACK(headers_list_model_row_changed),
-                                            list_view);
+       prefs_display_header_set_list();
 }