summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2019-03-17 19:41:26 -0400
committerMatthias Clasen <mclasen@redhat.com>2019-04-28 12:36:04 +0000
commit121c54a6f0db2f1fae816fc18a473f283c83e006 (patch)
treef36540388c562bd44d22629d7e686680bdeda245 /gtk
parent046dfc475b5dc85f50bc9114e3ae2c2622959b96 (diff)
downloadgtk+-121c54a6f0db2f1fae816fc18a473f283c83e006.tar.gz
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.
Diffstat (limited to 'gtk')
-rw-r--r--gtk/a11y/gtkmenuitemaccessible.c9
-rw-r--r--gtk/gtkappchooserbutton.c12
-rw-r--r--gtk/gtkcellrendereraccel.c2
-rw-r--r--gtk/gtkcolorbutton.c2
-rw-r--r--gtk/gtkcoloreditor.c6
-rw-r--r--gtk/gtkdnd.c40
-rw-r--r--gtk/gtkdragdest.c11
-rw-r--r--gtk/gtklabel.c29
-rw-r--r--gtk/gtkmain.c31
-rw-r--r--gtk/gtkwidget.c105
-rw-r--r--gtk/gtkwindow.c2
11 files changed, 119 insertions, 130 deletions
diff --git a/gtk/a11y/gtkmenuitemaccessible.c b/gtk/a11y/gtkmenuitemaccessible.c
index 41cf7417b5..01b13aeed4 100644
--- a/gtk/a11y/gtkmenuitemaccessible.c
+++ b/gtk/a11y/gtkmenuitemaccessible.c
@@ -534,12 +534,11 @@ gtk_menu_item_accessible_get_keybinding (AtkAction *action,
if (GTK_IS_MENU_BAR (parent))
{
- GtkWidget *toplevel;
+ GtkRoot *root;
- toplevel = gtk_widget_get_toplevel (parent);
- if (toplevel && GTK_IS_WINDOW (toplevel))
- mnemonic_modifier =
- gtk_window_get_mnemonic_modifier (GTK_WINDOW (toplevel));
+ root = gtk_widget_get_root (parent);
+ if (root && GTK_IS_WINDOW (root))
+ mnemonic_modifier = gtk_window_get_mnemonic_modifier (GTK_WINDOW (root));
}
child = find_item_label (temp_item);
diff --git a/gtk/gtkappchooserbutton.c b/gtk/gtkappchooserbutton.c
index f8721a0720..a222f17f77 100644
--- a/gtk/gtkappchooserbutton.c
+++ b/gtk/gtkappchooserbutton.c
@@ -259,16 +259,14 @@ other_application_item_activated_cb (GtkAppChooserButton *self)
{
GtkAppChooserButtonPrivate *priv = gtk_app_chooser_button_get_instance_private (self);
GtkWidget *dialog, *widget;
- GtkWindow *toplevel;
+ GtkRoot *root;
- toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self)));
- dialog = gtk_app_chooser_dialog_new_for_content_type (toplevel,
+ root = gtk_widget_get_root (GTK_WIDGET (self));
+ dialog = gtk_app_chooser_dialog_new_for_content_type (GTK_WINDOW (root),
GTK_DIALOG_DESTROY_WITH_PARENT,
priv->content_type);
-
- gtk_window_set_modal (GTK_WINDOW (dialog), gtk_window_get_modal (toplevel));
- gtk_app_chooser_dialog_set_heading (GTK_APP_CHOOSER_DIALOG (dialog),
- priv->heading);
+ gtk_window_set_modal (GTK_WINDOW (dialog), gtk_window_get_modal (GTK_WINDOW (root)));
+ gtk_app_chooser_dialog_set_heading (GTK_APP_CHOOSER_DIALOG (dialog), priv->heading);
widget = gtk_app_chooser_dialog_get_widget (GTK_APP_CHOOSER_DIALOG (dialog));
g_object_set (widget,
diff --git a/gtk/gtkcellrendereraccel.c b/gtk/gtkcellrendereraccel.c
index 14a669b431..201656df17 100644
--- a/gtk/gtkcellrendereraccel.c
+++ b/gtk/gtkcellrendereraccel.c
@@ -452,7 +452,7 @@ gtk_cell_renderer_accel_start_editing (GtkCellRenderer *cell,
if (!is_editable)
return NULL;
- surface = gtk_widget_get_surface (gtk_widget_get_toplevel (widget));
+ surface = gtk_widget_get_surface (widget);
if (event)
seat = gdk_event_get_seat (event);
diff --git a/gtk/gtkcolorbutton.c b/gtk/gtkcolorbutton.c
index 7e10a78abc..145d9985ba 100644
--- a/gtk/gtkcolorbutton.c
+++ b/gtk/gtkcolorbutton.c
@@ -524,7 +524,7 @@ ensure_dialog (GtkColorButton *button)
priv->cs_dialog = dialog = gtk_color_chooser_dialog_new (priv->title, NULL);
gtk_window_set_hide_on_close (GTK_WINDOW (dialog), TRUE);
- if (gtk_widget_is_toplevel (parent) && GTK_IS_WINDOW (parent))
+ if (GTK_IS_WINDOW (parent))
{
if (GTK_WINDOW (parent) != gtk_window_get_transient_for (GTK_WINDOW (dialog)))
gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent));
diff --git a/gtk/gtkcoloreditor.c b/gtk/gtkcoloreditor.c
index e6b4035d1e..5f341ffe58 100644
--- a/gtk/gtkcoloreditor.c
+++ b/gtk/gtkcoloreditor.c
@@ -193,7 +193,7 @@ popup_edit (GtkWidget *widget,
GtkColorEditor *editor)
{
GtkWidget *popup = NULL;
- GtkWidget *toplevel;
+ GtkRoot *root;
GtkWidget *focus;
gint position;
gint s, e;
@@ -224,8 +224,8 @@ popup_edit (GtkWidget *widget,
else if (popup)
{
dismiss_current_popup (editor);
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (editor));
- g_set_object (&editor->priv->popdown_focus, gtk_root_get_focus (GTK_ROOT (toplevel)));
+ root = gtk_widget_get_root (GTK_WIDGET (editor));
+ g_set_object (&editor->priv->popdown_focus, gtk_root_get_focus (root));
editor->priv->current_popup = popup;
editor->priv->popup_position = position;
gtk_widget_show (popup);
diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c
index 8c1312c383..89d8f9625d 100644
--- a/gtk/gtkdnd.c
+++ b/gtk/gtkdnd.c
@@ -401,9 +401,7 @@ _gtk_drag_dest_handle_event (GtkWidget *toplevel,
case GDK_DRAG_MOTION:
case GDK_DROP_START:
{
- GdkSurface *surface;
- gint tx, ty;
- double x_root, y_root;
+ double x, y;
gboolean found;
if (event_type == GDK_DROP_START)
@@ -418,16 +416,13 @@ _gtk_drag_dest_handle_event (GtkWidget *toplevel,
}
}
- surface = gtk_widget_get_surface (toplevel);
-
- gdk_surface_get_position (surface, &tx, &ty);
- gdk_event_get_root_coords (event, &x_root, &y_root);
+ gdk_event_get_coords (event, &x, &y);
found = gtk_drop_find_widget (toplevel,
drop,
info,
- x_root - tx,
- y_root - ty,
+ x,
+ y,
time,
(event_type == GDK_DRAG_MOTION) ?
gtk_drag_dest_motion :
@@ -452,7 +447,7 @@ _gtk_drag_dest_handle_event (GtkWidget *toplevel,
}
static gboolean
-gtk_drop_find_widget (GtkWidget *widget,
+gtk_drop_find_widget (GtkWidget *event_widget,
GdkDrop *drop,
GtkDragDestInfo *info,
gint x,
@@ -460,18 +455,19 @@ gtk_drop_find_widget (GtkWidget *widget,
guint32 time,
GtkDragDestCallback callback)
{
- if (!gtk_widget_get_mapped (widget) ||
- !gtk_widget_get_sensitive (widget))
+ GtkWidget *widget;
+
+ if (!gtk_widget_get_mapped (event_widget) ||
+ !gtk_widget_get_sensitive (event_widget))
return FALSE;
- /* Get the widget at the pointer coordinates and travel up
- * the widget hierarchy from there.
- */
- widget = _gtk_widget_find_at_coords (gtk_widget_get_surface (widget),
- x, y, &x, &y);
+ widget = gtk_widget_pick (event_widget, x, y, GTK_PICK_DEFAULT);
+
if (!widget)
return FALSE;
+ gtk_widget_translate_coordinates (event_widget, widget, x, y, &x, &y);
+
while (widget)
{
GtkWidget *parent;
@@ -884,7 +880,7 @@ gtk_drag_begin_internal (GtkWidget *widget,
int y)
{
GtkDragSourceInfo *info;
- GtkWidget *toplevel;
+ GtkRoot *root;
GdkDrag *drag;
double px, py;
int dx, dy;
@@ -893,9 +889,9 @@ gtk_drag_begin_internal (GtkWidget *widget,
if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
device = gdk_device_get_associated_device (device);
- toplevel = gtk_widget_get_toplevel (widget);
- gtk_widget_translate_coordinates (widget, toplevel, x, y, &x, &y);
- gdk_surface_get_device_position (gtk_widget_get_surface (toplevel),
+ root = gtk_widget_get_root (widget);
+ gtk_widget_translate_coordinates (widget, GTK_WIDGET (root), x, y, &x, &y);
+ gdk_surface_get_device_position (gtk_widget_get_surface (widget),
device,
&px, &py,
NULL);
@@ -906,7 +902,7 @@ gtk_drag_begin_internal (GtkWidget *widget,
content->widget = g_object_ref (widget);
content->formats = gdk_content_formats_ref (target_list);
- drag = gdk_drag_begin (gtk_widget_get_surface (toplevel), device, GDK_CONTENT_PROVIDER (content), actions, dx, dy);
+ drag = gdk_drag_begin (gtk_widget_get_surface (GTK_WIDGET (root)), device, GDK_CONTENT_PROVIDER (content), actions, dx, dy);
if (drag == NULL)
{
g_object_unref (content);
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/gtklabel.c b/gtk/gtklabel.c
index fd894b295b..16ef24e076 100644
--- a/gtk/gtklabel.c
+++ b/gtk/gtklabel.c
@@ -4559,28 +4559,28 @@ static void
connect_mnemonics_visible_notify (GtkLabel *label)
{
GtkLabelPrivate *priv = gtk_label_get_instance_private (label);
- GtkWidget *toplevel;
+ GtkRoot *root;
gboolean connected;
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (label));
+ root = gtk_widget_get_root (GTK_WIDGET (label));
- if (!GTK_IS_WINDOW (toplevel))
+ if (!GTK_IS_WINDOW (root))
return;
/* always set up this widgets initial value */
priv->mnemonics_visible =
- gtk_window_get_mnemonics_visible (GTK_WINDOW (toplevel));
+ gtk_window_get_mnemonics_visible (GTK_WINDOW (root));
connected =
- GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (toplevel), quark_mnemonics_visible_connected));
+ GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (root), quark_mnemonics_visible_connected));
if (!connected)
{
- g_signal_connect (toplevel,
+ g_signal_connect (root,
"notify::mnemonics-visible",
G_CALLBACK (label_mnemonics_visible_changed),
label);
- g_object_set_qdata (G_OBJECT (toplevel),
+ g_object_set_qdata (G_OBJECT (root),
quark_mnemonics_visible_connected,
GINT_TO_POINTER (1));
}
@@ -5865,12 +5865,10 @@ gtk_label_move_cursor (GtkLabel *label,
count > 0 ?
GTK_DIR_RIGHT : GTK_DIR_LEFT))
{
- GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (label));
+ GtkRoot *root = gtk_widget_get_root (GTK_WIDGET (label));
- if (toplevel)
- gtk_widget_child_focus (toplevel,
- count > 0 ?
- GTK_DIR_RIGHT : GTK_DIR_LEFT);
+ if (root)
+ gtk_widget_child_focus (GTK_WIDGET (root), count > 0 ? GTK_DIR_RIGHT : GTK_DIR_LEFT);
}
}
else
@@ -6152,11 +6150,14 @@ gtk_label_activate_link (GtkLabel *label,
const gchar *uri)
{
GtkWidget *widget = GTK_WIDGET (label);
- GtkWidget *top_level = gtk_widget_get_toplevel (widget);
+ GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
guint32 timestamp = gtk_get_current_event_time ();
GError *error = NULL;
- if (!gtk_show_uri_on_window (GTK_WINDOW (top_level), uri, timestamp, &error))
+ if (!GTK_IS_WINDOW (toplevel))
+ return FALSE;
+
+ if (!gtk_show_uri_on_window (GTK_WINDOW (toplevel), uri, timestamp, &error))
{
g_warning ("Unable to show '%s': %s", uri, error->message);
g_error_free (error);
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c
index fd2a443a6f..e24c52f971 100644
--- a/gtk/gtkmain.c
+++ b/gtk/gtkmain.c
@@ -1661,7 +1661,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;
@@ -1671,11 +1670,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);
@@ -1705,10 +1700,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, GTK_PICK_DEFAULT);
+ target = gtk_widget_pick (GTK_WIDGET (toplevel), x, y, GTK_PICK_DEFAULT);
if (!target)
- target = toplevel_widget;
+ target = GTK_WIDGET (toplevel);
old_target = update_pointer_focus_state (toplevel, event, target);
@@ -1914,7 +1909,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 (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)))
@@ -1947,11 +1942,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;
@@ -1963,17 +1958,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);
}
}
G_GNUC_FALLTHROUGH;
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index ede300834c..b1cbe8eee3 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -2486,7 +2486,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;
@@ -2957,7 +2957,7 @@ gtk_widget_unparent (GtkWidget *widget)
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
GtkWidget *old_parent;
GtkWidget *old_prev_sibling;
- GtkWidget *toplevel;
+ GtkRoot *root;
g_return_if_fail (GTK_IS_WIDGET (widget));
@@ -2970,9 +2970,9 @@ gtk_widget_unparent (GtkWidget *widget)
g_object_freeze_notify (G_OBJECT (widget));
- 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);
@@ -2995,7 +2995,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
@@ -3212,14 +3212,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 ||
@@ -3262,11 +3263,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);
}
/**
@@ -4195,14 +4196,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);
@@ -4651,7 +4652,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.
@@ -5605,10 +5606,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
@@ -5731,12 +5733,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;
}
@@ -6024,7 +6024,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);
@@ -6032,10 +6033,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);
@@ -6399,9 +6400,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);
}
/**
@@ -6574,12 +6577,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()
@@ -7407,13 +7404,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))
@@ -7485,7 +7482,7 @@ _gtk_widget_scale_changed (GtkWidget *widget)
gint
gtk_widget_get_scale_factor (GtkWidget *widget)
{
- GtkWidget *toplevel;
+ GtkRoot *root;
GdkDisplay *display;
GdkMonitor *monitor;
@@ -7494,9 +7491,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:
@@ -10322,7 +10319,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
{
@@ -10418,14 +10416,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)
{
@@ -11351,6 +11349,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)
{
@@ -13597,7 +13598,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));
@@ -13605,9 +13606,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]);
}
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index fe400ddb91..0e86d264a6 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -6279,7 +6279,7 @@ gtk_window_propagate_key_event (GtkWindow *window,
while (!handled &&
focus && focus != widget &&
- gtk_widget_get_toplevel (focus) == widget)
+ gtk_widget_get_root (focus) == GTK_ROOT (widget))
{
GtkWidget *parent;