mirror of
https://github.com/labwc/labwc.git
synced 2025-11-04 13:30:07 -05:00
OSD: Scale OSD to the largest output scale
This commit is contained in:
parent
53df672dda
commit
049b84409e
3 changed files with 30 additions and 9 deletions
|
|
@ -154,6 +154,7 @@ struct server {
|
||||||
struct wlr_output_manager_v1 *output_manager;
|
struct wlr_output_manager_v1 *output_manager;
|
||||||
struct wl_listener output_manager_apply;
|
struct wl_listener output_manager_apply;
|
||||||
struct wlr_output_configuration_v1 *pending_output_config;
|
struct wlr_output_configuration_v1 *pending_output_config;
|
||||||
|
float greatest_scale;
|
||||||
|
|
||||||
struct wlr_foreign_toplevel_manager_v1 *foreign_toplevel_manager;
|
struct wlr_foreign_toplevel_manager_v1 *foreign_toplevel_manager;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -79,11 +79,13 @@ osd_update(struct server *server)
|
||||||
struct wlr_renderer *renderer = server->renderer;
|
struct wlr_renderer *renderer = server->renderer;
|
||||||
struct theme *theme = server->theme;
|
struct theme *theme = server->theme;
|
||||||
|
|
||||||
int w = OSD_ITEM_WIDTH + 2 * OSD_BORDER_WIDTH;
|
float scale = server->greatest_scale;
|
||||||
int h = get_osd_height(&server->views);
|
int w = (OSD_ITEM_WIDTH + (2 * OSD_BORDER_WIDTH)) * scale;
|
||||||
|
int h = get_osd_height(&server->views) * scale;
|
||||||
|
|
||||||
cairo_surface_t *surf =
|
cairo_surface_t *surf =
|
||||||
cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w, h);
|
cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w, h);
|
||||||
|
cairo_surface_set_device_scale(surf, scale, scale);
|
||||||
cairo_t *cairo = cairo_create(surf);
|
cairo_t *cairo = cairo_create(surf);
|
||||||
|
|
||||||
/* background */
|
/* background */
|
||||||
|
|
|
||||||
32
src/output.c
32
src/output.c
|
|
@ -532,15 +532,27 @@ render_osd(struct output *output, pixman_region32_t *damage,
|
||||||
|
|
||||||
struct wlr_box box = {
|
struct wlr_box box = {
|
||||||
.x = ol_output->x + o->wlr_output->width
|
.x = ol_output->x + o->wlr_output->width
|
||||||
/ o->wlr_output->scale / 2,
|
/ 2,
|
||||||
.y = ol_output->y + o->wlr_output->height
|
.y = ol_output->y + o->wlr_output->height
|
||||||
/ o->wlr_output->scale / 2,
|
/ 2,
|
||||||
.width = server->osd->width,
|
.width = server->osd->width * o->wlr_output->scale
|
||||||
.height = server->osd->height,
|
/ server->greatest_scale,
|
||||||
|
.height = server->osd->height * o->wlr_output->scale
|
||||||
|
/ server->greatest_scale,
|
||||||
};
|
};
|
||||||
box.x -= server->osd->width / 2;
|
box.x -= box.width / 2;
|
||||||
box.y -= server->osd->height / 2;
|
box.y -= box.height / 2;
|
||||||
render_texture_helper(output, damage, &box, server->osd);
|
|
||||||
|
double ox = 0, oy = 0;
|
||||||
|
wlr_output_layout_output_coords(output->server->output_layout,
|
||||||
|
output->wlr_output, &ox, &oy);
|
||||||
|
box.x += ox;
|
||||||
|
box.y += oy;
|
||||||
|
float matrix[9];
|
||||||
|
wlr_matrix_project_box(matrix, &box, WL_OUTPUT_TRANSFORM_NORMAL,
|
||||||
|
0, output->wlr_output->transform_matrix);
|
||||||
|
render_texture(o->wlr_output, damage, server->osd, NULL, &box,
|
||||||
|
matrix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1059,6 +1071,8 @@ output_init(struct server *server)
|
||||||
|
|
||||||
wl_list_init(&server->outputs);
|
wl_list_init(&server->outputs);
|
||||||
|
|
||||||
|
server->greatest_scale = 1;
|
||||||
|
|
||||||
output_manager_init(server);
|
output_manager_init(server);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1153,7 +1167,11 @@ handle_output_manager_apply(struct wl_listener *listener, void *data)
|
||||||
}
|
}
|
||||||
wlr_output_configuration_v1_destroy(config);
|
wlr_output_configuration_v1_destroy(config);
|
||||||
struct output *output;
|
struct output *output;
|
||||||
|
server->greatest_scale = 0;
|
||||||
wl_list_for_each(output, &server->outputs, link) {
|
wl_list_for_each(output, &server->outputs, link) {
|
||||||
|
if (output->wlr_output->scale > server->greatest_scale) {
|
||||||
|
server->greatest_scale = output->wlr_output->scale;
|
||||||
|
}
|
||||||
wlr_xcursor_manager_load(server->seat.xcursor_manager,
|
wlr_xcursor_manager_load(server->seat.xcursor_manager,
|
||||||
output->wlr_output->scale);
|
output->wlr_output->scale);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue