diff --git a/midizap.c b/midizap.c index d781531..ea571a9 100644 --- a/midizap.c +++ b/midizap.c @@ -494,11 +494,17 @@ void quitter() quit = 1; } +// poll interval in microsec (this shouldn't be too large to avoid jitter) +#define POLL_INTERVAL 1000 +// how often we check the config file per sec (> 0, < 1000000/POLL_INTERVAL) +#define CONF_FREQ 1 +#define MAX_COUNT (1000000/CONF_FREQ/POLL_INTERVAL) + int main(int argc, char **argv) { uint8_t msg[3]; - int opt; + int opt, count = 0; while ((opt = getopt(argc, argv, "htd::r:")) != -1) { switch (opt) { @@ -559,11 +565,22 @@ main(int argc, char **argv) } signal(SIGINT, quitter); + // force the config file to be loaded initially + count = MAX_COUNT; while (!quit) { while (pop_midi(&seq, msg)) { handle_event(msg); + count = 0; + } + usleep(POLL_INTERVAL); + if (++count >= MAX_COUNT) { + // Check whether to reload the config file if we haven't seen any MIDI + // input in a while. Note that if the file *is* reloaded, then we also + // need to reset last_focused_window here, so that the translations of + // the focused window are recomputed the next time we handle an event. + if (read_config_file()) last_focused_window = 0; + count = 0; } - usleep(1000); } printf(" [exiting]\n"); close_jack(&seq); diff --git a/midizap.h b/midizap.h index 7f70f0d..253f531 100644 --- a/midizap.h +++ b/midizap.h @@ -81,6 +81,7 @@ typedef struct _translation { int step[NUM_CHAN][2]; // step size for pitch bends (1 by default) } translation; +extern int read_config_file(void); extern translation *get_translation(char *win_title, char *win_class); extern void print_stroke_sequence(char *name, char *up_or_down, stroke *s); extern int debug_regex, debug_strokes, debug_keys; diff --git a/readconfig.c b/readconfig.c index d1023c7..835705d 100644 --- a/readconfig.c +++ b/readconfig.c @@ -967,7 +967,7 @@ finish_translation(void) } } -void +int read_config_file(void) { struct stat buf; @@ -983,6 +983,7 @@ read_config_file(void) translation *tr = NULL; FILE *f; int config_file_default = 0; + static int errors = 0; if (config_file_name == NULL) { config_file_name = getenv("MIDIZAP_CONFIG_FILE"); @@ -997,13 +998,19 @@ read_config_file(void) } if (stat(config_file_name, &buf) < 0) { // AG: Fall back to the system-wide configuration file. - if (!config_file_default) perror(config_file_name); + if (!config_file_default && !errors) { + perror(config_file_name); + errors++; + } config_file_name = "/etc/midizaprc"; config_file_modification_time = 0; } if (stat(config_file_name, &buf) < 0) { - perror(config_file_name); - return; + if (!errors) { + perror(config_file_name); + errors++; + } + return 0; } if (buf.st_mtime == 0) { buf.st_mtime = 1; @@ -1016,8 +1023,11 @@ read_config_file(void) f = fopen(config_file_name, "r"); if (f == NULL) { - perror(config_file_name); - return; + if (!errors) { + perror(config_file_name); + errors++; + } + return 0; } free_all_translations(); @@ -1126,7 +1136,10 @@ read_config_file(void) } fclose(f); + return 1; + } else { + return 0; } }