4
* Project: GGZ GTK Client
6
* $Id: playerlist.c,v 1.1 2002/11/04 01:47:46 jdorje Exp $
8
* List of players in the current room
10
* Copyright (C) 2000-2002 Justin Zaun.
12
* This program is free software; you can redistribute it and/or modify
13
* it under the terms of the GNU General Public License as published by
14
* the Free Software Foundation; either version 2 of the License, or
15
* (at your option) any later version.
17
* This program is distributed in the hope that it will be useful,
18
* but WITHOUT ANY WARRANTY; without even the implied warranty of
19
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
* GNU General Public License for more details.
22
* You should have received a copy of the GNU General Public License
23
* along with this program; if not, write to the Free Software
24
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
39
#include "playerinfo.h"
40
#include "playerlist.h"
45
#define PLAYER_LIST_COL_LAG 0
46
#define PLAYER_LIST_COL_TABLE 1
47
#define PLAYER_LIST_COL_STATS 2
48
#define PLAYER_LIST_COL_NAME 3
50
static char *client_get_players_index(guint row);
51
static GtkWidget *create_mnu_player(int player_num, gboolean is_friend,
54
static gboolean client_player_clist_event(GtkWidget * widget,
55
GdkEvent * event, gpointer data);
56
static void client_player_info_activate(GtkMenuItem * menuitem,
58
static void client_player_friends_click(GtkMenuItem * menuitem,
60
static void client_player_ignore_click(GtkMenuItem * menuitem, gpointer data);
61
static void client_player_clist_select_row(GtkCList * clist, gint row,
62
gint column, GdkEvent * event,
65
static char *client_get_players_index(guint row)
73
tmp = lookup_widget(win_main, "player_clist");
74
gtk_clist_get_pixtext(GTK_CLIST(tmp), row, PLAYER_LIST_COL_NAME,
75
&text, &space, &pixmap, &mask);
81
static void client_player_info_activate(GtkMenuItem * menuitem, gpointer data)
83
/* Pop up an info dialog about the player */
84
int player_num = GPOINTER_TO_INT(data);
85
GGZRoom *room = ggzcore_server_get_cur_room(server);
86
GGZPlayer *player = ggzcore_room_get_nth_player(room, player_num);
87
player_info_create_or_raise(player);
90
static void client_player_friends_click(GtkMenuItem * menuitem, gpointer data)
92
int player_num = GPOINTER_TO_INT(data);
93
char *pname = client_get_players_index(player_num);
95
if (GTK_CHECK_MENU_ITEM(menuitem)->active)
96
chat_add_friend(pname, TRUE);
98
chat_remove_friend(pname);
101
static void client_player_ignore_click(GtkMenuItem * menuitem, gpointer data)
103
int player_num = GPOINTER_TO_INT(data);
104
char *pname = client_get_players_index(player_num);
106
if (GTK_CHECK_MENU_ITEM(menuitem)->active)
107
chat_add_ignore(pname, TRUE);
109
chat_remove_ignore(pname);
113
client_player_clist_event(GtkWidget * widget, GdkEvent * event, gpointer data)
116
GdkEventButton *buttonevent = (GdkEventButton *) event;
117
GtkWidget *clist = lookup_widget(win_main, "player_clist");
119
gtk_clist_get_selection_info(GTK_CLIST(clist),
121
buttonevent->y, &row, &column);
122
if (row < 0 || row > GTK_CLIST(clist)->rows)
125
if (event->type == GDK_BUTTON_PRESS) {
127
if (buttonevent->button == 3) {
128
/* Right mouse button */
129
/* Create and display the menu */
130
const char *player = client_get_players_index(row);
131
int is_friend = chat_is_friend(player);
132
int is_ignore = chat_is_ignore(player);
134
gtk_clist_select_row(GTK_CLIST(clist), row, column);
135
menu = create_mnu_player(row, is_friend, is_ignore);
137
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL,
138
NULL, buttonevent->button, 0);
146
static void client_player_clist_select_row(GtkCList * clist, gint row,
147
gint column, GdkEvent * event,
154
static GtkWidget *create_mnu_player(int player_num, gboolean is_friend,
157
GtkWidget *mnu_player;
159
GtkAccelGroup *mnu_player_accels;
162
GtkWidget *separator9;
166
mnu_player = gtk_menu_new();
167
gtk_object_set_data(GTK_OBJECT(mnu_player), "mnu_player", mnu_player);
170
gtk_menu_ensure_uline_accel_group(GTK_MENU(mnu_player));
173
info = gtk_menu_item_new_with_label(_("Info"));
174
gtk_widget_ref(info);
175
gtk_object_set_data_full(GTK_OBJECT(mnu_player), "info", info,
176
(GtkDestroyNotify) gtk_widget_unref);
177
gtk_widget_show(info);
178
gtk_container_add(GTK_CONTAINER(mnu_player), info);
180
separator9 = gtk_menu_item_new();
181
gtk_widget_ref(separator9);
182
gtk_object_set_data_full(GTK_OBJECT(mnu_player), "separator9",
184
(GtkDestroyNotify) gtk_widget_unref);
185
gtk_widget_show(separator9);
186
gtk_container_add(GTK_CONTAINER(mnu_player), separator9);
187
gtk_widget_set_sensitive(separator9, FALSE);
189
friends = gtk_check_menu_item_new_with_label(_("Friends"));
190
gtk_widget_ref(friends);
191
gtk_object_set_data_full(GTK_OBJECT(mnu_player), "friends", friends,
192
(GtkDestroyNotify) gtk_widget_unref);
193
gtk_widget_show(friends);
194
gtk_container_add(GTK_CONTAINER(mnu_player), friends);
195
gtk_check_menu_item_set_show_toggle(GTK_CHECK_MENU_ITEM(friends),
197
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(friends),
200
ignore = gtk_check_menu_item_new_with_label(_("Ignore"));
201
gtk_widget_ref(ignore);
202
gtk_object_set_data_full(GTK_OBJECT(mnu_player), "ignore", ignore,
203
(GtkDestroyNotify) gtk_widget_unref);
204
gtk_widget_show(ignore);
205
gtk_container_add(GTK_CONTAINER(mnu_player), ignore);
206
gtk_check_menu_item_set_show_toggle(GTK_CHECK_MENU_ITEM(ignore),
208
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(ignore),
211
gtk_signal_connect(GTK_OBJECT(info), "activate",
212
GTK_SIGNAL_FUNC(client_player_info_activate),
213
GINT_TO_POINTER(player_num));
214
gtk_signal_connect(GTK_OBJECT(friends), "activate",
215
GTK_SIGNAL_FUNC(client_player_friends_click),
216
GINT_TO_POINTER(player_num));
217
gtk_signal_connect(GTK_OBJECT(ignore), "activate",
218
GTK_SIGNAL_FUNC(client_player_ignore_click),
219
GINT_TO_POINTER(player_num));
225
void display_players(void)
229
/* Some of the fields of the clist receive pixmaps
230
* instead, and are therefore set to NULL. */
231
gchar *player[5] = { NULL, NULL, NULL, NULL, NULL };
235
GGZRoom *room = ggzcore_server_get_cur_room(server);
236
GdkPixmap *pixmap1 = NULL, *pixmap2 = NULL;
237
GdkBitmap *mask1, *mask2;
238
int wins, losses, ties, forfeits, rating, ranking;
242
/* Retrieve the player list (CList) widget. */
243
tmp = lookup_widget(win_main, "player_clist");
245
/* "Freeze" the clist. This prevents any graphical updating
246
* until we "thaw" it later. */
247
gtk_clist_freeze(GTK_CLIST(tmp));
249
/* Clear current list of players */
250
gtk_clist_clear(GTK_CLIST(tmp));
252
/* Display current list of players */
253
num = ggzcore_room_get_num_players(room);
255
for (i = 0; i < num; i++) {
256
p = ggzcore_room_get_nth_player(room, i);
258
table = ggzcore_player_get_table(p);
260
/* These values are freed down below. */
262
player[PLAYER_LIST_COL_TABLE] = g_strdup("--");
264
player[PLAYER_LIST_COL_TABLE]
265
= g_strdup_printf("%d",
269
if (ggzcore_player_get_ranking(p, &ranking)) {
270
snprintf(stats, sizeof(stats), _("#%d"), ranking);
271
} else if (ggzcore_player_get_highscore(p, &highscore)) {
272
snprintf(stats, sizeof(stats), "%ld", highscore);
273
} else if (ggzcore_player_get_rating(p, &rating)) {
274
snprintf(stats, sizeof(stats), "%d", rating);
275
} else if (ggzcore_player_get_record(p, &wins, &losses,
277
snprintf(stats, sizeof(stats), "%d-%d", wins, losses);
279
snprintf(stats + strlen(stats),
280
sizeof(stats) - strlen(stats),
284
snprintf(stats + strlen(stats),
285
sizeof(stats) - strlen(stats),
289
snprintf(stats, sizeof(stats), "%s", "");
290
player[PLAYER_LIST_COL_STATS] = stats;
292
player[PLAYER_LIST_COL_NAME]
293
= g_strdup(ggzcore_player_get_name(p));
295
gtk_clist_append(GTK_CLIST(tmp), player);
297
if (ggzcore_player_get_lag(p) == -1
298
|| ggzcore_player_get_lag(p) == 0)
299
path = g_strjoin(G_DIR_SEPARATOR_S, GGZDATADIR,
300
"ggz_gtk_lag0.xpm", NULL);
301
else if (ggzcore_player_get_lag(p) == 1)
302
path = g_strjoin(G_DIR_SEPARATOR_S, GGZDATADIR,
303
"ggz_gtk_lag1.xpm", NULL);
304
else if (ggzcore_player_get_lag(p) == 2)
305
path = g_strjoin(G_DIR_SEPARATOR_S, GGZDATADIR,
306
"ggz_gtk_lag2.xpm", NULL);
307
else if (ggzcore_player_get_lag(p) == 3)
308
path = g_strjoin(G_DIR_SEPARATOR_S, GGZDATADIR,
309
"ggz_gtk_lag3.xpm", NULL);
310
else if (ggzcore_player_get_lag(p) == 4)
311
path = g_strjoin(G_DIR_SEPARATOR_S, GGZDATADIR,
312
"ggz_gtk_lag4.xpm", NULL);
313
else if (ggzcore_player_get_lag(p) == 5)
314
path = g_strjoin(G_DIR_SEPARATOR_S, GGZDATADIR,
315
"ggz_gtk_lag5.xpm", NULL);
319
gdk_pixmap_create_from_xpm(tmp->window,
323
gtk_clist_set_pixmap(GTK_CLIST(tmp), i,
330
if (ggzcore_player_get_type(p) == GGZ_PLAYER_GUEST)
331
path = g_strjoin(G_DIR_SEPARATOR_S, GGZDATADIR,
332
"ggz_gtk_guest.xpm", NULL);
333
else if (ggzcore_player_get_type(p) == GGZ_PLAYER_NORMAL)
334
path = g_strjoin(G_DIR_SEPARATOR_S, GGZDATADIR,
335
"ggz_gtk_registered.xpm", NULL);
336
else if (ggzcore_player_get_type(p) == GGZ_PLAYER_ADMIN)
337
path = g_strjoin(G_DIR_SEPARATOR_S, GGZDATADIR,
338
"ggz_gtk_admin.xpm", NULL);
342
gdk_pixmap_create_from_xpm(tmp->window,
346
gtk_clist_set_pixtext
348
PLAYER_LIST_COL_NAME,
349
player[PLAYER_LIST_COL_NAME],
354
/* Note the name is used right above, so these calls
355
have to come way down here. */
356
g_free(player[PLAYER_LIST_COL_TABLE]);
357
g_free(player[PLAYER_LIST_COL_NAME]);
360
/* "Thaw" the clist (it was "frozen" up above). */
361
gtk_clist_thaw(GTK_CLIST(tmp));
364
GtkWidget *create_player_list(GtkWidget * window)
366
GtkWidget *player_clist;
367
GtkWidget *player_lag_label;
368
GtkWidget *player_table_label;
369
GtkWidget *player_record_label;
370
GtkWidget *player_name_label;
372
player_clist = gtk_clist_new(4);
373
gtk_widget_ref(player_clist);
374
gtk_object_set_data_full(GTK_OBJECT(window), "player_clist",
376
(GtkDestroyNotify) gtk_widget_unref);
377
gtk_widget_show(player_clist);
378
gtk_widget_set_sensitive(player_clist, FALSE);
379
GTK_WIDGET_UNSET_FLAGS(player_clist, GTK_CAN_FOCUS);
380
gtk_clist_set_column_width(GTK_CLIST(player_clist), 0, 15);
381
gtk_clist_set_column_width(GTK_CLIST(player_clist), 1, 15);
382
gtk_clist_set_column_width(GTK_CLIST(player_clist), 2, 35);
383
gtk_clist_set_column_width(GTK_CLIST(player_clist), 3, 65);
384
gtk_clist_column_titles_show(GTK_CLIST(player_clist));
386
player_lag_label = gtk_label_new(_("L"));
387
gtk_widget_ref(player_lag_label);
388
gtk_object_set_data_full(GTK_OBJECT(window), "player_lag_label",
390
(GtkDestroyNotify) gtk_widget_unref);
391
gtk_widget_show(player_lag_label);
392
gtk_clist_set_column_widget(GTK_CLIST(player_clist), 0,
395
player_table_label = gtk_label_new(_("T"));
396
gtk_widget_ref(player_table_label);
397
gtk_object_set_data_full(GTK_OBJECT(window), "player_table_label",
399
(GtkDestroyNotify) gtk_widget_unref);
400
gtk_widget_show(player_table_label);
401
gtk_clist_set_column_widget(GTK_CLIST(player_clist), 1,
404
player_record_label = gtk_label_new(_("R"));
405
gtk_widget_ref(player_record_label);
406
gtk_object_set_data_full(GTK_OBJECT(window), "player_record_label",
408
(GtkDestroyNotify) gtk_widget_unref);
409
gtk_widget_show(player_record_label);
410
gtk_clist_set_column_widget(GTK_CLIST(player_clist), 2,
411
player_record_label);
413
player_name_label = gtk_label_new(_("Player"));
414
gtk_widget_ref(player_name_label);
415
gtk_object_set_data_full(GTK_OBJECT(window), "player_name_label",
417
(GtkDestroyNotify) gtk_widget_unref);
418
gtk_widget_show(player_name_label);
419
gtk_clist_set_column_widget(GTK_CLIST(player_clist), 3,
422
gtk_signal_connect(GTK_OBJECT(player_clist), "event",
423
GTK_SIGNAL_FUNC(client_player_clist_event), NULL);
424
gtk_signal_connect(GTK_OBJECT(player_clist), "select_row",
425
GTK_SIGNAL_FUNC(client_player_clist_select_row),