Commit c05c8640 authored by Oleh Nykyforchyn's avatar Oleh Nykyforchyn Committed by Peter Hutterer

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: default avatarOleh Nykyforchyn <oleh.nyk@gmail.com>
Reviewed-by: Peter Hutterer's avatarPeter Hutterer <peter.hutterer@who-t.net>
Acked-by: Dan Nicholson's avatarDan Nicholson <dbn.lists@gmail.com>
Signed-off-by: Peter Hutterer's avatarPeter Hutterer <peter.hutterer@who-t.net>
parent 83c059f0
......@@ -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,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment