summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2004-03-01 03:30:27 +0000
committerOwen Taylor <otaylor@src.gnome.org>2004-03-01 03:30:27 +0000
commit4ea9813d23e5454d7b301b33433ab8db457438cd (patch)
treeabe1ceeacc16e730137c4bbc1476414aec1c20e9
parent8451e4f843d8e56a0b02e820002aec49d91ddc47 (diff)
downloadgtk+-4ea9813d23e5454d7b301b33433ab8db457438cd.tar.gz
Add gtk_entry_set_alignment() to allow right-aligned entries and a
Sun Feb 29 22:01:49 2004 Owen Taylor <otaylor@redhat.com> * gtk/gtkentry.[ch]: Add gtk_entry_set_alignment() to allow right-aligned entries and a "xalign" property. (#59799, patch from Egon Andersen and Steffen Gutmann) * gtk/gtkmisc.c (gtk_misc_class_init): Use improved xalign property description here too. * tests/testtext.c: UNDERLINE_ERROR test addition from Nicolas Settons' patch.
-rw-r--r--ChangeLog13
-rw-r--r--ChangeLog.pre-2-1013
-rw-r--r--ChangeLog.pre-2-413
-rw-r--r--ChangeLog.pre-2-613
-rw-r--r--ChangeLog.pre-2-813
-rw-r--r--docs/reference/ChangeLog8
-rw-r--r--docs/reference/gtk/gtk-sections.txt2
-rw-r--r--gtk/gtkentry.c106
-rw-r--r--gtk/gtkentry.h3
-rw-r--r--gtk/gtkmisc.c2
-rw-r--r--tests/testtext.c9
11 files changed, 188 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 4e73b4271e..cb3fc0430e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+Sun Feb 29 22:01:49 2004 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkentry.[ch]: Add gtk_entry_set_alignment()
+ to allow right-aligned entries and a "xalign"
+ property. (#59799, patch from Egon Andersen and
+ Steffen Gutmann)
+
+ * gtk/gtkmisc.c (gtk_misc_class_init): Use improved
+ xalign property description here too.
+
+ * tests/testtext.c: UNDERLINE_ERROR test addition
+ from Nicolas Settons' patch.
+
Sun Feb 29 20:34:06 2004 Owen Taylor <otaylor@redhat.com>
* gtk/gtkwindow.[ch] gtk/gtkmenushellx.c: export
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index 4e73b4271e..cb3fc0430e 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,16 @@
+Sun Feb 29 22:01:49 2004 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkentry.[ch]: Add gtk_entry_set_alignment()
+ to allow right-aligned entries and a "xalign"
+ property. (#59799, patch from Egon Andersen and
+ Steffen Gutmann)
+
+ * gtk/gtkmisc.c (gtk_misc_class_init): Use improved
+ xalign property description here too.
+
+ * tests/testtext.c: UNDERLINE_ERROR test addition
+ from Nicolas Settons' patch.
+
Sun Feb 29 20:34:06 2004 Owen Taylor <otaylor@redhat.com>
* gtk/gtkwindow.[ch] gtk/gtkmenushellx.c: export
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index 4e73b4271e..cb3fc0430e 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,3 +1,16 @@
+Sun Feb 29 22:01:49 2004 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkentry.[ch]: Add gtk_entry_set_alignment()
+ to allow right-aligned entries and a "xalign"
+ property. (#59799, patch from Egon Andersen and
+ Steffen Gutmann)
+
+ * gtk/gtkmisc.c (gtk_misc_class_init): Use improved
+ xalign property description here too.
+
+ * tests/testtext.c: UNDERLINE_ERROR test addition
+ from Nicolas Settons' patch.
+
Sun Feb 29 20:34:06 2004 Owen Taylor <otaylor@redhat.com>
* gtk/gtkwindow.[ch] gtk/gtkmenushellx.c: export
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index 4e73b4271e..cb3fc0430e 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,3 +1,16 @@
+Sun Feb 29 22:01:49 2004 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkentry.[ch]: Add gtk_entry_set_alignment()
+ to allow right-aligned entries and a "xalign"
+ property. (#59799, patch from Egon Andersen and
+ Steffen Gutmann)
+
+ * gtk/gtkmisc.c (gtk_misc_class_init): Use improved
+ xalign property description here too.
+
+ * tests/testtext.c: UNDERLINE_ERROR test addition
+ from Nicolas Settons' patch.
+
Sun Feb 29 20:34:06 2004 Owen Taylor <otaylor@redhat.com>
* gtk/gtkwindow.[ch] gtk/gtkmenushellx.c: export
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index 4e73b4271e..cb3fc0430e 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,16 @@
+Sun Feb 29 22:01:49 2004 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkentry.[ch]: Add gtk_entry_set_alignment()
+ to allow right-aligned entries and a "xalign"
+ property. (#59799, patch from Egon Andersen and
+ Steffen Gutmann)
+
+ * gtk/gtkmisc.c (gtk_misc_class_init): Use improved
+ xalign property description here too.
+
+ * tests/testtext.c: UNDERLINE_ERROR test addition
+ from Nicolas Settons' patch.
+
Sun Feb 29 20:34:06 2004 Owen Taylor <otaylor@redhat.com>
* gtk/gtkwindow.[ch] gtk/gtkmenushellx.c: export
diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog
index 759a6df05a..623ba6fceb 100644
--- a/docs/reference/ChangeLog
+++ b/docs/reference/ChangeLog
@@ -1,3 +1,11 @@
+Sun Feb 29 22:04:43 2004 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtk-sections.txt: Add gtk_entry_get_alignment
+
+Sun Feb 29 20:32:18 2004 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtk-sections.txt: Add gtk_window_mnemonic_activate
+
Sat Feb 28 01:14:23 2004 Matthias Clasen <maclas@gmx.de>
* gtk/migrating-GtkComboBox.sgml: New chapter.
diff --git a/docs/reference/gtk/gtk-sections.txt b/docs/reference/gtk/gtk-sections.txt
index 55932c0409..597620d8b1 100644
--- a/docs/reference/gtk/gtk-sections.txt
+++ b/docs/reference/gtk/gtk-sections.txt
@@ -1006,6 +1006,8 @@ gtk_entry_set_activates_default
gtk_entry_set_has_frame
gtk_entry_set_width_chars
gtk_entry_get_invisible_char
+gtk_entry_set_alignment
+gtk_entry_get_alignment
gtk_entry_get_layout
gtk_entry_get_layout_offsets
gtk_entry_get_max_length
diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c
index dbdbaf86dd..e9cf61144e 100644
--- a/gtk/gtkentry.c
+++ b/gtk/gtkentry.c
@@ -65,6 +65,15 @@
/* Maximum size of text buffer, in bytes */
#define MAX_SIZE G_MAXUSHORT
+typedef struct _GtkEntryPrivate GtkEntryPrivate;
+
+#define GTK_ENTRY_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_ENTRY, GtkEntryPrivate))
+
+struct _GtkEntryPrivate
+{
+ gfloat xalign;
+};
+
enum {
ACTIVATE,
POPULATE_POPUP,
@@ -90,7 +99,8 @@ enum {
PROP_ACTIVATES_DEFAULT,
PROP_WIDTH_CHARS,
PROP_SCROLL_OFFSET,
- PROP_TEXT
+ PROP_TEXT,
+ PROP_XALIGN
};
static guint signals[LAST_SIGNAL] = { 0 };
@@ -535,6 +545,16 @@ gtk_entry_class_init (GtkEntryClass *class)
P_("The contents of the entry"),
"",
G_PARAM_READABLE | G_PARAM_WRITABLE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_XALIGN,
+ g_param_spec_float ("xalign",
+ P_("X align"),
+ P_("The horizontal alignment, from 0 (left) to 1 (right). Reversed for RTL layouts"),
+ 0.0,
+ 1.0,
+ 0.0,
+ G_PARAM_READABLE | G_PARAM_WRITABLE));
signals[POPULATE_POPUP] =
g_signal_new ("populate_popup",
@@ -767,6 +787,8 @@ gtk_entry_class_init (GtkEntryClass *class)
P_("Whether to select the contents of an entry when it is focused"),
TRUE,
G_PARAM_READWRITE));
+
+ g_type_class_add_private (gobject_class, sizeof (GtkEntryPrivate));
}
static void
@@ -842,6 +864,10 @@ gtk_entry_set_property (GObject *object,
gtk_entry_set_text (entry, g_value_get_string (value));
break;
+ case PROP_XALIGN:
+ gtk_entry_set_alignment (entry, g_value_get_float (value));
+ break;
+
case PROP_SCROLL_OFFSET:
case PROP_CURSOR_POSITION:
default:
@@ -893,6 +919,9 @@ gtk_entry_get_property (GObject *object,
case PROP_TEXT:
g_value_set_string (value, gtk_entry_get_text (entry));
break;
+ case PROP_XALIGN:
+ g_value_set_float (value, gtk_entry_get_alignment (entry));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -903,6 +932,8 @@ gtk_entry_get_property (GObject *object,
static void
gtk_entry_init (GtkEntry *entry)
{
+ GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry);
+
GTK_WIDGET_SET_FLAGS (entry, GTK_CAN_FOCUS);
entry->text_size = MIN_SIZE;
@@ -917,6 +948,7 @@ gtk_entry_init (GtkEntry *entry)
entry->is_cell_renderer = FALSE;
entry->editing_canceled = FALSE;
entry->has_frame = TRUE;
+ priv->xalign = 0.0;
gtk_drag_dest_set (GTK_WIDGET (entry),
GTK_DEST_DEFAULT_HIGHLIGHT,
@@ -3016,10 +3048,12 @@ gtk_entry_get_cursor_locations (GtkEntry *entry,
static void
gtk_entry_adjust_scroll (GtkEntry *entry)
{
+ GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry);
gint min_offset, max_offset;
- gint text_area_width;
+ gint text_area_width, text_width;
gint strong_x, weak_x;
gint strong_xoffset, weak_xoffset;
+ gfloat xalign;
PangoLayout *layout;
PangoLayoutLine *line;
PangoRectangle logical_rect;
@@ -3038,14 +3072,21 @@ gtk_entry_adjust_scroll (GtkEntry *entry)
/* Display as much text as we can */
if (gtk_widget_get_direction (GTK_WIDGET (entry)) == GTK_TEXT_DIR_LTR)
+ xalign = priv->xalign;
+ else
+ xalign = 1.0 - priv->xalign;
+
+ text_width = PANGO_PIXELS(logical_rect.width);
+
+ if (text_width > text_area_width)
{
min_offset = 0;
- max_offset = MAX (min_offset, logical_rect.width / PANGO_SCALE - text_area_width);
+ max_offset = text_width - text_area_width;
}
else
{
- max_offset = logical_rect.width / PANGO_SCALE - text_area_width;
- min_offset = MIN (0, max_offset);
+ min_offset = (text_width - text_area_width) * xalign;
+ max_offset = min_offset;
}
entry->scroll_offset = CLAMP (entry->scroll_offset, min_offset, max_offset);
@@ -3942,6 +3983,61 @@ gtk_entry_get_layout_offsets (GtkEntry *entry,
*y += text_area_y;
}
+
+/**
+ * gtk_entry_set_alignment:
+ * @entry: a #GtkEntry
+ * @xalign: The horizontal alignment, from 0 (left) to 1 (right).
+ * Reversed for RTL layouts
+ *
+ * Sets the alignment for the contents of the entry. This controls
+ * the horizontal positioning of the contents when the displayed
+ * text is shorter than the width of the entry.
+ **/
+void
+gtk_entry_set_alignment (GtkEntry *entry, gfloat xalign)
+{
+ GtkEntryPrivate *priv;
+
+ g_return_if_fail (GTK_IS_ENTRY (entry));
+
+ priv = GTK_ENTRY_GET_PRIVATE (entry);
+
+ if (xalign < 0.0)
+ xalign = 0.0;
+ else if (xalign > 1.0)
+ xalign = 1.0;
+
+ if (xalign != priv->xalign)
+ {
+ priv->xalign = xalign;
+
+ gtk_entry_recompute (entry);
+
+ g_object_notify (G_OBJECT (entry), "xalign");
+ }
+}
+
+/**
+ * gtk_entry_get_alignment:
+ * @entry: a #GtkEntry
+ *
+ * Gets the value set by gtk_entry_set_alignment().
+ *
+ * Return value: the alignment
+ **/
+gfloat
+gtk_entry_get_alignment (GtkEntry *entry)
+{
+ GtkEntryPrivate *priv;
+
+ g_return_val_if_fail (GTK_IS_ENTRY (entry), 0.0);
+
+ priv = GTK_ENTRY_GET_PRIVATE (entry);
+
+ return priv->xalign;
+}
+
/* Quick hack of a popup menu
*/
static void
diff --git a/gtk/gtkentry.h b/gtk/gtkentry.h
index d7b2f25478..3c06f472dc 100644
--- a/gtk/gtkentry.h
+++ b/gtk/gtkentry.h
@@ -182,6 +182,9 @@ PangoLayout* gtk_entry_get_layout (GtkEntry *entry);
void gtk_entry_get_layout_offsets (GtkEntry *entry,
gint *x,
gint *y);
+void gtk_entry_set_alignment (GtkEntry *entry,
+ gfloat xalign);
+gfloat gtk_entry_get_alignment (GtkEntry *entry);
void gtk_entry_set_completion (GtkEntry *entry,
GtkEntryCompletion *completion);
diff --git a/gtk/gtkmisc.c b/gtk/gtkmisc.c
index fd9ff5cad7..20b1f64bbf 100644
--- a/gtk/gtkmisc.c
+++ b/gtk/gtkmisc.c
@@ -96,7 +96,7 @@ gtk_misc_class_init (GtkMiscClass *class)
PROP_XALIGN,
g_param_spec_float ("xalign",
P_("X align"),
- P_("The horizontal alignment, from 0 (left) to 1 (right)"),
+ P_("The horizontal alignment, from 0 (left) to 1 (right). Reversed for RTL layouts"),
0.0,
1.0,
0.5,
diff --git a/tests/testtext.c b/tests/testtext.c
index 13eaabd42d..ef22c2b050 100644
--- a/tests/testtext.c
+++ b/tests/testtext.c
@@ -502,10 +502,12 @@ fill_example_buffer (GtkTextBuffer *buffer)
"underline", PANGO_UNDERLINE_SINGLE,
NULL);
+ tag = gtk_text_buffer_create_tag (buffer, "underline_error", NULL);
+
setup_tag (tag);
g_object_set (tag,
- "underline", PANGO_UNDERLINE_SINGLE,
+ "underline", PANGO_UNDERLINE_ERROR,
NULL);
tag = gtk_text_buffer_create_tag (buffer, "centered", NULL);
@@ -580,6 +582,11 @@ fill_example_buffer (GtkTextBuffer *buffer)
gtk_text_buffer_apply_tag_by_name (buffer, "underline", &iter, &iter2);
+ gtk_text_buffer_get_iter_at_line_offset (buffer, &iter, 1, 4);
+ gtk_text_buffer_get_iter_at_line_offset (buffer, &iter2, 1, 7);
+
+ gtk_text_buffer_apply_tag_by_name (buffer, "underline_error", &iter, &iter2);
+
gtk_text_buffer_get_iter_at_line_offset (buffer, &iter, 1, 14);
gtk_text_buffer_get_iter_at_line_offset (buffer, &iter2, 1, 24);