Files
UnrealEngine/Engine/Source/ThirdParty/MaterialX/MaterialX-1.38.10/source/MaterialXRenderHw/WindowWrapper.h
2025-05-18 13:04:45 +08:00

122 lines
3.2 KiB
C++

//
// Copyright Contributors to the MaterialX Project
// SPDX-License-Identifier: Apache-2.0
//
#ifndef MATERIALX_WINDOWWRAPPER_H
#define MATERIALX_WINDOWWRAPPER_H
#if defined(_WIN32)
#define WIN32_LEAN_AND_MEAN
#undef APIENTRY
#include <windows.h>
#elif defined(__linux__) || defined(__FreeBSD__)
#include <X11/X.h> // for Window
#include <X11/Xlib.h> // for Display
using Widget = struct _WidgetRec*;
#endif
#include <memory>
#include <MaterialXCore/Library.h>
MATERIALX_NAMESPACE_BEGIN
/// OS specific type windowing definitions
#if defined(_WIN32)
/// External handle is a window handle
using ExternalWindowHandle = HWND;
/// Internal handle is a device context
using InternalWindowHandle = HDC;
/// Display handle concept has no equivalence on Windows
using DisplayHandle = void*;
#elif defined(__linux__) || defined(__FreeBSD__)
/// External handle is a widget
using ExternalWindowHandle = Widget;
/// Internal handle is the window for the widget
using InternalWindowHandle = Window;
/// Display handle is the X display
using DisplayHandle = Display*;
/// Application shell
using Widget = struct _WidgetRec*;
#elif defined(__APPLE__)
/// External handle is a window handle
using ExternalWindowHandle = void*;
/// Internal handle concept has no equivalence on Mac
using InternalWindowHandle = void*;
/// Display handle concept has no equivalence on Mac
using DisplayHandle = void*;
#else
using Widget = void*;
using ExternalWindowHandle = void*;
using InternalWindowHandle = void*;
using DisplayHandle = void*;
#endif
/// WindowWrapper shared pointer
using WindowWrapperPtr = std::shared_ptr<class WindowWrapper>;
/// @class WindowWrapper
/// Generic wrapper for encapsulating a "window" construct
///
/// Each supported platform will have specific storage and management logic.
class WindowWrapper
{
public:
/// Create a new WindowWrapper
static WindowWrapperPtr create(ExternalWindowHandle externalHandle = {},
InternalWindowHandle internalHandle = {},
DisplayHandle display = {});
// Default destructor
virtual ~WindowWrapper();
/// Return "external" handle
ExternalWindowHandle externalHandle() const
{
return _externalHandle;
}
/// Return "internal" handle
InternalWindowHandle internalHandle() const
{
return _internalHandle;
}
/// Check that there is a valid OS handle set.
/// It is sufficient to just check the internal handle.
bool isValid() const
{
return _internalHandle != 0;
}
/// Release resources stored in wrapper
void release();
#if defined(__linux__) || defined(__FreeBSD__)
/// Return X display
Display* getXDisplay() const
{
return _xDisplay;
}
#endif
protected:
WindowWrapper(ExternalWindowHandle externalHandle,
InternalWindowHandle internalHandle,
DisplayHandle display);
protected:
ExternalWindowHandle _externalHandle;
InternalWindowHandle _internalHandle;
#if defined(__linux__) || defined(__FreeBSD__)
/// Window ID of framebuffer instance created in the wrapper
Window _framebufferWindow;
/// X Display
Display* _xDisplay;
#endif
};
MATERIALX_NAMESPACE_END
#endif