2011-10-30 [pawel] 3.7.10cvs61
[claws.git] / src / compose.c
index 95c5daf7d049025b219ff0c46d893929ae30ea30..2ad073a6a8a4c381928393bfd2f6b45c64892768 100644 (file)
 #include "codeconv.h"
 #include "utils.h"
 #include "gtkutils.h"
+#include "gtkshruler.h"
 #include "socket.h"
 #include "alertpanel.h"
 #include "manage_window.h"
-#include "gtkshruler.h"
 #include "folder.h"
 #include "addr_compl.h"
 #include "quote_fmt.h"
@@ -350,13 +350,10 @@ static void compose_add_field_list        ( Compose *compose,
                                          GList *listAddress );
 
 /* callback functions */
-#if !GTK_CHECK_VERSION(2,24,0)
+
 static gboolean compose_edit_size_alloc (GtkEditable   *widget,
                                         GtkAllocation  *allocation,
-                                        GtkSHRuler *shruler);
-static void compose_toggle_ruler_cb    (GtkToggleAction *action,
-                                        gpointer        data);
-#endif
+                                        GtkSHRuler     *shruler);
 static void account_activated          (GtkComboBox *optmenu,
                                         gpointer        data);
 static void attach_selected            (GtkTreeView    *tree_view, 
@@ -440,6 +437,8 @@ static void compose_toggle_autowrap_cb      (GtkToggleAction *action,
 static void compose_toggle_autoindent_cb(GtkToggleAction *action,
                                         gpointer        data);
 
+static void compose_toggle_ruler_cb    (GtkToggleAction *action,
+                                        gpointer        data);
 static void compose_toggle_sign_cb     (GtkToggleAction *action,
                                         gpointer        data);
 static void compose_toggle_encrypt_cb  (GtkToggleAction *action,
@@ -581,7 +580,7 @@ static GtkActionEntry compose_entries[] =
        {"Edit/Copy",                   NULL, N_("_Copy"), "<control>C", NULL, G_CALLBACK(compose_copy_cb) },
        {"Edit/Paste",                  NULL, N_("_Paste"), "<control>V", NULL, G_CALLBACK(compose_paste_cb) },
 
-       {"Edit/SpecialPaste",           NULL, N_("Special paste") },
+       {"Edit/SpecialPaste",           NULL, N_("_Special paste") },
        {"Edit/SpecialPaste/AsQuotation",       NULL, N_("as _quotation"), NULL, NULL, G_CALLBACK(compose_paste_as_quote_cb) },
        {"Edit/SpecialPaste/Wrapped",   NULL, N_("_wrapped"), NULL, NULL, G_CALLBACK(compose_paste_wrap_cb) },
        {"Edit/SpecialPaste/Unwrapped", NULL, N_("_unwrapped"), NULL, NULL, G_CALLBACK(compose_paste_no_wrap_cb) },
@@ -669,9 +668,7 @@ static GtkToggleActionEntry compose_toggle_entries[] =
        {"Options/Encrypt",             NULL, N_("_Encrypt"), NULL, NULL, G_CALLBACK(compose_toggle_encrypt_cb) }, /* Toggle */
        {"Options/RequestRetRcpt",      NULL, N_("_Request Return Receipt"), NULL, NULL, G_CALLBACK(compose_toggle_return_receipt_cb) }, /* TOGGLE */
        {"Options/RemoveReferences",    NULL, N_("Remo_ve references"), NULL, NULL, G_CALLBACK(compose_toggle_remove_refs_cb) }, /* TOGGLE */
-#if !GTK_CHECK_VERSION(2,24,0)
        {"Tools/ShowRuler",             NULL, N_("Show _ruler"), NULL, NULL, G_CALLBACK(compose_toggle_ruler_cb) }, /* Toggle */
-#endif
 };
 
 static GtkRadioActionEntry compose_radio_rm_entries[] =
@@ -789,10 +786,12 @@ static void compose_create_tags(GtkTextView *text, Compose *compose)
 {
        GtkTextBuffer *buffer;
        GdkColor black = {(gulong)0, (gushort)0, (gushort)0, (gushort)0};
+#if !GTK_CHECK_VERSION(2, 24, 0)
        GdkColormap *cmap;
-       GdkColor color[8];
        gboolean success[8];
        int i;
+#endif
+       GdkColor color[8];
 
        buffer = gtk_text_view_get_buffer(text);
 
@@ -862,7 +861,8 @@ static void compose_create_tags(GtkTextView *text, Compose *compose)
        color[5] = quote_bgcolor3;
        color[6] = signature_color;
        color[7] = uri_color;
-       cmap = gdk_drawable_get_colormap(compose->window->window);
+#if !GTK_CHECK_VERSION(2, 24, 0)
+       cmap = gdk_drawable_get_colormap(gtk_widget_get_window(compose->window));
        gdk_colormap_alloc_colors(cmap, color, 8, FALSE, TRUE, success);
 
        for (i = 0; i < 8; i++) {
@@ -876,6 +876,7 @@ static void compose_create_tags(GtkTextView *text, Compose *compose)
                                signature_color = uri_color = black;
                }
        }
+#endif
 }
 
 Compose *compose_new(PrefsAccount *account, const gchar *mailto,
@@ -950,6 +951,7 @@ Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderI
        gchar *mailto_from = NULL;
        PrefsAccount *mailto_account = NULL;
        MsgInfo* dummyinfo = NULL;
+       gint cursor_pos = -1;
        MailField mfield = NO_FIELD_PRESENT;
        gchar* buf;
        GtkTextMark *mark;
@@ -1200,7 +1202,11 @@ Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderI
                     * is therefore created before placing the cursor
                     */
                case BODY_FIELD_PRESENT:
-                       gtk_widget_grab_focus(compose->text);
+                       cursor_pos = quote_fmt_get_cursor_pos();
+                       if (cursor_pos == -1)
+                               gtk_widget_grab_focus(compose->header_last->entry);
+                       else
+                               gtk_widget_grab_focus(compose->text);
                        break;
        }
 
@@ -1215,7 +1221,7 @@ Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderI
        compose->modified = FALSE;
        compose_set_title(compose);
 
-  hooks_invoke(COMPOSE_CREATED_HOOKLIST, compose);
+       hooks_invoke(COMPOSE_CREATED_HOOKLIST, compose);
 
         return compose;
 }
@@ -1677,7 +1683,7 @@ Compose *compose_forward(PrefsAccount *account, MsgInfo *msginfo,
        Compose *compose;
        GtkTextView *textview;
        GtkTextBuffer *textbuf;
-       GtkTextIter iter;
+       gint cursor_pos = -1;
        ComposeMode mode;
 
        cm_return_val_if_fail(msginfo != NULL, NULL);
@@ -1831,10 +1837,11 @@ Compose *compose_forward(PrefsAccount *account, MsgInfo *msginfo,
 
        SIGNAL_UNBLOCK(textbuf);
        
-       gtk_text_buffer_get_start_iter(textbuf, &iter);
-       gtk_text_buffer_place_cursor(textbuf, &iter);
-
-       gtk_widget_grab_focus(compose->header_last->entry);
+       cursor_pos = quote_fmt_get_cursor_pos();
+       if (cursor_pos == -1)
+               gtk_widget_grab_focus(compose->header_last->entry);
+       else
+               gtk_widget_grab_focus(compose->text);
 
        if (!no_extedit && prefs_common.auto_exteditor)
                compose_exec_ext_editor(compose);
@@ -2530,12 +2537,18 @@ void compose_entry_append(Compose *compose, const gchar *address,
 
 static void compose_entry_mark_default_to(Compose *compose, const gchar *mailto)
 {
+#if !GTK_CHECK_VERSION(3, 0, 0)
        static GdkColor yellow;
        static GdkColor black;
        static gboolean yellow_initialised = FALSE;
+#else
+       static GdkColor yellow = { (guint32)0, (guint16)0xf5, (guint16)0xf6, (guint16)0xbe };
+       static GdkColor black = { (guint32)0, (guint16)0x0, (guint16)0x0, (guint16)0x0 };
+#endif
        GSList *h_list;
        GtkEntry *entry;
                
+#if !GTK_CHECK_VERSION(3, 0, 0)
        if (!yellow_initialised) {
                gdk_color_parse("#f5f6be", &yellow);
                gdk_color_parse("#000000", &black);
@@ -2544,19 +2557,24 @@ static void compose_entry_mark_default_to(Compose *compose, const gchar *mailto)
                yellow_initialised &= gdk_colormap_alloc_color(
                        gdk_colormap_get_system(), &black, FALSE, TRUE);
        }
+#endif
 
        for (h_list = compose->header_list; h_list != NULL; h_list = h_list->next) {
                entry = GTK_ENTRY(((ComposeHeaderEntry *)h_list->data)->entry);
                if (gtk_entry_get_text(entry) && 
                    !g_utf8_collate(gtk_entry_get_text(entry), mailto)) {
+#if !GTK_CHECK_VERSION(3, 0, 0)
                        if (yellow_initialised) {
+#endif
                                gtk_widget_modify_base(
                                        GTK_WIDGET(((ComposeHeaderEntry *)h_list->data)->entry),
                                        GTK_STATE_NORMAL, &yellow);
                                gtk_widget_modify_text(
                                        GTK_WIDGET(((ComposeHeaderEntry *)h_list->data)->entry),
                                        GTK_STATE_NORMAL, &black);
+#if !GTK_CHECK_VERSION(3, 0, 0)
                        }
+#endif
                }
        }
 }
@@ -4717,8 +4735,7 @@ static void compose_select_account(Compose *compose, PrefsAccount *account,
        }
        
        header_entry = (ComposeHeaderEntry *) compose->header_list->data;
-       header = gtk_combo_box_text_get_active_text(
-                       GTK_COMBO_BOX_TEXT(header_entry->combo));
+       header = gtk_combo_box_get_active_text(GTK_COMBO_BOX(header_entry->combo));
        
        if (header && !strlen(gtk_entry_get_text(GTK_ENTRY(header_entry->entry)))) {
                if (account->protocol == A_NNTP) {
@@ -4986,10 +5003,10 @@ gint compose_send(Compose *compose)
        }
        if (msgpath == NULL) {
                msgpath = folder_item_fetch_msg(folder, msgnum);
-               val = procmsg_send_message_queue(msgpath, &errstr, folder, msgnum, &queued_removed);
+               val = procmsg_send_message_queue_with_lock(msgpath, &errstr, folder, msgnum, &queued_removed);
                g_free(msgpath);
        } else {
-               val = procmsg_send_message_queue(msgpath, &errstr, folder, msgnum, &queued_removed);
+               val = procmsg_send_message_queue_with_lock(msgpath, &errstr, folder, msgnum, &queued_removed);
                claws_unlink(msgpath);
                g_free(msgpath);
        }
@@ -6230,7 +6247,8 @@ static gchar *compose_get_header(Compose *compose)
        }
 
        /* Program version and system info */
-       if (g_slist_length(compose->to_list) && !IS_IN_CUSTOM_HEADER("X-Mailer") &&
+       if (compose->account->gen_xmailer &&
+           g_slist_length(compose->to_list) && !IS_IN_CUSTOM_HEADER("X-Mailer") &&
            !compose->newsgroup_list) {
                g_string_append_printf(header, "X-Mailer: %s (GTK+ %d.%d.%d; %s)\n",
                        prog_version,
@@ -6252,10 +6270,12 @@ static gchar *compose_get_header(Compose *compose)
                     cur = cur->next) {
                        CustomHeader *chdr = (CustomHeader *)cur->data;
 
-                       if (custom_header_is_allowed(chdr->name)) {
+                       if (custom_header_is_allowed(chdr->name)
+                           && chdr->value != NULL
+                           && *(chdr->value) != '\0') {
                                compose_convert_header
                                        (compose, buf, sizeof(buf),
-                                        chdr->value ? chdr->value : "",
+                                        chdr->value,
                                         strlen(chdr->name) + 2, FALSE);
                                g_string_append_printf(header, "%s: %s\n", chdr->name, buf);
                        }
@@ -6905,7 +6925,7 @@ static gboolean text_clicked(GtkWidget *text, GdkEventButton *event,
                                        Compose *compose)
 {
        gint prev_autowrap;
-       GtkTextBuffer *buffer = GTK_TEXT_VIEW(text)->buffer;
+       GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
 #if USE_ENCHANT
        if (event->button == 3) {
                GtkTextIter iter;
@@ -7054,15 +7074,12 @@ static Compose *compose_create(PrefsAccount *account,
        GtkWidget *paned;
 
        GtkWidget *edit_vbox;
-#if !GTK_CHECK_VERSION(2,24,0)
        GtkWidget *ruler_hbox;
        GtkWidget *ruler;
-#endif
        GtkWidget *scrolledwin;
        GtkWidget *text;
        GtkTextBuffer *buffer;
        GtkClipboard *clipboard;
-       CLAWS_TIP_DECL();
 
        UndoMain *undostruct;
 
@@ -7415,16 +7432,15 @@ static Compose *compose_create(PrefsAccount *account,
 
        gtk_box_pack_start(GTK_BOX(edit_vbox), subject_hbox, FALSE, FALSE, 0);
 
-#if !GTK_CHECK_VERSION(2,24,0)
        /* ruler */
        ruler_hbox = gtk_hbox_new(FALSE, 0);
        gtk_box_pack_start(GTK_BOX(edit_vbox), ruler_hbox, FALSE, FALSE, 0);
 
-       ruler = gtk_shruler_new();
-       gtk_ruler_set_range(GTK_RULER(ruler), 0.0, 100.0, 1.0, 100.0);
+       ruler = gtk_shruler_new(GTK_ORIENTATION_HORIZONTAL);
+       gtk_shruler_set_range(GTK_SHRULER(ruler), 0.0, 100.0, 1.0);
        gtk_box_pack_start(GTK_BOX(ruler_hbox), ruler, TRUE, TRUE,
                           BORDER_WIDTH);
-#endif
+
        /* text widget */
        scrolledwin = gtk_scrolled_window_new(NULL, NULL);
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
@@ -7447,12 +7463,9 @@ static Compose *compose_create(PrefsAccount *account,
        gtk_text_buffer_add_selection_clipboard(buffer, clipboard);
        
        gtk_container_add(GTK_CONTAINER(scrolledwin), text);
-
-#if !GTK_CHECK_VERSION(2,24,0)
        g_signal_connect_after(G_OBJECT(text), "size_allocate",
                               G_CALLBACK(compose_edit_size_alloc),
                               ruler);
-#endif
        g_signal_connect(G_OBJECT(buffer), "changed",
                         G_CALLBACK(compose_changed_cb), compose);
        g_signal_connect(G_OBJECT(text), "grab_focus",
@@ -7546,10 +7559,8 @@ static Compose *compose_create(PrefsAccount *account,
 
        compose->notebook      = notebook;
        compose->edit_vbox     = edit_vbox;
-#if !GTK_CHECK_VERSION(2,24,0)
        compose->ruler_hbox    = ruler_hbox;
        compose->ruler         = ruler;
-#endif
        compose->scrolledwin   = scrolledwin;
        compose->text          = text;
 
@@ -7668,12 +7679,11 @@ static Compose *compose_create(PrefsAccount *account,
 
        compose_list = g_list_append(compose_list, compose);
 
-#if !GTK_CHECK_VERSION(2,24,0)
        if (!prefs_common.show_ruler)
                gtk_widget_hide(ruler_hbox);
-       
+               
        cm_toggle_menu_set_active_full(compose->ui_manager, "Menu/Tools/ShowRuler", prefs_common.show_ruler);
-#endif
+
        /* Priority */
        compose->priority = PRIORITY_NORMAL;
        compose_update_priority_menu_item(compose);
@@ -7870,7 +7880,7 @@ static void compose_set_privacy_system_cb(GtkWidget *widget, gpointer data)
 
        cm_return_if_fail(GTK_IS_CHECK_MENU_ITEM(widget));
 
-       if (!GTK_CHECK_MENU_ITEM(widget)->active)
+       if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)))
                return;
 
        systemid = g_object_get_data(G_OBJECT(widget), "privacy_system");
@@ -7893,7 +7903,7 @@ static void compose_update_privacy_system_menu_item(Compose * compose, gboolean
 {
        static gchar *branch_path = "/Menu/Options/PrivacySystem";
        GtkWidget *menuitem = NULL;
-       GList *amenu;
+       GList *children, *amenu;
        gboolean can_sign = FALSE, can_encrypt = FALSE;
        gboolean found = FALSE;
 
@@ -7903,11 +7913,10 @@ static void compose_update_privacy_system_menu_item(Compose * compose, gboolean
                                gtk_ui_manager_get_widget(compose->ui_manager, branch_path)));
                cm_return_if_fail(menuitem != NULL);
 
-               amenu = GTK_MENU_SHELL(menuitem)->children;
+               children = gtk_container_get_children(GTK_CONTAINER(GTK_MENU_SHELL(menuitem)));
+               amenu = children;
                menuitem = NULL;
                while (amenu != NULL) {
-                       GList *alist = amenu->next;
-
                        systemid = g_object_get_data(G_OBJECT(amenu->data), "privacy_system");
                        if (systemid != NULL) {
                                if (strcmp(systemid, compose->privacy_system) == 0 &&
@@ -7929,8 +7938,9 @@ static void compose_update_privacy_system_menu_item(Compose * compose, gboolean
                                        break;
                        }
 
-                       amenu = alist;
+                       amenu = amenu->next;
                }
+               g_list_free(children);
                if (menuitem != NULL)
                        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
                
@@ -8336,6 +8346,7 @@ static void compose_template_apply_fields(Compose *compose, Template *tmpl)
 
 static void compose_destroy(Compose *compose)
 {
+       GtkAllocation allocation;
        GtkTextBuffer *buffer;
        GtkClipboard *clipboard;
 
@@ -8401,8 +8412,9 @@ static void compose_destroy(Compose *compose)
 #endif
 
        if (!compose->batch) {
-               prefs_common.compose_width = compose->scrolledwin->allocation.width;
-               prefs_common.compose_height = compose->window->allocation.height;
+               gtk_widget_get_allocation(compose->scrolledwin, &allocation);
+               prefs_common.compose_width = allocation.width;
+               prefs_common.compose_height = allocation.height;
        }
 
        if (!gtk_widget_get_parent(compose->paned))
@@ -8647,6 +8659,7 @@ static void compose_attach_property(GtkAction *action, gpointer data)
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); \
  \
        entry = gtk_entry_new(); \
+       gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE); \
        gtk_table_attach(GTK_TABLE(table), entry, 1, 2, top, (top + 1), \
                         GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0); \
 }
@@ -8717,9 +8730,7 @@ static void compose_attach_property_create(gboolean *cancelled)
 
        for (mime_type_list = strlist; mime_type_list != NULL; 
                mime_type_list = mime_type_list->next) {
-               gtk_combo_box_text_append_text(
-                       GTK_COMBO_BOX_TEXT(mimetype_entry),
-                       mime_type_list->data);
+               gtk_combo_box_append_text(GTK_COMBO_BOX(mimetype_entry), mime_type_list->data);
                g_free(mime_type_list->data);
        }
        g_list_free(strlist);
@@ -8800,11 +8811,11 @@ static gboolean attach_property_key_pressed(GtkWidget *widget,
                                            GdkEventKey *event,
                                            gboolean *cancelled)
 {
-       if (event && event->keyval == GDK_Escape) {
+       if (event && event->keyval == GDK_KEY_Escape) {
                *cancelled = TRUE;
                gtk_main_quit();
        }
-       if (event && event->keyval == GDK_Return) {
+       if (event && event->keyval == GDK_KEY_Return) {
                *cancelled = FALSE;
                gtk_main_quit();
                return TRUE;
@@ -9116,7 +9127,6 @@ static void compose_undo_state_changed(UndoMain *undostruct, gint undo_state,
  * includes "non-client" (windows-izm) in calculation, so this calculation
  * may not be accurate.
  */
-#if !GTK_CHECK_VERSION(2,24,0)
 static gboolean compose_edit_size_alloc(GtkEditable *widget,
                                        GtkAllocation *allocation,
                                        GtkSHRuler *shruler)
@@ -9131,14 +9141,13 @@ static gboolean compose_edit_size_alloc(GtkEditable *widget,
                        (allocation->width - allocation->x) / char_width;
 
                /* got the maximum */
-               gtk_ruler_set_range(GTK_RULER(shruler),
-                                   0.0, line_width_in_chars, 0,
-                                   /*line_width_in_chars*/ char_width);
+               gtk_shruler_set_range(GTK_SHRULER(shruler),
+                                   0.0, line_width_in_chars, 0);
        }
 
        return TRUE;
 }
-#endif
+
 typedef struct {
        gchar                   *header;
        gchar                   *entry;
@@ -9299,7 +9308,7 @@ static gboolean attach_key_pressed(GtkWidget *widget, GdkEventKey *event,
        if (!event) return FALSE;
 
        switch (event->keyval) {
-       case GDK_Delete:
+       case GDK_KEY_Delete:
                compose_attach_remove_selected(NULL, compose);
                break;
        }
@@ -9979,7 +9988,7 @@ static void compose_cut_cb(GtkAction *action, gpointer data)
        Compose *compose = (Compose *)data;
        if (compose->focused_editable 
 #ifndef GENERIC_UMPC
-           && gtkut_widget_has_focus(compose->focused_editable)
+           && gtk_widget_has_focus(compose->focused_editable)
 #endif
            )
                entry_cut_clipboard(compose->focused_editable);
@@ -9990,7 +9999,7 @@ static void compose_copy_cb(GtkAction *action, gpointer data)
        Compose *compose = (Compose *)data;
        if (compose->focused_editable 
 #ifndef GENERIC_UMPC
-           && gtkut_widget_has_focus(compose->focused_editable)
+           && gtk_widget_has_focus(compose->focused_editable)
 #endif
            )
                entry_copy_clipboard(compose->focused_editable);
@@ -10003,14 +10012,14 @@ static void compose_paste_cb(GtkAction *action, gpointer data)
        GtkTextBuffer *buffer;
        BLOCK_WRAP();
        if (compose->focused_editable &&
-           gtkut_widget_has_focus(compose->focused_editable))
+           gtk_widget_has_focus(compose->focused_editable))
                entry_paste_clipboard(compose, compose->focused_editable, 
                                prefs_common.linewrap_pastes,
                                GDK_SELECTION_CLIPBOARD, NULL);
        UNBLOCK_WRAP();
 
 #ifdef USE_ENCHANT
-       if (gtkut_widget_has_focus(compose->text) &&
+       if (gtk_widget_has_focus(compose->text) &&
            compose->gtkaspell && 
             compose->gtkaspell->check_while_typing)
                gtkaspell_highlight_all(compose->gtkaspell);
@@ -10023,7 +10032,7 @@ static void compose_paste_as_quote_cb(GtkAction *action, gpointer data)
        gint wrap_quote = prefs_common.linewrap_quote;
        if (compose->focused_editable 
 #ifndef GENERIC_UMPC
-           && gtkut_widget_has_focus(compose->focused_editable)
+           && gtk_widget_has_focus(compose->focused_editable)
 #endif
            ) {
                /* let text_insert() (called directly or at a later time
@@ -10052,7 +10061,7 @@ static void compose_paste_no_wrap_cb(GtkAction *action, gpointer data)
        BLOCK_WRAP();
        if (compose->focused_editable 
 #ifndef GENERIC_UMPC
-           && gtkut_widget_has_focus(compose->focused_editable)
+           && gtk_widget_has_focus(compose->focused_editable)
 #endif
            )
                entry_paste_clipboard(compose, compose->focused_editable, FALSE,
@@ -10060,7 +10069,7 @@ static void compose_paste_no_wrap_cb(GtkAction *action, gpointer data)
        UNBLOCK_WRAP();
 
 #ifdef USE_ENCHANT
-       if (gtkut_widget_has_focus(compose->text) &&
+       if (gtk_widget_has_focus(compose->text) &&
            compose->gtkaspell && 
             compose->gtkaspell->check_while_typing)
                gtkaspell_highlight_all(compose->gtkaspell);
@@ -10075,7 +10084,7 @@ static void compose_paste_wrap_cb(GtkAction *action, gpointer data)
        BLOCK_WRAP();
        if (compose->focused_editable 
 #ifndef GENERIC_UMPC
-           && gtkut_widget_has_focus(compose->focused_editable)
+           && gtk_widget_has_focus(compose->focused_editable)
 #endif
            )
                entry_paste_clipboard(compose, compose->focused_editable, TRUE,
@@ -10083,7 +10092,7 @@ static void compose_paste_wrap_cb(GtkAction *action, gpointer data)
        UNBLOCK_WRAP();
 
 #ifdef USE_ENCHANT
-       if (gtkut_widget_has_focus(compose->text) &&
+       if (gtk_widget_has_focus(compose->text) &&
            compose->gtkaspell &&
             compose->gtkaspell->check_while_typing)
                gtkaspell_highlight_all(compose->gtkaspell);
@@ -10095,7 +10104,7 @@ static void compose_allsel_cb(GtkAction *action, gpointer data)
        Compose *compose = (Compose *)data;
        if (compose->focused_editable 
 #ifndef GENERIC_UMPC
-           && gtkut_widget_has_focus(compose->focused_editable)
+           && gtk_widget_has_focus(compose->focused_editable)
 #endif
            )
                entry_allsel(compose->focused_editable);
@@ -10399,7 +10408,7 @@ static void compose_advanced_action_cb(GtkAction *gaction, gpointer data)
                {textview_delete_to_line_end}
        };
 
-       if (!gtkut_widget_has_focus(GTK_WIDGET(text))) return;
+       if (!gtk_widget_has_focus(GTK_WIDGET(text))) return;
 
        if (action >= COMPOSE_CALL_ADVANCED_ACTION_MOVE_BEGINNING_OF_LINE &&
            action <= COMPOSE_CALL_ADVANCED_ACTION_DELETE_TO_LINE_END) {
@@ -10412,6 +10421,8 @@ static void compose_advanced_action_cb(GtkAction *gaction, gpointer data)
 
 static void compose_grab_focus_cb(GtkWidget *widget, Compose *compose)
 {
+       GtkAllocation allocation;
+       GtkWidget *parent;
        gchar *str = NULL;
        
        if (GTK_IS_EDITABLE(widget)) {
@@ -10419,24 +10430,29 @@ static void compose_grab_focus_cb(GtkWidget *widget, Compose *compose)
                gtk_editable_set_position(GTK_EDITABLE(widget), 
                        strlen(str));
                g_free(str);
-               if (widget->parent && widget->parent->parent
-                && widget->parent->parent->parent) {
-                       if (GTK_IS_SCROLLED_WINDOW(widget->parent->parent->parent)) {
-                               gint y = widget->allocation.y;
-                               gint height = widget->allocation.height;
+               if ((parent = gtk_widget_get_parent(widget))
+                && (parent = gtk_widget_get_parent(parent))
+                && (parent = gtk_widget_get_parent(parent))) {
+                       if (GTK_IS_SCROLLED_WINDOW(parent)) {
+                               gtk_widget_get_allocation(widget, &allocation);
+                               gint y = allocation.y;
+                               gint height = allocation.height;
                                GtkAdjustment *shown = gtk_scrolled_window_get_vadjustment
-                                       (GTK_SCROLLED_WINDOW(widget->parent->parent->parent));
+                                       (GTK_SCROLLED_WINDOW(parent));
 
-                               if (y < (int)shown->value) {
-                                       gtk_adjustment_set_value(GTK_ADJUSTMENT(shown), y - 1);
+                               gfloat value = gtk_adjustment_get_value(shown);
+                               gfloat upper = gtk_adjustment_get_upper(shown);
+                               gfloat page_size = gtk_adjustment_get_page_size(shown);
+                               if (y < (int)value) {
+                                       gtk_adjustment_set_value(shown, y - 1);
                                }
-                               if (y + height > (int)shown->value + (int)shown->page_size) {
-                                       if (y - height - 1 < (int)shown->upper - (int)shown->page_size) {
-                                               gtk_adjustment_set_value(GTK_ADJUSTMENT(shown)
-                                                       y + height - (int)shown->page_size - 1);
+                               if ((y + height) > ((int)value + (int)page_size)) {
+                                       if ((y - height - 1) < ((int)upper - (int)page_size)) {
+                                               gtk_adjustment_set_value(shown
+                                                       y + height - (int)page_size - 1);
                                        } else {
-                                               gtk_adjustment_set_value(GTK_ADJUSTMENT(shown)
-                                                       (int)shown->upper - (int)shown->page_size - 1);
+                                               gtk_adjustment_set_value(shown
+                                                       (int)upper - (int)page_size - 1);
                                        }
                                }
                        }
@@ -10552,7 +10568,6 @@ static void activate_privacy_system(Compose *compose, PrefsAccount *account, gbo
        compose_update_privacy_system_menu_item(compose, warn);
 }
 
-#if !GTK_CHECK_VERSION(2,24,0)
 static void compose_toggle_ruler_cb(GtkToggleAction *action, gpointer data)
 {
        Compose *compose = (Compose *)data;
@@ -10566,7 +10581,7 @@ static void compose_toggle_ruler_cb(GtkToggleAction *action, gpointer data)
                prefs_common.show_ruler = FALSE;
        }
 }
-#endif
+
 static void compose_attach_drag_received_cb (GtkWidget         *widget,
                                             GdkDragContext     *context,
                                             gint                x,
@@ -10578,14 +10593,17 @@ static void compose_attach_drag_received_cb (GtkWidget                *widget,
 {
        Compose *compose = (Compose *)user_data;
        GList *list, *tmp;
+       GdkAtom type;
 
-       if (((gdk_atom_name(data->type) && !strcmp(gdk_atom_name(data->type), "text/uri-list"))
+       type = gtk_selection_data_get_data_type(data);
+       if (((gdk_atom_name(type) && !strcmp(gdk_atom_name(type), "text/uri-list"))
 #ifdef G_OS_WIN32
-        || (gdk_atom_name(data->type) && !strcmp(gdk_atom_name(data->type), "DROPFILES_DND"))
+        || (gdk_atom_name(type) && !strcmp(gdk_atom_name(type), "DROPFILES_DND"))
 #endif
           ) && gtk_drag_get_source_widget(context) != 
                summary_get_main_widget(mainwindow_get_mainwindow()->summaryview)) {
-               list = uri_list_extract_filenames((const gchar *)data->data);
+               list = uri_list_extract_filenames(
+                       (const gchar *)gtk_selection_data_get_data(data));
                for (tmp = list; tmp != NULL; tmp = tmp->next) {
                        gchar *utf8_filename = conv_filename_to_utf8((const gchar *)tmp->data);
                        compose_attach_append
@@ -10645,20 +10663,23 @@ static void compose_insert_drag_received_cb (GtkWidget                *widget,
 {
        Compose *compose = (Compose *)user_data;
        GList *list, *tmp;
+       GdkAtom type;
 
        /* strangely, testing data->type == gdk_atom_intern("text/uri-list", TRUE)
         * does not work */
+       type = gtk_selection_data_get_data_type(data);
 #ifndef G_OS_WIN32
-       if (gdk_atom_name(data->type) && !strcmp(gdk_atom_name(data->type), "text/uri-list")) {
+       if (gdk_atom_name(type) && !strcmp(gdk_atom_name(type), "text/uri-list")) {
 #else
-       if (gdk_atom_name(data->type) && !strcmp(gdk_atom_name(data->type), "DROPFILES_DND")) {
+       if (gdk_atom_name(type) && !strcmp(gdk_atom_name(type), "DROPFILES_DND")) {
 #endif
                AlertValue val = G_ALERTDEFAULT;
+               const gchar* ddata = (const gchar *)gtk_selection_data_get_data(data);
 
-               list = uri_list_extract_filenames((const gchar *)data->data);
-               if (list == NULL && strstr((gchar *)(data->data), "://")) {
+               list = uri_list_extract_filenames(ddata);
+               if (list == NULL && strstr(ddata, "://")) {
                        /* Assume a list of no files, and data has ://, is a remote link */
-                       gchar *tmpdata = g_strstrip(g_strdup((const gchar *)data->data));
+                       gchar *tmpdata = g_strstrip(g_strdup(ddata));
                        gchar *tmpfile = get_tmp_file();
                        str_write_to_file(tmpdata, tmpfile);
                        g_free(tmpdata);  
@@ -10732,7 +10753,7 @@ static void compose_header_drag_received_cb (GtkWidget          *widget,
                                             gpointer            user_data)
 {
        GtkEditable *entry = (GtkEditable *)user_data;
-       gchar *email = (gchar *)data->data;
+       const gchar *email = (const gchar *)gtk_selection_data_get_data(data);
 
        /* strangely, testing data->type == gdk_atom_intern("text/plain", TRUE)
         * does not work */
@@ -10741,8 +10762,7 @@ static void compose_header_drag_received_cb (GtkWidget          *widget,
                gchar *decoded=g_new(gchar, strlen(email));
                int start = 0;
 
-               email += strlen("mailto:");
-               decode_uri(decoded, email); /* will fit */
+               decode_uri(decoded, email + strlen("mailto:")); /* will fit */
                gtk_editable_delete_text(entry, 0, -1);
                gtk_editable_insert_text(entry, decoded, strlen(decoded), &start);
                gtk_drag_finish(drag_context, TRUE, FALSE, time);
@@ -10786,7 +10806,7 @@ static gboolean compose_headerentry_key_press_event_cb(GtkWidget *entry,
        if ((g_slist_length(headerentry->compose->header_list) > 0) &&
            ((headerentry->headernum + 1) != headerentry->compose->header_nextrow) &&
            !(event->state & GDK_MODIFIER_MASK) &&
-           (event->keyval == GDK_BackSpace) &&
+           (event->keyval == GDK_KEY_BackSpace) &&
            (strlen(gtk_entry_get_text(GTK_ENTRY(entry))) == 0)) {
                gtk_container_remove
                        (GTK_CONTAINER(headerentry->compose->header_table),
@@ -10798,7 +10818,7 @@ static gboolean compose_headerentry_key_press_event_cb(GtkWidget *entry,
                        g_slist_remove(headerentry->compose->header_list,
                                       headerentry);
                g_free(headerentry);
-       } else  if (event->keyval == GDK_Tab) {
+       } else  if (event->keyval == GDK_KEY_Tab) {
                if (headerentry->compose->header_last == headerentry) {
                        /* Override default next focus, and give it to subject_entry
                         * instead of notebook tabs
@@ -10850,9 +10870,13 @@ static void compose_show_first_last_header(Compose *compose, gboolean show_first
        cm_return_if_fail(compose);
        cm_return_if_fail(!compose->batch);
        cm_return_if_fail(GTK_IS_WIDGET(compose->header_table));
-       cm_return_if_fail(GTK_IS_VIEWPORT(compose->header_table->parent));
-       vadj = gtk_viewport_get_vadjustment(GTK_VIEWPORT(compose->header_table->parent));
-       gtk_adjustment_set_value(vadj, (show_first ? vadj->lower : (vadj->upper - vadj->page_size)));
+       cm_return_if_fail(GTK_IS_VIEWPORT(gtk_widget_get_parent(compose->header_table)));
+       vadj = gtk_viewport_get_vadjustment(GTK_VIEWPORT(
+                               gtk_widget_get_parent(compose->header_table)));
+       gtk_adjustment_set_value(vadj, (show_first ?
+                               gtk_adjustment_get_lower(vadj) :
+                               (gtk_adjustment_get_upper(vadj) -
+                               gtk_adjustment_get_page_size(vadj))));
        gtk_adjustment_changed(vadj);
 }
 
@@ -10967,7 +10991,7 @@ static void compose_check_all(GtkAction *action, gpointer data)
        if (!compose->gtkaspell)
                return;
                
-       if (gtkut_widget_has_focus(compose->subject_entry))
+       if (gtk_widget_has_focus(compose->subject_entry))
                claws_spell_entry_check_all(
                        CLAWS_SPELL_ENTRY(compose->subject_entry));             
        else
@@ -10992,7 +11016,7 @@ static void compose_check_backwards(GtkAction *action, gpointer data)
                return;
        }
 
-       if (gtkut_widget_has_focus(compose->subject_entry))
+       if (gtk_widget_has_focus(compose->subject_entry))
                claws_spell_entry_check_backwards(
                        CLAWS_SPELL_ENTRY(compose->subject_entry));
        else
@@ -11007,7 +11031,7 @@ static void compose_check_forwards_go(GtkAction *action, gpointer data)
                return;
        }
 
-       if (gtkut_widget_has_focus(compose->subject_entry))
+       if (gtk_widget_has_focus(compose->subject_entry))
                claws_spell_entry_check_forwards_go(
                        CLAWS_SPELL_ENTRY(compose->subject_entry));
        else