aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt15
-rw-r--r--README.adoc13
-rw-r--r--eizoctl.c37
3 files changed, 51 insertions, 14 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2e91b48..c240a16 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -41,13 +41,16 @@ pkg_check_modules (libusb libusb-1.0)
# On MSYS2, the CMake package cannot link statically, but pkg-config can.
# On macOS, we explicitly want to use the CMake package.
-if (WIN32)
+if (NOT WIN32)
+ find_package (hidapi QUIET)
+ if (hidapi_FOUND)
+ set (hidapi_INCLUDE_DIRS)
+ set (hidapi_LIBRARY_DIRS)
+ set (hidapi_LIBRARIES hidapi::hidapi)
+ endif ()
+endif ()
+if (NOT hidapi_FOUND)
pkg_search_module (hidapi hidapi hidapi-hidraw hidapi-libusb)
-else ()
- find_package (hidapi)
- set (hidapi_INCLUDE_DIRS)
- set (hidapi_LIBRARY_DIRS)
- set (hidapi_LIBRARIES hidapi::hidapi)
endif ()
option (WITH_LIBUSB "Compile with libusb-based utilities" ${libusb_FOUND})
diff --git a/README.adoc b/README.adoc
index 98bf6bf..0efca70 100644
--- a/README.adoc
+++ b/README.adoc
@@ -70,6 +70,17 @@ exe := A_Startup . "\eizoctltray.exe"
}
```
+On macOS, the simplest way to bind keyboard shortcuts is the Shortcuts app,
+with _Run Shell Scripts_ actions:
+
+```
+/Applications/eizoctltray.app/Contents/MacOS/eizoctltray -q --input HDMI
+```
+
+If you have issues with entering a specific key combination, like I did
+with ^⌘F1 etc., try changing it later within _System Settings_ → _Keyboard_ →
+_Keyboard Shortcuts..._ → _Services_ → _Shortcuts_.
+
elksmart-comm
~~~~~~~~~~~~~
_elksmart-comm_ interfaces with ELK Smart infrared dongles EKX4S and EKX5S-T,
@@ -97,7 +108,7 @@ Regular releases are sporadic. git master should be stable enough.
You can get a package with the latest development version
as a https://git.janouch.name/p/nixexprs[Nix derivation].
-Windows binaries can be downloaded from
+Windows/macOS binaries can be downloaded from
https://git.janouch.name/p/usb-drivers/releases[the Releases page on Gitea].
Building
diff --git a/eizoctl.c b/eizoctl.c
index fdf9eaf..3529cdd 100644
--- a/eizoctl.c
+++ b/eizoctl.c
@@ -1037,6 +1037,10 @@ 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"
@@ -1057,6 +1061,8 @@ 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'},
@@ -1069,11 +1075,17 @@ run(int argc, char *argv[], print_fn output, print_fn error)
int quiet = 0;
double brightness = NAN;
- bool relative = false, restart = false, events = false;
- const char *port = NULL;
+ bool list = false, relative = false, restart = false, events = false;
+ const char *serial = NULL, *port = NULL;
int c = 0;
- while ((c = getopt_long(argc, argv, "b: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))
@@ -1123,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 = {};
@@ -1133,6 +1143,15 @@ run(int argc, char *argv[], print_fn output, print_fn error)
continue;
}
+ 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)) {
@@ -1177,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);
@@ -1231,10 +1251,13 @@ message_printf(const char *format, va_list ap)
return NULL;
mbstowcs(format_wide, format, format_wide_len);
- int message_len = vswprintf(NULL, 0, format_wide, ap) + 1;
+ // Note that just vswprintf() cannot be used like this
+ // (at least since mingw-w64 commit c85d64),
+ // and vsnwprintf() is a MinGW extension, acting like C11 vsnwprintf_s.
+ int message_len = vsnwprintf(NULL, 0, format_wide, ap) + 1;
wchar_t *message = calloc(message_len, sizeof *message);
if (message_len > 0 && message)
- vswprintf(message, message_len, format_wide, ap);
+ vsnwprintf(message, message_len, format_wide, ap);
free(format_wide);
return message;