From d787afb7e33e60fc2c6c0602f07ca0f27a2a1c0b Mon Sep 17 00:00:00 2001 From: Oskari Alaranta Date: Sat, 30 May 2026 17:52:09 +0300 Subject: [PATCH] Disable shared pixmaps on MIT-SHM Our internal pixmap representation does not match what we advertice in out pixmap formats, and there is no way to only enable 24 and 32 depth pixmaps for SHM so just disable them all together. MIT-SHM can still be used through Shm{Get,Put}Image. We probably should store pixmaps as we say we do, but its too much work for now :^) --- xbanan/Base.cpp | 3 +- xbanan/Definitions.h | 3 +- xbanan/ExtSHM.cpp | 65 +------------------------------------------- 3 files changed, 3 insertions(+), 68 deletions(-) diff --git a/xbanan/Base.cpp b/xbanan/Base.cpp index b867f20..fbd19d0 100644 --- a/xbanan/Base.cpp +++ b/xbanan/Base.cpp @@ -2052,8 +2052,7 @@ BAN::ErrorOr handle_packet(Client& client_info, BAN::ConstByteSpan packet) .depth = request.depth, .width = request.width, .height = request.height, - .data = data.span(), - .owned_data = BAN::move(data), + .data = BAN::move(data), } })) )); diff --git a/xbanan/Definitions.h b/xbanan/Definitions.h index 6af8b3a..bb7de9f 100644 --- a/xbanan/Definitions.h +++ b/xbanan/Definitions.h @@ -81,8 +81,7 @@ struct Object CARD8 depth; CARD32 width; CARD32 height; - BAN::ByteSpan data; - BAN::Vector owned_data; + BAN::Vector data; }; struct GraphicsContext diff --git a/xbanan/ExtSHM.cpp b/xbanan/ExtSHM.cpp index 721d2a0..01e3253 100644 --- a/xbanan/ExtSHM.cpp +++ b/xbanan/ExtSHM.cpp @@ -7,42 +7,13 @@ #include #include -#include #include -#include #include static BYTE s_shm_event_base; static BYTE s_shm_error_base; static BYTE s_shm_major_opcode; -static bool is_local_socket(int socket) -{ - sockaddr_storage addr; - socklen_t addr_len = sizeof(addr); - if (getpeername(socket, reinterpret_cast(&addr), &addr_len) == -1) - return false; - - switch (addr.ss_family) - { - case AF_UNIX: - return true; - case AF_INET: - { - const auto* addr_in = reinterpret_cast(&addr); - const auto ipv4 = ntohl(addr_in->sin_addr.s_addr); - return (ipv4 & IN_CLASSA_NET) == IN_LOOPBACKNET; - } - case AF_INET6: - { - const auto* addr_in6 = reinterpret_cast(&addr); - return IN6_IS_ADDR_LOOPBACK(&addr_in6->sin6_addr); - } - } - - return false; -} - static BAN::ErrorOr get_shmseg(Client& client_info, CARD32 shmseg, BYTE op_major, BYTE op_minor) { auto it = g_objects.find(shmseg); @@ -78,7 +49,7 @@ static BAN::ErrorOr extension_shm(Client& client_info, BAN::ConstByteSpan xShmQueryVersionReply reply { .type = X_Reply, - .sharedPixmaps = is_local_socket(client_info.fd), + .sharedPixmaps = false, .sequenceNumber = client_info.sequence, .length = 0, .majorVersion = 1, @@ -265,40 +236,6 @@ 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(client_info, request.shmseg, op_major, op_minor)); - - 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;