HACK fractional scaling

This commit is contained in:
Kenny Levinsen 2022-04-04 19:36:50 +02:00
parent 68db8ff1f5
commit 4564d78eff
8 changed files with 268 additions and 70 deletions

View file

@ -31,12 +31,12 @@
#include "xmalloc.h"
static void
csd_reload_font(struct wl_window *win, int old_scale)
csd_reload_font(struct wl_window *win, double old_scale)
{
struct terminal *term = win->term;
const struct config *conf = term->conf;
const int scale = term->scale;
const double scale = term->scale;
bool enable_csd = win->csd_mode == CSD_YES && !win->is_fullscreen;
if (!enable_csd)
@ -52,9 +52,9 @@ csd_reload_font(struct wl_window *win, int old_scale)
char pixelsize[32];
snprintf(pixelsize, sizeof(pixelsize),
"pixelsize=%u", conf->csd.title_height * scale * 1 / 2);
"pixelsize=%u", (int)round(conf->csd.title_height * scale * 1 / 2));
LOG_DBG("loading CSD font \"%s:%s\" (old-scale=%d, scale=%d)",
LOG_DBG("loading CSD font \"%s:%s\" (old-scale=%lf, scale=%lf)",
patterns[0], pixelsize, old_scale, scale);
win->csd.font = fcft_from_name(conf->csd.font.count, patterns, pixelsize);
@ -317,9 +317,9 @@ update_term_for_output_change(struct terminal *term)
if (tll_length(term->window->on_outputs) == 0)
return;
int old_scale = term->scale;
double old_scale = term->scale;
render_resize(term, term->width / term->scale, term->height / term->scale);
render_resize(term, round(term->width / term->scale), round(term->height / term->scale));
term_font_dpi_changed(term, old_scale);
term_font_subpixel_changed(term);
csd_reload_font(term->window, old_scale);
@ -812,6 +812,21 @@ static const struct zxdg_toplevel_decoration_v1_listener xdg_toplevel_decoration
.configure = &xdg_toplevel_decoration_configure,
};
static void fractional_scale_handle_preferred_scale(void *data, struct
wp_fractional_scale_v1 *info, wl_fixed_t scale) {
struct wl_window *win = data;
double dscale = wl_fixed_to_double(scale);
fprintf(stderr, "Preferred scale: %lf\n", dscale);
win->scale = dscale;
update_term_for_output_change(win->term);
}
static const struct wp_fractional_scale_v1_listener fractional_scale_listener = {
.preferred_scale = fractional_scale_handle_preferred_scale,
};
static bool
fdm_repeat(struct fdm *fdm, int fd, int events, void *data)
{
@ -1049,6 +1064,27 @@ handle_global(void *data, struct wl_registry *registry,
seat_add_text_input(&it->item);
}
#endif
else if (strcmp(interface,
wp_fractional_scale_manager_v1_interface.name) == 0)
{
const uint32_t required = 1;
if (!verify_iface_version(interface, version, required))
return;
wayl->fractional_scale_manager = wl_registry_bind(
wayl->registry, name,
&wp_fractional_scale_manager_v1_interface, required);
}
else if (strcmp(interface, wp_viewporter_interface.name) == 0) {
const uint32_t required = 1;
if (!verify_iface_version(interface, version, required))
return;
wayl->viewporter = wl_registry_bind(
wayl->registry, name, &wp_viewporter_interface, required);
}
}
static void
@ -1420,6 +1456,16 @@ wayl_win_init(struct terminal *term, const char *token)
wl_surface_add_listener(win->surface, &surface_listener, win);
if (wayl->fractional_scale_manager) {
win->fractional_scale =
wp_fractional_scale_manager_v1_get_fractional_scale(wayl->fractional_scale_manager,
win->surface);
wp_fractional_scale_v1_add_listener(win->fractional_scale,
&fractional_scale_listener, win);
}
win->viewport = wp_viewporter_get_viewport(wayl->viewporter,
win->surface);
win->xdg_surface = xdg_wm_base_get_xdg_surface(wayl->shell, win->surface);
xdg_surface_add_listener(win->xdg_surface, &xdg_surface_listener, win);
@ -1540,6 +1586,9 @@ wayl_win_destroy(struct wl_window *win)
wayl_roundtrip(win->term->wl);
wp_viewport_set_destination(win->viewport,
win->configure.width, win->configure.height);
/* Main window */
wl_surface_attach(win->surface, NULL, 0, 0);
wl_surface_commit(win->surface);
@ -1809,6 +1858,9 @@ wayl_win_subsurface_new_with_custom_parent(
surf->surf = main_surface;
surf->sub = sub;
surf->viewport = wp_viewporter_get_viewport(wayl->viewporter,
main_surface);
return true;
}