diff options
Diffstat (limited to 'client')
-rw-r--r-- | client/x11/platform.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp index f80f0dcf..8292d44f 100644 --- a/client/x11/platform.cpp +++ b/client/x11/platform.cpp @@ -109,6 +109,8 @@ static Atom utf8_atom; #ifdef USE_XRANDR_1_2 static bool clipboard_inited = false; #endif +static Bool handle_x_error = false; +static int x_error_code; class DefaultEventListener: public Platform::EventListener { public: @@ -219,6 +221,18 @@ Display* XPlatform::get_display() return x_display; } +static void handle_x_errors_start(void) +{ + handle_x_error = True; + x_error_code = 0; +} + +static int handle_x_errors_stop(void) +{ + handle_x_error = False; + return x_error_code; +} + bool XPlatform::is_x_shm_avail() { return x_shm_avail; @@ -277,9 +291,16 @@ XImage *XPlatform::create_x_shm_image(RedDrawable::Format format, goto err2; } + handle_x_errors_start(); + /* Ensure the xserver has attached the xshm segment */ XSync (XPlatform::get_display(), False); + if (handle_x_errors_stop()) { + x_shm_avail = false; + goto err2; + } + /* Mark segment as released so that it will be destroyed when the xserver releases the segment. This way we won't leak the segment if the client crashes. */ @@ -2493,6 +2514,13 @@ static int x_error_handler(Display* display, XErrorEvent* error_event) char request_str[256]; char number_str[32]; + if (handle_x_error) { + if (error_event->error_code) { + x_error_code = error_event->error_code; + } + return 0; + } + char* display_name = XDisplayString(display); XGetErrorText(display, error_event->error_code, error_str, sizeof(error_str)); |