1 /* SCCS Id: @(#)gnplayer.c 3.4 2000/07/16 */
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),
24 i) != 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,
38 const gchar* title,
39 const gchar* prompt)
40 {
41 int i;
42 static GtkWidget* dialog;
43 static GtkWidget* swin;
44 static GtkWidget* frame1;
45
46 dialog = gnome_dialog_new(title,
47 GNOME_STOCK_BUTTON_OK,
48 _("Random"),
49 GNOME_STOCK_BUTTON_CANCEL,
50 NULL);
51 gnome_dialog_close_hides (GNOME_DIALOG (dialog), FALSE);
52 gtk_signal_connect (GTK_OBJECT (dialog), "key_press_event",
53 GTK_SIGNAL_FUNC (player_sel_key_hit), choices );
54
55 frame1 = gtk_frame_new(prompt);
56 gtk_object_set_data (GTK_OBJECT (dialog), "frame1", frame1);
57 gtk_widget_show (frame1);
58 gtk_container_border_width (GTK_CONTAINER (frame1), 3);
59
60 swin = gtk_scrolled_window_new (NULL, NULL);
61 clist = gtk_clist_new (2);
62 gtk_clist_column_titles_hide (GTK_CLIST (clist));
63 gtk_widget_set_usize (GTK_WIDGET (clist), 100, 180);
64 gtk_container_add (GTK_CONTAINER (swin), clist);
65 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin),
66 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
67
68 gtk_signal_connect (GTK_OBJECT (clist), "select_row",
69 GTK_SIGNAL_FUNC (player_sel_row_selected), NULL );
70
71 gtk_container_add (GTK_CONTAINER (frame1), swin);
72 gtk_box_pack_start_defaults (GTK_BOX (GNOME_DIALOG (dialog)->vbox), frame1);
73
74 /* Add the roles into the list here... */
75 for (i=0; choices[i]; i++) {
76 gchar accelBuf[BUFSZ];
77 const char *text[3]={accelBuf, choices[i],NULL};
78 sprintf( accelBuf, "%c ", tolower(choices[i][0]));
79 gtk_clist_insert (GTK_CLIST (clist), i, (char**)text);
80 }
81
82 gtk_clist_columns_autosize (GTK_CLIST (clist));
83 gtk_widget_show_all (swin);
84
85 /* Center the dialog over over parent */
86 gnome_dialog_set_default( GNOME_DIALOG(dialog), 0);
87 gtk_window_set_modal( GTK_WINDOW(dialog), TRUE);
88 gnome_dialog_set_parent (GNOME_DIALOG (dialog),
89 GTK_WINDOW (ghack_get_main_window ()) );
90
91 /* Run the dialog -- returning whichever button was pressed */
92 i = gnome_dialog_run_and_close(GNOME_DIALOG(dialog));
93
94 /* Quit on button 2 or error */
95 if (i < 0 || i > 1) {
96 return(ROLE_NONE);
97 }
98 /* Random is button 1*/
99 if (i == 1 ) {
100 return(ROLE_RANDOM);
101 }
102 return ( role_number);
103 }
104