Bug #3042: Use autoconf to get the correct name of a struct member.
This allows us to remove the kernel version ifdefs from the code, which are ugly and broken.
This commit is contained in:
parent
63f13e01ee
commit
39b2f7b218
19
configure.ac
19
configure.ac
|
@ -1061,6 +1061,25 @@ dnl has it in libc), or if libdl is needed to get it.
|
|||
*)
|
||||
;;
|
||||
esac
|
||||
|
||||
# check whether struct kbd_repeat has the 'period' field.
|
||||
# on kernels < 2.5.42 it's called 'rate' instead.
|
||||
AC_TRY_COMPILE([
|
||||
#include <linux/kd.h>
|
||||
#ifdef __sparc__
|
||||
#include <asm/param.h>
|
||||
#include <asm/kbio.h>
|
||||
#endif
|
||||
],[
|
||||
int main () {
|
||||
struct kbd_repeat k;
|
||||
k.period = 0;
|
||||
return 0;
|
||||
}],
|
||||
[period_field="period"],
|
||||
[period_field="rate"])
|
||||
AC_DEFINE_UNQUOTED(LNX_KBD_PERIOD_NAME, [$period_field],
|
||||
[Name of the period field in struct kbd_repeat])
|
||||
;;
|
||||
freebsd* | kfreebsd*-gnu)
|
||||
XORG_OS="freebsd"
|
||||
|
|
|
@ -67,25 +67,6 @@ xf86GetKbdLeds()
|
|||
return(leds);
|
||||
}
|
||||
|
||||
/* kbd rate stuff based on kbdrate.c from Rik Faith <faith@cs.unc.edu> et.al.
|
||||
* from util-linux-2.9t package */
|
||||
|
||||
#include <linux/kd.h>
|
||||
#include <linux/version.h>
|
||||
#ifdef __sparc__
|
||||
#include <asm/param.h>
|
||||
#include <asm/kbio.h>
|
||||
#endif
|
||||
|
||||
/* Deal with spurious kernel header change in struct kbd_repeat.
|
||||
We undo this define after the routine using that struct is over,
|
||||
so as not to interfere with other 'rate' elements. */
|
||||
#if defined(LINUX_VERSION_CODE) && defined(KERNEL_VERSION)
|
||||
# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,42)
|
||||
# define rate period
|
||||
# endif
|
||||
#endif
|
||||
|
||||
static int
|
||||
KDKBDREP_ioctl_ok(int rate, int delay) {
|
||||
#if defined(KDKBDREP) && !defined(__sparc__)
|
||||
|
@ -94,18 +75,18 @@ KDKBDREP_ioctl_ok(int rate, int delay) {
|
|||
struct kbd_repeat kbdrep_s;
|
||||
|
||||
/* don't change, just test */
|
||||
kbdrep_s.rate = -1;
|
||||
kbdrep_s.LNX_KBD_PERIOD_NAME = -1;
|
||||
kbdrep_s.delay = -1;
|
||||
if (ioctl( xf86Info.consoleFd, KDKBDREP, &kbdrep_s )) {
|
||||
return 0;
|
||||
}
|
||||
/* do the change */
|
||||
if (rate == 0) /* switch repeat off */
|
||||
kbdrep_s.rate = 0;
|
||||
kbdrep_s.LNX_KBD_PERIOD_NAME = 0;
|
||||
else
|
||||
kbdrep_s.rate = 10000 / rate; /* convert cps to msec */
|
||||
if (kbdrep_s.rate < 1)
|
||||
kbdrep_s.rate = 1;
|
||||
kbdrep_s.LNX_KBD_PERIOD_NAME = 10000 / rate; /* convert cps to msec */
|
||||
if (kbdrep_s.LNX_KBD_PERIOD_NAME < 1)
|
||||
kbdrep_s.LNX_KBD_PERIOD_NAME = 1;
|
||||
kbdrep_s.delay = delay;
|
||||
if (kbdrep_s.delay < 1)
|
||||
kbdrep_s.delay = 1;
|
||||
|
@ -120,15 +101,6 @@ KDKBDREP_ioctl_ok(int rate, int delay) {
|
|||
#endif /* KDKBDREP */
|
||||
}
|
||||
|
||||
#undef rate
|
||||
|
||||
/* Undo the earlier define for the struct kbd_repeat problem. */
|
||||
#if defined(LINUX_VERSION_CODE) && defined(KERNEL_VERSION)
|
||||
# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,42)
|
||||
# undef rate
|
||||
# endif
|
||||
#endif
|
||||
|
||||
static int
|
||||
KIOCSRATE_ioctl_ok(int rate, int delay) {
|
||||
#ifdef KIOCSRATE
|
||||
|
|
|
@ -97,25 +97,6 @@ GetKbdLeds(InputInfoPtr pInfo)
|
|||
return(leds);
|
||||
}
|
||||
|
||||
/* kbd rate stuff based on kbdrate.c from Rik Faith <faith@cs.unc.edu> et.al.
|
||||
* from util-linux-2.9t package */
|
||||
|
||||
#include <linux/kd.h>
|
||||
#include <linux/version.h>
|
||||
#ifdef __sparc__
|
||||
#include <asm/param.h>
|
||||
#include <asm/kbio.h>
|
||||
#endif
|
||||
|
||||
/* Deal with spurious kernel header change in struct kbd_repeat.
|
||||
We undo this define after the routine using that struct is over,
|
||||
so as not to interfere with other 'rate' elements. */
|
||||
#if defined(LINUX_VERSION_CODE) && defined(KERNEL_VERSION)
|
||||
# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,42)
|
||||
# define rate period
|
||||
# endif
|
||||
#endif
|
||||
|
||||
static int
|
||||
KDKBDREP_ioctl_ok(int rate, int delay) {
|
||||
#if defined(KDKBDREP) && !defined(__sparc__)
|
||||
|
@ -124,7 +105,7 @@ KDKBDREP_ioctl_ok(int rate, int delay) {
|
|||
struct kbd_repeat kbdrep_s;
|
||||
|
||||
/* don't change, just test */
|
||||
kbdrep_s.rate = -1;
|
||||
kbdrep_s.LNX_KBD_PERIOD_NAME = -1;
|
||||
kbdrep_s.delay = -1;
|
||||
if (ioctl( xf86Info.consoleFd, KDKBDREP, &kbdrep_s )) {
|
||||
return 0;
|
||||
|
@ -132,11 +113,11 @@ KDKBDREP_ioctl_ok(int rate, int delay) {
|
|||
|
||||
/* do the change */
|
||||
if (rate == 0) /* switch repeat off */
|
||||
kbdrep_s.rate = 0;
|
||||
kbdrep_s.LNX_KBD_PERIOD_NAME = 0;
|
||||
else
|
||||
kbdrep_s.rate = 10000 / rate; /* convert cps to msec */
|
||||
if (kbdrep_s.rate < 1)
|
||||
kbdrep_s.rate = 1;
|
||||
kbdrep_s.LNX_KBD_PERIOD_NAME = 10000 / rate; /* convert cps to msec */
|
||||
if (kbdrep_s.LNX_KBD_PERIOD_NAME < 1)
|
||||
kbdrep_s.LNX_KBD_PERIOD_NAME = 1;
|
||||
kbdrep_s.delay = delay;
|
||||
if (kbdrep_s.delay < 1)
|
||||
kbdrep_s.delay = 1;
|
||||
|
@ -151,15 +132,6 @@ KDKBDREP_ioctl_ok(int rate, int delay) {
|
|||
#endif /* KDKBDREP */
|
||||
}
|
||||
|
||||
#undef rate
|
||||
|
||||
/* Undo the earlier define for the struct kbd_repeat problem. */
|
||||
#if defined(LINUX_VERSION_CODE) && defined(KERNEL_VERSION)
|
||||
# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,42)
|
||||
# undef rate
|
||||
# endif
|
||||
#endif
|
||||
|
||||
static int
|
||||
KIOCSRATE_ioctl_ok(int rate, int delay) {
|
||||
#ifdef KIOCSRATE
|
||||
|
|
|
@ -106,4 +106,7 @@
|
|||
/* Has backtrace support */
|
||||
#undef HAVE_BACKTRACE
|
||||
|
||||
/* Name of the period field in struct kbd_repeat */
|
||||
#undef LNX_KBD_PERIOD_NAME
|
||||
|
||||
#endif /* _XORG_CONFIG_H_ */
|
||||
|
|
Loading…
Reference in New Issue
Block a user