[maemo-commits] [maemo-commits] r19011 - in projects/haf/trunk/gtk+: . gtk
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Fri Jul 31 12:03:52 EEST 2009
- Previous message: [maemo-commits] r19010 - in projects/haf/trunk/gtk+: . gtk
- Next message: [maemo-commits] r19012 - in projects/haf/trunk/hildon-input-method-plugins-example: . src
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Author: mitch Date: 2009-07-31 12:03:46 +0300 (Fri, 31 Jul 2009) New Revision: 19011 Modified: projects/haf/trunk/gtk+/ChangeLog projects/haf/trunk/gtk+/gtk/gtk.symbols projects/haf/trunk/gtk+/gtk/gtktextview.c projects/haf/trunk/gtk+/gtk/gtktextview.h Log: 2009-07-31 Michael Natterer <mitch at lanedo.com> Fixes: NB#122395 - hildon_entry_set_placeholder() should be in GtkEntry * gtk/gtktextview.[ch] * gtk/gtk.symbols: applied patch from Kristian Rietveld which adds the same placeholder API as for GtkEntry in the patch below. Modified: projects/haf/trunk/gtk+/ChangeLog =================================================================== --- projects/haf/trunk/gtk+/ChangeLog 2009-07-31 08:51:03 UTC (rev 19010) +++ projects/haf/trunk/gtk+/ChangeLog 2009-07-31 09:03:46 UTC (rev 19011) @@ -1,3 +1,12 @@ +2009-07-31 Michael Natterer <mitch at lanedo.com> + + Fixes: NB#122395 - hildon_entry_set_placeholder() should be in + GtkEntry + + * gtk/gtktextview.[ch] + * gtk/gtk.symbols: applied patch from Kristian Rietveld which adds + the same placeholder API as for GtkEntry in the patch below. + 2009-07-31 Michael Natterer <mitch at lando.com> Addresses: NB#122395 - hildon_entry_set_placeholder() should be in Modified: projects/haf/trunk/gtk+/gtk/gtk.symbols =================================================================== --- projects/haf/trunk/gtk+/gtk/gtk.symbols 2009-07-31 08:51:03 UTC (rev 19010) +++ projects/haf/trunk/gtk+/gtk/gtk.symbols 2009-07-31 09:03:46 UTC (rev 19011) @@ -4082,8 +4082,10 @@ #ifdef MAEMO_CHANGES hildon_gtk_text_view_get_input_default hildon_gtk_text_view_get_input_mode +hildon_gtk_text_view_get_placeholder_text hildon_gtk_text_view_set_input_default hildon_gtk_text_view_set_input_mode +hildon_gtk_text_view_set_placeholder_text #endif #endif #endif Modified: projects/haf/trunk/gtk+/gtk/gtktextview.c =================================================================== --- projects/haf/trunk/gtk+/gtk/gtktextview.c 2009-07-31 08:51:03 UTC (rev 19010) +++ projects/haf/trunk/gtk+/gtk/gtktextview.c 2009-07-31 09:03:46 UTC (rev 19011) @@ -108,6 +108,11 @@ { guint blink_time; /* time in msec the cursor has blinked since last user event */ guint im_spot_idle; + +#ifdef MAEMO_CHANGES + GtkTextBuffer *placeholder_buffer; + GtkTextLayout *placeholder_layout; +#endif /* MAEMO_CHANGES */ }; @@ -160,6 +165,7 @@ #ifdef MAEMO_CHANGES , PROP_HILDON_INPUT_MODE , PROP_HILDON_INPUT_DEFAULT + , PROP_HILDON_PLACEHOLDER_TEXT #endif /* MAEMO_CHANGES */ }; @@ -710,6 +716,22 @@ HILDON_TYPE_GTK_INPUT_MODE, HILDON_GTK_INPUT_MODE_FULL, GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + + /** + * GtkTextView:hildon-placeholder-text: + * + * Text to be displayed in the #GtkTextView when it is empty and + * unfocused. + * + * 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 text view is empty and unfocused"), + "", + G_PARAM_READWRITE)); #endif /* MAEMO_CHANGES */ /* @@ -1256,6 +1278,9 @@ { GtkWidget *widget = GTK_WIDGET (text_view); GtkTargetList *target_list; +#ifdef MAEMO_CHANGES + GtkTextViewPrivate *priv = GTK_TEXT_VIEW_GET_PRIVATE (text_view); +#endif GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS); @@ -1313,6 +1338,11 @@ text_view->pending_place_cursor_button = 0; +#ifdef MAEMO_CHANGES + priv->placeholder_buffer = NULL; + priv->placeholder_layout = NULL; +#endif /* MAEMO_CHANGES */ + /* We handle all our own redrawing */ gtk_widget_set_redraw_on_allocate (widget, FALSE); } @@ -2872,6 +2902,9 @@ gtk_text_view_finalize (GObject *object) { GtkTextView *text_view; +#ifdef MAEMO_CHANGES + GtkTextViewPrivate *priv; +#endif /* MAEMO_CHANGES */ text_view = GTK_TEXT_VIEW (object); @@ -2879,6 +2912,22 @@ gtk_text_view_destroy_layout (text_view); gtk_text_view_set_buffer (text_view, NULL); + +#ifdef MAEMO_CHANGES + priv = GTK_TEXT_VIEW_GET_PRIVATE (text_view); + + if (priv->placeholder_layout) + { + g_object_unref (priv->placeholder_layout); + priv->placeholder_layout = NULL; + } + + if (priv->placeholder_buffer) + { + g_object_unref (priv->placeholder_buffer); + priv->placeholder_buffer = NULL; + } +#endif /* MAEMO_CHANGES */ cancel_pending_scroll (text_view); @@ -2985,6 +3034,10 @@ case PROP_HILDON_INPUT_DEFAULT: hildon_gtk_text_view_set_input_default (text_view, g_value_get_flags (value)); break; + + case PROP_HILDON_PLACEHOLDER_TEXT: + hildon_gtk_text_view_set_placeholder_text (text_view, g_value_get_string (value)); + break; #endif /* MAEMO_CHANGES */ default: @@ -3069,6 +3122,10 @@ case PROP_HILDON_INPUT_DEFAULT: g_value_set_flags (value, hildon_gtk_text_view_get_input_default (text_view)); break; + + case PROP_HILDON_PLACEHOLDER_TEXT: + g_value_take_string (value, hildon_gtk_text_view_get_placeholder_text (text_view)); + break; #endif /* MAEMO_CHANGES */ default: @@ -3922,6 +3979,9 @@ GtkStyle *previous_style) { GtkTextView *text_view = GTK_TEXT_VIEW (widget); +#ifdef MAEMO_CHANGES + GtkTextViewPrivate *priv = GTK_TEXT_VIEW_GET_PRIVATE (text_view); +#endif /* MAEMO_CHANGES */ PangoContext *ltr_context, *rtl_context; if (GTK_WIDGET_REALIZED (widget)) @@ -3946,6 +4006,40 @@ g_object_unref (ltr_context); g_object_unref (rtl_context); } + +#ifdef MAEMO_CHANGES + /* FIXME: Of course, when coded properly this and the above would be + * factored out in a function and shared. + */ + if (priv->placeholder_layout && previous_style) + { + GdkColor font_color; + + gtk_text_view_set_attributes_from_style (text_view, + priv->placeholder_layout->default_style, + widget->style); + + + /* Override the color setting */ + if (gtk_style_lookup_color (widget->style, "ReversedSecondaryTextColor", + &font_color)) + { + priv->placeholder_layout->default_style->appearance.fg_color = font_color; + } + + + ltr_context = gtk_widget_create_pango_context (widget); + pango_context_set_base_dir (ltr_context, PANGO_DIRECTION_LTR); + rtl_context = gtk_widget_create_pango_context (widget); + pango_context_set_base_dir (rtl_context, PANGO_DIRECTION_RTL); + + gtk_text_layout_set_contexts (priv->placeholder_layout, + ltr_context, rtl_context); + + g_object_unref (ltr_context); + g_object_unref (rtl_context); + } +#endif /* MAEMO_CHANGES */ } static void @@ -4574,6 +4668,7 @@ GdkRegion *updates; #ifdef MAEMO_CHANGES gboolean custom_background = FALSE; + GtkTextViewPrivate *priv = GTK_TEXT_VIEW_GET_PRIVATE (widget); #endif text_view = GTK_TEXT_VIEW (widget); @@ -4636,6 +4731,30 @@ #endif child_exposes = NULL; +#ifdef MAEMO_CHANGES + if (!GTK_WIDGET_HAS_FOCUS (text_view) + && priv->placeholder_layout + && gtk_text_buffer_get_char_count (get_buffer (text_view)) == 0) + gtk_text_layout_draw (priv->placeholder_layout, + widget, + text_view->text_window->bin_window, + NULL, + text_view->xoffset, + text_view->yoffset, + area->x, area->y, + area->width, area->height, + &child_exposes); + else + gtk_text_layout_draw (text_view->layout, + widget, + text_view->text_window->bin_window, + NULL, + text_view->xoffset, + text_view->yoffset, + area->x, area->y, + area->width, area->height, + &child_exposes); +#else /* !MAEMO_CHANGES */ gtk_text_layout_draw (text_view->layout, widget, text_view->text_window->bin_window, @@ -4645,6 +4764,7 @@ area->x, area->y, area->width, area->height, &child_exposes); +#endif /* !MAEMO_CHANGES */ tmp_list = child_exposes; while (tmp_list != NULL) @@ -9346,6 +9466,156 @@ return mode; } + +/* This is more or less a stripped down version of + * gtk_text_view_ensure_layout(). + */ +static void +gtk_text_view_ensure_placeholder_layout (GtkTextView *text_view) +{ + GtkTextViewPrivate *priv; + + priv = GTK_TEXT_VIEW_GET_PRIVATE (text_view); + + if (priv->placeholder_layout == NULL) + { + GdkColor font_color; + GtkTextAttributes *style; + PangoContext *ltr_context, *rtl_context; + GtkWidget *widget = GTK_WIDGET (text_view); + + priv->placeholder_layout = gtk_text_layout_new (); + gtk_text_layout_set_buffer (priv->placeholder_layout, + priv->placeholder_buffer); + + gtk_text_layout_set_cursor_visible (priv->placeholder_layout, + FALSE); + + ltr_context = gtk_widget_create_pango_context (GTK_WIDGET (text_view)); + pango_context_set_base_dir (ltr_context, PANGO_DIRECTION_LTR); + rtl_context = gtk_widget_create_pango_context (GTK_WIDGET (text_view)); + pango_context_set_base_dir (rtl_context, PANGO_DIRECTION_RTL); + + gtk_text_layout_set_contexts (priv->placeholder_layout, + ltr_context, rtl_context); + + g_object_unref (ltr_context); + g_object_unref (rtl_context); + + + style = gtk_text_attributes_new (); + + gtk_widget_ensure_style (widget); + gtk_text_view_set_attributes_from_style (text_view, + style, widget->style); + + /* Override the color setting */ + if (gtk_style_lookup_color (widget->style, "ReversedSecondaryTextColor", + &font_color)) + { + style->appearance.fg_color = font_color; + } + + style->pixels_above_lines = text_view->pixels_above_lines; + style->pixels_below_lines = text_view->pixels_below_lines; + style->pixels_inside_wrap = text_view->pixels_inside_wrap; + style->left_margin = text_view->left_margin; + style->right_margin = text_view->right_margin; + style->indent = text_view->indent; + style->tabs = text_view->tabs ? pango_tab_array_copy (text_view->tabs) : NULL; + + style->wrap_mode = text_view->wrap_mode; + style->justification = text_view->justify; + style->direction = gtk_widget_get_direction (GTK_WIDGET (text_view)); + + gtk_text_layout_set_default_style (priv->placeholder_layout, style); + + gtk_text_attributes_unref (style); + } + + /* Now make sure the layout is validated. Since we expect the + * placeholder to only be a single line, this should be quick. + */ + gtk_text_layout_validate (priv->placeholder_layout, 100); +} + +/** + * hildon_gtk_text_view_set_placeholder_text: + * @text_view: a #GtkTextView. + * @placeholder_text: a string to be displayed when @text_view 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_text_view_set_placeholder_text (GtkTextView *text_view, + const gchar *placeholder_text) +{ + GtkTextViewPrivate *priv; + + g_return_if_fail (GTK_IS_TEXT_VIEW (text_view)); + + priv = GTK_TEXT_VIEW_GET_PRIVATE (text_view); + + if (!priv->placeholder_buffer) + priv->placeholder_buffer = gtk_text_buffer_new (NULL); + + if (placeholder_text) + { + gtk_text_buffer_set_text (priv->placeholder_buffer, placeholder_text, -1); + gtk_text_view_ensure_placeholder_layout (text_view); + } + else + { + g_object_unref (priv->placeholder_layout); + priv->placeholder_layout = NULL; + + g_object_unref (priv->placeholder_buffer); + priv->placeholder_buffer = NULL; + } + + if (gtk_text_buffer_get_char_count (get_buffer (text_view)) == 0 + && !GTK_WIDGET_HAS_FOCUS (text_view)) + gtk_widget_queue_draw (GTK_WIDGET (text_view)); + + g_object_notify (G_OBJECT (text_view), "hildon-placeholder-text"); +} + +/** + * hildon_gtk_text_view_get_placeholder_text: + * @text_view: a #GtkTextView + * + * Gets the text to be displayed if @text_view is empty and unfocused. + * The returned string must be freed using g_free(). + * + * Returns: an allocated string or %NULL if no placeholder text is set. + * + * Since: maemo 5. + */ +gchar * +hildon_gtk_text_view_get_placeholder_text (GtkTextView *text_view) +{ + GtkTextViewPrivate *priv; + GtkTextIter start, end; + gchar *text; + + g_return_val_if_fail (GTK_IS_TEXT_VIEW (text_view), NULL); + + priv = GTK_TEXT_VIEW_GET_PRIVATE (text_view); + + gtk_text_buffer_get_start_iter (priv->placeholder_buffer, &start); + gtk_text_buffer_get_end_iter (priv->placeholder_buffer, &end); + + text = gtk_text_buffer_get_text (priv->placeholder_buffer, + &start, &end, FALSE); + + return text; +} + #endif /* MAEMO_CHANGES */ #define __GTK_TEXT_VIEW_C__ Modified: projects/haf/trunk/gtk+/gtk/gtktextview.h =================================================================== --- projects/haf/trunk/gtk+/gtk/gtktextview.h 2009-07-31 08:51:03 UTC (rev 19010) +++ projects/haf/trunk/gtk+/gtk/gtktextview.h 2009-07-31 09:03:46 UTC (rev 19011) @@ -372,6 +372,10 @@ void hildon_gtk_text_view_set_input_default (GtkTextView *text_view, HildonGtkInputMode mode); HildonGtkInputMode hildon_gtk_text_view_get_input_default (GtkTextView *text_view); + +void hildon_gtk_text_view_set_placeholder_text (GtkTextView *text_view, + const gchar *text); +gchar *hildon_gtk_text_view_get_placeholder_text (GtkTextView *text_view); #endif /* MAEMO_CHANGES */ G_END_DECLS
- Previous message: [maemo-commits] r19010 - in projects/haf/trunk/gtk+: . gtk
- Next message: [maemo-commits] r19012 - in projects/haf/trunk/hildon-input-method-plugins-example: . src
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]