The Linux gamepad backend included <libevdev/libevdev.h> from /usr/include/libevdev-1.0 and linked the system libevdev, but the Flatpak SDK crafter-build runs in (org.freedesktop.Sdk 26.08) ships no libevdev headers, so Crafter.Graphics stopped building there. lib/libevdev now carries libevdev 1.14.0 (MIT), built once as its own static library that Crafter.Graphics depends on. As part of cfg it would be compiled again in every test configuration, since they copy cfg.cFiles. libevdev's generated event-names.h names every input code by its macro, so the library compiles against the kernel input headers that table was generated from (lib/libevdev/kernel-headers), not the target's. That directory is deliberately not called include: Crafter.Build puts every include directory of a dependency on its consumers' include path, where those headers would shadow each consumer's own <linux/input.h>. The paths are absolute because Crafter.Build only resolves the returned configuration's paths against the project root. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
69 lines
1.4 KiB
C
69 lines
1.4 KiB
C
// SPDX-License-Identifier: MIT
|
|
/*
|
|
* Copyright © 2013 Red Hat, Inc.
|
|
*/
|
|
|
|
#ifndef _UTIL_H_
|
|
#define _UTIL_H_
|
|
|
|
#include "config.h"
|
|
#include <stdbool.h>
|
|
#include <string.h>
|
|
|
|
#define LONG_BITS (sizeof(long) * 8)
|
|
#define NLONGS(x) (((x) + LONG_BITS - 1) / LONG_BITS)
|
|
#define ARRAY_LENGTH(a) (sizeof(a) / (sizeof((a)[0])))
|
|
#define unlikely(x) (__builtin_expect(!!(x),0))
|
|
|
|
#undef min
|
|
#undef max
|
|
#ifdef __GNUC__
|
|
#define min(a,b) \
|
|
({ __typeof__ (a) _a = (a); \
|
|
__typeof__ (b) _b = (b); \
|
|
_a > _b ? _b : _a; \
|
|
})
|
|
#define max(a,b) \
|
|
({ __typeof__ (a) _a = (a); \
|
|
__typeof__ (b) _b = (b); \
|
|
_a > _b ? _a : _b; \
|
|
})
|
|
#else
|
|
#define min(a,b) ((a) > (b) ? (b) : (a))
|
|
#define max(a,b) ((a) > (b) ? (a) : (b))
|
|
#endif
|
|
|
|
static inline bool
|
|
startswith(const char *str, size_t len, const char *prefix, size_t plen)
|
|
{
|
|
return len >= plen && !strncmp(str, prefix, plen);
|
|
}
|
|
|
|
static inline int
|
|
bit_is_set(const unsigned long *array, int bit)
|
|
{
|
|
return !!(array[bit / LONG_BITS] & (1ULL << (bit % LONG_BITS)));
|
|
}
|
|
|
|
static inline void
|
|
set_bit(unsigned long *array, int bit)
|
|
{
|
|
array[bit / LONG_BITS] |= (1ULL << (bit % LONG_BITS));
|
|
}
|
|
|
|
static inline void
|
|
clear_bit(unsigned long *array, int bit)
|
|
{
|
|
array[bit / LONG_BITS] &= ~(1ULL << (bit % LONG_BITS));
|
|
}
|
|
|
|
static inline void
|
|
set_bit_state(unsigned long *array, int bit, int state)
|
|
{
|
|
if (state)
|
|
set_bit(array, bit);
|
|
else
|
|
clear_bit(array, bit);
|
|
}
|
|
|
|
#endif
|