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 <oleh.nyk@gmail.com> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Acked-by: Dan Nicholson <dbn.lists@gmail.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
83c059f034
commit
c05c8640f1
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -282,6 +282,7 @@ typedef enum {
|
|||
MATCH_USBID,
|
||||
MATCH_DRIVER,
|
||||
MATCH_TAG,
|
||||
MATCH_LAYOUT,
|
||||
MATCH_IS_KEYBOARD,
|
||||
MATCH_IS_POINTER,
|
||||
MATCH_IS_JOYSTICK,
|
||||
|
|
Loading…
Reference in New Issue
Block a user