diff options
author | Josef Gajdusek <atx@atx.name> | 2019-05-20 23:47:05 +0200 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2019-05-24 18:59:14 +0300 |
commit | b3a5effef2be30c21d5a5cd7e60c9134af4948eb (patch) | |
tree | 22fd37fe1a67150f4978a3e8f1d21614655039c8 /sway/desktop/output.c | |
parent | commands/bar: fix mode and hidden_state at runtime (diff) | |
download | sway-b3a5effef2be30c21d5a5cd7e60c9134af4948eb.tar.gz sway-b3a5effef2be30c21d5a5cd7e60c9134af4948eb.tar.zst sway-b3a5effef2be30c21d5a5cd7e60c9134af4948eb.zip |
Implement wlr-output-management-v1
Diffstat (limited to 'sway/desktop/output.c')
-rw-r--r-- | sway/desktop/output.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/sway/desktop/output.c b/sway/desktop/output.c index 1636a58b..dccb2432 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c | |||
@@ -578,6 +578,30 @@ static void update_textures(struct sway_container *con, void *data) { | |||
578 | container_update_marks_textures(con); | 578 | container_update_marks_textures(con); |
579 | } | 579 | } |
580 | 580 | ||
581 | static void update_output_manager_config(struct sway_server *server) { | ||
582 | struct wlr_output_configuration_v1 *config = | ||
583 | wlr_output_configuration_v1_create(); | ||
584 | |||
585 | struct sway_output *output; | ||
586 | wl_list_for_each(output, &root->all_outputs, link) { | ||
587 | if (output == root->noop_output) { | ||
588 | continue; | ||
589 | } | ||
590 | struct wlr_output_configuration_head_v1 *config_head = | ||
591 | wlr_output_configuration_head_v1_create(config, output->wlr_output); | ||
592 | struct wlr_box *output_box = wlr_output_layout_get_box( | ||
593 | root->output_layout, output->wlr_output); | ||
594 | // We mark the output enabled even if it is switched off by DPMS | ||
595 | config_head->state.enabled = output->enabled; | ||
596 | if (output_box) { | ||
597 | config_head->state.x = output_box->x; | ||
598 | config_head->state.y = output_box->y; | ||
599 | } | ||
600 | } | ||
601 | |||
602 | wlr_output_manager_v1_set_configuration(server->output_manager_v1, config); | ||
603 | } | ||
604 | |||
581 | static void handle_scale(struct wl_listener *listener, void *data) { | 605 | static void handle_scale(struct wl_listener *listener, void *data) { |
582 | struct sway_output *output = wl_container_of(listener, output, scale); | 606 | struct sway_output *output = wl_container_of(listener, output, scale); |
583 | if (!output->enabled || !output->configured) { | 607 | if (!output->enabled || !output->configured) { |
@@ -651,4 +675,73 @@ void handle_new_output(struct wl_listener *listener, void *data) { | |||
651 | } | 675 | } |
652 | 676 | ||
653 | transaction_commit_dirty(); | 677 | transaction_commit_dirty(); |
678 | |||
679 | update_output_manager_config(server); | ||
680 | } | ||
681 | |||
682 | void handle_output_manager_apply(struct wl_listener *listener, void *data) { | ||
683 | struct sway_server *server = | ||
684 | wl_container_of(listener, server, output_manager_apply); | ||
685 | struct wlr_output_configuration_v1 *config = data; | ||
686 | |||
687 | struct wlr_output_configuration_head_v1 *config_head; | ||
688 | // First disable outputs we need to disable | ||
689 | bool ok = true; | ||
690 | wl_list_for_each(config_head, &config->heads, link) { | ||
691 | struct wlr_output *wlr_output = config_head->state.output; | ||
692 | struct sway_output *output = wlr_output->data; | ||
693 | if (!output->enabled || config_head->state.enabled) { | ||
694 | continue; | ||
695 | } | ||
696 | struct output_config *oc = new_output_config(output->wlr_output->name); | ||
697 | oc->enabled = false; | ||
698 | |||
699 | oc = store_output_config(oc); | ||
700 | ok &= apply_output_config(oc, output); | ||
701 | } | ||
702 | |||
703 | // Then enable outputs that need to | ||
704 | wl_list_for_each(config_head, &config->heads, link) { | ||
705 | struct wlr_output *wlr_output = config_head->state.output; | ||
706 | struct sway_output *output = wlr_output->data; | ||
707 | if (!config_head->state.enabled) { | ||
708 | continue; | ||
709 | } | ||
710 | struct output_config *oc = new_output_config(output->wlr_output->name); | ||
711 | oc->enabled = true; | ||
712 | if (config_head->state.mode != NULL) { | ||
713 | struct wlr_output_mode *mode = config_head->state.mode; | ||
714 | oc->width = mode->width; | ||
715 | oc->height = mode->height; | ||
716 | oc->refresh_rate = mode->refresh; | ||
717 | } else { | ||
718 | oc->width = config_head->state.custom_mode.width; | ||
719 | oc->height = config_head->state.custom_mode.height; | ||
720 | oc->refresh_rate = config_head->state.custom_mode.refresh; | ||
721 | } | ||
722 | oc->x = config_head->state.x; | ||
723 | oc->y = config_head->state.y; | ||
724 | oc->transform = config_head->state.transform; | ||
725 | oc->scale = config_head->state.scale; | ||
726 | |||
727 | oc = store_output_config(oc); | ||
728 | ok &= apply_output_config(oc, output); | ||
729 | } | ||
730 | |||
731 | if (ok) { | ||
732 | wlr_output_configuration_v1_send_succeeded(config); | ||
733 | } else { | ||
734 | wlr_output_configuration_v1_send_failed(config); | ||
735 | } | ||
736 | wlr_output_configuration_v1_destroy(config); | ||
737 | |||
738 | update_output_manager_config(server); | ||
739 | } | ||
740 | |||
741 | void handle_output_manager_test(struct wl_listener *listener, void *data) { | ||
742 | struct wlr_output_configuration_v1 *config = data; | ||
743 | |||
744 | // TODO: implement test-only mode | ||
745 | wlr_output_configuration_v1_send_succeeded(config); | ||
746 | wlr_output_configuration_v1_destroy(config); | ||
654 | } | 747 | } |