Hey Holger, Hey tuxtype-dev list :) I've modified the patchset I've attached to this bugreport and added a new function called "error_occured()". This will show up basically the same screen as "not_implemented()" does, but will exit to the mainmenu afterwards. So if the pointer word is a NULL-pointer, you won't get a segfault, but you get this error screen. To have the fix also complete on the tuxtype-dev list I'll attach again the not modified patch for the german keyboard.lst.
Greetings Winnie -- .''`. Patrick Winnertz <[EMAIL PROTECTED]> : :' : GNU/Linux Debian Developer `. `'` http://www.der-winnie.de http://people.skolelinux.org/~winnie `- Debian - when you have better things to do than fixing systems Spamtrap: [EMAIL PROTECTED]
Index: titlescreen.c
===================================================================
--- titlescreen.c (Revision 456)
+++ titlescreen.c (Arbeitskopie)
@@ -867,7 +874,110 @@
settings.fullscreen = !settings.fullscreen;
}
+/*Derived from not_implemented: should only be shown if an error occurs somewhere */
+void error_occured(void)
+{
+ SDL_Surface* bk = NULL;
+ SDL_Surface *s1 = NULL, *s2 = NULL, *s3 = NULL, *s4 = NULL;
+ sprite* tux = NULL;
+ SDL_Rect loc;
+ int finished = 0, i;
+ LOG( "ErrorOccured() - creating text\n" );
+ /* if no font is set, use default ones */
+ if (!font)
+ font = LoadFont(DEFAULT_MENU_FONT, MENU_FONT_SIZE);
+
+ s1 = BlackOutline( _("An error occured"), font, &white);
+ s2 = BlackOutline( _("This shouldn't happen, you'll found a bug"), font, &white);
+ s3 = BlackOutline( _("Please report this problem to"), font, &white);
+
+ /* we always want the URL in english */
+ /* NOTE: all fonts are almost certain to include glyphs for ASCII, */
+ /* so the following "english_font" hackery is probably unnecessary: */
+ if (!settings.use_english)
+ {
+ TTF_Font *english_font;
+ settings.use_english = 1;
+ english_font = LoadFont(DEFAULT_MENU_FONT, MENU_FONT_SIZE);
+ s4 = BlackOutline( "[EMAIL PROTECTED]", english_font, &white);
+ TTF_CloseFont(english_font);
+ settings.use_english = 0;
+ }
+ else
+ s4 = BlackOutline( "[EMAIL PROTECTED]", font, &white);
+
+ tux = LoadSprite("tux/tux-egypt", IMG_ALPHA);
+ bk = LoadImage("main_bkg.png", IMG_REGULAR);
+
+ if (s1 && s2 && s3 && s4 && tux && bk)
+ {
+ LOG( "ErrorOccured() - drawing screen\n" );
+
+ SDL_BlitSurface(bk, NULL, screen, NULL);
+ loc.x = 320-(s1->w/2); loc.y = 10;
+ SDL_BlitSurface( s1, NULL, screen, &loc);
+ loc.x = 320-(s2->w/2); loc.y = 60;
+ SDL_BlitSurface( s2, NULL, screen, &loc);
+ loc.x = 320-(s3->w/2); loc.y = 400;
+ SDL_BlitSurface( s3, NULL, screen, &loc);
+ loc.x = 320-(s4->w/2); loc.y = 440;
+ SDL_BlitSurface( s4, NULL, screen, &loc);
+
+ loc.x = 320-(tux->frame[0]->w/2);
+ loc.y = 200;
+ loc.w = tux->frame[0]->w;
+ loc.h = tux->frame[0]->h;
+ SDL_BlitSurface( tux->frame[tux->cur], NULL, screen, &loc);
+
+ SDL_UpdateRect(screen, 0, 0, 0, 0);
+
+ i = 0;
+
+ while (!finished)
+ {
+ while (SDL_PollEvent(&event))
+ {
+ switch (event.type)
+ {
+ case SDL_QUIT:
+ exit(0);
+ case SDL_MOUSEBUTTONDOWN:
+ case SDL_KEYDOWN:
+ TitleScreen();
+ exit(0);
+ }
+ }
+
+ i++;
+
+ if (i %5 == 0)
+ {
+ NEXT_FRAME(tux);
+ SDL_BlitSurface(bk, &loc, screen, &loc);
+ SDL_BlitSurface(tux->frame[tux->cur], NULL, screen, &loc);
+ SDL_UpdateRect(screen, loc.x, loc.y, loc.w, loc.h);
+ }
+
+ SDL_Delay(40);
+ }
+ }
+ else
+ fprintf(stderr, "ErrorOccured() - could not load needed graphic\n");
+
+ SDL_FreeSurface(s1);
+ SDL_FreeSurface(s2);
+ SDL_FreeSurface(s3);
+ SDL_FreeSurface(s4);
+ SDL_FreeSurface(bk);
+ s1 = s2 = s3 = s4 = bk = NULL;
+ FreeSprite(tux);
+ tux = NULL;
+}
+
+
+
+
/************************************************************************/
/* */
/* "Private" functions (local to titlescreen.c) */
Index: laser.c
===================================================================
--- laser.c (Revision 456)
+++ laser.c (Arbeitskopie)
@@ -830,6 +830,11 @@
int i = 0;
comet_type* prev_comet = NULL;
+ /* Do nothing if word is a NULL pointer. This could happen for example if a char *
+ in a word is not listed keyboard.lst of this specific language. It would imho *
+ be nicer to get here a warning or a error and not a tux waiting for nothing. *
+ This have to be fixed later. */
+ if (word != NULL) {
DEBUGCODE {fprintf(stderr, "word is: %S\tlength is: %d\n", word, (int)wcslen(word));}
do
{
@@ -866,11 +871,14 @@
DEBUGCODE {fprintf(stderr, "Assigning letter to comet: %C\n", word[i]);}
}
}
+ } else {
+ DEBUGCODE {fprintf(stderr, "word was pointer to NULL, showing error dialog\n");}
+ error_occured();
+ }
}
LOG ("Leaving laser_add_comet()\n");
}
-
/* Draw numbers/symbols over the attacker: */
static void laser_draw_let(wchar_t c, int x, int y)
Index: funcs.h
===================================================================
--- funcs.h (Revision 456)
+++ funcs.h (Arbeitskopie)
@@ -119,4 +119,5 @@
/* In titlescreen.c: */
void SwitchScreenMode(void);
void TitleScreen(void);
+void error_occured(void);
Index: keyboard.lst =================================================================== --- keyboard.lst (Revision 456) +++ keyboard.lst (Arbeitskopie) @@ -54,7 +54,7 @@ 5| 0|! 0|@ -0|# +9|# 0|1 0|2 0|3 @@ -67,4 +67,14 @@ 0|0 7|, 8|. -9|; +7|; +8|: +9|- +9|_ +9|ö +9|Ö +9|ü +9|Ü +9|ö +9|Ö +9|ß
signature.asc
Description: This is a digitally signed message part.

