aboutsummaryrefslogtreecommitdiff
path: root/eizoctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'eizoctl.c')
-rw-r--r--eizoctl.c97
1 files changed, 50 insertions, 47 deletions
diff --git a/eizoctl.c b/eizoctl.c
index c0b91d3..fdf9eaf 100644
--- a/eizoctl.c
+++ b/eizoctl.c
@@ -4,7 +4,7 @@
* This program stays independent of the liberty library
* in order to build on Windows.
*
- * Copyright (c) 2024, Přemysl Eric Janouch <p@janouch.name>
+ * Copyright (c) 2025, Přemysl Eric Janouch <p@janouch.name>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted.
@@ -18,6 +18,14 @@
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
*/
+
+// On Windows, vswprintf() interprets %s in the width of the format string,
+// and %hs is not really compliant with any standard:
+// https://devblogs.microsoft.com/oldnewthing/20190830-00/?p=102823
+#ifdef _WIN32
+#define __USE_MINGW_ANSI_STDIO
+#endif
+
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
@@ -41,7 +49,9 @@
#define hid_init hidapi_hid_init
#endif
-#if defined __GNUC__
+#if defined __MINGW_GNU_PRINTF
+#define ATTRIBUTE_PRINTF(x, y) __MINGW_GNU_PRINTF((x), (y))
+#elif defined __GNUC__
#define ATTRIBUTE_PRINTF(x, y) __attribute__((format(printf, x, y)))
#else
#define ATTRIBUTE_PRINTF(x, y)
@@ -803,7 +813,7 @@ eizo_port_by_name(const char *name)
return index;
}
-static char *
+static const char *
eizo_port_to_name(uint16_t port)
{
const char *stem = NULL;
@@ -811,14 +821,14 @@ eizo_port_to_name(uint16_t port)
if (group && group < sizeof g_port_names / sizeof g_port_names[0])
stem = g_port_names[group][0];
- static char buffer[32] = "";
+ static char buf[32] = "";
if (!stem)
- snprintf(buffer, sizeof buffer, "%x", port);
+ snprintf(buf, sizeof buf, "%x", port);
else if (!number)
- snprintf(buffer, sizeof buffer, "%s", stem);
+ snprintf(buf, sizeof buf, "%s", stem);
else
- snprintf(buffer, sizeof buffer, "%s %d", stem, (number + 1));
- return buffer;
+ snprintf(buf, sizeof buf, "%s %d", stem, (number + 1));
+ return buf;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -895,7 +905,7 @@ eizo_get_input_ports(struct eizo_monitor *m, uint16_t *ports, size_t size)
}
static uint16_t
-eizo_resolve_port(struct eizo_monitor *m, const char *port)
+eizo_resolve_port_by_name(struct eizo_monitor *m, const char *port)
{
uint8_t usb_c_index = 0;
if (eizo_port_by_name_in_group(port, g_port_names_usb_c, &usb_c_index)) {
@@ -907,6 +917,26 @@ eizo_resolve_port(struct eizo_monitor *m, const char *port)
return eizo_port_by_name(port);
}
+static const char *
+eizo_resolve_port_to_name(struct eizo_monitor *m, uint16_t port)
+{
+ // USB-C ports are a bit tricky, they only need to be /displayed/ as such.
+ struct eizo_profile_item *item =
+ &m->profile[EIZO_PROFILE_KEY_USB_C_INPUT_PORTS];
+ for (uint8_t i = 0; i < item->len / 2; i++) {
+ if (port != peek_u16le(item->data + i * 2))
+ continue;
+
+ static char buf[32] = "";
+ if (!i)
+ snprintf(buf, sizeof buf, "%s", g_port_names_usb_c[0]);
+ else
+ snprintf(buf, sizeof buf, "%s %u", g_port_names_usb_c[0], (i + 1));
+ return buf;
+ }
+ return eizo_port_to_name(port);
+}
+
static bool
eizo_set_input_port(struct eizo_monitor *m, uint16_t port)
{
@@ -951,8 +981,8 @@ catf(struct catbuf *b, const char *format, ...)
va_end(ap);
if (result >= 0) {
b->len += result;
- if (b->len > sizeof b->buf)
- b->len = sizeof b->buf;
+ if (b->len >= sizeof b->buf)
+ b->len = sizeof b->buf - 1;
}
return b->buf;
}
@@ -1042,7 +1072,7 @@ run(int argc, char *argv[], print_fn output, print_fn error)
bool relative = false, restart = false, events = false;
const char *port = NULL;
int c = 0;
- while ((c = getopt_long(argc, argv, "b:i:h", opts, NULL)) != -1)
+ while ((c = getopt_long(argc, argv, "b:i:reqhV", opts, NULL)) != -1)
switch (c) {
case 'b':
relative = *optarg == '+' || *optarg == '-';
@@ -1118,13 +1148,12 @@ run(int argc, char *argv[], print_fn output, print_fn error)
}
if (port) {
uint16_t prev = 0;
- uint16_t next = eizo_resolve_port(&m, port);
+ uint16_t next = eizo_resolve_port_by_name(&m, port);
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));
+ m.product, m.serial, eizo_resolve_port_to_name(&m, prev));
} else if (!next) {
error("Failed to resolve port name: %s\n", port);
} else {
@@ -1222,8 +1251,8 @@ message_output(const char *format, ...)
wchar_t *message = message_printf(format, ap);
va_end(ap);
if (message) {
- MessageBox(
- NULL, message, NULL, MB_ICONINFORMATION | MB_OK | MB_APPLMODAL);
+ MessageBox(NULL, message,
+ L"Message", MB_ICONINFORMATION | MB_OK | MB_APPLMODAL);
free(message);
}
}
@@ -1283,21 +1312,9 @@ append_monitor(struct eizo_monitor *m, HMENU menu, UINT_PTR base)
if (!ports[0])
ports[0] = current;
- // USB-C ports are a bit tricky, they only need to be /displayed/ as such.
- struct eizo_profile_item *item =
- &m->profile[EIZO_PROFILE_KEY_USB_C_INPUT_PORTS];
for (size_t i = 0; ports[i]; i++) {
- uint8_t usb_c = 0;
- for (size_t u = 0; u < item->len / 2; u++)
- if (ports[i] == peek_u16le(item->data + u * 2))
- usb_c = u + 1;
-
- if (!usb_c)
- snwprintf(buf, sizeof buf, L"%s", eizo_port_to_name(ports[i]));
- else if (usb_c == 1)
- snwprintf(buf, sizeof buf, L"%s", g_port_names_usb_c[0]);
- else
- snwprintf(buf, sizeof buf, L"%s %u", g_port_names_usb_c[0], usb_c);
+ snwprintf(buf, sizeof buf, L"%s",
+ eizo_resolve_port_to_name(m, ports[i]));
UINT flags = MF_STRING;
if (ports[i] == current)
@@ -1664,23 +1681,9 @@ message_error(const char *format, ...)
if (!ports[0])
ports[0] = current;
- // USB-C ports are a bit tricky, they only need to be /displayed/ as such.
- struct eizo_profile_item *item =
- &m.monitor->profile[EIZO_PROFILE_KEY_USB_C_INPUT_PORTS];
for (size_t i = 0; ports[i]; i++) {
- uint8_t usb_c = 0;
- for (size_t u = 0; u < item->len / 2; u++)
- if (ports[i] == peek_u16le(item->data + u * 2))
- usb_c = u + 1;
-
- NSString *title = nil;
- if (!usb_c)
- title = [NSString stringWithUTF8String:eizo_port_to_name(ports[i])];
- else if (usb_c == 1)
- title = [NSString stringWithUTF8String:g_port_names_usb_c[0]];
- else
- title = [NSString stringWithFormat:@"%s %u",
- g_port_names_usb_c[0], usb_c];
+ NSString *title = [NSString stringWithUTF8String:
+ eizo_resolve_port_to_name(m.monitor, ports[i])];
NSMenuItem *inputPortItem = [[NSMenuItem alloc]
initWithTitle:title action:@selector(setInputPort:)