1 /* NetHack 3.6	gnopts.c	$NHDT-Date: 1432512805 2015/05/25 00:13:25 $  $NHDT-Branch: master $:$NHDT-Revision: 1.9 $ */
2 /* Copyright (C) 1998 by Erik Andersen <andersee@debian.org> */
3 /* NetHack may be freely redistributed.  See license for details. */
4 
5 #include "gnopts.h"
6 #include "gnglyph.h"
7 #include "gnmain.h"
8 #include "gnmap.h"
9 #include <gnome.h>
10 #include <ctype.h>
11 #include "hack.h"
12 
13 static gint tileset;
14 static GtkWidget *clist;
15 const char *tilesets[] = { "Traditional (16x16)", "Big (32x32)", 0 };
16 
17 static void
opt_sel_key_hit(GtkWidget * widget,GdkEventKey * event,gpointer data)18 opt_sel_key_hit(GtkWidget *widget, GdkEventKey *event, gpointer data)
19 {
20     int i;
21     for (i = 0; tilesets[i] != 0; ++i) {
22         if (tilesets[i][0] == toupper(event->keyval)) {
23             tileset = i;
24             gtk_clist_select_row(GTK_CLIST(clist), i, 0);
25         }
26     }
27 }
28 
29 static void
opt_sel_row_selected(GtkCList * cList,int row,int col,GdkEvent * event)30 opt_sel_row_selected(GtkCList *cList, int row, int col, GdkEvent *event)
31 {
32     tileset = row;
33 }
34 
35 void
ghack_settings_dialog()36 ghack_settings_dialog()
37 {
38     int i;
39     static GtkWidget *dialog;
40     static GtkWidget *swin;
41     static GtkWidget *frame1;
42 
43     dialog = gnome_dialog_new(_("GnomeHack Settings"), GNOME_STOCK_BUTTON_OK,
44                               GNOME_STOCK_BUTTON_CANCEL, NULL);
45     gnome_dialog_close_hides(GNOME_DIALOG(dialog), FALSE);
46     gtk_signal_connect(GTK_OBJECT(dialog), "key_press_event",
47                        GTK_SIGNAL_FUNC(opt_sel_key_hit), tilesets);
48 
49     frame1 = gtk_frame_new(_("Choose one of the following tilesets:"));
50     gtk_object_set_data(GTK_OBJECT(dialog), "frame1", frame1);
51     gtk_widget_show(frame1);
52     gtk_container_border_width(GTK_CONTAINER(frame1), 3);
53 
54     swin = gtk_scrolled_window_new(NULL, NULL);
55     clist = gtk_clist_new(2);
56     gtk_clist_column_titles_hide(GTK_CLIST(clist));
57     gtk_widget_set_usize(GTK_WIDGET(clist), 100, 180);
58     gtk_container_add(GTK_CONTAINER(swin), clist);
59     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swin),
60                                    GTK_POLICY_AUTOMATIC,
61                                    GTK_POLICY_AUTOMATIC);
62 
63     gtk_signal_connect(GTK_OBJECT(clist), "select_row",
64                        GTK_SIGNAL_FUNC(opt_sel_row_selected), NULL);
65 
66     gtk_container_add(GTK_CONTAINER(frame1), swin);
67     gtk_box_pack_start_defaults(GTK_BOX(GNOME_DIALOG(dialog)->vbox), frame1);
68 
69     /* Add the tilesets into the list here... */
70     for (i = 0; tilesets[i]; i++) {
71         gchar accelBuf[BUFSZ];
72         const char *text[3] = { accelBuf, tilesets[i], NULL };
73         sprintf(accelBuf, "%c ", tolower(tilesets[i][0]));
74         gtk_clist_insert(GTK_CLIST(clist), i, (char **) text);
75     }
76 
77     gtk_clist_columns_autosize(GTK_CLIST(clist));
78     gtk_widget_show_all(swin);
79 
80     /* Center the dialog over over parent */
81     gnome_dialog_set_default(GNOME_DIALOG(dialog), 0);
82     gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
83     gnome_dialog_set_parent(GNOME_DIALOG(dialog),
84                             GTK_WINDOW(ghack_get_main_window()));
85 
86     /* Run the dialog -- returning whichever button was pressed */
87     i = gnome_dialog_run(GNOME_DIALOG(dialog));
88     gnome_dialog_close(GNOME_DIALOG(dialog));
89 
90     /* They hit Quit or error */
91     if (i != 0) {
92         return;
93     }
94     switch (tileset) {
95     case 0:
96         /* They selected traditional */
97         ghack_free_glyphs();
98         if (ghack_init_glyphs(HACKDIR "/x11tiles"))
99             g_error("ERROR:  Could not initialize glyphs.\n");
100         ghack_reinit_map_window();
101         break;
102     case 1:
103         ghack_free_glyphs();
104         if (ghack_init_glyphs(HACKDIR "/t32-1024.xpm"))
105             g_error("ERROR:  Could not initialize glyphs.\n");
106         ghack_reinit_map_window();
107 
108         /* They selected big */
109         break;
110     default:
111         /* This shouldn't happen */
112         g_warning("This shouldn't happen\n");
113     }
114 }
115