X11: Implemented fullscreen toggle, fixed exit segfault. (#3957)

This commit is contained in:
Branimir Karadžić
2026-09-04 04:07:56 +00:00
committed by GitHub
parent 892fdbe343
commit fcdc7116a6

View File

@@ -355,6 +355,9 @@ namespace entry
m_visual = DefaultVisual(m_display, screen);
m_root = RootWindow(m_display, screen);
m_netWmState = XInternAtom(m_display, "_NET_WM_STATE", False);
m_netWmStateFullscreen = XInternAtom(m_display, "_NET_WM_STATE_FULLSCREEN", False);
bx::memSet(&m_windowAttrs, 0, sizeof(m_windowAttrs) );
m_windowAttrs.background_pixel = 0;
m_windowAttrs.border_pixel = 0;
@@ -583,7 +586,8 @@ namespace entry
XUnmapWindow(m_display, m_window[0]);
XDestroyWindow(m_display, m_window[0]);
XCloseDisplay(m_display);
// The graphics driver registers Xlib extension hooks on the display,
// and it is unloaded during renderer shutdown.
m_display = NULL;
return thread.getExitCode();
@@ -674,6 +678,9 @@ namespace entry
Visual* m_visual;
Window m_root;
Atom m_netWmState;
Atom m_netWmStateFullscreen;
XSetWindowAttributes m_windowAttrs;
Display* m_display;
@@ -772,7 +779,31 @@ namespace entry
void toggleFullscreen(WindowHandle _handle)
{
BX_UNUSED(_handle);
Display* display = s_ctx.m_display;
Window window = s_ctx.m_window[_handle.idx];
constexpr long kNetWmStateToggle = 2;
constexpr long kSourceApplication = 1;
XEvent event;
bx::memSet(&event, 0, sizeof(event) );
event.type = ClientMessage;
event.xclient.window = window;
event.xclient.message_type = s_ctx.m_netWmState;
event.xclient.format = 32;
event.xclient.data.l[0] = kNetWmStateToggle;
event.xclient.data.l[1] = long(s_ctx.m_netWmStateFullscreen);
event.xclient.data.l[2] = 0;
event.xclient.data.l[3] = kSourceApplication;
event.xclient.data.l[4] = 0;
XSendEvent(display
, s_ctx.m_root
, False
, SubstructureNotifyMask|SubstructureRedirectMask
, &event
);
XFlush(display);
}
void setMouseLock(WindowHandle _handle, bool _lock)