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)
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)
{
const WINDOW wid = request.wid;

View File

@@ -12,12 +12,7 @@ set(SOURCES
)
option(ENABLE_GLX "enable glx 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)
option(ENABLE_SHM "enable shm extension" ON)
if(ENABLE_GLX)
set(SOURCES ${SOURCES} ExtGLX.cpp)

View File

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

View File

@@ -7,6 +7,7 @@
#include <signal.h>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <unistd.h>
@@ -18,19 +19,20 @@
#include <netinet/in.h>
#endif
static const xRectangle s_screen_bounds =
static BAN::UniqPtr<LibGUI::Window> s_dummy_window =
[]() {
auto attributes = LibGUI::Window::default_attributes;
attributes.shown = false;
auto window = 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()),
};
return MUST(LibGUI::Window::create(0, 0, ""_sv, attributes));
}();
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] {
{
.depth = 1,
@@ -172,11 +174,24 @@ int main()
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");
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");
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 { \
@@ -397,6 +412,12 @@ int main()
continue;
}
if (events[i].data.ptr == (void*)1)
{
s_dummy_window->poll_events();
continue;
}
auto it = g_epoll_thingies.find(events[i].data.fd);
if (it == g_epoll_thingies.end())
continue;