aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sway/output.h8
-rw-r--r--sway/config/output.c2
-rw-r--r--sway/desktop/output.c30
3 files changed, 38 insertions, 2 deletions
diff --git a/include/sway/output.h b/include/sway/output.h
index 895cb07d..11869398 100644
--- a/include/sway/output.h
+++ b/include/sway/output.h
@@ -12,8 +12,16 @@ struct sway_output {
struct sway_container *swayc;
struct sway_server *server;
struct timespec last_frame;
+
+ struct {
+ struct wl_signal scale;
+ struct wl_signal transform;
+ } events;
+
struct wl_listener frame;
struct wl_listener resolution;
+ struct wl_listener scale;
+ struct wl_listener transform;
};
#endif
diff --git a/sway/config/output.c b/sway/config/output.c
index e6e680d3..b06c7c0e 100644
--- a/sway/config/output.c
+++ b/sway/config/output.c
@@ -112,10 +112,12 @@ void apply_output_config(struct output_config *oc, swayc_t *output) {
if (oc && oc->scale > 0) {
sway_log(L_DEBUG, "Set %s scale to %d", oc->name, oc->scale);
wlr_output_set_scale(wlr_output, oc->scale);
+ wl_signal_emit(&output->sway_output->events.scale, output->sway_output);
}
if (oc && oc->transform >= 0) {
sway_log(L_DEBUG, "Set %s transform to %d", oc->name, oc->transform);
wlr_output_transform(wlr_output, oc->transform);
+ wl_signal_emit(&output->sway_output->events.transform, output->sway_output);
}
// Find position for it
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index 7eb48bdf..f44cda1a 100644
--- a/sway/desktop/output.c
+++ b/sway/desktop/output.c
@@ -98,17 +98,40 @@ static void output_resolution_notify(struct wl_listener *listener, void *data) {
arrange_windows(soutput->swayc, -1, -1);
}
+static void output_scale_notify(struct wl_listener *listener, void *data) {
+ struct sway_output *soutput = wl_container_of(
+ listener, soutput, scale);
+ arrange_windows(soutput->swayc, -1, -1);
+}
+
+static void output_transform_notify(struct wl_listener *listener, void *data) {
+ struct sway_output *soutput = wl_container_of(
+ listener, soutput, transform);
+ arrange_windows(soutput->swayc, -1, -1);
+}
+
void output_add_notify(struct wl_listener *listener, void *data) {
struct sway_server *server = wl_container_of(listener, server, output_add);
struct wlr_output *wlr_output = data;
sway_log(L_DEBUG, "New output %p: %s", wlr_output, wlr_output->name);
struct sway_output *output = calloc(1, sizeof(struct sway_output));
+ if (!output) {
+ return;
+ }
output->wlr_output = wlr_output;
output->server = server;
+
+ wl_signal_init(&output->events.scale);
+ wl_signal_init(&output->events.transform);
+
output->swayc = new_output(output);
+ if (!output->swayc) {
+ free(output);
+ return;
+ }
- if (wl_list_length(&wlr_output->modes) > 0) {
+ if (!wl_list_empty(&wlr_output->modes)) {
struct wlr_output_mode *mode = NULL;
mode = wl_container_of((&wlr_output->modes)->prev, mode, link);
wlr_output_set_mode(wlr_output, mode);
@@ -116,9 +139,12 @@ void output_add_notify(struct wl_listener *listener, void *data) {
output->frame.notify = output_frame_notify;
wl_signal_add(&wlr_output->events.frame, &output->frame);
-
output->resolution.notify = output_resolution_notify;
wl_signal_add(&wlr_output->events.resolution, &output->resolution);
+ output->scale.notify = output_scale_notify;
+ wl_signal_add(&output->events.scale, &output->scale);
+ output->transform.notify = output_transform_notify;
+ wl_signal_add(&output->events.transform, &output->transform);
arrange_windows(output->swayc, -1, -1);
}