From 00df6851840c43c8e35f63846d24addbb7ede694 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Tue, 16 Jun 2026 23:16:55 +0800 Subject: [PATCH] =?UTF-8?q?fix(backend):=20=E4=BF=AE=E5=A4=8D=20backend=5F?= =?UTF-8?q?poll=5Fevent=20=E8=BF=94=E5=9B=9E=E5=80=BC=E6=84=8F=E4=B9=89?= =?UTF-8?q?=E4=B8=8D=E6=98=8E=E5=AF=BC=E8=87=B4=E7=9A=84=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E5=BE=AA=E7=8E=AF=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原因:之前的 backend_poll_event 返回 false 有两种情况 1. 当前就绪的事件已全部处理,没有事件可读了 2. 没有可以转化为感兴趣归一化的事件 当返回值为 false 并且时第二种情况时,底层的 xcb 原始事件未处理完,但不 再处理事件。导致有一部分事件一直无法处理,直到下一批事件待处理时通过文 件描述符状态变更唤醒新一轮的事件读取。这就会导致有些事件处理不及时,造 成卡顿的情况。 通过如下措施解决这个问题: 1. backend_poll_event 返回值只表示是否还有事件未处理完 2. event_t 引入 ZDWM_EVENT_NONE 表示事件为空,无人对该事件感兴趣也不需 要清理 --- src/backend/x11/event.c | 3 ++- src/core/backend.h | 10 ++++++++++ src/core/event.c | 2 +- src/core/event.h | 1 + 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/backend/x11/event.c b/src/backend/x11/event.c index 60aa757..fd6c9f3 100644 --- a/src/backend/x11/event.c +++ b/src/backend/x11/event.c @@ -492,7 +492,8 @@ bool backend_poll_event(backend_t *backend, event_t *event) { auto raw_event = xcb_poll_for_event(backend->conn); if (!raw_event) return false; - return handle_event(backend, raw_event, event); + handle_event(backend, raw_event, event); + return true; } bool backend_next_event(backend_t *backend, event_t *event) { diff --git a/src/core/backend.h b/src/core/backend.h index 36d5238..ac15d50 100644 --- a/src/core/backend.h +++ b/src/core/backend.h @@ -21,6 +21,16 @@ backend_detect_t *backend_detect(backend_t *backend); void backend_detect_destroy(backend_detect_t *detect); int backend_get_fd(backend_t *backend); + +/** + * @brief 非阻塞地从 backend 中读取下一个归一化的事件 + * + * @details + * 1. 函数立即返回 + * 2. 只要取到了事件,函数就返回 true ,事件填充到 event 参数中 + * + * @returns 如果还有下一个事件待读取,返回 true ,否则返回 false + */ bool backend_poll_event(backend_t *backend, event_t *event); /** diff --git a/src/core/event.c b/src/core/event.c index f933eae..693a126 100644 --- a/src/core/event.c +++ b/src/core/event.c @@ -4,7 +4,7 @@ #include "core/window.h" void event_cleanup(event_t *event) { - if (!event) return; + if (!event || event->type == ZDWM_EVENT_NONE) return; switch (event->type) { case ZDWM_EVENT_WINDOW_MAP_REQUEST: diff --git a/src/core/event.h b/src/core/event.h index a2b7adf..1ef45fb 100644 --- a/src/core/event.h +++ b/src/core/event.h @@ -6,6 +6,7 @@ #include "core/window.h" typedef enum event_type_t { + ZDWM_EVENT_NONE, ZDWM_EVENT_KEY_PRESS, ZDWM_EVENT_POINTER_BUTTON_PRESS, ZDWM_EVENT_POINTER_BUTTON_RELEASE,