mirror of
https://github.com/systemd/systemd.git
synced 2025-01-11 09:18:07 +03:00
keymap: Support keymap overrides in /etc/udev/keymaps
Prefer reading keymaps from /etc/udev/keymaps/ so that it's easy to just locally fix a key or two by copying the existing keymap file from /lib/udev/keymaps/. This works similarly to udev rules. http://bugs.debian.org/556045
This commit is contained in:
parent
2fdaa983a9
commit
3c00bc177c
@ -184,16 +184,9 @@ static void set_key(int fd, const char* scancode_str, const char* keyname)
|
|||||||
scancode, k->id);
|
scancode, k->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int merge_table(int fd, const char *filename) {
|
static int merge_table(int fd, FILE *f) {
|
||||||
int r = 0;
|
int r = 0;
|
||||||
int line = 0;
|
int line = 0;
|
||||||
FILE* f;
|
|
||||||
|
|
||||||
f = fopen(filename, "r");
|
|
||||||
if (!f) {
|
|
||||||
perror(filename);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (!feof(f)) {
|
while (!feof(f)) {
|
||||||
char s[256], *p;
|
char s[256], *p;
|
||||||
@ -246,17 +239,6 @@ fail:
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char* default_keymap_path(const char* path)
|
|
||||||
{
|
|
||||||
static char result[PATH_MAX];
|
|
||||||
|
|
||||||
/* If keymap file is given without a path, assume udev directory; must end with '/' * */
|
|
||||||
if (!strchr(path, '/')) {
|
|
||||||
snprintf(result, sizeof(result), "%s%s", LIBEXECDIR "/keymaps/", path);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* read one event; return 1 if valid */
|
/* read one event; return 1 if valid */
|
||||||
static int read_event(int fd, struct input_event* ev)
|
static int read_event(int fd, struct input_event* ev)
|
||||||
@ -424,7 +406,31 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
/* two arguments (device, mapfile): set map file */
|
/* two arguments (device, mapfile): set map file */
|
||||||
if (argc == optind+2) {
|
if (argc == optind+2) {
|
||||||
merge_table(fd, default_keymap_path(argv[optind+1]));
|
const char *filearg = argv[optind+1];
|
||||||
|
if (strchr(filearg, '/')) {
|
||||||
|
/* Keymap file argument is a path */
|
||||||
|
FILE *f = fopen(filearg, "r");
|
||||||
|
if (f)
|
||||||
|
merge_table(fd, f);
|
||||||
|
else
|
||||||
|
perror(filearg);
|
||||||
|
} else {
|
||||||
|
/* Keymap file argument is a filename */
|
||||||
|
/* Open override file if present, otherwise default file */
|
||||||
|
char keymap_path[PATH_MAX];
|
||||||
|
snprintf(keymap_path, sizeof(keymap_path), "%s%s", SYSCONFDIR "/udev/keymaps/", filearg);
|
||||||
|
FILE *f = fopen(keymap_path, "r");
|
||||||
|
if (f) {
|
||||||
|
merge_table(fd, f);
|
||||||
|
} else {
|
||||||
|
snprintf(keymap_path, sizeof(keymap_path), "%s%s", LIBEXECDIR "/keymaps/", filearg);
|
||||||
|
f = fopen(keymap_path, "r");
|
||||||
|
if (f)
|
||||||
|
merge_table(fd, f);
|
||||||
|
else
|
||||||
|
perror(keymap_path);
|
||||||
|
}
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user