[evolution] I#1721 - Calendar: Leftover tooltip after event delete



commit 8a9e3596061317178f17a70a74a9252adcb50a35
Author: Milan Crha <mcrha redhat com>
Date:   Wed Dec 1 12:16:38 2021 +0100

    I#1721 - Calendar: Leftover tooltip after event delete
    
    Closes https://gitlab.gnome.org/GNOME/evolution/-/issues/1721

 src/calendar/gui/e-calendar-view.c | 11 ++++-
 src/calendar/gui/e-day-view.c      | 88 ++++++++++++++++++++++++++------------
 src/calendar/gui/e-week-view.c     | 88 +++++++++++++++++++++-----------------
 3 files changed, 118 insertions(+), 69 deletions(-)
---
diff --git a/src/calendar/gui/e-calendar-view.c b/src/calendar/gui/e-calendar-view.c
index bb9ff3aa4c..35b2b6d0d3 100644
--- a/src/calendar/gui/e-calendar-view.c
+++ b/src/calendar/gui/e-calendar-view.c
@@ -1864,12 +1864,19 @@ e_calendar_view_destroy_tooltip (ECalendarView *cal_view)
 {
        GtkWidget *widget;
        GObject *object;
+       guint timeout;
 
        g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
 
        object = G_OBJECT (cal_view);
-       widget = g_object_get_data (object, "tooltip-window");
 
+       timeout = GPOINTER_TO_UINT (g_object_get_data (object, "tooltip-timeout"));
+       if (timeout) {
+               g_source_remove (timeout);
+               g_object_set_data (object, "tooltip-timeout", NULL);
+       }
+
+       widget = g_object_get_data (object, "tooltip-window");
        if (widget) {
                gtk_widget_destroy (widget);
                g_object_set_data (object, "tooltip-window", NULL);
@@ -2180,7 +2187,7 @@ e_calendar_view_get_tooltips (const ECalendarViewEventData *data)
        g_signal_connect (
                pevent->tooltip, "key-press-event",
                G_CALLBACK (tooltip_key_event), data->cal_view);
-       pevent->timeout = -1;
+       pevent->timeout = 0;
 
        g_object_set_data (G_OBJECT (data->cal_view), "tooltip-window", pevent->tooltip);
        g_object_unref (newcomp);
diff --git a/src/calendar/gui/e-day-view.c b/src/calendar/gui/e-day-view.c
index ce243756e3..d772b2175f 100644
--- a/src/calendar/gui/e-day-view.c
+++ b/src/calendar/gui/e-day-view.c
@@ -3170,6 +3170,31 @@ e_day_view_foreach_event_with_uid (EDayView *day_view,
        }
 }
 
+static void
+e_day_view_maybe_destroy_event_tooltip (EDayView *day_view,
+                                       EDayViewEvent *event)
+{
+       GObject *object = G_OBJECT (day_view);
+
+       if (event->timeout > 0 && GPOINTER_TO_UINT (g_object_get_data (object, "tooltip-timeout")) == 
event->timeout) {
+               g_source_remove (event->timeout);
+               event->timeout = 0;
+
+               g_object_set_data (object, "tooltip-timeout", NULL);
+       } else {
+               event->timeout = 0;
+       }
+
+       if (event->tooltip && event->tooltip == g_object_get_data (object, "tooltip-window")) {
+               gtk_widget_destroy (event->tooltip);
+               event->tooltip = NULL;
+
+               g_object_set_data (object, "tooltip-window", NULL);
+       } else {
+               event->tooltip = NULL;
+       }
+}
+
 static gboolean
 e_day_view_remove_event_cb (EDayView *day_view,
                             gint day,
@@ -3209,10 +3234,7 @@ e_day_view_remove_event_cb (EDayView *day_view,
                day_view->popup_event_num--;
        }
 
-       if (event->timeout > 0) {
-               g_source_remove (event->timeout);
-               event->timeout = -1;
-       }
+       e_day_view_maybe_destroy_event_tooltip (day_view, event);
 
        if (day_view->resize_bars_event_num >= event_num && day_view->resize_bars_event_day == day) {
                if (day_view->resize_bars_event_num == event_num) {
@@ -4433,6 +4455,8 @@ e_day_view_on_main_canvas_scroll (GtkWidget *widget,
                                   GdkEventScroll *scroll,
                                   EDayView *day_view)
 {
+       e_calendar_view_destroy_tooltip (E_CALENDAR_VIEW (day_view));
+
        switch (scroll->direction) {
        case GDK_SCROLL_UP:
                e_day_view_scroll (day_view, E_DAY_VIEW_WHEEL_MOUSE_STEP_SIZE);
@@ -4458,6 +4482,8 @@ e_day_view_on_top_canvas_scroll (GtkWidget *widget,
                                   GdkEventScroll *scroll,
                                   EDayView *day_view)
 {
+       e_calendar_view_destroy_tooltip (E_CALENDAR_VIEW (day_view));
+
        switch (scroll->direction) {
        case GDK_SCROLL_UP:
                e_day_view_top_scroll (day_view, E_DAY_VIEW_WHEEL_MOUSE_STEP_SIZE);
@@ -4853,13 +4879,7 @@ e_day_view_show_popup_menu (EDayView *day_view,
                             gint day,
                             gint event_num)
 {
-       EDayViewEvent *pevent = NULL;
-
-       if (event_num >= 0)
-               pevent = tooltip_get_view_event (day_view, day, event_num);
-
-       if (pevent && pevent->canvas_item)
-               tooltip_destroy (day_view, pevent->canvas_item);
+       e_calendar_view_destroy_tooltip (E_CALENDAR_VIEW (day_view));
 
        e_day_view_set_popup_event (day_view, day, event_num);
 
@@ -5728,13 +5748,12 @@ e_day_view_free_event_array (EDayView *day_view,
                if (is_comp_data_valid (event))
                        g_object_unref (event->comp_data);
 
-               if (event->timeout > 0) {
-                       g_source_remove (event->timeout);
-                       event->timeout = -1;
-               }
+               e_day_view_maybe_destroy_event_tooltip (day_view, event);
        }
 
        g_array_set_size (array, 0);
+
+       e_calendar_view_destroy_tooltip (E_CALENDAR_VIEW (day_view));
 }
 
 /* This adds one event to the view, adding it to the appropriate array. */
@@ -5750,6 +5769,7 @@ e_day_view_add_event (ESourceRegistry *registry,
        EDayViewEvent event;
        gint day, offset;
        gint days_shown;
+       guint tooltip_timeout;
        ICalTime *start_tt, *end_tt;
        ICalTimezone *zone;
        AddEventData *add_event_data;
@@ -5771,6 +5791,12 @@ e_day_view_add_event (ESourceRegistry *registry,
        if (end != start || end < add_event_data->day_view->lower)
                g_return_if_fail (end > add_event_data->day_view->lower);
 
+       tooltip_timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (add_event_data->day_view), 
"tooltip-timeout"));
+       if (tooltip_timeout) {
+               g_source_remove (tooltip_timeout);
+               g_object_set_data (G_OBJECT (add_event_data->day_view), "tooltip-timeout", NULL);
+       }
+
        zone = e_calendar_view_get_timezone (E_CALENDAR_VIEW (add_event_data->day_view));
        start_tt = i_cal_time_new_from_timet_with_zone (start, FALSE, zone);
        end_tt = i_cal_time_new_from_timet_with_zone (end, FALSE, zone);
@@ -5853,7 +5879,6 @@ e_day_view_add_event (ESourceRegistry *registry,
        g_array_append_val (add_event_data->day_view->long_events, event);
        add_event_data->day_view->long_events_sorted = FALSE;
        add_event_data->day_view->long_events_need_layout = TRUE;
-       return;
 }
 
 /* This lays out the short (less than 1 day) events in the columns.
@@ -7376,12 +7401,7 @@ static void
 tooltip_destroy (EDayView *day_view,
                  GnomeCanvasItem *item)
 {
-       GtkWidget *tooltip = g_object_get_data (G_OBJECT (day_view), "tooltip-window");
-
-       if (tooltip) {
-               gtk_widget_destroy (tooltip);
-               g_object_set_data (G_OBJECT (day_view), "tooltip-window", NULL);
-       }
+       e_calendar_view_destroy_tooltip (E_CALENDAR_VIEW (day_view));
 
        if (item) {
                EDayViewEvent *pevent;
@@ -7394,14 +7414,23 @@ tooltip_destroy (EDayView *day_view,
                pevent = tooltip_get_view_event (day_view, day, event_num);
                if (pevent) {
                        pevent->tooltip = NULL;
-                       if (pevent->timeout != -1) {
-                               g_source_remove (pevent->timeout);
-                               pevent->timeout = -1;
-                       }
+                       pevent->timeout = 0;
                }
        }
 }
 
+static void
+e_day_view_destroy_tooltip_timeout_data (gpointer ptr)
+{
+       ECalendarViewEventData *data = ptr;
+
+       if (data) {
+               g_object_set_data (G_OBJECT (data->cal_view), "tooltip-timeout", NULL);
+               g_object_unref (data->cal_view);
+               g_free (data);
+       }
+}
+
 static gboolean
 e_day_view_on_text_item_event (GnomeCanvasItem *item,
                                GdkEvent *event,
@@ -7540,19 +7569,22 @@ e_day_view_on_text_item_event (GnomeCanvasItem *item,
                        g_object_set_data (G_OBJECT (item), "event-num", GINT_TO_POINTER (event_num));
                        g_object_set_data (G_OBJECT (item), "event-day", GINT_TO_POINTER (day));
 
+                       e_calendar_view_destroy_tooltip (E_CALENDAR_VIEW (day_view));
+
                        data = g_malloc (sizeof (ECalendarViewEventData));
                        pevent->x = ((GdkEventCrossing *) event)->x_root;
                        pevent->y = ((GdkEventCrossing *) event)->y_root;
                        pevent->tooltip = NULL;
 
-                       data->cal_view = (ECalendarView *) day_view;
+                       data->cal_view = g_object_ref (E_CALENDAR_VIEW (day_view));
                        data->day = day;
                        data->event_num = event_num;
                        data->get_view_event = (ECalendarViewEvent * (*)(ECalendarView *, int, gint)) 
tooltip_get_view_event;
                        pevent->timeout = e_named_timeout_add_full (
                                G_PRIORITY_DEFAULT, 500,
                                (GSourceFunc) e_calendar_view_get_tooltips,
-                               data, (GDestroyNotify) g_free);
+                               data, e_day_view_destroy_tooltip_timeout_data);
+                       g_object_set_data (G_OBJECT (day_view), "tooltip-timeout", GUINT_TO_POINTER 
(pevent->timeout));
 
                return TRUE;
                }
diff --git a/src/calendar/gui/e-week-view.c b/src/calendar/gui/e-week-view.c
index fdf031d16c..a9146172ed 100644
--- a/src/calendar/gui/e-week-view.c
+++ b/src/calendar/gui/e-week-view.c
@@ -2743,6 +2743,31 @@ e_week_view_foreach_event_with_uid (EWeekView *week_view,
        }
 }
 
+static void
+e_week_view_maybe_destroy_event_tooltip (EWeekView *week_view,
+                                        EWeekViewEvent *event)
+{
+       GObject *object = G_OBJECT (week_view);
+
+       if (event->timeout > 0 && GPOINTER_TO_UINT (g_object_get_data (object, "tooltip-timeout")) == 
event->timeout) {
+               g_source_remove (event->timeout);
+               event->timeout = 0;
+
+               g_object_set_data (object, "tooltip-timeout", NULL);
+       } else {
+               event->timeout = 0;
+       }
+
+       if (event->tooltip && event->tooltip == g_object_get_data (object, "tooltip-window")) {
+               gtk_widget_destroy (event->tooltip);
+               event->tooltip = NULL;
+
+               g_object_set_data (object, "tooltip-window", NULL);
+       } else {
+               event->tooltip = NULL;
+       }
+}
+
 static gboolean
 e_week_view_remove_event_cb (EWeekView *week_view,
                              gint event_num,
@@ -2757,6 +2782,8 @@ e_week_view_remove_event_cb (EWeekView *week_view,
 
        event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
 
+       e_week_view_maybe_destroy_event_tooltip (week_view, event);
+
        /* If we were editing this event, set editing_event_num to -1 so
         * on_editing_stopped doesn't try to update the event. */
        if (week_view->editing_event_num == event_num) {
@@ -3099,19 +3126,8 @@ e_week_view_on_scroll (GtkWidget *widget,
        gdouble lower;
        gdouble upper;
        gdouble value;
-       GtkWidget *tool_window = g_object_get_data (G_OBJECT (week_view), "tooltip-window");
-       guint timeout;
 
-       timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (week_view), "tooltip-timeout"));
-       if (timeout) {
-               g_source_remove (timeout);
-               g_object_set_data (G_OBJECT (week_view), "tooltip-timeout", NULL);
-       }
-
-       if (tool_window) {
-               gtk_widget_destroy (tool_window);
-               g_object_set_data (G_OBJECT (week_view), "tooltip-window", NULL);
-       }
+       e_calendar_view_destroy_tooltip (E_CALENDAR_VIEW (week_view));
 
        range = GTK_RANGE (week_view->vscrollbar);
        adjustment = gtk_range_get_adjustment (range);
@@ -3281,7 +3297,6 @@ e_week_view_free_events (EWeekView *week_view)
        EWeekViewEventSpan *span;
        gint event_num, span_num, num_days, day;
        gboolean did_editing = week_view->editing_event_num != -1;
-       guint timeout;
 
        /* Reset all our indices. */
        week_view->pressed_event_num = -1;
@@ -3294,6 +3309,8 @@ e_week_view_free_events (EWeekView *week_view)
                event = &g_array_index (week_view->events, EWeekViewEvent,
                                        event_num);
 
+               e_week_view_maybe_destroy_event_tooltip (week_view, event);
+
                if (is_comp_data_valid (event))
                        g_object_unref (event->comp_data);
        }
@@ -3329,11 +3346,7 @@ e_week_view_free_events (EWeekView *week_view)
        if (did_editing)
                g_object_notify (G_OBJECT (week_view), "is-editing");
 
-       timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (week_view), "tooltip-timeout"));
-       if (timeout) {
-               g_source_remove (timeout);
-               g_object_set_data (G_OBJECT (week_view), "tooltip-timeout", NULL);
-       }
+       e_calendar_view_destroy_tooltip (E_CALENDAR_VIEW (week_view));
 }
 
 /* This adds one event to the view, adding it to the appropriate array. */
@@ -3349,6 +3362,7 @@ e_week_view_add_event (ECalClient *client,
        AddEventData *add_event_data;
        EWeekViewEvent event;
        gint num_days;
+       guint tooltip_timeout;
        ICalTime *start_tt, *end_tt;
 
        add_event_data = data;
@@ -3362,6 +3376,12 @@ e_week_view_add_event (ECalClient *client,
        if (end != start || end < add_event_data->week_view->day_starts[0])
                g_return_if_fail (end > add_event_data->week_view->day_starts[0]);
 
+       tooltip_timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (add_event_data->week_view), 
"tooltip-timeout"));
+       if (tooltip_timeout) {
+               g_source_remove (tooltip_timeout);
+               g_object_set_data (G_OBJECT (add_event_data->week_view), "tooltip-timeout", NULL);
+       }
+
        start_tt = i_cal_time_new_from_timet_with_zone (
                start, FALSE,
                e_calendar_view_get_timezone (E_CALENDAR_VIEW (add_event_data->week_view)));
@@ -3588,26 +3608,17 @@ tooltip_destroy (EWeekView *week_view,
 {
        gint event_num;
        EWeekViewEvent *pevent;
-       guint timeout;
 
        e_week_view_check_layout (week_view);
 
-       event_num = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item), "event-num"));
-
-       timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (week_view), "tooltip-timeout"));
-       if (timeout) {
-               g_source_remove (timeout);
-               g_object_set_data (G_OBJECT (week_view), "tooltip-timeout", NULL);
-       }
+       e_calendar_view_destroy_tooltip (E_CALENDAR_VIEW (week_view));
 
+       event_num = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item), "event-num"));
        pevent = tooltip_get_view_event (week_view, -1, event_num);
-       if (pevent) {
-               if (pevent->tooltip && g_object_get_data (G_OBJECT (week_view), "tooltip-window")) {
-                       gtk_widget_destroy (pevent->tooltip);
-                       pevent->tooltip = NULL;
-               }
 
-               g_object_set_data (G_OBJECT (week_view), "tooltip-window", NULL);
+       if (pevent) {
+               pevent->tooltip = NULL;
+               pevent->timeout = 0;
        }
 }
 
@@ -3653,6 +3664,9 @@ tooltip_event_cb (GnomeCanvasItem *item,
                        ECalendarViewEventData *data;
 
                        g_return_val_if_fail (pevent != NULL, FALSE);
+
+                       e_calendar_view_destroy_tooltip (E_CALENDAR_VIEW (view));
+
                        data = g_malloc (sizeof (ECalendarViewEventData));
 
                        pevent->x = ((GdkEventCrossing *) event)->x_root;
@@ -4377,6 +4391,8 @@ e_week_view_on_text_item_event (GnomeCanvasItem *item,
                pevent = tooltip_get_view_event (week_view, -1, nevent);
                g_return_val_if_fail (pevent != NULL, FALSE);
 
+               e_calendar_view_destroy_tooltip (E_CALENDAR_VIEW (week_view));
+
                data = g_malloc (sizeof (ECalendarViewEventData));
 
                gdk_event_get_root_coords (
@@ -5174,13 +5190,7 @@ e_week_view_show_popup_menu (EWeekView *week_view,
                              GdkEvent *button_event,
                              gint event_num)
 {
-       guint timeout;
-
-       timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (week_view), "tooltip-timeout"));
-       if (timeout) {
-               g_source_remove (timeout);
-               g_object_set_data (G_OBJECT (week_view), "tooltip-timeout", NULL);
-       }
+       e_calendar_view_destroy_tooltip (E_CALENDAR_VIEW (week_view));
 
        e_week_view_set_popup_event (week_view, event_num);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]