From c05c8640f13708384e77579e7714ca846fa93f5c Mon Sep 17 00:00:00 2001 From: Oleh Nykyforchyn Date: Thu, 19 May 2011 09:39:52 +0300 Subject: [PATCH] xfree86: Allow "MatchLayout" statements in config files Usage example (tested on a dual-seat PC): Section "InputClass" Identifier "keyboard-all" MatchIsKeyboard "on" MatchDevicePath "/dev/input/event*" MatchLayout "!GeForce|!Matrox" Driver "evdev" Option "XkbLayout" "us" Option "XkbOptions" "terminate:ctrl_alt_bksp" EndSection It disables auto keyboard configuration for layouts "GeForce" and "Matrox". Note that "" in patterns means "no Layout sections found", e.g. MatchLayout "GeForce|" is "in layout GeForce or without explicit layout at all". Signed-off-by: Oleh Nykyforchyn Reviewed-by: Peter Hutterer Acked-by: Dan Nicholson Signed-off-by: Peter Hutterer --- hw/xfree86/common/xf86Xinput.c | 21 +++++++++++++++++++++ hw/xfree86/man/xorg.conf.man | 10 ++++++++++ hw/xfree86/parser/InputClass.c | 21 +++++++++++++++++++++ hw/xfree86/parser/xf86Parser.h | 1 + hw/xfree86/parser/xf86tokens.h | 1 + 5 files changed, 54 insertions(+) diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index e7e1ce1f0..26051ad7f 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -469,6 +469,20 @@ match_path_pattern(const char *attr, const char *pattern) #define match_path_pattern match_substring #endif +/* + * If no Layout section is found, xf86ServerLayout.id becomes "(implicit)" + * It is convenient that "" in patterns means "no explicit layout" + */ +static int +match_string_implicit(const char *attr, const char *pattern) +{ + if (strlen(pattern)) { + return strcmp(attr, pattern); + } else { + return strcmp(attr,"(implicit)"); + } +} + /* * Match an attribute against a list of NULL terminated arrays of patterns. * If a pattern in each list entry is matched, return TRUE. @@ -564,6 +578,13 @@ InputClassMatches(const XF86ConfInputClassPtr iclass, const InputInfoPtr idev, return FALSE; } + /* MatchLayout string */ + if (!list_is_empty(&iclass->match_layout)) { + if (!MatchAttrToken(xf86ConfigLayout.id, + &iclass->match_layout, match_string_implicit)) + return FALSE; + } + /* MatchIs* booleans */ if (iclass->is_keyboard.set && iclass->is_keyboard.val != !!(attrs->flags & ATTR_KEYBOARD)) diff --git a/hw/xfree86/man/xorg.conf.man b/hw/xfree86/man/xorg.conf.man index 4bec31695..f406f82bb 100644 --- a/hw/xfree86/man/xorg.conf.man +++ b/hw/xfree86/man/xorg.conf.man @@ -1140,6 +1140,16 @@ matches the pattern. A match is found if at least one of the tags given in .RI \*q matchtag \*q matches at least one of the tags assigned by the backend. +.TP 7 +.BI "MatchLayout \*q" matchlayout \*q +Check the case-sensitive string +.RI \*q matchlayout \*q +against the currently active +.B ServerLayout +section. The empty string "" matches an implicit layout which appears +if no named +.B ServerLayout +sections have been found. .PP The second type of entry is used to match device types. These entries take a boolean argument similar to diff --git a/hw/xfree86/parser/InputClass.c b/hw/xfree86/parser/InputClass.c index 9f88e7ee4..3f801700e 100644 --- a/hw/xfree86/parser/InputClass.c +++ b/hw/xfree86/parser/InputClass.c @@ -52,6 +52,7 @@ xf86ConfigSymTabRec InputClassTab[] = {MATCH_USBID, "matchusbid"}, {MATCH_DRIVER, "matchdriver"}, {MATCH_TAG, "matchtag"}, + {MATCH_LAYOUT, "matchlayout"}, {MATCH_IS_KEYBOARD, "matchiskeyboard"}, {MATCH_IS_POINTER, "matchispointer"}, {MATCH_IS_JOYSTICK, "matchisjoystick"}, @@ -94,6 +95,7 @@ xf86parseInputClassSection(void) list_init(&ptr->match_usbid); list_init(&ptr->match_driver); list_init(&ptr->match_tag); + list_init(&ptr->match_layout); while ((token = xf86getToken(InputClassTab)) != ENDSECTION) { switch (token) { @@ -169,6 +171,12 @@ xf86parseInputClassSection(void) add_group_entry(&ptr->match_tag, xstrtokenize(val.str, TOKEN_SEP)); break; + case MATCH_LAYOUT: + if (xf86getSubToken(&(ptr->comment)) != STRING) + Error(QUOTE_MSG, "MatchLayout"); + add_group_entry(&ptr->match_layout, + xstrtokenize(val.str, TOKEN_SEP)); + break; case MATCH_IS_KEYBOARD: if (xf86getSubToken(&(ptr->comment)) != STRING) Error(QUOTE_MSG, "MatchIsKeyboard"); @@ -307,6 +315,13 @@ xf86printInputClassSection (FILE * cf, XF86ConfInputClassPtr ptr) *cur); fprintf(cf, "\"\n"); } + list_for_each_entry(group, &ptr->match_layout, entry) { + fprintf(cf, "\tMatchLayout \""); + for (cur = group->values; *cur; cur++) + fprintf(cf, "%s%s", cur == group->values ? "" : TOKEN_SEP, + *cur); + fprintf(cf, "\"\n"); + } if (ptr->is_keyboard.set) fprintf(cf, "\tIsKeyboard \"%s\"\n", @@ -392,6 +407,12 @@ xf86freeInputClassList (XF86ConfInputClassPtr ptr) free(*list); free(group); } + list_for_each_entry_safe(group, next, &ptr->match_layout, entry) { + list_del(&group->entry); + for (list = group->values; *list; list++) + free(*list); + free(group); + } TestFree(ptr->comment); xf86optionListFree(ptr->option_lst); diff --git a/hw/xfree86/parser/xf86Parser.h b/hw/xfree86/parser/xf86Parser.h index 4f279f18d..a8785c5fa 100644 --- a/hw/xfree86/parser/xf86Parser.h +++ b/hw/xfree86/parser/xf86Parser.h @@ -358,6 +358,7 @@ typedef struct struct list match_usbid; struct list match_driver; struct list match_tag; + struct list match_layout; xf86TriState is_keyboard; xf86TriState is_pointer; xf86TriState is_joystick; diff --git a/hw/xfree86/parser/xf86tokens.h b/hw/xfree86/parser/xf86tokens.h index 468a2ffa2..abcafcf8e 100644 --- a/hw/xfree86/parser/xf86tokens.h +++ b/hw/xfree86/parser/xf86tokens.h @@ -282,6 +282,7 @@ typedef enum { MATCH_USBID, MATCH_DRIVER, MATCH_TAG, + MATCH_LAYOUT, MATCH_IS_KEYBOARD, MATCH_IS_POINTER, MATCH_IS_JOYSTICK,