Merge branch 'BUG_popover_focus_from_another_window_GTK3' into 'gtk-3-24'

popover: fix focus when inside an unfocused window

See merge request GNOME/gtk!1073
This commit is contained in:
Matthias Clasen 2019-09-27 20:29:27 +00:00
commit ca9fc93925

View File

@ -159,6 +159,7 @@ struct _GtkPopoverPrivate
GdkRectangle pointing_to;
GtkPopoverConstraint constraint;
GtkProgressTracker tracker;
GtkGesture *multipress_gesture;
guint prev_focus_unmap_id;
guint hierarchy_changed_id;
guint size_allocate_id;
@ -199,6 +200,12 @@ static void gtk_popover_apply_modality (GtkPopover *popover,
static void gtk_popover_set_scrollable_full (GtkPopover *popover,
GtkScrollable *scrollable);
static void gtk_popover_multipress_gesture_pressed (GtkGestureMultiPress *gesture,
gint n_press,
gdouble widget_x,
gdouble widget_y,
GtkPopover *popover);
G_DEFINE_TYPE_WITH_PRIVATE (GtkPopover, gtk_popover, GTK_TYPE_BIN)
static void
@ -206,17 +213,26 @@ gtk_popover_init (GtkPopover *popover)
{
GtkWidget *widget;
GtkStyleContext *context;
GtkPopoverPrivate *priv;
widget = GTK_WIDGET (popover);
gtk_widget_set_has_window (widget, TRUE);
popover->priv = gtk_popover_get_instance_private (popover);
popover->priv->modal = TRUE;
popover->priv->tick_id = 0;
popover->priv->state = STATE_HIDDEN;
popover->priv->visible = FALSE;
popover->priv->transitions_enabled = TRUE;
popover->priv->preferred_position = GTK_POS_TOP;
popover->priv->constraint = GTK_POPOVER_CONSTRAINT_WINDOW;
priv = popover->priv = gtk_popover_get_instance_private (popover);
priv->modal = TRUE;
priv->tick_id = 0;
priv->state = STATE_HIDDEN;
priv->visible = FALSE;
priv->transitions_enabled = TRUE;
priv->preferred_position = GTK_POS_TOP;
priv->constraint = GTK_POPOVER_CONSTRAINT_WINDOW;
priv->multipress_gesture = gtk_gesture_multi_press_new (widget);
g_signal_connect (priv->multipress_gesture, "pressed",
G_CALLBACK (gtk_popover_multipress_gesture_pressed), popover);
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (priv->multipress_gesture), 0);
gtk_gesture_single_set_exclusive (GTK_GESTURE_SINGLE (priv->multipress_gesture), TRUE);
gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (priv->multipress_gesture),
GTK_PHASE_CAPTURE);
context = gtk_widget_get_style_context (GTK_WIDGET (popover));
gtk_style_context_add_class (context, GTK_STYLE_CLASS_BACKGROUND);
@ -336,6 +352,8 @@ gtk_popover_finalize (GObject *object)
if (priv->widget)
gtk_popover_update_relative_to (popover, NULL);
g_clear_object (&priv->multipress_gesture);
G_OBJECT_CLASS (gtk_popover_parent_class)->finalize (object);
}
@ -2178,6 +2196,19 @@ gtk_popover_update_preferred_position (GtkPopover *popover,
g_object_notify_by_pspec (G_OBJECT (popover), properties[PROP_POSITION]);
}
static void
gtk_popover_multipress_gesture_pressed (GtkGestureMultiPress *gesture,
gint n_press,
gdouble widget_x,
gdouble widget_y,
GtkPopover *popover)
{
GtkPopoverPrivate *priv = popover->priv;
if (!gtk_window_is_active (priv->window) && gtk_widget_is_drawable (GTK_WIDGET (popover)))
gtk_window_present_with_time (priv->window, gtk_get_current_event_time ());
}
/**
* gtk_popover_new:
* @relative_to: (allow-none): #GtkWidget the popover is related to