mirror of
https://github.com/swaywm/sway.git
synced 2026-05-03 06:46:26 -04:00
Reimplement popup rendering
This commit is contained in:
parent
f6e86e6526
commit
f518036ddc
4 changed files with 38 additions and 0 deletions
|
|
@ -37,6 +37,8 @@ struct sway_view_impl {
|
||||||
bool (*wants_floating)(struct sway_view *view);
|
bool (*wants_floating)(struct sway_view *view);
|
||||||
void (*for_each_surface)(struct sway_view *view,
|
void (*for_each_surface)(struct sway_view *view,
|
||||||
wlr_surface_iterator_func_t iterator, void *user_data);
|
wlr_surface_iterator_func_t iterator, void *user_data);
|
||||||
|
void (*for_each_popup)(struct sway_view *view,
|
||||||
|
wlr_surface_iterator_func_t iterator, void *user_data);
|
||||||
void (*close)(struct sway_view *view);
|
void (*close)(struct sway_view *view);
|
||||||
void (*destroy)(struct sway_view *view);
|
void (*destroy)(struct sway_view *view);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -247,6 +247,21 @@ static void render_saved_view(struct sway_view *view, float alpha) {
|
||||||
render_texture(texture, &box, matrix, alpha);
|
render_texture(texture, &box, matrix, alpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void render_popup(struct wlr_surface *surface, int sx, int sy,
|
||||||
|
void *data) {
|
||||||
|
struct sway_view *view = data;
|
||||||
|
double ox = view->swayc->current.view_x - context.output_lx + sx;
|
||||||
|
double oy = view->swayc->current.view_y - context.output_ly + sy;
|
||||||
|
render_surface(surface, ox, oy, view->swayc->alpha);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void render_view_popups(struct sway_container *con, void *data) {
|
||||||
|
struct sway_view *view = con->sway_view;
|
||||||
|
if (view->impl->for_each_popup) {
|
||||||
|
view->impl->for_each_popup(view, render_popup, view);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Render a view's surface and left/bottom/right borders.
|
* Render a view's surface and left/bottom/right borders.
|
||||||
*/
|
*/
|
||||||
|
|
@ -812,6 +827,7 @@ void render_output(struct sway_output *output, struct timespec *when,
|
||||||
|
|
||||||
// TODO: handle views smaller than the output
|
// TODO: handle views smaller than the output
|
||||||
render_surfaces(fullscreen_view->surface, 0, 0, 1.0f);
|
render_surfaces(fullscreen_view->surface, 0, 0, 1.0f);
|
||||||
|
render_view_popups(fullscreen_view->swayc, NULL);
|
||||||
|
|
||||||
if (fullscreen_view->type == SWAY_VIEW_XWAYLAND) {
|
if (fullscreen_view->type == SWAY_VIEW_XWAYLAND) {
|
||||||
render_unmanaged(&root_container.sway_root->xwayland_unmanaged);
|
render_unmanaged(&root_container.sway_root->xwayland_unmanaged);
|
||||||
|
|
@ -833,6 +849,7 @@ void render_output(struct sway_output *output, struct timespec *when,
|
||||||
struct sway_container *focus = seat_get_focus(seat);
|
struct sway_container *focus = seat_get_focus(seat);
|
||||||
render_container(workspace, focus == workspace);
|
render_container(workspace, focus == workspace);
|
||||||
render_floating();
|
render_floating();
|
||||||
|
container_descendants(workspace, C_VIEW, render_view_popups, NULL);
|
||||||
|
|
||||||
render_unmanaged(&root_container.sway_root->xwayland_unmanaged);
|
render_unmanaged(&root_container.sway_root->xwayland_unmanaged);
|
||||||
render_layer(&output->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP]);
|
render_layer(&output->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP]);
|
||||||
|
|
|
||||||
|
|
@ -147,6 +147,14 @@ static void for_each_surface(struct sway_view *view,
|
||||||
user_data);
|
user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void for_each_popup(struct sway_view *view,
|
||||||
|
wlr_surface_iterator_func_t iterator, void *user_data) {
|
||||||
|
if (xdg_shell_view_from_view(view) == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
wlr_xdg_surface_for_each_popup(view->wlr_xdg_surface, iterator, user_data);
|
||||||
|
}
|
||||||
|
|
||||||
static void _close(struct sway_view *view) {
|
static void _close(struct sway_view *view) {
|
||||||
if (xdg_shell_view_from_view(view) == NULL) {
|
if (xdg_shell_view_from_view(view) == NULL) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -174,6 +182,7 @@ static const struct sway_view_impl view_impl = {
|
||||||
.set_fullscreen = set_fullscreen,
|
.set_fullscreen = set_fullscreen,
|
||||||
.wants_floating = wants_floating,
|
.wants_floating = wants_floating,
|
||||||
.for_each_surface = for_each_surface,
|
.for_each_surface = for_each_surface,
|
||||||
|
.for_each_popup = for_each_popup,
|
||||||
.close = _close,
|
.close = _close,
|
||||||
.destroy = destroy,
|
.destroy = destroy,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -143,6 +143,15 @@ static void for_each_surface(struct sway_view *view,
|
||||||
user_data);
|
user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void for_each_popup(struct sway_view *view,
|
||||||
|
wlr_surface_iterator_func_t iterator, void *user_data) {
|
||||||
|
if (xdg_shell_v6_view_from_view(view) == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
wlr_xdg_surface_v6_for_each_popup(view->wlr_xdg_surface_v6, iterator,
|
||||||
|
user_data);
|
||||||
|
}
|
||||||
|
|
||||||
static void _close(struct sway_view *view) {
|
static void _close(struct sway_view *view) {
|
||||||
if (xdg_shell_v6_view_from_view(view) == NULL) {
|
if (xdg_shell_v6_view_from_view(view) == NULL) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -170,6 +179,7 @@ static const struct sway_view_impl view_impl = {
|
||||||
.set_fullscreen = set_fullscreen,
|
.set_fullscreen = set_fullscreen,
|
||||||
.wants_floating = wants_floating,
|
.wants_floating = wants_floating,
|
||||||
.for_each_surface = for_each_surface,
|
.for_each_surface = for_each_surface,
|
||||||
|
.for_each_popup = for_each_popup,
|
||||||
.close = _close,
|
.close = _close,
|
||||||
.destroy = destroy,
|
.destroy = destroy,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue