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
* 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;
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
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 {
}
}
+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)
{
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);
}
}
}
- if (view->toplevel.handle) {
- foreign_toplevel_update_outputs(view);
- }
+ view_update_outputs(view);
}
void