Compare commits

..

5 Commits

Author SHA1 Message Date
b2c642f03d Don't make SHM extension dependent option
This was here because I though banan-os didn't define them, but they do
exist there :^)
2026-04-15 19:23:34 +03:00
654e878165 Allow compiling with just xorgproto installed 2026-04-15 19:22:56 +03:00
5076d3bbaf Add missing sys/socket.h include 2026-04-15 18:53:45 +03:00
7be8edada7 Add child window id to its parent
I had accidentally removed this in b228ef13c4 and it broke all programs
that were using child windows :D
2026-04-15 18:43:03 +03:00
07f2b5dbb7 Add hacky way to die when WindowServer dies
We keep a dummy window around which will receive a close event that
exits once WindowServer dies :^)
2026-04-15 18:21:03 +03:00
4 changed files with 85 additions and 67 deletions

View File

@@ -1400,6 +1400,8 @@ BAN::ErrorOr<void> handle_packet(Client& client_info, BAN::ConstByteSpan packet)
if (event_mask != 0) if (event_mask != 0)
TRY(object_it->value->object.get<Object::Window>().event_masks.insert(&client_info, event_mask)); TRY(object_it->value->object.get<Object::Window>().event_masks.insert(&client_info, event_mask));
TRY(parent_window.children.push_back(request.wid));
if (gui_window_ptr) if (gui_window_ptr)
{ {
const WINDOW wid = request.wid; const WINDOW wid = request.wid;

View File

@@ -12,12 +12,7 @@ set(SOURCES
) )
option(ENABLE_GLX "enable glx extension" ON) option(ENABLE_GLX "enable glx extension" ON)
option(ENABLE_SHM "enable shm extension" ON)
include(CheckSymbolExists)
include(CMakeDependentOption)
check_symbol_exists(shmat "sys/shm.h" HAVE_SHMAT)
check_symbol_exists(shmdt "sys/shm.h" HAVE_SHMDT)
cmake_dependent_option(ENABLE_SHM "enable shm extension" ON "HAVE_SHMAT;HAVE_SHMDT" OFF)
if(ENABLE_GLX) if(ENABLE_GLX)
set(SOURCES ${SOURCES} ExtGLX.cpp) set(SOURCES ${SOURCES} ExtGLX.cpp)

View File

@@ -1,63 +1,63 @@
#include "Extensions.h" #include "Extensions.h"
#include "Utils.h" #include "Utils.h"
#include <GL/glx.h>
#include <GL/glxproto.h> #include <GL/glxproto.h>
#include <GL/glxtokens.h>
using BOOL32 = CARD32; using BOOL32 = CARD32;
CARD32 g_fb_configs[2][24][2] { CARD32 g_fb_configs[2][24][2] {
{ {
{ GLX_FBCONFIG_ID, 1 }, { GLX_FBCONFIG_ID, 1 },
{ GLX_VISUAL_ID, g_visual.visualID }, { GLX_VISUAL_ID, g_visual.visualID },
{ GLX_BUFFER_SIZE, 32 }, { GLX_BUFFER_SIZE, 32 },
{ GLX_LEVEL, 0 }, { GLX_LEVEL, 0 },
{ GLX_DOUBLEBUFFER, True }, { GLX_DOUBLEBUFFER, xTrue },
{ GLX_STEREO, False }, { GLX_STEREO, xFalse },
{ GLX_RENDER_TYPE, GLX_RGBA_BIT }, { GLX_RENDER_TYPE, GLX_RGBA_BIT },
{ GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT }, { GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT },
{ GLX_X_RENDERABLE, True }, { GLX_X_RENDERABLE, xTrue },
{ GLX_X_VISUAL_TYPE, GLX_TRUE_COLOR }, { GLX_X_VISUAL_TYPE, GLX_TRUE_COLOR },
{ GLX_CONFIG_CAVEAT, GLX_NONE }, { GLX_CONFIG_CAVEAT, GLX_NONE },
{ GLX_TRANSPARENT_TYPE, GLX_NONE }, { GLX_TRANSPARENT_TYPE, GLX_NONE },
{ GLX_RED_SIZE, 8 }, { GLX_RED_SIZE, 8 },
{ GLX_GREEN_SIZE, 8 }, { GLX_GREEN_SIZE, 8 },
{ GLX_BLUE_SIZE, 8 }, { GLX_BLUE_SIZE, 8 },
{ GLX_ALPHA_SIZE, 8 }, { GLX_ALPHA_SIZE, 8 },
{ GLX_DEPTH_SIZE, 24 }, { GLX_DEPTH_SIZE, 24 },
{ GLX_STENCIL_SIZE, 8 }, { GLX_STENCIL_SIZE, 8 },
{ GLX_ACCUM_RED_SIZE, 0 }, { GLX_ACCUM_RED_SIZE, 0 },
{ GLX_ACCUM_GREEN_SIZE, 0 }, { GLX_ACCUM_GREEN_SIZE, 0 },
{ GLX_ACCUM_BLUE_SIZE, 0 }, { GLX_ACCUM_BLUE_SIZE, 0 },
{ GLX_ACCUM_ALPHA_SIZE, 0 }, { GLX_ACCUM_ALPHA_SIZE, 0 },
{ GLX_SAMPLE_BUFFERS, 0 }, { GLX_SAMPLE_BUFFERS_SGIS, 0 },
{ GLX_SAMPLES, 0 }, { GLX_SAMPLES_SGIS, 0 },
}, },
{ {
{ GLX_FBCONFIG_ID, 2 }, { GLX_FBCONFIG_ID, 2 },
{ GLX_VISUAL_ID, g_visual.visualID }, { GLX_VISUAL_ID, g_visual.visualID },
{ GLX_BUFFER_SIZE, 32 }, { GLX_BUFFER_SIZE, 32 },
{ GLX_LEVEL, 0 }, { GLX_LEVEL, 0 },
{ GLX_DOUBLEBUFFER, False }, { GLX_DOUBLEBUFFER, xFalse },
{ GLX_STEREO, False }, { GLX_STEREO, xFalse },
{ GLX_RENDER_TYPE, GLX_RGBA_BIT }, { GLX_RENDER_TYPE, GLX_RGBA_BIT },
{ GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT }, { GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT },
{ GLX_X_RENDERABLE, True }, { GLX_X_RENDERABLE, xTrue },
{ GLX_X_VISUAL_TYPE, GLX_TRUE_COLOR }, { GLX_X_VISUAL_TYPE, GLX_TRUE_COLOR },
{ GLX_CONFIG_CAVEAT, GLX_NONE }, { GLX_CONFIG_CAVEAT, GLX_NONE },
{ GLX_TRANSPARENT_TYPE, GLX_NONE }, { GLX_TRANSPARENT_TYPE, GLX_NONE },
{ GLX_RED_SIZE, 8 }, { GLX_RED_SIZE, 8 },
{ GLX_GREEN_SIZE, 8 }, { GLX_GREEN_SIZE, 8 },
{ GLX_BLUE_SIZE, 8 }, { GLX_BLUE_SIZE, 8 },
{ GLX_ALPHA_SIZE, 8 }, { GLX_ALPHA_SIZE, 8 },
{ GLX_DEPTH_SIZE, 24 }, { GLX_DEPTH_SIZE, 24 },
{ GLX_STENCIL_SIZE, 8 }, { GLX_STENCIL_SIZE, 8 },
{ GLX_ACCUM_RED_SIZE, 0 }, { GLX_ACCUM_RED_SIZE, 0 },
{ GLX_ACCUM_GREEN_SIZE, 0 }, { GLX_ACCUM_GREEN_SIZE, 0 },
{ GLX_ACCUM_BLUE_SIZE, 0 }, { GLX_ACCUM_BLUE_SIZE, 0 },
{ GLX_ACCUM_ALPHA_SIZE, 0 }, { GLX_ACCUM_ALPHA_SIZE, 0 },
{ GLX_SAMPLE_BUFFERS, 0 }, { GLX_SAMPLE_BUFFERS_SGIS, 0 },
{ GLX_SAMPLES, 0 }, { GLX_SAMPLES_SGIS, 0 },
}, },
}; };

View File

@@ -7,6 +7,7 @@
#include <signal.h> #include <signal.h>
#include <sys/epoll.h> #include <sys/epoll.h>
#include <sys/socket.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
@@ -18,19 +19,20 @@
#include <netinet/in.h> #include <netinet/in.h>
#endif #endif
static const xRectangle s_screen_bounds = static BAN::UniqPtr<LibGUI::Window> s_dummy_window =
[]() { []() {
auto attributes = LibGUI::Window::default_attributes; auto attributes = LibGUI::Window::default_attributes;
attributes.shown = false; attributes.shown = false;
auto window = MUST(LibGUI::Window::create(0, 0, ""_sv, attributes)); return MUST(LibGUI::Window::create(0, 0, ""_sv, attributes));
return xRectangle {
.x = 0,
.y = 0,
.width = static_cast<CARD16>(window->width()),
.height = static_cast<CARD16>(window->height()),
};
}(); }();
static const xRectangle s_screen_bounds = {
.x = 0,
.y = 0,
.width = static_cast<CARD16>(s_dummy_window->width()),
.height = static_cast<CARD16>(s_dummy_window->height()),
};
const xPixmapFormat g_formats[6] { const xPixmapFormat g_formats[6] {
{ {
.depth = 1, .depth = 1,
@@ -172,11 +174,24 @@ int main()
return 1; return 1;
} }
epoll_event event { .events = EPOLLIN, .data = { .ptr = nullptr } };
if (epoll_ctl(g_epoll_fd, EPOLL_CTL_ADD, server_sock, &event) == -1)
{ {
perror("xbanan: epoll_ctl"); epoll_event event { .events = EPOLLIN, .data = { .ptr = nullptr } };
return 1; if (epoll_ctl(g_epoll_fd, EPOLL_CTL_ADD, server_sock, &event) == -1)
{
perror("xbanan: epoll_ctl");
return 1;
}
}
{
epoll_event event { .events = EPOLLIN, .data = { .ptr = (void*)1 } };
if (epoll_ctl(g_epoll_fd, EPOLL_CTL_ADD, s_dummy_window->server_fd(), &event) == -1)
{
perror("xbanan: epoll_ctl");
return 1;
}
s_dummy_window->request_resize(1, 1);
} }
#define APPEND_ATOM(name) do { \ #define APPEND_ATOM(name) do { \
@@ -397,6 +412,12 @@ int main()
continue; continue;
} }
if (events[i].data.ptr == (void*)1)
{
s_dummy_window->poll_events();
continue;
}
auto it = g_epoll_thingies.find(events[i].data.fd); auto it = g_epoll_thingies.find(events[i].data.fd);
if (it == g_epoll_thingies.end()) if (it == g_epoll_thingies.end())
continue; continue;