From 406ea61be06f07b39c6792ccb93027b63dd6eebc Mon Sep 17 00:00:00 2001 From: Oskari Alaranta Date: Sat, 21 Feb 2026 03:43:06 +0200 Subject: [PATCH] Implement ShmCreatePixmap --- xbanan/Base.cpp | 5 +++-- xbanan/Definitions.h | 3 ++- xbanan/ExtSHM.cpp | 36 +++++++++++++++++++++++++++++++++++- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/xbanan/Base.cpp b/xbanan/Base.cpp index 66e1c7a..833b911 100644 --- a/xbanan/Base.cpp +++ b/xbanan/Base.cpp @@ -1208,7 +1208,7 @@ BAN::ErrorOr handle_packet(Client& client_info, BAN::ConstByteSpan packet) { auto& pixmap = object.object.get(); - info.data = pixmap.data.span(); + info.data = pixmap.data; info.w = pixmap.width; info.h = pixmap.height; info.depth = pixmap.depth; @@ -2439,7 +2439,8 @@ BAN::ErrorOr handle_packet(Client& client_info, BAN::ConstByteSpan packet) .depth = request.depth, .width = request.width, .height = request.height, - .data = BAN::move(data), + .data = data.span(), + .owned_data = BAN::move(data), } })) )); diff --git a/xbanan/Definitions.h b/xbanan/Definitions.h index d6bc34c..bab7674 100644 --- a/xbanan/Definitions.h +++ b/xbanan/Definitions.h @@ -99,7 +99,8 @@ struct Object CARD8 depth; CARD32 width; CARD32 height; - BAN::Vector data; + BAN::ByteSpan data; + BAN::Vector owned_data; }; struct GraphicsContext diff --git a/xbanan/ExtSHM.cpp b/xbanan/ExtSHM.cpp index c8683d9..b6b5bc2 100644 --- a/xbanan/ExtSHM.cpp +++ b/xbanan/ExtSHM.cpp @@ -104,7 +104,7 @@ static BAN::ErrorOr extension_shm(Client& client_info, BAN::ConstByteSpan { auto& pixmap = object.object.get(); - info.data = pixmap.data.span(); + info.data = pixmap.data; info.w = pixmap.width; info.h = pixmap.height; info.depth = pixmap.depth; @@ -305,6 +305,40 @@ static BAN::ErrorOr extension_shm(Client& client_info, BAN::ConstByteSpan break; } + case X_ShmCreatePixmap: + { + auto request = decode(packet).value(); + + dprintln("ShmCreatePixmap"); + dprintln(" depth: {}", request.depth); + dprintln(" pid: {}", request.pid); + dprintln(" drawable: {}", request.drawable); + dprintln(" width: {}", request.width); + dprintln(" height: {}", request.height); + dprintln(" shmseg: {}", request.shmseg); + dprintln(" offset: {}", request.offset); + + ASSERT(request.depth == 24 || request.depth == 32); + + void* shm_segment = TRY(get_shmseg(request.shmseg)); + + TRY(client_info.objects.insert(request.pid)); + TRY(g_objects.insert( + request.pid, + TRY(BAN::UniqPtr::create(Object { + .type = Object::Type::Pixmap, + .object = Object::Pixmap { + .depth = request.depth, + .width = request.width, + .height = request.height, + .data = BAN::ByteSpan(static_cast(shm_segment) + request.offset, request.width * request.height * 4), + .owned_data = {}, + } + })) + )); + + break; + } default: dwarnln("unsupported shm minor opcode {}", packet[1]); break;