[gtk/wip/matthiasc/popup2: 45/51] widget: Review and replace uses of get_toplevel
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/matthiasc/popup2: 45/51] widget: Review and replace uses of get_toplevel
- Date: Mon, 18 Mar 2019 12:48:58 +0000 (UTC)
commit f5311dd2d26c20a85ead2fc746f37d06625f63c1
Author: Matthias Clasen <mclasen redhat com>
Date: Sun Mar 17 19:41:26 2019 -0400
widget: Review and replace uses of get_toplevel
Now that roots can have parent widgets, we need to
carefully examine all calls of gtk_widget_get_toplevel,
and replace them with gtk_widget_get_root if we want
the nearest root, and not the ultimate end of the parent
chain.
gtk/gtkdragdest.c | 11 +++---
gtk/gtkmain.c | 31 +++++++---------
gtk/gtkwidget.c | 105 +++++++++++++++++++++++++++---------------------------
3 files changed, 71 insertions(+), 76 deletions(-)
---
diff --git a/gtk/gtkdragdest.c b/gtk/gtkdragdest.c
index b2dcd78ef2..5ce9f1e441 100644
--- a/gtk/gtkdragdest.c
+++ b/gtk/gtkdragdest.c
@@ -34,10 +34,9 @@
static void
gtk_drag_dest_realized (GtkWidget *widget)
{
- GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
+ GtkRoot *root = gtk_widget_get_root (widget);
- if (gtk_widget_is_toplevel (toplevel))
- gdk_surface_register_dnd (gtk_widget_get_surface (toplevel));
+ gdk_surface_register_dnd (gtk_widget_get_surface (GTK_WIDGET (root)));
}
static void
@@ -45,10 +44,10 @@ gtk_drag_dest_hierarchy_changed (GtkWidget *widget,
GParamSpec *pspec,
gpointer data)
{
- GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
+ GtkRoot *root = gtk_widget_get_root (widget);
- if (gtk_widget_is_toplevel (toplevel) && gtk_widget_get_realized (toplevel))
- gdk_surface_register_dnd (gtk_widget_get_surface (toplevel));
+ if (root && gtk_widget_get_realized (GTK_WIDGET (root)))
+ gdk_surface_register_dnd (gtk_widget_get_surface (GTK_WIDGET (root)));
}
static void
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c
index a5335d1f41..a5b80424a6 100644
--- a/gtk/gtkmain.c
+++ b/gtk/gtkmain.c
@@ -1625,7 +1625,6 @@ handle_pointing_event (GdkEvent *event)
{
GtkWidget *target = NULL, *old_target = NULL, *event_widget;
GtkRoot *toplevel;
- GtkWidget *toplevel_widget;
GdkEventSequence *sequence;
GdkDevice *device;
gdouble x, y;
@@ -1635,11 +1634,7 @@ handle_pointing_event (GdkEvent *event)
if (!device || !gdk_event_get_coords (event, &x, &y))
return event_widget;
- toplevel_widget = gtk_widget_get_toplevel (event_widget);
- if (!GTK_IS_ROOT (toplevel_widget))
- return event_widget;
-
- toplevel = GTK_ROOT (toplevel_widget);
+ toplevel = gtk_widget_get_root (event_widget);
sequence = gdk_event_get_event_sequence (event);
@@ -1667,10 +1662,10 @@ handle_pointing_event (GdkEvent *event)
target = gtk_root_lookup_pointer_focus_implicit_grab (toplevel, device, sequence);
if (!target)
- target = gtk_widget_pick (toplevel_widget, x, y);
+ target = gtk_widget_pick (GTK_WIDGET (toplevel), x, y);
if (!target)
- target = toplevel_widget;
+ target = GTK_WIDGET (toplevel);
old_target = update_pointer_focus_state (toplevel, event, target);
@@ -1876,7 +1871,7 @@ gtk_main_do_event (GdkEvent *event)
case GDK_DELETE:
g_object_ref (target_widget);
if (!gtk_window_group_get_current_grab (window_group) ||
- gtk_widget_get_toplevel (gtk_window_group_get_current_grab (window_group)) == target_widget)
+ gtk_widget_get_root (gtk_window_group_get_current_grab (window_group)) == target_widget)
{
if (!GTK_IS_WINDOW (target_widget) ||
!gtk_window_emit_close_request (GTK_WINDOW (target_widget)))
@@ -1909,11 +1904,11 @@ gtk_main_do_event (GdkEvent *event)
case GDK_KEY_RELEASE:
/* make focus visible in a window that receives a key event */
{
- GtkWidget *window;
+ GtkRoot *root;
- window = gtk_widget_get_toplevel (grab_widget);
- if (GTK_IS_WINDOW (window))
- gtk_window_set_focus_visible (GTK_WINDOW (window), TRUE);
+ root = gtk_widget_get_root (grab_widget);
+ if (GTK_IS_WINDOW (root))
+ gtk_window_set_focus_visible (GTK_WINDOW (root), TRUE);
}
/* Catch alt press to enable auto-mnemonics;
@@ -1925,17 +1920,17 @@ gtk_main_do_event (GdkEvent *event)
!GTK_IS_MENU_SHELL (grab_widget))
{
gboolean mnemonics_visible;
- GtkWidget *window;
+ GtkRoot *root;
mnemonics_visible = (event->any.type == GDK_KEY_PRESS);
- window = gtk_widget_get_toplevel (grab_widget);
- if (GTK_IS_WINDOW (window))
+ root = gtk_widget_get_root (grab_widget);
+ if (GTK_IS_WINDOW (root))
{
if (mnemonics_visible)
- _gtk_window_schedule_mnemonics_visible (GTK_WINDOW (window));
+ _gtk_window_schedule_mnemonics_visible (GTK_WINDOW (root));
else
- gtk_window_set_mnemonics_visible (GTK_WINDOW (window), FALSE);
+ gtk_window_set_mnemonics_visible (GTK_WINDOW (root), FALSE);
}
}
/* else fall through */
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 47422d0991..5b835c27a5 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -2522,7 +2522,7 @@ _gtk_widget_emulate_press (GtkWidget *widget,
gdk_event_get_coords (event, &x, &y);
if (!gtk_widget_compute_point (event_widget,
- gtk_widget_get_toplevel (event_widget),
+ GTK_WIDGET (gtk_widget_get_root (event_widget)),
&GRAPHENE_POINT_INIT (x, y),
&p))
return;
@@ -3071,7 +3071,7 @@ gtk_widget_unparent (GtkWidget *widget)
GObjectNotifyQueue *nqueue;
GtkWidget *old_parent;
GtkWidget *old_prev_sibling;
- GtkWidget *toplevel;
+ GtkRoot *root;
g_return_if_fail (GTK_IS_WIDGET (widget));
@@ -3085,9 +3085,9 @@ gtk_widget_unparent (GtkWidget *widget)
g_object_freeze_notify (G_OBJECT (widget));
nqueue = g_object_notify_queue_freeze (G_OBJECT (widget), _gtk_widget_child_property_notify_context);
- toplevel = _gtk_widget_get_toplevel (widget);
- if (_gtk_widget_is_toplevel (toplevel))
- _gtk_window_unset_focus_and_default (GTK_WINDOW (toplevel), widget);
+ root = _gtk_widget_get_root (widget);
+ if (GTK_IS_WINDOW (root))
+ _gtk_window_unset_focus_and_default (GTK_WINDOW (root), widget);
if (gtk_widget_get_focus_child (priv->parent) == widget)
gtk_widget_set_focus_child (priv->parent, NULL);
@@ -3110,7 +3110,7 @@ gtk_widget_unparent (GtkWidget *widget)
if (priv->root)
gtk_widget_unroot (widget);
- toplevel = NULL;
+ root = NULL;
/* Removing a widget from a container restores the child visible
* flag to the default state, so it doesn't affect the child
@@ -3334,14 +3334,15 @@ gtk_widget_hide (GtkWidget *widget)
if (_gtk_widget_get_visible (widget))
{
- GtkWidget *toplevel = _gtk_widget_get_toplevel (widget);
GtkWidget *parent;
+ GtkRoot *root;
g_object_ref (widget);
gtk_widget_push_verify_invariants (widget);
- if (toplevel != widget && _gtk_widget_is_toplevel (toplevel))
- _gtk_window_unset_focus_and_default (GTK_WINDOW (toplevel), widget);
+ root = _gtk_widget_get_root (widget);
+ if (GTK_WIDGET (root) != widget && GTK_IS_WINDOW (root))
+ _gtk_window_unset_focus_and_default (GTK_WINDOW (root), widget);
/* a parent may now be expand=FALSE since we're hidden. */
if (priv->need_compute_expand ||
@@ -3384,11 +3385,11 @@ gtk_widget_real_hide (GtkWidget *widget)
static void
update_cursor_on_state_change (GtkWidget *widget)
{
- GtkWidget *toplevel;
+ GtkRoot *root;
- toplevel = gtk_widget_get_toplevel (widget);
- if (GTK_IS_ROOT (toplevel))
- gtk_root_update_pointer_focus_on_state_change (GTK_ROOT (toplevel), widget);
+ root = _gtk_widget_get_root (widget);
+ if (root)
+ gtk_root_update_pointer_focus_on_state_change (root, widget);
}
/**
@@ -4051,14 +4052,14 @@ gtk_widget_get_frame_clock (GtkWidget *widget)
if (priv->realized)
{
- /* We use gtk_widget_get_toplevel() here to make it explicit that
+ /* We use gtk_widget_get_root() here to make it explicit that
* the frame clock is a property of the toplevel that a widget
* is anchored to; gdk_surface_get_toplevel() will go up the
* hierarchy anyways, but should squash any funny business with
* reparenting windows and widgets.
*/
- GtkWidget *toplevel = _gtk_widget_get_toplevel (widget);
- GdkSurface *surface = _gtk_widget_get_surface (toplevel);
+ GtkRoot *root = _gtk_widget_get_root (widget);
+ GdkSurface *surface = _gtk_widget_get_surface (GTK_WIDGET (root));
g_assert (surface != NULL);
return gdk_surface_get_frame_clock (surface);
@@ -4494,7 +4495,7 @@ gtk_widget_translate_coordinates (GtkWidget *src_widget,
*
* Translates the given @point in @widget's coordinates to coordinates
* relative to @target’s coodinate system. In order to perform this
- * operation, both widgets must share a common ancestor.
+ * operation, both widgets must share a common root.
*
* Returns: %TRUE if the point could be determined, %FALSE on failure.
* In this case, 0 is stored in @out_point.
@@ -5448,10 +5449,11 @@ static void
gtk_widget_real_move_focus (GtkWidget *widget,
GtkDirectionType direction)
{
- GtkWidget *toplevel = _gtk_widget_get_toplevel (widget);
+ GtkRoot *root;
- if (widget != toplevel && GTK_IS_WINDOW (toplevel))
- g_signal_emit (toplevel, widget_signals[MOVE_FOCUS], 0, direction);
+ root = _gtk_widget_get_root (widget);
+ if (widget != GTK_WIDGET (root))
+ g_signal_emit (root, widget_signals[MOVE_FOCUS], 0, direction);
}
static gboolean
@@ -5574,12 +5576,10 @@ gtk_widget_has_visible_focus (GtkWidget *widget)
if (priv->has_focus)
{
- GtkWidget *toplevel;
+ GtkRoot *root = _gtk_widget_get_root (widget);
- toplevel = _gtk_widget_get_toplevel (widget);
-
- if (GTK_IS_WINDOW (toplevel))
- draw_focus = gtk_window_get_focus_visible (GTK_WINDOW (toplevel));
+ if (GTK_IS_WINDOW (root))
+ draw_focus = gtk_window_get_focus_visible (GTK_WINDOW (root));
else
draw_focus = TRUE;
}
@@ -5867,7 +5867,8 @@ gtk_widget_device_is_shadowed (GtkWidget *widget,
GdkDevice *device)
{
GtkWindowGroup *group;
- GtkWidget *grab_widget, *toplevel;
+ GtkWidget *grab_widget;
+ GtkRoot *root;
g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
g_return_val_if_fail (GDK_IS_DEVICE (device), FALSE);
@@ -5875,10 +5876,10 @@ gtk_widget_device_is_shadowed (GtkWidget *widget,
if (!_gtk_widget_get_realized (widget))
return TRUE;
- toplevel = _gtk_widget_get_toplevel (widget);
+ root = _gtk_widget_get_root (widget);
- if (GTK_IS_WINDOW (toplevel))
- group = gtk_window_get_group (GTK_WINDOW (toplevel));
+ if (GTK_IS_WINDOW (root))
+ group = gtk_window_get_group (GTK_WINDOW (root));
else
group = gtk_window_get_group (NULL);
@@ -6242,9 +6243,11 @@ gtk_widget_get_has_surface (GtkWidget *widget)
gboolean
gtk_widget_is_toplevel (GtkWidget *widget)
{
+ GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+
g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
- return GTK_IS_ROOT (widget);
+ return priv->parent == NULL && GTK_IS_ROOT (widget);
}
/**
@@ -6417,12 +6420,6 @@ gtk_widget_reposition_after (GtkWidget *widget,
return;
}
- if (_gtk_widget_is_toplevel (widget))
- {
- g_warning ("Can't set a parent on a toplevel widget");
- return;
- }
-
data.old_scale_factor = gtk_widget_get_scale_factor (widget);
/* keep this function in sync with gtk_menu_attach_to_widget()
@@ -7311,13 +7308,13 @@ gtk_widget_set_child_visible (GtkWidget *widget,
priv->child_visible = TRUE;
else
{
- GtkWidget *toplevel;
+ GtkRoot *root;
priv->child_visible = FALSE;
- toplevel = _gtk_widget_get_toplevel (widget);
- if (toplevel != widget && _gtk_widget_is_toplevel (toplevel))
- _gtk_window_unset_focus_and_default (GTK_WINDOW (toplevel), widget);
+ root = _gtk_widget_get_root (widget);
+ if (GTK_WIDGET (root) != widget && GTK_IS_WINDOW (root))
+ _gtk_window_unset_focus_and_default (GTK_WINDOW (root), widget);
}
if (priv->parent && _gtk_widget_get_realized (priv->parent))
@@ -7389,7 +7386,7 @@ _gtk_widget_scale_changed (GtkWidget *widget)
gint
gtk_widget_get_scale_factor (GtkWidget *widget)
{
- GtkWidget *toplevel;
+ GtkRoot *root;
GdkDisplay *display;
GdkMonitor *monitor;
@@ -7398,9 +7395,9 @@ gtk_widget_get_scale_factor (GtkWidget *widget)
if (_gtk_widget_get_realized (widget))
return gdk_surface_get_scale_factor (_gtk_widget_get_surface (widget));
- toplevel = _gtk_widget_get_toplevel (widget);
- if (toplevel && toplevel != widget)
- return gtk_widget_get_scale_factor (toplevel);
+ root = _gtk_widget_get_root (widget);
+ if (root && GTK_WIDGET (root) != widget)
+ return gtk_widget_get_scale_factor (GTK_WIDGET (root));
/* else fall back to something that is more likely to be right than
* just returning 1:
@@ -10191,7 +10188,8 @@ _gtk_widget_buildable_finish_accelerator (GtkWidget *widget,
if (g_slist_length (accel_groups) == 0)
{
accel_group = gtk_accel_group_new ();
- gtk_window_add_accel_group (GTK_WINDOW (toplevel), accel_group);
+ if (GTK_IS_WINDOW (toplevel))
+ gtk_window_add_accel_group (GTK_WINDOW (toplevel), accel_group);
}
else
{
@@ -10221,14 +10219,14 @@ gtk_widget_buildable_custom_finished (GtkBuildable *buildable,
if (strcmp (tagname, "accelerator") == 0)
{
AccelGroupParserData *accel_data;
- GtkWidget *toplevel;
+ GtkRoot *root;
accel_data = (AccelGroupParserData*)user_data;
g_assert (accel_data->object);
- toplevel = _gtk_widget_get_toplevel (GTK_WIDGET (accel_data->object));
+ root = _gtk_widget_get_root (GTK_WIDGET (accel_data->object));
- _gtk_widget_buildable_finish_accelerator (GTK_WIDGET (buildable), toplevel, user_data);
+ _gtk_widget_buildable_finish_accelerator (GTK_WIDGET (buildable), GTK_WIDGET (root), user_data);
}
else if (strcmp (tagname, "accessibility") == 0)
{
@@ -11091,6 +11089,9 @@ gtk_widget_compute_transform (GtkWidget *widget,
g_return_val_if_fail (GTK_IS_WIDGET (target), FALSE);
g_return_val_if_fail (out_transform != NULL, FALSE);
+ if (widget->priv->root != target->priv->root)
+ return FALSE;
+
/* optimization for common case: parent wants coordinates of a direct child */
if (target == widget->priv->parent)
{
@@ -13337,7 +13338,7 @@ gtk_widget_set_cursor (GtkWidget *widget,
GdkCursor *cursor)
{
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
- GtkWidget *toplevel;
+ GtkRoot *root;
g_return_if_fail (GTK_IS_WIDGET (widget));
g_return_if_fail (cursor == NULL || GDK_IS_CURSOR (cursor));
@@ -13345,9 +13346,9 @@ gtk_widget_set_cursor (GtkWidget *widget,
if (!g_set_object (&priv->cursor, cursor))
return;
- toplevel = gtk_widget_get_toplevel (widget);
- if (GTK_IS_WINDOW (toplevel))
- gtk_window_maybe_update_cursor (GTK_WINDOW (toplevel), widget, NULL);
+ root = _gtk_widget_get_root (widget);
+ if (root)
+ gtk_root_maybe_update_cursor (root, widget, NULL);
g_object_notify_by_pspec (G_OBJECT (widget), widget_props[PROP_CURSOR]);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]