diff --git a/bld/vg.supp b/bld/vg.supp index ce3f509..7401682 100644 --- a/bld/vg.supp +++ b/bld/vg.supp @@ -74,7 +74,7 @@ Memcheck:Leak match-leak-kinds: reachable ... - fun:gobject_init + obj:*libgobject* fun:call_init fun:call_init fun:_dl_init diff --git a/src/info.c b/src/info.c index 913c52d..04a12b3 100644 --- a/src/info.c +++ b/src/info.c @@ -42,13 +42,13 @@ void info_mode_string(struct Mode *mode, char *buf, size_t nbuf) { return; } - snprintf(buf, nbuf, "%dx%d@%dHz (%d,%03dmHz) %s", + snprintf(buf, nbuf, "%dx%d@%dHz (%d,%03dmHz)%s", mode->width, mode->height, mhz_to_hz_rounded(mode->refresh_mhz), mode->refresh_mhz / 1000, mode->refresh_mhz % 1000, - mode->preferred ? "(preferred)" : "" + mode->preferred ? " (preferred)" : "" ); } diff --git a/src/listener_zwlr_output_mode.c b/src/listener_zwlr_output_mode.c index cf4358c..5cd6df4 100644 --- a/src/listener_zwlr_output_mode.c +++ b/src/listener_zwlr_output_mode.c @@ -35,13 +35,21 @@ static void preferred(void *data, // some heads may advertise multiple preferred modes; ignore subsequent if (mode->head) { - struct Mode *preferred_mode; - if ((preferred_mode = head_preferred_mode(mode->head))) { + struct Mode *mode_preferred; + if ((mode_preferred = head_preferred_mode(mode->head))) { + + static char mode_preferred_buf[2048]; + info_mode_string(mode_preferred, mode_preferred_buf, sizeof(mode_preferred_buf)); + static char mode_buf[2048]; info_mode_string(mode, mode_buf, sizeof(mode_buf)); - static char preferred_mode_buf[2048]; - info_mode_string(preferred_mode, preferred_mode_buf, sizeof(preferred_mode_buf)); - log_warn("\n%s already specified for '%s', ignoring %s", mode_buf, mode->head->name, preferred_mode_buf); + + if (mode_preferred->head && mode_preferred->head->name) { + log_info("\n%s: multiple preferred modes advertised: using initial %s, ignoring %s", mode_preferred->head->name, mode_preferred_buf, mode_buf); + } else { + log_info("\n???: multiple preferred modes advertised: using initial %s, ignoring %s", mode_preferred_buf, mode_buf); + } + return; } } diff --git a/tst/tst-listener_zwlr_output_mode.c b/tst/tst-listener_zwlr_output_mode.c new file mode 100644 index 0000000..3b3a8dd --- /dev/null +++ b/tst/tst-listener_zwlr_output_mode.c @@ -0,0 +1,78 @@ +#include "tst.h" +#include "asserts.h" +#include "util.h" + +#include +#include +#include +#include +#include + +#include "cfg.h" +#include "slist.h" +#include "log.h" +#include "info.h" + +#include "listeners.h" + +int before_all(void **state) { + return 0; +} + +int after_all(void **state) { + return 0; +} + +int before_each(void **state) { + return 0; +} + +int after_each(void **state) { + assert_logs_empty(); + + return 0; +} + +void preferred__first(void **state) { + struct Head head = { .name = "NAM", }; + struct Mode mode_existing = { .width = 3840, .height = 2160, .preferred = false, .refresh_mhz = 60000, .head = &head, }; + struct Mode mode_preferred = { .width = 2560, .height = 1440, .preferred = false, .refresh_mhz = 30000, .head = &head, }; + + slist_append(&head.modes, &mode_existing); + slist_append(&head.modes, &mode_preferred); + + zwlr_output_mode_listener()->preferred(&mode_preferred, NULL); + + assert_false(mode_existing.preferred); + assert_true(mode_preferred.preferred); + + slist_free(&head.modes); +} + +void preferred__subsequent(void **state) { + struct Head head = { .name = "NAM", }; + struct Mode mode_existing = { .width = 3840, .height = 2160, .preferred = true, .refresh_mhz = 60000, .head = &head, }; + struct Mode mode_subsequent = { .width = 2560, .height = 1440, .preferred = false, .refresh_mhz = 30000, .head = &head, }; + + slist_append(&head.modes, &mode_existing); + slist_append(&head.modes, &mode_subsequent); + + zwlr_output_mode_listener()->preferred(&mode_subsequent, NULL); + + assert_log(INFO, "\nNAM: multiple preferred modes advertised: using initial 3840x2160@60Hz (60,000mHz) (preferred), ignoring 2560x1440@30Hz (30,000mHz)\n"); + + assert_true(mode_existing.preferred); + assert_false(mode_subsequent.preferred); + + slist_free(&head.modes); +} + +int main(void) { + const struct CMUnitTest tests[] = { + TEST(preferred__first), + TEST(preferred__subsequent) + }; + + return RUN(tests); +} +