Compare commits
7 Commits
b198c673ae
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| b2c642f03d | |||
| 654e878165 | |||
| 5076d3bbaf | |||
| 7be8edada7 | |||
| 07f2b5dbb7 | |||
| a497e4267f | |||
| 7252c985b8 |
@@ -1,6 +1,6 @@
|
|||||||
From 075f6a11926e247ba64efd25a3acf7a3d3be0bbc Mon Sep 17 00:00:00 2001
|
From c9dd87198ce5262e6ddf6bf3b0c18eb84784d35e Mon Sep 17 00:00:00 2001
|
||||||
From: Oskari Alaranta <oskari.alaranta@bananymous.com>
|
From: Oskari Alaranta <oskari.alaranta@bananymous.com>
|
||||||
Date: Wed, 15 Apr 2026 16:51:16 +0300
|
Date: Wed, 15 Apr 2026 17:52:54 +0300
|
||||||
Subject: [PATCH] linux-window-server-sdl2
|
Subject: [PATCH] linux-window-server-sdl2
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -13,8 +13,8 @@ Subject: [PATCH] linux-window-server-sdl2
|
|||||||
userspace/programs/WindowServer/Window.cpp | 29 +-
|
userspace/programs/WindowServer/Window.cpp | 29 +-
|
||||||
.../programs/WindowServer/WindowServer.cpp | 47 ++-
|
.../programs/WindowServer/WindowServer.cpp | 47 ++-
|
||||||
.../programs/WindowServer/WindowServer.h | 1 +
|
.../programs/WindowServer/WindowServer.h | 1 +
|
||||||
userspace/programs/WindowServer/main.cpp | 362 ++++++++++++------
|
userspace/programs/WindowServer/main.cpp | 357 ++++++++++++------
|
||||||
10 files changed, 338 insertions(+), 173 deletions(-)
|
10 files changed, 340 insertions(+), 166 deletions(-)
|
||||||
|
|
||||||
diff --git a/userspace/libraries/LibGUI/Widget/Widget.cpp b/userspace/libraries/LibGUI/Widget/Widget.cpp
|
diff --git a/userspace/libraries/LibGUI/Widget/Widget.cpp b/userspace/libraries/LibGUI/Widget/Widget.cpp
|
||||||
index d6489d87..c532fb04 100644
|
index d6489d87..c532fb04 100644
|
||||||
@@ -376,7 +376,7 @@ index 94fbc774..bcd7a6b9 100644
|
|||||||
private:
|
private:
|
||||||
void on_mouse_move_impl(int32_t new_x, int32_t new_y);
|
void on_mouse_move_impl(int32_t new_x, int32_t new_y);
|
||||||
diff --git a/userspace/programs/WindowServer/main.cpp b/userspace/programs/WindowServer/main.cpp
|
diff --git a/userspace/programs/WindowServer/main.cpp b/userspace/programs/WindowServer/main.cpp
|
||||||
index 41bd7e8c..cb066bd3 100644
|
index 46f2ba6d..520c8e7d 100644
|
||||||
--- a/userspace/programs/WindowServer/main.cpp
|
--- a/userspace/programs/WindowServer/main.cpp
|
||||||
+++ b/userspace/programs/WindowServer/main.cpp
|
+++ b/userspace/programs/WindowServer/main.cpp
|
||||||
@@ -10,7 +10,6 @@
|
@@ -10,7 +10,6 @@
|
||||||
@@ -425,7 +425,7 @@ index 41bd7e8c..cb066bd3 100644
|
|||||||
signal(sig, exit);
|
signal(sig, exit);
|
||||||
for (int sig : non_terminating_signals)
|
for (int sig : non_terminating_signals)
|
||||||
signal(sig, SIG_DFL);
|
signal(sig, SIG_DFL);
|
||||||
@@ -208,55 +202,10 @@ int main()
|
@@ -208,51 +202,15 @@ int main()
|
||||||
signal(sig, SIG_IGN);
|
signal(sig, SIG_IGN);
|
||||||
|
|
||||||
MUST(LibInput::KeyboardLayout::initialize());
|
MUST(LibInput::KeyboardLayout::initialize());
|
||||||
@@ -469,20 +469,18 @@ index 41bd7e8c..cb066bd3 100644
|
|||||||
dprintln("Window server started");
|
dprintln("Window server started");
|
||||||
|
|
||||||
- if (access("/usr/bin/xbanan", X_OK) == 0)
|
- if (access("/usr/bin/xbanan", X_OK) == 0)
|
||||||
- {
|
+ if (access("./build/xbanan/xbanan", X_OK) == 0)
|
||||||
- if (fork() == 0)
|
{
|
||||||
- {
|
if (fork() == 0)
|
||||||
|
{
|
||||||
- dup2(STDDBG_FILENO, STDOUT_FILENO);
|
- dup2(STDDBG_FILENO, STDOUT_FILENO);
|
||||||
- dup2(STDDBG_FILENO, STDERR_FILENO);
|
- dup2(STDDBG_FILENO, STDERR_FILENO);
|
||||||
- execl("/usr/bin/xbanan", "xbanan", NULL);
|
- execl("/usr/bin/xbanan", "xbanan", NULL);
|
||||||
- exit(1);
|
+ execl("./build/xbanan/xbanan", "xbanan", NULL);
|
||||||
- }
|
exit(1);
|
||||||
- }
|
}
|
||||||
-
|
}
|
||||||
auto config = parse_config();
|
@@ -276,26 +234,23 @@ int main()
|
||||||
|
|
||||||
WindowServer window_server(framebuffer, config.corner_radius);
|
|
||||||
@@ -276,26 +225,23 @@ int main()
|
|
||||||
uint64_t last_sync_us = get_current_us() - sync_interval_us;
|
uint64_t last_sync_us = get_current_us() - sync_interval_us;
|
||||||
while (!window_server.is_stopped())
|
while (!window_server.is_stopped())
|
||||||
{
|
{
|
||||||
@@ -520,7 +518,7 @@ index 41bd7e8c..cb066bd3 100644
|
|||||||
if (epoll_events == -1 && errno != EINTR)
|
if (epoll_events == -1 && errno != EINTR)
|
||||||
{
|
{
|
||||||
dwarnln("epoll_pwait2: {}", strerror(errno));
|
dwarnln("epoll_pwait2: {}", strerror(errno));
|
||||||
@@ -333,48 +279,6 @@ int main()
|
@@ -333,48 +288,6 @@ int main()
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -569,7 +567,7 @@ index 41bd7e8c..cb066bd3 100644
|
|||||||
const int client_fd = events[i].data.fd;
|
const int client_fd = events[i].data.fd;
|
||||||
if (events[i].events & (EPOLLHUP | EPOLLERR))
|
if (events[i].events & (EPOLLHUP | EPOLLERR))
|
||||||
{
|
{
|
||||||
@@ -500,3 +404,237 @@ int main()
|
@@ -500,3 +413,237 @@ int main()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
24
LICENSE
Normal file
24
LICENSE
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
BSD 2-Clause License
|
||||||
|
|
||||||
|
Copyright (c) 2026, Oskari Alaranta
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
29
README.md
Normal file
29
README.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# xbanan
|
||||||
|
|
||||||
|
An X11 compatibility layer for [banan-os's](https://git.bananymous.com/Bananymous/banan-os) native GUI windowing system.
|
||||||
|
|
||||||
|
## Running on linux
|
||||||
|
|
||||||
|
### Building
|
||||||
|
```sh
|
||||||
|
git clone --recursive https://git.bananymous.com/Bananymous/xbanan.git
|
||||||
|
cd xbanan
|
||||||
|
|
||||||
|
cd banan-os
|
||||||
|
git apply ../0001-linux-window-server-sdl2.patch
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
cmake -B build -S . -G Ninja
|
||||||
|
cmake --build build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Running
|
||||||
|
|
||||||
|
To start the WindowServer, run the following command in project root
|
||||||
|
```sh
|
||||||
|
./build/banan-os/userspace/programs/WindowServer/WindowServer
|
||||||
|
```
|
||||||
|
To run X11 apps specify `DISPLAY=:69` environment variable. For example
|
||||||
|
```sh
|
||||||
|
DISPLAY=:69 xeyes
|
||||||
|
```
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#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;
|
||||||
|
|
||||||
@@ -12,11 +12,11 @@ CARD32 g_fb_configs[2][24][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, 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 },
|
||||||
@@ -30,19 +30,19 @@ CARD32 g_fb_configs[2][24][2] {
|
|||||||
{ 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 },
|
||||||
@@ -56,8 +56,8 @@ CARD32 g_fb_configs[2][24][2] {
|
|||||||
{ 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 },
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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,18 +19,19 @@
|
|||||||
#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 {
|
}();
|
||||||
|
|
||||||
|
static const xRectangle s_screen_bounds = {
|
||||||
.x = 0,
|
.x = 0,
|
||||||
.y = 0,
|
.y = 0,
|
||||||
.width = static_cast<CARD16>(window->width()),
|
.width = static_cast<CARD16>(s_dummy_window->width()),
|
||||||
.height = static_cast<CARD16>(window->height()),
|
.height = static_cast<CARD16>(s_dummy_window->height()),
|
||||||
};
|
};
|
||||||
}();
|
|
||||||
|
|
||||||
const xPixmapFormat g_formats[6] {
|
const xPixmapFormat g_formats[6] {
|
||||||
{
|
{
|
||||||
@@ -172,12 +174,25 @@ int main()
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
epoll_event event { .events = EPOLLIN, .data = { .ptr = nullptr } };
|
epoll_event event { .events = EPOLLIN, .data = { .ptr = nullptr } };
|
||||||
if (epoll_ctl(g_epoll_fd, EPOLL_CTL_ADD, server_sock, &event) == -1)
|
if (epoll_ctl(g_epoll_fd, EPOLL_CTL_ADD, server_sock, &event) == -1)
|
||||||
{
|
{
|
||||||
perror("xbanan: epoll_ctl");
|
perror("xbanan: epoll_ctl");
|
||||||
return 1;
|
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 { \
|
||||||
MUST(g_atoms_id_to_name.insert(name, #name##_sv.substring(3))); \
|
MUST(g_atoms_id_to_name.insert(name, #name##_sv.substring(3))); \
|
||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user