]> pilppa.org Git - familiar-h63xx-build.git/blob - org.handhelds.familiar/packages/gtk+/gtk+-2.6.4-1.osso7/gtklabel.c.diff
OE tree imported from monotone branch org.openembedded.oz354fam083 at revision 8b12e3...
[familiar-h63xx-build.git] / org.handhelds.familiar / packages / gtk+ / gtk+-2.6.4-1.osso7 / gtklabel.c.diff
1 --- gtk+-2.6.4/gtk/gtklabel.c   2005-02-28 06:32:03.000000000 +0200
2 +++ gtk+-2.6.4/gtk/gtklabel.c   2005-04-06 16:19:36.878931912 +0300
3 @@ -23,6 +23,11 @@
4   * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
5   */
6  
7 +
8 +/* Modified for Nokia Oyj during 2004. See CHANGES file for list
9 + * of changes.
10 + */
11 +
12  #include <config.h>
13  #include <math.h>
14  #include <string.h>
15 @@ -52,6 +57,7 @@
16    guint single_line_mode : 1;
17    guint have_transform : 1;
18    gdouble angle;
19 +  gboolean request_full_width;
20  }
21  GtkLabelPrivate;
22  
23 @@ -75,6 +81,9 @@
24    LAST_SIGNAL
25  };
26  
27 +/* Hildon mod.
28 +   A property PROP_TRANSLATABLE has been added here. If new Gtk+
29 +   versions add items here, the compability will break. */
30  enum {
31    PROP_0,
32    PROP_LABEL,
33 @@ -89,6 +98,7 @@
34    PROP_MNEMONIC_WIDGET,
35    PROP_CURSOR_POSITION,
36    PROP_SELECTION_BOUND,
37 +  PROP_TRANSLATABLE,
38    PROP_ELLIPSIZE,
39    PROP_WIDTH_CHARS,
40    PROP_SINGLE_LINE_MODE,
41 @@ -96,6 +106,12 @@
42    PROP_MAX_WIDTH_CHARS
43  };
44  
45 +/* Hildon mod. A few keys. These are used to store data for label
46 + * without changing the private structures. */
47 +#define LABEL_KEY_TRANSLATABLE "label_translatable"
48 +#define LABEL_KEY_TRANSLATABLETEXT "label_translatabletext"
49 +#define LABEL_KEY_ORIGINAL_LAYOUT "label_original_layout"
50 +
51  static guint signals[LAST_SIGNAL] = { 0 };
52  
53  static void gtk_label_class_init        (GtkLabelClass    *klass);
54 @@ -149,7 +165,7 @@
55  static void gtk_label_set_uline_text_internal    (GtkLabel      *label,
56                                                   const gchar   *str);
57  static void gtk_label_set_pattern_internal       (GtkLabel      *label,
58 -                                                 const gchar   *pattern);
59 +                                                  const gchar   *pattern);
60  static void set_markup                           (GtkLabel      *label,
61                                                   const gchar   *str,
62                                                   gboolean       with_uline);
63 @@ -516,6 +532,24 @@
64                                                       G_MAXINT,
65                                                       -1,
66                                                       G_PARAM_READWRITE));
67 + /* Hildon mod. Add property for a widget - whether it supports run-time
68 +  +    locale change. Please note that this functionality is not yet
69 +  +    completed and may change. */
70 +  g_object_class_install_property (gobject_class,
71 +                                   PROP_TRANSLATABLE,
72 +                                   g_param_spec_boolean ("translatable",
73 +                                                         _("Is translatable"),
74 +                                                        _("Whether label should be translatable."),
75 +                                                        FALSE,
76 +                                                        G_PARAM_READWRITE));
77 +
78 + /* Hildonlike class property */
79 + gtk_widget_class_install_style_property (widget_class,
80 +                                         g_param_spec_boolean ("hildonlike",
81 +                                                 _("hildonlike looks"),
82 +                                                 _("Changes wrapping etc behaviour, 1/0"),
83 +                                                 FALSE,
84 +                                                 G_PARAM_READABLE));
85    /*
86     * Key bindings
87     */
88 @@ -650,6 +684,10 @@
89      case PROP_MAX_WIDTH_CHARS:
90        gtk_label_set_max_width_chars (label, g_value_get_int (value));
91        break;
92 +/* Hildon add. */
93 +    case PROP_TRANSLATABLE:
94 +      gtk_label_set_translatable (label, g_value_get_boolean (value));
95 +      break;
96      default:
97        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
98        break;
99 @@ -730,6 +768,10 @@
100      case PROP_MAX_WIDTH_CHARS:
101        g_value_set_int (value, gtk_label_get_max_width_chars (label));
102        break;
103 +/* Hildon mod. */
104 +    case PROP_TRANSLATABLE:
105 +      g_value_set_boolean (value, gtk_label_get_translatable (label));
106 +      break;
107  
108      default:
109        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
110 @@ -748,6 +790,7 @@
111    priv->width_chars = -1;
112    priv->angle = 0.0;
113    priv->max_width_chars = -1;
114 +  priv->request_full_width = FALSE;
115    label->label = NULL;
116  
117    label->jtype = GTK_JUSTIFY_LEFT;
118 @@ -766,6 +809,15 @@
119    label->mnemonic_window = NULL;
120    
121    gtk_label_set_text (label, "");
122 +   
123 +/* Hildon Addition. */
124 +   
125 +  g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLE, FALSE);
126 +  g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT, NULL);
127 +  g_object_set_data (G_OBJECT (label), LABEL_KEY_ORIGINAL_LAYOUT, NULL);
128 +   
129 +/* /Hildon Addition. */
130 +   
131  }
132  
133  /**
134 @@ -822,7 +874,7 @@
135  
136    if (str && *str)
137      gtk_label_set_text_with_mnemonic (label, str);
138 -  
139 +
140    return GTK_WIDGET (label);
141  }
142  
143 @@ -1257,7 +1309,7 @@
144    GError *error = NULL;
145    PangoAttrList *attrs = NULL;
146    gunichar accel_char = 0;
147 -
148
149    if (!pango_parse_markup (str,
150                             -1,
151                             with_uline ? '_' : 0,
152 @@ -1340,12 +1392,14 @@
153    g_return_if_fail (GTK_IS_LABEL (label));
154  
155    last_keyval = label->mnemonic_keyval;
156 +
157    gtk_label_set_label_internal (label, g_strdup (str ? str : ""));
158    gtk_label_set_use_markup_internal (label, TRUE);
159    gtk_label_set_use_underline_internal (label, TRUE);
160 -  
161    gtk_label_recalculate (label);
162
163    gtk_label_setup_mnemonic (label, last_keyval);
164 +
165  }
166  
167  /**
168 @@ -1409,7 +1463,7 @@
169  
170  static void
171  gtk_label_set_pattern_internal (GtkLabel    *label,
172 -                               const gchar *pattern)
173 +                                const gchar *pattern)
174  {
175    PangoAttrList *attrs;
176    g_return_if_fail (GTK_IS_LABEL (label));
177 @@ -1421,7 +1475,16 @@
178  
179    if (label->effective_attrs)
180      pango_attr_list_unref (label->effective_attrs);
181 +/* Following will disable undercores from
182 +   keyboard shortcuts if DISABLE_KEYBOARD_SHORTCUTS
183 +   is enabled during compile time
184 + */
185 +#ifndef DISABLE_KEYBOARD_SHORTCUTS
186    label->effective_attrs = attrs;
187 +#else
188 +  pango_attr_list_unref (attrs);
189 +#endif /* DISABLE_KEYBOARD_SHORTCUTS */
190 +
191  }
192  
193  void
194 @@ -1742,8 +1805,13 @@
195  {
196    PangoLayout *layout;
197    GtkStyle *style = GTK_WIDGET (label)->style;
198 -
199 +  
200 +  gboolean hildonlike;
201    LabelWrapWidth *wrap_width = g_object_get_data (G_OBJECT (style), "gtk-label-wrap-width");
202 +
203 +  /* Hildon: get hildonlike property */
204 +  gtk_widget_style_get (GTK_WIDGET (label), "hildonlike", &hildonlike, NULL);
205 +
206    if (!wrap_width)
207      {
208        wrap_width = g_new0 (LabelWrapWidth, 1);
209 @@ -1763,7 +1831,12 @@
210                                            "This long string gives a good enough length for any line to have.");
211    pango_layout_get_size (layout, &wrap_width->width, NULL);
212    g_object_unref (layout);
213 -
214 +  /* A hildon mod for "fixing line wrapping". Remember to remove this
215 +   when GtkLabel will implement width for height size negotiation.*/
216 +  if (hildonlike)
217 +    {
218 +      wrap_width->width = wrap_width->width  * 1.25;
219 +    }
220    return wrap_width->width;
221  }
222  
223 @@ -1774,8 +1847,12 @@
224    PangoRectangle logical_rect;
225    gint rwidth, rheight;
226    gboolean rtl;
227 +  gboolean hildonlike;
228  
229    widget = GTK_WIDGET (label);
230
231 +  /* Hildon: get hildonlike property */
232 +  gtk_widget_style_get (widget, "hildonlike", &hildonlike, NULL);
233  
234    rtl = gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL;
235    rwidth = label->misc.xpad * 2;
236 @@ -1864,8 +1941,18 @@
237  
238               wrap_width = get_label_wrap_width (label);
239               width = MIN (width, wrap_width);
240 -             width = MIN (width,
241
242 +              if (!hildonlike)
243 +                {
244 +                width = MIN (width,
245                            PANGO_SCALE * (gdk_screen_get_width (screen) + 1) / 2);
246 +               }
247 +              else 
248 +                {
249 +                 width = MIN (width,
250 +                           PANGO_SCALE * (gdk_screen_get_width (screen) + 1));
251 +               }
252 +            
253               
254               pango_layout_set_width (label->layout, width);
255               pango_layout_get_extents (label->layout, NULL, &logical_rect);
256 @@ -1910,6 +1997,7 @@
257        else /* !label->wrap */
258         pango_layout_set_width (label->layout, -1);
259      }
260 +
261  }
262  
263  /* Gets the bounds of a layout in device coordinates. Note cut-and-paste
264 @@ -2017,7 +2105,8 @@
265         priv->width_chars > 0 || priv->max_width_chars > 0) && 
266        aux_info && aux_info->width > 0)
267      width += aux_info->width;
268 -  else if (label->ellipsize || priv->width_chars > 0 || priv->max_width_chars > 0)
269 +  else if ((label->ellipsize || priv->width_chars > 0 || priv->max_width_chars > 0) &&
270 +             !priv->request_full_width)
271      {
272        PangoContext *context;
273        PangoFontMetrics *metrics;
274 @@ -2081,11 +2170,24 @@
275                           GtkAllocation *allocation)
276  {
277    GtkLabel *label;
278 +  GtkRequisition req;
279 +  GtkLabelPrivate *priv;
280  
281    label = GTK_LABEL (widget);
282 +  priv = GTK_LABEL_GET_PRIVATE (label);
283  
284    (* GTK_WIDGET_CLASS (parent_class)->size_allocate) (widget, allocation);
285  
286 +  gtk_widget_get_child_requisition (widget, &req);
287 +
288 +  if (allocation->width < req.width && !label->wrap)
289 +    {
290 +      gtk_label_set_ellipsize (label, PANGO_ELLIPSIZE_END);
291 +      priv->request_full_width = TRUE;
292 +    }
293 +  else
294 +    priv->request_full_width = FALSE;
295 +
296    if (label->ellipsize)
297      {
298        if (label->layout)
299 @@ -2479,7 +2581,7 @@
300      }
301    *dest = 0;
302    *pattern_dest = 0;
303 -  
304 +
305    gtk_label_set_text_internal (label, new_str);
306    gtk_label_set_pattern_internal (label, pattern);
307    
308 @@ -2541,13 +2643,11 @@
309    last_keyval = label->mnemonic_keyval;
310  
311    g_object_freeze_notify (G_OBJECT (label));
312 -
313    gtk_label_set_label_internal (label, g_strdup (str ? str : ""));
314    gtk_label_set_use_markup_internal (label, FALSE);
315    gtk_label_set_use_underline_internal (label, TRUE);
316 -  
317 -  gtk_label_recalculate (label);
318  
319 +  gtk_label_recalculate (label);
320    gtk_label_setup_mnemonic (label, last_keyval);
321  
322    g_object_thaw_notify (G_OBJECT (label));
323 @@ -3948,3 +4048,67 @@
324                      popup_position_func, label,
325                      0, gtk_get_current_event_time ());
326  }
327 +
328 +/* Hildon mod.
329 + * Functions for run-time locale changing. Beware though that this
330 +   functionality is not yet completed. Therefore it's suggested
331 +   that these functions shouldn't be used yet outside testing.  */
332 +   
333 +void     gtk_label_set_translatable       (GtkLabel *label, gboolean newstatus)
334 +{
335 +  if (newstatus == gtk_label_get_translatable (label)) return;
336 +   
337 +  if (newstatus == TRUE)
338 +    {
339 +      if (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT) != NULL)
340 +        g_free (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT));
341 +      g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT, g_strdup (label->label));
342 +      g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLE, (void*) TRUE);
343 +      if (label->text != NULL)
344 +        g_free (label->text);
345 +      if (label->label != NULL)
346 +        g_free (label->label);
347 +      label->text = g_strdup(_(g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT)));
348 +      label->label = g_strdup(_(g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT)));
349 +    }
350 +  else
351 +    {
352 +      if (label->text != NULL)
353 +        g_free (label->text);
354 +      if (label->label != NULL)
355 +        g_free (label->label);
356 +      label->text = g_strdup (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT));
357 +      label->label = g_strdup (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT));
358 +      g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLE, FALSE);
359 +      if (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT) != NULL)
360 +        g_free (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT));
361 +      g_object_set_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT, NULL);
362 +    }
363 +  gtk_label_recalculate (label);
364 +}
365 +
366 +gboolean gtk_label_get_translatable       (GtkLabel *label)
367 +{
368 +  return (gboolean) (g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLE));
369 +}
370 +
371 +   
372 +void     gtk_label_retranslate            (GtkLabel *label)
373 +{
374 +  g_object_freeze_notify (G_OBJECT (label));
375 +  if (gtk_label_get_translatable (label) == TRUE)
376 +    {
377 +      if (label->label != NULL)
378 +        g_free (label->label);
379 +      label->label = g_strdup(gettext(g_object_get_data (G_OBJECT (label), LABEL_KEY_TRANSLATABLETEXT)));
380 +    }
381 +  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));
382 +  g_object_set_data (G_OBJECT (label), LABEL_KEY_ORIGINAL_LAYOUT, NULL);
383 +  g_object_notify (G_OBJECT (label), "label");
384 +  gtk_label_recalculate (label);
385 +  g_object_thaw_notify (G_OBJECT (label));
386 +  gtk_label_set_text (label, label->label);
387 +}
388 +
389 +/* End of hildon mods for run-time locale change. */
390 +