#include "gtklabel.h"
#include "gtkstack.h"
-#define TIMEOUT_INITIAL 500
-#define TIMEOUT_REPEAT 50
-
static const guint month_length[2][13] =
{
{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
gint drag_start_y;
};
-static void gtk_calendar_destroy (GtkWidget *widget);
static void gtk_calendar_set_property (GObject *object,
guint prop_id,
const GValue *value,
GdkCrossingMode mode,
GdkNotifyType detail,
GtkWidget *widget);
-static void gtk_calendar_grab_notify (GtkWidget *widget,
- gboolean was_grabbed);
static void gtk_calendar_state_flags_changed (GtkWidget *widget,
GtkStateFlags previous_state);
static gboolean gtk_calendar_drag_accept (GtkDropTarget *dest,
GtkCalendar *calendar);
-static void calendar_start_spinning (GtkCalendar *calendar,
- gint click_child);
-static void calendar_stop_spinning (GtkCalendar *calendar);
-
static void calendar_invalidate_day (GtkCalendar *widget,
gint row,
gint col);
gobject_class->set_property = gtk_calendar_set_property;
gobject_class->get_property = gtk_calendar_get_property;
- widget_class->destroy = gtk_calendar_destroy;
widget_class->snapshot = gtk_calendar_snapshot;
widget_class->measure = gtk_calendar_measure;
widget_class->size_allocate = gtk_calendar_size_allocate;
widget_class->state_flags_changed = gtk_calendar_state_flags_changed;
- widget_class->grab_notify = gtk_calendar_grab_notify;
/**
* GtkCalendar:year:
return row;
}
-static void
-calendar_arrow_rectangle (GtkCalendar *calendar,
- guint arrow,
- GdkRectangle *rect)
-{
- GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
-
- gtk_widget_get_allocation (priv->arrow_widgets[arrow],
- rect);
-}
-
static void
calendar_day_rectangle (GtkCalendar *calendar,
gint row,
calendar_queue_refresh (calendar);
}
-\f
-/****************************************
- * Basic object methods *
- ****************************************/
-
-static void
-gtk_calendar_destroy (GtkWidget *widget)
-{
- GtkCalendar *calendar = GTK_CALENDAR (widget);
-
- calendar_stop_spinning (calendar);
-
- GTK_WIDGET_CLASS (gtk_calendar_parent_class)->destroy (widget);
-}
-
static void
gtk_calendar_set_property (GObject *object,
guint prop_id,
calendar_snapshot_week_numbers (calendar, snapshot);
}
-
-/****************************************
- * Mouse handling *
- ****************************************/
-
-static void
-calendar_arrow_action (GtkCalendar *calendar,
- guint arrow)
-{
- switch (arrow)
- {
- case ARROW_YEAR_LEFT:
- calendar_set_year_prev (calendar);
- break;
- case ARROW_YEAR_RIGHT:
- calendar_set_year_next (calendar);
- break;
- case ARROW_MONTH_LEFT:
- calendar_set_month_prev (calendar);
- break;
- case ARROW_MONTH_RIGHT:
- calendar_set_month_next (calendar);
- break;
- default:;
- /* do nothing */
- }
-}
-
-static gboolean
-calendar_timer (gpointer data)
-{
- GtkCalendar *calendar = data;
- GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
- gboolean retval = FALSE;
-
- if (priv->timer)
- {
- calendar_arrow_action (calendar, priv->click_child);
-
- if (priv->need_timer)
- {
- priv->need_timer = FALSE;
- priv->timer = g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE,
- TIMEOUT_REPEAT * SCROLL_DELAY_FACTOR,
- (GSourceFunc) calendar_timer,
- calendar, NULL);
- g_source_set_name_by_id (priv->timer, "[gtk] calendar_timer");
- }
- else
- retval = TRUE;
- }
-
- return retval;
-}
-
-static void
-calendar_start_spinning (GtkCalendar *calendar,
- gint click_child)
-{
- GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
-
- priv->click_child = click_child;
-
- if (!priv->timer)
- {
- priv->need_timer = TRUE;
- priv->timer = g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE,
- TIMEOUT_INITIAL,
- (GSourceFunc) calendar_timer,
- calendar, NULL);
- g_source_set_name_by_id (priv->timer, "[gtk] calendar_timer");
- }
-}
-
-static void
-calendar_stop_spinning (GtkCalendar *calendar)
-{
- GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
-
- if (priv->timer)
- {
- g_source_remove (priv->timer);
- priv->timer = 0;
- priv->need_timer = FALSE;
- }
-}
-
static void
calendar_main_button_press (GtkCalendar *calendar,
double x,
GtkWidget *widget = GTK_WIDGET (calendar);
GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
int button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture));
- gint arrow = -1;
if (!gtk_widget_has_focus (widget))
gtk_widget_grab_focus (widget);
if (y > priv->header_h)
calendar_main_button_press (calendar, x, y, n_press, button);
-
- for (arrow = ARROW_YEAR_LEFT; arrow <= ARROW_MONTH_RIGHT; arrow++)
- {
- GdkRectangle arrow_rect;
-
- calendar_arrow_rectangle (calendar, arrow, &arrow_rect);
-
- if (gdk_rectangle_contains_point (&arrow_rect, (int)x, (int)y))
- {
- if (button == GDK_BUTTON_PRIMARY)
- calendar_start_spinning (calendar, arrow);
-
- calendar_arrow_action (calendar, arrow);
-
- return;
- }
- }
}
static void
if (button == GDK_BUTTON_PRIMARY)
{
- calendar_stop_spinning (calendar);
-
if (priv->in_drag)
priv->in_drag = 0;
}
GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
calendar_queue_refresh (calendar);
- calendar_stop_spinning (calendar);
priv->in_drag = 0;
}
-\f
-/****************************************
- * Misc widget methods *
- ****************************************/
-
static void
gtk_calendar_state_flags_changed (GtkWidget *widget,
GtkStateFlags previous_state)
if (!gtk_widget_is_sensitive (widget))
{
priv->in_drag = 0;
- calendar_stop_spinning (calendar);
}
}
-static void
-gtk_calendar_grab_notify (GtkWidget *widget,
- gboolean was_grabbed)
-{
- GTK_WIDGET_CLASS (gtk_calendar_parent_class)->grab_notify (widget, was_grabbed);
-
- if (!was_grabbed)
- calendar_stop_spinning (GTK_CALENDAR (widget));
-}
-
-\f
-/****************************************
- * Drag and Drop *
- ****************************************/
-
/* Get/set whether drag_motion requested the drag data and
* drag_data_received should thus not actually insert the data,
* since the data doesn’t result from a drop.