aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeoff Greer <geoff@greer.fm>2019-02-10 16:49:18 -0800
committeremersion <contact@emersion.fr>2019-02-13 19:20:29 +0100
commit5c8d2da0a1cd3839663d070532ba45bd61d374ca (patch)
treed7ec3435d95c6a9e4f34ae5f1a7c83b35ca3c163
parentdb6206aa1cbc80286e3c83e8e5371f93f8f5f048 (diff)
Add a wlr_output_set_subpixel()
drmModeConnector.subpixel doesn't seem to detect subpixel order on many displays (especially laptops). Allow subpixel order to be manually set. The corresponding PR for sway adds a subpixel output option: https://github.com/swaywm/sway/pull/3645 Once both are merged, https://github.com/swaywm/sway/issues/3163 will be fixed.
-rw-r--r--include/wlr/types/wlr_output.h1
-rw-r--r--types/wlr_output.c13
2 files changed, 14 insertions, 0 deletions
diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h
index 22822b11..d6761ee1 100644
--- a/include/wlr/types/wlr_output.h
+++ b/include/wlr/types/wlr_output.h
@@ -174,6 +174,7 @@ void wlr_output_set_transform(struct wlr_output *output,
enum wl_output_transform transform);
void wlr_output_set_position(struct wlr_output *output, int32_t lx, int32_t ly);
void wlr_output_set_scale(struct wlr_output *output, float scale);
+void wlr_output_set_subpixel(struct wlr_output *output, enum wl_output_subpixel subpixel);
void wlr_output_destroy(struct wlr_output *output);
/**
* Computes the transformed output resolution.
diff --git a/types/wlr_output.c b/types/wlr_output.c
index 7cfbb085..f49d48e3 100644
--- a/types/wlr_output.c
+++ b/types/wlr_output.c
@@ -248,6 +248,19 @@ void wlr_output_set_scale(struct wlr_output *output, float scale) {
wlr_signal_emit_safe(&output->events.scale, output);
}
+void wlr_output_set_subpixel(struct wlr_output *output, enum wl_output_subpixel subpixel) {
+ if (output->subpixel == subpixel) {
+ return;
+ }
+
+ output->subpixel = subpixel;
+
+ struct wl_resource *resource;
+ wl_resource_for_each(resource, &output->resources) {
+ output_send_to_resource(resource);
+ }
+}
+
static void handle_display_destroy(struct wl_listener *listener, void *data) {
struct wlr_output *output =
wl_container_of(listener, output, display_destroy);