72
73
// and -rdynamic in CXXFLAGS for kBacktrace() to work.
73
74
static bool kwin_sync = false;
76
// this is copied from KXErrorHandler and modified to explicitly use known extensions
77
static QByteArray errorMessage( const XErrorEvent& event, Display* dpy )
78
{ // "Error: <error> (<value>), Request: <request>(<value>), Resource: <value>"
82
if( event.request_code < 128 ) // core request
84
XGetErrorText( dpy, event.error_code, tmp, 255 );
85
if( char* paren = strchr( tmp, '(' )) // the explanation in parentheses just makes
86
*paren = '\0'; // it more verbose and is not really useful
87
// the various casts are to get overloads non-ambiguous :-/
88
ret = QByteArray( "error: " ) + (const char*)tmp + '[' + QByteArray::number( event.error_code ) + ']';
89
sprintf( num, "%d", event.request_code );
90
XGetErrorDatabaseText( dpy, "XRequest", num, "<unknown>", tmp, 256 );
91
ret += QByteArray( ", request: " ) + (const char*)tmp + '[' + QByteArray::number( event.request_code ) + ']';
92
if( event.resourceid != 0 )
93
ret += QByteArray( ", resource: 0x" ) + QByteArray::number( (qlonglong)event.resourceid, 16 );
97
// XGetErrorText() currently has a bug that makes it fail to find text
98
// for some errors (when error==error_base), also XGetErrorDatabaseText()
99
// requires the right extension name, so it is needed to get info about
100
// all extensions. However that is almost impossible:
101
// - Xlib itself has it, but in internal data.
102
// - Opening another X connection now can cause deadlock with server grabs.
103
// - Fetching it at startup means a bunch of roundtrips.
105
// KWin here explicitly uses known extensions.
107
const char** extensions;
110
Extensions::fillExtensionsData( extensions, nextensions, majors, error_bases );
111
XGetErrorText( dpy, event.error_code, tmp, 255 );
117
if( error_bases[ i ] != 0
118
&& event.error_code >= error_bases[ i ] && ( index == -1 || error_bases[ i ] > base ))
121
base = error_bases[ i ];
123
if( tmp == QString::number( event.error_code )) // XGetErrorText() failed,
124
{ // or it has a bug that causes not finding all errors, check ourselves
127
snprintf( num, 255, "%s.%d", extensions[ index ], event.error_code - base );
128
XGetErrorDatabaseText( dpy, "XProtoError", num, "<unknown>", tmp, 255 );
131
strcpy( tmp, "<unknown>" );
133
if( char* paren = strchr( tmp, '(' ))
136
ret = QByteArray( "error: " ) + (const char*)tmp + '[' + (const char*)extensions[ index ]
137
+ '+' + QByteArray::number( event.error_code - base ) + ']';
139
ret = QByteArray( "error: " ) + (const char*)tmp + '[' + QByteArray::number( event.error_code ) + ']';
144
if( majors[ i ] == event.request_code )
146
snprintf( num, 255, "%s.%d", extensions[ i ], event.minor_code );
147
XGetErrorDatabaseText( dpy, "XRequest", num, "<unknown>", tmp, 255 );
148
ret += QByteArray( ", request: " ) + (const char*)tmp + '[' + (const char*)extensions[ i ] + '+'
149
+ QByteArray::number( event.minor_code ) + ']';
151
if( tmp[ 0 ] == '\0' ) // not found???
152
ret += QByteArray( ", request <unknown> [" ) + QByteArray::number( event.request_code ) + ':'
153
+ QByteArray::number( event.minor_code ) + ']';
154
if( event.resourceid != 0 )
155
ret += QByteArray( ", resource: 0x" ) + QByteArray::number( (qlonglong)event.resourceid, 16 );
76
161
int x11ErrorHandler(Display *d, XErrorEvent *e)
78
char msg[80], req[80], number[80];
79
163
bool ignore_badwindow = true; //maybe temporary
92
176
if (ignore_badwindow && (e->error_code == BadWindow || e->error_code == BadColor))
95
XGetErrorText(d, e->error_code, msg, sizeof(msg));
96
sprintf(number, "%d", e->request_code);
97
XGetErrorDatabaseText(d, "XRequest", number, "<unknown>", req, sizeof(req));
99
fprintf(stderr, "kwin: %s(0x%lx): %s\n", req, e->resourceid, msg);
179
// fprintf( stderr, "kwin: X Error (%s)\n", KXErrorHandler::errorMessage( *e, d ).data());
180
fprintf( stderr, "kwin: X Error (%s)\n", errorMessage( *e, d ).data());
102
kDebug() << kBacktrace();
183
fprintf( stderr, "%s\n", kBacktrace().toLocal8Bit().data());