generic-poky/openembedded/packages/gtk+/gtk+-2.6.4-1.osso7/gtklabel.c.diff

391 lines
12 KiB
Diff

--- gtk+-2.6.4/gtk/gtklabel.c 2005-02-28 06:32:03.000000000 +0200
+++ gtk+-2.6.4/gtk/gtklabel.c 2005-04-06 16:19:36.878931912 +0300
@@ -23,6 +23,11 @@
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
*/
+
+/* Modified for Nokia Oyj during 2004. See CHANGES file for list
+ * of changes.
+ */
+
#include <config.h>
#include <math.h>
#include <string.h>
@@ -52,6 +57,7 @@
guint single_line_mode : 1;
guint have_transform : 1;
gdouble angle;
+ gboolean request_full_width;
}
GtkLabelPrivate;
@@ -75,6 +81,9 @@
LAST_SIGNAL
};
+/* Hildon mod.
+ A property PROP_TRANSLATABLE has been added here. If new Gtk+
+ versions add items here, the compability will break. */
enum {
PROP_0,
PROP_LABEL,
@@ -89,6 +98,7 @@
PROP_MNEMONIC_WIDGET,
PROP_CURSOR_POSITION,
PROP_SELECTION_BOUND,
+ PROP_TRANSLATABLE,
PROP_ELLIPSIZE,
PROP_WIDTH_CHARS,
PROP_SINGLE_LINE_MODE,
@@ -96,6 +106,12 @@
PROP_MAX_WIDTH_CHARS
};
+/* Hildon mod. A few keys. These are used to store data for label
+ * without changing the private structures. */
+#define LABEL_KEY_TRANSLATABLE "label_translatable"
+#define LABEL_KEY_TRANSLATABLETEXT "label_translatabletext"
+#define LABEL_KEY_ORIGINAL_LAYOUT "label_original_layout"
+
static guint signals[LAST_SIGNAL] = { 0 };
static void gtk_label_class_init (GtkLabelClass *klass);
@@ -149,7 +165,7 @@
static void gtk_label_set_uline_text_internal (GtkLabel *label,
const gchar *str);
static void gtk_label_set_pattern_internal (GtkLabel *label,
- const gchar *pattern);
+ const gchar *pattern);
static void set_markup (GtkLabel *label,
const gchar *str,
gboolean with_uline);
@@ -516,6 +532,24 @@
G_MAXINT,
-1,
G_PARAM_READWRITE));
+ /* Hildon mod. Add property for a widget - whether it supports run-time
+ + locale change. Please note that this functionality is not yet
+ + completed and may change. */
+ g_object_class_install_property (gobject_class,
+ PROP_TRANSLATABLE,
+ g_param_spec_boolean ("translatable",
+ _("Is translatable"),
+ _("Whether label should be translatable."),
+ FALSE,
+ G_PARAM_READWRITE));
+
+ /* Hildonlike class property */
+ gtk_widget_class_install_style_property (widget_class,
+ g_param_spec_boolean ("hildonlike",
+ _("hildonlike looks"),
+ _("Changes wrapping etc behaviour, 1/0"),
+ FALSE,
+ G_PARAM_READABLE));
/*
* Key bindings
*/
@@ -650,6 +684,10 @@
case PROP_MAX_WIDTH_CHARS:
gtk_label_set_max_width_chars (label, g_value_get_int (value));
break;
+/* Hildon add. */
+ case PROP_TRANSLATABLE:
+ gtk_label_set_translatable (label, g_value_get_boolean (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -730,6 +768,10 @@
case PROP_MAX_WIDTH_CHARS:
g_value_set_int (value, gtk_label_get_max_width_chars (label));
break;
+/* Hildon mod. */
+ case PROP_TRANSLATABLE:
+ g_value_set_boolean (value, gtk_label_get_translatable (label));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -748,6 +790,7 @@
priv->width_chars = -1;
priv->angle = 0.0;
priv->max_width_chars = -1;
+ priv->request_full_width = FALSE;
label->label = NULL;
label->jtype = GTK_JUSTIFY_LEFT;
@@ -766,6 +809,15 @@
label->mnemonic_window = NULL;
gtk_label_set_text (label, "");
+
+/* Hildon Addition. */
+
+ g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLE, FALSE);
+ g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT, NULL);
+ g_object_set_data (G_OBJECT (label), LABEL_KEY_ORIGINAL_LAYOUT, NULL);
+
+/* /Hildon Addition. */
+
}
/**
@@ -822,7 +874,7 @@
if (str && *str)
gtk_label_set_text_with_mnemonic (label, str);
-
+
return GTK_WIDGET (label);
}
@@ -1257,7 +1309,7 @@
GError *error = NULL;
PangoAttrList *attrs = NULL;
gunichar accel_char = 0;
-
+
if (!pango_parse_markup (str,
-1,
with_uline ? '_' : 0,
@@ -1340,12 +1392,14 @@
g_return_if_fail (GTK_IS_LABEL (label));
last_keyval = label->mnemonic_keyval;
+
gtk_label_set_label_internal (label, g_strdup (str ? str : ""));
gtk_label_set_use_markup_internal (label, TRUE);
gtk_label_set_use_underline_internal (label, TRUE);
-
gtk_label_recalculate (label);
+
gtk_label_setup_mnemonic (label, last_keyval);
+
}
/**
@@ -1409,7 +1463,7 @@
static void
gtk_label_set_pattern_internal (GtkLabel *label,
- const gchar *pattern)
+ const gchar *pattern)
{
PangoAttrList *attrs;
g_return_if_fail (GTK_IS_LABEL (label));
@@ -1421,7 +1475,16 @@
if (label->effective_attrs)
pango_attr_list_unref (label->effective_attrs);
+/* Following will disable undercores from
+ keyboard shortcuts if DISABLE_KEYBOARD_SHORTCUTS
+ is enabled during compile time
+ */
+#ifndef DISABLE_KEYBOARD_SHORTCUTS
label->effective_attrs = attrs;
+#else
+ pango_attr_list_unref (attrs);
+#endif /* DISABLE_KEYBOARD_SHORTCUTS */
+
}
void
@@ -1742,8 +1805,13 @@
{
PangoLayout *layout;
GtkStyle *style = GTK_WIDGET (label)->style;
-
+
+ gboolean hildonlike;
LabelWrapWidth *wrap_width = g_object_get_data (G_OBJECT (style), "gtk-label-wrap-width");
+
+ /* Hildon: get hildonlike property */
+ gtk_widget_style_get (GTK_WIDGET (label), "hildonlike", &hildonlike, NULL);
+
if (!wrap_width)
{
wrap_width = g_new0 (LabelWrapWidth, 1);
@@ -1763,7 +1831,12 @@
"This long string gives a good enough length for any line to have.");
pango_layout_get_size (layout, &wrap_width->width, NULL);
g_object_unref (layout);
-
+ /* A hildon mod for "fixing line wrapping". Remember to remove this
+ when GtkLabel will implement width for height size negotiation.*/
+ if (hildonlike)
+ {
+ wrap_width->width = wrap_width->width * 1.25;
+ }
return wrap_width->width;
}
@@ -1774,8 +1847,12 @@
PangoRectangle logical_rect;
gint rwidth, rheight;
gboolean rtl;
+ gboolean hildonlike;
widget = GTK_WIDGET (label);
+
+ /* Hildon: get hildonlike property */
+ gtk_widget_style_get (widget, "hildonlike", &hildonlike, NULL);
rtl = gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL;
rwidth = label->misc.xpad * 2;
@@ -1864,8 +1941,18 @@
wrap_width = get_label_wrap_width (label);
width = MIN (width, wrap_width);
- width = MIN (width,
+
+ if (!hildonlike)
+ {
+ width = MIN (width,
PANGO_SCALE * (gdk_screen_get_width (screen) + 1) / 2);
+ }
+ else
+ {
+ width = MIN (width,
+ PANGO_SCALE * (gdk_screen_get_width (screen) + 1));
+ }
+
pango_layout_set_width (label->layout, width);
pango_layout_get_extents (label->layout, NULL, &logical_rect);
@@ -1910,6 +1997,7 @@
else /* !label->wrap */
pango_layout_set_width (label->layout, -1);
}
+
}
/* Gets the bounds of a layout in device coordinates. Note cut-and-paste
@@ -2017,7 +2105,8 @@
priv->width_chars > 0 || priv->max_width_chars > 0) &&
aux_info && aux_info->width > 0)
width += aux_info->width;
- else if (label->ellipsize || priv->width_chars > 0 || priv->max_width_chars > 0)
+ else if ((label->ellipsize || priv->width_chars > 0 || priv->max_width_chars > 0) &&
+ !priv->request_full_width)
{
PangoContext *context;
PangoFontMetrics *metrics;
@@ -2081,11 +2170,24 @@
GtkAllocation *allocation)
{
GtkLabel *label;
+ GtkRequisition req;
+ GtkLabelPrivate *priv;
label = GTK_LABEL (widget);
+ priv = GTK_LABEL_GET_PRIVATE (label);
(* GTK_WIDGET_CLASS (parent_class)->size_allocate) (widget, allocation);
+ gtk_widget_get_child_requisition (widget, &req);
+
+ if (allocation->width < req.width && !label->wrap)
+ {
+ gtk_label_set_ellipsize (label, PANGO_ELLIPSIZE_END);
+ priv->request_full_width = TRUE;
+ }
+ else
+ priv->request_full_width = FALSE;
+
if (label->ellipsize)
{
if (label->layout)
@@ -2479,7 +2581,7 @@
}
*dest = 0;
*pattern_dest = 0;
-
+
gtk_label_set_text_internal (label, new_str);
gtk_label_set_pattern_internal (label, pattern);
@@ -2541,13 +2643,11 @@
last_keyval = label->mnemonic_keyval;
g_object_freeze_notify (G_OBJECT (label));
-
gtk_label_set_label_internal (label, g_strdup (str ? str : ""));
gtk_label_set_use_markup_internal (label, FALSE);
gtk_label_set_use_underline_internal (label, TRUE);
-
- gtk_label_recalculate (label);
+ gtk_label_recalculate (label);
gtk_label_setup_mnemonic (label, last_keyval);
g_object_thaw_notify (G_OBJECT (label));
@@ -3948,3 +4048,67 @@
popup_position_func, label,
0, gtk_get_current_event_time ());
}
+
+/* Hildon mod.
+ * Functions for run-time locale changing. Beware though that this
+ functionality is not yet completed. Therefore it's suggested
+ that these functions shouldn't be used yet outside testing. */
+
+void gtk_label_set_translatable (GtkLabel *label, gboolean newstatus)
+{
+ if (newstatus == gtk_label_get_translatable (label)) return;
+
+ if (newstatus == TRUE)
+ {
+ if (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT) != NULL)
+ g_free (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT));
+ g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT, g_strdup (label->label));
+ g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLE, (void*) TRUE);
+ if (label->text != NULL)
+ g_free (label->text);
+ if (label->label != NULL)
+ g_free (label->label);
+ label->text = g_strdup(_(g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT)));
+ label->label = g_strdup(_(g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT)));
+ }
+ else
+ {
+ if (label->text != NULL)
+ g_free (label->text);
+ if (label->label != NULL)
+ g_free (label->label);
+ label->text = g_strdup (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT));
+ label->label = g_strdup (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT));
+ g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLE, FALSE);
+ if (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT) != NULL)
+ g_free (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT));
+ g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT, NULL);
+ }
+ gtk_label_recalculate (label);
+}
+
+gboolean gtk_label_get_translatable (GtkLabel *label)
+{
+ return (gboolean) (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLE));
+}
+
+
+void gtk_label_retranslate (GtkLabel *label)
+{
+ g_object_freeze_notify (G_OBJECT (label));
+ if (gtk_label_get_translatable (label) == TRUE)
+ {
+ if (label->label != NULL)
+ g_free (label->label);
+ label->label = g_strdup(gettext(g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT)));
+ }
+ if (g_object_get_data (G_OBJECT (label), LABEL_KEY_ORIGINAL_LAYOUT)) g_object_unref (g_object_get_data (G_OBJECT (label), LABEL_KEY_ORIGINAL_LAYOUT));
+ g_object_set_data (G_OBJECT (label), LABEL_KEY_ORIGINAL_LAYOUT, NULL);
+ g_object_notify (G_OBJECT (label), "label");
+ gtk_label_recalculate (label);
+ g_object_thaw_notify (G_OBJECT (label));
+ gtk_label_set_text (label, label->label);
+}
+
+/* End of hildon mods for run-time locale change. */
+