diff --git a/win/gnome/gnbind.c b/win/gnome/gnbind.c index c53c35525..1ca3577c6 100644 --- a/win/gnome/gnbind.c +++ b/win/gnome/gnbind.c @@ -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 the process. You need to fill in pl_character[0]. */ -void gnome_player_selection() +void +gnome_player_selection() { - int num_roles, availcount, i, nRole; - const char** choices; + int num_roles, availcount, i, nRole; + const char** choices; + int* rolemap; - /* select a role */ - for (num_roles = 0; roles[num_roles].name.m; ++num_roles) continue; - choices = (const char **)alloc(sizeof(char *) * (num_roles+1)); - for (;;) { - availcount = 0; - for (i = 0; i < num_roles; i++) { - choices[i] = 0; - if (ok_role(i, flags.initrace, - flags.initgend, flags.initalign)) { - choices[i] = roles[i].name.m; - if (flags.initgend >= 0 && flags.female && roles[i].name.f) - choices[i] = roles[i].name.f; - ++availcount; - } + /* select a role */ + for (num_roles = 0; roles[num_roles].name.m; ++num_roles) continue; + choices = (const char **)alloc(sizeof(char *) * (num_roles+1)); + rolemap = (int*)alloc(sizeof(int) * (num_roles + 1)); + for (;;) { + availcount = 0; + for (i = 0; i < num_roles; i++) { + if (ok_role(i, flags.initrace, flags.initgend, flags.initalign)) { + choices[availcount] = roles[i].name.m; + if (flags.initgend >= 0 && flags.female && roles[i].name.f) + choices[availcount] = roles[i].name.f; + rolemap[availcount] = i; + ++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; - 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"); - } - choices[num_roles] = (const char *) 0; - nRole=ghack_player_sel_dialog(choices); + choices[availcount] = (const char *) 0; + nRole = ghack_player_sel_dialog(choices); - /* Quit */ - if ( nRole == -1 ) - { - clearlocks(); - gnome_exit_nhwindows(0); - } - /* Random role */ - if ( nRole == -2) - { - nRole = rn2(num_roles); - pline("This game you will be %s", an(choices[nRole])); + if (nRole == -1) { /* Quit */ + clearlocks(); + gnome_exit_nhwindows(0); + } else if (nRole == -2) { /* Random role */ + nRole = rolemap[rn2(availcount)]; + pline("This game you will be %s", an(choices[nRole])); + } else { + nRole = rolemap[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); } - - - diff --git a/win/gnome/gnmain.c b/win/gnome/gnmain.c index 9ddaf8efe..1ca8f0367 100644 --- a/win/gnome/gnmain.c +++ b/win/gnome/gnmain.c @@ -138,7 +138,8 @@ ghack_about_cb(GtkWidget *widget, gpointer data) _("\nSend comments and bug reports to: nethack-bugs@nethack.org\n" "This game is free software. See License for details.")); 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); gtk_signal_connect (GTK_OBJECT (about), "destroy", @@ -720,6 +721,7 @@ void ghack_init_main_window( int argc, char** argv) if (uid != euid) setuid(uid); hide_privileges(TRUE); + /* XXX gnome_init must print nethack options for --help, but does not */ gnome_init ("nethack", VERSION_STRING, argc, argv); hide_privileges(FALSE); parse_args (argc, argv); @@ -821,4 +823,3 @@ ghack_get_main_window() { return( GTK_WIDGET(mainWindow) ); } - diff --git a/win/gnome/gnsignal.c b/win/gnome/gnsignal.c index e8168571c..038797584 100644 --- a/win/gnome/gnsignal.c +++ b/win/gnome/gnsignal.c @@ -248,193 +248,194 @@ ghack_handle_button_press(GtkWidget *widget, GdkEventButton *event, void ghack_handle_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) { - int key=0; - int ctl=GDK_CONTROL_MASK; - int alt=GDK_MOD1_MASK; + static int was_pound = 0; + int key = 0; + 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 - g_message("I got a \"%s\" key (%d) %s%s", - gdk_keyval_name (event->keyval), event->keyval, - (event->state&ctl)? "+CONTROL":"", (event->state&alt)? "+ALT":""); + g_message("I got a \"%s\" key (%d) %s%s", + gdk_keyval_name (event->keyval), event->keyval, + (event->state&ctl)? "+CONTROL":"", (event->state&alt)? "+ALT":""); #endif - switch (event->keyval) { - /* special keys to do stuff with */ + switch (event->keyval) { + /* 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 */ - case GDK_Right: - case GDK_rightarrow: - if (iflags.num_pad) key='6'; else key='l'; break; - case GDK_Left: - case GDK_leftarrow: - if (iflags.num_pad) key='4'; else key='h'; break; - case GDK_Up: - case GDK_uparrow: - if (iflags.num_pad) key='8'; else key='k'; break; - case GDK_Down: - case GDK_downarrow: - if (iflags.num_pad) key='2'; else key='j'; break; - case GDK_Home: - if (iflags.num_pad) key='7'; else key='y'; break; - case GDK_End: - if (iflags.num_pad) key='1'; else key='b'; break; - case GDK_Page_Down: - if (iflags.num_pad) key='3'; else key='n'; break; - case GDK_Page_Up: - if (iflags.num_pad) key='9'; else key='u'; break; - case ' ': key='.'; break; + /* First handle the arrow keys -- these always mean move */ + case GDK_Right: + case GDK_rightarrow: + if (iflags.num_pad) key='6'; else key='l'; break; + case GDK_Left: + case GDK_leftarrow: + if (iflags.num_pad) key='4'; else key='h'; break; + case GDK_Up: + case GDK_uparrow: + if (iflags.num_pad) key='8'; else key='k'; break; + case GDK_Down: + case GDK_downarrow: + if (iflags.num_pad) key='2'; else key='j'; break; + case GDK_Home: + if (iflags.num_pad) key='7'; else key='y'; break; + case GDK_End: + if (iflags.num_pad) key='1'; else key='b'; break; + case GDK_Page_Down: + if (iflags.num_pad) key='3'; else key='n'; break; + case GDK_Page_Up: + if (iflags.num_pad) key='9'; else key='u'; break; + case ' ': key='.'; break; - /* Now, handle the numberpad (move or numbers) */ - case GDK_KP_Right: - case GDK_KP_6: - if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) - key = GDK_KP_6; - else - key='6'; - break; + /* Now, handle the numberpad (move or numbers) */ + case GDK_KP_Right: + case GDK_KP_6: + if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) + key = GDK_KP_6; + else + key='6'; + break; - case GDK_KP_Left: - case GDK_KP_4: - if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) - key = GDK_KP_4; - else - key='4'; - break; + case GDK_KP_Left: + case GDK_KP_4: + if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) + key = GDK_KP_4; + else + key='4'; + break; - case GDK_KP_Up: - case GDK_KP_8: - if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) - key = GDK_KP_8; - else - key='8'; - break; + case GDK_KP_Up: + case GDK_KP_8: + if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) + key = GDK_KP_8; + else + key='8'; + break; - case GDK_KP_Down: - case GDK_KP_2: - if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) - key = GDK_KP_2; - else - key='2'; - break; + case GDK_KP_Down: + case GDK_KP_2: + if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) + key = GDK_KP_2; + else + key='2'; + break; - /* Move Top-Left */ - case GDK_KP_Home: - case GDK_KP_7: - if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) - key = GDK_KP_7; - else - key='7'; - break; + /* Move Top-Left */ + case GDK_KP_Home: + case GDK_KP_7: + if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) + key = GDK_KP_7; + else + key='7'; + break; - case GDK_KP_Page_Up: - case GDK_KP_9: - if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) - key = GDK_KP_9; - else - key='9'; - break; + case GDK_KP_Page_Up: + case GDK_KP_9: + if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) + key = GDK_KP_9; + else + key='9'; + break; - case GDK_KP_End: - case GDK_KP_1: - if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) - key = GDK_KP_1; - else - key='1'; - break; + case GDK_KP_End: + case GDK_KP_1: + if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) + key = GDK_KP_1; + else + key='1'; + break; - case GDK_KP_Page_Down: - case GDK_KP_3: - if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) - key = GDK_KP_3; - else - key='3'; - break; + case GDK_KP_Page_Down: + case GDK_KP_3: + if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) + key = GDK_KP_3; + else + key='3'; + break; - case GDK_KP_5: - if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) - key = GDK_KP_5; - else - key='5'; - break; + case GDK_KP_5: + if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) + key = GDK_KP_5; + else + key='5'; + break; - case GDK_KP_Delete: - case GDK_KP_Decimal: - key='.'; - break; + case GDK_KP_Delete: + case GDK_KP_Decimal: + key='.'; + break; - /* We don't bother using the "#" key for extended commands. Instead, - * we will just use the ALT key.*/ - case GDK_numbersign: - break; + /* can't just ignore "#", it's a core feature */ + case GDK_numbersign: + was_pound = 1; + return; - /* We will probably want to do something with these later... */ - case GDK_KP_Begin: - case GDK_KP_F1: - case GDK_F1: - case GDK_KP_F2: - case GDK_F2: - case GDK_KP_F3: - case GDK_F3: - case GDK_KP_F4: - case GDK_F4: - case GDK_F5: - case GDK_F6: - case GDK_F7: - case GDK_F8: - case GDK_F9: - case GDK_F10: - case GDK_F11: - case GDK_F12: - break; - /* various keys to ignore */ - case GDK_KP_Insert: - case GDK_Insert: - case GDK_Delete: - case GDK_Print: - case GDK_BackSpace: - case GDK_Pause: - case GDK_Scroll_Lock: - case GDK_Shift_Lock: - case GDK_Num_Lock: - case GDK_Caps_Lock: - case GDK_Control_L: - case GDK_Control_R: - case GDK_Shift_L: - case GDK_Shift_R: - case GDK_Alt_L: - case GDK_Alt_R: - case GDK_Meta_L: - case GDK_Meta_R: - case GDK_Mode_switch: - case GDK_Multi_key: - return; + /* We will probably want to do something with these later... */ + case GDK_KP_Begin: + case GDK_KP_F1: + case GDK_F1: + case GDK_KP_F2: + case GDK_F2: + case GDK_KP_F3: + case GDK_F3: + case GDK_KP_F4: + case GDK_F4: + case GDK_F5: + case GDK_F6: + case GDK_F7: + case GDK_F8: + case GDK_F9: + case GDK_F10: + case GDK_F11: + case GDK_F12: + break; + /* various keys to ignore */ + case GDK_KP_Insert: + case GDK_Insert: + case GDK_Delete: + case GDK_Print: + case GDK_BackSpace: + case GDK_Pause: + case GDK_Scroll_Lock: + case GDK_Shift_Lock: + case GDK_Num_Lock: + case GDK_Caps_Lock: + case GDK_Control_L: + case GDK_Control_R: + case GDK_Shift_L: + case GDK_Shift_R: + case GDK_Alt_L: + case GDK_Alt_R: + case GDK_Meta_L: + case GDK_Meta_R: + case GDK_Mode_switch: + case GDK_Multi_key: + return; - default: - key = event->keyval; - } + default: + key = event->keyval; + } - if (event->state & alt) { + if ((event->state & alt) || was_pound) { key=M(event->keyval); - } - else if (event->state & ctl) { + } else if (event->state & ctl) { key=C(event->keyval); - } + } + if (was_pound) { + was_pound = 0; + } - /* Ok, here is where we do clever stuff to overide the default - * game behavior */ - if (g_askingQuestion==0) { + /* Ok, here is where we do clever stuff to overide the default + * game behavior */ + if (g_askingQuestion == 0) { - if (key == 'S' || key == M('S') || key == C('S')) { - ghack_save_game_cb( NULL, NULL); - return; - } - } + if (key == 'S' || key == M('S') || key == C('S')) { + ghack_save_game_cb( NULL, NULL); + return; + } + } g_keyBuffer = g_list_prepend (g_keyBuffer, GINT_TO_POINTER( key)); g_numKeys++; } - - diff --git a/win/gnome/gntext.c b/win/gnome/gntext.c index 892cd9ee3..275a4a16d 100644 --- a/win/gnome/gntext.c +++ b/win/gnome/gntext.c @@ -40,6 +40,7 @@ void ghack_text_window_clear(GtkWidget *widget, gpointer data) void ghack_text_window_destroy() { + TW_window = NULL; } 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_signal_connect (GTK_OBJECT (TW_window), "destroy", + (GtkSignalFunc) ghack_text_window_destroy, NULL); if (block) gnome_dialog_run(GNOME_DIALOG(TW_window)); else