static void gtk_calendar_focus_controller_focus (GtkEventController *controller,
GtkWidget *widget);
+static void calendar_select_day_internal (GtkCalendar *calendar,
+ GDateTime *date,
+ gboolean emit_day_signal);
+
static void calendar_invalidate_day (GtkCalendar *widget,
int row,
int col);
0, 0, 0);
g_date_free (date);
- gtk_calendar_select_day (calendar, datetime);
+ calendar_select_day_internal (calendar, datetime, TRUE);
g_date_time_unref (datetime);
return TRUE;
/* Select current day */
calendar->date = g_date_time_new_from_unix_local (0);
now = g_date_time_new_now_local ();
- gtk_calendar_select_day (calendar, now);
+ calendar_select_day_internal (calendar, now, FALSE);
g_date_time_unref (now);
/* We just initialized the year label, now add some space to it so
new_date = g_date_time_add_months (calendar->date, -1);
- gtk_calendar_select_day (calendar, new_date);
+ calendar_select_day_internal (calendar, new_date, FALSE);
g_date_time_unref (new_date);
g_signal_emit (calendar, gtk_calendar_signals[PREV_MONTH_SIGNAL], 0);
new_date = g_date_time_add_months (calendar->date, 1);
- gtk_calendar_select_day (calendar, new_date);
+ calendar_select_day_internal (calendar, new_date, FALSE);
g_date_time_unref (new_date);
g_signal_emit (calendar, gtk_calendar_signals[NEXT_MONTH_SIGNAL], 0);
new_date = g_date_time_add_years (calendar->date, -1);
- gtk_calendar_select_day (calendar, new_date);
+ calendar_select_day_internal (calendar, new_date, FALSE);
g_date_time_unref (new_date);
g_signal_emit (calendar, gtk_calendar_signals[PREV_YEAR_SIGNAL], 0);
new_date = g_date_time_add_years (calendar->date, 1);
- gtk_calendar_select_day (calendar, new_date);
+ calendar_select_day_internal (calendar, new_date, FALSE);
g_date_time_unref (new_date);
g_signal_emit (calendar, gtk_calendar_signals[NEXT_YEAR_SIGNAL], 0);
}
}
+static void
+calendar_select_day_internal (GtkCalendar *calendar,
+ GDateTime *date,
+ gboolean emit_day_signal)
+{
+ GDateTime *today;
+ int new_day, new_month, new_year;
+ gboolean day_changed, month_changed, year_changed;
+ char buffer[255];
+ char *str;
+ time_t tmp_time;
+ struct tm *tm;
+ int i;
+ int x, y;
+ int today_day;
+
+ day_changed = g_date_time_get_day_of_month (calendar->date) != g_date_time_get_day_of_month (date);
+ month_changed = g_date_time_get_month (calendar->date) != g_date_time_get_month (date);
+ year_changed = g_date_time_get_year (calendar->date) != g_date_time_get_year (date);
+
+ if (!day_changed && !month_changed && !year_changed)
+ return;
+
+ new_year = g_date_time_get_year (date);
+ new_month = g_date_time_get_month (date);
+ new_day = g_date_time_get_day_of_month (date);
+
+ g_date_time_unref (calendar->date);
+ calendar->date = g_date_time_ref (date);
+
+ tmp_time = 1; /* Jan 1 1970, 00:00:01 UTC */
+ tm = gmtime (&tmp_time);
+ tm->tm_year = new_year - 1900;
+
+ /* Translators: This dictates how the year is displayed in
+ * gtkcalendar widget. See strftime() manual for the format.
+ * Use only ASCII in the translation.
+ *
+ * "%Y" is appropriate for most locales.
+ */
+ strftime (buffer, sizeof (buffer), C_("calendar year format", "%Y"), tm);
+ str = g_locale_to_utf8 (buffer, -1, NULL, NULL, NULL);
+ gtk_label_set_label (GTK_LABEL (calendar->year_label), str);
+ g_free (str);
+
+ /* Update month */
+
+ calendar_compute_days (calendar);
+ gtk_stack_set_visible_child_name (GTK_STACK (calendar->month_name_stack),
+ default_monthname[new_month - 1]);
+
+ today = g_date_time_new_now_local ();
+
+ if (g_date_time_get_year (calendar->date) == g_date_time_get_year (today) &&
+ g_date_time_get_month (calendar->date) == g_date_time_get_month (today))
+ today_day = g_date_time_get_day_of_month (today);
+ else
+ today_day = -1;
+
+ g_date_time_unref (today);
+
+ /* Update day labels */
+ for (y = 0; y < 6; y ++)
+ for (x = 0; x < 7; x ++)
+ {
+ const int day = calendar->day[y][x];
+ GtkWidget *label = calendar->day_number_labels[y][x];
+ /* Translators: this defines whether the day numbers should use
+ * localized digits or the ones used in English (0123...).
+ *
+ * Translate to "%Id" if you want to use localized digits, or
+ * translate to "%d" otherwise.
+ *
+ * Note that translating this doesn't guarantee that you get localized
+ * digits. That needs support from your system and locale definition
+ * too.
+ */
+ g_snprintf (buffer, sizeof (buffer), C_("calendar:day:digits", "%d"), day);
+
+ gtk_label_set_label (GTK_LABEL (label), buffer);
+
+ if (calendar->day_month[y][x] == MONTH_PREV ||
+ calendar->day_month[y][x] == MONTH_NEXT)
+ gtk_widget_add_css_class (label, "other-month");
+ else
+ gtk_widget_remove_css_class (label, "other-month");
+
+ if (calendar->marked_date[day-1] &&
+ calendar->day_month[y][x] == MONTH_CURRENT)
+ gtk_widget_set_state_flags (label, GTK_STATE_FLAG_CHECKED, FALSE);
+ else
+ gtk_widget_unset_state_flags (label, GTK_STATE_FLAG_CHECKED);
+
+ if (new_day == day &&
+ calendar->day_month[y][x] == MONTH_CURRENT)
+ gtk_widget_set_state_flags (label, GTK_STATE_FLAG_SELECTED, FALSE);
+ else
+ gtk_widget_unset_state_flags (label, GTK_STATE_FLAG_SELECTED);
+
+ if (calendar->focus_row == y && calendar->focus_col == x)
+ gtk_widget_set_state_flags (label, GTK_STATE_FLAG_FOCUSED, FALSE);
+ else
+ gtk_widget_unset_state_flags (label, GTK_STATE_FLAG_FOCUSED);
+
+ if (day == today_day &&
+ calendar->day_month[y][x] == MONTH_CURRENT)
+ gtk_widget_add_css_class (label, "today");
+ else
+ gtk_widget_remove_css_class (label, "today");
+ }
+
+ /* Update week number labels.
+ * We simply get the week number of calendar->date and add the others.
+ * simple. */
+ for (i = 0; i < 6; i ++)
+ {
+ int year = new_year;
+ int month, week;
+
+ month = new_month + calendar->day_month[i][6] - MONTH_CURRENT;
+
+ if (month < 1)
+ {
+ month += 12;
+ year -= 1;
+ }
+ else if (month > 12)
+ {
+ month -= 12;
+ year += 1;
+ }
+
+ week = week_of_year (year, month, calendar->day[i][6]);
+
+ /* Translators: this defines whether the week numbers should use
+ * localized digits or the ones used in English (0123...).
+ *
+ * Translate to "%Id" if you want to use localized digits, or
+ * translate to "%d" otherwise.
+ * Note that translating this doesn't guarantee that you get localized
+ * digits. That needs support from your system and locale definition
+ * too. */
+ g_snprintf (buffer, sizeof (buffer), C_("calendar:week:digits", "%d"), week);
+
+ gtk_label_set_label (GTK_LABEL (calendar->week_number_labels[i]), buffer);
+ }
+
+ if (day_changed)
+ {
+ g_object_notify (G_OBJECT (calendar), "day");
+
+ if (emit_day_signal)
+ g_signal_emit (calendar, gtk_calendar_signals[DAY_SELECTED_SIGNAL], 0);
+ }
+
+ if (month_changed)
+ g_object_notify (G_OBJECT (calendar), "month");
+
+ if (year_changed)
+ g_object_notify (G_OBJECT (calendar), "year");
+}
+
static void
calendar_select_and_focus_day (GtkCalendar *calendar,
int day)
day,
0, 0, 0);
- gtk_calendar_select_day (calendar, new_date);
+ calendar_select_day_internal (calendar, new_date, TRUE);
g_date_time_unref (new_date);
}
0, 0, 0);
if (date)
{
- gtk_calendar_select_day (calendar, date);
+ calendar_select_day_internal (calendar, date, TRUE);
g_date_time_unref (date);
}
break;
0, 0, 0);
if (date)
{
- gtk_calendar_select_day (calendar, date);
+ calendar_select_day_internal (calendar, date, TRUE);
g_date_time_unref (date);
}
break;
0, 0, 0);
if (date)
{
- gtk_calendar_select_day (calendar, date);
+ calendar_select_day_internal (calendar, date, TRUE);
g_date_time_unref (date);
}
break;
gtk_calendar_select_day (GtkCalendar *calendar,
GDateTime *date)
{
- GDateTime *today;
- int new_day, new_month, new_year;
- gboolean day_changed, month_changed, year_changed;
- char buffer[255];
- char *str;
- time_t tmp_time;
- struct tm *tm;
- int i;
- int x, y;
- int today_day;
-
g_return_if_fail (GTK_IS_CALENDAR (calendar));
g_return_if_fail (date != NULL);
- day_changed = g_date_time_get_day_of_month (calendar->date) != g_date_time_get_day_of_month (date);
- month_changed = g_date_time_get_month (calendar->date) != g_date_time_get_month (date);
- year_changed = g_date_time_get_year (calendar->date) != g_date_time_get_year (date);
-
- if (!day_changed && !month_changed && !year_changed)
- return;
-
- new_year = g_date_time_get_year (date);
- new_month = g_date_time_get_month (date);
- new_day = g_date_time_get_day_of_month (date);
-
- g_date_time_unref (calendar->date);
- calendar->date = g_date_time_ref (date);
-
- tmp_time = 1; /* Jan 1 1970, 00:00:01 UTC */
- tm = gmtime (&tmp_time);
- tm->tm_year = new_year - 1900;
-
- /* Translators: This dictates how the year is displayed in
- * gtkcalendar widget. See strftime() manual for the format.
- * Use only ASCII in the translation.
- *
- * "%Y" is appropriate for most locales.
- */
- strftime (buffer, sizeof (buffer), C_("calendar year format", "%Y"), tm);
- str = g_locale_to_utf8 (buffer, -1, NULL, NULL, NULL);
- gtk_label_set_label (GTK_LABEL (calendar->year_label), str);
- g_free (str);
-
- /* Update month */
-
- calendar_compute_days (calendar);
- gtk_stack_set_visible_child_name (GTK_STACK (calendar->month_name_stack),
- default_monthname[new_month - 1]);
-
- today = g_date_time_new_now_local ();
-
- if (g_date_time_get_year (calendar->date) == g_date_time_get_year (today) &&
- g_date_time_get_month (calendar->date) == g_date_time_get_month (today))
- today_day = g_date_time_get_day_of_month (today);
- else
- today_day = -1;
-
- g_date_time_unref (today);
-
- /* Update day labels */
- for (y = 0; y < 6; y ++)
- for (x = 0; x < 7; x ++)
- {
- const int day = calendar->day[y][x];
- GtkWidget *label = calendar->day_number_labels[y][x];
- /* Translators: this defines whether the day numbers should use
- * localized digits or the ones used in English (0123...).
- *
- * Translate to "%Id" if you want to use localized digits, or
- * translate to "%d" otherwise.
- *
- * Note that translating this doesn't guarantee that you get localized
- * digits. That needs support from your system and locale definition
- * too.
- */
- g_snprintf (buffer, sizeof (buffer), C_("calendar:day:digits", "%d"), day);
-
- gtk_label_set_label (GTK_LABEL (label), buffer);
-
- if (calendar->day_month[y][x] == MONTH_PREV ||
- calendar->day_month[y][x] == MONTH_NEXT)
- gtk_widget_add_css_class (label, "other-month");
- else
- gtk_widget_remove_css_class (label, "other-month");
-
- if (calendar->marked_date[day-1] &&
- calendar->day_month[y][x] == MONTH_CURRENT)
- gtk_widget_set_state_flags (label, GTK_STATE_FLAG_CHECKED, FALSE);
- else
- gtk_widget_unset_state_flags (label, GTK_STATE_FLAG_CHECKED);
-
- if (new_day == day &&
- calendar->day_month[y][x] == MONTH_CURRENT)
- gtk_widget_set_state_flags (label, GTK_STATE_FLAG_SELECTED, FALSE);
- else
- gtk_widget_unset_state_flags (label, GTK_STATE_FLAG_SELECTED);
-
- if (calendar->focus_row == y && calendar->focus_col == x)
- gtk_widget_set_state_flags (label, GTK_STATE_FLAG_FOCUSED, FALSE);
- else
- gtk_widget_unset_state_flags (label, GTK_STATE_FLAG_FOCUSED);
-
- if (day == today_day &&
- calendar->day_month[y][x] == MONTH_CURRENT)
- gtk_widget_add_css_class (label, "today");
- else
- gtk_widget_remove_css_class (label, "today");
- }
-
- /* Update week number labels.
- * We simply get the week number of calendar->date and add the others.
- * simple. */
- for (i = 0; i < 6; i ++)
- {
- int year = new_year;
- int month, week;
-
- month = new_month + calendar->day_month[i][6] - MONTH_CURRENT;
-
- if (month < 1)
- {
- month += 12;
- year -= 1;
- }
- else if (month > 12)
- {
- month -= 12;
- year += 1;
- }
-
- week = week_of_year (year, month, calendar->day[i][6]);
-
- /* Translators: this defines whether the week numbers should use
- * localized digits or the ones used in English (0123...).
- *
- * Translate to "%Id" if you want to use localized digits, or
- * translate to "%d" otherwise.
- * Note that translating this doesn't guarantee that you get localized
- * digits. That needs support from your system and locale definition
- * too. */
- g_snprintf (buffer, sizeof (buffer), C_("calendar:week:digits", "%d"), week);
-
- gtk_label_set_label (GTK_LABEL (calendar->week_number_labels[i]), buffer);
- }
-
- if (day_changed)
- {
- g_object_notify (G_OBJECT (calendar), "day");
- g_signal_emit (calendar, gtk_calendar_signals[DAY_SELECTED_SIGNAL], 0);
- }
-
- if (month_changed)
- g_object_notify (G_OBJECT (calendar), "month");
-
- if (year_changed)
- g_object_notify (G_OBJECT (calendar), "year");
-
+ calendar_select_day_internal (calendar, date, TRUE);
}
/**