diff --git a/seat.c b/seat.c index a36b04a..4cbba53 100644 --- a/seat.c +++ b/seat.c @@ -47,25 +47,7 @@ view_at(struct cg_view *view, double lx, double ly, double view_sy = ly - view->y; double _sx, _sy; - struct wlr_surface *_surface = NULL; - switch (view->type) { - case CAGE_XDG_SHELL_VIEW: - _surface = wlr_xdg_surface_surface_at(view->xdg_surface, - view_sx, view_sy, - &_sx, &_sy); - break; -#ifdef CAGE_HAS_XWAYLAND - case CAGE_XWAYLAND_VIEW: - _surface = wlr_surface_surface_at(view->wlr_surface, - view_sx, view_sy, - &_sx, &_sy); - break; -#endif - default: - wlr_log(WLR_ERROR, "Unrecognized view type: %d", view->type); - } - - + struct wlr_surface *_surface = view_wlr_surface_at(view, view_sx, view_sy, &_sx, &_sy); if (_surface != NULL) { *sx = _sx; *sy = _sy; diff --git a/view.c b/view.c index 165524b..2ee8a67 100644 --- a/view.c +++ b/view.c @@ -57,6 +57,12 @@ view_for_each_surface(struct cg_view *view, wlr_surface_iterator_func_t iterator view->for_each_surface(view, iterator, data); } +struct wlr_surface * +view_wlr_surface_at(struct cg_view *view, double sx, double sy, double *sub_x, double *sub_y) +{ + return view->wlr_surface_at(view, sx, sy, sub_x, sub_y); +} + bool view_is_primary(struct cg_view *view) { diff --git a/view.h b/view.h index 3f85663..8cef74b 100644 --- a/view.h +++ b/view.h @@ -43,6 +43,8 @@ struct cg_view { void (*get_geometry)(struct cg_view *view, int *width_out, int *height_out); void (*for_each_surface)(struct cg_view *view, wlr_surface_iterator_func_t iterator, void *data); + struct wlr_surface *(*wlr_surface_at)(struct cg_view *view, double sx, double sy, + double *sub_x, double *sub_y); bool (*is_primary)(struct cg_view *view); }; @@ -50,6 +52,8 @@ void view_activate(struct cg_view *view, bool activate); void view_maximize(struct cg_view *view); void view_center(struct cg_view *view); void view_for_each_surface(struct cg_view *view, wlr_surface_iterator_func_t iterator, void *data); +struct wlr_surface *view_wlr_surface_at(struct cg_view *view, double sx, double sy, + double *sub_x, double *sub_y); bool view_is_primary(struct cg_view *view); void view_unmap(struct cg_view *view); void view_map(struct cg_view *view, struct wlr_surface *surface); diff --git a/xdg_shell.c b/xdg_shell.c index 6be47c3..9e18a72 100644 --- a/xdg_shell.c +++ b/xdg_shell.c @@ -44,6 +44,12 @@ for_each_surface(struct cg_view *view, wlr_surface_iterator_func_t iterator, wlr_xdg_surface_for_each_surface(view->xdg_surface, iterator, data); } +static struct wlr_surface * +wlr_surface_at(struct cg_view *view, double sx, double sy, double *sub_x, double *sub_y) +{ + return wlr_xdg_surface_surface_at(view->xdg_surface, sx, sy, sub_x, sub_y); +} + static bool is_primary(struct cg_view *view) { @@ -94,5 +100,6 @@ handle_xdg_shell_surface_new(struct wl_listener *listener, void *data) view->maximize = maximize; view->get_geometry = get_geometry; view->for_each_surface = for_each_surface; + view->wlr_surface_at = wlr_surface_at; view->is_primary = is_primary; } diff --git a/xwayland.c b/xwayland.c index e219a96..b025822 100644 --- a/xwayland.c +++ b/xwayland.c @@ -41,6 +41,12 @@ for_each_surface(struct cg_view *view, wlr_surface_iterator_func_t iterator, wlr_surface_for_each_surface(view->wlr_surface, iterator, data); } +static struct wlr_surface * +wlr_surface_at(struct cg_view *view, double sx, double sy, double *sub_x, double *sub_y) +{ + return wlr_surface_surface_at(view->wlr_surface, sx, sy, sub_x, sub_y); +} + static bool is_primary(struct cg_view *view) { @@ -90,5 +96,6 @@ handle_xwayland_surface_new(struct wl_listener *listener, void *data) view->maximize = maximize; view->get_geometry = get_geometry; view->for_each_surface = for_each_surface; + view->wlr_surface_at = wlr_surface_at; view->is_primary = is_primary; }