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:
+38
-40
@@ -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
@@ -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
@@ -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++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user