fix(backend): 修复 backend_poll_event 返回值意义不明导致的事件循环 bug
原因:之前的 backend_poll_event 返回 false 有两种情况 1. 当前就绪的事件已全部处理,没有事件可读了 2. 没有可以转化为感兴趣归一化的事件 当返回值为 false 并且时第二种情况时,底层的 xcb 原始事件未处理完,但不 再处理事件。导致有一部分事件一直无法处理,直到下一批事件待处理时通过文 件描述符状态变更唤醒新一轮的事件读取。这就会导致有些事件处理不及时,造 成卡顿的情况。 通过如下措施解决这个问题: 1. backend_poll_event 返回值只表示是否还有事件未处理完 2. event_t 引入 ZDWM_EVENT_NONE 表示事件为空,无人对该事件感兴趣也不需 要清理
This commit is contained in:
@@ -492,7 +492,8 @@ bool backend_poll_event(backend_t *backend, event_t *event) {
|
|||||||
auto raw_event = xcb_poll_for_event(backend->conn);
|
auto raw_event = xcb_poll_for_event(backend->conn);
|
||||||
if (!raw_event) return false;
|
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) {
|
bool backend_next_event(backend_t *backend, event_t *event) {
|
||||||
|
|||||||
@@ -21,6 +21,16 @@ backend_detect_t *backend_detect(backend_t *backend);
|
|||||||
void backend_detect_destroy(backend_detect_t *detect);
|
void backend_detect_destroy(backend_detect_t *detect);
|
||||||
|
|
||||||
int backend_get_fd(backend_t *backend);
|
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);
|
bool backend_poll_event(backend_t *backend, event_t *event);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
#include "core/window.h"
|
#include "core/window.h"
|
||||||
|
|
||||||
void event_cleanup(event_t *event) {
|
void event_cleanup(event_t *event) {
|
||||||
if (!event) return;
|
if (!event || event->type == ZDWM_EVENT_NONE) return;
|
||||||
|
|
||||||
switch (event->type) {
|
switch (event->type) {
|
||||||
case ZDWM_EVENT_WINDOW_MAP_REQUEST:
|
case ZDWM_EVENT_WINDOW_MAP_REQUEST:
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include "core/window.h"
|
#include "core/window.h"
|
||||||
|
|
||||||
typedef enum event_type_t {
|
typedef enum event_type_t {
|
||||||
|
ZDWM_EVENT_NONE,
|
||||||
ZDWM_EVENT_KEY_PRESS,
|
ZDWM_EVENT_KEY_PRESS,
|
||||||
ZDWM_EVENT_POINTER_BUTTON_PRESS,
|
ZDWM_EVENT_POINTER_BUTTON_PRESS,
|
||||||
ZDWM_EVENT_POINTER_BUTTON_RELEASE,
|
ZDWM_EVENT_POINTER_BUTTON_RELEASE,
|
||||||
|
|||||||
Reference in New Issue
Block a user