[gnome-calendar] month-view: fix various reference issues with GDateTime
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-calendar] month-view: fix various reference issues with GDateTime
- Date: Wed, 18 May 2016 14:23:29 +0000 (UTC)
commit 692a9639a319ac05abcebd2d6fb224cd932bfaba
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Wed May 18 11:20:00 2016 -0300
month-view: fix various reference issues with GDateTime
The current code does multiple needless unrefs, uses the
GDateTime API in a wrongly manner and leaks references
all around.
This causes the Calendar application to emit multiple warning
messages and in the worst case, crash immediately.
Fix that by rewriting the critical sections of the code that
deals with the start and end mark cells.
https://bugzilla.gnome.org/show_bug.cgi?id=763641
src/gcal-month-view.c | 52 +++++++++++++++++++++++++++++++++++++-----------
1 files changed, 40 insertions(+), 12 deletions(-)
---
diff --git a/src/gcal-month-view.c b/src/gcal-month-view.c
index 96c52d3..7dde81e 100644
--- a/src/gcal-month-view.c
+++ b/src/gcal-month-view.c
@@ -261,12 +261,13 @@ show_popover_for_position (GcalMonthView *view,
if (priv->start_mark_cell == NULL)
return FALSE;
- if (priv->pressed_overflow_indicator != -1 && !g_date_time_equal (priv->start_mark_cell,
priv->end_mark_cell) &&
+ if (priv->pressed_overflow_indicator != -1 &&
+ g_date_time_equal (start_dt, end_dt) &&
g_hash_table_contains (ppriv->overflow_cells, GINT_TO_POINTER (priv->pressed_overflow_indicator)))
{
priv->hovered_overflow_indicator = priv->pressed_overflow_indicator;
- rebuild_popover_for_day (GCAL_MONTH_VIEW (widget), g_date_time_get_day_of_month (priv->end_mark_cell));
+ rebuild_popover_for_day (GCAL_MONTH_VIEW (widget), g_date_time_get_day_of_month (end_dt));
gtk_widget_show_all (priv->overflow_popover);
gtk_widget_queue_draw (widget);
@@ -287,7 +288,7 @@ show_popover_for_position (GcalMonthView *view,
}
/* Only setup an end date when days are different */
- if (g_date_time_compare (priv->start_mark_cell, priv->end_mark_cell))
+ if (!g_date_time_compare (start_dt, end_dt))
{
GDateTime *tmp_dt;
@@ -301,9 +302,6 @@ show_popover_for_position (GcalMonthView *view,
}
g_signal_emit_by_name (GCAL_VIEW (widget), "create-event", start_dt, end_dt, x, y);
-
- g_clear_pointer (&start_dt, g_date_time_unref);
- g_clear_pointer (&end_dt, g_date_time_unref);
}
gtk_widget_queue_draw (widget);
@@ -1870,10 +1868,13 @@ gcal_month_view_button_press (GtkWidget *widget,
if (clicked_cell >= priv->days_delay && clicked_cell < days)
{
+ g_clear_pointer (&priv->start_mark_cell, g_date_time_unref);
+
priv->keyboard_cell = clicked_cell;
priv->start_mark_cell = g_date_time_new_local (priv->date->year, priv->date->month,
- priv->keyboard_cell - priv->days_delay + 1,
- 0, 0, 0);
+ priv->keyboard_cell - priv->days_delay + 1,
+ 0, 0, 0);
+ gtk_widget_queue_draw (widget);
}
if (pressed_indicator && g_hash_table_contains (ppriv->overflow_cells, GINT_TO_POINTER (clicked_cell)))
@@ -1916,14 +1917,39 @@ gcal_month_view_motion_notify_event (GtkWidget *widget,
if (new_end_cell >= priv->days_delay && new_end_cell < days)
{
+ guint previous_end_cell;
+
+ previous_end_cell = new_end_cell;
+
+ /* Let the keyboard focus track the pointer */
priv->keyboard_cell = new_end_cell;
- if (g_date_time_compare (priv->start_mark_cell, priv->end_mark_cell))
- priv->hovered_overflow_indicator = -1;
- if (g_date_time_get_day_of_month (priv->end_mark_cell) + priv->days_delay - 1 != new_end_cell)
+ /*
+ * When there is a previously set end mark, it should be
+ * cleared before assigning a new one.
+ */
+ if (priv->end_mark_cell)
+ {
+ previous_end_cell = g_date_time_get_day_of_month (priv->end_mark_cell) - 1;
+
+ g_clear_pointer (&priv->end_mark_cell, g_date_time_unref);
+ }
+
+ if (priv->start_mark_cell &&
+ priv->end_mark_cell &&
+ !g_date_time_equal (priv->start_mark_cell, priv->end_mark_cell))
+ {
+ priv->hovered_overflow_indicator = -1;
+ }
+
+ if (previous_end_cell != new_end_cell)
gtk_widget_queue_draw (widget);
- priv->end_mark_cell = g_date_time_new_local (priv->date->year, priv->date->month, new_end_cell -
priv->days_delay + 1, 0, 0, 0);
+ priv->end_mark_cell = g_date_time_new_local (priv->date->year,
+ priv->date->month,
+ new_end_cell - priv->days_delay + 1,
+ 0, 0, 0);
+
return TRUE;
}
}
@@ -1965,6 +1991,8 @@ gcal_month_view_button_release (GtkWidget *widget,
if (current_day >= priv->days_delay && current_day < days)
{
+ g_clear_pointer (&priv->end_mark_cell, g_date_time_unref);
+
priv->keyboard_cell = current_day;
priv->end_mark_cell = g_date_time_new_local (priv->date->year, priv->date->month, current_day -
priv->days_delay + 1, 0, 0, 0);
return show_popover_for_position (GCAL_MONTH_VIEW (widget), x, y, released_indicator);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]