1 /* -*- Mode: C++; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "nsGDKErrorHandler.h"
16 #include "nsX11ErrorHandler.h"
21 /* See https://bugzilla.gnome.org/show_bug.cgi?id=629608#c8
23 * GDK implements X11 error traps to ignore X11 errors.
24 * Unfortunatelly We don't know which X11 events can be ignored
25 * so we have to utilize the Gdk error handler to avoid
26 * false alarms in Gtk3.
29 GdkErrorHandler(const gchar
*log_domain
, GLogLevelFlags log_level
,
30 const gchar
*message
, gpointer user_data
)
32 if (strstr(message
, "X Window System error")) {
34 nsDependentCString
buffer(message
);
37 /* Parse Gdk X Window error message which has this format:
38 * (Details: serial XXXX error_code XXXX request_code XXXX (XXXX) minor_code XXXX)
40 NS_NAMED_LITERAL_CSTRING(serialString
, "(Details: serial ");
41 int32_t start
= buffer
.Find(serialString
);
42 if (start
== kNotFound
)
43 NS_RUNTIMEABORT(message
);
45 start
+= serialString
.Length();
47 event
.serial
= strtol(buffer
.BeginReading() + start
, &endptr
, 10);
49 NS_RUNTIMEABORT(message
);
51 NS_NAMED_LITERAL_CSTRING(errorCodeString
, " error_code ");
52 if (!StringBeginsWith(Substring(endptr
, buffer
.EndReading()), errorCodeString
))
53 NS_RUNTIMEABORT(message
);
56 event
.error_code
= strtol(endptr
+ errorCodeString
.Length(), &endptr
, 10);
58 NS_RUNTIMEABORT(message
);
60 NS_NAMED_LITERAL_CSTRING(requestCodeString
, " request_code ");
61 if (!StringBeginsWith(Substring(endptr
, buffer
.EndReading()), requestCodeString
))
62 NS_RUNTIMEABORT(message
);
65 event
.request_code
= strtol(endptr
+ requestCodeString
.Length(), &endptr
, 10);
67 NS_RUNTIMEABORT(message
);
69 NS_NAMED_LITERAL_CSTRING(minorCodeString
, " minor_code ");
70 start
= buffer
.Find(minorCodeString
, endptr
- buffer
.BeginReading());
72 NS_RUNTIMEABORT(message
);
75 event
.minor_code
= strtol(buffer
.BeginReading() + start
+ minorCodeString
.Length(), nullptr, 10);
77 NS_RUNTIMEABORT(message
);
79 event
.display
= GDK_DISPLAY_XDISPLAY(gdk_display_get_default());
80 // Gdk does not provide resource ID
83 X11Error(event
.display
, &event
);
85 g_log_default_handler(log_domain
, log_level
, message
, user_data
);
86 NS_RUNTIMEABORT(message
);
91 InstallGdkErrorHandler()
93 g_log_set_handler("Gdk",
94 (GLogLevelFlags
)(G_LOG_LEVEL_ERROR
| G_LOG_FLAG_FATAL
| G_LOG_FLAG_RECURSION
),
97 if (PR_GetEnv("MOZ_X_SYNC")) {
98 XSynchronize(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), True
);