diff options
author | Jasper St. Pierre <jstpierre@mecheye.net> | 2014-09-17 16:16:45 -0600 |
---|---|---|
committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2014-09-17 16:21:46 -0600 |
commit | a8f80db840868dd991a7d0b153905c4ce5111b32 (patch) | |
tree | f4dca41fd969685b5f7030b74f33205b4b3391dc | |
parent | eb6fb7326d781fe778f464f4a740528b2ad976e0 (diff) | |
download | gtk+-wip/frame-extents-fixes.tar.gz |
gtkwindow: Make sure to update the shadow width, opaque region and border windows when realizingwip/frame-extents-fixes
Otherwise, they might not be properly set before the window is mapped.
For the opaque region and border window, it means that they won't get
set before the next size allocation, which tends to not be a bit deal.
For the shadow width, though, _GTK_FRAME_EXTENTS has a different meaning
when it's set before the window is mapped, so we need to make sure that
it's properly set when the window is mapped.
-rw-r--r-- | gtk/gtkwindow.c | 791 |
1 files changed, 403 insertions, 388 deletions
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 5145b7427e..4a686374ec 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -6248,354 +6248,6 @@ check_scale_changed (GtkWindow *window) } static void -gtk_window_realize (GtkWidget *widget) -{ - GtkAllocation allocation; - GtkWindow *window; - GdkWindow *parent_window; - GdkWindow *gdk_window; - GdkWindowAttr attributes; - gint attributes_mask; - GtkWindowPrivate *priv; - gint i; - GList *link; - - window = GTK_WINDOW (widget); - priv = window->priv; - - if (!priv->client_decorated && gtk_window_should_use_csd (window)) - create_decoration (widget); - - gtk_widget_get_allocation (widget, &allocation); - - if (gtk_widget_get_parent_window (widget)) - { - G_GNUC_BEGIN_IGNORE_DEPRECATIONS; - gtk_container_set_resize_mode (GTK_CONTAINER (widget), GTK_RESIZE_PARENT); - G_GNUC_END_IGNORE_DEPRECATIONS; - - attributes.x = allocation.x; - attributes.y = allocation.y; - attributes.width = allocation.width; - attributes.height = allocation.height; - attributes.window_type = GDK_WINDOW_CHILD; - - attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK; - - attributes.visual = gtk_widget_get_visual (widget); - attributes.wclass = GDK_INPUT_OUTPUT; - - attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; - - gdk_window = gdk_window_new (gtk_widget_get_parent_window (widget), - &attributes, attributes_mask); - gtk_widget_set_window (widget, gdk_window); - gtk_widget_register_window (widget, gdk_window); - gtk_widget_set_realized (widget, TRUE); - - return; - } - - G_GNUC_BEGIN_IGNORE_DEPRECATIONS; - gtk_container_set_resize_mode (GTK_CONTAINER (window), GTK_RESIZE_QUEUE); - G_GNUC_END_IGNORE_DEPRECATIONS; - - /* ensure widget tree is properly size allocated */ - if (allocation.x == -1 && - allocation.y == -1 && - allocation.width == 1 && - allocation.height == 1) - { - gint w, h; - - allocation.x = 0; - allocation.y = 0; - - gtk_window_guess_default_size (window, &allocation.width, &allocation.height); - gtk_window_get_remembered_size (window, &w, &h); - allocation.width = MAX (allocation.width, w); - allocation.height = MAX (allocation.height, h); - if (allocation.width == 0 || allocation.height == 0) - { - /* non-empty window */ - allocation.width = 200; - allocation.height = 200; - } - gtk_widget_size_allocate (widget, &allocation); - - _gtk_container_queue_resize (GTK_CONTAINER (widget)); - - g_return_if_fail (!gtk_widget_get_realized (widget)); - } - - if (priv->hardcoded_window) - { - gdk_window = priv->hardcoded_window; - gtk_widget_get_allocation (widget, &allocation); - gdk_window_resize (gdk_window, allocation.width, allocation.height); - } - else - { - switch (priv->type) - { - case GTK_WINDOW_TOPLEVEL: - attributes.window_type = GDK_WINDOW_TOPLEVEL; - break; - case GTK_WINDOW_POPUP: - attributes.window_type = GDK_WINDOW_TEMP; - break; - default: - g_warning (G_STRLOC": Unknown window type %d!", priv->type); - break; - } - -#ifdef GDK_WINDOWING_WAYLAND - if (priv->use_subsurface && - GDK_IS_WAYLAND_DISPLAY (gtk_widget_get_display (widget))) - attributes.window_type = GDK_WINDOW_SUBSURFACE; -#endif - - attributes.title = priv->title; - attributes.wmclass_name = priv->wmclass_name; - attributes.wmclass_class = priv->wmclass_class; - attributes.wclass = GDK_INPUT_OUTPUT; - attributes.visual = gtk_widget_get_visual (widget); - - attributes_mask = 0; - parent_window = gdk_screen_get_root_window (gtk_widget_get_screen (widget)); - - gtk_widget_get_allocation (widget, &allocation); - attributes.width = allocation.width; - attributes.height = allocation.height; - attributes.event_mask = gtk_widget_get_events (widget); - attributes.event_mask |= (GDK_EXPOSURE_MASK | - GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_RELEASE_MASK | - GDK_BUTTON_MOTION_MASK | - GDK_KEY_PRESS_MASK | - GDK_KEY_RELEASE_MASK | - GDK_ENTER_NOTIFY_MASK | - GDK_LEAVE_NOTIFY_MASK | - GDK_FOCUS_CHANGE_MASK | - GDK_STRUCTURE_MASK); - - if (priv->decorated && - (priv->client_decorated || priv->custom_title)) - attributes.event_mask |= GDK_POINTER_MOTION_MASK; - - attributes.type_hint = priv->type_hint; - - attributes_mask |= GDK_WA_VISUAL | GDK_WA_TYPE_HINT; - attributes_mask |= (priv->title ? GDK_WA_TITLE : 0); - attributes_mask |= (priv->wmclass_name ? GDK_WA_WMCLASS : 0); - - gdk_window = gdk_window_new (parent_window, &attributes, attributes_mask); - } - - gtk_widget_set_window (widget, gdk_window); - gtk_widget_register_window (widget, gdk_window); - gtk_widget_set_realized (widget, TRUE); - - /* We don't need to set a background on the GdkWindow; with decorations - * we draw the background ourself - */ - if (!priv->client_decorated) - gtk_style_context_set_background (gtk_widget_get_style_context (widget), gdk_window); - - attributes.x = allocation.x; - attributes.y = allocation.y; - attributes.width = allocation.width; - attributes.height = allocation.height; - attributes.window_type = GDK_WINDOW_CHILD; - - attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK; - - attributes.visual = gtk_widget_get_visual (widget); - attributes.wclass = GDK_INPUT_OUTPUT; - - attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; - - if (priv->client_decorated && priv->type == GTK_WINDOW_TOPLEVEL) - { - GdkCursorType cursor_type[8] = { - GDK_TOP_LEFT_CORNER, - GDK_TOP_SIDE, - GDK_TOP_RIGHT_CORNER, - GDK_LEFT_SIDE, - GDK_RIGHT_SIDE, - GDK_BOTTOM_LEFT_CORNER, - GDK_BOTTOM_SIDE, - GDK_BOTTOM_RIGHT_CORNER - }; - - attributes.wclass = GDK_INPUT_ONLY; - attributes.width = 1; - attributes.height = 1; - attributes.event_mask = GDK_BUTTON_PRESS_MASK; - attributes_mask = GDK_WA_CURSOR; - - for (i = 0; i < 8; i++) - { - attributes.cursor = gdk_cursor_new (cursor_type[i]); - priv->border_window[i] = gdk_window_new (gdk_window, &attributes, attributes_mask); - g_object_unref (attributes.cursor); - - gdk_window_show (priv->border_window[i]); - gtk_widget_register_window (widget, priv->border_window[i]); - } - } - - if (priv->transient_parent && - gtk_widget_get_realized (GTK_WIDGET (priv->transient_parent))) - gdk_window_set_transient_for (gdk_window, - gtk_widget_get_window (GTK_WIDGET (priv->transient_parent))); - - if (priv->wm_role) - gdk_window_set_role (gdk_window, priv->wm_role); - - if (!priv->decorated || priv->client_decorated) - gdk_window_set_decorations (gdk_window, 0); - else if (priv->custom_title) - gdk_window_set_decorations (gdk_window, GDK_DECOR_BORDER); - - if (!priv->deletable) - gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_CLOSE); - - if (gtk_window_get_skip_pager_hint (window)) - gdk_window_set_skip_pager_hint (gdk_window, TRUE); - - if (gtk_window_get_skip_taskbar_hint (window)) - gdk_window_set_skip_taskbar_hint (gdk_window, TRUE); - - if (gtk_window_get_accept_focus (window)) - gdk_window_set_accept_focus (gdk_window, TRUE); - else - gdk_window_set_accept_focus (gdk_window, FALSE); - - if (gtk_window_get_focus_on_map (window)) - gdk_window_set_focus_on_map (gdk_window, TRUE); - else - gdk_window_set_focus_on_map (gdk_window, FALSE); - - if (priv->modal) - gdk_window_set_modal_hint (gdk_window, TRUE); - else - gdk_window_set_modal_hint (gdk_window, FALSE); - - if (priv->startup_id) - { -#ifdef GDK_WINDOWING_X11 - if (GDK_IS_X11_WINDOW (gdk_window)) - { - guint32 timestamp = extract_time_from_startup_id (priv->startup_id); - if (timestamp != GDK_CURRENT_TIME) - gdk_x11_window_set_user_time (gdk_window, timestamp); - } -#endif - if (!startup_id_is_fake (priv->startup_id)) - gdk_window_set_startup_id (gdk_window, priv->startup_id); - } - -#ifdef GDK_WINDOWING_X11 - if (priv->initial_timestamp != GDK_CURRENT_TIME) - { - if (GDK_IS_X11_WINDOW (gdk_window)) - gdk_x11_window_set_user_time (gdk_window, priv->initial_timestamp); - } -#endif - - if (priv->application) - gtk_application_handle_window_realize (priv->application, window); - - /* Icons */ - gtk_window_realize_icon (window); - - link = priv->popovers; - - while (link) - { - GtkWindowPopover *popover = link->data; - link = link->next; - popover_realize (popover->widget, popover, window); - } - - check_scale_changed (window); -} - -static void -popover_unrealize (GtkWidget *widget, - GtkWindowPopover *popover, - GtkWindow *window) -{ - gtk_widget_unregister_window (GTK_WIDGET (window), popover->window); - gtk_widget_unrealize (popover->widget); - gdk_window_destroy (popover->window); - popover->window = NULL; -} - -static void -gtk_window_unrealize (GtkWidget *widget) -{ - GtkWindow *window = GTK_WINDOW (widget); - GtkWindowPrivate *priv = window->priv; - GtkWindowGeometryInfo *info; - GList *link; - gint i; - - /* On unrealize, we reset the size of the window such - * that we will re-apply the default sizing stuff - * next time we show the window. - * - * Default positioning is reset on unmap, instead of unrealize. - */ - priv->need_default_size = TRUE; - info = gtk_window_get_geometry_info (window, FALSE); - if (info) - { - info->resize_width = -1; - info->resize_height = -1; - info->last.configure_request.x = 0; - info->last.configure_request.y = 0; - info->last.configure_request.width = -1; - info->last.configure_request.height = -1; - /* be sure we reset geom hints on re-realize */ - info->last.flags = 0; - } - - if (priv->popup_menu) - { - gtk_widget_destroy (priv->popup_menu); - priv->popup_menu = NULL; - } - - /* Icons */ - gtk_window_unrealize_icon (window); - - if (priv->border_window[0] != NULL) - { - for (i = 0; i < 8; i++) - { - gtk_widget_unregister_window (widget, priv->border_window[i]); - gdk_window_destroy (priv->border_window[i]); - priv->border_window[i] = NULL; - } - } - - link = priv->popovers; - - while (link) - { - GtkWindowPopover *popover = link->data; - link = link->next; - popover_unrealize (popover->widget, popover, window); - } - - GTK_WIDGET_CLASS (gtk_window_parent_class)->unrealize (widget); - - priv->hardcoded_window = NULL; -} - -static void sum_borders (GtkBorder *one, GtkBorder *two) { @@ -6633,25 +6285,6 @@ add_window_frame_style_class (GtkStyleContext *context) } static void -update_window_style_classes (GtkWindow *window) -{ - GtkWindowPrivate *priv = window->priv; - GtkStyleContext *context; - - context = gtk_widget_get_style_context (GTK_WIDGET (window)); - - if (priv->tiled) - gtk_style_context_add_class (context, "tiled"); - else - gtk_style_context_remove_class (context, "tiled"); - - if (priv->maximized) - gtk_style_context_add_class (context, "maximized"); - else - gtk_style_context_remove_class (context, "maximized"); -} - -static void get_shadow_width (GtkWidget *widget, GtkBorder *shadow_width) { @@ -7075,6 +6708,400 @@ update_opaque_region (GtkWindow *window, } static void +update_realized_window_properties (GtkWindow *window, + GtkAllocation *child_allocation, + GtkBorder *window_border) +{ + GtkWindowPrivate *priv = window->priv; + + if (priv->client_decorated) + update_shadow_width (window, window_border); + + update_opaque_region (window, window_border, child_allocation); + + if (gtk_widget_is_toplevel (GTK_WIDGET (window))) + update_border_windows (window); +} + +static void +gtk_window_realize (GtkWidget *widget) +{ + GtkAllocation allocation; + GtkAllocation child_allocation; + GtkWindow *window; + GdkWindow *parent_window; + GdkWindow *gdk_window; + GdkWindowAttr attributes; + GtkBorder window_border; + gint attributes_mask; + GtkWindowPrivate *priv; + gint i; + GList *link; + + window = GTK_WINDOW (widget); + priv = window->priv; + + if (!priv->client_decorated && gtk_window_should_use_csd (window)) + create_decoration (widget); + + gtk_widget_get_allocation (widget, &allocation); + + if (gtk_widget_get_parent_window (widget)) + { + G_GNUC_BEGIN_IGNORE_DEPRECATIONS; + gtk_container_set_resize_mode (GTK_CONTAINER (widget), GTK_RESIZE_PARENT); + G_GNUC_END_IGNORE_DEPRECATIONS; + + attributes.x = allocation.x; + attributes.y = allocation.y; + attributes.width = allocation.width; + attributes.height = allocation.height; + attributes.window_type = GDK_WINDOW_CHILD; + + attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK; + + attributes.visual = gtk_widget_get_visual (widget); + attributes.wclass = GDK_INPUT_OUTPUT; + + attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; + + gdk_window = gdk_window_new (gtk_widget_get_parent_window (widget), + &attributes, attributes_mask); + gtk_widget_set_window (widget, gdk_window); + gtk_widget_register_window (widget, gdk_window); + gtk_widget_set_realized (widget, TRUE); + + return; + } + + G_GNUC_BEGIN_IGNORE_DEPRECATIONS; + gtk_container_set_resize_mode (GTK_CONTAINER (window), GTK_RESIZE_QUEUE); + G_GNUC_END_IGNORE_DEPRECATIONS; + + /* ensure widget tree is properly size allocated */ + if (allocation.x == -1 && + allocation.y == -1 && + allocation.width == 1 && + allocation.height == 1) + { + gint w, h; + + allocation.x = 0; + allocation.y = 0; + + gtk_window_guess_default_size (window, &allocation.width, &allocation.height); + gtk_window_get_remembered_size (window, &w, &h); + allocation.width = MAX (allocation.width, w); + allocation.height = MAX (allocation.height, h); + if (allocation.width == 0 || allocation.height == 0) + { + /* non-empty window */ + allocation.width = 200; + allocation.height = 200; + } + gtk_widget_size_allocate (widget, &allocation); + + _gtk_container_queue_resize (GTK_CONTAINER (widget)); + + g_return_if_fail (!gtk_widget_get_realized (widget)); + } + + if (priv->hardcoded_window) + { + gdk_window = priv->hardcoded_window; + gtk_widget_get_allocation (widget, &allocation); + gdk_window_resize (gdk_window, allocation.width, allocation.height); + } + else + { + switch (priv->type) + { + case GTK_WINDOW_TOPLEVEL: + attributes.window_type = GDK_WINDOW_TOPLEVEL; + break; + case GTK_WINDOW_POPUP: + attributes.window_type = GDK_WINDOW_TEMP; + break; + default: + g_warning (G_STRLOC": Unknown window type %d!", priv->type); + break; + } + +#ifdef GDK_WINDOWING_WAYLAND + if (priv->use_subsurface && + GDK_IS_WAYLAND_DISPLAY (gtk_widget_get_display (widget))) + attributes.window_type = GDK_WINDOW_SUBSURFACE; +#endif + + attributes.title = priv->title; + attributes.wmclass_name = priv->wmclass_name; + attributes.wmclass_class = priv->wmclass_class; + attributes.wclass = GDK_INPUT_OUTPUT; + attributes.visual = gtk_widget_get_visual (widget); + + attributes_mask = 0; + parent_window = gdk_screen_get_root_window (gtk_widget_get_screen (widget)); + + gtk_widget_get_allocation (widget, &allocation); + attributes.width = allocation.width; + attributes.height = allocation.height; + attributes.event_mask = gtk_widget_get_events (widget); + attributes.event_mask |= (GDK_EXPOSURE_MASK | + GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_BUTTON_MOTION_MASK | + GDK_KEY_PRESS_MASK | + GDK_KEY_RELEASE_MASK | + GDK_ENTER_NOTIFY_MASK | + GDK_LEAVE_NOTIFY_MASK | + GDK_FOCUS_CHANGE_MASK | + GDK_STRUCTURE_MASK); + + if (priv->decorated && + (priv->client_decorated || priv->custom_title)) + attributes.event_mask |= GDK_POINTER_MOTION_MASK; + + attributes.type_hint = priv->type_hint; + + attributes_mask |= GDK_WA_VISUAL | GDK_WA_TYPE_HINT; + attributes_mask |= (priv->title ? GDK_WA_TITLE : 0); + attributes_mask |= (priv->wmclass_name ? GDK_WA_WMCLASS : 0); + + gdk_window = gdk_window_new (parent_window, &attributes, attributes_mask); + } + + gtk_widget_set_window (widget, gdk_window); + gtk_widget_register_window (widget, gdk_window); + gtk_widget_set_realized (widget, TRUE); + + /* We don't need to set a background on the GdkWindow; with decorations + * we draw the background ourself + */ + if (!priv->client_decorated) + gtk_style_context_set_background (gtk_widget_get_style_context (widget), gdk_window); + + attributes.x = allocation.x; + attributes.y = allocation.y; + attributes.width = allocation.width; + attributes.height = allocation.height; + attributes.window_type = GDK_WINDOW_CHILD; + + attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK; + + attributes.visual = gtk_widget_get_visual (widget); + attributes.wclass = GDK_INPUT_OUTPUT; + + attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; + + if (priv->client_decorated && priv->type == GTK_WINDOW_TOPLEVEL) + { + GdkCursorType cursor_type[8] = { + GDK_TOP_LEFT_CORNER, + GDK_TOP_SIDE, + GDK_TOP_RIGHT_CORNER, + GDK_LEFT_SIDE, + GDK_RIGHT_SIDE, + GDK_BOTTOM_LEFT_CORNER, + GDK_BOTTOM_SIDE, + GDK_BOTTOM_RIGHT_CORNER + }; + + attributes.wclass = GDK_INPUT_ONLY; + attributes.width = 1; + attributes.height = 1; + attributes.event_mask = GDK_BUTTON_PRESS_MASK; + attributes_mask = GDK_WA_CURSOR; + + for (i = 0; i < 8; i++) + { + attributes.cursor = gdk_cursor_new (cursor_type[i]); + priv->border_window[i] = gdk_window_new (gdk_window, &attributes, attributes_mask); + g_object_unref (attributes.cursor); + + gdk_window_show (priv->border_window[i]); + gtk_widget_register_window (widget, priv->border_window[i]); + } + } + + if (priv->transient_parent && + gtk_widget_get_realized (GTK_WIDGET (priv->transient_parent))) + gdk_window_set_transient_for (gdk_window, + gtk_widget_get_window (GTK_WIDGET (priv->transient_parent))); + + if (priv->wm_role) + gdk_window_set_role (gdk_window, priv->wm_role); + + if (!priv->decorated || priv->client_decorated) + gdk_window_set_decorations (gdk_window, 0); + else if (priv->custom_title) + gdk_window_set_decorations (gdk_window, GDK_DECOR_BORDER); + + if (!priv->deletable) + gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_CLOSE); + + if (gtk_window_get_skip_pager_hint (window)) + gdk_window_set_skip_pager_hint (gdk_window, TRUE); + + if (gtk_window_get_skip_taskbar_hint (window)) + gdk_window_set_skip_taskbar_hint (gdk_window, TRUE); + + if (gtk_window_get_accept_focus (window)) + gdk_window_set_accept_focus (gdk_window, TRUE); + else + gdk_window_set_accept_focus (gdk_window, FALSE); + + if (gtk_window_get_focus_on_map (window)) + gdk_window_set_focus_on_map (gdk_window, TRUE); + else + gdk_window_set_focus_on_map (gdk_window, FALSE); + + if (priv->modal) + gdk_window_set_modal_hint (gdk_window, TRUE); + else + gdk_window_set_modal_hint (gdk_window, FALSE); + + if (priv->startup_id) + { +#ifdef GDK_WINDOWING_X11 + if (GDK_IS_X11_WINDOW (gdk_window)) + { + guint32 timestamp = extract_time_from_startup_id (priv->startup_id); + if (timestamp != GDK_CURRENT_TIME) + gdk_x11_window_set_user_time (gdk_window, timestamp); + } +#endif + if (!startup_id_is_fake (priv->startup_id)) + gdk_window_set_startup_id (gdk_window, priv->startup_id); + } + +#ifdef GDK_WINDOWING_X11 + if (priv->initial_timestamp != GDK_CURRENT_TIME) + { + if (GDK_IS_X11_WINDOW (gdk_window)) + gdk_x11_window_set_user_time (gdk_window, priv->initial_timestamp); + } +#endif + + child_allocation.x = 0; + child_allocation.y = 0; + child_allocation.width = allocation.width; + child_allocation.height = allocation.height; + + get_shadow_width (widget, &window_border); + + update_realized_window_properties (window, &child_allocation, &window_border); + + if (priv->application) + gtk_application_handle_window_realize (priv->application, window); + + /* Icons */ + gtk_window_realize_icon (window); + + link = priv->popovers; + + while (link) + { + GtkWindowPopover *popover = link->data; + link = link->next; + popover_realize (popover->widget, popover, window); + } + + check_scale_changed (window); +} + +static void +popover_unrealize (GtkWidget *widget, + GtkWindowPopover *popover, + GtkWindow *window) +{ + gtk_widget_unregister_window (GTK_WIDGET (window), popover->window); + gtk_widget_unrealize (popover->widget); + gdk_window_destroy (popover->window); + popover->window = NULL; +} + +static void +gtk_window_unrealize (GtkWidget *widget) +{ + GtkWindow *window = GTK_WINDOW (widget); + GtkWindowPrivate *priv = window->priv; + GtkWindowGeometryInfo *info; + GList *link; + gint i; + + /* On unrealize, we reset the size of the window such + * that we will re-apply the default sizing stuff + * next time we show the window. + * + * Default positioning is reset on unmap, instead of unrealize. + */ + priv->need_default_size = TRUE; + info = gtk_window_get_geometry_info (window, FALSE); + if (info) + { + info->resize_width = -1; + info->resize_height = -1; + info->last.configure_request.x = 0; + info->last.configure_request.y = 0; + info->last.configure_request.width = -1; + info->last.configure_request.height = -1; + /* be sure we reset geom hints on re-realize */ + info->last.flags = 0; + } + + if (priv->popup_menu) + { + gtk_widget_destroy (priv->popup_menu); + priv->popup_menu = NULL; + } + + /* Icons */ + gtk_window_unrealize_icon (window); + + if (priv->border_window[0] != NULL) + { + for (i = 0; i < 8; i++) + { + gtk_widget_unregister_window (widget, priv->border_window[i]); + gdk_window_destroy (priv->border_window[i]); + priv->border_window[i] = NULL; + } + } + + link = priv->popovers; + + while (link) + { + GtkWindowPopover *popover = link->data; + link = link->next; + popover_unrealize (popover->widget, popover, window); + } + + GTK_WIDGET_CLASS (gtk_window_parent_class)->unrealize (widget); + + priv->hardcoded_window = NULL; +} + +static void +update_window_style_classes (GtkWindow *window) +{ + GtkWindowPrivate *priv = window->priv; + GtkStyleContext *context; + + context = gtk_widget_get_style_context (GTK_WIDGET (window)); + + if (priv->tiled) + gtk_style_context_add_class (context, "tiled"); + else + gtk_style_context_remove_class (context, "tiled"); + + if (priv->maximized) + gtk_style_context_add_class (context, "maximized"); + else + gtk_style_context_remove_class (context, "maximized"); +} + +static void popover_size_allocate (GtkWidget *widget, GtkWindowPopover *popover, GtkWindow *window) @@ -7139,20 +7166,17 @@ _gtk_window_set_allocation (GtkWindow *window, gtk_widget_set_allocation (widget, allocation); - get_shadow_width (widget, &window_border); - border_width = gtk_container_get_border_width (GTK_CONTAINER (window)); - child_allocation.x = 0; child_allocation.y = 0; child_allocation.width = allocation->width; child_allocation.height = allocation->height; - priv->title_height = 0; + get_shadow_width (widget, &window_border); - if (priv->client_decorated) - update_shadow_width (window, &window_border); + if (gtk_widget_get_realized (widget)) + update_realized_window_properties (window, &child_allocation, &window_border); - update_opaque_region (window, &window_border, &child_allocation); + priv->title_height = 0; if (priv->title_box != NULL && gtk_widget_get_visible (priv->title_box) && @@ -7188,23 +7212,14 @@ _gtk_window_set_allocation (GtkWindow *window, priv->title_height; } - if (gtk_widget_get_realized (widget)) + if (!gtk_widget_is_toplevel (widget) && gtk_widget_get_realized (widget)) { - /* If it's not a toplevel we're embedded, we need to resize - * the window's window and skip the grip. - */ - if (!gtk_widget_is_toplevel (widget)) - { - gdk_window_move_resize (gtk_widget_get_window (widget), - allocation->x, allocation->y, - allocation->width, allocation->height); - } - else - { - update_border_windows (window); - } + gdk_window_move_resize (gtk_widget_get_window (widget), + allocation->x, allocation->y, + allocation->width, allocation->height); } + border_width = gtk_container_get_border_width (GTK_CONTAINER (window)); child_allocation.x += border_width; child_allocation.y += border_width; child_allocation.width = MAX (1, child_allocation.width - border_width * 2); |