aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPřemysl Eric Janouch <p@janouch.name>2025-01-18 18:58:39 +0100
committerPřemysl Eric Janouch <p@janouch.name>2025-01-18 19:02:12 +0100
commit034d1712e86293c00b8ffadabf35889ccb1fc5e5 (patch)
tree6cc6c601f769b4ff95bd159bd17537eee590ba7c
parent89cab6fa393f7d083f878d66957af176f51c2322 (diff)
downloadusb-drivers-034d1712e86293c00b8ffadabf35889ccb1fc5e5.tar.gz
usb-drivers-034d1712e86293c00b8ffadabf35889ccb1fc5e5.tar.xz
usb-drivers-034d1712e86293c00b8ffadabf35889ccb1fc5e5.zip
eizoctl: make --events work with GUIs
Also add a --quiet option, and expand the program help.
-rw-r--r--NEWS7
-rw-r--r--eizoctl.c97
2 files changed, 83 insertions, 21 deletions
diff --git a/NEWS b/NEWS
index a66855c..4cf96cb 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,10 @@
+Unreleased
+
+ * eizoctl: added a --quiet option to suppress information and/or errors
+
+ * eizoctl: fixed input port reporting
+
+
1.1.0 (2024-11-28)
* Ported eizoctltray to macOS as well
diff --git a/eizoctl.c b/eizoctl.c
index 3081b40..c0b91d3 100644
--- a/eizoctl.c
+++ b/eizoctl.c
@@ -934,8 +934,40 @@ eizo_restart(struct eizo_monitor *m)
// --- Main --------------------------------------------------------------------
+struct catbuf {
+ char buf[4096];
+ size_t len;
+};
+
+static const char *
+catf(struct catbuf *b, const char *format, ...) ATTRIBUTE_PRINTF(2, 3);
+
+static const char *
+catf(struct catbuf *b, const char *format, ...)
+{
+ va_list ap;
+ va_start(ap, format);
+ int result = vsnprintf(b->buf + b->len, sizeof b->buf - b->len, format, ap);
+ va_end(ap);
+ if (result >= 0) {
+ b->len += result;
+ if (b->len > sizeof b->buf)
+ b->len = sizeof b->buf;
+ }
+ return b->buf;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+typedef void (*print_fn)(const char *format, ...) ATTRIBUTE_PRINTF(1, 2);
+
+static void print_dummy(const char *format, ...)
+{
+ (void) format;
+}
+
static bool
-eizo_watch(struct eizo_monitor *m)
+eizo_watch(struct eizo_monitor *m, print_fn output, print_fn error)
{
uint8_t buf[1024] = {};
int res = 0;
@@ -945,52 +977,67 @@ eizo_watch(struct eizo_monitor *m)
if (buf[0] != EIZO_REPORT_ID_GET &&
buf[0] != EIZO_REPORT_ID_GET_LONG) {
- printf("Unknown report ID\n");
+ error("Unknown report ID: %02x\n", buf[0]);
continue;
}
+ struct catbuf message = {{0}, 0};
uint16_t page = peek_u16le(&buf[1]), id = peek_u16le(&buf[3]);
uint32_t usage = page << 16 | id;
- printf("%08x", usage);
+ catf(&message, "%08x", usage);
const struct parser_report *r = eizo_monitor_subreport(m, usage);
if (!r) {
- printf(" unknown usage\n");
+ output(catf(&message, " unknown usage\n"));
continue;
}
size_t rlen = r->report_size / 8 * r->report_count;
if ((size_t) res < 7 + rlen) {
- printf(" received data too short\n");
+ output(catf(&message, " received data too short\n"));
continue;
}
if (r->report_size == 16)
for (size_t i = 0; i + 1 < rlen; i += 2)
- printf(" %04x", peek_u16le(&buf[7 + i]));
+ catf(&message, " %04x", peek_u16le(&buf[7 + i]));
else
for (size_t i = 0; i < rlen; i++)
- printf(" %02x", buf[7 + i]);
- printf("\n");
+ catf(&message, " %02x", buf[7 + i]);
+ output(catf(&message, "\n"));
}
}
-typedef void (*print_fn)(const char *format, ...) ATTRIBUTE_PRINTF(1, 2);
+static const char *usage = "Usage: %s OPTION...\n\n"
+ " -b, --brightness [+-]BRIGHTNESS\n"
+ " Change monitor brightness; values go from 0 to 1 and may be relative.\n"
+ " -i, --input NAME\n"
+ " Change monitor input ports; use '?' to retrieve current values.\n"
+ " -r, --restart\n"
+ " Reboot monitors.\n"
+ " -e, --events\n"
+ " Watch for events reported by monitors.\n"
+ " -q, --quiet\n"
+ " Use once to suppress informative messages, twice to suppress errors.\n"
+ " -h, --help\n"
+ " Display this help and exit.\n"
+ " -V, --version\n"
+ " Output version information and exit.\n";
static int
-run(int argc, char *argv[], print_fn output, print_fn error, bool verbose)
+run(int argc, char *argv[], print_fn output, print_fn error)
{
const char *name = argv[0];
- const char *usage = "Usage: %s [--brightness [+-]BRIGHTNESS] [--input NAME]"
- " [--restart] [--events]\n";
static struct option opts[] = {
- {"input", required_argument, NULL, 'i'},
{"brightness", required_argument, NULL, 'b'},
+ {"input", required_argument, NULL, 'i'},
{"restart", no_argument, NULL, 'r'},
{"events", no_argument, NULL, 'e'},
+ {"quiet", no_argument, NULL, 'q'},
{"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'V'},
{}
};
+ int quiet = 0;
double brightness = NAN;
bool relative = false, restart = false, events = false;
const char *port = NULL;
@@ -1013,6 +1060,9 @@ run(int argc, char *argv[], print_fn output, print_fn error, bool verbose)
case 'e':
events = true;
break;
+ case 'q':
+ quiet++;
+ break;
case 'h':
output(usage, name);
return 0;
@@ -1038,6 +1088,10 @@ run(int argc, char *argv[], print_fn output, print_fn error, bool verbose)
error("%ls\n", hid_error(NULL));
return 1;
}
+ if (quiet > 0)
+ output = print_dummy;
+ 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.
@@ -1057,7 +1111,7 @@ run(int argc, char *argv[], print_fn output, print_fn error, bool verbose)
double next = relative ? brightness + prev : brightness;
if (!eizo_set_brightness(&m, next))
error("Failed to set brightness: %s\n", m.error);
- else if (verbose)
+ else
output("%s %s: brightness: %.2f -> %.2f\n",
m.product, m.serial, prev, next);
}
@@ -1068,6 +1122,7 @@ run(int argc, char *argv[], print_fn output, print_fn error, bool verbose)
if (!eizo_get_input_port(&m, &prev)) {
error("Failed to get input port: %s\n", m.error);
} else if (!strcmp(port, "?")) {
+ // XXX: This does not report USB-C.
output("%s %s: input: %s\n",
m.product, m.serial, eizo_port_to_name(prev));
} else if (!next) {
@@ -1075,7 +1130,7 @@ run(int argc, char *argv[], print_fn output, print_fn error, bool verbose)
} else {
if (!eizo_set_input_port(&m, next))
error("Failed to set input port: %s\n", m.error);
- else if (verbose)
+ else
output("%s %s: input: %s -> %s\n",
m.product, m.serial, eizo_port_to_name(prev), port);
}
@@ -1083,13 +1138,13 @@ run(int argc, char *argv[], print_fn output, print_fn error, bool verbose)
if (restart) {
if (!eizo_restart(&m))
error("Failed to restart: %s\n", m.error);
- else if (verbose)
+ else
output("%s %s: restart\n", m.product, m.serial);
}
if (events) {
- if (!verbose)
+ if (quiet)
error("Watching events is not possible in this mode\n");
- else if (!eizo_watch(&m))
+ else if (!eizo_watch(&m, output, error))
error("%s\n", m.error);
}
@@ -1124,7 +1179,7 @@ stdio_error(const char *format, ...)
int
main(int argc, char *argv[])
{
- return run(argc, argv, stdio_output, stdio_error, true);
+ return run(argc, argv, stdio_output, stdio_error);
}
// --- Windows -----------------------------------------------------------------
@@ -1395,7 +1450,7 @@ wWinMain(
char *mb = mbargv[i + 1] = calloc(len, sizeof *mb);
wcstombs(mb, argv[i], len);
}
- return run(argc + 1, mbargv, message_output, message_error, false);
+ return run(argc + 1, mbargv, message_output, message_error);
}
LocalFree(argv);
@@ -1708,7 +1763,7 @@ main(int argc, char *argv[])
{
@autoreleasepool {
if (argc > 1)
- return run(argc, argv, message_output, message_error, true);
+ return run(argc, argv, message_output, message_error);
NSApplication *app = [NSApplication sharedApplication];
ApplicationDelegate *delegate = [ApplicationDelegate new];