summaryrefslogtreecommitdiff
path: root/gtk/gtkentry.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtkentry.c')
-rw-r--r--gtk/gtkentry.c151
1 files changed, 101 insertions, 50 deletions
diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c
index d54f618eda..19dffce030 100644
--- a/gtk/gtkentry.c
+++ b/gtk/gtkentry.c
@@ -26,6 +26,7 @@
#include "gtkmain.h"
#include "gtkselection.h"
#include "gtksignal.h"
+#include "gtkprivate.h"
#define MIN_ENTRY_WIDTH 150
#define DRAW_TIMEOUT 20
@@ -861,7 +862,6 @@ gtk_entry_key_press (GtkWidget *widget,
gint return_val;
gint key;
guint initial_pos;
- guint tmp_pos;
gint extend_selection;
gint extend_start;
@@ -995,6 +995,8 @@ gtk_entry_key_press (GtkWidget *widget,
}
if (event->length > 0)
{
+ gint tmp_pos;
+
extend_selection = FALSE;
gtk_editable_delete_selection (editable);
@@ -1508,7 +1510,7 @@ gtk_entry_update_text (GtkEditable *editable,
gtk_entry_queue_draw (GTK_ENTRY(editable));
}
-gchar *
+static gchar *
gtk_entry_get_chars (GtkEditable *editable,
gint start_pos,
gint end_pos)
@@ -1551,13 +1553,21 @@ gtk_move_forward_character (GtkEntry *entry)
GtkEditable *editable;
editable = GTK_EDITABLE (entry);
- if (editable->current_pos < entry->text_length)
+ if (gtk_use_mb)
+ {
+ if (editable->current_pos < entry->text_length)
+ {
+ len = mblen (entry->text+editable->current_pos, MB_CUR_MAX);
+ editable->current_pos += (len>0)? len:1;
+ }
+ if (editable->current_pos > entry->text_length)
+ editable->current_pos = entry->text_length;
+ }
+ else
{
- len = mblen (entry->text+editable->current_pos, MB_CUR_MAX);
- editable->current_pos += (len>0)? len:1;
+ if (editable->current_pos < entry->text_length)
+ editable->current_pos ++;
}
- if (editable->current_pos > entry->text_length)
- editable->current_pos = entry->text_length;
}
static gint
@@ -1583,11 +1593,14 @@ gtk_move_backward_character (GtkEntry *entry)
GtkEditable *editable;
editable = GTK_EDITABLE (entry);
- /* this routine is correct only if string is state-independent-encoded */
-
if (0 < editable->current_pos)
- editable->current_pos = move_backward_character (entry->text,
- editable->current_pos);
+ {
+ if (gtk_use_mb)
+ editable->current_pos = move_backward_character (entry->text,
+ editable->current_pos);
+ else
+ editable->current_pos--;
+ }
}
static void
@@ -1605,26 +1618,46 @@ gtk_move_forward_word (GtkEntry *entry)
{
text = entry->text;
i = editable->current_pos;
-
- len = mbtowc (&c, text+i, MB_CUR_MAX);
- if (!iswalnum(c))
- for (; i < entry->text_length; i+=len)
- {
- len = mbtowc (&c, text+i, MB_CUR_MAX);
- if (len < 1 || iswalnum(c))
- break;
- }
-
- for (; i < entry->text_length; i+=len)
+
+ if (gtk_use_mb)
{
len = mbtowc (&c, text+i, MB_CUR_MAX);
- if (len < 1 || !iswalnum(c))
- break;
+ if (!iswalnum(c))
+ for (; i < entry->text_length; i+=len)
+ {
+ len = mbtowc (&c, text+i, MB_CUR_MAX);
+ if (len < 1 || iswalnum(c))
+ break;
+ }
+
+ for (; i < entry->text_length; i+=len)
+ {
+ len = mbtowc (&c, text+i, MB_CUR_MAX);
+ if (len < 1 || !iswalnum(c))
+ break;
+ }
+
+ editable->current_pos = i;
+ if (editable->current_pos > entry->text_length)
+ editable->current_pos = entry->text_length;
}
+ else
+ {
+ if (!isalnum (text[i]))
+ for (; i < entry->text_length; i++)
+ {
+ if (isalnum(text[i]))
+ break;
+ }
+
+ for (; i < entry->text_length; i++)
+ {
+ if (!isalnum(text[i]))
+ break;
+ }
- editable->current_pos = i;
- if (editable->current_pos > entry->text_length)
- editable->current_pos = entry->text_length;
+ editable->current_pos = i;
+ }
}
}
@@ -1639,39 +1672,57 @@ gtk_move_backward_word (GtkEntry *entry)
GtkEditable *editable;
editable = GTK_EDITABLE (entry);
- if (entry->text)
+ if (entry->text && editable->current_pos > 0)
{
text = entry->text;
- i=move_backward_character(text, editable->current_pos);
- if (i < 0) /* Per */
- {
- editable->selection_start_pos = 0;
- editable->selection_end_pos = 0;
- return;
- }
-
- len = mbtowc (&c, text+i, MB_CUR_MAX);
- if (!iswalnum(c))
- for (; i >= 0; i=move_backward_character(text, i))
- {
- len = mbtowc (&c, text+i, MB_CUR_MAX);
- if (iswalnum(c))
- break;
- }
- for (; i >= 0; i=move_backward_character(text, i))
+ if (gtk_use_mb)
{
+ i=move_backward_character(text, editable->current_pos);
+
len = mbtowc (&c, text+i, MB_CUR_MAX);
if (!iswalnum(c))
+ for (; i >= 0; i=move_backward_character(text, i))
+ {
+ len = mbtowc (&c, text+i, MB_CUR_MAX);
+ if (iswalnum(c))
+ break;
+ }
+
+ for (; i >= 0; i=move_backward_character(text, i))
{
- i += len;
- break;
+ len = mbtowc (&c, text+i, MB_CUR_MAX);
+ if (!iswalnum(c))
+ {
+ i += len;
+ break;
+ }
}
}
-
+ else
+ {
+ i = editable->current_pos - 1;
+
+ if (!isalnum(text[i]))
+ for (; i >= 0; i--)
+ {
+ if (isalnum(text[i]))
+ break;
+ }
+
+ for (; i >= 0; i--)
+ {
+ if (!isalnum(text[i]))
+ {
+ i++;
+ break;
+ }
+ }
+ }
+
if (i < 0)
- i = 0;
-
+ i = 0;
+
editable->current_pos = i;
}
}