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

100 lines
2.2 KiB
C++

//
// Copyright Contributors to the MaterialX Project
// SPDX-License-Identifier: Apache-2.0
//
#if defined(__linux__) || defined(__FreeBSD__)
#include <MaterialXRenderHw/SimpleWindow.h>
#include <X11/StringDefs.h>
#include <X11/Shell.h> // for applicationShellWidgetClass
#include <X11/Xlib.h> // for XEvent definition
#include <X11/Intrinsic.h> // for XtCallbackProc definition
MATERIALX_NAMESPACE_BEGIN
SimpleWindow::SimpleWindow() :
_width(0),
_height(0)
{
// Give a unique ID to this window.
static unsigned int windowCount = 1;
_id = windowCount;
windowCount++;
}
bool SimpleWindow::initialize(const char* title,
unsigned int width, unsigned int height,
void* applicationShell)
{
int n = 0;
XtAppContext appContext;
Widget shell;
static Widget batchShell;
if (!applicationShell)
{
static bool initializedXServer = false;
// Connect to the X Server
if (!initializedXServer)
{
batchShell = XtOpenApplication(&appContext, "__mx_dummy__app__",
0, 0, &n, 0, 0,
applicationShellWidgetClass, 0, 0);
initializedXServer = true;
}
shell = batchShell;
}
else
{
// Reuse existing application shell;
shell = (Widget) applicationShell;
}
if (!shell)
{
_id = 0;
return false;
}
Arg args[6];
n = 0;
XtSetArg(args[n], XtNx, 0); n++;
XtSetArg(args[n], XtNy, 0); n++;
XtSetArg(args[n], XtNwidth, width); n++;
XtSetArg(args[n], XtNheight, height); n++;
Widget widget = XtCreatePopupShell(title, topLevelShellWidgetClass, shell, args, n);
if (!widget)
{
_id = 0;
return false;
}
XtRealizeWidget(widget);
_windowWrapper = WindowWrapper::create(widget, XtWindow(widget), XtDisplay(widget));
return true;
}
SimpleWindow::~SimpleWindow()
{
if (!_windowWrapper)
{
return;
}
Widget widget = _windowWrapper->externalHandle();
if (widget)
{
// Unrealize the widget first to avoid X calls to it
XtUnrealizeWidget(widget);
XtDestroyWidget(widget);
widget = nullptr;
}
}
MATERIALX_NAMESPACE_END
#endif