Compare commits

..

15 Commits

Author SHA1 Message Date
Enrico Weigelt, metux IT consult
4d30a76fb1 util-strings: drop unused safe_atou()
Not used anywhere.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-12-09 13:48:50 +01:00
Enrico Weigelt, metux IT consult
7d617d1150 util-strings: drop unused zalloc()
Not used anywhere. And crashing the Xserver on alloc failure really
isn't a good idea anyways.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-12-09 13:48:50 +01:00
Enrico Weigelt, metux IT consult
2146a29bdf util-strings: drop unused safe_atoi_base()
Not used anywhere.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-12-09 13:48:50 +01:00
Enrico Weigelt, metux IT consult
64def2e59a util-strings: drop unused safe_atoi()
Not used anywhere.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-12-09 13:48:50 +01:00
Enrico Weigelt, metux IT consult
8a743e7740 util-strings: drop unused safe_strdup()
Not used anywhere.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-12-09 13:48:50 +01:00
Enrico Weigelt, metux IT consult
87dc6b6a3e util-strings: drop unused strv_join()
Not used anywhere.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-12-09 13:48:50 +01:00
Enrico Weigelt, metux IT consult
110f454c1e util-strings: drop unused strv_from_argv()
Not used anywhere.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-12-09 13:48:50 +01:00
Enrico Weigelt, metux IT consult
bd7f165019 util-strings: drop unused streq() and strneq()
Not used anywhere.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-12-09 13:48:50 +01:00
Enrico Weigelt, metux IT consult
49ee2103a1 util-strings: drop unused kv_double_from_string()
Not used anywhere.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-12-09 13:48:50 +01:00
Enrico Weigelt, metux IT consult
318a6119a8 util-strings: drop unused strstrip()
Not used anywhere.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-12-09 13:48:50 +01:00
Enrico Weigelt, metux IT consult
6465d3cae8 util-strings: drop unused strendswith()
Not used anywhere.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-12-09 13:48:50 +01:00
Enrico Weigelt, metux IT consult
94cfaa6b2d util-strings: drop unused strstartswith()
Not used anywhere.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-12-09 13:48:50 +01:00
Enrico Weigelt, metux IT consult
d941ac25f1 util-strings: drop unused safe_basename()
Not used anywhere.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-12-09 13:48:50 +01:00
Enrico Weigelt, metux IT consult
0ef9a59835 util-strings: drop unused trunkname()
Not used anywhere.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-12-09 13:48:50 +01:00
Enrico Weigelt, metux IT consult
c77c82d92c util-strings: drop unused str_sanitize()
Not used anywhere.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-12-09 13:48:50 +01:00
7 changed files with 45 additions and 444 deletions

View File

@@ -2,8 +2,7 @@ xf86-input-libinput - a libinput-based X driver
===============================================
The official repository for this driver is
https://github.com/X11Libre/xf86-input-evdev
https://gitlab.freedesktop.org/xorg/driver/xf86-input-libinput
This is an X driver based on libinput. It is a thin wrapper around libinput,
so while it does provide all features that libinput supports it does little
@@ -13,6 +12,19 @@ beyond.
usable input devices in your X session. Use with caution.***
Prerequisites
-------------
To build, you'll need the X.Org X server SDK (check your distribution for a
xorg-x11-server-devel package or similar) and libinput (check your
distribution for libinput-devel or similar).
To get libinput from source, see:
https://www.freedesktop.org/wiki/Software/libinput/
To build the X server from source:
https://www.x.org/wiki/Building_the_X_Window_System/
Building
--------
@@ -31,3 +43,13 @@ Install the default configuration file:
cp conf/99-libinput.conf /etc/X11/xorg.conf.d/
This will assign this driver to *all* devices. Use with caution.
Bugs
----
Bugs in libinput go to the Issues section of the libinput gitlab project:
https://gitlab.freedesktop.org/libinput/libinput/issues
Bugs in this driver go to the Issues section of its gitlab project:
https://gitlab.freedesktop.org/xorg/driver/xf86-input-libinput/issues

View File

@@ -22,10 +22,10 @@
# Initialize Autoconf
AC_PREREQ([2.60])
AC_INIT([xlibre-xf86-input-libinput],
[1.5.2],
[https://github.com/X11Libre/xf86-input-libinput/issues],
[xlibre-xf86-input-libinput])
AC_INIT([xf86-input-libinput],
[1.5.0],
[https://gitlab.freedesktop.org/xorg/driver/xf86-input-libinput/issues],
[xf86-input-libinput])
AC_CONFIG_SRCDIR([Makefile.am])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_AUX_DIR(.)
@@ -43,8 +43,6 @@ m4_ifndef([XORG_MACROS_VERSION],
XORG_MACROS_VERSION(1.8)
XORG_DEFAULT_OPTIONS
CFLAGS="$CFLAGS -Wno-declaration-after-statement"
# Obtain compiler/linker options from server and required extensions
PKG_CHECK_MODULES(XORG, [xorg-server >= 1.19] xproto [inputproto >= 2.2])
PKG_CHECK_MODULES(LIBINPUT, [libinput >= 1.11.0])
@@ -113,17 +111,6 @@ AC_LINK_IFELSE(
[AC_MSG_RESULT([no])
[libinput_have_clickfinger_button_map=no]])
AC_MSG_CHECKING([if libinput_plugin_system_load is available])
AC_LINK_IFELSE(
[AC_LANG_PROGRAM([[#include <libinput.h>]],
[[libinput_plugin_system_load_plugins(NULL, 0)]])],
[AC_MSG_RESULT([yes])
AC_DEFINE(HAVE_LIBINPUT_PLUGINS, [1],
[libinput_plugin_system_load_plugins() is available])
[libinput_have_plugin_system=yes]],
[AC_MSG_RESULT([no])
[libinput_have_plugin_system=no]])
LIBS=$OLD_LIBS
CFLAGS=$OLD_CFLAGS

View File

@@ -21,7 +21,7 @@ If you are looking for the library documentation, go to
.SH DESCRIPTION
.B libinput
is an XLibre input driver based on libinput.
is an Xorg input driver based on libinput.
It therefore supports all input devices that libinput can handle, including
most mice, keyboards, tablets and touchscreens.
.PP
@@ -178,15 +178,6 @@ Enables left-handed button orientation, i.e. swapping left and right buttons.
Enables middle button emulation.
When enabled, pressing the left and right
buttons simultaneously produces a middle mouse button click.
A synonym
.IP
.BI "Option \*qEmulate3Buttons\*q \*q" bool \*q
.IP
is preserved for compatibility with
.B evdev
driver, with
.BI "\*qMiddleEmulation\*q
having preference if both are set.
.TP 7
.BI "Option \*qNaturalScrolling\*q \*q" bool \*q
Enables or disables natural scrolling behavior.
@@ -477,13 +468,13 @@ button mapping of
.B "\*q3 2 1 ...\*q"
On systems using the
.B libinput
XLibre input driver it is recommended to use the
Xorg input driver it is recommended to use the
.B LeftHanded
option instead.
.PP
The
.B libinput
XLibre input driver does not use the button mapping after setup.
Xorg input driver does not use the button mapping after setup.
Use
.BR XSetPointerMapping (3)
to modify the button mapping at runtime.
@@ -606,7 +597,7 @@ appropriate \fBMatch*\fR statement in the
.SH AUTHORS
Peter Hutterer
.SH "SEE ALSO"
.BR XLibre (1),
.BR Xorg (1),
.BR xorg.conf (5),
.BR Xserver (1),
.BR X (7)

View File

@@ -65,13 +65,9 @@ if cc.has_function('libinput_device_config_click_set_clickfinger_button_map',
dependencies: dep_libinput)
config_h.set('HAVE_LIBINPUT_CLICKFINGER_BUTTON_MAP', 1)
endif
if cc.has_header_symbol('libinput.h', 'LIBINPUT_LED_COMPOSE',
dependencies: dep_libinput)
if cc.has_header_symbol('libinput.h', 'LIBINPUT_LED_COMPOSE')
config_h.set('HAVE_LIBINPUT_COMPOSE_AND_KANA', 1)
endif
if cc.has_function('libinput_plugin_system_load_plugins', dependencies: dep_libinput)
config_h.set('HAVE_LIBINPUT_PLUGINS', 1)
endif
dir_headers = get_option('sdkdir')
if dir_headers == ''

View File

@@ -59,36 +59,6 @@ next_word(const char **state, size_t *len, const char *separators)
return next;
}
/**
* Return a null-terminated string array with the contents of argv
* duplicated.
*
* Use strv_free() to free the array.
*
* @return A null-terminated string array or NULL on errors
*/
char**
strv_from_argv(int argc, char **argv)
{
char **strv = NULL;
assert(argc >= 0);
if (argc == 0)
return NULL;
strv = zalloc((argc + 1) * sizeof *strv);
for (int i = 0; i < argc; i++) {
char *copy = safe_strdup(argv[i]);
if (!copy) {
strv_free(strv);
return NULL;
}
strv[i] = copy;
}
return strv;
}
/**
* Return a null-terminated string array with the tokens in the input
* string, e.g. "one two\tthree" with a separator list of " \t" will return
@@ -122,9 +92,7 @@ strv_from_string(const char *in, const char *separators, size_t *num_elements)
}
size_t strv_len = nelems + 1; /* NULL-terminated */
char **strv = calloc(strv_len, sizeof(*strv));
if (!strv)
return NULL;
char **strv = zalloc(strv_len * sizeof *strv);
size_t idx = 0;
const char *word;
@@ -144,103 +112,3 @@ strv_from_string(const char *in, const char *separators, size_t *num_elements)
return strv;
}
/**
* Return a newly allocated string with all elements joined by the
* joiner, same as Python's string.join() basically.
* A strv of ["one", "two", "three", NULL] with a joiner of ", " results
* in "one, two, three".
*
* An empty strv ([NULL]) returns NULL, same for passing NULL as either
* argument.
*
* @param strv Input string array
* @param joiner Joiner between the elements in the final string
*
* @return A null-terminated string joining all elements
*/
char *
strv_join(char **strv, const char *joiner)
{
char **s;
char *str;
size_t slen = 0;
size_t count = 0;
if (!strv || !joiner)
return NULL;
if (strv[0] == NULL)
return NULL;
for (s = strv, count = 0; *s; s++, count++) {
slen += strlen(*s);
}
assert(slen < 1000);
assert(strlen(joiner) < 1000);
assert(count > 0);
assert(count < 100);
slen += (count - 1) * strlen(joiner);
str = zalloc(slen + 1); /* trailing \0 */
for (s = strv; *s; s++) {
strcat(str, *s);
--count;
if (count > 0)
strcat(str, joiner);
}
return str;
}
/**
* Return a pointer to the basename within filename.
* If the filename the empty string or a directory (i.e. the last char of
* filename is '/') NULL is returned.
*/
const char *
safe_basename(const char *filename)
{
const char *basename;
if (*filename == '\0')
return NULL;
basename = strrchr(filename, '/');
if (basename == NULL)
return filename;
if (*(basename + 1) == '\0')
return NULL;
return basename + 1;
}
/**
* Similar to basename() but returns the trunk only without the (last)
* trailing suffix, so that:
*
* - foo.c returns foo
* - foo.a.b returns foo.a
* - foo returns foo
* - foo/ returns ""
*
* @return an allocated string representing the trunk name of the file
*/
char *
trunkname(const char *filename)
{
const char *base = safe_basename(filename);
char *suffix;
if (base == NULL)
return safe_strdup("");
suffix = rindex(base, '.');
if (suffix == NULL)
return safe_strdup(base);
else
return strndup(base, suffix-base);
}

View File

@@ -43,120 +43,6 @@
#include "util-macros.h"
static inline bool
streq(const char *str1, const char *str2)
{
/* one NULL, one not NULL is always false */
if (str1 && str2)
return strcmp(str1, str2) == 0;
return str1 == str2;
}
static inline bool
strneq(const char *str1, const char *str2, int n)
{
/* one NULL, one not NULL is always false */
if (str1 && str2)
return strncmp(str1, str2, n) == 0;
return str1 == str2;
}
static inline void *
zalloc(size_t size)
{
void *p;
/* We never need to alloc anything more than 1,5 MB so we can assume
* if we ever get above that something's going wrong */
if (size > 1536 * 1024)
assert(!"bug: internal malloc size limit exceeded");
p = calloc(1, size);
if (!p)
abort();
return p;
}
/**
* strdup guaranteed to succeed. If the input string is NULL, the output
* string is NULL. If the input string is a string pointer, we strdup or
* abort on failure.
*/
static inline char*
safe_strdup(const char *str)
{
char *s;
if (!str)
return NULL;
s = strdup(str);
if (!s)
abort();
return s;
}
static inline bool
safe_atoi_base(const char *str, int *val, int base)
{
char *endptr;
long v;
assert(base == 10 || base == 16 || base == 8);
errno = 0;
v = strtol(str, &endptr, base);
if (errno > 0)
return false;
if (str == endptr)
return false;
if (*str != '\0' && *endptr != '\0')
return false;
if (v > INT_MAX || v < INT_MIN)
return false;
*val = v;
return true;
}
static inline bool
safe_atoi(const char *str, int *val)
{
return safe_atoi_base(str, val, 10);
}
static inline bool
safe_atou_base(const char *str, unsigned int *val, int base)
{
char *endptr;
unsigned long v;
assert(base == 10 || base == 16 || base == 8);
errno = 0;
v = strtoul(str, &endptr, base);
if (errno > 0)
return false;
if (str == endptr)
return false;
if (*str != '\0' && *endptr != '\0')
return false;
if ((long)v < 0)
return false;
*val = v;
return true;
}
static inline bool
safe_atou(const char *str, unsigned int *val)
{
return safe_atou_base(str, val, 10);
}
static inline bool
safe_atod(const char *str, double *val)
{
@@ -211,9 +97,7 @@ safe_atod(const char *str, double *val)
return true;
}
char **strv_from_argv(int argc, char **argv);
char **strv_from_string(const char *in, const char *separator, size_t *num_elements);
char *strv_join(char **strv, const char *joiner);
static inline void
strv_free(char **strv) {
@@ -253,10 +137,7 @@ double_array_from_string(const char *in,
if(!strv)
return result;
double *numv = calloc(nelem, sizeof(double));
if (!numv)
goto out;
double *numv = zalloc(sizeof(double) * nelem);
for (size_t idx = 0; idx < nelem; idx++) {
double val;
if (!safe_atod(strv[idx], &val))
@@ -274,122 +155,3 @@ out:
free(numv);
return result;
}
struct key_value_str{
char *key;
char *value;
};
struct key_value_double {
double key;
double value;
};
static inline ssize_t
kv_double_from_string(const char *string,
const char *pair_separator,
const char *kv_separator,
struct key_value_double **result_out)
{
struct key_value_double *result = NULL;
if (!pair_separator || pair_separator[0] == '\0' ||
!kv_separator || kv_separator[0] == '\0')
return -1;
size_t npairs;
char **pairs = strv_from_string(string, pair_separator, &npairs);
if (!pairs || npairs == 0)
goto error;
result = zalloc(npairs * sizeof *result);
for (size_t idx = 0; idx < npairs; idx++) {
char *pair = pairs[idx];
size_t nelem;
char **kv = strv_from_string(pair, kv_separator, &nelem);
double k, v;
if (!kv || nelem != 2 ||
!safe_atod(kv[0], &k) ||
!safe_atod(kv[1], &v)) {
strv_free(kv);
goto error;
}
result[idx].key = k;
result[idx].value = v;
strv_free(kv);
}
strv_free(pairs);
*result_out = result;
return npairs;
error:
strv_free(pairs);
free(result);
return -1;
}
/**
* Strip any of the characters in what from the beginning and end of the
* input string.
*
* @return a newly allocated string with none of "what" at the beginning or
* end of string
*/
static inline char *
strstrip(const char *input, const char *what)
{
char *str, *last;
str = safe_strdup(&input[strspn(input, what)]);
last = str;
for (char *c = str; *c != '\0'; c++) {
if (!strchr(what, *c))
last = c + 1;
}
*last = '\0';
return str;
}
/**
* Return true if str ends in suffix, false otherwise. If the suffix is the
* empty string, strendswith() always returns false.
*/
static inline bool
strendswith(const char *str, const char *suffix)
{
size_t slen = strlen(str);
size_t suffixlen = strlen(suffix);
size_t offset;
if (slen == 0 || suffixlen == 0 || suffixlen > slen)
return false;
offset = slen - suffixlen;
return strneq(&str[offset], suffix, suffixlen);
}
static inline bool
strstartswith(const char *str, const char *prefix)
{
size_t prefixlen = strlen(prefix);
return prefixlen > 0 ? strneq(str, prefix, strlen(prefix)) : false;
}
const char *
safe_basename(const char *filename);
char *
trunkname(const char *filename);

View File

@@ -141,10 +141,6 @@ struct accel_points {
};
#endif
struct xf86libinput_pressure_range {
float min, max;
};
struct xf86libinput {
InputInfoPtr pInfo;
char *path;
@@ -203,7 +199,9 @@ struct xf86libinput {
float rotation_angle;
struct bezier_control_point pressurecurve[4];
struct xf86libinput_pressure_range pressure_range;
struct range {
float min, max;
} pressure_range;
struct ratio {
int x, y;
} area;
@@ -469,7 +467,7 @@ xf86libinput_set_pressurecurve(struct xf86libinput *driver_data,
static inline bool
xf86libinput_set_pressure_range(struct xf86libinput *driver_data,
const struct xf86libinput_pressure_range *rangeopt)
const struct range *rangeopt)
{
#if HAVE_LIBINPUT_PRESSURE_RANGE
struct libinput_tablet_tool *tool = driver_data->tablet_tool;
@@ -941,7 +939,7 @@ LibinputApplyConfigPressureRange(DeviceIntPtr dev,
#if HAVE_LIBINPUT_PRESSURE_RANGE
InputInfoPtr pInfo = dev->public.devicePrivate;
struct libinput_tablet_tool *tool = driver_data->tablet_tool;
struct xf86libinput_pressure_range *rangeopt = &driver_data->options.pressure_range;
struct range *rangeopt = &driver_data->options.pressure_range;
if (!subdevice_has_capabilities(dev, CAP_TABLET_TOOL))
return;
@@ -2741,20 +2739,6 @@ xf86libinput_handle_event(struct libinput_event *event)
break;
case LIBINPUT_EVENT_SWITCH_TOGGLE:
break;
/* new libinput events we don't handle yet */
#ifdef LIBINPUT_EVENT_GESTURE_HOLD_BEGIN
case LIBINPUT_EVENT_GESTURE_HOLD_BEGIN:
break;
#endif
#ifdef LIBINPUT_EVENT_GESTURE_HOLD_END
case LIBINPUT_EVENT_GESTURE_HOLD_END:
break;
#endif
#ifdef LIBINPUT_EVENT_TABLET_PAD_KEY
case LIBINPUT_EVENT_TABLET_PAD_KEY:
break;
#endif
}
out:
@@ -3506,17 +3490,13 @@ static inline BOOL
xf86libinput_parse_middleemulation_option(InputInfoPtr pInfo,
struct libinput_device *device)
{
int enabled;
BOOL enabled;
if (!libinput_device_config_middle_emulation_is_available(device))
return FALSE;
enabled = xf86SetBoolOption(pInfo->options,
"MiddleEmulation",
-1); /* returns -1 if the option has not been set */
if (enabled == -1)
enabled = xf86SetBoolOption(pInfo->options,
"Emulate3Buttons",
libinput_device_config_middle_emulation_get_default_enabled(device));
if (libinput_device_config_middle_emulation_set_enabled(device, enabled) !=
LIBINPUT_CONFIG_STATUS_SUCCESS) {
@@ -3705,7 +3685,7 @@ out:
static void
xf86libinput_parse_pressure_range_option(InputInfoPtr pInfo,
struct xf86libinput *driver_data,
struct xf86libinput_pressure_range *rangeopt)
struct range *rangeopt)
{
#if HAVE_LIBINPUT_PRESSURE_RANGE
struct libinput_tablet_tool *tool = driver_data->tablet_tool;
@@ -3894,10 +3874,6 @@ xf86libinput_init_driver_context(void)
/* we want all msgs, let the server filter */
libinput_log_set_priority(driver_context.libinput,
LIBINPUT_LOG_PRIORITY_DEBUG);
#if HAVE_LIBINPUT_PLUGINS
libinput_plugin_system_append_default_paths(driver_context.libinput);
libinput_plugin_system_load_plugins(driver_context.libinput, LIBINPUT_PLUGIN_SYSTEM_FLAG_NONE);
#endif
} else {
libinput_ref(driver_context.libinput);
}
@@ -5408,7 +5384,7 @@ LibinputSetPropertyPressureRange(DeviceIntPtr dev,
InputInfoPtr pInfo = dev->public.devicePrivate;
struct xf86libinput *driver_data = pInfo->private;
float *vals;
struct xf86libinput_pressure_range rangeopt = { 0.0, 1.0 };
struct range rangeopt = { 0.0, 1.0 };
if (val->format != 32 || val->size != 2 || val->type != prop_float)
return BadMatch;
@@ -5666,8 +5642,7 @@ LibinputInitTapProperty(DeviceIntPtr dev,
struct xf86libinput *driver_data,
struct libinput_device *device)
{
// By default tapping property config is true
BOOL tap = driver_data->options.tapping ? driver_data->options.tapping : TRUE;
BOOL tap = driver_data->options.tapping;
if (!subdevice_has_capabilities(dev, CAP_POINTER))
return;
@@ -6688,7 +6663,7 @@ LibinputInitPressureRangeProperty(DeviceIntPtr dev,
{
#if HAVE_LIBINPUT_PRESSURE_RANGE
struct libinput_tablet_tool *tool = driver_data->tablet_tool;
const struct xf86libinput_pressure_range *rangeopt = &driver_data->options.pressure_range;
const struct range *rangeopt = &driver_data->options.pressure_range;
float data[2] = {
rangeopt->min,
rangeopt->max,