bin_PROGRAMS = xinput
- xinput_CFLAGS = $(XINPUT_CFLAGS)
- xinput_LDADD = $(XINPUT_LIBS) -lm
+ AM_CFLAGS = $(XINPUT_CFLAGS)
+ xinput_LDADD = $(XINPUT_LIBS)
xinput_SOURCES = \
buttonmap.c \
feedback.c \
+ hierarchy.c \
list.c \
setint.c \
+ setcp.c \
setmode.c \
setptr.c \
state.c \
* 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, and that the name of Frederic Lepied not be used in
+ * documentation, and that the name of the authors not be used in
* advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Frederic Lepied makes no
+ * specific, written prior permission. The authors make no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
- * FREDERIC LEPIED DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL FREDERIC LEPIED BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
#include "xinput.h"
#include <string.h>
+#include <X11/extensions/XIproto.h> /* for XI_Device***ChangedNotify */
static void
print_info(XDeviceInfo *info, Bool shortformat)
XButtonInfoPtr b;
XValuatorInfoPtr v;
XAxisInfoPtr a;
+ XAttachInfoPtr att;
printf("\"%s\"\tid=%ld\t[", info->name, info->id);
printf ("\t\tResolution is %d\n", a->resolution);
}
break;
+ case AttachClass:
+ att = (XAttachInfoPtr)any;
+ printf("\tAttached to %d\n", att->attached);
+ break;
default:
printf ("unknown class\n");
XDeviceInfo *info;
int loop;
int shortformat = False;
+ int daemon = False;
shortformat = (argc == 1 && strcmp(argv[0], "--short") == 0);
+ daemon = (argc == 1 && strcmp(argv[0], "--loop") == 0);
- if (argc == 0 || shortformat) {
+ if (argc == 0 || shortformat || daemon) {
int num_devices;
-
- info = XListInputDevices(display, &num_devices);
-
- for(loop=0; loop<num_devices; loop++) {
- print_info(info+loop, shortformat);
- }
+ XEvent ev;
+
+ if (daemon)
+ {
+ XiSelectEvent(display, DefaultRootWindow(display), NULL,
+ XI_DeviceHierarchyChangedMask |
+ XI_DeviceClassesChangedMask);
+ }
+
+ do {
+ info = XListInputDevices(display, &num_devices);
+ for(loop=0; loop<num_devices; loop++) {
+ print_info(info+loop, shortformat);
+ }
+
+ /* just wait for the next generic event to come along */
+ while (daemon && !XNextEvent(display, &ev))
+ {
+ if (ev.type == GenericEvent)
+ {
+ XGenericEvent* gev = (XGenericEvent*)&ev;
+ /* we just assume that extension is IReqCode, pretty save
+ since we don't register for other events. */
+ if (gev->evtype == XI_DeviceHierarchyChangedNotify)
+ {
+ printf("Hierarchy change.\n");
+ } else if (gev->evtype == XI_DeviceClassesChangedNotify)
+ {
+ printf("Device classes changed.\n");
+ free(((XDeviceClassesChangedEvent*)&ev)->inputclassinfo);
+ }
+ break;
+ }
+ }
+ } while(daemon);
} else {
int ret = EXIT_SUCCESS;
for(loop=0; loop<argc; loop++) {
- info = find_device_info(display, argv[0], False);
+ info = find_device_info(display, argv[loop], False);
if (!info) {
- fprintf(stderr, "unable to find device %s\n", argv[0]);
+ fprintf(stderr, "unable to find device %s\n", argv[loop]);
ret = EXIT_FAILURE;
} else {
print_info(info, shortformat);
* 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, and that the name of Frederic Lepied not be used in
+ * documentation, and that the name of the authors not be used in
* advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Frederic Lepied makes no
+ * specific, written prior permission. The authors make no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
- * FREDERIC LEPIED DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL FREDERIC LEPIED BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
#endif
);
-typedef struct
+typedef struct
{
char *func_name;
char *arg_desc;
set_mode
},
{"list",
- "[--short || <device name>...]",
+ "[--loop || --short || <device name>...]",
list
},
{"query-state",
"",
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
+ },
+ { "set-cp",
+ "<window> <device>",
+ set_clientpointer
+ },
{0, 0, 0
}
};
{
XExtensionVersion *version;
Bool present;
-
+
version = XGetExtensionVersion(display, INAME);
if (version && (version != (XExtensionVersion*) NoSuchExtension)) {
Bool only_extended)
{
XDeviceInfo *devices;
+ XDeviceInfo *found = NULL;
int loop;
int num_devices;
int len = strlen(name);
if ((!only_extended || (devices[loop].use >= IsXExtensionDevice)) &&
((!is_id && strcmp(devices[loop].name, name) == 0) ||
(is_id && devices[loop].id == id))) {
- return &devices[loop];
+ if (found) {
+ fprintf(stderr,
+ "Warning: There are multiple devices named \"%s\".\n"
+ "To ensure the correct one is selected, please use "
+ "the device ID instead.\n\n", name);
+ } else {
+ found = &devices[loop];
+ }
}
}
- return NULL;
+ return found;
}
static void
- usage()
+ usage(void)
{
entry *pdriver = drivers;
* 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, and that the name of Frederic Lepied not be used in
+ * documentation, and that the name of the authors not be used in
* advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Frederic Lepied makes no
+ * specific, written prior permission. The authors make no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
- * FREDERIC LEPIED DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL FREDERIC LEPIED BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
#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
+);
+
+int
+set_clientpointer(
+#if NeedFunctionPrototypes
+ Display* display,
+ int argc,
+ char *argv[],
+ char *prog_name,
+ char *prog_desc
+#endif
+);
+
+/* end of xinput.h */