Hi,

I want add new functions xf86SetIntSubstrOption xf86SetStrSubstrOption in 
xserver, to work with similar options assembled in one string.
https://bugs.freedesktop.org/attachment.cgi?id=21368
Originally they was made for synaptics driver. It have series of options which 
define  what mouse button is reported after smth. if using one, two or three 
fingers:
    TapButton1
    TapButton2
    TapButton3
    ClickFinger1
    ClickFinger2
    ClickFinger3
    CornerButtonRT
    CornerButtonRB
    CornerButtonLT
    CornerButtonLB
And I think configuration xorg will be more simply if in this case use options 
like this:
MapTapButton = "1 2 3"

From 863b0ab64ab1a9ad3c971112179d13922d0eb388 Mon Sep 17 00:00:00 2001
From: Fedor P. Goncharov (Fredy) <[email protected]>
Date: Mon, 22 Dec 2008 03:37:46 +0600
Subject: [PATCH] New functions for work with substring (Bug#18745).

New functions added:
 xf86SetIntSubstrOption
 xf86SetIntSubstrOption
You can use them to work with a few options, whitch
assembled in one string.
---
 hw/xfree86/common/xf86Opt.h    |    2 +
 hw/xfree86/common/xf86Option.c |   54 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+), 0 deletions(-)

diff --git a/hw/xfree86/common/xf86Opt.h b/hw/xfree86/common/xf86Opt.h
index ce3d767..255f413 100644
--- a/hw/xfree86/common/xf86Opt.h
+++ b/hw/xfree86/common/xf86Opt.h
@@ -71,6 +71,8 @@ typedef struct {
 extern _X_EXPORT int xf86SetIntOption(pointer optlist, const char *name, int deflt);
 extern _X_EXPORT double xf86SetRealOption(pointer optlist, const char *name, double deflt);
 extern _X_EXPORT char *xf86SetStrOption(pointer optlist, const char *name, char *deflt);
+extern _X_EXPORT char *xf86SetStrSubstrOption(pointer optlist, const char *name, int order, char *deflt);
+extern _X_EXPORT int   xf86SetIntSubstrOption(pointer optlist, const char *name, int order, int deflt);
 extern _X_EXPORT int xf86SetBoolOption(pointer list, const char *name, int deflt );
 extern _X_EXPORT int xf86CheckIntOption(pointer optlist, const char *name, int deflt);
 extern _X_EXPORT double xf86CheckRealOption(pointer optlist, const char *name, double deflt);
diff --git a/hw/xfree86/common/xf86Option.c b/hw/xfree86/common/xf86Option.c
index ad8d1c4..126003c 100644
--- a/hw/xfree86/common/xf86Option.c
+++ b/hw/xfree86/common/xf86Option.c
@@ -210,6 +210,38 @@ LookupStrOption(pointer optlist, const char *name, char *deflt, Bool markUsed)
 }
 
 
+static char *
+LookupSubstrOption(pointer optlist, const char *name, int order, Bool markUsed)
+{
+    OptionInfoRec o;
+    size_t a_size=0, w_size=0;
+
+    o.name = name;
+    o.type = OPTV_STRING;
+
+    if (ParseOptionValue(-1, optlist, &o, markUsed)) {
+      char *str = o.value.str;
+      /* find substring, which have right order and return it */
+      while(*str !='\0') {
+	if(*(str + w_size) != ' ' && *(str + w_size) != '\0')
+	  w_size++;
+	else if(w_size > 0) {
+	  a_size++;
+	  if(order == a_size) {
+	    char* tmp = malloc(sizeof(char) * (w_size + 1));
+	    strncpy(tmp,str,w_size);
+	    return tmp;
+	  }
+	  str += w_size;
+	  w_size = 0;
+	} else
+	  str++;
+      }
+    } 
+    return NULL;
+}
+
+
 static int
 LookupBoolOption(pointer optlist, const char *name, int deflt, Bool markUsed)
 {
@@ -245,6 +277,28 @@ xf86SetStrOption(pointer optlist, const char *name, char *deflt)
 }
 
 
+char *
+xf86SetStrSubstrOption(pointer optlist, const char *name, int order, char *deflt)
+{
+  char *tmp = LookupSubstrOption(optlist, name, order, TRUE);
+  if(tmp != NULL)
+    return tmp;
+  return xstrdup(deflt);
+}
+
+
+int
+xf86SetIntSubstrOption(pointer optlist, const char *name, int order, int deflt)
+{
+  char *tmp = LookupSubstrOption(optlist, name, order, TRUE);
+  if(tmp != NULL) {
+    deflt = atoi(tmp);
+    free(tmp);
+  }
+  return deflt;
+}
+
+
 int
 xf86SetBoolOption(pointer optlist, const char *name, int deflt)
 {
-- 
1.5.6.5

_______________________________________________
xorg mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/xorg

Reply via email to