From d8b01cdaee84276389af7aa0ba32099bad28c7a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Eric=20Janouch?=
Date: Thu, 31 Jul 2025 21:11:45 +0200 Subject: [PATCH] eizoctl: add an option to filter by serial number It turns out that this is actually critical when switching inputs in certain wild setups. --- eizoctl.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/eizoctl.c b/eizoctl.c index 399ad5a..810ac80 100644 --- a/eizoctl.c +++ b/eizoctl.c @@ -1039,6 +1039,8 @@ eizo_watch(struct eizo_monitor *m, print_fn output, print_fn error) static const char *usage = "Usage: %s OPTION...\n\n" " -l, --list\n" " List all connected EIZO monitors, with their serial number.\n" + " -s, --serial SERIAL\n" + " Only act on the monitor matching the specified serial number.\n" " -b, --brightness [+-]BRIGHTNESS\n" " Change monitor brightness; values go from 0 to 1 and may be relative.\n" " -i, --input NAME\n" @@ -1060,6 +1062,7 @@ run(int argc, char *argv[], print_fn output, print_fn error) const char *name = argv[0]; static struct option opts[] = { {"list", no_argument, NULL, 'l'}, + {"serial", required_argument, NULL, 's'}, {"brightness", required_argument, NULL, 'b'}, {"input", required_argument, NULL, 'i'}, {"restart", no_argument, NULL, 'r'}, @@ -1073,13 +1076,16 @@ run(int argc, char *argv[], print_fn output, print_fn error) int quiet = 0; double brightness = NAN; bool list = false, relative = false, restart = false, events = false; - const char *port = NULL; + const char *serial = NULL, *port = NULL; int c = 0; - while ((c = getopt_long(argc, argv, "lb:i:reqhV", opts, NULL)) != -1) + while ((c = getopt_long(argc, argv, "ls:b:i:reqhV", opts, NULL)) != -1) switch (c) { case 'l': list = true; break; + case 's': + serial = optarg; + break; case 'b': relative = *optarg == '+' || *optarg == '-'; if (sscanf(optarg, "%lf", &brightness) && isfinite(brightness)) @@ -1129,8 +1135,6 @@ run(int argc, char *argv[], print_fn output, print_fn error) if (quiet > 1) error = print_dummy; - // It should be possible to choose a particular monitor, - // but it is generally more useful to operate on all of them. struct hid_device_info *devs = hid_enumerate(USB_VID_EIZO, 0), *p = devs; for (; p; p = p->next) { struct eizo_monitor m = {}; @@ -1142,6 +1146,12 @@ run(int argc, char *argv[], print_fn output, print_fn error) if (list) output("%s %s\n", m.product, m.serial); + // Generously assuming that different products/models + // don't share serial numbers, + // which would otherwise deserve another filtering option. + if (serial && strcmp(serial, m.serial)) + goto next; + if (isfinite(brightness)) { double prev = 0.; if (!eizo_get_brightness(&m, &prev)) { @@ -1186,6 +1196,7 @@ run(int argc, char *argv[], print_fn output, print_fn error) error("%s\n", m.error); } + next: eizo_monitor_close(&m); } hid_free_enumeration(devs);