2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
\r
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
\r
5 This file is part of GtkRadiant.
\r
7 GtkRadiant is free software; you can redistribute it and/or modify
\r
8 it under the terms of the GNU General Public License as published by
\r
9 the Free Software Foundation; either version 2 of the License, or
\r
10 (at your option) any later version.
\r
12 GtkRadiant is distributed in the hope that it will be useful,
\r
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
15 GNU General Public License for more details.
\r
17 You should have received a copy of the GNU General Public License
\r
18 along with GtkRadiant; if not, write to the Free Software
\r
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\r
25 #if defined (__linux__) || defined (__APPLE__)
\r
33 For abnormal program terminations
\r
39 FIXME the prompt wether to do prefs dialog, may not even be possible
\r
40 if the crash happens before the game is loaded
\r
43 void Error (const char *error, ...)
\r
48 va_start (argptr,error);
\r
49 vsprintf (text, error,argptr);
\r
52 strcat( text, "\n" );
\r
54 #if defined (__linux__) || defined (__APPLE__)
\r
57 strcat( text, "errno: " );
\r
58 strcat( text, strerror (errno));
\r
59 strcat( text, "\n");
\r
64 if (GetLastError() != 0)
\r
68 FORMAT_MESSAGE_ALLOCATE_BUFFER |
\r
69 FORMAT_MESSAGE_FROM_SYSTEM |
\r
70 FORMAT_MESSAGE_IGNORE_INSERTS,
\r
73 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
\r
78 strcat( text, "GetLastError: " );
\r
80 Gtk will only crunch 0<=char<=127
\r
81 this is a bit hackish, but I didn't find useful functions in win32 API for this
\r
82 http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=516
\r
84 TCHAR *scan, *next = (TCHAR*)lpMsgBuf;
\r
88 text[strlen(text)+1] = '\0';
\r
89 if ((scan[0] >= 0) && (scan[0] <= 127))
\r
90 text[strlen(text)] = scan[0];
\r
92 text[strlen(text)] = '?';
\r
93 next = CharNext(scan);
\r
94 } while (next != scan);
\r
95 strcat( text, "\n");
\r
96 LocalFree( lpMsgBuf );
\r
100 // we need to have a current context to call glError()
\r
101 if (g_qeglobals_gui.d_glBase != NULL)
\r
103 // qglGetError .. can record several errors, clears after calling
\r
104 //++timo TODO: be able to deal with several errors if necessary, for now I'm just warning about pending error messages
\r
105 // NOTE: forget that, most boards don't seem to follow the OpenGL standard
\r
106 GLenum iGLError = qglGetError();
\r
107 if (iGLError != GL_NO_ERROR)
\r
109 // use our own gluErrorString
\r
110 strcat( text, "qgluErrorString: " );
\r
111 strcat( text, (char*)qgluErrorString( iGLError ) );
\r
112 strcat( text, "\n" );
\r
116 strcat (text, "An unrecoverable error has occured.\n"
\r
117 "Would you like to edit Preferences before exiting Radiant?");
\r
121 if (gtk_MessageBox(NULL, text, "Error", MB_YESNO) == IDYES)
\r
123 Sys_Printf("Doing prefs..\n");
\r
124 g_PrefsDlg.LoadPrefs ();
\r
125 g_PrefsDlg.DoModal();
\r
130 g_PrefsDlg.Destroy ();
\r
131 g_dlgSurface.Destroy ();
\r
132 g_dlgFind.Destroy ();
\r
134 // force close logging if necessary
\r
135 g_PrefsDlg.mGamesDialog.m_bLogConsole = false;
\r
141 void WINAPI Error (char *error, ...)
\r
146 va_start (argptr,error);
\r
147 vsprintf (text, error,argptr);
\r
150 Error((const char *)text);
\r