mirror of
https://github.com/swaywm/sway.git
synced 2026-04-23 06:46:27 -04:00
Merge 57ae17b620 into aaf68cf423
This commit is contained in:
commit
92069fa8ea
3 changed files with 59 additions and 10 deletions
|
|
@ -43,6 +43,8 @@ struct sway_output {
|
|||
struct wl_listener destroy;
|
||||
struct wl_listener commit;
|
||||
struct wl_listener mode;
|
||||
struct wl_listener available_modes;
|
||||
struct wl_listener suggested_position;
|
||||
struct wl_listener present;
|
||||
struct wl_listener damage_destroy;
|
||||
struct wl_listener damage_frame;
|
||||
|
|
|
|||
|
|
@ -351,6 +351,18 @@ static int compute_default_scale(struct wlr_output *output) {
|
|||
return 2;
|
||||
}
|
||||
|
||||
static float get_effective_scale(struct output_config *oc,
|
||||
struct wlr_output *wlr_output) {
|
||||
float scale;
|
||||
if (oc && oc->scale > 0) {
|
||||
scale = oc->scale;
|
||||
} else {
|
||||
scale = compute_default_scale(wlr_output);
|
||||
sway_log(SWAY_DEBUG, "Auto-detected output scale: %f", scale);
|
||||
}
|
||||
return scale;
|
||||
}
|
||||
|
||||
static void queue_output_config(struct output_config *oc,
|
||||
struct sway_output *output) {
|
||||
if (output == root->noop_output) {
|
||||
|
|
@ -420,13 +432,7 @@ static void queue_output_config(struct output_config *oc,
|
|||
|
||||
// Apply the scale last before the commit, because the scale auto-detection
|
||||
// reads the pending output size
|
||||
float scale;
|
||||
if (oc && oc->scale > 0) {
|
||||
scale = oc->scale;
|
||||
} else {
|
||||
scale = compute_default_scale(wlr_output);
|
||||
sway_log(SWAY_DEBUG, "Auto-detected output scale: %f", scale);
|
||||
}
|
||||
float scale = get_effective_scale(oc, output->wlr_output);
|
||||
if (scale != wlr_output->scale) {
|
||||
sway_log(SWAY_DEBUG, "Set %s scale to %f", wlr_output->name, scale);
|
||||
wlr_output_set_scale(wlr_output, scale);
|
||||
|
|
@ -500,9 +506,24 @@ bool apply_output_config(struct output_config *oc, struct sway_output *output) {
|
|||
}
|
||||
|
||||
// Find position for it
|
||||
if (oc && (oc->x != -1 || oc->y != -1)) {
|
||||
sway_log(SWAY_DEBUG, "Set %s position to %d, %d", oc->name, oc->x, oc->y);
|
||||
wlr_output_layout_add(root->output_layout, wlr_output, oc->x, oc->y);
|
||||
int32_t effective_x = -1, effective_y = -1;
|
||||
float effective_scale = get_effective_scale(oc, output->wlr_output);
|
||||
if (output->wlr_output->suggested_x != -1) {
|
||||
effective_x = output->wlr_output->suggested_x / effective_scale;
|
||||
}
|
||||
if (output->wlr_output->suggested_y != -1) {
|
||||
effective_y = output->wlr_output->suggested_y / effective_scale;
|
||||
}
|
||||
if (oc && oc->x != -1) {
|
||||
effective_x = oc->x;
|
||||
}
|
||||
if (oc && oc->y != -1) {
|
||||
effective_y = oc->y;
|
||||
}
|
||||
|
||||
if (effective_x != -1 || effective_y != -1) {
|
||||
sway_log(SWAY_DEBUG, "Set %s position to %d, %d", oc ? oc->name : wlr_output->name, effective_x, effective_y);
|
||||
wlr_output_layout_add(root->output_layout, wlr_output, effective_x, effective_y);
|
||||
} else {
|
||||
wlr_output_layout_add_auto(root->output_layout, wlr_output);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -797,6 +797,28 @@ static void handle_mode(struct wl_listener *listener, void *data) {
|
|||
update_output_manager_config(output->server);
|
||||
}
|
||||
|
||||
static void handle_available_modes(struct wl_listener *listener, void *data) {
|
||||
struct sway_output *output = wl_container_of(listener, output, available_modes);
|
||||
struct output_config *oc = find_output_config(output);
|
||||
apply_output_config(oc, output);
|
||||
free_output_config(oc);
|
||||
|
||||
transaction_commit_dirty();
|
||||
|
||||
update_output_manager_config(output->server);
|
||||
}
|
||||
|
||||
static void handle_suggested_position(struct wl_listener *listener, void *data) {
|
||||
struct sway_output *output = wl_container_of(listener, output, suggested_position);
|
||||
struct output_config *oc = find_output_config(output);
|
||||
apply_output_config(oc, output);
|
||||
free_output_config(oc);
|
||||
|
||||
transaction_commit_dirty();
|
||||
|
||||
update_output_manager_config(output->server);
|
||||
}
|
||||
|
||||
static void update_textures(struct sway_container *con, void *data) {
|
||||
container_update_title_textures(con);
|
||||
container_update_marks_textures(con);
|
||||
|
|
@ -863,6 +885,10 @@ void handle_new_output(struct wl_listener *listener, void *data) {
|
|||
output->commit.notify = handle_commit;
|
||||
wl_signal_add(&wlr_output->events.mode, &output->mode);
|
||||
output->mode.notify = handle_mode;
|
||||
wl_signal_add(&wlr_output->events.available_modes, &output->available_modes);
|
||||
output->available_modes.notify = handle_available_modes;
|
||||
wl_signal_add(&wlr_output->events.suggested_position, &output->suggested_position);
|
||||
output->suggested_position.notify = handle_suggested_position;
|
||||
wl_signal_add(&wlr_output->events.present, &output->present);
|
||||
output->present.notify = handle_present;
|
||||
wl_signal_add(&output->damage->events.frame, &output->damage_frame);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue