if (cur_pos > gtk_text_buffer_get_char_count (buffer))
cur_pos = gtk_text_buffer_get_char_count (buffer);
- gtk_text_buffer_get_iter_at_offset (buffer, &iter, cur_pos);
- gtk_text_buffer_place_cursor (buffer, &iter);
+ gtk_text_buffer_get_iter_at_offset(buffer, &iter, cur_pos);
+ gtk_text_buffer_place_cursor(buffer, &iter);
g_signal_handlers_unblock_by_func(G_OBJECT(buffer),
G_CALLBACK(compose_changed_cb),
{
gchar *sig_body = NULL;
gchar *sig_str = NULL;
+ gchar *utf8_sig_str = NULL;
g_return_val_if_fail(compose->account != NULL, NULL);
g_free(tmp);
}
- if (compose->account->sig_sep)
+ if (compose->account->sig_sep) {
sig_str = g_strconcat("\n\n", compose->account->sig_sep, "\n", sig_body,
NULL);
- else
+ g_free(sig_body);
+ } else
sig_str = g_strconcat("\n\n", sig_body, NULL);
- g_free(sig_body);
-
- return sig_str;
+ if (sig_str) {
+ utf8_sig_str = conv_codeset_strdup
+ (sig_str, conv_get_locale_charset_str(), CS_INTERNAL);
+ g_free(sig_str);
+ }
+
+ return utf8_sig_str;
}
static ComposeInsertResult compose_insert_file(Compose *compose, const gchar *file)
gchar buf[BUFFSIZE];
gint len;
FILE *fp;
+ gboolean prev_autowrap;
gboolean badtxt = FALSE;
g_return_val_if_fail(file != NULL, COMPOSE_INSERT_NO_FILE);
cur_encoding = conv_get_locale_charset_str();
+ prev_autowrap = compose->autowrap;
+ compose->autowrap = FALSE;
+
while (fgets(buf, sizeof(buf), fp) != NULL) {
gchar *str;
g_signal_handlers_unblock_by_func(G_OBJECT(buffer),
G_CALLBACK(text_inserted),
compose);
+ compose->autowrap = prev_autowrap;
+ if (compose->autowrap)
+ compose_wrap_all(compose);
fclose(fp);
wc = g_utf8_get_char(p);
if (i >= quote_len && !g_unichar_isspace(wc))
break;
- col += g_unichar_iswide(wc) ? 2 : 1;
+ if (g_unichar_iswide(wc))
+ col += 2;
+ else if (*p == '\t')
+ col += 8;
+ else
+ col++;
p = g_utf8_next_char(p);
}
}
wc = g_utf8_get_char(p);
- col += g_unichar_iswide(wc) ? 2 : 1;
+ if (g_unichar_iswide(wc))
+ col += 2;
+ else if (*p == '\t')
+ col += 8;
+ else
+ col++;
if (pos > 0 && col > max_col) {
do_break = TRUE;
break;
return do_break;
}
-static gboolean is_sig_separator(Compose *compose, GtkTextBuffer *textbuf, guint start_pos)
+static gboolean is_sig_separator(Compose *compose, GtkTextBuffer *textbuf, GtkTextIter *iter)
{
char *text = NULL;
- GtkTextIter iter;
+ GtkTextIter start = *iter;
GtkTextIter end_iter;
+ int start_pos = gtk_text_iter_get_offset(&start);
+
if (!compose->account->sig_sep)
return FALSE;
- gtk_text_buffer_get_iter_at_offset(textbuf, &iter, start_pos+1);
gtk_text_buffer_get_iter_at_offset(textbuf, &end_iter,
- start_pos+strlen(compose->account->sig_sep)+1);
+ start_pos+strlen(compose->account->sig_sep));
- if (!strcmp(gtk_text_iter_get_text(&iter, &end_iter),
+ /* check sig separator */
+ if (!strcmp(gtk_text_iter_get_text(&start, &end_iter),
compose->account->sig_sep)) {
- /* check \n */
- gtk_text_buffer_get_iter_at_offset(textbuf, &iter,
- start_pos+strlen(compose->account->sig_sep)+1);
+ /* check end of line (\n) */
+ gtk_text_buffer_get_iter_at_offset(textbuf, &start,
+ start_pos+strlen(compose->account->sig_sep));
gtk_text_buffer_get_iter_at_offset(textbuf, &end_iter,
- start_pos+strlen(compose->account->sig_sep)+2);
+ start_pos+strlen(compose->account->sig_sep)+1);
- if (!strcmp(gtk_text_iter_get_text(&iter, &end_iter),"\n"));
+ if (!strcmp(gtk_text_iter_get_text(&start, &end_iter),"\n"));
return TRUE;
return FALSE;
}
-static gboolean compose_join_next_line(GtkTextBuffer *buffer,
+static gboolean compose_join_next_line(Compose *compose,
+ GtkTextBuffer *buffer,
GtkTextIter *iter,
const gchar *quote_str)
{
gchar *next_quote_str;
gunichar wc1, wc2;
gint quote_len;
+ gboolean keep_cursor = FALSE;
if (!gtk_text_iter_forward_line(&iter_) ||
gtk_text_iter_ends_line(&iter_))
gtk_text_buffer_delete(buffer, &iter_, &end);
}
+ /* don't join if next line is sig separator */
+ if (is_sig_separator(compose, buffer, &iter_))
+ return FALSE;
+
/* delete linebreak and extra spaces */
prev = cur = iter_;
while (gtk_text_iter_backward_char(&cur)) {
gtk_text_iter_forward_char(&cur);
next = cur;
}
- if (!gtk_text_iter_equal(&prev, &next))
+
+ if (!gtk_text_iter_equal(&prev, &next)) {
+ GtkTextMark *mark;
+
+ mark = gtk_text_buffer_get_insert(buffer);
+ gtk_text_buffer_get_iter_at_mark(buffer, &cur, mark);
+ if (gtk_text_iter_equal(&prev, &cur))
+ keep_cursor = TRUE;
gtk_text_buffer_delete(buffer, &prev, &next);
+ }
iter_ = prev;
/* insert space if required */
str = gtk_text_buffer_get_text(buffer, &prev, &next, FALSE);
pango_default_break(str, -1, NULL, attrs, 3);
if (!attrs[1].is_line_break ||
- (!g_unichar_iswide(wc1) || !g_unichar_iswide(wc2)))
+ (!g_unichar_iswide(wc1) || !g_unichar_iswide(wc2))) {
gtk_text_buffer_insert(buffer, &iter_, " ", 1);
+ if (keep_cursor) {
+ gtk_text_iter_backward_char(&iter_);
+ gtk_text_buffer_place_cursor(buffer, &iter_);
+ }
+ }
g_free(str);
*iter = iter_;
if (compose_get_line_break_pos(buffer, &iter, &break_pos,
prefs_common.linewrap_len,
quote_len)) {
+ GtkTextIter prev, next, cur;
+
gtk_text_buffer_insert(buffer, &break_pos, "\n", 1);
+
+ /* remove trailing spaces */
+ cur = break_pos;
+ gtk_text_iter_backward_char(&cur);
+ prev = next = cur;
+ while (!gtk_text_iter_starts_line(&cur)) {
+ gunichar wc;
+
+ gtk_text_iter_backward_char(&cur);
+ wc = gtk_text_iter_get_char(&cur);
+ if (!g_unichar_isspace(wc))
+ break;
+ prev = cur;
+ }
+ if (!gtk_text_iter_equal(&prev, &next)) {
+ gtk_text_buffer_delete(buffer, &prev, &next);
+ break_pos = next;
+ gtk_text_iter_forward_char(&break_pos);
+ }
+
if (quote_str)
gtk_text_buffer_insert(buffer, &break_pos,
quote_str, -1);
iter = break_pos;
- compose_join_next_line(buffer, &iter, quote_str);
+ compose_join_next_line(compose, buffer, &iter, quote_str);
/* move iter to current line start */
gtk_text_iter_set_line_offset(&iter, 0);
return -1;
procmime_write_mimeinfo(mimemsg, fp);
+
+ procmime_mimeinfo_free_all(mimemsg);
return 0;
}
mimepart->disposition = DISPOSITIONTYPE_ATTACHMENT;
}
+ if (compose->use_signing) {
+ if (ainfo->encoding == ENC_7BIT)
+ ainfo->encoding = ENC_QUOTED_PRINTABLE;
+ else if (ainfo->encoding == ENC_8BIT)
+ ainfo->encoding = ENC_BASE64;
+ }
+
procmime_encode_content(mimepart, ainfo->encoding);
g_node_append(parent->node, mimepart->node);
static void compose_undo_cb(Compose *compose)
{
+ gboolean prev_autowrap = compose->autowrap;
+
+ compose->autowrap = FALSE;
undo_undo(compose->undostruct);
+ compose->autowrap = prev_autowrap;
}
static void compose_redo_cb(Compose *compose)
{
+ gboolean prev_autowrap = compose->autowrap;
+
+ compose->autowrap = FALSE;
undo_redo(compose->undostruct);
+ compose->autowrap = prev_autowrap;
}
static void entry_cut_clipboard(GtkWidget *entry)
}
}
-
static void compose_cut_cb(Compose *compose)
{
if (compose->focused_editable &&