From 24baab2e8496967859ea4bd93b904980558932e5 Mon Sep 17 00:00:00 2001 From: Oskari Alaranta Date: Thu, 12 Feb 2026 02:38:08 +0200 Subject: [PATCH] Cleanup extensions --- xbanan/Base.cpp | 2 ++ xbanan/CMakeLists.txt | 1 + xbanan/ExtBigReg.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ xbanan/ExtRANDR.cpp | 19 +++++++++---------- xbanan/ExtRANDR.h | 5 ----- xbanan/Extensions.cpp | 11 ++++++++++- xbanan/Extensions.h | 5 +++-- xbanan/main.cpp | 31 ------------------------------- 8 files changed, 66 insertions(+), 49 deletions(-) create mode 100644 xbanan/ExtBigReg.cpp delete mode 100644 xbanan/ExtRANDR.h diff --git a/xbanan/Base.cpp b/xbanan/Base.cpp index b0bb76e..6dd6254 100644 --- a/xbanan/Base.cpp +++ b/xbanan/Base.cpp @@ -3073,6 +3073,8 @@ BAN::ErrorOr handle_packet(Client& client_info, BAN::ConstByteSpan packet) continue; reply.present = xTrue; reply.major_opcode = extension.major_opcode; + reply.first_event = extension.event_base; + reply.first_error = extension.error_base; break; } diff --git a/xbanan/CMakeLists.txt b/xbanan/CMakeLists.txt index f4bb44b..a7376af 100644 --- a/xbanan/CMakeLists.txt +++ b/xbanan/CMakeLists.txt @@ -2,6 +2,7 @@ set(SOURCES main.cpp Base.cpp Extensions.cpp + ExtBigReg.cpp ExtRANDR.cpp Keymap.cpp ) diff --git a/xbanan/ExtBigReg.cpp b/xbanan/ExtBigReg.cpp new file mode 100644 index 0000000..0c65298 --- /dev/null +++ b/xbanan/ExtBigReg.cpp @@ -0,0 +1,41 @@ +#include "Extensions.h" +#include "Utils.h" + +#include +#include + +BAN::ErrorOr extension_bigrequests(Client& client_info, BAN::ConstByteSpan packet) +{ + switch (packet[1]) + { + case X_BigReqEnable: + { + xGenericReply reply { + .type = X_Reply, + .sequenceNumber = client_info.sequence, + .length = 0, + .data00 = (16 << 20) / 4, // 16 MiB + }; + TRY(encode(client_info.output_buffer, reply)); + + client_info.has_bigrequests = true; + + dprintln("client enabled big requests"); + + break; + } + default: + dwarnln("invalid BIG-REQUESTS minor opcode {}", packet[1]); + return BAN::Error::from_errno(EINVAL); + } + + return {}; +} + +static struct BigRegInstaller +{ + BigRegInstaller() + { + install_extension(XBigReqExtensionName, XBigReqNumberEvents, XBigReqNumberErrors, extension_bigrequests); + } +} installer; diff --git a/xbanan/ExtRANDR.cpp b/xbanan/ExtRANDR.cpp index d02a1b0..c1d11e1 100644 --- a/xbanan/ExtRANDR.cpp +++ b/xbanan/ExtRANDR.cpp @@ -1,5 +1,4 @@ #include "Extensions.h" -#include "ExtRANDR.h" #include "Utils.h" #include @@ -7,15 +6,7 @@ #include -static struct RANDRInstaller -{ - RANDRInstaller() - { - install_extension(RANDR_NAME, extension_randr); - } -} installer; - -BAN::ErrorOr extension_randr(Client& client_info, BAN::ConstByteSpan packet) +static BAN::ErrorOr extension_randr(Client& client_info, BAN::ConstByteSpan packet) { static CARD32 crtc_id = 5; static CARD32 output_id = 6; @@ -479,3 +470,11 @@ BAN::ErrorOr extension_randr(Client& client_info, BAN::ConstByteSpan packe return {}; } + +static struct RANDRInstaller +{ + RANDRInstaller() + { + install_extension(RANDR_NAME, RRNumberEvents, RRNumberErrors, extension_randr); + } +} installer; diff --git a/xbanan/ExtRANDR.h b/xbanan/ExtRANDR.h deleted file mode 100644 index 44e8bd7..0000000 --- a/xbanan/ExtRANDR.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#include "Definitions.h" - -BAN::ErrorOr extension_randr(Client& client_info, BAN::ConstByteSpan packet); diff --git a/xbanan/Extensions.cpp b/xbanan/Extensions.cpp index 9c9ba9c..6dd1631 100644 --- a/xbanan/Extensions.cpp +++ b/xbanan/Extensions.cpp @@ -1,14 +1,23 @@ #include "Extensions.h" +#include + static uint8_t g_extension_opcode { 128 }; +static uint8_t g_extension_event_base { LASTEvent }; +static uint8_t g_extension_error_base { FirstExtensionError }; + BAN::Array g_extensions; -void install_extension(BAN::StringView name, BAN::ErrorOr (*handler)(Client&, BAN::ConstByteSpan)) +void install_extension(BAN::StringView name, uint8_t event_count, uint8_t error_count, BAN::ErrorOr (*handler)(Client&, BAN::ConstByteSpan)) { g_extensions[g_extension_opcode - 128] = { .name = name, .major_opcode = g_extension_opcode, + .event_base = g_extension_event_base, + .error_base = g_extension_error_base, .handler = handler, }; g_extension_opcode++; + g_extension_event_base += event_count; + g_extension_error_base += error_count; } diff --git a/xbanan/Extensions.h b/xbanan/Extensions.h index ce6950e..5a66142 100644 --- a/xbanan/Extensions.h +++ b/xbanan/Extensions.h @@ -8,10 +8,11 @@ struct Extension { BAN::StringView name; uint8_t major_opcode; - uint8_t opcode_count; + uint8_t event_base; + uint8_t error_base; BAN::ErrorOr (*handler)(Client&, BAN::ConstByteSpan); }; -void install_extension(BAN::StringView name, BAN::ErrorOr (*handler)(Client&, BAN::ConstByteSpan)); +void install_extension(BAN::StringView name, uint8_t event_count, uint8_t error_count, BAN::ErrorOr (*handler)(Client&, BAN::ConstByteSpan)); extern BAN::Array g_extensions; diff --git a/xbanan/main.cpp b/xbanan/main.cpp index 6fb5119..ea75735 100644 --- a/xbanan/main.cpp +++ b/xbanan/main.cpp @@ -1,6 +1,5 @@ #include "Base.h" #include "Definitions.h" -#include "Extensions.h" #include "Keymap.h" #include "Utils.h" @@ -95,34 +94,6 @@ ATOM g_atom_value = XA_LAST_PREDEFINED + 1; int g_epoll_fd; BAN::HashMap g_epoll_thingies; -BAN::ErrorOr extension_bigrequests(Client& client_info, BAN::ConstByteSpan packet) -{ - switch (packet[1]) - { - case 0: - { - xGenericReply reply { - .type = X_Reply, - .sequenceNumber = client_info.sequence, - .length = 0, - .data00 = (16 << 20) / 4, // 16 MiB - }; - TRY(encode(client_info.output_buffer, reply)); - - client_info.has_bigrequests = true; - - dprintln("client enabled big requests"); - - break; - } - default: - dwarnln("invalid BIG-REQUESTS minor opcode {}", packet[1]); - return BAN::Error::from_errno(EINVAL); - } - - return {}; -} - int main() { for (int sig = 1; sig < NSIG; sig++) @@ -269,8 +240,6 @@ int main() MUST(initialize_keymap()); - install_extension("BIG-REQUESTS"_sv, extension_bigrequests); - printf("xbanan started\n"); const auto close_client =