]> hydra-www.ietfng.org Git - gtetrinet/commitdiff
Fix fields message text input so it deals with composed characters correctly (Dani).
authorJordi Albornoz <jordi@src.gnome.org>
Wed, 8 Jan 2003 15:07:55 +0000 (15:07 +0000)
committerJordi Albornoz <jordi@src.gnome.org>
Wed, 8 Jan 2003 15:07:55 +0000 (15:07 +0000)
ChangeLog
TODO
src/fields.c
src/fields.h
src/gtetrinet.c
src/gtetrinet.h
src/misc.c
src/misc.h
src/tetrinet.c

index 4f16b20c6b48f1e8f162223defc02ecac67d24ae..f7d6cd67c285c693f24b7e3a54aac5693520617e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2003-01-08  Dani Carbonell  <bocata@panete.net>
+
+       * 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  <jordi@sindominio.net>
 
        * src/misc.c (nocolor): fix previous change.
diff --git a/TODO b/TODO
index 2eaf914bf178570980a7ec12f36e3c73f1f7566d..8cf8b2dc508a7f7a49e9679a2f538b45a4486896 100644 (file)
--- 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
index a2308c2ef271e076100f062ab97fb26d6797c48e..400429604fb7bf011fc00392cbf60d31105cbeda 100644 (file)
@@ -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];
index 17a8a271809a2bd3eb2ebcac19773b981a461345..80f3b5633690e666bb4f288bca5375ca03b31634 100644 (file)
@@ -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);
index 93466b3909b6b4e28b17a9759ec8cf76acdc1f9e..647b27b6d2d1e4631e5d56023b95ad11d35423fd 100644 (file)
@@ -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);
+}
index 2da97ec4773ad67c366b089eaa025e8efa897c26..8cde9d333cced4f57db944b656f153fb78571e4a 100644 (file)
@@ -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);
index 55e9695275b62dd1552ca915a03d88cedc92dee0..ac066414caeed2c11659fb2f2b521aedccbd67fa 100644 (file)
@@ -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;
index 2ded9e2f8beb7b6303ff22503bf04be959d0b603..ee815678aa7e49c5f2f968bf7f907680a7ff012f 100644 (file)
@@ -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);
index 17922a227821de50b18700424596c42da04e7b34..ca5198cd5c6ae4872ae65042fc2af750418d7a3d 100644 (file)
@@ -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;