[gtk+/wip/csd: 65/65] window: Add _for_{height, width} variants that apply the decorations
- From: Rob Bradford <rbradford src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/csd: 65/65] window: Add _for_{height, width} variants that apply the decorations
- Date: Wed, 30 Jan 2013 18:23:16 +0000 (UTC)
commit f94ad08e837077f5cf44402d76d3887d4036a933
Author: Rob Bradford <rob linux intel com>
Date: Wed Jan 30 18:19:37 2013 +0000
window: Add _for_{height,width} variants that apply the decorations
This fixes rendering issues for users of GtkApplicationWindow which chains up
through that codepath, bypassing GtkWindow that didn't have it.
gtk/gtkwindow.c | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 136 insertions(+), 0 deletions(-)
---
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index c9b4dfb..2ca851c 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -458,9 +458,18 @@ static void gtk_window_set_theme_variant (GtkWindow *window);
static void gtk_window_get_preferred_width (GtkWidget *widget,
gint *minimum_size,
gint *natural_size);
+static void gtk_window_get_preferred_width_for_height (GtkWidget *widget,
+ gint height,
+ gint *minimum_size,
+ gint *natural_size);
+
static void gtk_window_get_preferred_height (GtkWidget *widget,
gint *minimum_size,
gint *natural_size);
+static void gtk_window_get_preferred_height_for_width (GtkWidget *widget,
+ gint width,
+ gint *minimum_size,
+ gint *natural_size);
static GSList *toplevel_list = NULL;
static guint window_signals[LAST_SIGNAL] = { 0 };
@@ -623,7 +632,9 @@ gtk_window_class_init (GtkWindowClass *klass)
widget_class->state_changed = gtk_window_state_changed;
widget_class->style_updated = gtk_window_style_updated;
widget_class->get_preferred_width = gtk_window_get_preferred_width;
+ widget_class->get_preferred_width_for_height = gtk_window_get_preferred_width_for_height;
widget_class->get_preferred_height = gtk_window_get_preferred_height;
+ widget_class->get_preferred_height_for_width = gtk_window_get_preferred_height_for_width;
container_class->check_resize = gtk_window_check_resize;
container_class->forall = gtk_window_forall;
@@ -6745,6 +6756,69 @@ gtk_window_get_preferred_width (GtkWidget *widget,
*natural_size = MAX (title_nat, child_nat);
}
+
+static void
+gtk_window_get_preferred_width_for_height (GtkWidget *widget,
+ gint height,
+ gint *minimum_size,
+ gint *natural_size)
+{
+ GtkWindow *window;
+ GtkWidget *child;
+ GtkWindowPrivate *priv;
+ GtkStyleContext *context;
+ GtkStateFlags state;
+ guint border_width;
+ gint title_min = 0, title_nat = 0;
+ gint child_min = 0, child_nat = 0;
+
+ window = GTK_WINDOW (widget);
+ priv = window->priv;
+ child = gtk_bin_get_child (GTK_BIN (window));
+
+ border_width =
+ 2 * gtk_container_get_border_width (GTK_CONTAINER (window));
+
+ if (priv->client_decorated && priv->type == GTK_WINDOW_TOPLEVEL)
+ {
+ context = gtk_widget_get_style_context (widget);
+ state = gtk_style_context_get_state (context);
+
+ if (priv->title_box)
+ {
+ gtk_widget_get_preferred_width_for_height (priv->title_box, height,
+ &title_min, &title_nat);
+
+ gtk_style_context_save (context);
+ gtk_style_context_add_class (context, "titlebar");
+ gtk_style_context_get_border (context, state, &priv->title_border);
+ gtk_style_context_restore (context);
+ }
+
+ gtk_style_context_save (context);
+ gtk_style_context_add_class (context, "window-border");
+ gtk_style_context_get_border (context, state, &priv->window_border);
+ gtk_style_context_restore (context);
+
+ border_width +=
+ priv->title_border.left + priv->title_border.right +
+ priv->window_border.left + priv->window_border.right;
+
+ title_min += border_width;
+ title_nat += border_width;
+ }
+
+ if (child && gtk_widget_get_visible (child))
+ {
+ gtk_widget_get_preferred_width_for_height (child, height, &child_min, &child_nat);
+ child_min += border_width;
+ child_nat += border_width;
+ }
+
+ *minimum_size = MAX (title_min, child_min);
+ *natural_size = MAX (title_nat, child_nat);
+}
+
static void
gtk_window_get_preferred_height (GtkWidget *widget,
gint *minimum_size,
@@ -6805,6 +6879,68 @@ gtk_window_get_preferred_height (GtkWidget *widget,
}
}
+
+static void
+gtk_window_get_preferred_height_for_width (GtkWidget *widget,
+ gint width,
+ gint *minimum_size,
+ gint *natural_size)
+{
+ GtkWindow *window;
+ GtkWindowPrivate *priv;
+ GtkWidget *child;
+ GtkStyleContext *context;
+ GtkStateFlags state;
+ guint border_width;
+ int title_min = 0;
+
+ window = GTK_WINDOW (widget);
+ priv = window->priv;
+ child = gtk_bin_get_child (GTK_BIN (window));
+
+ *minimum_size = 0;
+ *natural_size = 0;
+
+ if (priv->client_decorated && priv->type == GTK_WINDOW_TOPLEVEL)
+ {
+ context = gtk_widget_get_style_context (widget);
+ state = gtk_style_context_get_state (context);
+
+ if (priv->title_box)
+ {
+ gtk_widget_get_preferred_height_for_width (priv->title_box, width,
+ &title_min, &priv->title_height);
+
+ gtk_style_context_save (context);
+ gtk_style_context_add_class (context, "titlebar");
+ gtk_style_context_get_border (context, state, &priv->title_border);
+ gtk_style_context_restore (context);
+ }
+
+ gtk_style_context_save (context);
+ gtk_style_context_add_class (context, "window-border");
+ gtk_style_context_get_border (context, state, &priv->window_border);
+ gtk_style_context_restore (context);
+
+ border_width =
+ 2 * gtk_container_get_border_width (GTK_CONTAINER (window)) +
+ priv->title_border.top + priv->title_border.bottom +
+ priv->window_border.top + priv->window_border.bottom;
+
+ *minimum_size = border_width + title_min;
+ *natural_size = border_width + priv->title_height;
+ }
+
+ if (child && gtk_widget_get_visible (child))
+ {
+ gint child_min, child_nat;
+ gtk_widget_get_preferred_height_for_width (child, width, &child_min, &child_nat);
+
+ *minimum_size += child_min;
+ *natural_size += child_nat;
+ }
+}
+
/**
* _gtk_window_unset_focus_and_default:
* @window: a #GtkWindow
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]