osd: only call wl_array_{init,relesase} once

This commit is contained in:
Johan Malm 2024-03-04 20:30:31 +00:00 committed by Consolatis
parent 247d2b581c
commit 72a41058af

View file

@ -397,20 +397,16 @@ render_osd(struct server *server, cairo_t *cairo, int w, int h,
} }
static void static void
display_osd(struct output *output) display_osd(struct output *output, struct wl_array *views)
{ {
struct server *server = output->server; struct server *server = output->server;
struct theme *theme = server->theme; struct theme *theme = server->theme;
bool show_workspace = wl_list_length(&rc.workspace_config.workspaces) > 1; bool show_workspace = wl_list_length(&rc.workspace_config.workspaces) > 1;
const char *workspace_name = server->workspace_current->name; const char *workspace_name = server->workspace_current->name;
struct wl_array views;
wl_array_init(&views);
view_array_append(server, &views, rc.window_switcher.criteria);
float scale = output->wlr_output->scale; float scale = output->wlr_output->scale;
int w = theme->osd_window_switcher_width; int w = theme->osd_window_switcher_width;
int h = wl_array_len(&views) * rc.theme->osd_window_switcher_item_height int h = wl_array_len(views) * rc.theme->osd_window_switcher_item_height
+ 2 * rc.theme->osd_border_width + 2 * rc.theme->osd_border_width
+ 2 * rc.theme->osd_window_switcher_padding; + 2 * rc.theme->osd_window_switcher_padding;
if (show_workspace) { if (show_workspace) {
@ -430,8 +426,7 @@ display_osd(struct output *output)
/* Render OSD image */ /* Render OSD image */
cairo_t *cairo = output->osd_buffer->cairo; cairo_t *cairo = output->osd_buffer->cairo;
render_osd(server, cairo, w, h, show_workspace, workspace_name, &views); render_osd(server, cairo, w, h, show_workspace, workspace_name, views);
wl_array_release(&views);
struct wlr_scene_buffer *scene_buffer = wlr_scene_buffer_create( struct wlr_scene_buffer *scene_buffer = wlr_scene_buffer_create(
output->osd_tree, &output->osd_buffer->base); output->osd_tree, &output->osd_buffer->base);
@ -452,23 +447,16 @@ display_osd(struct output *output)
cursor_update_focus(server); cursor_update_focus(server);
} }
static int void
nr_entries(struct server *server) osd_update(struct server *server)
{ {
struct wl_array views; struct wl_array views;
wl_array_init(&views); wl_array_init(&views);
view_array_append(server, &views, rc.window_switcher.criteria); view_array_append(server, &views, rc.window_switcher.criteria);
int count = wl_array_len(&views);
wl_array_release(&views);
return count;
}
void if (!wl_array_len(&views) || !server->osd_state.cycle_view) {
osd_update(struct server *server)
{
if (!nr_entries(server) || !server->osd_state.cycle_view) {
osd_finish(server); osd_finish(server);
return; goto out;
} }
if (rc.window_switcher.show && rc.theme->osd_window_switcher_width > 0) { if (rc.window_switcher.show && rc.theme->osd_window_switcher_width > 0) {
@ -477,7 +465,7 @@ osd_update(struct server *server)
wl_list_for_each(output, &server->outputs, link) { wl_list_for_each(output, &server->outputs, link) {
destroy_osd_nodes(output); destroy_osd_nodes(output);
if (output_is_usable(output)) { if (output_is_usable(output)) {
display_osd(output); display_osd(output, &views);
} }
} }
} }
@ -492,4 +480,6 @@ osd_update(struct server *server)
if (rc.window_switcher.preview) { if (rc.window_switcher.preview) {
preview_cycled_view(server->osd_state.cycle_view); preview_cycled_view(server->osd_state.cycle_view);
} }
out:
wl_array_release(&views);
} }