gtkexpander: Remove event window

Detect presses/releases inside the label area instead.
This commit is contained in:
Carlos Garnacho 2017-04-03 00:33:56 +02:00
parent 1858f310aa
commit 8731ca6ca5

View File

@ -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;