aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPřemysl Eric Janouch <p@janouch.name>2025-07-31 21:11:45 +0200
committerPřemysl Eric Janouch <p@janouch.name>2025-07-31 21:16:16 +0200
commitd8b01cdaee84276389af7aa0ba32099bad28c7a2 (patch)
treedd9064bd4fdfd37e0a9b54a891a7051b811aed38
parent135f336a7cc6521cb3dc2fab5b8bdff8bf14fb89 (diff)
downloadusb-drivers-d8b01cdaee84276389af7aa0ba32099bad28c7a2.tar.gz
usb-drivers-d8b01cdaee84276389af7aa0ba32099bad28c7a2.tar.xz
usb-drivers-d8b01cdaee84276389af7aa0ba32099bad28c7a2.zip
eizoctl: add an option to filter by serial number
It turns out that this is actually critical when switching inputs in certain wild setups.
-rw-r--r--eizoctl.c19
1 files 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);