[gtk+/wip/csd: 4/9] window: Add basic support for border popup windows
- From: Rob Bradford <rbradford src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/csd: 4/9] window: Add basic support for border popup windows
- Date: Fri, 27 Jul 2012 11:03:59 +0000 (UTC)
commit fcdbb8a0490d49db274c4e6ba8236e8ea3117907
Author: Rob Bradford <rob linux intel com>
Date: Fri Apr 13 14:09:04 2012 +0100
window: Add basic support for border popup windows
This change separates drawing a window border from having a title bar in the
window - allowing us to have client decorated windows (i.e. shadows on menus)
without necessarily having a titlebox for the window.
gtk/gtkwindow.c | 83 ++++++++++++++++++++++++++++++++----------------------
1 files changed, 49 insertions(+), 34 deletions(-)
---
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 39addbc..e701406 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -196,6 +196,7 @@ struct _GtkWindowPrivate
* grip-visible" notification
*/
guint gravity : 5; /* GdkGravity */
+ guint client_decorated : 1; /* Decorations drawn client-side */
};
@@ -4840,6 +4841,10 @@ create_decoration (GtkWidget *widget)
GtkStyleContext *context;
const char *title = "GtkWindow";
+ /* Decorations already created */
+ if (priv->client_decorated)
+ return;
+
#ifdef GDK_WINDOWING_WAYLAND
if (!GDK_IS_WAYLAND_DISPLAY_MANAGER (gdk_display_manager_get ()))
return;
@@ -4847,26 +4852,31 @@ create_decoration (GtkWidget *widget)
return;
#endif
- if (priv->type == GTK_WINDOW_POPUP || !priv->decorated || priv->title_box)
+ if (!priv->decorated)
return;
- priv->title_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
- context = gtk_widget_get_style_context (priv->title_box);
- gtk_style_context_add_class (context, "titlebar");
- gtk_widget_set_parent (priv->title_box, GTK_WIDGET (window));
+ priv->client_decorated = TRUE;
- priv->title_label = gtk_label_new (NULL);
- if (priv->title)
- title = priv->title;
- gtk_label_set_markup (GTK_LABEL (priv->title_label), title);
- gtk_box_pack_start (GTK_BOX (priv->title_box),
- priv->title_label, TRUE, TRUE, 0);
+ if (priv->type != GTK_WINDOW_POPUP)
+ {
+ priv->title_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
+ context = gtk_widget_get_style_context (priv->title_box);
+ gtk_style_context_add_class (context, "titlebar");
+ gtk_widget_set_parent (priv->title_box, GTK_WIDGET (window));
+
+ priv->title_label = gtk_label_new (NULL);
+ if (priv->title)
+ title = priv->title;
+ gtk_label_set_markup (GTK_LABEL (priv->title_label), title);
+ gtk_box_pack_start (GTK_BOX (priv->title_box),
+ priv->title_label, TRUE, TRUE, 0);
- priv->title_close_button = gtk_button_new_with_label ("Ã");
- gtk_box_pack_end (GTK_BOX (priv->title_box),
- priv->title_close_button, FALSE, FALSE, 0);
- g_signal_connect (priv->title_close_button, "clicked",
- G_CALLBACK (gtk_window_title_close_clicked), window);
+ priv->title_close_button = gtk_button_new_with_label ("Ã");
+ gtk_box_pack_end (GTK_BOX (priv->title_box),
+ priv->title_close_button, FALSE, FALSE, 0);
+ g_signal_connect (priv->title_close_button, "clicked",
+ G_CALLBACK (gtk_window_title_close_clicked), window);
+ }
}
static void
@@ -6668,18 +6678,21 @@ gtk_window_get_preferred_width (GtkWidget *widget,
border_width =
2 * gtk_container_get_border_width (GTK_CONTAINER (window));
- if (priv->title_box)
+ if (priv->client_decorated)
{
- gtk_widget_get_preferred_width (priv->title_box,
- &title_min, &title_nat);
-
context = gtk_widget_get_style_context (widget);
state = gtk_style_context_get_state (context);
- 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);
+ if (priv->title_box)
+ {
+ gtk_widget_get_preferred_width (priv->title_box,
+ &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");
@@ -6725,19 +6738,21 @@ gtk_window_get_preferred_height (GtkWidget *widget,
*minimum_size = 0;
*natural_size = 0;
- if (priv->title_box)
+ if (priv->client_decorated)
{
- gtk_widget_get_preferred_height (priv->title_box,
- &title_min, &priv->title_height);
-
-
context = gtk_widget_get_style_context (widget);
state = gtk_style_context_get_state (context);
- 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);
+ if (priv->title_box)
+ {
+ gtk_widget_get_preferred_height (priv->title_box,
+ &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");
@@ -7904,7 +7919,7 @@ gtk_window_draw (GtkWidget *widget,
gtk_style_context_add_class (context, GTK_STYLE_CLASS_BACKGROUND);
- if (priv->title_box)
+ if (priv->client_decorated)
{
gtk_style_context_add_class (context, "window-border");
gtk_widget_get_allocation (widget, &allocation);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]