summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2023-10-03 11:36:10 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2023-10-03 11:36:42 +1000
commitcb6ea55f98b2abdfbc0d93c5ea0dd63ac7e30f62 (patch)
treeb1de4f7075f11401a5281030fa2d43dd35710a2b
parentb6092488058da39754ece13475aab53616397af7 (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.c34
-rw-r--r--src/xinput.c2
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
},
{