Fix gtk native theme crash on solaris (bug 175755) by not relying on gdk_error_trap_push and instead using our own X error handler (and restoring the old handler after the painting operation is finished). r=blizzard, sr=jag, a=dbaron.

This commit is contained in:
bryner%netscape.com 2002-10-24 23:53:46 +00:00
Родитель e50c4644fd
Коммит 46d5db6372
1 изменённых файлов: 19 добавлений и 4 удалений

Просмотреть файл

@ -71,6 +71,8 @@ GtkWidget* gProgressWidget;
GtkWidget* gTabWidget;
GtkTooltips* gTooltipWidget;
static int gLastXError;
nsNativeThemeGTK::nsNativeThemeGTK()
: mProtoLayout(nsnull)
{
@ -226,6 +228,12 @@ nsNativeThemeGTK::GetGtkWidgetState(PRUint8 aWidgetType,
}
}
static int
NativeThemeErrorHandler(Display* dpy, XErrorEvent* error) {
gLastXError = error->error_code;
return 0;
}
NS_IMETHODIMP
nsNativeThemeGTK::DrawWidgetBackground(nsIRenderingContext* aContext,
nsIFrame* aFrame,
@ -251,7 +259,14 @@ nsNativeThemeGTK::DrawWidgetBackground(nsIRenderingContext* aContext,
NS_ASSERTION(!IsWidgetTypeDisabled(mDisabledWidgetTypes, aWidgetType), "Trying to render an unsafe widget!");
gdk_error_trap_push();
// The widget code on Solaris replaces gdk's X error handler with its own,
// which means that gdk_error_trap_push/pop won't have any effect.
// So, instead of using those, we just use our own error handler which
// records the last X error to occur, then restore the old error handler
// when we're done drawing.
gLastXError = 0;
XErrorHandler oldHandler = XSetErrorHandler(NativeThemeErrorHandler);
switch (aWidgetType) {
@ -416,11 +431,11 @@ nsNativeThemeGTK::DrawWidgetBackground(nsIRenderingContext* aContext,
}
gdk_flush();
int err = gdk_error_trap_pop();
if (err) {
XSetErrorHandler(oldHandler);
if (gLastXError) {
#ifdef DEBUG
printf("GTK theme failed for widget type %d, error was %d, state was [active=%d,focused=%d,inHover=%d,disabled=%d]\n",
aWidgetType, err, state.active, state.focused, state.inHover, state.disabled);
aWidgetType, gLastXError, state.active, state.focused, state.inHover, state.disabled);
#endif
NS_WARNING("GTK theme failed; disabling unsafe widget");
SetWidgetTypeDisabled(mDisabledWidgetTypes, aWidgetType);