[evolution/gnome-41] I#1721 - Calendar: Leftover tooltip after event delete
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution/gnome-41] I#1721 - Calendar: Leftover tooltip after event delete
- Date: Wed, 1 Dec 2021 11:18:39 +0000 (UTC)
commit 3b7c7a85e5d487cd6ada8dc68e6ad274f33ad944
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 867e77c426..a47a83a3cb 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 893303ea3a..8af00a7cd7 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]