diff --git a/gtk/gtkexpander.c b/gtk/gtkexpander.c index 836bde9936..8aa6ea34a2 100644 --- a/gtk/gtkexpander.c +++ b/gtk/gtkexpander.c @@ -144,7 +144,6 @@ enum struct _GtkExpanderPrivate { GtkWidget *label_widget; - GdkWindow *event_window; GtkCssGadget *gadget; GtkWidget *title_widget; @@ -161,6 +160,7 @@ struct _GtkExpanderPrivate guint prelight : 1; guint label_fill : 1; guint resize_toplevel : 1; + guint pressed_in_title : 1; }; static void gtk_expander_set_property (GObject *object, @@ -173,12 +173,8 @@ static void gtk_expander_get_property (GObject *object, GParamSpec *pspec); static void gtk_expander_destroy (GtkWidget *widget); -static void gtk_expander_realize (GtkWidget *widget); -static void gtk_expander_unrealize (GtkWidget *widget); static void gtk_expander_size_allocate (GtkWidget *widget, GtkAllocation *allocation); -static void gtk_expander_map (GtkWidget *widget); -static void gtk_expander_unmap (GtkWidget *widget); static void gtk_expander_snapshot (GtkWidget *widget, GtkSnapshot *snapshot); @@ -225,6 +221,11 @@ static void gtk_expander_state_flags_changed (GtkWidget *widget, GtkStateFlags previous_state); /* Gestures */ +static void gesture_multipress_pressed_cb (GtkGestureMultiPress *gesture, + gint n_press, + gdouble x, + gdouble y, + GtkExpander *expander); static void gesture_multipress_released_cb (GtkGestureMultiPress *gesture, gint n_press, gdouble x, @@ -262,11 +263,7 @@ gtk_expander_class_init (GtkExpanderClass *klass) gobject_class->get_property = gtk_expander_get_property; widget_class->destroy = gtk_expander_destroy; - widget_class->realize = gtk_expander_realize; - widget_class->unrealize = gtk_expander_unrealize; widget_class->size_allocate = gtk_expander_size_allocate; - widget_class->map = gtk_expander_map; - widget_class->unmap = gtk_expander_unmap; widget_class->snapshot = gtk_expander_snapshot; widget_class->enter_notify_event = gtk_expander_enter_notify; widget_class->leave_notify_event = gtk_expander_leave_notify; @@ -370,7 +367,6 @@ gtk_expander_init (GtkExpander *expander) gtk_widget_set_has_window (GTK_WIDGET (expander), FALSE); priv->label_widget = NULL; - priv->event_window = NULL; priv->spacing = 0; priv->expanded = FALSE; @@ -403,6 +399,8 @@ gtk_expander_init (GtkExpander *expander) GDK_BUTTON_PRIMARY); gtk_gesture_single_set_touch_only (GTK_GESTURE_SINGLE (priv->multipress_gesture), FALSE); + g_signal_connect (priv->multipress_gesture, "pressed", + G_CALLBACK (gesture_multipress_pressed_cb), expander); g_signal_connect (priv->multipress_gesture, "released", G_CALLBACK (gesture_multipress_released_cb), expander); gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (priv->multipress_gesture), @@ -524,39 +522,6 @@ gtk_expander_destroy (GtkWidget *widget) g_clear_object (&priv->gadget); } -static void -gtk_expander_realize (GtkWidget *widget) -{ - GtkAllocation allocation; - GtkExpanderPrivate *priv; - - priv = GTK_EXPANDER (widget)->priv; - - GTK_WIDGET_CLASS (gtk_expander_parent_class)->realize (widget); - - gtk_widget_get_allocation (widget, &allocation); - - priv->event_window = gdk_window_new_input (gtk_widget_get_window (widget), - GDK_ALL_EVENTS_MASK, - &allocation); - gtk_widget_register_window (widget, priv->event_window); -} - -static void -gtk_expander_unrealize (GtkWidget *widget) -{ - GtkExpanderPrivate *priv = GTK_EXPANDER (widget)->priv; - - if (priv->event_window) - { - gtk_widget_unregister_window (widget, priv->event_window); - gdk_window_destroy (priv->event_window); - priv->event_window = NULL; - } - - GTK_WIDGET_CLASS (gtk_expander_parent_class)->unrealize (widget); -} - static void gtk_expander_size_allocate (GtkWidget *widget, GtkAllocation *allocation) @@ -572,40 +537,6 @@ gtk_expander_size_allocate (GtkWidget *widget, &clip); gtk_widget_set_clip (widget, &clip); - - if (gtk_widget_get_realized (widget)) - { - GtkAllocation title_allocation; - - gtk_widget_get_allocation (priv->title_widget, &title_allocation); - gdk_window_move_resize (priv->event_window, - title_allocation.x, title_allocation.y, - title_allocation.width, title_allocation.height); - } -} - -static void -gtk_expander_map (GtkWidget *widget) -{ - GtkExpanderPrivate *priv = GTK_EXPANDER (widget)->priv; - - gtk_widget_map (priv->title_widget); - - GTK_WIDGET_CLASS (gtk_expander_parent_class)->map (widget); - - if (priv->event_window) - gdk_window_show (priv->event_window); -} - -static void -gtk_expander_unmap (GtkWidget *widget) -{ - GtkExpanderPrivate *priv = GTK_EXPANDER (widget)->priv; - - if (priv->event_window) - gdk_window_hide (priv->event_window); - - GTK_WIDGET_CLASS (gtk_expander_parent_class)->unmap (widget); } static void @@ -615,6 +546,30 @@ gtk_expander_snapshot (GtkWidget *widget, gtk_css_gadget_snapshot (GTK_EXPANDER (widget)->priv->gadget, snapshot); } +static void +gesture_multipress_pressed_cb (GtkGestureMultiPress *gesture, + gint n_press, + gdouble x, + gdouble y, + GtkExpander *expander) +{ + GtkExpanderPrivate *priv = expander->priv; + GtkAllocation title_allocation, allocation; + + gtk_widget_get_allocation (GTK_WIDGET (expander), &allocation); + gtk_widget_get_allocation (priv->title_widget, &title_allocation); + /* Coordinates are in the widget coordinate system, so transform + * the title_allocation to it. + */ + title_allocation.x -= allocation.x; + title_allocation.y -= allocation.y; + + priv->pressed_in_title = (x >= title_allocation.x && + x < title_allocation.x + title_allocation.width && + y >= title_allocation.y && + y < title_allocation.y + title_allocation.height); +} + static void gesture_multipress_released_cb (GtkGestureMultiPress *gesture, gint n_press, @@ -622,7 +577,7 @@ gesture_multipress_released_cb (GtkGestureMultiPress *gesture, gdouble y, GtkExpander *expander) { - if (expander->priv->prelight) + if (expander->priv->pressed_in_title) gtk_widget_activate (GTK_WIDGET (expander)); } @@ -664,8 +619,7 @@ gtk_expander_enter_notify (GtkWidget *widget, { GtkExpander *expander = GTK_EXPANDER (widget); - if (event->window == expander->priv->event_window && - event->detail != GDK_NOTIFY_INFERIOR) + if (event->detail != GDK_NOTIFY_INFERIOR) { expander->priv->prelight = TRUE; @@ -686,8 +640,7 @@ gtk_expander_leave_notify (GtkWidget *widget, { GtkExpander *expander = GTK_EXPANDER (widget); - if (event->window == expander->priv->event_window && - event->detail != GDK_NOTIFY_INFERIOR) + if (event->detail != GDK_NOTIFY_INFERIOR) { expander->priv->prelight = FALSE;