diff -up evolution-3.8.5/addressbook/gui/widgets/e-minicard.c.evo-auto-mark-as-seen evolution-3.8.5/addressbook/gui/widgets/e-minicard.c --- evolution-3.8.5/addressbook/gui/widgets/e-minicard.c.evo-auto-mark-as-seen 2013-07-23 14:52:21.000000000 +0200 +++ evolution-3.8.5/addressbook/gui/widgets/e-minicard.c 2014-05-13 14:50:29.824893563 +0200 @@ -631,8 +631,9 @@ e_minicard_event (GnomeCanvasItem *item, break; case GDK_MOTION_NOTIFY: if (e_minicard->drag_button_down && event->motion.state & GDK_BUTTON1_MASK) { - if (MAX (abs (e_minicard->button_x - event->motion.x), - abs (e_minicard->button_y - event->motion.y)) > 3) { + if (gtk_drag_check_threshold (GTK_WIDGET (item->canvas), + e_minicard->button_x, e_minicard->button_y, + event->motion.x, event->motion.y)) { gint ret_val; ret_val = e_minicard_drag_begin (e_minicard, event); diff -up evolution-3.8.5/calendar/gui/e-day-view.c.evo-auto-mark-as-seen evolution-3.8.5/calendar/gui/e-day-view.c --- evolution-3.8.5/calendar/gui/e-day-view.c.evo-auto-mark-as-seen 2013-07-23 14:52:29.000000000 +0200 +++ evolution-3.8.5/calendar/gui/e-day-view.c 2014-05-13 14:50:29.825893563 +0200 @@ -75,10 +75,6 @@ /* The number of timeouts we skip before we start scrolling. */ #define E_DAY_VIEW_AUTO_SCROLL_DELAY 5 -/* The number of pixels the mouse has to be moved with the button down before - * we start a drag. */ -#define E_DAY_VIEW_DRAG_START_OFFSET 4 - /* The amount we scroll the main canvas when the Page Up/Down keys are pressed, * as a fraction of the page size. */ #define E_DAY_VIEW_PAGE_STEP 0.5 @@ -4239,10 +4235,7 @@ e_day_view_on_top_canvas_motion (GtkWidg return FALSE; if (!e_cal_util_component_has_recurrences (event->comp_data->icalcomp) - && (abs (canvas_x - day_view->drag_event_x) - > E_DAY_VIEW_DRAG_START_OFFSET - || abs (canvas_y - day_view->drag_event_y) - > E_DAY_VIEW_DRAG_START_OFFSET)) { + && gtk_drag_check_threshold (widget, day_view->drag_event_x, day_view->drag_event_y, canvas_x, canvas_y)) { day_view->drag_event_day = day_view->pressed_event_day; day_view->drag_event_num = day_view->pressed_event_num; day_view->pressed_event_day = -1; @@ -4351,10 +4344,7 @@ e_day_view_on_main_canvas_motion (GtkWid && day_view->pressed_event_day != E_DAY_VIEW_LONG_EVENT) { GtkTargetList *target_list; - if ((abs (canvas_x - day_view->drag_event_x) - > E_DAY_VIEW_DRAG_START_OFFSET - || abs (canvas_y - day_view->drag_event_y) - > E_DAY_VIEW_DRAG_START_OFFSET)) { + if (gtk_drag_check_threshold (widget, day_view->drag_event_x, day_view->drag_event_y, canvas_x, canvas_y)) { day_view->drag_event_day = day_view->pressed_event_day; day_view->drag_event_num = day_view->pressed_event_num; day_view->pressed_event_day = -1; diff -up evolution-3.8.5/e-util/e-table-field-chooser-item.c.evo-auto-mark-as-seen evolution-3.8.5/e-util/e-table-field-chooser-item.c --- evolution-3.8.5/e-util/e-table-field-chooser-item.c.evo-auto-mark-as-seen 2013-07-23 14:52:11.000000000 +0200 +++ evolution-3.8.5/e-util/e-table-field-chooser-item.c 2014-05-13 14:50:29.825893563 +0200 @@ -548,14 +548,14 @@ etfci_maybe_start_drag (ETableFieldChoos gint x, gint y) { + GnomeCanvasItem *item; + if (!etfci->maybe_drag) return FALSE; - if (MAX (abs (etfci->click_x - x), - abs (etfci->click_y - y)) <= 3) - return FALSE; + item = GNOME_CANVAS_ITEM (etfci); - return TRUE; + return gtk_drag_check_threshold (GTK_WIDGET (item->canvas), etfci->click_x, etfci->click_y, x, y); } static void diff -up evolution-3.8.5/e-util/e-table-header-item.c.evo-auto-mark-as-seen evolution-3.8.5/e-util/e-table-header-item.c --- evolution-3.8.5/e-util/e-table-header-item.c.evo-auto-mark-as-seen 2013-08-10 23:38:42.000000000 +0200 +++ evolution-3.8.5/e-util/e-table-header-item.c 2014-05-13 14:50:29.825893563 +0200 @@ -1220,6 +1220,8 @@ static gboolean ethi_maybe_start_drag (ETableHeaderItem *ethi, GdkEventMotion *event) { + GnomeCanvasItem *item; + if (!ethi->maybe_drag) return FALSE; @@ -1228,11 +1230,9 @@ ethi_maybe_start_drag (ETableHeaderItem return FALSE; } - if (MAX (abs (ethi->click_x - event->x), - abs (ethi->click_y - event->y)) <= 3) - return FALSE; + item = GNOME_CANVAS_ITEM (ethi); - return TRUE; + return gtk_drag_check_threshold (GTK_WIDGET (item->canvas), ethi->click_x, ethi->click_y, event->x, event->y); } static void diff -up evolution-3.8.5/e-util/e-table-item.c.evo-auto-mark-as-seen evolution-3.8.5/e-util/e-table-item.c --- evolution-3.8.5/e-util/e-table-item.c.evo-auto-mark-as-seen 2013-08-03 15:22:52.000000000 +0200 +++ evolution-3.8.5/e-util/e-table-item.c 2014-05-13 14:50:29.826893563 +0200 @@ -2722,8 +2722,7 @@ eti_event (GnomeCanvasItem *item, gnome_canvas_item_w2i (item, &event_x_item, &event_y_item); if (eti->maybe_in_drag) { - if (abs (event_x_item - eti->drag_x) >= 3 || - abs (event_y_item - eti->drag_y) >= 3) { + if (gtk_drag_check_threshold (GTK_WIDGET (item->canvas), eti->drag_x, eti->drag_y, event_x_item, event_y_item)) { gboolean drag_handled; eti->maybe_in_drag = 0; diff -up evolution-3.8.5/mail/e-mail-reader.c.evo-auto-mark-as-seen evolution-3.8.5/mail/e-mail-reader.c --- evolution-3.8.5/mail/e-mail-reader.c.evo-auto-mark-as-seen 2013-07-23 14:51:57.000000000 +0200 +++ evolution-3.8.5/mail/e-mail-reader.c 2014-05-13 14:50:29.826893563 +0200 @@ -93,6 +93,11 @@ struct _EMailReaderPrivate { guint avoid_next_mark_as_seen : 1; guint group_by_threads : 1; + + /* to be able to start the mark_seen timeout only after + the message is loaded into the EMailDisplay */ + gboolean schedule_mark_seen; + guint schedule_mark_seen_interval; }; enum { @@ -2723,9 +2728,62 @@ mail_reader_message_seen_cb (EMailReader return FALSE; } -static gboolean +static void schedule_timeout_mark_seen (EMailReader *reader) { + EMailReaderPrivate *priv; + MessageList *message_list; + + g_return_if_fail (E_IS_MAIL_READER (reader)); + + priv = E_MAIL_READER_GET_PRIVATE (reader); + + message_list = MESSAGE_LIST (e_mail_reader_get_message_list (reader)); + g_return_if_fail (message_list != NULL); + + if (message_list->cursor_uid) { + EMailReaderClosure *timeout_closure; + + if (message_list->seen_id > 0) { + g_source_remove (message_list->seen_id); + message_list->seen_id = 0; + } + + timeout_closure = g_slice_new0 (EMailReaderClosure); + timeout_closure->reader = g_object_ref (reader); + timeout_closure->message_uid = g_strdup (message_list->cursor_uid); + + MESSAGE_LIST (message_list)->seen_id = + g_timeout_add_full ( + G_PRIORITY_DEFAULT, priv->schedule_mark_seen_interval, + (GSourceFunc) mail_reader_message_seen_cb, + timeout_closure, (GDestroyNotify) + mail_reader_closure_free); + } +} + +static void +mail_reader_load_status_changed_cb (EMailReader *reader, + GParamSpec *pspec, + EMailDisplay *display) +{ + EMailReaderPrivate *priv; + + if (webkit_web_view_get_load_status (WEBKIT_WEB_VIEW (display)) != WEBKIT_LOAD_FINISHED) + return; + + priv = E_MAIL_READER_GET_PRIVATE (reader); + if (priv->schedule_mark_seen && + E_IS_MAIL_VIEW (reader) && + e_mail_display_get_parts_list (display) && + e_mail_view_get_preview_visible (E_MAIL_VIEW (reader))) + schedule_timeout_mark_seen (reader); +} + +static gboolean +maybe_schedule_timeout_mark_seen (EMailReader *reader) +{ + EMailReaderPrivate *priv; EShell *shell; EMailBackend *backend; EShellBackend *shell_backend; @@ -2758,19 +2816,9 @@ schedule_timeout_mark_seen (EMailReader message_list->seen_id = 0; } - if (schedule_timeout) { - EMailReaderClosure *timeout_closure; - - timeout_closure = g_slice_new0 (EMailReaderClosure); - timeout_closure->reader = g_object_ref (reader); - timeout_closure->message_uid = g_strdup (message_uid); - - MESSAGE_LIST (message_list)->seen_id = g_timeout_add_full ( - G_PRIORITY_DEFAULT, timeout_interval, - (GSourceFunc) mail_reader_message_seen_cb, - timeout_closure, (GDestroyNotify) - mail_reader_closure_free); - } + priv = E_MAIL_READER_GET_PRIVATE (reader); + priv->schedule_mark_seen = schedule_timeout; + priv->schedule_mark_seen_interval = timeout_interval; return schedule_timeout; } @@ -2778,10 +2826,14 @@ schedule_timeout_mark_seen (EMailReader static gboolean discard_timeout_mark_seen_cb (EMailReader *reader) { + EMailReaderPrivate *priv; MessageList *message_list; g_return_val_if_fail (reader != NULL, FALSE); + priv = E_MAIL_READER_GET_PRIVATE (reader); + priv->schedule_mark_seen = FALSE; + message_list = MESSAGE_LIST (e_mail_reader_get_message_list (reader)); g_return_val_if_fail (message_list != NULL, FALSE); @@ -3009,7 +3061,7 @@ mail_reader_message_cursor_change_cb (EM E_IS_MAIL_VIEW (reader) && e_mail_view_get_preview_visible (E_MAIL_VIEW (reader)) && !priv->avoid_next_mark_as_seen) - schedule_timeout_mark_seen (reader); + maybe_schedule_timeout_mark_seen (reader); } static void @@ -3249,7 +3301,7 @@ mail_reader_message_loaded (EMailReader if (message != NULL && !priv->restoring_message_selection && !priv->avoid_next_mark_as_seen && - schedule_timeout_mark_seen (reader)) { + maybe_schedule_timeout_mark_seen (reader)) { g_clear_error (&error); } else if (error != NULL) { e_alert_submit ( @@ -4118,6 +4170,10 @@ connect_signals: G_CALLBACK (mail_reader_key_press_event_cb), reader); g_signal_connect_swapped ( + display, "notify::load-status", + G_CALLBACK (mail_reader_load_status_changed_cb), reader); + + g_signal_connect_swapped ( message_list, "message-selected", G_CALLBACK (mail_reader_message_selected_cb), reader);