]> hydra-www.ietfng.org Git - gtetrinet/commitdiff
Big patch from Dani Carbonell. Fixes UTF-8 issues, ports GTK_CLISTs to GtkTreeViews...
authorJordi Albornoz <jordi@src.gnome.org>
Sun, 5 Jan 2003 00:02:12 +0000 (00:02 +0000)
committerJordi Albornoz <jordi@src.gnome.org>
Sun, 5 Jan 2003 00:02:12 +0000 (00:02 +0000)
ChangeLog
src/commands.c
src/dialogs.c
src/fields.c
src/gtetrinet.c
src/misc.c
src/partyline.c
src/tetrinet.c
src/winlist.c

index 2e298f878ea3eb4f9dba03d504bf9d413847e7d7..3f6f44423f29ce90f23a637def754abd3eb78a6d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,52 @@
+2003-01-04  Jordi Mallach  <jordi@sindominio.net>
+
+       * Big patch from Dani Carbonell, who saved our day and fixes most of
+       the pending issues in 0.5.0.
+
+       * src/commands.c: add stock icons to the toolbar. Needs better
+       icons, still.
+       (about_command): update author list.
+
+       * src/dialogs.c (teamdialog_button): convert the team name to iso
+       text before sending to the server.
+       (connectdialog_button): likewise, for team, nick and server names.
+       (connectdialog_new): convert nick and team names to UTF-8 before
+       displaying.
+       * src/fields.c (fields_setlabel): likewise.
+       (fields_gmsginputadd): convert field messages to UTF-8 before
+       displaying.
+       (fields_gmsginputback): get previous char in UTF-8.
+       * src/misc.c (textbox_addtext): replace g_utf8_normalize with
+       g_locale_to_utf8.
+       (nocolor): remove stripping of high characters, as we're doing UTF-8.
+       * src/partyline.c (partyline_namelabel): convert nick and team names
+       to UTF-8.
+       (partyline_playerlist): likewise.
+       (textentry): convert input from UTF-8 to ISO-8859-1.
+       (entrykey): likewise.
+       * src/tetrinet.c (tetrinet_key): convert messages to iso text before
+       sending them to the server.
+
+       * dialogs.c (prefdialog_drawkeys): port keys CList to GtkTreeView.
+       (prefdialog_clistupdate): new function, replaces
+       prefdialog_clistselect and prefdialog_clistunselect.
+       (prefdialog_changekey): reworked for GtkTreeView changes.
+       (prefdialog_themeselect): port themes GTK_CList to GtkTreeView.
+       (prefdialog_themelist): port to GtkTreeView.
+       (prefdialog_new): port to GtkTreeView.
+       * src/partyline.c (partyline_page_new): port playerlist CList to
+       GtkTreeView.
+       Stop unsetting GTK_CAN_FOCUS flag for partyline's gtk_text_view, and
+       disable set_editable and set_cursor_visible.
+       (partyline_playerlist): port playerlist CList to GtkTreeViewa
+       * src/winlist.c (winlist_clear): port winlist to GtkTreeView.
+       (winlist_additem): likewise.
+
+       * src/gtetrinet.c (main): assign a window icon.
+
+       * src/misc.c (textbox_setup): don't set a background color. Doesn't
+       appear to be useful at all, and makes text scrolling faster.
+
 2003-01-04  Jordi Mallach  <jordi@sindominio.net>
 
        * src/tetrinet.c: correct colours for several messages.
index e5924c0ebd4c93caddcd82927af0b1038e5ac545..a4acc4e974ca7ba368a027672b1310753c09b771 100644 (file)
@@ -72,14 +72,14 @@ GnomeUIInfo menubar[] = {
 };
 
 GnomeUIInfo toolbar[] = {
-    GNOMEUIINFO_ITEM(N_("Connect"), NULL, connect_command, NULL),
-    GNOMEUIINFO_ITEM(N_("Disconnect"), NULL, disconnect_command, NULL),
+    GNOMEUIINFO_ITEM_STOCK(N_("Connect"), N_("Connect"), connect_command, "gtk-execute"),
+    GNOMEUIINFO_ITEM_STOCK(N_("Disconnect"), N_("Disconnect"), disconnect_command, "gtk-quit"),
     GNOMEUIINFO_SEPARATOR,
-    GNOMEUIINFO_ITEM(N_("Start game"), NULL, start_command, NULL),
-    GNOMEUIINFO_ITEM(N_("Pause game"), NULL, pause_command, NULL),
-    GNOMEUIINFO_ITEM(N_("End game"), NULL, end_command, NULL),
+    GNOMEUIINFO_ITEM_STOCK(N_("Start game"), N_("Start game"), start_command, "gtk-go-forward"),
+    GNOMEUIINFO_ITEM_STOCK(N_("Pause game"), N_("Pause game"), pause_command, "gtk-dialog-warning"),
+    GNOMEUIINFO_ITEM_STOCK(N_("End game"), N_("End game"), end_command, "gtk-stop"),
     GNOMEUIINFO_SEPARATOR,
-    GNOMEUIINFO_ITEM(N_("Change team"), NULL, team_command, NULL),
+    GNOMEUIINFO_ITEM_STOCK(N_("Change team"), N_("Change team"), team_command, "gtk-jump-to"),
 #ifdef ENABLE_DETACH
     GNOMEUIINFO_SEPARATOR,
     GNOMEUIINFO_ITEM(N_("Detach page"), NULL, detach_command, NULL),
@@ -224,9 +224,10 @@ void about_command (GtkWidget *widget, gpointer data)
 
     const char *authors[] = {N_("Ka-shu Wong <kswong@zip.com.au>"),
                              N_("James Antill <james@and.org>"),
+                            N_("Jordi Mallach <jordi@sindominio.net"),
+                            N_("Dani Carbonell <bocata@panete.net>"),
                              NULL};
-    const char *documenters[] = {N_("Ka-shu Wong <kswong@zip.com.au>"),
-                                 N_("Jordi Mallach <jordi@sindominio.net>"),
+    const char *documenters[] = {N_("Jordi Mallach <jordi@sindominio.net>"),
                                  NULL};
     /* Translators: translate as your names & emails */
     const char *translators = _("translator_credits");
index 226deabbf17e1b6acc451277c7c2a715582df5e2..7ec4670ea420154d54df578bd5fc18495ae702bc 100644 (file)
@@ -109,10 +109,13 @@ void connectingdialog_destroy (void)
 void teamdialog_button (GnomeDialog *dialog, gint button, gpointer data)
 {
     GtkWidget *entry = GTK_WIDGET(data);
+    gchar *aux;
     switch (button) {
     case 0:
-        tetrinet_changeteam (gtk_entry_get_text(GTK_ENTRY(gnome_entry_gtk_entry(GNOME_ENTRY(entry)))));
+        aux = g_locale_from_utf8 (gtk_entry_get_text(GTK_ENTRY(gnome_entry_gtk_entry(GNOME_ENTRY(entry)))), -1, NULL, NULL, NULL);
+        tetrinet_changeteam (aux);
         gtk_widget_destroy (GTK_WIDGET(dialog));
+        g_free (aux);
         break;
     case 1:
         gtk_widget_destroy (GTK_WIDGET(dialog));
@@ -159,14 +162,20 @@ static int oldgamemode;
 
 void connectdialog_button (GnomeDialog *dialog, gint button, gpointer data)
 {
+    gchar *team_utf8, *nick; /* intermediate buffer for recoding purposes */
     switch (button) {
     case 0:
         /* connect now */
         spectating = GTK_TOGGLE_BUTTON(spectatorcheck)->active ? TRUE : FALSE;
         GTET_O_STRCPY (specpassword, gtk_entry_get_text (GTK_ENTRY(passwordentry)));
-        GTET_O_STRCPY (team, gtk_entry_get_text (GTK_ENTRY(gnome_entry_gtk_entry(GNOME_ENTRY(teamnameentry)))));
-        client_init (gtk_entry_get_text(GTK_ENTRY(gnome_entry_gtk_entry(GNOME_ENTRY(serveraddressentry)))),
-                     gtk_entry_get_text(GTK_ENTRY(gnome_entry_gtk_entry(GNOME_ENTRY(nicknameentry)))));
+        team_utf8 = g_locale_from_utf8 (gtk_entry_get_text (GTK_ENTRY(gnome_entry_gtk_entry(GNOME_ENTRY(teamnameentry)))),
+                                        -1, NULL, NULL, NULL);
+        GTET_O_STRCPY (team, team_utf8);
+        nick =   g_locale_from_utf8 (gtk_entry_get_text (GTK_ENTRY (gnome_entry_gtk_entry (GNOME_ENTRY (nicknameentry)))),
+                                     -1, NULL, NULL, NULL);
+        client_init (gtk_entry_get_text (GTK_ENTRY (gnome_entry_gtk_entry (GNOME_ENTRY (serveraddressentry)))), nick);
+        g_free (team_utf8);
+        g_free (nick);
         break;
     case 1:
         gamemode = oldgamemode;
@@ -218,6 +227,7 @@ void connectdialog_destroy (GtkWidget *widget, gpointer data)
 void connectdialog_new (void)
 {
     GtkWidget *widget, *table1, *table2, *frame;
+    gchar *aux;
     /* check if dialog is already displayed */
     if (connecting) return;
     connecting = TRUE;
@@ -315,8 +325,10 @@ void connectdialog_new (void)
     gtk_table_attach (GTK_TABLE(table2), widget, 0, 1, 0, 1,
                       GTK_FILL | GTK_EXPAND, 0, 0, 0);
     nicknameentry = gnome_entry_new ("Nickname");
+    aux = g_locale_to_utf8 (nick, -1, NULL, NULL, NULL);
     gtk_entry_set_text (GTK_ENTRY(gnome_entry_gtk_entry(GNOME_ENTRY(nicknameentry))),
-                        nick);
+                        aux);
+    g_free (aux);
     gtk_widget_show (nicknameentry);
     gtk_table_attach (GTK_TABLE(table2), nicknameentry, 1, 2, 0, 1,
                       GTK_FILL | GTK_EXPAND, 0, 0, 0);
@@ -325,8 +337,10 @@ void connectdialog_new (void)
     gtk_table_attach (GTK_TABLE(table2), teamnamelabel, 0, 1, 1, 2,
                       GTK_FILL | GTK_EXPAND, 0, 0, 0);
     teamnameentry = gnome_entry_new ("Teamname");
+    aux = g_locale_to_utf8 (team, -1, NULL, NULL, NULL);
     gtk_entry_set_text (GTK_ENTRY(gnome_entry_gtk_entry(GNOME_ENTRY(teamnameentry))),
-                        team);
+                        aux);
+    g_free (aux);
     gtk_widget_show (teamnameentry);
     gtk_table_attach (GTK_TABLE(table2), teamnameentry, 1, 2, 1, 2,
                       GTK_FILL | GTK_EXPAND, 0, 0, 0);
@@ -410,7 +424,6 @@ int actionid[K_NUM] = {
 };
 
 gint newkeys[K_NUM];
-int pk_row;
 
 struct themelistentry {
     char dir[1024];
@@ -428,6 +441,8 @@ void prefdialog_drawkeys (void)
 {
     char *array[2];
     int i;
+    GtkTreeIter iter;
+    GtkListStore *keys_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (keyclist)));
 
     actions[0] = _("Move right");
     actions[1] = _("Move left");
@@ -441,49 +456,56 @@ void prefdialog_drawkeys (void)
     for (i = 0; i < K_NUM; i ++) {
         array[0] = actions[i];
         array[1] = keystr (newkeys[actionid[i]]);
-        gtk_clist_append (GTK_CLIST(keyclist), array);
+        gtk_list_store_append (keys_store, &iter);
+        gtk_list_store_set (keys_store, &iter,
+                            0, actions[i],
+                            1, keystr (newkeys[actionid[i]]),
+                            2, i, -1);
     }
 }
 
-void prefdialog_clistupdate (int row)
+void prefdialog_clistupdate ()
 {
-    gtk_clist_set_text (GTK_CLIST(keyclist), row, 1,
-                        keystr (newkeys[actionid[row]]));
+    GtkTreeIter iter;
+    GtkListStore *keys_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (keyclist)));
+    gboolean valid;
+    gint row = 0;
+    
+    valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (keys_store), &iter);
+    while (valid)
+    {
+        gtk_list_store_set (keys_store, &iter, 1, keystr (newkeys[actionid[row]]), -1);
+        valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (keys_store), &iter);
+        row ++;
+    }
 }
 
 void prefdialog_restorekeys (GtkWidget *widget, gpointer data)
 {
     int i;
+
     for (i = 0; i < K_NUM; i ++) newkeys[i] = defaultkeys[i];
-    for (i = 0; i < K_NUM; i ++) prefdialog_clistupdate (i);
+    prefdialog_clistupdate ();
     gnome_property_box_changed (GNOME_PROPERTY_BOX(prefdialog));
 }
 
-void prefdialog_clistselect (GtkWidget *widget, gint row, gint column,
-                             GdkEventButton *event, gpointer data)
-{
-    pk_row = row;
-}
-
-void prefdialog_clistunselect (GtkWidget *widget, gint row, gint column,
-                               gpointer data)
-{
-    pk_row = -1;
-}
-
 void prefdialog_changekey (GtkWidget *widget, gpointer data)
 {
-    char buf[256];
-    gint k;
+    gchar buf[256], *key;
+    gint k, row = 0;
+    GtkListStore *keys_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (keyclist)));
+    GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (keyclist));
+    GtkTreeIter pk_row;
 
-    if (pk_row == -1) return;
+    if (!gtk_tree_selection_get_selected (selection, NULL, &pk_row)) return;
 
-    g_snprintf (buf, sizeof(buf), _("Press new key for \"%s\""),
-                actions[pk_row]);
+    gtk_tree_model_get (GTK_TREE_MODEL (keys_store), &pk_row,
+                        0, &key, 2, &row, -1);
+    g_snprintf (buf, sizeof(buf), _("Press new key for \"%s\""), key);
     k = key_dialog (buf);
     if (k) {
-        newkeys[actionid[pk_row]] = k;
-        prefdialog_clistupdate (pk_row);
+        newkeys[actionid[row]] = k;
+        prefdialog_clistupdate ();
         gnome_property_box_changed (GNOME_PROPERTY_BOX(prefdialog));
     }
 }
@@ -559,13 +581,22 @@ void prefdialog_themelistselect (int n)
     leftlabel_set (desclabel, desc);
 }
 
-void prefdialog_themeselect (GtkWidget *widget, gint row, gint column,
-                             GdkEventButton *event, gpointer data)
-{
-    theme_select = row;
-    themechanged = TRUE;
-    prefdialog_themelistselect (row);
-    gnome_property_box_changed (GNOME_PROPERTY_BOX(prefdialog));
+void prefdialog_themeselect (GtkTreeSelection *treeselection,
+                             gpointer data)
+{
+    GtkListStore *model;
+    GtkTreeIter iter;
+    gint row;
+  
+    if (gtk_tree_selection_get_selected (treeselection, NULL, &iter))
+    {
+      model = GTK_LIST_STORE (gtk_tree_view_get_model (gtk_tree_selection_get_tree_view (treeselection)));
+      gtk_tree_model_get (GTK_TREE_MODEL(model), &iter, 1, &row, -1);
+      theme_select = row;
+      themechanged = TRUE;
+      prefdialog_themelistselect (row);
+      gnome_property_box_changed (GNOME_PROPERTY_BOX(prefdialog));
+    }
 }
 
 static int themelistcomp (const void *a1, const void *b1)
@@ -581,6 +612,9 @@ void prefdialog_themelist ()
     char buf[1024], str[1024], dir[1024];
     int i;
     char *basedir[2];
+    GtkListStore *theme_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (themelist)));
+    GtkTreeSelection *theme_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (themelist));
+    GtkTreeIter iter, iter_selected;
 
     GTET_O_STRCPY (dir, getenv ("HOME"));
     GTET_O_STRCAT (dir, "/.gtetrinet/themes");
@@ -618,16 +652,20 @@ void prefdialog_themelist ()
     qsort (themes, themecount, sizeof(struct themelistentry), themelistcomp);
 
     theme_select = 0;
-    gtk_clist_clear (GTK_CLIST(themelist));
+    gtk_list_store_clear (theme_store);
     for (i = 0; i < themecount; i ++) {
         char *text[2];
         text[0] = themes[i].name;
         text[1] = 0;
-        gtk_clist_append (GTK_CLIST(themelist), text);
+        gtk_list_store_append (theme_store, &iter);
+        gtk_list_store_set (theme_store, &iter, 0, themes[i].name, 1, i, -1);
         if (strcmp(themes[i].dir, currenttheme) == 0)
+        {
+            iter_selected = iter;
             theme_select = i;
+        }
     }
-    gtk_clist_select_row (GTK_CLIST(themelist), theme_select, 0);
+    gtk_tree_selection_select_iter (theme_selection, &iter_selected);
     prefdialog_themelistselect (theme_select);
 }
 
@@ -675,20 +713,23 @@ void prefdialog_apply (GnomePropertyBox *dialog, gint pagenum)
 void prefdialog_new (void)
 {
     GtkWidget *label, *table, *frame, *button, *button1, *widget, *table1, *divider;
-    char *keytitles[2];
+    GtkListStore *theme_store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT);
+    GtkListStore *keys_store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT);
+    GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
+    GtkTreeSelection *theme_selection, *keys_selection;
     int i;
 
-    keytitles[0] = _("Action");
-    keytitles[1] = _("Key");
-
     prefdialog = gnome_property_box_new();
 
     gtk_window_set_title(GTK_WINDOW(prefdialog), _("GTetrinet Preferences"));
 
     /* themes */
-    themelist = gtk_clist_new (1);
-    gtk_clist_set_column_width (GTK_CLIST(themelist), 0, 160);
-    gtk_clist_set_selection_mode (GTK_CLIST(themelist), GTK_SELECTION_SINGLE);
+    themelist = gtk_tree_view_new_with_model (GTK_TREE_MODEL (theme_store));
+    theme_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (themelist));
+    gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (themelist), FALSE);
+    gtk_widget_set_usize (themelist, 160, 0);
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (themelist), -1, _("Theme"), renderer,
+                                                 "text", 0, NULL);
     gtk_widget_show (themelist);
 
     label = leftlabel_new (_("Select a theme from the list.\n"
@@ -754,15 +795,13 @@ void prefdialog_new (void)
                                     frame, label);
 
     /* keyboard */
-    keyclist = gtk_clist_new_with_titles (2, keytitles);
-    gtk_clist_set_column_width (GTK_CLIST(keyclist), 0, 100);
-    gtk_clist_set_column_width (GTK_CLIST(keyclist), 1, 80);
-    gtk_clist_set_selection_mode (GTK_CLIST(keyclist), GTK_SELECTION_SINGLE);
-    gtk_clist_column_titles_passive (GTK_CLIST(keyclist));
-    gtk_signal_connect (GTK_OBJECT(keyclist), "select_row",
-                        GTK_SIGNAL_FUNC (prefdialog_clistselect), NULL);
-    gtk_signal_connect (GTK_OBJECT(keyclist), "unselect_row",
-                        GTK_SIGNAL_FUNC (prefdialog_clistunselect), NULL);
+    keyclist = GTK_WIDGET (gtk_tree_view_new_with_model (GTK_TREE_MODEL(keys_store)));
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (keyclist), -1, _("Action"), renderer,
+                                                 "text", 0, NULL);
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (keyclist), -1, _("Key"), renderer,
+                                                 "text", 1, NULL);
+
+    gtk_widget_set_usize (keyclist, 180, 0);
     gtk_widget_show (keyclist);
 
     label = gtk_label_new (_("Select an action from the list and press Change "
@@ -894,22 +933,21 @@ void prefdialog_new (void)
     gtk_widget_set_sensitive (soundcheck, FALSE);
 #endif
 
-    pk_row = -1;
     themechanged = midichanged = FALSE;
 
-    gtk_signal_connect (GTK_OBJECT(soundcheck), "toggled",
-                        GTK_SIGNAL_FUNC(prefdialog_soundtoggle), NULL);
-    gtk_signal_connect (GTK_OBJECT(midicheck), "toggled",
-                        GTK_SIGNAL_FUNC(prefdialog_miditoggle), NULL);
-    gtk_signal_connect (GTK_OBJECT(gnome_entry_gtk_entry(GNOME_ENTRY(midientry))),
-                        "changed", GTK_SIGNAL_FUNC(prefdialog_midichanged), NULL);
-    gtk_signal_connect (GTK_OBJECT(themelist), "select_row",
-                        GTK_SIGNAL_FUNC (prefdialog_themeselect), NULL);
-    gtk_signal_connect (GTK_OBJECT(prefdialog), "apply",
-                        GTK_SIGNAL_FUNC(prefdialog_apply), NULL);
-    gtk_signal_connect (GTK_OBJECT(GNOME_PROPERTY_BOX(prefdialog)->ok_button), "clicked",
-                        GTK_SIGNAL_FUNC(prefdialog_check), NULL);
-    gtk_signal_connect (GTK_OBJECT(GNOME_PROPERTY_BOX(prefdialog)->apply_button), "clicked",
-                        GTK_SIGNAL_FUNC(prefdialog_check), NULL);
+    g_signal_connect (G_OBJECT(soundcheck), "toggled",
+                      GTK_SIGNAL_FUNC(prefdialog_soundtoggle), NULL);
+    g_signal_connect (G_OBJECT(midicheck), "toggled",
+                      GTK_SIGNAL_FUNC(prefdialog_miditoggle), NULL);
+    g_signal_connect (G_OBJECT(gnome_entry_gtk_entry(GNOME_ENTRY(midientry))),
+                      "changed", GTK_SIGNAL_FUNC(prefdialog_midichanged), NULL);
+    g_signal_connect (G_OBJECT(theme_selection), "changed",
+                      GTK_SIGNAL_FUNC (prefdialog_themeselect), NULL);
+    g_signal_connect (G_OBJECT(prefdialog), "apply",
+                      GTK_SIGNAL_FUNC(prefdialog_apply), NULL);
+    g_signal_connect (G_OBJECT(GNOME_PROPERTY_BOX(prefdialog)->ok_button), "clicked",
+                      GTK_SIGNAL_FUNC(prefdialog_check), NULL);
+    g_signal_connect (G_OBJECT(GNOME_PROPERTY_BOX(prefdialog)->apply_button), "clicked",
+                      GTK_SIGNAL_FUNC(prefdialog_check), NULL);
     gtk_widget_show (prefdialog);
 }
index bdd199d197835652bfcf317197f8f72b3344b231..ada94a8ee70c503597661b77c7e5a8aed3fa3778 100644 (file)
@@ -394,6 +394,7 @@ void fields_drawblock (int field, int x, int y, char block)
 void fields_setlabel (int field, char *name, char *team, int num)
 {
     char buf[11];
+    gchar *name_utf8, *team_utf8;
 
     g_snprintf (buf, sizeof(buf), "%d", num);
     
@@ -410,12 +411,13 @@ void fields_setlabel (int field, char *name, char *team, int num)
         gtk_label_set (GTK_LABEL(fieldlabels[field][5]), "");
     }
     else {
+        name_utf8 = g_locale_to_utf8 (name, -1, NULL, NULL, NULL);
         gtk_widget_show (fieldlabels[field][0]);
         gtk_widget_show (fieldlabels[field][1]);
         gtk_widget_show (fieldlabels[field][2]);
         gtk_widget_hide (fieldlabels[field][3]);
         gtk_label_set (GTK_LABEL(fieldlabels[field][0]), buf);
-        gtk_label_set (GTK_LABEL(fieldlabels[field][2]), nocolor(name));
+        gtk_label_set (GTK_LABEL(fieldlabels[field][2]), nocolor(name_utf8));
         gtk_label_set (GTK_LABEL(fieldlabels[field][3]), "");
         if (team == NULL || team[0] == 0) {
             gtk_widget_hide (fieldlabels[field][4]);
@@ -423,10 +425,13 @@ void fields_setlabel (int field, char *name, char *team, int num)
             gtk_label_set (GTK_LABEL(fieldlabels[field][5]), "");
         }
         else {
+            team_utf8 = g_locale_to_utf8 (team, -1, NULL, NULL, NULL);
             gtk_widget_show (fieldlabels[field][4]);
             gtk_widget_show (fieldlabels[field][5]);
-            gtk_label_set (GTK_LABEL(fieldlabels[field][5]), nocolor(team));
+            gtk_label_set (GTK_LABEL(fieldlabels[field][5]), nocolor(team_utf8));
+            g_free (team_utf8);
         }
+        g_free (name_utf8);
     }
 }
 
@@ -586,17 +591,22 @@ void fields_gmsginputactivate (int t)
 
 void fields_gmsginputadd (char *c)
 {
-    gtk_entry_append_text (GTK_ENTRY(gmsginput), c);
+    gchar *utf8_c = g_locale_to_utf8 (c, -1, NULL, NULL, NULL);
+    gtk_entry_append_text (GTK_ENTRY(gmsginput), utf8_c);
     gtk_entry_set_position (GTK_ENTRY(gmsginput),
                             strlen(gtk_entry_get_text(GTK_ENTRY(gmsginput))));
+    g_free (utf8_c);
 }
 
 void fields_gmsginputback (void)
 {
     char buf[256];
+    gchar *prev;
+  
     GTET_O_STRCPY (buf, gtk_entry_get_text(GTK_ENTRY(gmsginput)));
     if (strlen(buf) == 0) return;
-    buf[strlen(buf)-1] = 0;
+    prev = g_utf8_prev_char (&buf[strlen(buf)]);
+    *prev = 0;
     gtk_entry_set_text (GTK_ENTRY(gmsginput), buf);
     gtk_entry_set_position (GTK_ENTRY(gmsginput), strlen(buf));
 }
index 265b7bf27718a59a48487d1e8b71df5f10fcfe67..cb725b6cc4a99cebc6aca0136f1e5402d190c4bc 100644 (file)
@@ -70,10 +70,12 @@ static const struct poptOption options[] = {
     {NULL, 0, 0, NULL, 0, NULL, NULL}
 };
 
+
 int main (int argc, char *argv[])
 {
     GtkWidget *page, *label, *box;
-    char buf[1024];
+    char buf[1024], *logo;
+    GdkPixbuf *icon_pixbuf;
 
     GTET_STRCPY(buf, "", 4);
     g_assert(strlen(buf) == 0);
@@ -159,6 +161,14 @@ int main (int argc, char *argv[])
     gtk_widget_set_events (app, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
 
     gtk_window_set_policy (GTK_WINDOW(app), FALSE, FALSE, TRUE);
+    
+    /* create and set the window icon */
+    icon_pixbuf = gdk_pixbuf_new_from_file (PIXMAPSDIR "/gtetrinet.png", NULL);
+    if (icon_pixbuf)
+    {
+      gtk_window_set_icon (GTK_WINDOW (app), icon_pixbuf);
+      gdk_pixbuf_unref (icon_pixbuf);
+    }
 
     /* create the notebook */
     notebook = gtk_notebook_new ();
index d4513da318502fdf6c2deef6c2aa0298422889e8..600a15491d6e0bc0d5e12cecf3bc507dd2f208b3 100644 (file)
@@ -115,8 +115,8 @@ void textbox_setup (void)
         gtet_text_tags[n].t_c = gtk_text_buffer_create_tag (buffer, NULL,
                                                             "foreground-gdk",
                                                             &gtet_text_tags[n].c,
-                                                            "background",
-                                                            "white",
+//                                                            "background",
+//                                                            "white",
                                                             NULL);
 
     t_bold = gtk_text_buffer_create_tag (buffer, NULL,
@@ -158,6 +158,7 @@ void textbox_addtext (GtkTextView *textbox, unsigned char *text)
     
     if (gtk_text_buffer_get_char_count (textbox->buffer)) /* not first line */
         gtk_text_buffer_insert (textbox->buffer, &iter, "\n", 1);
+    
     for (i = 0; text[i]; i ++) {
        if (text[i] == TETRI_TB_RESET) {
            lastcolor = color = gtet_text_tags[0].t_c;
@@ -190,7 +191,7 @@ void textbox_addtext (GtkTextView *textbox, unsigned char *text)
         }
         else
         {
-          char *out = g_utf8_normalize(&text[i], 1, G_NORMALIZE_ALL);
+          gchar *out = g_locale_to_utf8 (&text[i], 1, NULL, NULL, NULL);
           if (out)
           {
             if (0)
@@ -290,14 +291,6 @@ char *nocolor (char *str)
   g_string_assign(ret, str);
 
   p = scan = ret->str;
-  while (*scan)
-  {
-    if ((signed char)*scan > 0x1F) /* high characters are ok,
-                                    * but only if it's UTF-8 --
-                                    * just kill them for now */
-      *p++ = *scan;
-    ++scan;
-  }
   if (scan != p)
     g_string_truncate(ret, len - (scan - p));
   
index 95721bebe499a35255b799fb2a741861c2d6d741..ce640cfc62fe9221a421dc797cbf19b1f2600d10 100644 (file)
@@ -52,22 +52,18 @@ static gint entrykey (GtkWidget *widget, GdkEventKey *key);
 GtkWidget *partyline_page_new (void)
 {
     GtkWidget *widget, *box; /* generic temp variables */
+    GtkListStore *playerlist_model = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+    GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
     char *listtitles[3];
 
-    /* Initialise the array for the player list */
-    listtitles[0] = "";
-    listtitles[1] = _("Name");
-    listtitles[2] = _("Team");
-
     /* left box */
     leftbox = gtk_vbox_new (FALSE, 4);
     /* chat thingy */
     /* textbox with scrollbars */
     textbox = gtk_text_view_new_with_buffer(gtk_text_buffer_new(tag_table));
     gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW(textbox), GTK_WRAP_WORD);
-    GTK_WIDGET_UNSET_FLAGS(textbox, GTK_CAN_FOCUS);
-    gtk_signal_connect (GTK_OBJECT(textbox), "button_press_event",
-                        GTK_SIGNAL_FUNC(partyline_entryfocus), NULL);
+    gtk_text_view_set_editable (GTK_TEXT_VIEW (textbox), FALSE);
+    gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (textbox), FALSE);
     gtk_widget_show (textbox);
     textboxscroll = gtk_scrolled_window_new (NULL, NULL);
     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(textboxscroll),
@@ -87,10 +83,13 @@ GtkWidget *partyline_page_new (void)
     gtk_widget_show (leftbox);
 
     /* player list */
-    playerlist = gtk_clist_new_with_titles (3, listtitles);
-    gtk_clist_set_column_width (GTK_CLIST(playerlist), 0, 10);
-    gtk_clist_set_column_width (GTK_CLIST(playerlist), 1, 60);
-    gtk_clist_column_titles_passive (GTK_CLIST(playerlist));
+    playerlist = GTK_WIDGET (gtk_tree_view_new_with_model (GTK_TREE_MODEL (playerlist_model)));
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (playerlist), -1, "", renderer,
+                                                 "text", 0, NULL);
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (playerlist), -1, _("Name"), renderer,
+                                                 "text", 1, NULL);
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (playerlist), -1, _("Team"), renderer,
+                                                 "text", 2, NULL);
     gtk_widget_set_usize (playerlist, 150, 200);
     gtk_widget_show (playerlist);
 
@@ -157,9 +156,21 @@ void partyline_connectstatus (int status)
 
 void partyline_namelabel (char *nick, char *team)
 {
-    if (nick) gtk_label_set (GTK_LABEL(namelabel), nocolor(nick));
+    gchar *nick_utf8, *team_utf8;
+  
+    if (nick)
+    {
+      nick_utf8 = g_locale_to_utf8 (nick, -1, NULL, NULL, NULL);
+      gtk_label_set (GTK_LABEL(namelabel), nocolor(nick_utf8));
+      g_free (nick_utf8);
+    }
     else gtk_label_set (GTK_LABEL(namelabel), "");
-    if (team) gtk_label_set (GTK_LABEL(teamlabel), nocolor(team));
+    if (team)
+    {
+      team_utf8 = g_locale_to_utf8 (team, -1, NULL, NULL, NULL);
+      gtk_label_set (GTK_LABEL(teamlabel), nocolor(team_utf8));
+      g_free (team_utf8);
+    }
     else gtk_label_set (GTK_LABEL(teamlabel), "");
 }
 
@@ -191,25 +202,45 @@ void partyline_playerlist (int *numbers, char **names, char **teams, int n, char
     int i;
     char buf0[16], buf1[128], buf2[128];
     char *item[3] = {buf0, buf1, buf2};
+    GtkListStore *playerlist_model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (playerlist)));
+    GtkTreeIter iter;
+    gchar *aux1, *aux2; /* for recoding purposes */
     
     /* update the playerlist so that it contains only the given names */
-    gtk_clist_freeze (GTK_CLIST(playerlist));
-    gtk_clist_clear (GTK_CLIST(playerlist));
+    gtk_list_store_clear (playerlist_model);
+
     for (i = 0; i < n; i ++) {
         g_snprintf (buf0, sizeof(buf0), "%d", numbers[i]);
         GTET_O_STRCPY (buf1, nocolor(names[i]));
         GTET_O_STRCPY (buf2, nocolor(teams[i]));
-        gtk_clist_append (GTK_CLIST(playerlist), item);
+        /* we only need to recode buf1 and buf2, buf0 is just a character */
+        aux1 = g_locale_to_utf8 (buf1, -1, NULL, NULL, NULL);
+        aux2 = g_locale_to_utf8 (buf2, -1, NULL, NULL, NULL);
+        gtk_list_store_append (playerlist_model, &iter);
+        gtk_list_store_set (playerlist_model, &iter,
+                            0, buf0, 1, aux1, 2, aux2, -1);
+        g_free (aux1);
+        g_free (aux2);
     }
+
     buf0[0] = buf1[0] = buf2[0] = 0;
-    gtk_clist_append (GTK_CLIST(playerlist), item);
+    gtk_list_store_append (playerlist_model, &iter);
+    gtk_list_store_set (playerlist_model, &iter,
+                        0, buf0, 1, buf1, 2, buf2, -1);
+
     for (i = 0; i < sn; i ++) {
         GTET_O_STRCPY (buf0, "S");
         GTET_O_STRCPY (buf1, nocolor(specs[i]));
         GTET_O_STRCPY (buf2, "");
-        gtk_clist_append (GTK_CLIST(playerlist), item);
+        /* we only need to recode buf1 and buf2, buf0 is just a character */
+        aux1 = g_locale_to_utf8 (buf1, -1, NULL, NULL, NULL);
+        aux2 = g_locale_to_utf8 (buf2, -1, NULL, NULL, NULL);
+        gtk_list_store_append (playerlist_model, &iter);
+        gtk_list_store_set (playerlist_model, &iter,
+                            0, buf0, 1, buf1, 2, buf2, -1);
+        g_free (aux1);
+        g_free (aux2);
     }
-    gtk_clist_thaw (GTK_CLIST(playerlist));
 }
 
 void partyline_entryfocus (void)
@@ -225,12 +256,16 @@ void partyline_switch_entryfocus (void)
 void textentry (GtkWidget *widget, gpointer data)
 {
     const char *text;
+    gchar *iso_text;
     text = gtk_entry_get_text (GTK_ENTRY(widget));
 
     if (strlen(text) == 0) return;
+    
+    /* convert from UTF-8 to the current locale, will work with ISO8859-1 locales */    
+    iso_text = g_locale_from_utf8 (text, -1, NULL, NULL, NULL);
 
-    tetrinet_playerline (text);
-    GTET_O_STRCPY (plhistory[plh_end], text);
+    tetrinet_playerline (iso_text);
+    GTET_O_STRCPY (plhistory[plh_end], iso_text);
     gtk_entry_set_text (GTK_ENTRY(widget), "");
 
     plh_end ++;
@@ -239,17 +274,20 @@ void textentry (GtkWidget *widget, gpointer data)
     if (plh_start == PLHSIZE) plh_start = 0;
     plh_cur = plh_end;
     plhistory[plh_cur][0] = 0;
+    
+    g_free (iso_text);
 }
 
 static gint entrykey (GtkWidget *widget, GdkEventKey *key)
 {
     int keyval = key->keyval;
+    gchar *text;
 
     if (keyval == GDK_Up || keyval == GDK_Down) {
         if (plh_cur == plh_end) {
-            const char *text;
-            text = gtk_entry_get_text (GTK_ENTRY(widget));
+            text = g_locale_from_utf8 (gtk_entry_get_text (GTK_ENTRY(widget)), -1, NULL, NULL, NULL);
             GTET_O_STRCPY (plhistory[plh_end], text);
+            g_free (text);
         }
         switch (keyval) {
         case GDK_Up:
@@ -263,7 +301,10 @@ static gint entrykey (GtkWidget *widget, GdkEventKey *key)
             if (plh_cur == PLHSIZE) plh_cur = 0;
             break;
         }
-        gtk_entry_set_text (GTK_ENTRY(widget), plhistory[plh_cur]);
+        text = g_locale_to_utf8 (plhistory[plh_cur], -1, NULL, NULL, NULL);
+        gtk_entry_set_text (GTK_ENTRY(widget), text);
+        gtk_editable_set_position (GTK_EDITABLE (widget), -1);
+        g_free (text);
 #ifdef DEBUG
         printf ("history: %d %d %d %s\n", plh_start, plh_end, plh_cur,
                 plhistory[plh_cur]);
index dd77d92475787405b64cf8b1f4027d611b19143e..5b792eefedefd40998e21c77dd96add4f0917d63 100644 (file)
@@ -1509,18 +1509,22 @@ notfieldkey:
             {
                 char buf[256];
                 const char *s;
+                gchar *locale_s;
                 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);
-                        client_outmessage (OUT_GMSG, buf);
+                        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);
-                        client_outmessage (OUT_GMSG, buf);
+                        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);
index 708918c467c4a61ad1aed599af1d4f1ad9fdaa4b..aa8dd04748cf8565cd3dd9486d191f788e111a53 100644 (file)
@@ -35,21 +35,21 @@ static GtkWidget *winlist;
 
 GtkWidget *winlist_page_new (void)
 {
-    char *winlisttitles[3];
     GtkWidget *align;
+    GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
+    GtkListStore *winlist_store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
 
-    winlisttitles [0] = _("T");
-    winlisttitles [1] = _("Name");
-    winlisttitles [2] = _("Score");
+    winlist = gtk_tree_view_new_with_model (GTK_TREE_MODEL (winlist_store));
 
-    winlist = gtk_clist_new_with_titles (3, winlisttitles);
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (winlist), -1, _("T"), renderer,
+                                                 "text", 0, NULL);
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (winlist), -1, _("Name"), renderer,
+                                                 "text", 1, NULL);
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (winlist), -1, _("Score"), renderer,
+                                                 "text", 2, NULL);
 
-    gtk_clist_set_column_width (GTK_CLIST(winlist), 0, 8);
-    gtk_clist_set_column_width (GTK_CLIST(winlist), 1, 120);
     gtk_widget_set_usize (winlist, 240, 0);
 
-    gtk_clist_column_titles_passive (GTK_CLIST(winlist));
-
     gtk_widget_show (winlist);
     align = gtk_alignment_new (0.5, 0.5, 0.0, 0.8);
     gtk_container_add (GTK_CONTAINER(align), winlist);
@@ -60,17 +60,27 @@ GtkWidget *winlist_page_new (void)
 
 void winlist_clear (void)
 {
-    gtk_clist_clear (GTK_CLIST(winlist));
+    GtkListStore *winlist_model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (winlist)));
+  
+    gtk_list_store_clear (winlist_model);
 }
 
 void winlist_additem (int team, char *name, int score)
 {
+    GtkListStore *winlist_model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (winlist)));
+    GtkTreeIter iter;
     char buf[16], *item[3];
+
     if (team) item[0] = "T";
     else item[0] = "";
     item[1] = nocolor (name);
     g_snprintf (buf, sizeof(buf), "%d", score);
     item[2] = buf;
 
-    gtk_clist_append (GTK_CLIST(winlist), item);
+    gtk_list_store_append (winlist_model, &iter);
+    gtk_list_store_set (winlist_model, &iter,
+                        0, item[0],
+                        1, item[1],
+                        2, item[2],
+                        -1);
 }