summaryrefslogtreecommitdiff
path: root/gtk/gtklabel.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtklabel.c')
-rw-r--r--gtk/gtklabel.c211
1 files changed, 106 insertions, 105 deletions
diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c
index dd31a71d34..a4a955f8d4 100644
--- a/gtk/gtklabel.c
+++ b/gtk/gtklabel.c
@@ -8,7 +8,7 @@
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
@@ -27,33 +27,33 @@ enum {
};
static void gtk_label_class_init (GtkLabelClass *klass);
-static void gtk_label_init (GtkLabel *label);
-static void gtk_label_set_arg (GtkLabel *label,
- GtkArg *arg,
- guint arg_id);
-static void gtk_label_get_arg (GtkLabel *label,
- GtkArg *arg,
- guint arg_id);
-static void gtk_label_finalize (GtkObject *object);
-static void gtk_label_size_request (GtkWidget *widget,
+static void gtk_label_init (GtkLabel *label);
+static void gtk_label_set_arg (GtkLabel *label,
+ GtkArg *arg,
+ guint arg_id);
+static void gtk_label_get_arg (GtkLabel *label,
+ GtkArg *arg,
+ guint arg_id);
+static void gtk_label_finalize (GtkObject *object);
+static void gtk_label_size_request (GtkWidget *widget,
GtkRequisition *requisition);
-static gint gtk_label_expose (GtkWidget *widget,
+static gint gtk_label_expose (GtkWidget *widget,
GdkEventExpose *event);
-static void gtk_label_state_changed (GtkWidget *widget,
+static void gtk_label_state_changed (GtkWidget *widget,
guint previous_state);
-static void gtk_label_style_set (GtkWidget *widget,
- GtkStyle *previous_style);
+static void gtk_label_style_set (GtkWidget *widget,
+ GtkStyle *previous_style);
static GtkMiscClass *parent_class = NULL;
-guint
+GtkType
gtk_label_get_type (void)
{
- static guint label_type = 0;
-
+ static GtkType label_type = 0;
+
if (!label_type)
{
GtkTypeInfo label_info =
@@ -64,13 +64,13 @@ gtk_label_get_type (void)
(GtkClassInitFunc) gtk_label_class_init,
(GtkObjectInitFunc) gtk_label_init,
(GtkArgSetFunc) gtk_label_set_arg,
- (GtkArgGetFunc) gtk_label_get_arg,
+ (GtkArgGetFunc) gtk_label_get_arg,
};
-
+
label_type = gtk_type_unique (gtk_misc_get_type (), &label_info);
gtk_type_set_chunk_alloc (label_type, 32);
}
-
+
return label_type;
}
@@ -79,17 +79,17 @@ gtk_label_class_init (GtkLabelClass *class)
{
GtkObjectClass *object_class;
GtkWidgetClass *widget_class;
-
+
object_class = (GtkObjectClass*) class;
widget_class = (GtkWidgetClass*) class;
-
+
parent_class = gtk_type_class (gtk_misc_get_type ());
-
+
gtk_object_add_arg_type ("GtkLabel::label", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_LABEL);
gtk_object_add_arg_type ("GtkLabel::justify", GTK_TYPE_ENUM, GTK_ARG_READWRITE, ARG_JUSTIFY);
-
+
object_class->finalize = gtk_label_finalize;
-
+
widget_class->size_request = gtk_label_size_request;
widget_class->expose_event = gtk_label_expose;
widget_class->style_set = gtk_label_style_set;
@@ -97,9 +97,9 @@ gtk_label_class_init (GtkLabelClass *class)
}
static void
-gtk_label_set_arg (GtkLabel *label,
- GtkArg *arg,
- guint arg_id)
+gtk_label_set_arg (GtkLabel *label,
+ GtkArg *arg,
+ guint arg_id)
{
switch (arg_id)
{
@@ -115,9 +115,10 @@ gtk_label_set_arg (GtkLabel *label,
}
}
-static void gtk_label_get_arg (GtkLabel *label,
- GtkArg *arg,
- guint arg_id)
+static void
+gtk_label_get_arg (GtkLabel *label,
+ GtkArg *arg,
+ guint arg_id)
{
switch (arg_id)
{
@@ -137,43 +138,44 @@ static void
gtk_label_init (GtkLabel *label)
{
GTK_WIDGET_SET_FLAGS (label, GTK_NO_WINDOW);
-
+
label->label = NULL;
label->row = NULL;
+ label->max_width = 0;
label->jtype = GTK_JUSTIFY_CENTER;
- label->needs_clear = 0;
-
+ label->needs_clear = FALSE;
+
gtk_label_set (label, "");
}
GtkWidget*
-gtk_label_new (const char *str)
+gtk_label_new (const gchar *str)
{
GtkLabel *label;
-
+
g_return_val_if_fail (str != NULL, NULL);
-
+
label = gtk_type_new (gtk_label_get_type ());
-
+
gtk_label_set (label, str);
-
+
return GTK_WIDGET (label);
}
void
-gtk_label_set (GtkLabel *label,
- const char *str)
+gtk_label_set (GtkLabel *label,
+ const gchar *str)
{
char* p;
-
+
g_return_if_fail (label != NULL);
g_return_if_fail (GTK_IS_LABEL (label));
g_return_if_fail (str != NULL);
-
+
if (label->label)
g_free (label->label);
label->label = g_strdup (str);
-
+
if (label->row)
g_slist_free (label->row);
label->row = NULL;
@@ -181,7 +183,7 @@ gtk_label_set (GtkLabel *label,
p = label->label;
while ((p = strchr(p, '\n')))
label->row = g_slist_append (label->row, ++p);
-
+
if (GTK_WIDGET_VISIBLE (label))
{
if (GTK_WIDGET_MAPPED (label))
@@ -190,43 +192,44 @@ gtk_label_set (GtkLabel *label,
GTK_WIDGET (label)->allocation.y,
GTK_WIDGET (label)->allocation.width,
GTK_WIDGET (label)->allocation.height);
-
+
gtk_widget_queue_resize (GTK_WIDGET (label));
}
}
void
-gtk_label_set_justify (GtkLabel *label, GtkJustification jtype)
+gtk_label_set_justify (GtkLabel *label,
+ GtkJustification jtype)
{
g_return_if_fail (label != NULL);
g_return_if_fail (GTK_IS_LABEL (label));
-
+
if ((GtkJustification) label->jtype != jtype)
{
label->jtype = jtype;
if (GTK_WIDGET_VISIBLE (label))
- {
- if (GTK_WIDGET_MAPPED (label))
- gdk_window_clear_area (GTK_WIDGET (label)->window,
- GTK_WIDGET (label)->allocation.x,
- GTK_WIDGET (label)->allocation.y,
- GTK_WIDGET (label)->allocation.width,
- GTK_WIDGET (label)->allocation.height);
-
- gtk_widget_queue_resize (GTK_WIDGET (label));
- }
+ {
+ if (GTK_WIDGET_MAPPED (label))
+ gdk_window_clear_area (GTK_WIDGET (label)->window,
+ GTK_WIDGET (label)->allocation.x,
+ GTK_WIDGET (label)->allocation.y,
+ GTK_WIDGET (label)->allocation.width,
+ GTK_WIDGET (label)->allocation.height);
+
+ gtk_widget_queue_resize (GTK_WIDGET (label));
+ }
}
}
void
-gtk_label_get (GtkLabel *label,
- char **str)
+gtk_label_get (GtkLabel *label,
+ gchar **str)
{
g_return_if_fail (label != NULL);
g_return_if_fail (GTK_IS_LABEL (label));
g_return_if_fail (str != NULL);
-
+
*str = label->label;
}
@@ -254,36 +257,37 @@ gtk_label_size_request (GtkWidget *widget,
GtkLabel *label;
GSList *row;
gint width;
-
+
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_LABEL (widget));
g_return_if_fail (requisition != NULL);
-
+
label = GTK_LABEL (widget);
-
+
row = label->row;
width = 0;
while (row)
{
if (row->next)
- width = MAX (width,
- gdk_text_width (GTK_WIDGET (label)->style->font,
- row->data,
- (gchar*) row->next->data - (gchar*) row->data - 1));
+ width = MAX (width,
+ gdk_text_width (GTK_WIDGET (label)->style->font,
+ row->data,
+ (gchar*) row->next->data - (gchar*) row->data - 1));
else
- width = MAX (width, gdk_string_width (GTK_WIDGET (label)->style->font, row->data));
+ width = MAX (width, gdk_string_width (GTK_WIDGET (label)->style->font, row->data));
row = row->next;
}
-
+
+ label->max_width = width;
requisition->width = width + label->misc.xpad * 2;
requisition->height = ((GTK_WIDGET (label)->style->font->ascent +
- GTK_WIDGET (label)->style->font->descent + 2) *
- g_slist_length(label->row) +
- label->misc.ypad * 2);
+ GTK_WIDGET (label)->style->font->descent + 2) *
+ g_slist_length(label->row) +
+ label->misc.ypad * 2);
}
static gint
-gtk_label_expose (GtkWidget *widget,
+gtk_label_expose (GtkWidget *widget,
GdkEventExpose *event)
{
GtkLabel *label;
@@ -292,28 +296,25 @@ gtk_label_expose (GtkWidget *widget,
gint state;
gint offset;
gint len;
- gint maxl;
gint x, y;
-
+
g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GTK_IS_LABEL (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
-
+
if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_MAPPED (widget))
{
label = GTK_LABEL (widget);
misc = GTK_MISC (widget);
-
+
state = widget->state;
-
- maxl = widget->requisition.width - misc->xpad * 2;
-
+
/*
* GC Clipping
*/
gdk_gc_set_clip_rectangle (widget->style->white_gc, &event->area);
gdk_gc_set_clip_rectangle (widget->style->fg_gc[state], &event->area);
-
+
/* We clear the whole allocation here so that if a partial
* expose is triggered we don't just clear part and mess up
* when the queued redraw comes along. (There will always
@@ -327,31 +328,31 @@ gtk_label_expose (GtkWidget *widget,
widget->allocation.y,
widget->allocation.width,
widget->allocation.height);
-
+
label->needs_clear = FALSE;
}
-
+
x = widget->allocation.x + misc->xpad +
- (widget->allocation.width - widget->requisition.width)
+ (widget->allocation.width - (label->max_width + label->misc.xpad * 2))
* misc->xalign + 0.5;
-
+
y = (widget->allocation.y * (1.0 - misc->yalign) +
(widget->allocation.y + widget->allocation.height -
(widget->requisition.height - misc->ypad * 2)) *
misc->yalign + widget->style->font->ascent) + 1.5;
-
+
row = label->row;
while (row && row->next)
{
len = (gchar*) row->next->data - (gchar*) row->data - 1;
offset = 0;
-
+
if (label->jtype == GTK_JUSTIFY_CENTER)
- offset = (maxl - gdk_text_width (widget->style->font, row->data, len)) / 2;
-
+ offset = (label->max_width - gdk_text_width (widget->style->font, row->data, len)) / 2;
+
else if (label->jtype == GTK_JUSTIFY_RIGHT)
- offset = (maxl - gdk_text_width (widget->style->font, row->data, len));
-
+ offset = (label->max_width - gdk_text_width (widget->style->font, row->data, len));
+
if (state == GTK_STATE_INSENSITIVE)
gdk_draw_text (widget->window, widget->style->font,
widget->style->white_gc,
@@ -370,13 +371,13 @@ gtk_label_expose (GtkWidget *widget,
* Once we have a wrapping interface we can support GTK_JUSTIFY_FILL.
*/
offset = 0;
-
+
if (label->jtype == GTK_JUSTIFY_CENTER)
- offset = (maxl - gdk_string_width (widget->style->font, row->data)) / 2;
-
+ offset = (label->max_width - gdk_string_width (widget->style->font, row->data)) / 2;
+
else if (label->jtype == GTK_JUSTIFY_RIGHT)
- offset = (maxl - gdk_string_width (widget->style->font, row->data));
-
+ offset = (label->max_width - gdk_string_width (widget->style->font, row->data));
+
if (state == GTK_STATE_INSENSITIVE)
gdk_draw_string (widget->window, widget->style->font,
widget->style->white_gc,
@@ -385,27 +386,27 @@ gtk_label_expose (GtkWidget *widget,
gdk_draw_string (widget->window, widget->style->font,
widget->style->fg_gc[state],
offset + x, y, row->data);
-
+
gdk_gc_set_clip_mask (widget->style->white_gc, NULL);
gdk_gc_set_clip_mask (widget->style->fg_gc[state], NULL);
-
+
}
return TRUE;
}
static void
-gtk_label_state_changed (GtkWidget *widget,
- guint previous_state)
+gtk_label_state_changed (GtkWidget *widget,
+ guint previous_state)
{
if (GTK_WIDGET_DRAWABLE (widget))
- GTK_LABEL (widget)->needs_clear = 1;
+ GTK_LABEL (widget)->needs_clear = TRUE;
}
static void
-gtk_label_style_set (GtkWidget *widget,
- GtkStyle *previous_style)
+gtk_label_style_set (GtkWidget *widget,
+ GtkStyle *previous_style)
{
if (GTK_WIDGET_DRAWABLE (widget))
- GTK_LABEL (widget)->needs_clear = 1;
+ GTK_LABEL (widget)->needs_clear = TRUE;
}