remove gtk_window_set_wmclass()
[claws.git] / src / compose.c
index 01c4590ba6e361e441c68e2bdd565c118eb353f6..3f9d36bb87f5a879aa691d0c0debb56c8e8a0d59 100644 (file)
@@ -374,7 +374,9 @@ static void compose_allsel_cb               (Compose        *compose);
 static void compose_advanced_action_cb (Compose                   *compose,
                                         ComposeCallAdvancedAction  action);
 
-static void compose_grab_focus_cb      (GtkWidget      *widget,
+static gboolean compose_grab_focus_cb  (GtkWidget      *widget,
+                                        Compose        *compose);
+static gboolean compose_grab_focus_before_cb   (GtkWidget      *widget,
                                         Compose        *compose);
 
 static void compose_changed_cb         (GtkTextBuffer  *textbuf,
@@ -730,6 +732,7 @@ Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderI
        textview = GTK_TEXT_VIEW(compose->text);
        textbuf = gtk_text_view_get_buffer(textview);
 
+       undo_block(compose->undostruct);
 #ifdef USE_ASPELL
        if (item && item->prefs && item->prefs->enable_default_dictionary &&
            compose->gtkaspell) 
@@ -988,6 +991,7 @@ static void compose_generic_reply(MsgInfo *msginfo, gboolean quote,
        textview = (GTK_TEXT_VIEW(compose->text));
        textbuf = gtk_text_view_get_buffer(textview);
        
+       undo_block(compose->undostruct);
 #ifdef USE_ASPELL
        if (msginfo->folder && msginfo->folder->prefs && 
            msginfo->folder->prefs && 
@@ -2266,6 +2270,7 @@ static void compose_use_signing(Compose *compose, gboolean use_signing)
        ifactory = gtk_item_factory_from_widget(compose->menubar);
        menuitem = gtk_item_factory_get_item
                (ifactory, "/Message/Sign");
+
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), 
                                       use_signing);
        compose_update_gnupg_mode_menu_item(compose);
@@ -2794,7 +2799,8 @@ static void compose_wrap_line_all_full(Compose *compose, gboolean autowrap)
        guint linewrap_len = prefs_common.linewrap_len;
        gchar *qfmt = prefs_common.quotemark;
        gchar cbuf[CHAR_BUF_SIZE];
-
+       GtkTextMark *cursor_mark = gtk_text_buffer_get_insert(textbuf);
+       
        tlen = gtk_text_buffer_get_char_count(textbuf);
 
        for (; cur_pos < tlen; cur_pos++) {
@@ -2815,10 +2821,8 @@ static void compose_wrap_line_all_full(Compose *compose, gboolean autowrap)
                        guint tab_width = 8;
                        guint tab_offset = line_len % tab_width;
 
-                       if (tab_offset) {
-                               line_len += tab_width - tab_offset - 1;
-                               cur_len = line_len;
-                       }
+                       line_len += tab_width - tab_offset - 1;
+                       cur_len = line_len;
                }
 
                /* we have encountered line break */
@@ -2878,8 +2882,20 @@ static void compose_wrap_line_all_full(Compose *compose, gboolean autowrap)
                                /* insert space if it's alphanumeric */
                                if ((cur_pos != line_pos) &&
                                    ((clen > 1) || isalnum((guchar)cb[0]))) {
+                                       GtkTextIter cursor_iter;
+                                       gboolean go_back = FALSE;
+                                       gtk_text_buffer_get_iter_at_mark(textbuf, &cursor_iter, cursor_mark);
+                                       if (gtk_text_iter_get_offset(&iter) ==
+                                                gtk_text_iter_get_offset(&cursor_iter))
+                                               go_back = TRUE;
+                                       
                                        gtk_text_buffer_insert(textbuf, &iter,
                                                               " ", 1);
+                                       if (go_back) {
+                                               gtk_text_buffer_get_iter_at_mark(textbuf, &cursor_iter, cursor_mark);
+                                               gtk_text_iter_backward_chars(&cursor_iter, 1);
+                                               gtk_text_buffer_place_cursor(textbuf, &cursor_iter);
+                                       }
                                        tlen++;
                                }
 
@@ -3716,8 +3732,8 @@ static gint compose_write_to_file(Compose *compose, const gchar *file,
                        msg = g_strdup_printf(_("Can't convert the character encoding of the message from\n"
                                                "%s to %s.\n"
                                                "Send it anyway?"), src_codeset, out_codeset);
-                       aval = alertpanel
-                               (_("Error"), msg, _("Yes"), _("+No"), NULL);
+                       aval = alertpanel_with_type
+                               (_("Error"), msg, _("Yes"), _("+No"), NULL, NULL, ALERT_ERROR);
                        g_free(msg);
 
                        if (aval != G_ALERTDEFAULT) {
@@ -4500,6 +4516,7 @@ static gint compose_write_headers(Compose *compose, FILE *fp,
 #endif
        /* Organization */
        if (compose->account->organization &&
+           strlen(compose->account->organization) &&
            !IS_IN_CUSTOM_HEADER("Organization")) {
                compose_convert_header(buf, sizeof(buf),
                                       compose->account->organization,
@@ -4658,7 +4675,7 @@ static void compose_convert_header(gchar *dest, gint len, gchar *src,
 
        if (len < 1) return;
 
-       tmpstr = conv_codeset_strdup(src, CS_UTF_8, conv_get_current_charset_str());
+       tmpstr = g_strdup(src);
 
        subst_char(tmpstr, '\n', ' ');
        subst_char(tmpstr, '\r', ' ');
@@ -4741,6 +4758,10 @@ static void compose_create_header_entry(Compose *compose)
        }
        if (header)
                gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry), header);
+       g_signal_connect(G_OBJECT(GTK_COMBO(combo)->entry), "grab_focus",
+                        G_CALLBACK(compose_grab_focus_before_cb), compose);
+       g_signal_connect_after(G_OBJECT(GTK_COMBO(combo)->entry), "grab_focus",
+                        G_CALLBACK(compose_grab_focus_cb), compose);
 
        /* Entry field */
        entry = gtk_entry_new(); 
@@ -4756,6 +4777,8 @@ static void compose_create_header_entry(Compose *compose)
        g_signal_connect(G_OBJECT(entry), "activate", 
                         G_CALLBACK(text_activated), compose);
        g_signal_connect(G_OBJECT(entry), "grab_focus",
+                        G_CALLBACK(compose_grab_focus_before_cb), compose);
+       g_signal_connect_after(G_OBJECT(entry), "grab_focus",
                         G_CALLBACK(compose_grab_focus_cb), compose);
        g_signal_connect(G_OBJECT(entry), "button-press-event", 
                         G_CALLBACK(compose_headerentry_button_pressed),
@@ -5005,6 +5028,8 @@ static GtkWidget *compose_create_others(Compose *compose)
        gtk_table_attach_defaults(GTK_TABLE(table), savemsg_entry, 1, 2, rowcount, rowcount + 1);
        gtk_editable_set_editable(GTK_EDITABLE(savemsg_entry), prefs_common.savemsg);
        g_signal_connect(G_OBJECT(savemsg_entry), "grab_focus",
+                        G_CALLBACK(compose_grab_focus_before_cb), compose);
+       g_signal_connect_after(G_OBJECT(savemsg_entry), "grab_focus",
                         G_CALLBACK(compose_grab_focus_cb), compose);
        if (account_get_special_folder(compose->account, F_OUTBOX)) {
                folderidentifier = folder_item_get_identifier(account_get_special_folder
@@ -5107,9 +5132,8 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
        compose->account = account;
 
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-       gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE);
+       gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
        gtk_widget_set_size_request(window, -1, prefs_common.compose_height);
-       gtk_window_set_wmclass(GTK_WINDOW(window), "compose window", "Sylpheed");
 
        if (!geometry.max_width) {
                geometry.max_width = gdk_screen_width();
@@ -5181,6 +5205,8 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
        g_signal_connect(G_OBJECT(subject_entry), "activate", 
                         G_CALLBACK(text_activated), compose);
        g_signal_connect(G_OBJECT(subject_entry), "grab_focus",
+                        G_CALLBACK(compose_grab_focus_before_cb), compose);
+       g_signal_connect_after(G_OBJECT(subject_entry), "grab_focus",
                         G_CALLBACK(compose_grab_focus_cb), compose);
        gtk_widget_show(subject_entry);
        compose->subject_entry = subject_entry;
@@ -5216,10 +5242,6 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
        clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
        gtk_text_buffer_add_selection_clipboard(buffer, clipboard);
        
-       if (prefs_common.smart_wrapping) {      
-               gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD);
-       }               
-
        gtk_container_add(GTK_CONTAINER(scrolledwin), text);
 
        g_signal_connect_after(G_OBJECT(text), "size_allocate",
@@ -5395,7 +5417,8 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
                                                  prefs_common.misspelled_col,
                                                  prefs_common.check_while_typing,
                                                  prefs_common.use_alternate,
-                                                 GTK_TEXT_VIEW(text));
+                                                 GTK_TEXT_VIEW(text),
+                                                 GTK_WINDOW(compose->window));
                        if (!gtkaspell) {
                                alertpanel_error(_("Spell checker could not "
                                                "be started.\n%s"),
@@ -6613,6 +6636,8 @@ static void compose_draft_cb(gpointer data, guint action, GtkWidget *widget)
        if (newmsginfo) {
                procmsg_msginfo_unset_flags(newmsginfo, ~0, ~0);
                procmsg_msginfo_set_flags(newmsginfo, 0, MSG_DRAFT);
+               if (compose_use_attach(compose))
+                       procmsg_msginfo_set_flags(newmsginfo, 0, MSG_HAS_ATTACHMENT);
                procmsg_msginfo_free(newmsginfo);
        }
        
@@ -6659,7 +6684,7 @@ static void compose_attach_cb(gpointer data, guint action, GtkWidget *widget)
        if (compose->redirect_filename != NULL)
                return;
 
-       file_list = filesel_select_multiple_files(_("Select file"));
+       file_list = filesel_select_multiple_files_open(_("Select file"));
 
        if (file_list) {
                GList *tmp;
@@ -6680,7 +6705,7 @@ static void compose_insert_file_cb(gpointer data, guint action,
        Compose *compose = (Compose *)data;
        GList *file_list;
 
-       file_list = filesel_select_multiple_files(_("Select file"));
+       file_list = filesel_select_multiple_files_open(_("Select file"));
 
        if (file_list) {
                GList *tmp;
@@ -7199,10 +7224,38 @@ static void compose_advanced_action_cb(Compose *compose,
        }
 }
 
-static void compose_grab_focus_cb(GtkWidget *widget, Compose *compose)
+static gchar *cliptext = NULL;
+
+static gboolean compose_grab_focus_before_cb(GtkWidget *widget, Compose *compose)
 {
+       gchar *str = NULL;
+       GtkClipboard *clip = gtk_clipboard_get(gdk_atom_intern("PRIMARY", FALSE));
+       if (cliptext)
+               g_free(cliptext);
+       if (gtk_clipboard_wait_is_text_available(clip))
+               cliptext = gtk_clipboard_wait_for_text(clip);
+       
+       return FALSE;
+}
+
+static gboolean compose_grab_focus_cb(GtkWidget *widget, Compose *compose)
+{
+       gchar *str = NULL;
+       GtkClipboard *clip = gtk_clipboard_get(gdk_atom_intern("PRIMARY", FALSE));
+       
+       if (GTK_IS_EDITABLE(widget)) {
+               str = gtk_editable_get_chars(GTK_EDITABLE(widget), 0, -1);
+               gtk_editable_set_position(GTK_EDITABLE(widget), 
+                       strlen(str));
+               g_free(str);
+       }
+       if (cliptext)
+               gtk_clipboard_set_text(clip, cliptext, -1);
+
        if (GTK_IS_EDITABLE(widget) || GTK_IS_TEXT_VIEW(widget))
                compose->focused_editable = widget;
+       
+       return TRUE;
 }
 
 static void compose_changed_cb(GtkTextBuffer *textbuf, Compose *compose)
@@ -7217,7 +7270,6 @@ static void compose_toggle_autowrap_cb(gpointer data, guint action,
                                       GtkWidget *widget)
 {
        Compose *compose = (Compose *)data;
-
        compose->autowrap = GTK_CHECK_MENU_ITEM(widget)->active;
        if (compose->autowrap)
                compose_wrap_line_all_full(compose, TRUE);