diff options
Diffstat (limited to 'endless/eosactionbutton.c')
-rw-r--r-- | endless/eosactionbutton.c | 770 |
1 files changed, 0 insertions, 770 deletions
diff --git a/endless/eosactionbutton.c b/endless/eosactionbutton.c deleted file mode 100644 index db28312..0000000 --- a/endless/eosactionbutton.c +++ /dev/null @@ -1,770 +0,0 @@ -/* Copyright 2013 Endless Mobile, Inc. */ - -#include "config.h" -#include "eosactionbutton.h" - -#include <glib-object.h> -#include <gtk/gtk.h> -#include <math.h> - -/** - * SECTION:action-button - * @short_description: Buttons that the user recognizes as performing actions - * @title: Action buttons - * - * Any time you want to inform your user which actions are available, use an - * action button. - * For example, suppose you had a page in your application where the user could - * draw a picture. - * After finishing the picture, the user could save it or share it on Facebook. - * In that case, you would use two action buttons, labeled for example - * <quote>SAVE</quote> and <quote>SHARE</quote>, and containing icons - * representing saving and sharing. - * - * The buttons have a recognizable style and round border, so that it is - * instantly clear to the user that they represent actions. - * - * Generally, you should set the #EosPageManager:actions property on the page - * that you want to use action buttons on; this neatly arranges the actions - * in an action area on the right-hand side of the screen, placing the main - * action in a prominent place, and actions such as <quote>cancel</quote> on the - * bottom. - * However, you can also manually place action buttons anywhere on a page. - */ - -#define _EOS_STYLE_CLASS_ACTION_BUTTON "action-button" - -typedef struct { - /* properties */ - EosActionButtonSize size; - gchar *label; - gchar *icon_id; - GtkPositionType label_pos; - - /* internal */ - GtkWidget *grid; - GtkWidget *icon_image; - GtkWidget *label_widget; -} EosActionButtonPrivate; - -G_DEFINE_TYPE_WITH_PRIVATE (EosActionButton, eos_action_button, GTK_TYPE_BUTTON) - -typedef struct _EosActionButtonSizeDefinition EosActionButtonSizeDefinition; - -struct _EosActionButtonSizeDefinition -{ - EosActionButtonSize size; - gchar *name; - - gint width; - gint height; - gint icon_size; - gint border_width; -}; - -static EosActionButtonSizeDefinition *icon_sizes = NULL; - - -enum { - PROP_0, - PROP_SIZE, - PROP_LABEL, - PROP_LABEL_POS, - PROP_ICON_ID -}; - -static void -eos_action_button_dispose (GObject *object); - -static void -eos_action_button_finalize (GObject *object); - -static void -eos_action_button_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec); - -static void -eos_action_button_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec); - -static void -eos_action_button_get_preferred_width (GtkWidget *widget, - gint *minimum_size, - gint *natural_size); - -static void -eos_action_button_get_preferred_height (GtkWidget *widget, - gint *minimum_size, - gint *natural_size); - -static gboolean -eos_action_button_draw (GtkWidget *widget, - cairo_t *cr); - -/* ******* INIT ******* */ - -static void -eos_action_button_class_init (EosActionButtonClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - - object_class->get_property = eos_action_button_get_property; - object_class->set_property = eos_action_button_set_property; - object_class->dispose = eos_action_button_dispose; - object_class->finalize = eos_action_button_finalize; - - widget_class->draw = eos_action_button_draw; - widget_class->get_preferred_width = eos_action_button_get_preferred_width; - widget_class->get_preferred_height = eos_action_button_get_preferred_height; - - /** - * EosActionButton:size: - * - * Size for the action button; use #EosActionButtonSize to specify that the - * button represents a primary action, secondary, tertiary, or quaternary. - * #EOS_ACTION_BUTTON_SIZE_PRIMARY is the largest, and - * #EOS_ACTION_BUTTON_SIZE_QUATERNARY is the smallest (seldom used.) - */ - g_object_class_install_property (object_class, - PROP_SIZE, - g_param_spec_int ("size", - "Size", - "Size of the button", - EOS_ACTION_BUTTON_SIZE_PRIMARY, - EOS_ACTION_BUTTON_SIZE_QUATERNARY, - EOS_ACTION_BUTTON_SIZE_SECONDARY, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - - /** - * EosActionButton:label: - * - * Text for the label that is placed below or to the side of the button. - */ - g_object_class_install_property (object_class, - PROP_LABEL, - g_param_spec_string ("label", - "Label", - "Text of the label widget beneath the button", - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - - /** - * EosActionButton:label-position: - * - * Position of the label in the button. - */ - g_object_class_install_property (object_class, - PROP_LABEL_POS, - g_param_spec_enum ("label-position", - "Label position", - "Position of the label inside the button", - GTK_TYPE_POSITION_TYPE, - GTK_POS_BOTTOM, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - - /** - * EosActionButton:icon-id: - * - * Icon name for the icon that is drawn within the circular button. - */ - g_object_class_install_property (object_class, - PROP_ICON_ID, - g_param_spec_string ("icon-id", - "Icon id", - "ID used to pick an icon for the button", - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - - // init icon sizes, inspired by gtkiconfactory.c - if (icon_sizes == NULL) - { - icon_sizes = g_new (EosActionButtonSizeDefinition, EOS_ACTION_BUTTON_SIZE_NUM_SIZES); - - icon_sizes[EOS_ACTION_BUTTON_SIZE_PRIMARY].size = EOS_ACTION_BUTTON_SIZE_PRIMARY; - icon_sizes[EOS_ACTION_BUTTON_SIZE_PRIMARY].name = "primary"; - icon_sizes[EOS_ACTION_BUTTON_SIZE_PRIMARY].width = 64; - icon_sizes[EOS_ACTION_BUTTON_SIZE_PRIMARY].height = 64; - icon_sizes[EOS_ACTION_BUTTON_SIZE_PRIMARY].icon_size = 36; - icon_sizes[EOS_ACTION_BUTTON_SIZE_PRIMARY].border_width = 8; - - icon_sizes[EOS_ACTION_BUTTON_SIZE_SECONDARY].size = EOS_ACTION_BUTTON_SIZE_SECONDARY; - icon_sizes[EOS_ACTION_BUTTON_SIZE_SECONDARY].name = "secondary"; - icon_sizes[EOS_ACTION_BUTTON_SIZE_SECONDARY].width = 48; - icon_sizes[EOS_ACTION_BUTTON_SIZE_SECONDARY].height = 48; - icon_sizes[EOS_ACTION_BUTTON_SIZE_SECONDARY].icon_size = 26; - icon_sizes[EOS_ACTION_BUTTON_SIZE_SECONDARY].border_width = 6; - - icon_sizes[EOS_ACTION_BUTTON_SIZE_TERTIARY].size = EOS_ACTION_BUTTON_SIZE_TERTIARY; - icon_sizes[EOS_ACTION_BUTTON_SIZE_TERTIARY].name = "tertiary"; - icon_sizes[EOS_ACTION_BUTTON_SIZE_TERTIARY].width = 36; - icon_sizes[EOS_ACTION_BUTTON_SIZE_TERTIARY].height = 36; - icon_sizes[EOS_ACTION_BUTTON_SIZE_TERTIARY].icon_size = 18; - icon_sizes[EOS_ACTION_BUTTON_SIZE_TERTIARY].border_width = 5; - - icon_sizes[EOS_ACTION_BUTTON_SIZE_QUATERNARY].size = EOS_ACTION_BUTTON_SIZE_QUATERNARY; - icon_sizes[EOS_ACTION_BUTTON_SIZE_QUATERNARY].name = "quaternary"; - icon_sizes[EOS_ACTION_BUTTON_SIZE_QUATERNARY].width = 26; - icon_sizes[EOS_ACTION_BUTTON_SIZE_QUATERNARY].height = 26; - icon_sizes[EOS_ACTION_BUTTON_SIZE_QUATERNARY].icon_size = 12; - icon_sizes[EOS_ACTION_BUTTON_SIZE_QUATERNARY].border_width = 4; - } -} - -static void -eos_action_button_init (EosActionButton *self) -{ - EosActionButtonPrivate *priv = eos_action_button_get_instance_private (self); - GtkStyleContext *context = gtk_widget_get_style_context (GTK_WIDGET (self)); - - gtk_style_context_add_class (context, _EOS_STYLE_CLASS_ACTION_BUTTON); - - priv->icon_image = gtk_image_new(); - priv->label_widget = GTK_WIDGET (gtk_label_new ("")); - - priv->grid = gtk_grid_new (); - gtk_grid_attach(GTK_GRID (priv->grid), priv->icon_image, 0, 0, 1, 1); - - // TODO positioning is not really working right, it will be done manually in draw () - // which means that this will not work as intended: - gtk_grid_attach_next_to (GTK_GRID (priv->grid), - priv->label_widget, priv->icon_image, - priv->label_pos, 1, 1); - - gtk_container_add (GTK_CONTAINER (self), - GTK_WIDGET (priv->grid)); - - gtk_widget_set_hexpand (GTK_WIDGET(self), FALSE); - gtk_widget_set_halign (GTK_WIDGET(self), GTK_ALIGN_CENTER); - gtk_widget_set_vexpand (GTK_WIDGET(self), FALSE); - gtk_widget_set_valign (GTK_WIDGET(self), GTK_ALIGN_CENTER); -} - -/* ******* LIFECYCLE ******* */ - -/** - * eos_action_button_new: - * @size: size for the button: primary, secondary, et cetera - * @label: text to place under or beside the action button - * @icon_id: icon name for the icon inside the action button - * - * Convenience function for creating an action button with the size, label, and - * icon already set. - * - * Returns: a pointer to the newly-created widget. - */ -GtkWidget * -eos_action_button_new (EosActionButtonSize size, - const gchar *label, - const gchar *icon_id) -{ - return g_object_new (EOS_TYPE_ACTION_BUTTON, - "size", size, - "label", label, - "icon-id", icon_id, - NULL); -} - -static void -eos_action_button_dispose (GObject *object) -{ - G_OBJECT_CLASS (eos_action_button_parent_class)->dispose (object); -} - -static void -eos_action_button_finalize (GObject *object) -{ - G_OBJECT_CLASS (eos_action_button_parent_class)->finalize (object); -} - -/* ******* PROPERTIES ******* */ - -static void -eos_action_button_load_icon (EosActionButton *button) -{ - g_return_if_fail (EOS_IS_ACTION_BUTTON (button)); - - EosActionButtonPrivate *priv = eos_action_button_get_instance_private (button); - - if (priv->icon_id != NULL) - { - gtk_image_set_from_icon_name (GTK_IMAGE (priv->icon_image), - priv->icon_id, - GTK_ICON_SIZE_BUTTON); - - gtk_image_set_pixel_size (GTK_IMAGE (priv->icon_image), - icon_sizes[priv->size].icon_size); - } - else - { - gtk_image_clear (GTK_IMAGE (priv->icon_image)); - } -} - -/** - * eos_action_button_set_size: - * @button: the button - * @size: a value from #EosActionButtonSize - * - * Sets the size of the button (e.g. secondary). - * See #EosActionButton:size for more information. - */ -void -eos_action_button_set_size (EosActionButton *button, - EosActionButtonSize size) -{ - g_return_if_fail (EOS_IS_ACTION_BUTTON (button)); - - int old_size; - EosActionButtonPrivate *priv = eos_action_button_get_instance_private (button); - - old_size = priv->size; - priv->size = size; - - // remove the old style class and set the new one - GtkStyleContext *context = gtk_widget_get_style_context (GTK_WIDGET (button)); - gtk_style_context_remove_class (context, icon_sizes[old_size].name); - gtk_style_context_add_class (context, icon_sizes[priv->size].name); - - if (old_size != priv->size) - { - eos_action_button_load_icon (button); - - g_object_notify (G_OBJECT (button), "size"); - gtk_widget_queue_resize(GTK_WIDGET (button)); - } -} - -/** - * eos_action_button_get_size: - * @button: the button - * - * Gets the size of the button (e.g. secondary). - * See #EosActionButton:size for more information. - * - * Returns: the size as a value from #EosActionButtonSize - */ -EosActionButtonSize -eos_action_button_get_size (EosActionButton *button) -{ - g_return_val_if_fail (EOS_IS_ACTION_BUTTON (button), -1); - - EosActionButtonPrivate *priv = eos_action_button_get_instance_private (button); - return priv->size; -} - -/** - * eos_action_button_set_label: - * @button: the button - * @label: text for the label - * - * Sets the text showing below or beside the button. - * See #EosActionButton:label for more information. - */ -void -eos_action_button_set_label (EosActionButton *button, const gchar *label) -{ - g_return_if_fail (EOS_IS_ACTION_BUTTON (button)); - - EosActionButtonPrivate *priv = eos_action_button_get_instance_private (button); - gchar *new_label = g_strdup (label); - g_free (priv->label); - priv->label = new_label; - - gtk_label_set_text (GTK_LABEL (priv->label_widget), priv->label); - - g_object_notify (G_OBJECT (button), "label"); -} - -/** - * eos_action_button_get_label: - * @button: the button - * - * Gets the text showing below or beside the button. - * See #EosActionButton:label for more information. - * - * Returns: the label text - */ -const gchar * -eos_action_button_get_label (EosActionButton *button) -{ - g_return_val_if_fail (EOS_IS_ACTION_BUTTON (button), NULL); - - EosActionButtonPrivate *priv = eos_action_button_get_instance_private (button); - return priv->label; -} - -/** - * eos_action_button_set_label_position: - * @button: the button - * @position: position of the label: top, bottom, left or right - * - * Changes the position of the label to be above, below, or to one side of the - * action button. - * See #EosActionButton:label-position for more information. - */ -void -eos_action_button_set_label_position (EosActionButton *button, - GtkPositionType position) -{ - g_return_if_fail (EOS_IS_ACTION_BUTTON (button)); - - EosActionButtonPrivate *priv = eos_action_button_get_instance_private (button); - - if (priv->label_pos != position) - { - g_object_ref (G_OBJECT (priv->label_widget)); - gtk_container_remove (GTK_CONTAINER (priv->grid), priv->label_widget); - gtk_grid_attach_next_to (GTK_GRID (priv->grid), - priv->label_widget, priv->icon_image, - position, 1, 1); - g_object_unref (G_OBJECT (priv->label_widget)); - - priv->label_pos = position; - - // we need to keep the buttons aligned - if (priv->label_pos == GTK_POS_LEFT) - { - gtk_widget_set_halign (GTK_WIDGET(button), GTK_ALIGN_END); - } - else if (priv->label_pos == GTK_POS_RIGHT) - { - gtk_widget_set_halign (GTK_WIDGET(button), GTK_ALIGN_START); - } - else - { - gtk_widget_set_halign (GTK_WIDGET(button), GTK_ALIGN_CENTER); - } - } -} - -/** - * eos_action_button_get_label_position: - * @button: the button - * - * Gets the position of the label respective to the button. - * See #EosActionButton:label-position for more information. - * - * Returns: the position of the label: top, bottom, left, or right - */ -GtkPositionType -eos_action_button_get_label_position (EosActionButton *button) -{ - g_return_val_if_fail (EOS_IS_ACTION_BUTTON (button), -1); - - EosActionButtonPrivate *priv = eos_action_button_get_instance_private (button); - return priv->label_pos; -} - -/** - * eos_action_button_set_icon_id: - * @button: the button - * @icon_id: an icon name - * - * Sets a new icon showing in the button, specified by icon name. - * See #EosActionButton:icon-id for more information. - */ -void -eos_action_button_set_icon_id (EosActionButton *button, - const gchar* icon_id) -{ - g_return_if_fail (EOS_IS_ACTION_BUTTON (button)); - EosActionButtonPrivate *priv = eos_action_button_get_instance_private (button); - - if (g_strcmp0 (icon_id, priv->icon_id) != 0) - { - g_free (priv->icon_id); - priv->icon_id = g_strdup (icon_id); - - eos_action_button_load_icon (button); - g_object_notify (G_OBJECT (button), "icon-id"); - } -} - -/** - * eos_action_button_get_icon_id: - * @button: the button - * - * Gets the icon name for the icon showing in the button. - * See #EosActionButton:icon-id for more information. - * - * Returns: an icon name - */ -const gchar * -eos_action_button_get_icon_id (EosActionButton *button) -{ - g_return_val_if_fail (EOS_IS_ACTION_BUTTON (button), NULL); - - EosActionButtonPrivate *priv = eos_action_button_get_instance_private (button); - return priv->icon_id; -} - -static void -eos_action_button_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - EosActionButton *button = EOS_ACTION_BUTTON (object); - EosActionButtonPrivate *priv = eos_action_button_get_instance_private (button); - - switch (property_id) - { - case PROP_SIZE: - g_value_set_int (value, priv->size); - break; - case PROP_LABEL: - g_value_set_string (value, priv->label); - break; - case PROP_LABEL_POS : - g_value_set_enum (value, priv->label_pos); - break; - case PROP_ICON_ID: - g_value_set_string (value, priv->icon_id); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - } -} - -static void -eos_action_button_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - EosActionButton *button = EOS_ACTION_BUTTON (object); - - switch (property_id) - { - case PROP_SIZE : - eos_action_button_set_size (button, g_value_get_int (value)); - break; - case PROP_LABEL : - eos_action_button_set_label (button, g_value_get_string (value)); - break; - case PROP_LABEL_POS : - eos_action_button_set_label_position (button, g_value_get_enum (value)); - break; - case PROP_ICON_ID : - eos_action_button_set_icon_id (button, g_value_get_string (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - } -} - -/* ******* EXTENDED METHODS ******* */ - -static void -eos_action_button_get_real_size (GtkWidget *widget, - GtkOrientation orientation, - gint *minimum_size, - gint *natural_size) -{ - EosActionButton *button = EOS_ACTION_BUTTON (widget); - EosActionButtonPrivate *priv = eos_action_button_get_instance_private (button); - GtkBorder margin; - GtkAllocation label_allocation; - GtkStyleContext *context = gtk_widget_get_style_context (widget); - - gtk_style_context_get_margin(context, - gtk_style_context_get_state (context), - &margin); - - gtk_widget_get_allocation (priv->label_widget, &label_allocation); - - if (orientation == GTK_ORIENTATION_HORIZONTAL) - { - gint hsize = 0; - - if (priv->label_pos == GTK_POS_LEFT || priv->label_pos == GTK_POS_RIGHT) - { - hsize = margin.left + label_allocation.width - + margin.left + icon_sizes[priv->size].width + margin.right; - } - else if (priv->label_pos == GTK_POS_TOP || priv->label_pos == GTK_POS_BOTTOM) - { - hsize = margin.left + margin.right + MAX (icon_sizes[priv->size].width, - label_allocation.width); - } - - if (minimum_size) - *minimum_size = hsize; - - if (natural_size) - *natural_size = hsize; - } - else if (orientation == GTK_ORIENTATION_VERTICAL) - { - gint vsize = 0; - - if (priv->label_pos == GTK_POS_LEFT || priv->label_pos == GTK_POS_RIGHT) - { - vsize = margin.top + margin.bottom + MAX (icon_sizes[priv->size].height, - label_allocation.height); - } - else if (priv->label_pos == GTK_POS_TOP || priv->label_pos == GTK_POS_BOTTOM) - { - vsize = margin.top + icon_sizes[priv->size].height + margin.bottom - + label_allocation.height + margin.bottom; - } - - if (minimum_size) - *minimum_size = vsize; - - if (natural_size) - *natural_size = vsize; - - } -} - -static void -eos_action_button_get_preferred_width (GtkWidget *widget, - gint *minimum_size, - gint *natural_size) -{ - eos_action_button_get_real_size (widget, GTK_ORIENTATION_HORIZONTAL, - minimum_size, natural_size); -} - -static void -eos_action_button_get_preferred_height (GtkWidget *widget, - gint *minimum_size, - gint *natural_size) -{ - eos_action_button_get_real_size (widget, GTK_ORIENTATION_VERTICAL, - minimum_size, natural_size); -} - -static gboolean -eos_action_button_draw (GtkWidget *widget, - cairo_t *cr) -{ - EosActionButton *button = EOS_ACTION_BUTTON (widget); - EosActionButtonPrivate *priv = eos_action_button_get_instance_private (button); - - gint x, y; - gint frame_x = 0, frame_y = 0, bg_x = 0, bg_y = 0, icon_x = 0, icon_y = 0, label_x = 0, label_y = 0; - gint width, height, border_width, border_height, border_thickness; - GtkBorder margin; - GtkAllocation allocation, icon_allocation, label_allocation; - GtkStyleContext *context; - GtkStateFlags state; - - context = gtk_widget_get_style_context (widget); - state = gtk_style_context_get_state (context); - - gtk_style_context_get_margin(context, state, &margin); - - gtk_widget_get_allocation (widget, &allocation); - - x = 0; - y = 0; - width = allocation.width; - height = allocation.height; - - border_width = icon_sizes[priv->size].width; - border_height = icon_sizes[priv->size].height; - border_thickness = icon_sizes[priv->size].border_width; - - // calculate the location of background frame, icon and text label - gtk_widget_get_allocation (priv->icon_image, &icon_allocation); - gtk_widget_get_allocation (priv->label_widget, &label_allocation); - - if (priv->label_pos == GTK_POS_BOTTOM) - { - frame_x = x + (width - border_width)/2; - frame_y = y + margin.top; - - bg_x = frame_x - border_thickness; - bg_y = frame_y - border_thickness; - - icon_x = x + (width - icon_allocation.width) / 2; - icon_y = frame_y + (icon_sizes[priv->size].height - icon_allocation.height) / 2; - - label_x = x + (width - label_allocation.width)/2; - label_y = frame_y + icon_sizes[priv->size].height + margin.bottom; - } - else if (priv->label_pos == GTK_POS_TOP) - { - frame_x = x + (width - border_width)/2; - frame_y = y + margin.top + label_allocation.height + margin.bottom; - - bg_x = frame_x - border_thickness; - bg_y = frame_y - border_thickness; - - icon_x = x + (width - icon_allocation.width) / 2; - icon_y = frame_y + (icon_sizes[priv->size].height - icon_allocation.height) / 2; - - label_x = x + (width - label_allocation.width)/2; - label_y = y + margin.top; - } - else if (priv->label_pos == GTK_POS_LEFT) - { - frame_x = x + margin.left + label_allocation.width + margin.left; - frame_y = y + (height - border_height)/2; - - bg_x = frame_x - border_thickness; - bg_y = frame_y - border_thickness; - - icon_x = frame_x + (icon_sizes[priv->size].width - icon_allocation.width) / 2; - icon_y = y + (height - icon_allocation.height) / 2;; - - label_x = x + margin.left; - label_y = y + (height - label_allocation.height)/2;; - } - else if (priv->label_pos == GTK_POS_RIGHT) - { - frame_x = x + margin.left; - frame_y = y + (height - border_height)/2; - - bg_x = frame_x - border_thickness; - bg_y = frame_y - border_thickness; - - icon_x = frame_x + (icon_sizes[priv->size].width - icon_allocation.width) / 2; - icon_y = y + (height - icon_allocation.height) / 2;; - - label_x = x + margin.left + icon_sizes[priv->size].width + margin.left; - label_y = y + (height - label_allocation.height)/2;; - } - - cairo_save (cr); - - gtk_render_frame (context, cr, frame_x, frame_y, border_width, border_height); - - cairo_restore (cr); - cairo_save (cr); - - // GTK+ tries to paint the background inside the border, we work around this - //because we want to draw the inset shadow over the border itself - gtk_render_background (context, cr, bg_x, bg_y, - border_width + 2*border_thickness, - border_height + 2*border_thickness); - - cairo_restore (cr); - cairo_save (cr); - - // *** image - - cairo_translate (cr, icon_x, icon_y); - - gtk_widget_draw (GTK_WIDGET (priv->icon_image), cr); - - cairo_restore (cr); - cairo_save (cr); - - // *** label - - cairo_translate (cr, label_x, label_y); - - gtk_widget_draw (GTK_WIDGET (priv->label_widget), cr); - - cairo_restore (cr); - - return FALSE; -} |