1 /*	SCCS Id: @(#)gnopts.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 "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"),
44 			    GNOME_STOCK_BUTTON_OK,
45 			    GNOME_STOCK_BUTTON_CANCEL,
46 			    NULL);
47     gnome_dialog_close_hides (GNOME_DIALOG (dialog), FALSE);
48     gtk_signal_connect (GTK_OBJECT (dialog), "key_press_event",
49 		      GTK_SIGNAL_FUNC (opt_sel_key_hit), tilesets );
50 
51     frame1 = gtk_frame_new (_("Choose one of the following tilesets:"));
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, GTK_POLICY_AUTOMATIC);
63 
64     gtk_signal_connect (GTK_OBJECT (clist), "select_row",
65 			GTK_SIGNAL_FUNC (opt_sel_row_selected), NULL );
66 
67     gtk_container_add (GTK_CONTAINER (frame1), swin);
68     gtk_box_pack_start_defaults (GTK_BOX (GNOME_DIALOG (dialog)->vbox), frame1);
69 
70     /* Add the tilesets into the list here... */
71     for (i=0; tilesets[i]; i++) {
72 	    gchar accelBuf[BUFSZ];
73 	    const char *text[3]={accelBuf, tilesets[i],NULL};
74 	    sprintf( accelBuf, "%c ", tolower(tilesets[i][0]));
75 	    gtk_clist_insert (GTK_CLIST (clist), i, (char**)text);
76     }
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 (GNOME_DIALOG (dialog));
90     gnome_dialog_close (GNOME_DIALOG (dialog));
91 
92     /* They hit Quit or error */
93     if (i != 0 ) {
94 	return;
95     }
96     switch (tileset) {
97 	case 0:
98 	    /* They selected traditional */
99 	    ghack_free_glyphs();
100 	    if (ghack_init_glyphs(HACKDIR "/x11tiles"))
101 		      g_error ("ERROR:  Could not initialize glyphs.\n");
102 	    ghack_reinit_map_window();
103 	    break;
104 	case 1:
105 	    ghack_free_glyphs();
106 	    if (ghack_init_glyphs(HACKDIR "/t32-1024.xpm"))
107 		      g_error ("ERROR:  Could not initialize glyphs.\n");
108 	    ghack_reinit_map_window();
109 
110 	    /* They selected big */
111 	    break;
112 	default:
113 	    /* This shouldn't happen */
114 	    g_warning("This shouldn't happen\n");
115     }
116 }
117 
118