src/view.c: store outputs the view is visible on

This commit is contained in:
Consolatis 2024-01-31 22:07:13 +01:00
parent e52ccfbcf3
commit 382068e452
3 changed files with 44 additions and 10 deletions

View file

@ -124,7 +124,7 @@ struct view {
struct wl_list link;
/*
* The output that the view is displayed on. Specifically:
* The primary output that the view is displayed on. Specifically:
*
* - For floating views, this is the output nearest to the
* center of the view. It is computed automatically when the
@ -139,6 +139,16 @@ struct view {
* by calling view_set_output() beforehand.
*/
struct output *output;
/*
* The outputs that the view is displayed on.
* This is used to notify the foreign toplevel
* implementation and to update the SSD invisible
* resize area.
* It is a bitset of output->scene_output->index.
*/
uint64_t outputs;
struct workspace *workspace;
struct wlr_surface *surface;
struct wlr_scene_tree *scene_tree;
@ -460,6 +470,7 @@ void view_move_to_front(struct view *view);
void view_move_to_back(struct view *view);
struct view *view_get_root(struct view *view);
void view_append_children(struct view *view, struct wl_array *children);
bool view_on_output(struct view *view, struct output *output);
/**
* view_is_related() - determine if view and surface are owned by the

View file

@ -107,11 +107,10 @@ void
foreign_toplevel_update_outputs(struct view *view)
{
assert(view->toplevel.handle);
struct wlr_output_layout *layout = view->server->output_layout;
struct output *output;
wl_list_for_each(output, &view->server->outputs, link) {
if (output_is_usable(output) && wlr_output_layout_intersects(
layout, output->wlr_output, &view->current)) {
if (view_on_output(view, output)) {
wlr_foreign_toplevel_handle_v1_output_enter(
view->toplevel.handle, output->wlr_output);
} else {

View file

@ -333,6 +333,34 @@ view_close(struct view *view)
}
}
static void
view_update_outputs(struct view *view)
{
struct output *output;
struct wlr_output_layout *layout = view->server->output_layout;
view->outputs = 0;
wl_list_for_each(output, &view->server->outputs, link) {
if (output_is_usable(output) && wlr_output_layout_intersects(
layout, output->wlr_output, &view->current)) {
view->outputs |= (1ull << output->scene_output->index);
}
}
if (view->toplevel.handle) {
foreign_toplevel_update_outputs(view);
}
}
bool
view_on_output(struct view *view, struct output *output)
{
assert(view);
assert(output);
return output->scene_output
&& (view->outputs & (1ull << output->scene_output->index));
}
void
view_move(struct view *view, int x, int y)
{
@ -358,11 +386,9 @@ view_moved(struct view *view)
if (view_is_floating(view)) {
view_discover_output(view, NULL);
}
view_update_outputs(view);
ssd_update_geometry(view->ssd);
cursor_update_focus(view->server);
if (view->toplevel.handle) {
foreign_toplevel_update_outputs(view);
}
if (rc.resize_indicator && view->server->grabbed_view == view) {
resize_indicator_update(view);
}
@ -1467,9 +1493,7 @@ view_adjust_for_layout_change(struct view *view)
}
}
if (view->toplevel.handle) {
foreign_toplevel_update_outputs(view);
}
view_update_outputs(view);
}
void