[PATCH xfree86] Allow "MatchLayout" statements in config files

Peter Hutterer peter.hutterer at who-t.net
Thu May 19 18:12:40 PDT 2011


On Thu, May 19, 2011 at 09:39:52AM +0300, Oleh Nykyforchyn wrote:
> On Wed, 18 May 2011 13:48:49 +1000
> Peter Hutterer <peter.hutterer at who-t.net> wrote:
> 
> > looks good though, thanks. If you can add the few lines needed for the man
> > page (copy/paste from existing + from this commit message), I'll merge it
> > in. Please send it as a new patch though so I can just apply it directly.
> > 
> > If there's any typos/etc in the man page, I'll just fix it when applying.
> > 
> All the three patches are remade. Final version:
> 
> 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 at gmail.com>

merged, thanks.

Cheers,
  Peter

> ---
>  hw/xfree86/common/xf86Xinput.c |   21 +++++++++++++++++++++
>  hw/xfree86/parser/InputClass.c |   21 +++++++++++++++++++++
>  hw/xfree86/parser/xf86Parser.h |    1 +
>  hw/xfree86/parser/xf86tokens.h |    1 +
>  4 files changed, 44 insertions(+), 0 deletions(-)
> 
> diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
> index e7e1ce1..c08ae53 100644
> --- a/hw/xfree86/common/xf86Xinput.c
> +++ b/hw/xfree86/common/xf86Xinput.c
> @@ -470,6 +470,20 @@ match_path_pattern(const char *attr, const char *pattern)
>  #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/parser/InputClass.c b/hw/xfree86/parser/InputClass.c
> index 9f88e7e..3f80170 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 4f279f1..a8785c5 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 468a2ff..abcafcf 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,
> -- 
> 1.7.0.1
> 
> 
> -- 
> Oleh Nykyforchyn <oleh.nyk at gmail.com>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
> 


More information about the xorg-devel mailing list