summaryrefslogtreecommitdiff
path: root/gtk/gtkcalendar.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2020-03-02 04:03:03 +0100
committerBenjamin Otte <otte@redhat.com>2020-03-02 04:43:56 +0100
commitf4a00e79091c40907f007a65bed38753c16f242d (patch)
treef3ad09689146d7edb651eaecaac9a413f9979980 /gtk/gtkcalendar.c
parente7db386018e87cfe4930eb7378351171c6291dcf (diff)
downloadgtk+-f4a00e79091c40907f007a65bed38753c16f242d.tar.gz
calendar: Use a drag source
Diffstat (limited to 'gtk/gtkcalendar.c')
-rw-r--r--gtk/gtkcalendar.c170
1 files changed, 23 insertions, 147 deletions
diff --git a/gtk/gtkcalendar.c b/gtk/gtkcalendar.c
index ec71a373cc..2bfbc2ef68 100644
--- a/gtk/gtkcalendar.c
+++ b/gtk/gtkcalendar.c
@@ -241,12 +241,8 @@ struct _GtkCalendarPrivate
gint focus_col;
guint year_before : 1;
- guint in_drag : 1;
gint week_start;
-
- gint drag_start_x;
- gint drag_start_y;
};
static void gtk_calendar_set_property (GObject *object,
@@ -263,19 +259,6 @@ static void gtk_calendar_button_press (GtkGestureClick *gesture,
double x,
double y,
gpointer user_data);
-static void gtk_calendar_button_release (GtkGestureClick *gesture,
- int n_press,
- double x,
- double y,
- gpointer user_data);
-static void gtk_calendar_drag_begin (GtkGestureDrag *gesture,
- double x,
- double y,
- gpointer data);
-static void gtk_calendar_drag_update (GtkGestureDrag *gesture,
- double x,
- double y,
- gpointer data);
static gboolean gtk_calendar_key_controller_key_pressed (GtkEventControllerKey *controller,
guint keyval,
guint keycode,
@@ -283,9 +266,6 @@ static gboolean gtk_calendar_key_controller_key_pressed (GtkEventControllerKey *
GtkWidget *widget);
static void gtk_calendar_focus_controller_focus (GtkEventController *controller,
GtkWidget *widget);
-static void gtk_calendar_state_flags_changed (GtkWidget *widget,
- GtkStateFlags previous_state);
-
static void calendar_invalidate_day (GtkCalendar *widget,
gint row,
@@ -385,8 +365,6 @@ gtk_calendar_class_init (GtkCalendarClass *class)
gobject_class->set_property = gtk_calendar_set_property;
gobject_class->get_property = gtk_calendar_get_property;
- widget_class->state_flags_changed = gtk_calendar_state_flags_changed;
-
/**
* GtkCalendar:year:
*
@@ -548,6 +526,25 @@ gtk_calendar_class_init (GtkCalendarClass *class)
gtk_widget_class_set_css_name (widget_class, I_("calendar"));
}
+static GdkContentProvider *
+gtk_calendar_drag_prepare (GtkDragSource *source,
+ double x,
+ double y,
+ GtkCalendar *self)
+{
+ GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (self);
+ GDate *date;
+ gchar str[128];
+
+ date = g_date_new_dmy (g_date_time_get_day_of_month (priv->date),
+ g_date_time_get_month (priv->date),
+ g_date_time_get_year (priv->date));
+ g_date_strftime (str, 127, "%x", date);
+ g_free (date);
+
+ return gdk_content_provider_new_typed (G_TYPE_STRING, str);
+}
+
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
@@ -558,6 +555,7 @@ gtk_calendar_init (GtkCalendar *calendar)
GtkWidget *widget = GTK_WIDGET (calendar);
GtkEventController *controller;
GtkGesture *gesture;
+ GtkDragSource *source;
GtkDropTarget *target;
gint i;
#ifdef G_OS_WIN32
@@ -612,13 +610,11 @@ gtk_calendar_init (GtkCalendar *calendar)
gesture = gtk_gesture_click_new ();
g_signal_connect (gesture, "pressed", G_CALLBACK (gtk_calendar_button_press), calendar);
- g_signal_connect (gesture, "released", G_CALLBACK (gtk_calendar_button_release), calendar);
gtk_widget_add_controller (GTK_WIDGET (calendar), GTK_EVENT_CONTROLLER (gesture));
- gesture = gtk_gesture_drag_new ();
- g_signal_connect (gesture, "drag-begin", G_CALLBACK (gtk_calendar_drag_begin), calendar);
- g_signal_connect (gesture, "drag-update", G_CALLBACK (gtk_calendar_drag_update), calendar);
- gtk_widget_add_controller (GTK_WIDGET (calendar), GTK_EVENT_CONTROLLER (gesture));
+ source = gtk_drag_source_new ();
+ g_signal_connect (source, "prepare", G_CALLBACK (gtk_calendar_drag_prepare), calendar);
+ gtk_widget_add_controller (GTK_WIDGET (calendar), GTK_EVENT_CONTROLLER (source));
controller =
gtk_event_controller_scroll_new (GTK_EVENT_CONTROLLER_SCROLL_VERTICAL |
@@ -756,8 +752,6 @@ gtk_calendar_init (GtkCalendar *calendar)
priv->focus_row = -1;
priv->focus_col = -1;
- priv->in_drag = 0;
-
target = gtk_drop_target_new (G_TYPE_STRING, GDK_ACTION_COPY);
gtk_drop_target_set_preload (target, TRUE);
g_signal_connect (target, "notify::value", G_CALLBACK (gtk_calendar_drag_notify_value), calendar);
@@ -1123,7 +1117,6 @@ gtk_calendar_button_press (GtkGestureClick *gesture,
GtkCalendar *calendar = user_data;
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));
GtkWidget *label;
int row = -1, col = -1;
int ix, iy;
@@ -1156,111 +1149,9 @@ gtk_calendar_button_press (GtkGestureClick *gesture,
if (!gtk_widget_has_focus (widget))
gtk_widget_grab_focus (widget);
- if (button == GDK_BUTTON_PRIMARY)
- {
- priv->in_drag = 1;
- priv->drag_start_x = x;
- priv->drag_start_y = y;
- }
-
calendar_select_and_focus_day (calendar, day);
}
-static void
-gtk_calendar_button_release (GtkGestureClick *gesture,
- int n_press,
- double x,
- double y,
- gpointer user_data)
-{
- GtkCalendar *calendar = user_data;
- GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
- int button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture));
-
- if (button == GDK_BUTTON_PRIMARY)
- {
- if (priv->in_drag)
- priv->in_drag = 0;
- }
-}
-
-static void
-gtk_calendar_drag_begin (GtkGestureDrag *gesture,
- double x,
- double y,
- gpointer data)
-{
- GtkCalendar *calendar = data;
- GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
-
- priv->in_drag = TRUE;
-}
-
-static GdkContentProvider *
-get_calendar_content (GtkCalendar *calendar)
-{
- GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
- GDate *date;
- gchar str[128];
-
- date = g_date_new_dmy (g_date_time_get_day_of_month (priv->date),
- g_date_time_get_month (priv->date),
- g_date_time_get_year (priv->date));
- g_date_strftime (str, 127, "%x", date);
- g_free (date);
-
- return gdk_content_provider_new_typed (G_TYPE_STRING, str);
-}
-
-static void
-gtk_calendar_drag_update (GtkGestureDrag *gesture,
- double x,
- double y,
- gpointer data)
-{
- GtkWidget *widget = data;
- GtkCalendar *calendar = GTK_CALENDAR (widget);
- GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
- gdouble start_x, start_y;
- GdkContentProvider *content;
- GdkDevice *device;
- GdkDrag *drag;
- GtkIconTheme *theme;
- GtkIconPaintable *icon;
- GdkSurface *surface;
-
- if (!priv->in_drag)
- return;
-
- if (!gtk_drag_check_threshold (widget, 0, 0, x, y))
- return;
-
- gtk_gesture_drag_get_start_point (gesture, &start_x, &start_y);
-
- surface = gtk_native_get_surface (gtk_widget_get_native (widget));
- device = gtk_gesture_get_device (GTK_GESTURE (gesture));
-
- content = get_calendar_content (calendar);
-
- drag = gdk_drag_begin (surface, device, content, GDK_ACTION_COPY, start_x, start_y);
-
- theme = gtk_icon_theme_get_for_display (gtk_widget_get_display (widget));
- icon = gtk_icon_theme_lookup_icon (theme,
- "text-x-generic",
- NULL,
- 32,
- 1,
- GTK_TEXT_DIR_NONE,
- 0);
- gtk_drag_icon_set_from_paintable (drag, GDK_PAINTABLE (icon), 0, 0);
- g_clear_object (&icon);
-
- g_object_unref (content);
- g_object_unref (drag);
-
- priv->in_drag = 0;
-}
-
static gboolean
gtk_calendar_scroll_controller_scroll (GtkEventControllerScroll *scroll,
gdouble dx,
@@ -1435,23 +1326,8 @@ gtk_calendar_focus_controller_focus (GtkEventController *controller,
GtkWidget *widget)
{
GtkCalendar *calendar = GTK_CALENDAR (widget);
- GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
calendar_queue_refresh (calendar);
- priv->in_drag = 0;
-}
-
-static void
-gtk_calendar_state_flags_changed (GtkWidget *widget,
- GtkStateFlags previous_state)
-{
- GtkCalendar *calendar = GTK_CALENDAR (widget);
- GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
-
- if (!gtk_widget_is_sensitive (widget))
- {
- priv->in_drag = 0;
- }
}