opt: update backgroup blur cache if backgrop layer update
This commit is contained in:
54
src/maomao.c
54
src/maomao.c
@@ -3030,25 +3030,19 @@ void closemon(Monitor *m) {
|
|||||||
|
|
||||||
static void iter_layer_scene_buffers(struct wlr_scene_buffer *buffer, int sx,
|
static void iter_layer_scene_buffers(struct wlr_scene_buffer *buffer, int sx,
|
||||||
int sy, void *user_data) {
|
int sy, void *user_data) {
|
||||||
LayerSurface *l = user_data;
|
|
||||||
|
|
||||||
struct wlr_scene_surface *scene_surface =
|
struct wlr_scene_surface *scene_surface =
|
||||||
wlr_scene_surface_try_from_buffer(buffer);
|
wlr_scene_surface_try_from_buffer(buffer);
|
||||||
if (!scene_surface) {
|
if (!scene_surface) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (blur && blur_layer && l) {
|
|
||||||
wlr_scene_buffer_set_backdrop_blur(buffer, true);
|
wlr_scene_buffer_set_backdrop_blur(buffer, true);
|
||||||
|
wlr_scene_buffer_set_backdrop_blur_ignore_transparent(buffer, true);
|
||||||
if (blur_optimized) {
|
if (blur_optimized) {
|
||||||
wlr_scene_buffer_set_backdrop_blur_optimized(buffer, true);
|
wlr_scene_buffer_set_backdrop_blur_optimized(buffer, true);
|
||||||
} else {
|
} else {
|
||||||
wlr_scene_buffer_set_backdrop_blur_optimized(buffer, false);
|
wlr_scene_buffer_set_backdrop_blur_optimized(buffer, false);
|
||||||
}
|
}
|
||||||
wlr_scene_buffer_set_backdrop_blur_ignore_transparent(buffer, true);
|
|
||||||
} else {
|
|
||||||
wlr_scene_buffer_set_backdrop_blur(buffer, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void commitlayersurfacenotify(struct wl_listener *listener, void *data) {
|
void commitlayersurfacenotify(struct wl_listener *listener, void *data) {
|
||||||
@@ -3057,6 +3051,7 @@ void commitlayersurfacenotify(struct wl_listener *listener, void *data) {
|
|||||||
struct wlr_scene_tree *scene_layer =
|
struct wlr_scene_tree *scene_layer =
|
||||||
layers[layermap[layer_surface->current.layer]];
|
layers[layermap[layer_surface->current.layer]];
|
||||||
struct wlr_layer_surface_v1_state old_state;
|
struct wlr_layer_surface_v1_state old_state;
|
||||||
|
struct wlr_layer_surface_v1 *wlr_layer_surface = l->layer_surface;
|
||||||
|
|
||||||
if (l->layer_surface->initial_commit) {
|
if (l->layer_surface->initial_commit) {
|
||||||
client_set_scale(layer_surface->surface, l->mon->wlr_output->scale);
|
client_set_scale(layer_surface->surface, l->mon->wlr_output->scale);
|
||||||
@@ -3070,6 +3065,29 @@ void commitlayersurfacenotify(struct wl_listener *listener, void *data) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (blur && blur_layer) {
|
||||||
|
// 设置非背景layer模糊
|
||||||
|
if (wlr_layer_surface->current.layer !=
|
||||||
|
ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM &&
|
||||||
|
wlr_layer_surface->current.layer !=
|
||||||
|
ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND) {
|
||||||
|
wlr_scene_node_for_each_buffer(&l->scene->node,
|
||||||
|
iter_layer_scene_buffers, l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (blur) {
|
||||||
|
// 如果背景层发生变化,标记优化的模糊背景缓存需要更新
|
||||||
|
if (wlr_layer_surface->current.layer ==
|
||||||
|
ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND ||
|
||||||
|
wlr_layer_surface->current.layer ==
|
||||||
|
ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM) {
|
||||||
|
if (l->mon) {
|
||||||
|
wlr_scene_optimized_blur_mark_dirty(l->mon->blur);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (layer_surface == exclusive_focus &&
|
if (layer_surface == exclusive_focus &&
|
||||||
layer_surface->current.keyboard_interactive !=
|
layer_surface->current.keyboard_interactive !=
|
||||||
ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE)
|
ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE)
|
||||||
@@ -3092,28 +3110,6 @@ void commitlayersurfacenotify(struct wl_listener *listener, void *data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
arrangelayers(l->mon);
|
arrangelayers(l->mon);
|
||||||
|
|
||||||
if (blur) {
|
|
||||||
// Rerender the optimized blur on change
|
|
||||||
struct wlr_layer_surface_v1 *wlr_layer_surface = l->layer_surface;
|
|
||||||
|
|
||||||
if (wlr_layer_surface->current.layer !=
|
|
||||||
ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM &&
|
|
||||||
wlr_layer_surface->current.layer !=
|
|
||||||
ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND) {
|
|
||||||
wlr_scene_node_for_each_buffer(&l->scene->node,
|
|
||||||
iter_layer_scene_buffers, l);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wlr_layer_surface->current.layer ==
|
|
||||||
ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND ||
|
|
||||||
wlr_layer_surface->current.layer ==
|
|
||||||
ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM) {
|
|
||||||
if (l->mon) {
|
|
||||||
wlr_scene_optimized_blur_mark_dirty(l->mon->blur);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void client_set_pending_state(Client *c) {
|
void client_set_pending_state(Client *c) {
|
||||||
|
|||||||
Reference in New Issue
Block a user