Gnome basic functionality

- let the "#" key work as per Guidebook
- role selection didn't work if you had gender specified in your .nethackrc
  similar problems would occur for other .nethackrc selections
- fix an obvious memory leak
- fix one crash bug from accessing a freed pointer (M-? dismiss M-?)
- note some invalid behavior in comments for a real Gnome developer to fix
- reformatted some code so I could follow it
This commit is contained in:
cohrs
2002-03-17 20:16:57 +00:00
parent 0ffb78e6a4
commit 61b6bf1ce9
4 changed files with 207 additions and 204 deletions
+38 -40
View File
@@ -112,49 +112,50 @@ void gnome_init_nhwindows(int* argc, char** argv)
offers a Quit option, it is its responsibility to clean up and terminate offers a Quit option, it is its responsibility to clean up and terminate
the process. You need to fill in pl_character[0]. the process. You need to fill in pl_character[0].
*/ */
void gnome_player_selection() void
gnome_player_selection()
{ {
int num_roles, availcount, i, nRole; int num_roles, availcount, i, nRole;
const char** choices; const char** choices;
int* rolemap;
/* select a role */ /* select a role */
for (num_roles = 0; roles[num_roles].name.m; ++num_roles) continue; for (num_roles = 0; roles[num_roles].name.m; ++num_roles) continue;
choices = (const char **)alloc(sizeof(char *) * (num_roles+1)); choices = (const char **)alloc(sizeof(char *) * (num_roles+1));
for (;;) { rolemap = (int*)alloc(sizeof(int) * (num_roles + 1));
availcount = 0; for (;;) {
for (i = 0; i < num_roles; i++) { availcount = 0;
choices[i] = 0; for (i = 0; i < num_roles; i++) {
if (ok_role(i, flags.initrace, if (ok_role(i, flags.initrace, flags.initgend, flags.initalign)) {
flags.initgend, flags.initalign)) { choices[availcount] = roles[i].name.m;
choices[i] = roles[i].name.m; if (flags.initgend >= 0 && flags.female && roles[i].name.f)
if (flags.initgend >= 0 && flags.female && roles[i].name.f) choices[availcount] = roles[i].name.f;
choices[i] = roles[i].name.f; rolemap[availcount] = i;
++availcount; ++availcount;
} }
}
if (availcount > 0) break;
else if (flags.initalign >= 0) flags.initalign = -1; /* reset */
else if (flags.initgend >= 0) flags.initgend = -1;
else if (flags.initrace >= 0) flags.initrace = -1;
else panic("no available ROLE+race+gender+alignment combinations");
} }
if (availcount > 0) break; choices[availcount] = (const char *) 0;
else if (flags.initalign >= 0) flags.initalign = -1; /* reset */ nRole = ghack_player_sel_dialog(choices);
else if (flags.initgend >= 0) flags.initgend = -1;
else if (flags.initrace >= 0) flags.initrace = -1;
else panic("no available ROLE+race+gender+alignment combinations");
}
choices[num_roles] = (const char *) 0;
nRole=ghack_player_sel_dialog(choices);
/* Quit */ if (nRole == -1) { /* Quit */
if ( nRole == -1 ) clearlocks();
{ gnome_exit_nhwindows(0);
clearlocks(); } else if (nRole == -2) { /* Random role */
gnome_exit_nhwindows(0); nRole = rolemap[rn2(availcount)];
} pline("This game you will be %s", an(choices[nRole]));
/* Random role */ } else {
if ( nRole == -2) nRole = rolemap[nRole];
{
nRole = rn2(num_roles);
pline("This game you will be %s", an(choices[nRole]));
} }
flags.initrole = nRole; flags.initrole = nRole;
free(choices);
free(rolemap);
} }
@@ -1008,6 +1009,3 @@ void gnome_outrip(winid wid, int how)
ghack_text_window_rip_string( ripString); ghack_text_window_rip_string( ripString);
} }
+3 -2
View File
@@ -138,7 +138,8 @@ ghack_about_cb(GtkWidget *widget, gpointer data)
_("\nSend comments and bug reports to: nethack-bugs@nethack.org\n" _("\nSend comments and bug reports to: nethack-bugs@nethack.org\n"
"This game is free software. See License for details.")); "This game is free software. See License for details."));
about = gnome_about_new(_("Nethack"), about = gnome_about_new(_("Nethack"),
buf1, "(C) 1985-2000 Mike Stephenson", (const char **)authors, buf, buf1, "Copyright (C) 1985-2002 Mike Stephenson",
(const char **)authors, buf,
NULL); NULL);
gtk_signal_connect (GTK_OBJECT (about), "destroy", gtk_signal_connect (GTK_OBJECT (about), "destroy",
@@ -720,6 +721,7 @@ void ghack_init_main_window( int argc, char** argv)
if (uid != euid) if (uid != euid)
setuid(uid); setuid(uid);
hide_privileges(TRUE); hide_privileges(TRUE);
/* XXX gnome_init must print nethack options for --help, but does not */
gnome_init ("nethack", VERSION_STRING, argc, argv); gnome_init ("nethack", VERSION_STRING, argc, argv);
hide_privileges(FALSE); hide_privileges(FALSE);
parse_args (argc, argv); parse_args (argc, argv);
@@ -821,4 +823,3 @@ ghack_get_main_window()
{ {
return( GTK_WIDGET(mainWindow) ); return( GTK_WIDGET(mainWindow) );
} }
+163 -162
View File
@@ -248,193 +248,194 @@ ghack_handle_button_press(GtkWidget *widget, GdkEventButton *event,
void void
ghack_handle_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) ghack_handle_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data)
{ {
int key=0; static int was_pound = 0;
int ctl=GDK_CONTROL_MASK; int key = 0;
int alt=GDK_MOD1_MASK; int ctl = GDK_CONTROL_MASK;
int alt = GDK_MOD1_MASK;
/* Turn this on to debug key events */ /* Turn this on to debug key events */
#if 0 #if 0
g_message("I got a \"%s\" key (%d) %s%s", g_message("I got a \"%s\" key (%d) %s%s",
gdk_keyval_name (event->keyval), event->keyval, gdk_keyval_name (event->keyval), event->keyval,
(event->state&ctl)? "+CONTROL":"", (event->state&alt)? "+ALT":""); (event->state&ctl)? "+CONTROL":"", (event->state&alt)? "+ALT":"");
#endif #endif
switch (event->keyval) { switch (event->keyval) {
/* special keys to do stuff with */ /* special keys to do stuff with */
/* Set up the direction keys */ /* Set up the direction keys */
/* First handle the arrow keys -- these always mean move */ /* First handle the arrow keys -- these always mean move */
case GDK_Right: case GDK_Right:
case GDK_rightarrow: case GDK_rightarrow:
if (iflags.num_pad) key='6'; else key='l'; break; if (iflags.num_pad) key='6'; else key='l'; break;
case GDK_Left: case GDK_Left:
case GDK_leftarrow: case GDK_leftarrow:
if (iflags.num_pad) key='4'; else key='h'; break; if (iflags.num_pad) key='4'; else key='h'; break;
case GDK_Up: case GDK_Up:
case GDK_uparrow: case GDK_uparrow:
if (iflags.num_pad) key='8'; else key='k'; break; if (iflags.num_pad) key='8'; else key='k'; break;
case GDK_Down: case GDK_Down:
case GDK_downarrow: case GDK_downarrow:
if (iflags.num_pad) key='2'; else key='j'; break; if (iflags.num_pad) key='2'; else key='j'; break;
case GDK_Home: case GDK_Home:
if (iflags.num_pad) key='7'; else key='y'; break; if (iflags.num_pad) key='7'; else key='y'; break;
case GDK_End: case GDK_End:
if (iflags.num_pad) key='1'; else key='b'; break; if (iflags.num_pad) key='1'; else key='b'; break;
case GDK_Page_Down: case GDK_Page_Down:
if (iflags.num_pad) key='3'; else key='n'; break; if (iflags.num_pad) key='3'; else key='n'; break;
case GDK_Page_Up: case GDK_Page_Up:
if (iflags.num_pad) key='9'; else key='u'; break; if (iflags.num_pad) key='9'; else key='u'; break;
case ' ': key='.'; break; case ' ': key='.'; break;
/* Now, handle the numberpad (move or numbers) */ /* Now, handle the numberpad (move or numbers) */
case GDK_KP_Right: case GDK_KP_Right:
case GDK_KP_6: case GDK_KP_6:
if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad)
key = GDK_KP_6; key = GDK_KP_6;
else else
key='6'; key='6';
break; break;
case GDK_KP_Left: case GDK_KP_Left:
case GDK_KP_4: case GDK_KP_4:
if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad)
key = GDK_KP_4; key = GDK_KP_4;
else else
key='4'; key='4';
break; break;
case GDK_KP_Up: case GDK_KP_Up:
case GDK_KP_8: case GDK_KP_8:
if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad)
key = GDK_KP_8; key = GDK_KP_8;
else else
key='8'; key='8';
break; break;
case GDK_KP_Down: case GDK_KP_Down:
case GDK_KP_2: case GDK_KP_2:
if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad)
key = GDK_KP_2; key = GDK_KP_2;
else else
key='2'; key='2';
break; break;
/* Move Top-Left */ /* Move Top-Left */
case GDK_KP_Home: case GDK_KP_Home:
case GDK_KP_7: case GDK_KP_7:
if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad)
key = GDK_KP_7; key = GDK_KP_7;
else else
key='7'; key='7';
break; break;
case GDK_KP_Page_Up: case GDK_KP_Page_Up:
case GDK_KP_9: case GDK_KP_9:
if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad)
key = GDK_KP_9; key = GDK_KP_9;
else else
key='9'; key='9';
break; break;
case GDK_KP_End: case GDK_KP_End:
case GDK_KP_1: case GDK_KP_1:
if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad)
key = GDK_KP_1; key = GDK_KP_1;
else else
key='1'; key='1';
break; break;
case GDK_KP_Page_Down: case GDK_KP_Page_Down:
case GDK_KP_3: case GDK_KP_3:
if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad)
key = GDK_KP_3; key = GDK_KP_3;
else else
key='3'; key='3';
break; break;
case GDK_KP_5: case GDK_KP_5:
if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad)
key = GDK_KP_5; key = GDK_KP_5;
else else
key='5'; key='5';
break; break;
case GDK_KP_Delete: case GDK_KP_Delete:
case GDK_KP_Decimal: case GDK_KP_Decimal:
key='.'; key='.';
break; break;
/* We don't bother using the "#" key for extended commands. Instead, /* can't just ignore "#", it's a core feature */
* we will just use the ALT key.*/ case GDK_numbersign:
case GDK_numbersign: was_pound = 1;
break; return;
/* We will probably want to do something with these later... */ /* We will probably want to do something with these later... */
case GDK_KP_Begin: case GDK_KP_Begin:
case GDK_KP_F1: case GDK_KP_F1:
case GDK_F1: case GDK_F1:
case GDK_KP_F2: case GDK_KP_F2:
case GDK_F2: case GDK_F2:
case GDK_KP_F3: case GDK_KP_F3:
case GDK_F3: case GDK_F3:
case GDK_KP_F4: case GDK_KP_F4:
case GDK_F4: case GDK_F4:
case GDK_F5: case GDK_F5:
case GDK_F6: case GDK_F6:
case GDK_F7: case GDK_F7:
case GDK_F8: case GDK_F8:
case GDK_F9: case GDK_F9:
case GDK_F10: case GDK_F10:
case GDK_F11: case GDK_F11:
case GDK_F12: case GDK_F12:
break; break;
/* various keys to ignore */ /* various keys to ignore */
case GDK_KP_Insert: case GDK_KP_Insert:
case GDK_Insert: case GDK_Insert:
case GDK_Delete: case GDK_Delete:
case GDK_Print: case GDK_Print:
case GDK_BackSpace: case GDK_BackSpace:
case GDK_Pause: case GDK_Pause:
case GDK_Scroll_Lock: case GDK_Scroll_Lock:
case GDK_Shift_Lock: case GDK_Shift_Lock:
case GDK_Num_Lock: case GDK_Num_Lock:
case GDK_Caps_Lock: case GDK_Caps_Lock:
case GDK_Control_L: case GDK_Control_L:
case GDK_Control_R: case GDK_Control_R:
case GDK_Shift_L: case GDK_Shift_L:
case GDK_Shift_R: case GDK_Shift_R:
case GDK_Alt_L: case GDK_Alt_L:
case GDK_Alt_R: case GDK_Alt_R:
case GDK_Meta_L: case GDK_Meta_L:
case GDK_Meta_R: case GDK_Meta_R:
case GDK_Mode_switch: case GDK_Mode_switch:
case GDK_Multi_key: case GDK_Multi_key:
return; return;
default: default:
key = event->keyval; key = event->keyval;
} }
if (event->state & alt) { if ((event->state & alt) || was_pound) {
key=M(event->keyval); key=M(event->keyval);
} } else if (event->state & ctl) {
else if (event->state & ctl) {
key=C(event->keyval); key=C(event->keyval);
} }
if (was_pound) {
was_pound = 0;
}
/* Ok, here is where we do clever stuff to overide the default /* Ok, here is where we do clever stuff to overide the default
* game behavior */ * game behavior */
if (g_askingQuestion==0) { if (g_askingQuestion == 0) {
if (key == 'S' || key == M('S') || key == C('S')) { if (key == 'S' || key == M('S') || key == C('S')) {
ghack_save_game_cb( NULL, NULL); ghack_save_game_cb( NULL, NULL);
return; return;
} }
} }
g_keyBuffer = g_list_prepend (g_keyBuffer, GINT_TO_POINTER( key)); g_keyBuffer = g_list_prepend (g_keyBuffer, GINT_TO_POINTER( key));
g_numKeys++; g_numKeys++;
} }
+3
View File
@@ -40,6 +40,7 @@ void ghack_text_window_clear(GtkWidget *widget, gpointer data)
void ghack_text_window_destroy() void ghack_text_window_destroy()
{ {
TW_window = NULL;
} }
void ghack_text_window_display(GtkWidget *widget, boolean block, void ghack_text_window_display(GtkWidget *widget, boolean block,
@@ -50,6 +51,8 @@ void ghack_text_window_display(GtkWidget *widget, boolean block,
gtk_window_set_title(GTK_WINDOW( TW_window), "Rest In Peace"); gtk_window_set_title(GTK_WINDOW( TW_window), "Rest In Peace");
} }
gtk_signal_connect (GTK_OBJECT (TW_window), "destroy",
(GtkSignalFunc) ghack_text_window_destroy, NULL);
if (block) if (block)
gnome_dialog_run(GNOME_DIALOG(TW_window)); gnome_dialog_run(GNOME_DIALOG(TW_window));
else else