summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter@cs.unisa.edu.au>2007-11-08 14:53:18 +1030
committerPeter Hutterer <peter@cs.unisa.edu.au>2007-12-20 12:14:11 +1030
commitd1428764180c927cfa45298f5b7d0bf14eacc2da (patch)
tree05004862e1e1d02199687c895fa53e48c51b183a
parent1b4b4191e09ad01bd818d4307836b37ffd8fa5bd (diff)
Add support for device hierarchy changes.
-rw-r--r--src/Makefile.am1
-rw-r--r--src/hierarchy.c183
-rw-r--r--src/xinput.c16
-rw-r--r--src/xinput.h47
4 files changed, 245 insertions, 2 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index a43db58..67fa3a7 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -27,6 +27,7 @@ xinput_LDADD = $(XINPUT_LIBS) -lm
xinput_SOURCES = \
buttonmap.c \
feedback.c \
+ hierarchy.c \
list.c \
setint.c \
setmode.c \
diff --git a/src/hierarchy.c b/src/hierarchy.c
new file mode 100644
index 0000000..edb66a1
--- /dev/null
+++ b/src/hierarchy.c
@@ -0,0 +1,183 @@
+/*
+ * Copyright 2007 Peter Hutterer <peter@cs.unisa.edu.au>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the author shall
+ * not be used in advertising or otherwise to promote the sale, use or
+ * other dealings in this Software without prior written authorization
+ * from the author.
+ *
+ */
+
+#include "xinput.h"
+#include <string.h>
+
+#define Error(error, ...) \
+{ \
+ fprintf(stderr, __VA_ARGS__); \
+ return error;\
+}
+/**
+ * Create a new master device. Name must be supplied, other values are
+ * optional.
+ */
+int
+create_master(Display* dpy, int argc, char** argv, char* name, char *desc)
+{
+ XCreateMasterInfo c;
+ XCreateMasterInfo* pc = &c;
+
+ if (argc == 0)
+ {
+ fprintf(stderr, "Usage: xinput %s %s\n", name, desc);
+ return EXIT_FAILURE;
+ }
+
+ c.type = CH_CreateMasterDevice;
+ c.name = argv[0];
+ c.sendCore = (argc >= 2) ? atoi(argv[1]) : 1;
+ c.enable = (argc >= 3) ? atoi(argv[2]) : 1;
+
+ return XChangeDeviceHierarchy(dpy, 1, (XAnyHierarchyChangeInfo**)&pc);
+}
+
+/**
+ * Remove a master device.
+ * By default, all attached devices are set to Floating, unless parameters are
+ * given.
+ */
+int
+remove_master(Display* dpy, int argc, char** argv, char *name, char *desc)
+{
+ XRemoveMasterInfo r;
+ XRemoveMasterInfo* pr = &r;
+ XDevice* master = NULL, *ptr = NULL, *keybd = NULL;
+ int ret;
+
+ if (argc == 0)
+ {
+ fprintf(stderr, "usage: xinput %s %s\n", name, desc);
+ return EXIT_FAILURE;
+ }
+
+ master = XOpenDevice(dpy, atoi(argv[0]));
+ if (!master)
+ Error(BadValue, "Invalid master device.\n");
+
+ r.type = CH_RemoveMasterDevice;
+ r.device = master;
+ if (argc >= 2)
+ {
+ if (!strcmp(argv[1], "Floating"))
+ r.returnMode = Floating;
+ else if (!strcmp(argv[1], "AttachToMaster"))
+ r.returnMode = AttachToMaster;
+ else
+ Error(BadValue, "Invalid returnMode.\n");
+ } else
+ r.returnMode = Floating;
+
+ if (r.returnMode == AttachToMaster)
+ {
+ ptr = XOpenDevice(dpy, atoi(argv[2]));
+ keybd = XOpenDevice(dpy, atoi(argv[3]));
+ if (!ptr || !keybd)
+ Error(BadValue, "Invalid fallback master.\n");
+ r.returnPointer = ptr;
+ r.returnKeyboard = keybd;
+ }
+
+ ret = XChangeDeviceHierarchy(dpy, 1, (XAnyHierarchyChangeInfo**)&pr);
+ if (ptr)
+ XCloseDevice(dpy, ptr);
+ if (keybd)
+ XCloseDevice(dpy, keybd);
+ return ret;
+}
+
+/**
+ * Swap a device from one master to another.
+ */
+int
+change_attachment(Display* dpy, int argc, char** argv, char *name, char* desc)
+{
+ XChangeAttachmentInfo c;
+ XChangeAttachmentInfo* pc = &c;
+ XDevice *slave, *master;
+ int ret;
+
+ if (argc < 2)
+ {
+ fprintf(stderr, "usage: xinput %s %s\n", name, desc);
+ return EXIT_FAILURE;
+ }
+
+ slave = XOpenDevice(dpy, atoi(argv[0]));
+ master = XOpenDevice(dpy, atoi(argv[1]));
+
+ if (!slave)
+ Error(BadValue, "Invalid slave device given %d\n", atoi(argv[0]));
+
+ if (!master)
+ Error(BadValue, "Invalid master device given %d\n", atoi(argv[1]));
+
+ c.type = CH_ChangeAttachment;
+ c.changeMode = AttachToMaster;
+ c.device = slave;
+ c.newMaster = master;
+
+ ret = XChangeDeviceHierarchy(dpy, 1, (XAnyHierarchyChangeInfo**)&pc);
+ XCloseDevice(dpy, slave);
+ XCloseDevice(dpy, master);
+ return ret;
+}
+
+/**
+ * Set a device floating.
+ */
+int
+float_device(Display* dpy, int argc, char** argv, char* name, char* desc)
+{
+ XChangeAttachmentInfo c;
+ XChangeAttachmentInfo* pc = &c;
+ XDevice *slave;
+ int ret;
+
+ if (argc < 1)
+ {
+ fprintf(stderr, "usage: xinput %s %s\n", name, desc);
+ return EXIT_FAILURE;
+ }
+
+
+ slave = XOpenDevice(dpy, atoi(argv[0]));
+
+ if (!slave)
+ return BadValue;
+
+ c.type = CH_ChangeAttachment;
+ c.changeMode = Floating;
+ c.device = slave;
+
+ ret = XChangeDeviceHierarchy(dpy, 1, (XAnyHierarchyChangeInfo**)&pc);
+ XCloseDevice(dpy, slave);
+ return ret;
+}
+
+
diff --git a/src/xinput.c b/src/xinput.c
index f74dee5..68f7f0b 100644
--- a/src/xinput.c
+++ b/src/xinput.c
@@ -81,6 +81,22 @@ static entry drivers[] =
"",
version
},
+ { "create-master",
+ "<id> [sendCore (dflt:1)] [enable (dflt:1)]",
+ create_master
+ },
+ { "remove-master",
+ "<id> [returnMode (dflt:Floating)] [returnPointer] [returnKeyboard]",
+ remove_master
+ },
+ { "reattach",
+ "<id> <master>",
+ change_attachment
+ },
+ { "float",
+ "<id>",
+ float_device
+ },
{0, 0, 0
}
};
diff --git a/src/xinput.h b/src/xinput.h
index a43ab73..8b94d6a 100644
--- a/src/xinput.h
+++ b/src/xinput.h
@@ -152,5 +152,48 @@ query_state(
#endif
);
-/* end of xinput.h
- */
+int
+create_master(
+#if NeedFunctionPrototypes
+ Display* display,
+ int argc,
+ char *argv[],
+ char *prog_name,
+ char *prog_desc
+#endif
+);
+
+int
+remove_master(
+#if NeedFunctionPrototypes
+ Display* display,
+ int argc,
+ char *argv[],
+ char *prog_name,
+ char *prog_desc
+#endif
+);
+
+int
+change_attachment(
+#if NeedFunctionPrototypes
+ Display* display,
+ int argc,
+ char *argv[],
+ char *prog_name,
+ char *prog_desc
+#endif
+);
+
+int
+float_device(
+#if NeedFunctionPrototypes
+ Display* display,
+ int argc,
+ char *argv[],
+ char *prog_name,
+ char *prog_desc
+#endif
+);
+
+/* end of xinput.h */