summaryrefslogtreecommitdiff
path: root/gtk/gtkentry.c
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@gtk.org>1998-05-22 07:07:11 +0000
committerOwen Taylor <otaylor@src.gnome.org>1998-05-22 07:07:11 +0000
commit579856439b9d4a088717d15caaa1bc6cc7d10242 (patch)
tree830d51f7895280d656fbc411db4dacaeef14dd57 /gtk/gtkentry.c
parentbf874e967e1627a21bb8f25e5db13e3f68a2f083 (diff)
downloadgdk-pixbuf-579856439b9d4a088717d15caaa1bc6cc7d10242.tar.gz
Added style_set handler.
Fri May 22 03:02:40 1998 Owen Taylor <otaylor@gtk.org> * gtk/gtkhandlebox.c: Added style_set handler. Fri May 22 02:55:57 1998 Owen Taylor <otaylor@gtk.org> [ From: Chris Lahey <clahey@umich.edu> ] * gtk/gtkeditable.c, gtk/gtkeditable.h, gtk/gtktext.c, gtk/gtkentry.c: Added get_position, and set_position functions to get and set the cursor position. * gtk/gtkeditable.c: Restored "insert_text" and "delete_text" to signal status. Make GtkText do user-controlled insertion and deletion through the Editable widget so that these signals are properly emitted. * gtk/gtkentry.c: Changed gtk_entry_set_visibility to display asterisks instead of empty space when visible = FALSE)
Diffstat (limited to 'gtk/gtkentry.c')
-rw-r--r--gtk/gtkentry.c99
1 files changed, 74 insertions, 25 deletions
diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c
index 93cf32e57..7b258ffd8 100644
--- a/gtk/gtkentry.c
+++ b/gtk/gtkentry.c
@@ -115,6 +115,8 @@ static gint gtk_entry_find_char (GtkEntry *entry,
gint position);
static gint gtk_entry_find_position (GtkEntry *entry,
gint position);
+static void gtk_entry_set_position_from_editable (GtkEditable *editable,
+ gint position);
static GtkWidgetClass *parent_class = NULL;
static GdkAtom ctext_atom = GDK_NONE;
@@ -241,6 +243,7 @@ gtk_entry_class_init (GtkEntryClass *class)
editable_class->set_selection = gtk_entry_set_selection;
editable_class->changed = (void (*)(GtkEditable *)) gtk_entry_adjust_scroll;
editable_class->activate = NULL;
+ editable_class->set_position = gtk_entry_set_position_from_editable;
}
static void
@@ -351,6 +354,13 @@ gtk_entry_set_position (GtkEntry *entry,
GTK_EDITABLE(entry)->current_pos = position;
}
+static void
+gtk_entry_set_position_from_editable (GtkEditable *editable,
+ gint position)
+{
+ gtk_entry_set_position (GTK_ENTRY (editable), position);
+}
+
void
gtk_entry_set_visibility (GtkEntry *entry,
gboolean visible)
@@ -359,6 +369,8 @@ gtk_entry_set_visibility (GtkEntry *entry,
g_return_if_fail (GTK_IS_ENTRY (entry));
entry->visible = visible;
+ gtk_entry_recompute_offsets (entry);
+ gtk_widget_queue_draw (GTK_WIDGET (entry));
}
void
@@ -1142,7 +1154,10 @@ gtk_entry_draw_text (GtkEntry *entry)
gint start_char;
gint start_pos;
gint end_pos;
+ gint end_char;
gint start_xoffset;
+ gint selection_start_char;
+ gint selection_end_char;
gint selection_start_pos;
gint selection_end_pos;
gint selection_start_xoffset;
@@ -1151,6 +1166,8 @@ gtk_entry_draw_text (GtkEntry *entry)
gint y;
GdkDrawable *drawable;
gint use_backing_pixmap;
+ gchar *stars;
+ gchar *toprint;
g_return_if_fail (entry != NULL);
g_return_if_fail (GTK_IS_ENTRY (entry));
@@ -1161,12 +1178,6 @@ gtk_entry_draw_text (GtkEntry *entry)
entry->timer = 0;
}
- if (!entry->visible)
- {
- gtk_entry_draw_cursor (entry);
- return;
- }
-
if (GTK_WIDGET_DRAWABLE (entry))
{
widget = GTK_WIDGET (entry);
@@ -1212,32 +1223,55 @@ gtk_entry_draw_text (GtkEntry *entry)
start_pos = entry->char_pos[start_char];
start_xoffset = entry->char_offset[start_char] - entry->scroll_offset;
- end_pos = gtk_entry_position (entry, entry->scroll_offset + width);
+ end_char = gtk_entry_find_position (entry, entry->scroll_offset + width);
+ end_pos = entry->char_pos[end_char];
if (end_pos < entry->text_length)
end_pos += 1;
selected_state = GTK_STATE_SELECTED;
if (!editable->has_selection)
selected_state = GTK_STATE_ACTIVE;
-
+
selection_start_pos = MIN (editable->selection_start_pos, editable->selection_end_pos);
selection_end_pos = MAX (editable->selection_start_pos, editable->selection_end_pos);
selection_start_pos = CLAMP (selection_start_pos, start_pos, end_pos);
selection_end_pos = CLAMP (selection_end_pos, start_pos, end_pos);
+ selection_start_char = gtk_entry_find_char(entry,selection_start_pos);
+ selection_end_char = gtk_entry_find_char(entry,selection_end_pos);
+
selection_start_xoffset =
- entry->char_offset[gtk_entry_find_char(entry,selection_start_pos)] -
- entry->scroll_offset;
+ entry->char_offset[selection_start_char] - entry->scroll_offset;
selection_end_xoffset =
- entry->char_offset[gtk_entry_find_char(entry,selection_end_pos)] -
- entry->scroll_offset;
+ entry->char_offset[selection_end_char] -entry->scroll_offset;
+ /* if entry->visible, print a bunch of stars. If not, print the standard text. */
+ if (entry->visible)
+ {
+ toprint = entry->text + start_pos;
+ }
+ else
+ {
+ gint i;
+
+ stars = g_malloc (end_char - start_char);
+ for (i = 0; i < end_char - start_char; i++)
+ stars[i] = '*';
+ toprint = stars;
+
+ /* Since '*' is always one byte, work in bytes */
+ start_pos = start_char;
+ selection_start_pos = selection_start_char;
+ selection_end_pos = selection_end_char;
+ end_pos = end_char;
+ }
+
if (selection_start_pos > start_pos)
gdk_draw_text (drawable, widget->style->font,
widget->style->fg_gc[GTK_STATE_NORMAL],
start_xoffset, y,
- entry->text + start_pos,
+ toprint,
selection_start_pos - start_pos);
if ((selection_end_pos >= start_pos) &&
@@ -1255,7 +1289,7 @@ gtk_entry_draw_text (GtkEntry *entry)
gdk_draw_text (drawable, widget->style->font,
widget->style->fg_gc[selected_state],
selection_start_xoffset, y,
- entry->text + selection_start_pos,
+ toprint + selection_start_pos - start_pos,
selection_end_pos - selection_start_pos);
}
@@ -1263,9 +1297,13 @@ gtk_entry_draw_text (GtkEntry *entry)
gdk_draw_text (drawable, widget->style->font,
widget->style->fg_gc[GTK_STATE_NORMAL],
selection_end_xoffset, y,
- entry->text + selection_end_pos,
+ toprint + selection_end_pos - start_pos,
end_pos - selection_end_pos);
+ /* free the space allocated for the stars if it's neccessary. */
+ if (!entry->visible)
+ g_free (toprint);
+
if (editable->editable)
gtk_entry_draw_cursor_on_drawable (entry, drawable);
@@ -1303,10 +1341,7 @@ gtk_entry_draw_cursor_on_drawable (GtkEntry *entry, GdkDrawable *drawable)
widget = GTK_WIDGET (entry);
editable = GTK_EDITABLE (entry);
- if (entry->visible)
- xoffset = entry->char_offset[gtk_entry_find_char (entry, editable->current_pos)];
- else
- xoffset = 0;
+ xoffset = entry->char_offset[gtk_entry_find_char (entry, editable->current_pos)];
xoffset -= entry->scroll_offset;
if (GTK_WIDGET_HAS_FOCUS (widget) &&
@@ -1576,9 +1611,16 @@ gtk_entry_insert_text (GtkEditable *editable,
for (i=start_char; i<end_char; i++)
{
entry->char_offset[i] = entry->char_offset[start_char] + offset;
- offset += gdk_text_width (GTK_WIDGET (entry)->style->font,
- entry->text + entry->char_pos[i],
- entry->char_pos[i+1] - entry->char_pos[i]);
+ if (entry->visible)
+ {
+ offset += gdk_text_width (GTK_WIDGET (entry)->style->font,
+ entry->text + entry->char_pos[i],
+ entry->char_pos[i+1] - entry->char_pos[i]);
+ }
+ else
+ {
+ offset += gdk_text_width (GTK_WIDGET (entry)->style->font, "*", 1);
+ }
}
for (i = end_char ; i <= last_char ; i++)
entry->char_offset[i] += offset;
@@ -1601,9 +1643,16 @@ gtk_entry_recompute_offsets (GtkEntry *entry)
for (i=0; i<entry->nchars; i++)
{
entry->char_offset[i] = offset;
- offset += gdk_text_width (GTK_WIDGET (entry)->style->font,
- entry->text + entry->char_pos[i],
- entry->char_pos[i+1] - entry->char_pos[i]);
+ if (entry->visible)
+ {
+ offset += gdk_text_width (GTK_WIDGET (entry)->style->font,
+ entry->text + entry->char_pos[i],
+ entry->char_pos[i+1] - entry->char_pos[i]);
+ }
+ else
+ {
+ offset += gdk_text_width (GTK_WIDGET (entry)->style->font, "*", 1);
+ }
}
entry->char_offset[i] = offset;