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