From: Jordi Albornoz Date: Sun, 5 Jan 2003 00:02:12 +0000 (+0000) Subject: Big patch from Dani Carbonell. Fixes UTF-8 issues, ports GTK_CLISTs to GtkTreeViews... X-Git-Url: https://hydra-www.ietfng.org/gitweb/?a=commitdiff_plain;h=d79de99804d15cbc1df999dff49ca532f77bea13;p=gtetrinet Big patch from Dani Carbonell. Fixes UTF-8 issues, ports GTK_CLISTs to GtkTreeViews, adds icons to the toolbar, assigns a window icon to gtetrinet, fixes partyline's textview. --- diff --git a/ChangeLog b/ChangeLog index 2e298f8..3f6f444 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,52 @@ +2003-01-04 Jordi Mallach + + * 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 * src/tetrinet.c: correct colours for several messages. diff --git a/src/commands.c b/src/commands.c index e5924c0..a4acc4e 100644 --- a/src/commands.c +++ b/src/commands.c @@ -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 "), N_("James Antill "), + N_("Jordi Mallach "), NULL}; - const char *documenters[] = {N_("Ka-shu Wong "), - N_("Jordi Mallach "), + const char *documenters[] = {N_("Jordi Mallach "), NULL}; /* Translators: translate as your names & emails */ const char *translators = _("translator_credits"); diff --git a/src/dialogs.c b/src/dialogs.c index 226deab..7ec4670 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -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); } diff --git a/src/fields.c b/src/fields.c index bdd199d..ada94a8 100644 --- a/src/fields.c +++ b/src/fields.c @@ -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)); } diff --git a/src/gtetrinet.c b/src/gtetrinet.c index 265b7bf..cb725b6 100644 --- a/src/gtetrinet.c +++ b/src/gtetrinet.c @@ -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 (); diff --git a/src/misc.c b/src/misc.c index d4513da..600a154 100644 --- a/src/misc.c +++ b/src/misc.c @@ -115,8 +115,8 @@ void textbox_setup (void) gtet_text_tags[n].t_c = gtk_text_buffer_create_tag (buffer, NULL, "foreground-gdk", >et_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)); diff --git a/src/partyline.c b/src/partyline.c index 95721be..ce640cf 100644 --- a/src/partyline.c +++ b/src/partyline.c @@ -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]); diff --git a/src/tetrinet.c b/src/tetrinet.c index dd77d92..5b792ee 100644 --- a/src/tetrinet.c +++ b/src/tetrinet.c @@ -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); diff --git a/src/winlist.c b/src/winlist.c index 708918c..aa8dd04 100644 --- a/src/winlist.c +++ b/src/winlist.c @@ -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); }