原因:之前的 backend_poll_event 返回 false 有两种情况 1. 当前就绪的事件已全部处理,没有事件可读了 2. 没有可以转化为感兴趣归一化的事件 当返回值为 false 并且时第二种情况时,底层的 xcb 原始事件未处理完,但不 再处理事件。导致有一部分事件一直无法处理,直到下一批事件待处理时通过文 件描述符状态变更唤醒新一轮的事件读取。这就会导致有些事件处理不及时,造 成卡顿的情况。 通过如下措施解决这个问题: 1. backend_poll_event 返回值只表示是否还有事件未处理完 2. event_t 引入 ZDWM_EVENT_NONE 表示事件为空,无人对该事件感兴趣也不需 要清理
28 lines
643 B
C
28 lines
643 B
C
#include "core/event.h"
|
|
|
|
#include "base/memory.h"
|
|
#include "core/window.h"
|
|
|
|
void event_cleanup(event_t *event) {
|
|
if (!event || event->type == ZDWM_EVENT_NONE) return;
|
|
|
|
switch (event->type) {
|
|
case ZDWM_EVENT_WINDOW_MAP_REQUEST:
|
|
window_layer_props_cleanup(&event->as.window_map_request.props);
|
|
window_metadata_cleanup(&event->as.window_map_request.metadata);
|
|
break;
|
|
case ZDWM_EVENT_WINDOW_METADATA_CHANGED:
|
|
window_metadata_cleanup(&event->as.window_metadata_change.metadata);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void event_reset(event_t *event) {
|
|
if (!event) return;
|
|
|
|
event_cleanup(event);
|
|
p_clear(event, 1);
|
|
}
|