mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-23 05:33:57 -04:00
wayland: add wayl_surface_scale(), and wayl_win_scale()
These functions scale a surface+buffer. For now, only using the legacy scaling method (wl_surface_set_buffer_scale()).
This commit is contained in:
parent
4bd62b1005
commit
0a5073f570
3 changed files with 52 additions and 46 deletions
47
render.c
47
render.c
|
|
@ -1691,8 +1691,8 @@ render_overlay(struct terminal *term)
|
||||||
&(pixman_rectangle16_t){0, 0, term->width, term->height});
|
&(pixman_rectangle16_t){0, 0, term->width, term->height});
|
||||||
|
|
||||||
quirk_weston_subsurface_desync_on(overlay->sub);
|
quirk_weston_subsurface_desync_on(overlay->sub);
|
||||||
|
wayl_surface_scale(term->wl, overlay->surf, term->scale);
|
||||||
wl_subsurface_set_position(overlay->sub, 0, 0);
|
wl_subsurface_set_position(overlay->sub, 0, 0);
|
||||||
wl_surface_set_buffer_scale(overlay->surf, term->scale);
|
|
||||||
wl_surface_attach(overlay->surf, buf->wl_buf, 0, 0);
|
wl_surface_attach(overlay->surf, buf->wl_buf, 0, 0);
|
||||||
|
|
||||||
wl_surface_damage_buffer(
|
wl_surface_damage_buffer(
|
||||||
|
|
@ -1830,12 +1830,9 @@ get_csd_data(const struct terminal *term, enum csd_surface surf_idx)
|
||||||
static void
|
static void
|
||||||
csd_commit(struct terminal *term, struct wl_surface *surf, struct buffer *buf)
|
csd_commit(struct terminal *term, struct wl_surface *surf, struct buffer *buf)
|
||||||
{
|
{
|
||||||
xassert(buf->width % (int)term->scale == 0);
|
wayl_surface_scale(term->wl, surf, term->scale);
|
||||||
xassert(buf->height % (int)term->scale == 0);
|
|
||||||
|
|
||||||
wl_surface_attach(surf, buf->wl_buf, 0, 0);
|
wl_surface_attach(surf, buf->wl_buf, 0, 0);
|
||||||
wl_surface_damage_buffer(surf, 0, 0, buf->width, buf->height);
|
wl_surface_damage_buffer(surf, 0, 0, buf->width, buf->height);
|
||||||
wl_surface_set_buffer_scale(surf, term->scale);
|
|
||||||
wl_surface_commit(surf);
|
wl_surface_commit(surf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1926,13 +1923,10 @@ render_osd(struct terminal *term,
|
||||||
pixman_image_unref(src);
|
pixman_image_unref(src);
|
||||||
pixman_image_set_clip_region32(buf->pix[0], NULL);
|
pixman_image_set_clip_region32(buf->pix[0], NULL);
|
||||||
|
|
||||||
xassert(buf->width % (int)term->scale == 0);
|
|
||||||
xassert(buf->height % (int)term->scale == 0);
|
|
||||||
|
|
||||||
quirk_weston_subsurface_desync_on(sub_surf);
|
quirk_weston_subsurface_desync_on(sub_surf);
|
||||||
|
wayl_surface_scale(term->wl, surf, term->scale);
|
||||||
wl_surface_attach(surf, buf->wl_buf, 0, 0);
|
wl_surface_attach(surf, buf->wl_buf, 0, 0);
|
||||||
wl_surface_damage_buffer(surf, 0, 0, buf->width, buf->height);
|
wl_surface_damage_buffer(surf, 0, 0, buf->width, buf->height);
|
||||||
wl_surface_set_buffer_scale(surf, term->scale);
|
|
||||||
|
|
||||||
struct wl_region *region = wl_compositor_create_region(term->wl->compositor);
|
struct wl_region *region = wl_compositor_create_region(term->wl->compositor);
|
||||||
if (region != NULL) {
|
if (region != NULL) {
|
||||||
|
|
@ -1955,9 +1949,6 @@ render_csd_title(struct terminal *term, const struct csd_data *info,
|
||||||
if (info->width == 0 || info->height == 0)
|
if (info->width == 0 || info->height == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
xassert(info->width % (int)term->scale == 0);
|
|
||||||
xassert(info->height % (int)term->scale == 0);
|
|
||||||
|
|
||||||
uint32_t bg = term->conf->csd.color.title_set
|
uint32_t bg = term->conf->csd.color.title_set
|
||||||
? term->conf->csd.color.title
|
? term->conf->csd.color.title
|
||||||
: 0xffu << 24 | term->conf->colors.fg;
|
: 0xffu << 24 | term->conf->colors.fg;
|
||||||
|
|
@ -2000,9 +1991,6 @@ render_csd_border(struct terminal *term, enum csd_surface surf_idx,
|
||||||
if (info->width == 0 || info->height == 0)
|
if (info->width == 0 || info->height == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
xassert(info->width % (int)term->scale == 0);
|
|
||||||
xassert(info->height % (int)term->scale == 0);
|
|
||||||
|
|
||||||
{
|
{
|
||||||
pixman_color_t color = color_hex_to_pixman_with_alpha(0, 0);
|
pixman_color_t color = color_hex_to_pixman_with_alpha(0, 0);
|
||||||
render_csd_part(term, surf, buf, info->width, info->height, &color);
|
render_csd_part(term, surf, buf, info->width, info->height, &color);
|
||||||
|
|
@ -2288,9 +2276,6 @@ render_csd_button(struct terminal *term, enum csd_surface surf_idx,
|
||||||
if (info->width == 0 || info->height == 0)
|
if (info->width == 0 || info->height == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
xassert(info->width % (int)term->scale == 0);
|
|
||||||
xassert(info->height % (int)term->scale == 0);
|
|
||||||
|
|
||||||
uint32_t _color;
|
uint32_t _color;
|
||||||
uint16_t alpha = 0xffff;
|
uint16_t alpha = 0xffff;
|
||||||
bool is_active = false;
|
bool is_active = false;
|
||||||
|
|
@ -3032,7 +3017,7 @@ grid_render(struct terminal *term)
|
||||||
term->window->frame_callback = wl_surface_frame(term->window->surface);
|
term->window->frame_callback = wl_surface_frame(term->window->surface);
|
||||||
wl_callback_add_listener(term->window->frame_callback, &frame_listener, term);
|
wl_callback_add_listener(term->window->frame_callback, &frame_listener, term);
|
||||||
|
|
||||||
wl_surface_set_buffer_scale(term->window->surface, term->scale);
|
wayl_win_scale(term->window);
|
||||||
|
|
||||||
if (term->wl->presentation != NULL && term->conf->presentation_timings) {
|
if (term->wl->presentation != NULL && term->conf->presentation_timings) {
|
||||||
struct timespec commit_time;
|
struct timespec commit_time;
|
||||||
|
|
@ -3066,9 +3051,6 @@ grid_render(struct terminal *term)
|
||||||
term->window->surface, 0, 0, INT32_MAX, INT32_MAX);
|
term->window->surface, 0, 0, INT32_MAX, INT32_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
xassert(buf->width % (int)term->scale == 0);
|
|
||||||
xassert(buf->height % (int)term->scale == 0);
|
|
||||||
|
|
||||||
wl_surface_attach(term->window->surface, buf->wl_buf, 0, 0);
|
wl_surface_attach(term->window->surface, buf->wl_buf, 0, 0);
|
||||||
wl_surface_commit(term->window->surface);
|
wl_surface_commit(term->window->surface);
|
||||||
}
|
}
|
||||||
|
|
@ -3132,17 +3114,17 @@ render_search_box(struct terminal *term)
|
||||||
const size_t wanted_visible_cells = max(20, total_cells);
|
const size_t wanted_visible_cells = max(20, total_cells);
|
||||||
|
|
||||||
xassert(term->scale >= 1);
|
xassert(term->scale >= 1);
|
||||||
const int scale = round(term->scale);
|
const int rounded_scale = round(term->scale);
|
||||||
|
|
||||||
const size_t margin = 3 * scale;
|
const size_t margin = 3 * rounded_scale;
|
||||||
|
|
||||||
const size_t width = term->width - 2 * margin;
|
const size_t width = term->width - 2 * margin;
|
||||||
const size_t visible_width = min(
|
const size_t visible_width = min(
|
||||||
term->width - 2 * margin,
|
term->width - 2 * margin,
|
||||||
(2 * margin + wanted_visible_cells * term->cell_width + scale - 1) / scale * scale);
|
(2 * margin + wanted_visible_cells * term->cell_width + rounded_scale - 1) / rounded_scale * rounded_scale);
|
||||||
const size_t height = min(
|
const size_t height = min(
|
||||||
term->height - 2 * margin,
|
term->height - 2 * margin,
|
||||||
(2 * margin + 1 * term->cell_height + scale - 1) / scale * scale);
|
(2 * margin + 1 * term->cell_height + rounded_scale - 1) / rounded_scale * rounded_scale);
|
||||||
|
|
||||||
const size_t visible_cells = (visible_width - 2 * margin) / term->cell_width;
|
const size_t visible_cells = (visible_width - 2 * margin) / term->cell_width;
|
||||||
size_t glyph_offset = term->render.search_glyph_offset;
|
size_t glyph_offset = term->render.search_glyph_offset;
|
||||||
|
|
@ -3389,15 +3371,12 @@ render_search_box(struct terminal *term)
|
||||||
/* TODO: this is only necessary on a window resize */
|
/* TODO: this is only necessary on a window resize */
|
||||||
wl_subsurface_set_position(
|
wl_subsurface_set_position(
|
||||||
term->window->search.sub,
|
term->window->search.sub,
|
||||||
margin / scale,
|
margin / term->scale,
|
||||||
max(0, (int32_t)term->height - height - margin) / scale);
|
max(0, (int32_t)term->height - height - margin) / term->scale);
|
||||||
|
|
||||||
xassert(buf->width % scale == 0);
|
|
||||||
xassert(buf->height % scale == 0);
|
|
||||||
|
|
||||||
|
wayl_surface_scale(term->wl, term->window->search.surf, term->scale);
|
||||||
wl_surface_attach(term->window->search.surf, buf->wl_buf, 0, 0);
|
wl_surface_attach(term->window->search.surf, buf->wl_buf, 0, 0);
|
||||||
wl_surface_damage_buffer(term->window->search.surf, 0, 0, width, height);
|
wl_surface_damage_buffer(term->window->search.surf, 0, 0, width, height);
|
||||||
wl_surface_set_buffer_scale(term->window->search.surf, scale);
|
|
||||||
|
|
||||||
struct wl_region *region = wl_compositor_create_region(term->wl->compositor);
|
struct wl_region *region = wl_compositor_create_region(term->wl->compositor);
|
||||||
if (region != NULL) {
|
if (region != NULL) {
|
||||||
|
|
@ -4284,6 +4263,8 @@ render_xcursor_update(struct seat *seat)
|
||||||
const float scale = seat->pointer.scale;
|
const float scale = seat->pointer.scale;
|
||||||
struct wl_cursor_image *image = seat->pointer.cursor->images[0];
|
struct wl_cursor_image *image = seat->pointer.cursor->images[0];
|
||||||
|
|
||||||
|
wayl_surface_scale(seat->wayl, seat->pointer.surface, scale);
|
||||||
|
|
||||||
wl_surface_attach(
|
wl_surface_attach(
|
||||||
seat->pointer.surface, wl_cursor_image_get_buffer(image), 0, 0);
|
seat->pointer.surface, wl_cursor_image_get_buffer(image), 0, 0);
|
||||||
|
|
||||||
|
|
@ -4295,8 +4276,6 @@ render_xcursor_update(struct seat *seat)
|
||||||
wl_surface_damage_buffer(
|
wl_surface_damage_buffer(
|
||||||
seat->pointer.surface, 0, 0, INT32_MAX, INT32_MAX);
|
seat->pointer.surface, 0, 0, INT32_MAX, INT32_MAX);
|
||||||
|
|
||||||
wl_surface_set_buffer_scale(seat->pointer.surface, scale);
|
|
||||||
|
|
||||||
xassert(seat->pointer.xcursor_callback == NULL);
|
xassert(seat->pointer.xcursor_callback == NULL);
|
||||||
seat->pointer.xcursor_callback = wl_surface_frame(seat->pointer.surface);
|
seat->pointer.xcursor_callback = wl_surface_frame(seat->pointer.surface);
|
||||||
wl_callback_add_listener(seat->pointer.xcursor_callback, &xcursor_listener, seat);
|
wl_callback_add_listener(seat->pointer.xcursor_callback, &xcursor_listener, seat);
|
||||||
|
|
|
||||||
44
wayland.c
44
wayland.c
|
|
@ -1850,6 +1850,40 @@ wayl_roundtrip(struct wayland *wayl)
|
||||||
wayl_flush(wayl);
|
wayl_flush(wayl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
wayl_fractional_scaling(const struct wayland *wayl)
|
||||||
|
{
|
||||||
|
#if defined(HAVE_FRACTIONAL_SCALE)
|
||||||
|
return wayl->fractional_scale_manager != NULL;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wayl_surface_scale(const struct wayland *wayl, struct wl_surface *surf,
|
||||||
|
float scale)
|
||||||
|
{
|
||||||
|
LOG_WARN("scaling by a factor of %.2f (legacy)", scale);
|
||||||
|
|
||||||
|
if (wayl_fractional_scaling(wayl)) {
|
||||||
|
BUG("not yet implemented");
|
||||||
|
} else {
|
||||||
|
wl_surface_set_buffer_scale(surf, (int)scale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wayl_win_scale(struct wl_window *win)
|
||||||
|
{
|
||||||
|
const struct terminal *term = win->term;
|
||||||
|
const struct wayland *wayl = term->wl;
|
||||||
|
const float scale = term->scale;
|
||||||
|
|
||||||
|
wayl_surface_scale(wayl, win->surface, scale);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
wayl_win_alpha_changed(struct wl_window *win)
|
wayl_win_alpha_changed(struct wl_window *win)
|
||||||
{
|
{
|
||||||
|
|
@ -2048,13 +2082,3 @@ wayl_get_activation_token(
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool
|
|
||||||
wayl_fractional_scaling(const struct wayland *wayl)
|
|
||||||
{
|
|
||||||
#if defined(HAVE_FRACTIONAL_SCALE)
|
|
||||||
return wayl->fractional_scale_manager != NULL;
|
|
||||||
#else
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -447,9 +447,14 @@ bool wayl_reload_xcursor_theme(struct seat *seat, float new_scale);
|
||||||
void wayl_flush(struct wayland *wayl);
|
void wayl_flush(struct wayland *wayl);
|
||||||
void wayl_roundtrip(struct wayland *wayl);
|
void wayl_roundtrip(struct wayland *wayl);
|
||||||
|
|
||||||
|
bool wayl_fractional_scaling(const struct wayland *wayl);
|
||||||
|
void wayl_surface_scale(
|
||||||
|
const struct wayland *wayl, struct wl_surface *surf, float scale);
|
||||||
|
|
||||||
struct wl_window *wayl_win_init(struct terminal *term, const char *token);
|
struct wl_window *wayl_win_init(struct terminal *term, const char *token);
|
||||||
void wayl_win_destroy(struct wl_window *win);
|
void wayl_win_destroy(struct wl_window *win);
|
||||||
|
|
||||||
|
void wayl_win_scale(struct wl_window *win);
|
||||||
void wayl_win_alpha_changed(struct wl_window *win);
|
void wayl_win_alpha_changed(struct wl_window *win);
|
||||||
bool wayl_win_set_urgent(struct wl_window *win);
|
bool wayl_win_set_urgent(struct wl_window *win);
|
||||||
|
|
||||||
|
|
@ -469,5 +474,3 @@ bool wayl_get_activation_token(
|
||||||
struct wayland *wayl, struct seat *seat, uint32_t serial,
|
struct wayland *wayl, struct seat *seat, uint32_t serial,
|
||||||
struct wl_window *win, activation_token_cb_t cb, void *cb_data);
|
struct wl_window *win, activation_token_cb_t cb, void *cb_data);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool wayl_fractional_scaling(const struct wayland *wayl);
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue