[gtk+] menubar: port to use a gadget
- From: Cosimo Cecchi <cosimoc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] menubar: port to use a gadget
- Date: Sun, 3 Jan 2016 08:48:44 +0000 (UTC)
commit 700286c6d8a88d4eb51e418e2675092a7bd232b5
Author: Cosimo Cecchi <cosimoc gnome org>
Date: Fri Jan 1 15:23:27 2016 -0800
menubar: port to use a gadget
gtk/gtkmenubar.c | 213 ++++++++++++++++++++++++++++++++----------------------
1 files changed, 128 insertions(+), 85 deletions(-)
---
diff --git a/gtk/gtkmenubar.c b/gtk/gtkmenubar.c
index fcfb67c..b26ffe4 100644
--- a/gtk/gtkmenubar.c
+++ b/gtk/gtkmenubar.c
@@ -42,6 +42,7 @@
#include "gtkmenubar.h"
#include "gtkbindings.h"
+#include "gtkcsscustomgadgetprivate.h"
#include "gtkmain.h"
#include "gtkmarshalers.h"
#include "gtkmenuitemprivate.h"
@@ -70,6 +71,8 @@ struct _GtkMenuBarPrivate
{
GtkPackDirection pack_direction;
GtkPackDirection child_pack_direction;
+
+ GtkCssGadget *gadget;
};
@@ -81,6 +84,7 @@ static void gtk_menu_bar_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
+static void gtk_menu_bar_finalize (GObject *object);
static void gtk_menu_bar_get_preferred_width (GtkWidget *widget,
gint *minimum,
gint *natural);
@@ -105,6 +109,27 @@ static gint gtk_menu_bar_get_popup_delay (GtkMenuShell *menu_shell);
static void gtk_menu_bar_move_current (GtkMenuShell *menu_shell,
GtkMenuDirectionType direction);
+static void gtk_menu_bar_measure (GtkCssGadget *gadget,
+ GtkOrientation orientation,
+ int for_size,
+ int *minimum,
+ int *natural,
+ int *minimum_baseline,
+ int *natural_baseline,
+ gpointer data);
+static void gtk_menu_bar_allocate (GtkCssGadget *gadget,
+ const GtkAllocation *allocation,
+ int baseline,
+ GtkAllocation *out_clip,
+ gpointer data);
+static gboolean gtk_menu_bar_render (GtkCssGadget *gadget,
+ cairo_t *cr,
+ int x,
+ int y,
+ int width,
+ int height,
+ gpointer data);
+
G_DEFINE_TYPE_WITH_PRIVATE (GtkMenuBar, gtk_menu_bar, GTK_TYPE_MENU_SHELL)
static void
@@ -124,6 +149,7 @@ gtk_menu_bar_class_init (GtkMenuBarClass *class)
gobject_class->get_property = gtk_menu_bar_get_property;
gobject_class->set_property = gtk_menu_bar_set_property;
+ gobject_class->finalize = gtk_menu_bar_finalize;
widget_class->get_preferred_width = gtk_menu_bar_get_preferred_width;
widget_class->get_preferred_height = gtk_menu_bar_get_preferred_height;
@@ -257,7 +283,20 @@ gtk_menu_bar_class_init (GtkMenuBarClass *class)
static void
gtk_menu_bar_init (GtkMenuBar *menu_bar)
{
- menu_bar->priv = gtk_menu_bar_get_instance_private (menu_bar);
+ GtkMenuBarPrivate *priv;
+ GtkWidget *widget;
+ GtkCssNode *widget_node;
+
+ priv = menu_bar->priv = gtk_menu_bar_get_instance_private (menu_bar);
+
+ widget = GTK_WIDGET (menu_bar);
+ widget_node = gtk_widget_get_css_node (widget);
+ priv->gadget = gtk_css_custom_gadget_new_for_node (widget_node,
+ widget,
+ gtk_menu_bar_measure,
+ gtk_menu_bar_allocate,
+ gtk_menu_bar_render,
+ NULL, NULL);
}
/**
@@ -274,6 +313,16 @@ gtk_menu_bar_new (void)
}
static void
+gtk_menu_bar_finalize (GObject *object)
+{
+ GtkMenuBar *menu_bar = GTK_MENU_BAR (object);
+
+ g_clear_object (&menu_bar->priv->gadget);
+
+ G_OBJECT_CLASS (gtk_menu_bar_parent_class)->finalize (object);
+}
+
+static void
gtk_menu_bar_set_property (GObject *object,
guint prop_id,
const GValue *value,
@@ -318,12 +367,16 @@ gtk_menu_bar_get_property (GObject *object,
}
static void
-gtk_menu_bar_size_request (GtkWidget *widget,
- GtkOrientation orientation,
- gint size,
- gint *minimum,
- gint *natural)
+gtk_menu_bar_measure (GtkCssGadget *gadget,
+ GtkOrientation orientation,
+ int size,
+ int *minimum,
+ int *natural,
+ int *minimum_baseline,
+ int *natural_baseline,
+ gpointer data)
{
+ GtkWidget *widget = gtk_css_gadget_get_owner (gadget);
GtkMenuBar *menu_bar;
GtkMenuBarPrivate *priv;
GtkMenuShell *menu_shell;
@@ -331,8 +384,6 @@ gtk_menu_bar_size_request (GtkWidget *widget,
GList *children;
gboolean use_toggle_size, use_maximize;
gint child_minimum, child_natural;
- GtkStyleContext *context;
- GtkBorder border;
*minimum = 0;
*natural = 0;
@@ -387,33 +438,6 @@ gtk_menu_bar_size_request (GtkWidget *widget,
}
}
}
-
- context = gtk_widget_get_style_context (widget);
- gtk_style_context_get_padding (context, gtk_style_context_get_state (context), &border);
-
- if (orientation == GTK_ORIENTATION_HORIZONTAL)
- {
- *minimum += border.left + border.right;
- *natural += border.left + border.right;
- }
- else
- {
- *minimum += border.top + border.bottom;
- *natural += border.top + border.bottom;
- }
-
- gtk_style_context_get_border (context, gtk_style_context_get_state (context), &border);
-
- if (orientation == GTK_ORIENTATION_HORIZONTAL)
- {
- *minimum += border.left + border.right;
- *natural += border.left + border.right;
- }
- else
- {
- *minimum += border.top + border.bottom;
- *natural += border.top + border.bottom;
- }
}
static void
@@ -421,7 +445,11 @@ gtk_menu_bar_get_preferred_width (GtkWidget *widget,
gint *minimum,
gint *natural)
{
- gtk_menu_bar_size_request (widget, GTK_ORIENTATION_HORIZONTAL, -1, minimum, natural);
+ gtk_css_gadget_get_preferred_size (GTK_MENU_BAR (widget)->priv->gadget,
+ GTK_ORIENTATION_HORIZONTAL,
+ -1,
+ minimum, natural,
+ NULL, NULL);
}
static void
@@ -429,7 +457,11 @@ gtk_menu_bar_get_preferred_height (GtkWidget *widget,
gint *minimum,
gint *natural)
{
- gtk_menu_bar_size_request (widget, GTK_ORIENTATION_VERTICAL, -1, minimum, natural);
+ gtk_css_gadget_get_preferred_size (GTK_MENU_BAR (widget)->priv->gadget,
+ GTK_ORIENTATION_VERTICAL,
+ -1,
+ minimum, natural,
+ NULL, NULL);
}
static void
@@ -438,7 +470,11 @@ gtk_menu_bar_get_preferred_width_for_height (GtkWidget *widget,
gint *minimum,
gint *natural)
{
- gtk_menu_bar_size_request (widget, GTK_ORIENTATION_HORIZONTAL, height, minimum, natural);
+ gtk_css_gadget_get_preferred_size (GTK_MENU_BAR (widget)->priv->gadget,
+ GTK_ORIENTATION_HORIZONTAL,
+ height,
+ minimum, natural,
+ NULL, NULL);
}
static void
@@ -447,13 +483,21 @@ gtk_menu_bar_get_preferred_height_for_width (GtkWidget *widget,
gint *minimum,
gint *natural)
{
- gtk_menu_bar_size_request (widget, GTK_ORIENTATION_VERTICAL, width, minimum, natural);
+ gtk_css_gadget_get_preferred_size (GTK_MENU_BAR (widget)->priv->gadget,
+ GTK_ORIENTATION_VERTICAL,
+ width,
+ minimum, natural,
+ NULL, NULL);
}
static void
-gtk_menu_bar_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
+gtk_menu_bar_allocate (GtkCssGadget *gadget,
+ const GtkAllocation *allocation,
+ int baseline,
+ GtkAllocation *out_clip,
+ gpointer data)
{
+ GtkWidget *widget = gtk_css_gadget_get_owner (gadget);
GtkMenuBar *menu_bar;
GtkMenuShell *menu_shell;
GtkMenuBarPrivate *priv;
@@ -464,42 +508,13 @@ gtk_menu_bar_size_allocate (GtkWidget *widget,
gint toggle_size;
guint i;
- g_return_if_fail (GTK_IS_MENU_BAR (widget));
- g_return_if_fail (allocation != NULL);
-
menu_bar = GTK_MENU_BAR (widget);
menu_shell = GTK_MENU_SHELL (widget);
priv = menu_bar->priv;
- gtk_widget_set_allocation (widget, allocation);
-
- if (gtk_widget_get_realized (widget))
- gdk_window_move_resize (gtk_widget_get_window (widget),
- allocation->x, allocation->y,
- allocation->width, allocation->height);
-
if (menu_shell->priv->children)
{
- GtkStyleContext *context;
- GtkBorder border;
-
- context = gtk_widget_get_style_context (widget);
- gtk_style_context_get_padding (context, gtk_style_context_get_state (context), &border);
-
- remaining_space.x = border.left;
- remaining_space.y = border.top;
- remaining_space.width = allocation->width -
- border.left - border.right;
- remaining_space.height = allocation->height -
- border.top - border.bottom;
-
- gtk_style_context_get_border (context, gtk_style_context_get_state (context), &border);
-
- remaining_space.x += border.left;
- remaining_space.y += border.top;
- remaining_space.width -= border.left + border.right;
- remaining_space.height -= border.top + border.bottom;
-
+ remaining_space = *allocation;
requested_sizes = g_array_new (FALSE, FALSE, sizeof (GtkRequestedSize));
if (priv->pack_direction == GTK_PACK_DIRECTION_LTR ||
@@ -615,30 +630,58 @@ gtk_menu_bar_size_allocate (GtkWidget *widget,
g_array_free (requested_sizes, TRUE);
}
}
-
-static gint
-gtk_menu_bar_draw (GtkWidget *widget,
- cairo_t *cr)
+static void
+gtk_menu_bar_size_allocate (GtkWidget *widget,
+ GtkAllocation *allocation)
{
- GtkStyleContext *context;
+ GtkMenuBar *menu_bar;
+ GtkAllocation clip, content_allocation;
- context = gtk_widget_get_style_context (widget);
+ menu_bar = GTK_MENU_BAR (widget);
+ gtk_widget_set_allocation (widget, allocation);
- gtk_render_background (context, cr,
- 0, 0,
- gtk_widget_get_allocated_width (widget),
- gtk_widget_get_allocated_height (widget));
+ if (gtk_widget_get_realized (widget))
+ gdk_window_move_resize (gtk_widget_get_window (widget),
+ allocation->x, allocation->y,
+ allocation->width, allocation->height);
+
+ content_allocation = *allocation;
+ content_allocation.x = content_allocation.y = 0;
+ gtk_css_gadget_allocate (menu_bar->priv->gadget,
+ &content_allocation,
+ gtk_widget_get_allocated_baseline (widget),
+ &clip);
+
+ clip.x += allocation->x;
+ clip.y += allocation->y;
+ gtk_widget_set_clip (widget, &clip);
+}
- gtk_render_frame (context, cr,
- 0, 0,
- gtk_widget_get_allocated_width (widget),
- gtk_widget_get_allocated_height (widget));
+static gboolean
+gtk_menu_bar_render (GtkCssGadget *gadget,
+ cairo_t *cr,
+ int x,
+ int y,
+ int width,
+ int height,
+ gpointer data)
+{
+ GtkWidget *widget = gtk_css_gadget_get_owner (gadget);
GTK_WIDGET_CLASS (gtk_menu_bar_parent_class)->draw (widget, cr);
return FALSE;
}
+static gboolean
+gtk_menu_bar_draw (GtkWidget *widget,
+ cairo_t *cr)
+{
+ gtk_css_gadget_draw (GTK_MENU_BAR (widget)->priv->gadget, cr);
+
+ return FALSE;
+}
+
static GList *
get_menu_bars (GtkWindow *window)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]