diff options
author | Owen Taylor <owt1@cornell.edu> | 1998-03-17 19:03:52 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 1998-03-17 19:03:52 +0000 |
commit | 70b3b3e6e17331f34748528d71eeebec9101cde0 (patch) | |
tree | ec24fdb9dc06a5e45a2db12f4f76bcbbeb6da4cf /gtk | |
parent | a783d668f17a08fbdf88c22aa6c07b05b4e8de34 (diff) | |
download | gtk+-70b3b3e6e17331f34748528d71eeebec9101cde0.tar.gz |
Try to guess if we can use the mb* functions safely. (For glibc, they do
Tue Mar 17 01:55:00 1998 Owen Taylor <owt1@cornell.edu>
* gtk/gtkmain.c gtk/gtkentry.c: Try to guess if we can
use the mb* functions safely. (For glibc, they do
UTF-8). Heuristic is (X_LOCALE && locale != C/POSIX)
|| (mblen("\xc0", MB_CUR_MAX) == 1).
(From: "Richard Lloyd" <rkl@csc.liv.ac.uk>)
* gdk/gdk.c (gdk_ic_get_attr): Use an intermediate
variable to avoid taking the address of the result
of va_arg.
* gtk/gtkentry.c gtk/gtkeditable.c gtkobject.c
gtk/testselection.c: signedness fixups
* gtk/gtkcontainer.c: Fixed implicit cast between
gpointer and func pointer by changing.
* gtk/gtkcombo.c, gtk/gtkentry.c, gtk/gtktext.c:
static void forward declaration vs. void actual fixed
* gtk/testgtk.c: Limit total number of tree items to 10,000
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkcombo.c | 4 | ||||
-rw-r--r-- | gtk/gtkcontainer.c | 2 | ||||
-rw-r--r-- | gtk/gtkdebug.h | 3 | ||||
-rw-r--r-- | gtk/gtkeditable.c | 5 | ||||
-rw-r--r-- | gtk/gtkentry.c | 151 | ||||
-rw-r--r-- | gtk/gtkmain.c | 31 | ||||
-rw-r--r-- | gtk/gtkobject.c | 2 | ||||
-rw-r--r-- | gtk/gtkprivate.h | 6 | ||||
-rw-r--r-- | gtk/gtktext.c | 2 |
9 files changed, 146 insertions, 60 deletions
diff --git a/gtk/gtkcombo.c b/gtk/gtkcombo.c index de6fb76aae..d48684a66a 100644 --- a/gtk/gtkcombo.c +++ b/gtk/gtkcombo.c @@ -71,7 +71,7 @@ static void gtk_combo_size_allocate (GtkWidget *widget, static GtkHBoxClass *parent_class = NULL; -void +static void gtk_combo_class_init (GtkComboClass * klass) { GtkObjectClass *oclass; @@ -437,7 +437,7 @@ gtk_combo_list_key_press (GtkWidget * widget, GdkEventKey * event, GtkCombo * co return FALSE; } -void +static void gtk_combo_init (GtkCombo * combo) { GtkWidget *arrow; diff --git a/gtk/gtkcontainer.c b/gtk/gtkcontainer.c index 87f78886d0..af6f96cac3 100644 --- a/gtk/gtkcontainer.c +++ b/gtk/gtkcontainer.c @@ -42,7 +42,7 @@ typedef void (*GtkContainerSignal1) (GtkObject *object, gpointer arg1, gpointer data); typedef void (*GtkContainerSignal2) (GtkObject *object, - gpointer arg1, + GtkFunction arg1, gpointer arg2, gpointer data); typedef gint (*GtkContainerSignal3) (GtkObject *object, diff --git a/gtk/gtkdebug.h b/gtk/gtkdebug.h index 3940f8f1f0..a4b8cb6d34 100644 --- a/gtk/gtkdebug.h +++ b/gtk/gtkdebug.h @@ -23,7 +23,8 @@ extern "C" { #endif /* __cplusplus */ typedef enum { - GTK_DEBUG_OBJECTS = 1<<0 + GTK_DEBUG_OBJECTS = 1<<0, + GTK_DEBUG_MISC = 1<<1 } GtkDebugFlag; #ifdef G_ENABLE_DEBUG diff --git a/gtk/gtkeditable.c b/gtk/gtkeditable.c index 8702e69fbc..15b506876d 100644 --- a/gtk/gtkeditable.c +++ b/gtk/gtkeditable.c @@ -360,7 +360,7 @@ gtk_editable_selection_handler (GtkWidget *widget, { gtk_selection_data_set (selection_data, GDK_SELECTION_TYPE_STRING, - 8*sizeof(gchar), str, length); + 8*sizeof(gchar), (guchar *)str, length); } else if (selection_data->target == text_atom || selection_data->target == ctext_atom) @@ -441,7 +441,8 @@ gtk_editable_selection_received (GtkWidget *widget, case STRING: selection_data->data[selection_data->length] = 0; gtk_editable_insert_text (editable, selection_data->data, - strlen (selection_data->data), &tmp_pos); + strlen ((gchar *)selection_data->data), + &tmp_pos); editable->current_pos = tmp_pos; break; case CTEXT: 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; } } diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index 87f2916c75..ce9ff81118 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -15,6 +15,7 @@ * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include <X11/Xlocale.h> /* so we get the right setlocale */ #include <stdio.h> #include <stdlib.h> #include "gtkbutton.h" @@ -32,6 +33,7 @@ #include "gtkwidget.h" #include "gtkwindow.h" #include "gtkprivate.h" +#include "gdk/gdki18n.h" #include "../config.h" @@ -166,11 +168,14 @@ guint gtk_debug_flags = 0; /* Global GTK debug flag */ #ifdef G_ENABLE_DEBUG static GDebugKey gtk_debug_keys[] = { - {"objects", GTK_DEBUG_OBJECTS} + {"objects", GTK_DEBUG_OBJECTS}, + {"misc", GTK_DEBUG_MISC} }; static const guint gtk_ndebug_keys = sizeof (gtk_debug_keys) / sizeof (GDebugKey); +gboolean gtk_use_mb = -1; + #endif /* G_ENABLE_DEBUG */ @@ -180,6 +185,8 @@ void gtk_init (int *argc, char ***argv) { + gchar *current_locale; + if (0) { g_set_error_handler (gtk_error); @@ -255,6 +262,28 @@ gtk_init (int *argc, #endif /* G_ENABLE_DEBUG */ + /* Check if there is a good chance the mb functions will handle things + * correctly - set if either mblen("\xc0", MB_CUR_MAX) == 1 in the + * C locale, or were using X's mb functions. (-DX_LOCALE && locale != C) + */ + + current_locale = setlocale (LC_CTYPE, NULL); + setlocale (LC_CTYPE, "C"); + +#ifdef X_LOCALE + if ((strcmp (current_locale, "C")) && (!strcmp (current_locale, "POSIX"))) + gtk_use_mb = TRUE; + else +#endif + { + gtk_use_mb = (mblen ("\xc0", MB_CUR_MAX) == 1); + } + + setlocale (LC_CTYPE, current_locale); + + GTK_NOTE (MISC, g_print("%s multi-byte string functions.\n", + gtk_use_mb ? "Using" : "Not using")); + /* Initialize the default visual and colormap to be * used in creating widgets. (We want to use the system * defaults so as to be nice to the colormap). diff --git a/gtk/gtkobject.c b/gtk/gtkobject.c index 0e853bb1eb..63e84f706b 100644 --- a/gtk/gtkobject.c +++ b/gtk/gtkobject.c @@ -348,7 +348,7 @@ gtk_object_class_add_signals (GtkObjectClass *class, g_return_if_fail (class != NULL); - new_signals = g_new (gint, class->nsignals + nsignals); + new_signals = g_new (guint, class->nsignals + nsignals); for (i = 0; i < class->nsignals; i++) new_signals[i] = class->signals[i]; for (i = 0; i < nsignals; i++) diff --git a/gtk/gtkprivate.h b/gtk/gtkprivate.h index ec4bd4d0c0..0c710ce2eb 100644 --- a/gtk/gtkprivate.h +++ b/gtk/gtkprivate.h @@ -60,7 +60,11 @@ enum #define GTK_PRIVATE_SET_FLAG(wid,flag) G_STMT_START{ (GTK_PRIVATE_FLAGS (wid) |= (PRIVATE_ ## flag)); }G_STMT_END #define GTK_PRIVATE_UNSET_FLAG(wid,flag) G_STMT_START{ (GTK_PRIVATE_FLAGS (wid) &= ~(PRIVATE_ ## flag)); }G_STMT_END - +/* True if there is a good chance the mb functions will handle things + * correctly - set if either mblen("\xc0", MB_CUR_MAX) == 1 in the + * C locale, or were using X's mb functions. (-DX_LOCALE && locale != C) + */ +extern gboolean gtk_use_mb; #ifdef __cplusplus } diff --git a/gtk/gtktext.c b/gtk/gtktext.c index 17d4d000dc..f8b4b4f97b 100644 --- a/gtk/gtktext.c +++ b/gtk/gtktext.c @@ -4546,7 +4546,7 @@ recompute_geometry (GtkText* text) /* Selection */ /**********************************************************************/ -void +static void gtk_text_set_selection (GtkEditable *editable, gint start, gint end) |