Files
godot-angle-static/util/linux/x11/X11Window.h
Roman Lavrov a77a80a173 Wait for DestroyNotify and ConfigureNotify events.
There appears to be a race condition where
XDestroyWindow+XCreateWindow ignores the new size
(the same window normally gets reused but this only happens
sometimes on some X11 versions).

Wait until we get the destroy notification which should avoid races
between termination and initialization.

However, it turns out just doing that breaks things because tests get to
termination before even giving the window a chance to set up fully
(e.g. ConfigureNotify) which only happens after making the window
visible.. so additionally block in setVisible until we get
ConfigureNotify.

aaand turns out RobustBufferAccessBehaviorTest requires
setVisible(true) - tests fail when running on my local Linux and pass
now that I added setWindowVisible!

Bug: angleproject:7620
Change-Id: I93f2f05cb9d1c62776636bec976d94ead4cf0fd1
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3979168
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Roman Lavrov <romanl@google.com>
2022-10-26 13:01:48 +00:00

64 lines
1.6 KiB
C++

//
// Copyright 2015 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// X11Window.h: Definition of the implementation of OSWindow for X11
#ifndef UTIL_X11_WINDOW_H
#define UTIL_X11_WINDOW_H
#include <X11/Xlib.h>
#include <X11/Xresource.h>
#include <X11/Xutil.h>
#include <string>
#include "util/OSWindow.h"
#include "util/util_export.h"
bool IsX11WindowAvailable();
class ANGLE_UTIL_EXPORT X11Window : public OSWindow
{
public:
X11Window();
X11Window(int visualId);
~X11Window() override;
void disableErrorMessageDialog() override;
void destroy() override;
void resetNativeWindow() override;
EGLNativeWindowType getNativeWindow() const override;
void *getPlatformExtension() override;
EGLNativeDisplayType getNativeDisplay() const override;
void messageLoop() override;
void setMousePosition(int x, int y) override;
bool setOrientation(int width, int height) override;
bool setPosition(int x, int y) override;
bool resize(int width, int height) override;
void setVisible(bool isVisible) override;
void signalTestEvent() override;
private:
bool initializeImpl(const std::string &name, int width, int height) override;
void processEvent(const XEvent &event);
Atom WM_DELETE_WINDOW;
Atom WM_PROTOCOLS;
Atom TEST_EVENT;
Display *mDisplay;
Window mWindow;
int mRequestedVisualId;
bool mVisible;
bool mConfigured = false;
bool mDestroyed = false;
};
#endif // UTIL_X11_WINDOW_H