diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2023-10-03 11:36:10 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2023-10-03 11:36:42 +1000 |
commit | cb6ea55f98b2abdfbc0d93c5ea0dd63ac7e30f62 (patch) | |
tree | b1de4f7075f11401a5281030fa2d43dd35710a2b | |
parent | b6092488058da39754ece13475aab53616397af7 (diff) |
property: add support for setting PropModeAppend/...
Only available on the generic set-prop command, this is for debugging
only anyway.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | src/property.c | 34 | ||||
-rw-r--r-- | src/xinput.c | 2 |
2 files changed, 24 insertions, 12 deletions
diff --git a/src/property.c b/src/property.c index e3baef3..fcbffac 100644 --- a/src/property.c +++ b/src/property.c @@ -301,7 +301,7 @@ delete_prop_xi1(Display *dpy, int argc, char** argv, char* n, char *desc) } static int -do_set_prop_xi1(Display *dpy, Atom type, int format, int argc, char **argv, char *n, char *desc) +do_set_prop_xi1(Display *dpy, Atom type, int format, unsigned int mode, int argc, char **argv, char *n, char *desc) { XDeviceInfo *info; XDevice *dev; @@ -419,7 +419,7 @@ do_set_prop_xi1(Display *dpy, Atom type, int format, int argc, char **argv, char } } - XChangeDeviceProperty(dpy, dev, prop, type, format, PropModeReplace, + XChangeDeviceProperty(dpy, dev, prop, type, format, mode, data.c, nelements); free(data.c); XCloseDevice(dpy, dev); @@ -607,7 +607,7 @@ delete_prop_xi2(Display *dpy, int argc, char** argv, char* n, char *desc) } static int -do_set_prop_xi2(Display *dpy, Atom type, int format, int argc, char **argv, char *n, char *desc) +do_set_prop_xi2(Display *dpy, Atom type, int format, unsigned int mode, int argc, char **argv, char *n, char *desc) { XIDeviceInfo *info; Atom prop; @@ -717,7 +717,7 @@ do_set_prop_xi2(Display *dpy, Atom type, int format, int argc, char **argv, char } } - XIChangeProperty(dpy, info->deviceid, prop, type, format, PropModeReplace, + XIChangeProperty(dpy, info->deviceid, prop, type, format, mode, data.c, nelements); rc = EXIT_SUCCESS; out: @@ -749,19 +749,19 @@ int delete_prop(Display *display, int argc, char *argv[], char *name, } static int -do_set_prop(Display *display, Atom type, int format, int argc, char *argv[], char *name, char *desc) +do_set_prop(Display *display, Atom type, int format, unsigned int mode, int argc, char *argv[], char *name, char *desc) { #if HAVE_XI2 if (xinput_version(display) == XI_2_Major) - return do_set_prop_xi2(display, type, format, argc, argv, name, desc); + return do_set_prop_xi2(display, type, format, mode, argc, argv, name, desc); #endif - return do_set_prop_xi1(display, type, format, argc, argv, name, desc); + return do_set_prop_xi1(display, type, format, mode, argc, argv, name, desc); } int set_atom_prop(Display *dpy, int argc, char** argv, char* n, char *desc) { - return do_set_prop(dpy, XA_ATOM, 32, argc, argv, n, desc); + return do_set_prop(dpy, XA_ATOM, 32, PropModeReplace, argc, argv, n, desc); } int @@ -786,7 +786,7 @@ set_int_prop(Display *dpy, int argc, char** argv, char* n, char *desc) for (i = 3; i < argc; i++) argv[i - 1] = argv[i]; - return do_set_prop(dpy, XA_INTEGER, format, argc - 1, argv, n, desc); + return do_set_prop(dpy, XA_INTEGER, format, argc - 1, PropModeReplace, argv, n, desc); } int @@ -800,7 +800,7 @@ set_float_prop(Display *dpy, int argc, char** argv, char* n, char *desc) return EXIT_FAILURE; } - return do_set_prop(dpy, float_atom, 32, argc, argv, n, desc); + return do_set_prop(dpy, float_atom, 32, PropModeReplace, argc, argv, n, desc); } int set_prop(Display *display, int argc, char *argv[], char *name, @@ -809,6 +809,7 @@ int set_prop(Display *display, int argc, char *argv[], char *name, Atom type = None; int format = 0; int i = 0, j; + unsigned int mode = PropModeReplace; while (i < argc) { char *option = strchr(argv[i], '='); @@ -837,6 +838,17 @@ int set_prop(Display *display, int argc, char *argv[], char *name, fprintf(stderr, "invalid property format '%s'\n", option + 1); return EXIT_FAILURE; } + } else if (!strncmp(argv[i], "--mode=", strlen("--mode="))) { + if (!strcmp(option + 1, "append")) { + mode = PropModeAppend; + } else if (!strcmp(option + 1, "prepend")) { + mode = PropModePrepend; + } else if (!strcmp(option + 1, "replace")) { + mode = PropModeReplace; + } else { + fprintf(stderr, "invalid property mode '%s'\n", option + 1); + return EXIT_FAILURE; + } } else { fprintf(stderr, "invalid option '%s'\n", argv[i]); return EXIT_FAILURE; @@ -847,7 +859,7 @@ int set_prop(Display *display, int argc, char *argv[], char *name, argc--; } - return do_set_prop(display, type, format, argc, argv, name, desc); + return do_set_prop(display, type, format, mode, argc, argv, name, desc); } int disable(Display *display, int argc, char *argv[], char *name, char *desc) diff --git a/src/xinput.c b/src/xinput.c index c23e5ad..82cdb95 100644 --- a/src/xinput.c +++ b/src/xinput.c @@ -134,7 +134,7 @@ static entry drivers[] = delete_prop }, { "set-prop", - "<device> [--type=atom|float|int] [--format=8|16|32] <property> <val> [<val> ...]", + "<device> [--type=atom|float|int] [--format=8|16|32] [--mode=replace|append|prepend] <property> <val> [<val> ...]", set_prop }, { |