2005-12-21 [colin] 1.9.100cvs101
[claws.git] / src / compose.c
index 1fb7e1c94f36264a6ff12ce3136d6264730540b7..cd06f1a19928dc4c49402ee26adf13593b278cec 100644 (file)
@@ -72,7 +72,9 @@
 #endif
 #include <signal.h>
 #include <errno.h>
+#ifndef G_OS_WIN32  /* fixme we should have a configure test. */
 #include <libgen.h>
+#endif
 
 #if (HAVE_WCTYPE_H && HAVE_WCHAR_H)
 #  include <wchar.h>
@@ -817,6 +819,7 @@ static void compose_create_tags(GtkTextView *text, Compose *compose)
                                         "foreground-gdk", &uri_color,
                                         NULL);
        compose->no_wrap_tag = gtk_text_buffer_create_tag(buffer, "no_wrap", NULL);
+       compose->no_join_tag = gtk_text_buffer_create_tag(buffer, "no_join", NULL);
 }
 
 Compose *compose_new(PrefsAccount *account, const gchar *mailto,
@@ -1114,6 +1117,24 @@ static void compose_extract_original_charset(Compose *compose)
        }
 }
 
+#define SIGNAL_BLOCK(buffer) {                                 \
+       g_signal_handlers_block_by_func(G_OBJECT(buffer),       \
+                               G_CALLBACK(compose_changed_cb), \
+                               compose);                       \
+       g_signal_handlers_block_by_func(G_OBJECT(buffer),       \
+                               G_CALLBACK(text_inserted),      \
+                               compose);                       \
+}
+
+#define SIGNAL_UNBLOCK(buffer) {                               \
+       g_signal_handlers_unblock_by_func(G_OBJECT(buffer),     \
+                               G_CALLBACK(compose_changed_cb), \
+                               compose);                       \
+       g_signal_handlers_unblock_by_func(G_OBJECT(buffer),     \
+                               G_CALLBACK(text_inserted),      \
+                               compose);                       \
+}
+
 static Compose *compose_generic_reply(MsgInfo *msginfo, gboolean quote,
                                  gboolean to_all, gboolean to_ml,
                                  gboolean to_sender,
@@ -1206,11 +1227,15 @@ static Compose *compose_generic_reply(MsgInfo *msginfo, gboolean quote,
                compose_force_encryption(compose, account, FALSE);
        }
 
+       SIGNAL_BLOCK(textbuf);
+       
        if (account->auto_sig)
                compose_insert_sig(compose, FALSE);
 
        compose_wrap_all(compose);
 
+       SIGNAL_UNBLOCK(textbuf);
+       
        gtk_widget_grab_focus(compose->text);
 
        undo_unblock(compose->undostruct);
@@ -1307,11 +1332,15 @@ Compose *compose_forward(PrefsAccount *account, MsgInfo *msginfo,
                procmsg_msginfo_free(full_msginfo);
        }
 
+       SIGNAL_BLOCK(textbuf);
+
        if (account->auto_sig)
                compose_insert_sig(compose, FALSE);
 
        compose_wrap_all(compose);
 
+       SIGNAL_UNBLOCK(textbuf);
+       
        gtk_text_buffer_get_start_iter(textbuf, &iter);
        gtk_text_buffer_place_cursor(textbuf, &iter);
 
@@ -1408,11 +1437,15 @@ Compose *compose_forward_multiple(PrefsAccount *account, GSList *msginfo_list)
                        _("Fw: multiple emails"));
        }
 
+       SIGNAL_BLOCK(textbuf);
+       
        if (account->auto_sig)
                compose_insert_sig(compose, FALSE);
 
        compose_wrap_all(compose);
 
+       SIGNAL_UNBLOCK(textbuf);
+       
        gtk_text_buffer_get_start_iter(textbuf, &iter);
        gtk_text_buffer_place_cursor(textbuf, &iter);
 
@@ -2121,12 +2154,7 @@ static gchar *compose_quote_fmt(Compose *compose, MsgInfo *msginfo,
        GtkTextMark *mark;
        
 
-       g_signal_handlers_block_by_func(G_OBJECT(buffer),
-                               G_CALLBACK(compose_changed_cb),
-                               compose);
-       g_signal_handlers_block_by_func(G_OBJECT(buffer),
-                               G_CALLBACK(text_inserted),
-                               compose);
+       SIGNAL_BLOCK(buffer);
 
        if (!msginfo)
                msginfo = &dummyinfo;
@@ -2199,12 +2227,7 @@ static gchar *compose_quote_fmt(Compose *compose, MsgInfo *msginfo,
 error:
        buf = NULL;
 ok:
-       g_signal_handlers_unblock_by_func(G_OBJECT(buffer),
-                               G_CALLBACK(compose_changed_cb),
-                               compose);
-       g_signal_handlers_unblock_by_func(G_OBJECT(buffer),
-                               G_CALLBACK(text_inserted),
-                               compose);
+       SIGNAL_UNBLOCK(buffer);
 
 
        return buf;
@@ -3167,8 +3190,14 @@ static gboolean compose_join_next_line(Compose *compose,
        if (quote_len > 0)
                gtk_text_buffer_delete(buffer, &iter_, &end);
 
-       /* delete linebreak and extra spaces */
+       /* don't join line breaks put by the user */
        prev = cur = iter_;
+       gtk_text_iter_backward_char(&cur);
+       if (gtk_text_iter_has_tag(&cur, compose->no_join_tag)) {
+               return FALSE;
+       }
+       gtk_text_iter_forward_char(&cur);
+       /* delete linebreak and extra spaces */
        while (gtk_text_iter_backward_char(&cur)) {
                wc1 = gtk_text_iter_get_char(&cur);
                if (!g_unichar_isspace(wc1))
@@ -3737,6 +3766,7 @@ gint compose_send(Compose *compose)
                                   "the main window to retry."));
                if (prefs_common.send_dialog_mode == SEND_DIALOG_ALWAYS) {
                        compose->sending = FALSE;
+                       compose->modified = TRUE; 
                        compose_allow_user_actions (compose, TRUE);
                }
                return 0;
@@ -3766,6 +3796,7 @@ gint compose_send(Compose *compose)
                                   "the main window to retry."));
                if (prefs_common.send_dialog_mode == SEND_DIALOG_ALWAYS) {
                        compose_allow_user_actions (compose, TRUE);
+                       compose->modified = TRUE; 
                        compose->sending = FALSE;               
                }
                return -1;
@@ -3776,6 +3807,7 @@ gint compose_send(Compose *compose)
 bail:
        compose_allow_user_actions (compose, TRUE);
        compose->sending = FALSE;
+       compose->modified = TRUE; 
 
        return -1;
 }
@@ -8071,9 +8103,14 @@ static void text_inserted(GtkTextBuffer *buffer, GtkTextIter *iter,
                                  
                gtk_text_buffer_get_iter_at_mark(buffer, iter, mark);
                gtk_text_buffer_place_cursor(buffer, iter);
-       } else
-               gtk_text_buffer_insert(buffer, iter, text, len);
-
+       } else {
+               if (strcmp(text, "\n"))
+                       gtk_text_buffer_insert(buffer, iter, text, len);
+               else
+                       gtk_text_buffer_insert_with_tags_by_name(buffer, 
+                               iter, text, len, "no_join", NULL);
+       }
+       
        mark = gtk_text_buffer_create_mark(buffer, NULL, iter, FALSE);
        
        compose_beautify_paragraph(compose, iter, FALSE);