1 /* NetHack 3.6	gnplayer.c	$NHDT-Date: 1432512806 2015/05/25 00:13:26 $  $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ */
2 /* Copyright (C) 1998 by Erik Andersen <andersee@debian.org> */
3 /* NetHack may be freely redistributed.  See license for details. */
4 
5 #include <gnome.h>
6 #include <ctype.h>
7 #include "gnplayer.h"
8 #include "gnmain.h"
9 #include "hack.h"
10 
11 static gint role_number;
12 static GtkWidget *clist;
13 
14 static void
player_sel_key_hit(GtkWidget * widget,GdkEventKey * event,gpointer data)15 player_sel_key_hit(GtkWidget *widget, GdkEventKey *event, gpointer data)
16 {
17     const char **roles = data;
18     int i;
19     for (i = 0; roles[i] != 0; ++i) {
20         if (tolower(roles[i][0]) == tolower(event->keyval)) {
21             role_number = i;
22             gtk_clist_select_row(GTK_CLIST(clist), i, 0);
23             if (gtk_clist_row_is_visible(GTK_CLIST(clist), i)
24                 != GTK_VISIBILITY_FULL)
25                 gtk_clist_moveto(GTK_CLIST(clist), i, 0, 0.5, 0);
26         }
27     }
28 }
29 
30 static void
player_sel_row_selected(GtkCList * clist,int row,int col,GdkEvent * event)31 player_sel_row_selected(GtkCList *clist, int row, int col, GdkEvent *event)
32 {
33     role_number = row;
34 }
35 
36 int
ghack_player_sel_dialog(const char ** choices,const gchar * title,const gchar * prompt)37 ghack_player_sel_dialog(const char **choices, const gchar *title,
38                         const gchar *prompt)
39 {
40     int i;
41     static GtkWidget *dialog;
42     static GtkWidget *swin;
43     static GtkWidget *frame1;
44 
45     dialog = gnome_dialog_new(title, GNOME_STOCK_BUTTON_OK, _("Random"),
46                               GNOME_STOCK_BUTTON_CANCEL, NULL);
47     gnome_dialog_close_hides(GNOME_DIALOG(dialog), FALSE);
48     gtk_signal_connect(GTK_OBJECT(dialog), "key_press_event",
49                        GTK_SIGNAL_FUNC(player_sel_key_hit), choices);
50 
51     frame1 = gtk_frame_new(prompt);
52     gtk_object_set_data(GTK_OBJECT(dialog), "frame1", frame1);
53     gtk_widget_show(frame1);
54     gtk_container_border_width(GTK_CONTAINER(frame1), 3);
55 
56     swin = gtk_scrolled_window_new(NULL, NULL);
57     clist = gtk_clist_new(2);
58     gtk_clist_column_titles_hide(GTK_CLIST(clist));
59     gtk_widget_set_usize(GTK_WIDGET(clist), 100, 180);
60     gtk_container_add(GTK_CONTAINER(swin), clist);
61     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swin),
62                                    GTK_POLICY_AUTOMATIC,
63                                    GTK_POLICY_AUTOMATIC);
64 
65     gtk_signal_connect(GTK_OBJECT(clist), "select_row",
66                        GTK_SIGNAL_FUNC(player_sel_row_selected), NULL);
67 
68     gtk_container_add(GTK_CONTAINER(frame1), swin);
69     gtk_box_pack_start_defaults(GTK_BOX(GNOME_DIALOG(dialog)->vbox), frame1);
70 
71     /* Add the roles into the list here... */
72     for (i = 0; choices[i]; i++) {
73         gchar accelBuf[BUFSZ];
74         const char *text[3] = { accelBuf, choices[i], NULL };
75         sprintf(accelBuf, "%c ", tolower(choices[i][0]));
76         gtk_clist_insert(GTK_CLIST(clist), i, (char **) text);
77     }
78 
79     gtk_clist_columns_autosize(GTK_CLIST(clist));
80     gtk_widget_show_all(swin);
81 
82     /* Center the dialog over over parent */
83     gnome_dialog_set_default(GNOME_DIALOG(dialog), 0);
84     gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
85     gnome_dialog_set_parent(GNOME_DIALOG(dialog),
86                             GTK_WINDOW(ghack_get_main_window()));
87 
88     /* Run the dialog -- returning whichever button was pressed */
89     i = gnome_dialog_run_and_close(GNOME_DIALOG(dialog));
90 
91     /* Quit on button 2 or error */
92     if (i < 0 || i > 1) {
93         return (ROLE_NONE);
94     }
95     /* Random is button 1*/
96     if (i == 1) {
97         return (ROLE_RANDOM);
98     }
99     return (role_number);
100 }
101