mirror of
https://github.com/DreamMaoMao/maomaowm.git
synced 2025-11-02 09:01:43 -05:00
opt: do not use asynchronous timer animation, adopt a unified submission rendering
This commit is contained in:
parent
04874caab4
commit
3abb5bdcdf
1 changed files with 28 additions and 18 deletions
46
maomao.c
46
maomao.c
|
|
@ -235,7 +235,7 @@ typedef struct {
|
||||||
float scroller_proportion;
|
float scroller_proportion;
|
||||||
bool need_set_position;
|
bool need_set_position;
|
||||||
struct dwl_animation animation;
|
struct dwl_animation animation;
|
||||||
struct wl_event_source *timer_tick;
|
// struct wl_event_source *timer_tick;
|
||||||
|
|
||||||
} Client;
|
} Client;
|
||||||
|
|
||||||
|
|
@ -551,7 +551,7 @@ void incovgaps(const Arg *arg);
|
||||||
void incigaps(const Arg *arg);
|
void incigaps(const Arg *arg);
|
||||||
void defaultgaps(const Arg *arg);
|
void defaultgaps(const Arg *arg);
|
||||||
void buffer_set_size(Client *c, animationScale scale_data);
|
void buffer_set_size(Client *c, animationScale scale_data);
|
||||||
int timer_tick_action(void *data);
|
// int timer_tick_action(void *data);
|
||||||
|
|
||||||
#include "dispatch.h"
|
#include "dispatch.h"
|
||||||
|
|
||||||
|
|
@ -614,6 +614,7 @@ static Monitor *selmon;
|
||||||
|
|
||||||
static int enablegaps = 1; /* enables gaps, used by togglegaps */
|
static int enablegaps = 1; /* enables gaps, used by togglegaps */
|
||||||
static int axis_apply_time = 0;
|
static int axis_apply_time = 0;
|
||||||
|
static int axis_apply_dir = 0;
|
||||||
|
|
||||||
/* global event handlers */
|
/* global event handlers */
|
||||||
static struct zdwl_ipc_manager_v2_interface dwl_manager_implementation = {
|
static struct zdwl_ipc_manager_v2_interface dwl_manager_implementation = {
|
||||||
|
|
@ -1597,11 +1598,14 @@ axisnotify(struct wl_listener *listener, void *data) {
|
||||||
a = &config.axis_bindings[ji];
|
a = &config.axis_bindings[ji];
|
||||||
if (CLEANMASK(mods) == CLEANMASK(a->mod) && // 按键一致
|
if (CLEANMASK(mods) == CLEANMASK(a->mod) && // 按键一致
|
||||||
adir == a->dir && a->func) { // 滚轮方向判断一致且处理函数存在
|
adir == a->dir && a->func) { // 滚轮方向判断一致且处理函数存在
|
||||||
if (event->time_msec - axis_apply_time > axis_bind_apply_timeout) {
|
if (event->time_msec - axis_apply_time > axis_bind_apply_timeout ||
|
||||||
|
axis_apply_dir * event->delta < 0) {
|
||||||
a->func(&a->arg);
|
a->func(&a->arg);
|
||||||
axis_apply_time = event->time_msec;
|
axis_apply_time = event->time_msec;
|
||||||
|
axis_apply_dir = event->delta > 0 ? 1 : -1;
|
||||||
return; // 如果成功匹配就不把这个滚轮事件传送给客户端了
|
return; // 如果成功匹配就不把这个滚轮事件传送给客户端了
|
||||||
} else {
|
} else {
|
||||||
|
axis_apply_dir = event->delta > 0 ? 1 : -1;
|
||||||
axis_apply_time = event->time_msec;
|
axis_apply_time = event->time_msec;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -3127,8 +3131,8 @@ mapnotify(struct wl_listener *listener, void *data) {
|
||||||
c->scene->node.data = c->scene_surface->node.data = c;
|
c->scene->node.data = c->scene_surface->node.data = c;
|
||||||
|
|
||||||
client_get_geometry(c, &c->geom);
|
client_get_geometry(c, &c->geom);
|
||||||
c->timer_tick = wl_event_loop_add_timer(wl_display_get_event_loop(dpy), timer_tick_action, c);
|
// c->timer_tick = wl_event_loop_add_timer(wl_display_get_event_loop(dpy), timer_tick_action, c);
|
||||||
wl_event_source_timer_update(c->timer_tick, 0);
|
// wl_event_source_timer_update(c->timer_tick, 0);
|
||||||
|
|
||||||
/* Handle unmanaged clients first so we can return prior create borders */
|
/* Handle unmanaged clients first so we can return prior create borders */
|
||||||
if (client_is_unmanaged(c)) {
|
if (client_is_unmanaged(c)) {
|
||||||
|
|
@ -3688,12 +3692,14 @@ void rendermon(struct wl_listener *listener, void *data) {
|
||||||
struct wlr_output_state pending = {0};
|
struct wlr_output_state pending = {0};
|
||||||
|
|
||||||
struct timespec now;
|
struct timespec now;
|
||||||
|
bool need_more_frames = false;
|
||||||
|
|
||||||
// Draw frames for all clients
|
// Draw frames for all clients
|
||||||
wl_list_for_each(c, &clients, link) {
|
wl_list_for_each(c, &clients, link) {
|
||||||
client_draw_frame(c);
|
need_more_frames = client_draw_frame(c) || need_more_frames;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
wlr_scene_output_commit(m->scene_output, NULL);
|
wlr_scene_output_commit(m->scene_output, NULL);
|
||||||
|
|
||||||
// Send frame done notification
|
// Send frame done notification
|
||||||
|
|
@ -3702,6 +3708,10 @@ void rendermon(struct wl_listener *listener, void *data) {
|
||||||
|
|
||||||
// // Clean up pending state
|
// // Clean up pending state
|
||||||
wlr_output_state_finish(&pending);
|
wlr_output_state_finish(&pending);
|
||||||
|
|
||||||
|
if (need_more_frames) {
|
||||||
|
wlr_output_schedule_frame(m->wlr_output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void // 0.5
|
void // 0.5
|
||||||
|
|
@ -3903,7 +3913,7 @@ void resize(Client *c, struct wlr_box geo, int interact) {
|
||||||
if (!c->mon)
|
if (!c->mon)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wl_event_source_timer_update(c->timer_tick, 10);
|
// wl_event_source_timer_update(c->timer_tick, 10);
|
||||||
c->need_set_position = true;
|
c->need_set_position = true;
|
||||||
// oldgeom = c->geom;
|
// oldgeom = c->geom;
|
||||||
bbox = interact ? &sgeom : &c->mon->w;
|
bbox = interact ? &sgeom : &c->mon->w;
|
||||||
|
|
@ -4390,18 +4400,18 @@ void signalhandler(int signalnumber) {
|
||||||
// 不调用 exit 以允许生成核心转储文件
|
// 不调用 exit 以允许生成核心转储文件
|
||||||
}
|
}
|
||||||
|
|
||||||
int timer_tick_action(void *data) {
|
// int timer_tick_action(void *data) {
|
||||||
Client *c = (Client *)data;
|
// Client *c = (Client *)data;
|
||||||
|
|
||||||
if (c->animation.running) {
|
// if (c->animation.running) {
|
||||||
wlr_output_schedule_frame(c->mon->wlr_output);
|
// wlr_output_schedule_frame(c->mon->wlr_output);
|
||||||
wl_event_source_timer_update(c->timer_tick, 10);
|
// wl_event_source_timer_update(c->timer_tick, 10);
|
||||||
} else {
|
// } else {
|
||||||
wl_event_source_timer_update(c->timer_tick, 0);
|
// wl_event_source_timer_update(c->timer_tick, 0);
|
||||||
}
|
// }
|
||||||
|
|
||||||
return 0;
|
// return 0;
|
||||||
}
|
// }
|
||||||
|
|
||||||
void setup(void) {
|
void setup(void) {
|
||||||
|
|
||||||
|
|
@ -5424,7 +5434,7 @@ void unmapnotify(struct wl_listener *listener, void *data) {
|
||||||
wlr_foreign_toplevel_handle_v1_destroy(c->foreign_toplevel);
|
wlr_foreign_toplevel_handle_v1_destroy(c->foreign_toplevel);
|
||||||
c->foreign_toplevel = NULL;
|
c->foreign_toplevel = NULL;
|
||||||
}
|
}
|
||||||
wl_event_source_remove(c->timer_tick);
|
// wl_event_source_remove(c->timer_tick);
|
||||||
wlr_scene_node_destroy(&c->scene->node);
|
wlr_scene_node_destroy(&c->scene->node);
|
||||||
printstatus();
|
printstatus();
|
||||||
motionnotify(0, NULL, 0, 0, 0, 0);
|
motionnotify(0, NULL, 0, 0, 0, 0);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue