diff --git a/docs/keyd.scdoc b/docs/keyd.scdoc index 02f0353..416274e 100644 --- a/docs/keyd.scdoc +++ b/docs/keyd.scdoc @@ -10,7 +10,7 @@ keyd(1) # COMMANDS -*monitor* +*monitor [-t] [-h]* Print key events. Useful for discovering key names and debugging. *bind [...]* diff --git a/src/keyd.c b/src/keyd.c index dab9dc8..e460352 100644 --- a/src/keyd.c +++ b/src/keyd.c @@ -47,7 +47,7 @@ static int help(int argc, char *argv[]) { printf("usage: keyd [-v] [-h] [command] []\n\n" "Commands:\n" - " monitor Print key events in real time.\n" + " monitor [-t] Print key events in real time.\n" " list-keys Print a list of valid key names.\n" " reload Trigger a reload .\n" " listen Print layer state changes of the running keyd daemon to stdout.\n" diff --git a/src/monitor.c b/src/monitor.c index d27815a..5f445e9 100644 --- a/src/monitor.c +++ b/src/monitor.c @@ -1,5 +1,7 @@ #include "keyd.h" +static int time_flag = 0; + static void set_tflags(tcflag_t flags, int val) { if (!isatty(0)) @@ -28,8 +30,18 @@ static void cleanup() set_tflags(ICANON|ECHO, 1); } +static long get_time_ms() +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return ts.tv_sec * 1E3 + ts.tv_nsec / 1E6; +} + int event_handler(struct event *ev) { + static long last_time; + long ctime = get_time_ms(); + switch (ev->type) { const char *name; @@ -47,6 +59,9 @@ int event_handler(struct event *ev) if (ev->devev->type == DEV_KEY) { name = keycode_table[ev->devev->code].name; + if (time_flag) + printf("+%ld ms\t", ctime - last_time); + printf("%s\t%04x:%04x\t%s %s\n", ev->dev->name, ev->dev->vendor_id, @@ -63,11 +78,20 @@ int event_handler(struct event *ev) fflush(stdout); fflush(stderr); + last_time = ctime; return 0; } int monitor(int argc, char *argv[]) { + if (argc == 1 && !strcmp(argv[0], "-h")) { + printf("Usage: keyd monitor [-t]\n\n\t-t: Print the time in milliseconds between events.\n"); + return 0; + } + + if (argc == 1 && !strcmp(argv[0], "-t")) + time_flag = 1; + if (isatty(1)) set_tflags(ECHO, 0);