From: Jordi Albornoz Date: Wed, 8 Jan 2003 15:07:55 +0000 (+0000) Subject: Fix fields message text input so it deals with composed characters correctly (Dani). X-Git-Url: https://hydra-www.ietfng.org/gitweb/?a=commitdiff_plain;h=ea32c8833960ab69f9c398dd678d2aaf3cd92be7;p=gtetrinet Fix fields message text input so it deals with composed characters correctly (Dani). --- diff --git a/ChangeLog b/ChangeLog index 4f16b20..f7d6cd6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2003-01-08 Dani Carbonell + + * TODO: remove composed characters problem. + * src/fields.c: rewrite fields messages entry box, so it works ok + with composed characters. + * src/gtetrinet.c: acomodate fields messages changes. + * src/tetrinet.c: remove fields messages code, moved to fields.c. + 2003-01-08 Jordi Mallach * src/misc.c (nocolor): fix previous change. diff --git a/TODO b/TODO index 2eaf914..8cf8b2d 100644 --- a/TODO +++ b/TODO @@ -5,7 +5,6 @@ GTetrinet's TODO list - GNOME2 port issues: + preferences dialog (gconf) + keybindings - + problem when typing composed letters (รก) in fields messages + port deprecated widgets (-DGTK_DISABLE_DEPRECATED) + detaching and reattaching the Menu Bar causes two Bonobo-CRITICAL + if you use the C locale and input an 8bit character, gtetrinet segfaults diff --git a/src/fields.c b/src/fields.c index a2308c2..4004296 100644 --- a/src/fields.c +++ b/src/fields.c @@ -31,6 +31,7 @@ #include "tetris.h" #include "fields.h" #include "misc.h" +#include "gtetrinet.h" #define BLOCKSIZE bsize #define SMALLBLOCKSIZE (BLOCKSIZE/2) @@ -49,6 +50,7 @@ static void fields_refreshfield (int field); static void fields_drawblock (int field, int x, int y, char block); static gint fields_eatkey (GtkWidget *widget); +static void gmsginput_activate (GtkEntry *entry, gpointer data); static GdkPixmap *blockpix; @@ -311,8 +313,8 @@ GtkWidget *fields_page_contents (void) gmsginput = gtk_entry_new_with_max_length (128); gtk_widget_show (gmsginput); /* eat up key messages */ - g_signal_connect (G_OBJECT(gmsginput), "key-press-event", - GTK_SIGNAL_FUNC(fields_eatkey), NULL); + g_signal_connect (G_OBJECT(gmsginput), "activate", + GTK_SIGNAL_FUNC(gmsginput_activate), NULL); gtk_table_attach (GTK_TABLE(table2), gmsginput, 0, 1, 1, 2, GTK_FILL | GTK_EXPAND, 0, 0, 0); gtk_widget_show (table2); @@ -557,7 +559,7 @@ void fields_setactivelevel (int l) } } -void fields_gmsgadd (char *str) +void fields_gmsgadd (const char *str) { textbox_addtext (GTK_TEXT_VIEW(gmsgtext), str); adjust_bottom_text_view (GTK_TEXT_VIEW(gmsgtext)); @@ -568,7 +570,7 @@ void fields_gmsgclear (void) gtk_text_buffer_set_text(GTK_TEXT_VIEW(gmsgtext)->buffer, "", 0); } -void fields_gmsginput (int i) +void fields_gmsginput (gboolean i) { if (i) { gtk_widget_show (gmsginput); @@ -586,7 +588,10 @@ void fields_gmsginputclear (void) void fields_gmsginputactivate (int t) { if (t) + { + fields_gmsginputclear (); gtk_widget_grab_focus (gmsginput); + } else { /* do nothing */; } } @@ -600,6 +605,39 @@ void fields_gmsginputadd (char *c) g_free (utf8_c); } +void gmsginput_activate (GtkEntry *entry, gpointer data) +{ + gchar *locale_s, buf[256]; + const gchar *s; + + if (gmsgstate == 0) + { + fields_gmsginputclear (); + return; + } + s = fields_gmsginputtext (); + if (strlen(s) > 0) { + if (strncmp("/me ", s, 4) == 0) { + /* post /me thingy */ + g_snprintf (buf, sizeof(buf), "* %s %s", nick, s+4); + locale_s = g_locale_from_utf8 (buf, -1, NULL, NULL, NULL); + client_outmessage (OUT_GMSG, locale_s); + g_free (locale_s); + } + else { + /* post message */ + g_snprintf (buf, sizeof(buf), "<%s> %s", nick, s); + locale_s = g_locale_from_utf8 (buf, -1, NULL, NULL, NULL); + client_outmessage (OUT_GMSG, locale_s); + g_free (locale_s); + } + } + fields_gmsginputclear (); + fields_gmsginput (FALSE); + unblock_keyboard_signal (); + gmsgstate = 0; +} + void fields_gmsginputback (void) { char buf[256]; diff --git a/src/fields.h b/src/fields.h index 17a8a27..80f3b56 100644 --- a/src/fields.h +++ b/src/fields.h @@ -16,7 +16,7 @@ extern void fields_attdefclear (void); extern void fields_setlines (int l); extern void fields_setlevel (int l); extern void fields_setactivelevel (int l); -extern void fields_gmsgadd (char *str); +extern void fields_gmsgadd (const char *str); extern void fields_gmsgclear (void); extern void fields_gmsginput (int i); extern void fields_gmsginputclear (void); diff --git a/src/gtetrinet.c b/src/gtetrinet.c index 93466b3..647b27b 100644 --- a/src/gtetrinet.c +++ b/src/gtetrinet.c @@ -61,6 +61,8 @@ int gamemode = ORIGINAL; int fields_width, fields_height; +gulong keypress_signal; + static const struct poptOption options[] = { {"connect", 'c', POPT_ARG_STRING, &option_connect, 0, N_("Connect to server"), N_("SERVER")}, {"nickname", 'n', POPT_ARG_STRING, &option_nick, 0, N_("Set nickname to use"), N_("NICKNAME")}, @@ -154,8 +156,8 @@ int main (int argc, char *argv[]) g_signal_connect (G_OBJECT(app), "destroy", GTK_SIGNAL_FUNC(destroymain), NULL); - g_signal_connect (G_OBJECT(app), "key-press-event", - GTK_SIGNAL_FUNC(keypress), NULL); + keypress_signal = g_signal_connect (G_OBJECT(app), "key-press-event", + GTK_SIGNAL_FUNC(keypress), NULL); g_signal_connect (G_OBJECT(app), "key-release-event", GTK_SIGNAL_FUNC(keyrelease), NULL); gtk_widget_set_events (app, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); @@ -340,13 +342,20 @@ gint keypress (GtkWidget *widget, GdkEventKey *key) GDK_CONTROL_MASK | GDK_SHIFT_MASK))) { - gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_press_event"); + gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key-press-event"); return TRUE; } + + if (game_area && (gdk_keyval_to_upper (key->keyval) == keys[K_GAMEMSG])) + { + g_signal_handler_block (app, keypress_signal); + fields_gmsginputactivate (TRUE); + gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key-press-event"); + } if (game_area && tetrinet_key (key->keyval, key->string)) { - gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_press_event"); + gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key-press-event"); return TRUE; } @@ -503,3 +512,8 @@ void show_partyline_page (void) { gtk_notebook_set_page (GTK_NOTEBOOK(notebook), 1); } + +void unblock_keyboard_signal (void) +{ + g_signal_handler_unblock (app, keypress_signal); +} diff --git a/src/gtetrinet.h b/src/gtetrinet.h index 2da97ec..8cde9d3 100644 --- a/src/gtetrinet.h +++ b/src/gtetrinet.h @@ -13,3 +13,4 @@ extern gint keyrelease (GtkWidget *widget, GdkEventKey *key); extern void move_current_page_to_window (void); extern void show_fields_page (void); extern void show_partyline_page (void); +void unblock_keyboard_signal (void); diff --git a/src/misc.c b/src/misc.c index 55e9695..ac06641 100644 --- a/src/misc.c +++ b/src/misc.c @@ -131,7 +131,7 @@ void textbox_setup (void) tag_table = gtk_text_buffer_get_tag_table(buffer); } -void textbox_addtext (GtkTextView *textbox, unsigned char *text) +void textbox_addtext (GtkTextView *textbox, const unsigned char *text) { GtkTextTag *color, *lastcolor; int i; diff --git a/src/misc.h b/src/misc.h index 2ded9e2..ee81567 100644 --- a/src/misc.h +++ b/src/misc.h @@ -7,7 +7,7 @@ extern void leftlabel_set (GtkWidget *align, char *str); extern int randomnum (int n); extern void fdreadline (int fd, char *buf); extern void textbox_setup (void); -extern void textbox_addtext (GtkTextView *textbox, unsigned char *text); +extern void textbox_addtext (GtkTextView *textbox, const unsigned char *text); extern void adjust_bottom_text_view (GtkTextView *); extern char *nocolor (char *str); extern GtkWidget *pixmap_label (GdkPixmap *pm, GdkBitmap *mask, char *str); diff --git a/src/tetrinet.c b/src/tetrinet.c index 17922a2..ca5198c 100644 --- a/src/tetrinet.c +++ b/src/tetrinet.c @@ -1512,7 +1512,7 @@ int tetrinet_key (int keyval, char *str) notfieldkey: if (!ingame) return FALSE; /* gmsg keys */ - if (gmsgstate == 1) { +/* if (gmsgstate == 1) { fields_gmsginputactivate (TRUE); switch (keyval) { case GDK_Return: @@ -1523,20 +1523,17 @@ notfieldkey: s = fields_gmsginputtext (); if (strlen(s) > 0) { if (strncmp("/me ", s, 4) == 0) { - /* post /me thingy */ g_snprintf (buf, sizeof(buf), "* %s %s", nick, s+4); locale_s = g_locale_from_utf8 (buf, -1, NULL, NULL, NULL); client_outmessage (OUT_GMSG, locale_s); } else { - /* post message */ g_snprintf (buf, sizeof(buf), "<%s> %s", nick, s); locale_s = g_locale_from_utf8 (buf, -1, NULL, NULL, NULL); client_outmessage (OUT_GMSG, locale_s); } g_free (locale_s); } - /* hide input area */ fields_gmsginput (FALSE); fields_gmsginputclear (); gmsgstate = 0; @@ -1554,7 +1551,7 @@ notfieldkey: break; } return TRUE; - } + }*/ if (gdk_keyval_to_upper (keyval) == keys[K_GAMEMSG]) { fields_gmsginput (TRUE); gmsgstate = 1;