[maemo-commits] [maemo-commits] r19010 - in projects/haf/trunk/gtk+: . gtk

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Fri Jul 31 11:51:08 EEST 2009
Author: mitch
Date: 2009-07-31 11:51:03 +0300 (Fri, 31 Jul 2009)
New Revision: 19010

Modified:
   projects/haf/trunk/gtk+/ChangeLog
   projects/haf/trunk/gtk+/gtk/gtk.symbols
   projects/haf/trunk/gtk+/gtk/gtkentry.c
   projects/haf/trunk/gtk+/gtk/gtkentry.h
Log:
2009-07-31  Michael Natterer  <mitch at lando.com>

	Addresses: NB#122395 - hildon_entry_set_placeholder() should be in
	GtkEntry

	* gtk/gtkentry.[ch]
	* gtk/gtk.symbols: applied a slightly modified patch from Kristian
	Rietveld (fixed up by Garcia Gonzalez Alberto) which adds API to
	set a placeholder text that is shown when the entry is empty and
	has no focus,



Modified: projects/haf/trunk/gtk+/ChangeLog
===================================================================
--- projects/haf/trunk/gtk+/ChangeLog	2009-07-29 16:44:00 UTC (rev 19009)
+++ projects/haf/trunk/gtk+/ChangeLog	2009-07-31 08:51:03 UTC (rev 19010)
@@ -1,3 +1,14 @@
+2009-07-31  Michael Natterer  <mitch at lando.com>
+
+	Addresses: NB#122395 - hildon_entry_set_placeholder() should be in
+	GtkEntry
+
+	* gtk/gtkentry.[ch]
+	* gtk/gtk.symbols: applied a slightly modified patch from Kristian
+	Rietveld (fixed up by Garcia Gonzalez Alberto) which adds API to
+	set a placeholder text that is shown when the entry is empty and
+	has no focus,
+
 2009-07-24  Kristian Rietveld  <kris at lanedo.com>
 
 	* gtk/gtktreeview.c (gtk_tree_view_adjustment_changed): process

Modified: projects/haf/trunk/gtk+/gtk/gtk.symbols
===================================================================
--- projects/haf/trunk/gtk+/gtk/gtk.symbols	2009-07-29 16:44:00 UTC (rev 19009)
+++ projects/haf/trunk/gtk+/gtk/gtk.symbols	2009-07-31 08:51:03 UTC (rev 19010)
@@ -1312,6 +1312,8 @@
 hildon_gtk_entry_get_input_mode
 hildon_gtk_entry_set_input_default
 hildon_gtk_entry_set_input_mode
+hildon_gtk_entry_get_placeholder_text
+hildon_gtk_entry_set_placeholder_text
 #endif
 #endif
 #endif

Modified: projects/haf/trunk/gtk+/gtk/gtkentry.c
===================================================================
--- projects/haf/trunk/gtk+/gtk/gtkentry.c	2009-07-29 16:44:00 UTC (rev 19009)
+++ projects/haf/trunk/gtk+/gtk/gtkentry.c	2009-07-31 08:51:03 UTC (rev 19010)
@@ -99,6 +99,10 @@
   gdouble progress_fraction;
   gdouble progress_pulse_fraction;
   gdouble progress_pulse_current;
+#ifdef MAEMO_CHANGES
+  gchar *placeholder_text;
+  PangoLayout *placeholder_layout;
+#endif /* MAEMO_CHANGES */
 };
 
 typedef struct _GtkEntryPasswordHint GtkEntryPasswordHint;
@@ -150,6 +154,7 @@
   PROP_PROGRESS_FRACTION,
   PROP_PROGRESS_PULSE_STEP
 #ifdef MAEMO_CHANGES
+  , PROP_HILDON_PLACEHOLDER_TEXT
   , PROP_HILDON_INPUT_MODE
   , PROP_HILDON_INPUT_DEFAULT
 #endif /* MAEMO_CHANGES */
@@ -318,6 +323,8 @@
 static void     gtk_entry_clipboard_operation_cb  (GtkIMContext *context,
                                                    GtkIMContextClipboardOperation op,
                                                    GtkEntry     *entry);
+
+static PangoLayout * gtk_entry_create_placeholder_layout (GtkEntry *entry);
 #endif /* MAEMO_CHANGES */
 
 /* Internal routines
@@ -731,6 +738,21 @@
                                                         GTK_PARAM_READWRITE));
 
 #ifdef MAEMO_CHANGES
+ /**
+  * GtkEntry:hildon-placeholder-text:
+  *
+  * Text to be displayed in the #GtkEntry when it is empty.
+  *
+  * Since: maemo 5
+  */
+ g_object_class_install_property (gobject_class,
+                                  PROP_HILDON_PLACEHOLDER_TEXT,
+                                  g_param_spec_string ("hildon-placeholder-text",
+                                                       P_("Hildon Placeholder text"),
+                                                       P_("Text to be displayed when the entry is empty"),
+                                                       "",
+                                                       G_PARAM_READWRITE));
+
   /**
    * GtkEntry:hildon-input-mode:
    *
@@ -1231,6 +1253,10 @@
       break;
 
 #ifdef MAEMO_CHANGES
+    case PROP_HILDON_PLACEHOLDER_TEXT:
+      hildon_gtk_entry_set_placeholder_text (entry, g_value_get_string (value));
+      break;
+
     case PROP_HILDON_INPUT_MODE:
       hildon_gtk_entry_set_input_mode (entry, g_value_get_flags (value));
       break;
@@ -1317,6 +1343,10 @@
       g_value_set_double (value, priv->progress_pulse_fraction);
       break;
 #ifdef MAEMO_CHANGES
+    case PROP_HILDON_PLACEHOLDER_TEXT:
+      g_value_set_string (value, hildon_gtk_entry_get_placeholder_text (entry));
+      break;
+
     case PROP_HILDON_INPUT_MODE:
       g_value_set_flags (value, hildon_gtk_entry_get_input_mode (entry));
       break;
@@ -1361,6 +1391,11 @@
   priv->progress_fraction = 0.0;
   priv->progress_pulse_fraction = 0.1;
 
+#ifdef MAEMO_CHANGES
+  priv->placeholder_text = NULL;
+  priv->placeholder_layout = NULL;
+#endif /* MAEMO_CHANGES */
+
   gtk_drag_dest_set (GTK_WIDGET (entry),
                      GTK_DEST_DEFAULT_HIGHLIGHT,
                      NULL, 0,
@@ -1474,6 +1509,9 @@
 gtk_entry_finalize (GObject *object)
 {
   GtkEntry *entry = GTK_ENTRY (object);
+#ifdef MAEMO_CHANGES
+  GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (object);
+#endif /* MAEMO_CHANGES */
 
   gtk_entry_set_completion (entry, NULL);
 
@@ -1498,6 +1536,17 @@
       entry->text = NULL;
     }
 
+#ifdef MAEMO_CHANGES
+  if (priv->placeholder_text)
+    {
+      g_free (priv->placeholder_text);
+      priv->placeholder_text = NULL;
+
+      g_object_unref (priv->placeholder_layout);
+      priv->placeholder_layout = NULL;
+    }
+#endif /* MAEMO_CHANGES */
+
   G_OBJECT_CLASS (gtk_entry_parent_class)->finalize (object);
 }
 
@@ -2747,6 +2796,14 @@
   
   gtk_entry_recompute (entry);
 
+#ifdef MAEMO_CHANGES
+  if (priv->placeholder_text)
+    {
+      g_object_unref (priv->placeholder_layout);
+      priv->placeholder_layout = gtk_entry_create_placeholder_layout (entry);
+    }
+#endif /* MAEMO_CHANGES */
+
   if (previous_style && GTK_WIDGET_REALIZED (widget))
     {
       gdk_window_set_background (widget->window, &widget->style->base[GTK_WIDGET_STATE (widget)]);
@@ -3765,7 +3822,61 @@
   return FALSE;
 }
 
+#ifdef MAEMO_CHANGES
 static PangoLayout *
+gtk_entry_create_placeholder_layout (GtkEntry *entry)
+{
+  GtkWidget *widget = GTK_WIDGET (entry);
+  PangoLayout *layout = gtk_widget_create_pango_layout (widget, NULL);
+  GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry);
+  PangoDirection pango_dir;
+  GdkColor font_color;
+
+  pango_layout_set_single_paragraph_mode (layout, TRUE);
+
+  pango_dir = pango_find_base_dir (priv->placeholder_text,
+                                   strlen (priv->placeholder_text));
+
+  if (pango_dir == PANGO_DIRECTION_NEUTRAL)
+    {
+      if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
+        pango_dir = PANGO_DIRECTION_RTL;
+      else
+        pango_dir = PANGO_DIRECTION_LTR;
+    }
+
+  pango_context_set_base_dir (gtk_widget_get_pango_context (widget),
+                              pango_dir);
+
+  pango_layout_set_alignment (layout, pango_dir);
+
+  pango_layout_set_text (layout, priv->placeholder_text,
+                         strlen (priv->placeholder_text));
+
+  if (gtk_style_lookup_color (widget->style, "ReversedSecondaryTextColor",
+                              &font_color))
+    {
+      PangoAttrList *list;
+      PangoAttribute *attr;
+
+      list = pango_attr_list_new ();
+      attr = pango_attr_foreground_new (font_color.red,
+                                        font_color.green,
+                                        font_color.blue);
+      attr->start_index = 0;
+      attr->end_index = G_MAXINT;
+      pango_attr_list_insert (list, attr);
+
+      pango_layout_set_attributes (layout, list);
+
+      pango_attr_list_unref (list);
+    }
+
+  return layout;
+}
+#endif /* MAEMO_CHANGES */
+
+static PangoLayout *
 gtk_entry_create_layout (GtkEntry *entry,
 			 gboolean  include_preedit)
 {
@@ -3966,6 +4077,21 @@
   return entry->cached_layout;
 }
 
+#ifdef MAEMO_CHANGES
+static inline gboolean
+show_placeholder (GtkEntry *entry)
+{
+  GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry);
+
+  if (!GTK_WIDGET_HAS_FOCUS (entry)
+      && entry->n_bytes == 0
+      && priv->placeholder_text)
+    return TRUE;
+
+  return FALSE;
+}
+#endif /* MAEMO_CHANGES */
+
 static void
 get_layout_position (GtkEntry *entry,
                      gint     *x,
@@ -3977,7 +4103,15 @@
   GtkBorder inner_border;
   gint y_pos;
   PangoLayoutLine *line;
+#ifdef MAEMO_CHANGES
+  GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry);
+#endif /* MAEMO_CHANGES */
   
+#ifdef MAEMO_CHANGES
+  if (show_placeholder (entry))
+    layout = priv->placeholder_layout;
+  else
+#endif /* !MAEMO_CHANGES */
   layout = gtk_entry_ensure_layout (entry, TRUE);
 
   get_text_area_size (entry, NULL, NULL, &area_width, &area_height);
@@ -4019,13 +4153,27 @@
   
   if (GTK_WIDGET_DRAWABLE (entry))
     {
+#ifdef MAEMO_CHANGES
+      PangoLayout *layout;
+#else /* !MAEMO_CHANGES */
       PangoLayout *layout = gtk_entry_ensure_layout (entry, TRUE);
+#endif /* !MAEMO_CHANGES */
       cairo_t *cr;
       gint x, y;
       gint start_pos, end_pos;
+#ifdef MAEMO_CHANGES
+      GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry);
+#endif /* MAEMO_CHANGES */
       
       widget = GTK_WIDGET (entry);
       
+#ifdef MAEMO_CHANGES
+      if (show_placeholder (entry))
+        layout = priv->placeholder_layout;
+      else
+        layout = gtk_entry_ensure_layout (entry, TRUE);
+#endif /* !MAEMO_CHANGES */
+
       get_layout_position (entry, &x, &y);
 
       cr = gdk_cairo_create (entry->text_area);
@@ -7093,7 +7241,75 @@
 
 
 #ifdef MAEMO_CHANGES
+/**
+ * hildon_gtk_entry_set_placeholder_text:
+ * @entry: a #GtkEntry
+ * @placeholder_text: a string to be displayed when @entry is empty
+ * and unfocused or %NULL to remove current placeholder text.
+ *
+ * Sets a text string to be displayed when @entry is empty and unfocused.
+ * This can be provided to give a visual hint of the expected contents
+ * of the #GtkEntry.
+ *
+ * Since: maemo 5
+ **/
+void
+hildon_gtk_entry_set_placeholder_text (GtkEntry    *entry,
+                                       const gchar *placeholder_text)
+{
+  GtkEntryPrivate *priv;
 
+  g_return_if_fail (GTK_IS_ENTRY (entry));
+
+  priv = GTK_ENTRY_GET_PRIVATE (entry);
+
+  if (priv->placeholder_text)
+    {
+      g_free (priv->placeholder_text);
+      g_object_unref (priv->placeholder_layout);
+    }
+
+  if (placeholder_text)
+    {
+      priv->placeholder_text = g_strdup (placeholder_text);
+      priv->placeholder_layout = gtk_entry_create_placeholder_layout (entry);
+    }
+  else
+    {
+      priv->placeholder_text = NULL;
+      priv->placeholder_layout = NULL;
+    }
+
+  if (show_placeholder (entry))
+    {
+      gtk_widget_queue_draw (GTK_WIDGET (entry));
+    }
+
+  g_object_notify (G_OBJECT (entry), "hildon-placeholder-text");
+}
+
+/**
+ * hildon_gtk_entry_get_placeholder_text:
+ * @entry: a #GtkEntry
+ *
+ * Gets the text to be displayed if @entry is empty and unfocused.
+ *
+ * Returns: a string or %NULL if no placeholder text is set
+ *
+ * Since: maemo 5
+ **/
+const gchar *
+hildon_gtk_entry_get_placeholder_text (GtkEntry *entry)
+{
+  GtkEntryPrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_ENTRY (entry), NULL);
+
+  priv = GTK_ENTRY_GET_PRIVATE (entry);
+
+  return priv->placeholder_text;
+}
+
 void
 hildon_gtk_entry_set_input_mode (GtkEntry           *entry,
                                  HildonGtkInputMode  mode)

Modified: projects/haf/trunk/gtk+/gtk/gtkentry.h
===================================================================
--- projects/haf/trunk/gtk+/gtk/gtkentry.h	2009-07-29 16:44:00 UTC (rev 19009)
+++ projects/haf/trunk/gtk+/gtk/gtkentry.h	2009-07-31 08:51:03 UTC (rev 19010)
@@ -249,6 +249,11 @@
 #endif /* GTK_DISABLE_DEPRECATED */
 
 #ifdef MAEMO_CHANGES
+const gchar *      hildon_gtk_entry_get_placeholder_text (GtkEntry *entry);
+
+void               hildon_gtk_entry_set_placeholder_text (GtkEntry    *entry,
+                                                          const gchar *placeholder_text);
+
 void               hildon_gtk_entry_set_input_mode (GtkEntry          *entry,
                                                     HildonGtkInputMode input_mode);
 HildonGtkInputMode hildon_gtk_entry_get_input_mode (GtkEntry          *entry);

More information about the maemo-commits mailing list