Allow empty output sequences, and add a special NOP token which doesn't produce any output. This makes it possible to have translations which don't produce any output, suppressing any default translations.
This commit is contained in:
parent
fbbfabb41d
commit
7fbae6adb8
|
@ -785,6 +785,9 @@ send_strokes(translation *tr, uint8_t portno, int status, int chan,
|
||||||
} else if (s->shift) {
|
} else if (s->shift) {
|
||||||
// toggle shift status
|
// toggle shift status
|
||||||
shift = !shift;
|
shift = !shift;
|
||||||
|
} else if (!s->status) {
|
||||||
|
// do nothing (NOP)
|
||||||
|
;
|
||||||
} else {
|
} else {
|
||||||
if (s->recursive && depth >= MAX_DEPTH) {
|
if (s->recursive && depth >= MAX_DEPTH) {
|
||||||
char name[100];
|
char name[100];
|
||||||
|
|
35
readconfig.c
35
readconfig.c
|
@ -626,6 +626,8 @@ print_stroke(stroke *s, int mod, int step, int n_steps, int *steps, int val)
|
||||||
printf("%s/%c ", str, s->press ? 'D' : 'U');
|
printf("%s/%c ", str, s->press ? 'D' : 'U');
|
||||||
} else if (s->shift) {
|
} else if (s->shift) {
|
||||||
printf("SHIFT ");
|
printf("SHIFT ");
|
||||||
|
} else if (!s->status) {
|
||||||
|
printf("NOP ");
|
||||||
} else {
|
} else {
|
||||||
int status = s->status & 0xf0;
|
int status = s->status & 0xf0;
|
||||||
int channel = (s->status & 0x0f) + 1;
|
int channel = (s->status & 0x0f) + 1;
|
||||||
|
@ -752,7 +754,7 @@ stroke **press_first_stroke;
|
||||||
stroke **release_first_stroke;
|
stroke **release_first_stroke;
|
||||||
stroke **alt_press_stroke;
|
stroke **alt_press_stroke;
|
||||||
stroke **alt_release_stroke;
|
stroke **alt_release_stroke;
|
||||||
int is_keystroke, is_bidirectional, is_anyshift, is_midi, mode;
|
int is_keystroke, is_bidirectional, is_anyshift, is_midi, is_nop, mode;
|
||||||
char *current_translation;
|
char *current_translation;
|
||||||
char *key_name;
|
char *key_name;
|
||||||
int first_release_stroke; // is this the first stroke of a release?
|
int first_release_stroke; // is this the first stroke of a release?
|
||||||
|
@ -796,6 +798,21 @@ append_shift(void)
|
||||||
last_stroke = s;
|
last_stroke = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
append_nop(void)
|
||||||
|
{
|
||||||
|
stroke *s = (stroke *)allocate(sizeof(stroke));
|
||||||
|
|
||||||
|
memset(s, 0, sizeof(stroke));
|
||||||
|
if (*first_stroke) {
|
||||||
|
last_stroke->next = s;
|
||||||
|
} else {
|
||||||
|
*first_stroke = s;
|
||||||
|
}
|
||||||
|
last_stroke = s;
|
||||||
|
is_nop = is_keystroke;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
append_midi(int status, int data, int step, int n_steps, int *steps,
|
append_midi(int status, int data, int step, int n_steps, int *steps,
|
||||||
int swap, int incr, int recursive)
|
int swap, int incr, int recursive)
|
||||||
|
@ -1262,7 +1279,7 @@ start_translation(translation *tr, char *which_key)
|
||||||
}
|
}
|
||||||
current_translation = tr->name;
|
current_translation = tr->name;
|
||||||
key_name = which_key;
|
key_name = which_key;
|
||||||
is_keystroke = is_bidirectional = is_midi = is_anyshift = 0;
|
is_keystroke = is_bidirectional = is_midi = is_nop = is_anyshift = 0;
|
||||||
first_release_stroke = 0;
|
first_release_stroke = 0;
|
||||||
regular_key_down = 0;
|
regular_key_down = 0;
|
||||||
modifier_count = 0;
|
modifier_count = 0;
|
||||||
|
@ -1539,6 +1556,7 @@ add_release(int all_keys)
|
||||||
//printf("add_release(%d)\n", all_keys);
|
//printf("add_release(%d)\n", all_keys);
|
||||||
release_modifiers(all_keys);
|
release_modifiers(all_keys);
|
||||||
if (!all_keys) {
|
if (!all_keys) {
|
||||||
|
if (!*first_stroke) append_nop();
|
||||||
first_stroke = release_first_stroke;
|
first_stroke = release_first_stroke;
|
||||||
if (is_midi) {
|
if (is_midi) {
|
||||||
// walk the list of "press" strokes, find all "dirty" (as yet unhandled)
|
// walk the list of "press" strokes, find all "dirty" (as yet unhandled)
|
||||||
|
@ -1555,9 +1573,8 @@ add_release(int all_keys)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (regular_key_down != 0) {
|
if (regular_key_down) append_stroke(regular_key_down, 0);
|
||||||
append_stroke(regular_key_down, 0);
|
if (all_keys && is_nop && !*first_stroke) append_nop();
|
||||||
}
|
|
||||||
regular_key_down = 0;
|
regular_key_down = 0;
|
||||||
first_release_stroke = 1;
|
first_release_stroke = 1;
|
||||||
if (all_keys && is_bidirectional) {
|
if (all_keys && is_bidirectional) {
|
||||||
|
@ -1569,6 +1586,8 @@ add_release(int all_keys)
|
||||||
append_stroke(s->keysym, s->press);
|
append_stroke(s->keysym, s->press);
|
||||||
} else if (s->shift) {
|
} else if (s->shift) {
|
||||||
append_shift();
|
append_shift();
|
||||||
|
} else if (!s->status) {
|
||||||
|
append_nop();
|
||||||
} else {
|
} else {
|
||||||
append_midi(s->status, s->data,
|
append_midi(s->status, s->data,
|
||||||
s->step, s->n_steps, s->steps,
|
s->step, s->n_steps, s->steps,
|
||||||
|
@ -1586,6 +1605,8 @@ add_release(int all_keys)
|
||||||
append_stroke(s->keysym, s->press);
|
append_stroke(s->keysym, s->press);
|
||||||
} else if (s->shift) {
|
} else if (s->shift) {
|
||||||
append_shift();
|
append_shift();
|
||||||
|
} else if (!s->status) {
|
||||||
|
append_nop();
|
||||||
} else {
|
} else {
|
||||||
append_midi(s->status, s->data,
|
append_midi(s->status, s->data,
|
||||||
s->step, s->n_steps, s->steps,
|
s->step, s->n_steps, s->steps,
|
||||||
|
@ -1601,6 +1622,8 @@ add_release(int all_keys)
|
||||||
append_stroke(s->keysym, s->press);
|
append_stroke(s->keysym, s->press);
|
||||||
} else if (s->shift) {
|
} else if (s->shift) {
|
||||||
append_shift();
|
append_shift();
|
||||||
|
} else if (!s->status) {
|
||||||
|
append_nop();
|
||||||
} else {
|
} else {
|
||||||
append_midi(s->status, s->data,
|
append_midi(s->status, s->data,
|
||||||
s->step, s->n_steps, s->steps,
|
s->step, s->n_steps, s->steps,
|
||||||
|
@ -1869,6 +1892,8 @@ read_config_file(void)
|
||||||
add_keystroke(tok, PRESS_RELEASE);
|
add_keystroke(tok, PRESS_RELEASE);
|
||||||
else if (!strcmp(tok, "SHIFT"))
|
else if (!strcmp(tok, "SHIFT"))
|
||||||
append_shift();
|
append_shift();
|
||||||
|
else if (!strcmp(tok, "NOP"))
|
||||||
|
append_nop();
|
||||||
else if (strncmp(tok, "XK", 2))
|
else if (strncmp(tok, "XK", 2))
|
||||||
add_midi(tok);
|
add_midi(tok);
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue