enum view_type type;
const struct view_impl *impl;
struct wl_list link;
+ struct output *output;
union {
struct wlr_xdg_surface *xdg_surface;
wlr_surface_iterator_func_t iterator, void *user_data);
void view_for_each_popup_surface(struct view *view,
wlr_surface_iterator_func_t iterator, void *data);
-void view_output_enter(struct view *view, struct wlr_output *wlr_output);
-void view_output_leave(struct view *view, struct wlr_output *wlr_output);
+void view_discover_output(struct view *view);
void view_move_to_edge(struct view *view, const char *direction);
void view_snap_to_edge(struct view *view, const char *direction);
const char *view_get_string_prop(struct view *view, const char *prop);
view->impl->configure(view, geo);
}
ssd_update_title(view);
+ view_discover_output(view);
}
void
if (view->impl->move) {
view->impl->move(view, x, y);
}
+ view_discover_output(view);
}
#define MIN_VIEW_WIDTH (100)
return border;
}
-void
+static void
surface_enter_for_each_surface(struct wlr_surface *surface, int sx, int sy,
void *user_data)
{
wlr_surface_send_enter(surface, wlr_output);
}
-void
+static void
surface_leave_for_each_surface(struct wlr_surface *surface, int sx, int sy,
void *user_data)
{
wlr_surface_send_leave(surface, wlr_output);
}
-void
+static void
view_output_enter(struct view *view, struct wlr_output *wlr_output)
{
view_for_each_surface(view, surface_enter_for_each_surface,
}
}
-void
+static void
view_output_leave(struct view *view, struct wlr_output *wlr_output)
{
view_for_each_surface(view, surface_leave_for_each_surface,
}
}
+/*
+ * At present, a view can only 'enter' one output at a time, although the view
+ * may span multiple outputs. Ideally we would handle multiple outputs, but
+ * this method is the simplest form of what we want.
+ */
+void
+view_discover_output(struct view *view)
+{
+ struct output *old_output = view->output;
+ struct output *new_output = view_output(view);
+ if (old_output != new_output) {
+ view->output = new_output;
+ view_output_enter(view, new_output->wlr_output);
+ if (old_output) {
+ view_output_leave(view, old_output->wlr_output);
+ }
+ }
+}
+
void
view_move_to_edge(struct view *view, const char *direction)
{
current.link) {
view_subsurface_create(view, subsurface);
}
- struct wlr_output *wlr_output = view_wlr_output(view);
- view_output_enter(view, wlr_output);
+ view_discover_output(view);
view->been_mapped = true;
}