~ubuntu-branches/ubuntu/warty/ggz-gtk-client/warty

« back to all changes in this revision

Viewing changes to ggz-gtk/playerlist.c

  • Committer: Bazaar Package Importer
  • Author(s): Stephen Zander
  • Date: 2003-12-01 00:00:00 UTC
  • Revision ID: james.westby@ubuntu.com-20031201000000-ixnk24pwpgigjxa2
Tags: upstream-0.0.7
ImportĀ upstreamĀ versionĀ 0.0.7

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * File: playerlist.c
 
3
 * Author: GGZ Dev Team
 
4
 * Project: GGZ GTK Client
 
5
 * Date: 11/03/2002
 
6
 * $Id: playerlist.c,v 1.1 2002/11/04 01:47:46 jdorje Exp $
 
7
 * 
 
8
 * List of players in the current room
 
9
 * 
 
10
 * Copyright (C) 2000-2002 Justin Zaun.
 
11
 * 
 
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.
 
16
 * 
 
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.
 
21
 *
 
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
 
25
 */
 
26
 
 
27
#ifdef HAVE_CONFIG_H
 
28
#  include <config.h>
 
29
#endif
 
30
 
 
31
#include <gtk/gtk.h>
 
32
#include <stdio.h>
 
33
#include <string.h>
 
34
 
 
35
#include <ggzcore.h>
 
36
 
 
37
#include "chat.h"
 
38
#include "client.h"
 
39
#include "playerinfo.h"
 
40
#include "playerlist.h"
 
41
#include "server.h"
 
42
#include "support.h"
 
43
 
 
44
 
 
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
 
49
 
 
50
static char *client_get_players_index(guint row);
 
51
static GtkWidget *create_mnu_player(int player_num, gboolean is_friend,
 
52
                                    gboolean is_ignore);
 
53
 
 
54
static gboolean client_player_clist_event(GtkWidget * widget,
 
55
                                          GdkEvent * event, gpointer data);
 
56
static void client_player_info_activate(GtkMenuItem * menuitem,
 
57
                                        gpointer data);
 
58
static void client_player_friends_click(GtkMenuItem * menuitem,
 
59
                                        gpointer data);
 
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,
 
63
                                           gpointer data);
 
64
 
 
65
static char *client_get_players_index(guint row)
 
66
{
 
67
        GtkWidget *tmp;
 
68
        GdkPixmap *pixmap;
 
69
        GdkBitmap *mask;
 
70
        guint8 space;
 
71
        gchar *text = NULL;
 
72
 
 
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);
 
76
 
 
77
        return text;
 
78
}
 
79
 
 
80
 
 
81
static void client_player_info_activate(GtkMenuItem * menuitem, gpointer data)
 
82
{
 
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);
 
88
}
 
89
 
 
90
static void client_player_friends_click(GtkMenuItem * menuitem, gpointer data)
 
91
{
 
92
        int player_num = GPOINTER_TO_INT(data);
 
93
        char *pname = client_get_players_index(player_num);
 
94
 
 
95
        if (GTK_CHECK_MENU_ITEM(menuitem)->active)
 
96
                chat_add_friend(pname, TRUE);
 
97
        else
 
98
                chat_remove_friend(pname);
 
99
}
 
100
 
 
101
static void client_player_ignore_click(GtkMenuItem * menuitem, gpointer data)
 
102
{
 
103
        int player_num = GPOINTER_TO_INT(data);
 
104
        char *pname = client_get_players_index(player_num);
 
105
 
 
106
        if (GTK_CHECK_MENU_ITEM(menuitem)->active)
 
107
                chat_add_ignore(pname, TRUE);
 
108
        else
 
109
                chat_remove_ignore(pname);
 
110
}
 
111
 
 
112
static gboolean
 
113
client_player_clist_event(GtkWidget * widget, GdkEvent * event, gpointer data)
 
114
{
 
115
        gint row, column;
 
116
        GdkEventButton *buttonevent = (GdkEventButton *) event;
 
117
        GtkWidget *clist = lookup_widget(win_main, "player_clist");
 
118
 
 
119
        gtk_clist_get_selection_info(GTK_CLIST(clist),
 
120
                                     buttonevent->x,
 
121
                                     buttonevent->y, &row, &column);
 
122
        if (row < 0 || row > GTK_CLIST(clist)->rows)
 
123
                return FALSE;
 
124
 
 
125
        if (event->type == GDK_BUTTON_PRESS) {
 
126
                /* Single click */
 
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);
 
133
                        GtkWidget *menu;
 
134
                        gtk_clist_select_row(GTK_CLIST(clist), row, column);
 
135
                        menu = create_mnu_player(row, is_friend, is_ignore);
 
136
 
 
137
                        gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL,
 
138
                                       NULL, buttonevent->button, 0);
 
139
                }
 
140
        }
 
141
 
 
142
        return FALSE;
 
143
}
 
144
 
 
145
 
 
146
static void client_player_clist_select_row(GtkCList * clist, gint row,
 
147
                                           gint column, GdkEvent * event,
 
148
                                           gpointer data)
 
149
{
 
150
 
 
151
}
 
152
 
 
153
 
 
154
static GtkWidget *create_mnu_player(int player_num, gboolean is_friend,
 
155
                                    gboolean is_ignore)
 
156
{
 
157
        GtkWidget *mnu_player;
 
158
#ifndef GTK2
 
159
        GtkAccelGroup *mnu_player_accels;
 
160
#endif
 
161
        GtkWidget *info;
 
162
        GtkWidget *separator9;
 
163
        GtkWidget *friends;
 
164
        GtkWidget *ignore;
 
165
 
 
166
        mnu_player = gtk_menu_new();
 
167
        gtk_object_set_data(GTK_OBJECT(mnu_player), "mnu_player", mnu_player);
 
168
#ifndef GTK2
 
169
        mnu_player_accels =
 
170
                gtk_menu_ensure_uline_accel_group(GTK_MENU(mnu_player));
 
171
#endif
 
172
 
 
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);
 
179
 
 
180
        separator9 = gtk_menu_item_new();
 
181
        gtk_widget_ref(separator9);
 
182
        gtk_object_set_data_full(GTK_OBJECT(mnu_player), "separator9",
 
183
                                 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);
 
188
 
 
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),
 
196
                                            TRUE);
 
197
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(friends),
 
198
                                       is_friend);
 
199
 
 
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),
 
207
                                            TRUE);
 
208
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(ignore),
 
209
                                       is_ignore);
 
210
 
 
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));
 
220
 
 
221
        return mnu_player;
 
222
}
 
223
 
 
224
 
 
225
void display_players(void)
 
226
{
 
227
        GtkWidget *tmp;
 
228
        gint i, num;
 
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 };
 
232
        gchar *path = NULL;
 
233
        GGZPlayer *p;
 
234
        GGZTable *table;
 
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;
 
239
        long highscore;
 
240
        char stats[512];
 
241
 
 
242
        /* Retrieve the player list (CList) widget. */
 
243
        tmp = lookup_widget(win_main, "player_clist");
 
244
 
 
245
        /* "Freeze" the clist.  This prevents any graphical updating
 
246
         * until we "thaw" it later. */
 
247
        gtk_clist_freeze(GTK_CLIST(tmp));
 
248
 
 
249
        /* Clear current list of players */
 
250
        gtk_clist_clear(GTK_CLIST(tmp));
 
251
 
 
252
        /* Display current list of players */
 
253
        num = ggzcore_room_get_num_players(room);
 
254
 
 
255
        for (i = 0; i < num; i++) {
 
256
                p = ggzcore_room_get_nth_player(room, i);
 
257
 
 
258
                table = ggzcore_player_get_table(p);
 
259
 
 
260
                /* These values are freed down below. */
 
261
                if (!table)
 
262
                        player[PLAYER_LIST_COL_TABLE] = g_strdup("--");
 
263
                else
 
264
                        player[PLAYER_LIST_COL_TABLE]
 
265
                                = g_strdup_printf("%d",
 
266
                                                  ggzcore_table_get_id
 
267
                                                  (table));
 
268
 
 
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,
 
276
                                                     &ties, &forfeits)) {
 
277
                        snprintf(stats, sizeof(stats), "%d-%d", wins, losses);
 
278
                        if (ties > 0) {
 
279
                                snprintf(stats + strlen(stats),
 
280
                                         sizeof(stats) - strlen(stats),
 
281
                                         "-%d", ties);
 
282
                        }
 
283
                        if (forfeits > 0) {
 
284
                                snprintf(stats + strlen(stats),
 
285
                                         sizeof(stats) - strlen(stats),
 
286
                                         " (%d)", forfeits);
 
287
                        }
 
288
                } else
 
289
                        snprintf(stats, sizeof(stats), "%s", "");
 
290
                player[PLAYER_LIST_COL_STATS] = stats;
 
291
 
 
292
                player[PLAYER_LIST_COL_NAME]
 
293
                        = g_strdup(ggzcore_player_get_name(p));
 
294
 
 
295
                gtk_clist_append(GTK_CLIST(tmp), player);
 
296
 
 
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);
 
316
 
 
317
                if (path) {
 
318
                        pixmap1 =
 
319
                                gdk_pixmap_create_from_xpm(tmp->window,
 
320
                                                           &mask1, NULL,
 
321
                                                           path);
 
322
                        if (pixmap1)
 
323
                                gtk_clist_set_pixmap(GTK_CLIST(tmp), i,
 
324
                                                     PLAYER_LIST_COL_LAG,
 
325
                                                     pixmap1, mask1);
 
326
                        g_free(path);
 
327
                }
 
328
 
 
329
 
 
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);
 
339
 
 
340
                if (path) {
 
341
                        pixmap2 =
 
342
                                gdk_pixmap_create_from_xpm(tmp->window,
 
343
                                                           &mask2, NULL,
 
344
                                                           path);
 
345
                        if (pixmap2)
 
346
                                gtk_clist_set_pixtext
 
347
                                        (GTK_CLIST(tmp), i,
 
348
                                         PLAYER_LIST_COL_NAME,
 
349
                                         player[PLAYER_LIST_COL_NAME],
 
350
                                         5, pixmap2, mask2);
 
351
                        g_free(path);
 
352
                }
 
353
 
 
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]);
 
358
        }
 
359
 
 
360
        /* "Thaw" the clist (it was "frozen" up above). */
 
361
        gtk_clist_thaw(GTK_CLIST(tmp));
 
362
}
 
363
 
 
364
GtkWidget *create_player_list(GtkWidget * window)
 
365
{
 
366
        GtkWidget *player_clist;
 
367
        GtkWidget *player_lag_label;
 
368
        GtkWidget *player_table_label;
 
369
        GtkWidget *player_record_label;
 
370
        GtkWidget *player_name_label;
 
371
 
 
372
        player_clist = gtk_clist_new(4);
 
373
        gtk_widget_ref(player_clist);
 
374
        gtk_object_set_data_full(GTK_OBJECT(window), "player_clist",
 
375
                                 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));
 
385
 
 
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",
 
389
                                 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,
 
393
                                    player_lag_label);
 
394
 
 
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",
 
398
                                 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,
 
402
                                    player_table_label);
 
403
 
 
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",
 
407
                                 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);
 
412
 
 
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",
 
416
                                 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,
 
420
                                    player_name_label);
 
421
 
 
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),
 
426
                           NULL);
 
427
 
 
428
        return player_clist;
 
429
}