gtkbutton: Handle crossing events without the event window

The event shall no longer be "directed" to the event window, but the
widget. Getting a enter/leave event is enough now to know whether the
pointer is inside or outside the widget.
This commit is contained in:
Carlos Garnacho 2017-03-31 17:59:43 +02:00
parent 23d2126729
commit 5836beee78
3 changed files with 5 additions and 26 deletions

View File

@ -473,7 +473,7 @@ gtk_button_init (GtkButton *button)
g_signal_connect (priv->gesture, "released", G_CALLBACK (multipress_released_cb), button); g_signal_connect (priv->gesture, "released", G_CALLBACK (multipress_released_cb), button);
g_signal_connect (priv->gesture, "update", G_CALLBACK (multipress_gesture_update_cb), button); g_signal_connect (priv->gesture, "update", G_CALLBACK (multipress_gesture_update_cb), button);
g_signal_connect (priv->gesture, "cancel", G_CALLBACK (multipress_gesture_cancel_cb), button); g_signal_connect (priv->gesture, "cancel", G_CALLBACK (multipress_gesture_cancel_cb), button);
gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (priv->gesture), GTK_PHASE_BUBBLE); gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (priv->gesture), GTK_PHASE_CAPTURE);
priv->gadget = gtk_css_custom_gadget_new_for_node (gtk_widget_get_css_node (GTK_WIDGET (button)), priv->gadget = gtk_css_custom_gadget_new_for_node (gtk_widget_get_css_node (GTK_WIDGET (button)),
GTK_WIDGET (button), GTK_WIDGET (button),
@ -977,12 +977,8 @@ gtk_button_enter_notify (GtkWidget *widget,
GtkButton *button = GTK_BUTTON (widget); GtkButton *button = GTK_BUTTON (widget);
GtkButtonPrivate *priv = button->priv; GtkButtonPrivate *priv = button->priv;
if ((event->window == button->priv->event_window) && priv->in_button = TRUE;
(event->detail != GDK_NOTIFY_INFERIOR)) gtk_button_update_state (button);
{
priv->in_button = TRUE;
gtk_button_update_state (button);
}
return FALSE; return FALSE;
} }
@ -994,12 +990,8 @@ gtk_button_leave_notify (GtkWidget *widget,
GtkButton *button = GTK_BUTTON (widget); GtkButton *button = GTK_BUTTON (widget);
GtkButtonPrivate *priv = button->priv; GtkButtonPrivate *priv = button->priv;
if ((event->window == button->priv->event_window) && priv->in_button = FALSE;
(event->detail != GDK_NOTIFY_INFERIOR)) gtk_button_update_state (button);
{
priv->in_button = FALSE;
gtk_button_update_state (button);
}
return FALSE; return FALSE;
} }

View File

@ -32,7 +32,6 @@ struct _GtkButtonPrivate
GtkCssGadget *gadget; GtkCssGadget *gadget;
GdkDevice *grab_keyboard; GdkDevice *grab_keyboard;
GdkWindow *event_window;
GtkGesture *gesture; GtkGesture *gesture;

View File

@ -872,18 +872,6 @@ gtk_model_button_allocate (GtkCssGadget *gadget,
gtk_widget_size_allocate_with_baseline (child, &child_allocation, baseline); gtk_widget_size_allocate_with_baseline (child, &child_allocation, baseline);
} }
if (gtk_widget_get_realized (widget))
{
GtkAllocation border_allocation;
gtk_css_gadget_get_border_allocation (gadget, &border_allocation, NULL);
gdk_window_move_resize (GTK_BUTTON (widget)->priv->event_window,
border_allocation.x,
border_allocation.y,
border_allocation.width,
border_allocation.height);
}
gtk_container_get_children_clip (GTK_CONTAINER (widget), out_clip); gtk_container_get_children_clip (GTK_CONTAINER (widget), out_clip);
gdk_rectangle_union (out_clip, &check_clip, out_clip); gdk_rectangle_union (out_clip, &check_clip, out_clip);
} }