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
|
#define match_path_pattern match_substring
|
||||||
#endif
|
#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.
|
* Match an attribute against a list of NULL terminated arrays of patterns.
|
||||||
* If a pattern in each list entry is matched, return TRUE.
|
* If a pattern in each list entry is matched, return TRUE.
|
||||||
|
@ -564,6 +578,13 @@ InputClassMatches(const XF86ConfInputClassPtr iclass, const InputInfoPtr idev,
|
||||||
return FALSE;
|
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 */
|
/* MatchIs* booleans */
|
||||||
if (iclass->is_keyboard.set &&
|
if (iclass->is_keyboard.set &&
|
||||||
iclass->is_keyboard.val != !!(attrs->flags & ATTR_KEYBOARD))
|
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
|
pattern. A match is found if at least one of the tags given in
|
||||||
.RI \*q matchtag \*q
|
.RI \*q matchtag \*q
|
||||||
matches at least one of the tags assigned by the backend.
|
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
|
.PP
|
||||||
The second type of entry is used to match device types. These entries take a
|
The second type of entry is used to match device types. These entries take a
|
||||||
boolean argument similar to
|
boolean argument similar to
|
||||||
|
|
|
@ -52,6 +52,7 @@ xf86ConfigSymTabRec InputClassTab[] =
|
||||||
{MATCH_USBID, "matchusbid"},
|
{MATCH_USBID, "matchusbid"},
|
||||||
{MATCH_DRIVER, "matchdriver"},
|
{MATCH_DRIVER, "matchdriver"},
|
||||||
{MATCH_TAG, "matchtag"},
|
{MATCH_TAG, "matchtag"},
|
||||||
|
{MATCH_LAYOUT, "matchlayout"},
|
||||||
{MATCH_IS_KEYBOARD, "matchiskeyboard"},
|
{MATCH_IS_KEYBOARD, "matchiskeyboard"},
|
||||||
{MATCH_IS_POINTER, "matchispointer"},
|
{MATCH_IS_POINTER, "matchispointer"},
|
||||||
{MATCH_IS_JOYSTICK, "matchisjoystick"},
|
{MATCH_IS_JOYSTICK, "matchisjoystick"},
|
||||||
|
@ -94,6 +95,7 @@ xf86parseInputClassSection(void)
|
||||||
list_init(&ptr->match_usbid);
|
list_init(&ptr->match_usbid);
|
||||||
list_init(&ptr->match_driver);
|
list_init(&ptr->match_driver);
|
||||||
list_init(&ptr->match_tag);
|
list_init(&ptr->match_tag);
|
||||||
|
list_init(&ptr->match_layout);
|
||||||
|
|
||||||
while ((token = xf86getToken(InputClassTab)) != ENDSECTION) {
|
while ((token = xf86getToken(InputClassTab)) != ENDSECTION) {
|
||||||
switch (token) {
|
switch (token) {
|
||||||
|
@ -169,6 +171,12 @@ xf86parseInputClassSection(void)
|
||||||
add_group_entry(&ptr->match_tag,
|
add_group_entry(&ptr->match_tag,
|
||||||
xstrtokenize(val.str, TOKEN_SEP));
|
xstrtokenize(val.str, TOKEN_SEP));
|
||||||
break;
|
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:
|
case MATCH_IS_KEYBOARD:
|
||||||
if (xf86getSubToken(&(ptr->comment)) != STRING)
|
if (xf86getSubToken(&(ptr->comment)) != STRING)
|
||||||
Error(QUOTE_MSG, "MatchIsKeyboard");
|
Error(QUOTE_MSG, "MatchIsKeyboard");
|
||||||
|
@ -307,6 +315,13 @@ xf86printInputClassSection (FILE * cf, XF86ConfInputClassPtr ptr)
|
||||||
*cur);
|
*cur);
|
||||||
fprintf(cf, "\"\n");
|
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)
|
if (ptr->is_keyboard.set)
|
||||||
fprintf(cf, "\tIsKeyboard \"%s\"\n",
|
fprintf(cf, "\tIsKeyboard \"%s\"\n",
|
||||||
|
@ -392,6 +407,12 @@ xf86freeInputClassList (XF86ConfInputClassPtr ptr)
|
||||||
free(*list);
|
free(*list);
|
||||||
free(group);
|
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);
|
TestFree(ptr->comment);
|
||||||
xf86optionListFree(ptr->option_lst);
|
xf86optionListFree(ptr->option_lst);
|
||||||
|
|
|
@ -358,6 +358,7 @@ typedef struct
|
||||||
struct list match_usbid;
|
struct list match_usbid;
|
||||||
struct list match_driver;
|
struct list match_driver;
|
||||||
struct list match_tag;
|
struct list match_tag;
|
||||||
|
struct list match_layout;
|
||||||
xf86TriState is_keyboard;
|
xf86TriState is_keyboard;
|
||||||
xf86TriState is_pointer;
|
xf86TriState is_pointer;
|
||||||
xf86TriState is_joystick;
|
xf86TriState is_joystick;
|
||||||
|
|
|
@ -282,6 +282,7 @@ typedef enum {
|
||||||
MATCH_USBID,
|
MATCH_USBID,
|
||||||
MATCH_DRIVER,
|
MATCH_DRIVER,
|
||||||
MATCH_TAG,
|
MATCH_TAG,
|
||||||
|
MATCH_LAYOUT,
|
||||||
MATCH_IS_KEYBOARD,
|
MATCH_IS_KEYBOARD,
|
||||||
MATCH_IS_POINTER,
|
MATCH_IS_POINTER,
|
||||||
MATCH_IS_JOYSTICK,
|
MATCH_IS_JOYSTICK,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user