Add new --disable-apm configure switch to compile out APM support in xfree86 and kdrive.
Signed-off-by: Mikhail Gusarov <[email protected]> --- configure.ac | 2 + hw/kdrive/linux/Makefile.am | 5 + hw/kdrive/linux/apm.c | 121 +++++++++++++++++++++++++++++ hw/kdrive/linux/apm.h | 8 ++ hw/kdrive/linux/linux.c | 92 +++------------------- hw/xfree86/os-support/bsd/Makefile.am | 10 ++- hw/xfree86/os-support/linux/Makefile.am | 2 + hw/xfree86/os-support/solaris/Makefile.am | 8 ++- 8 files changed, 163 insertions(+), 85 deletions(-) create mode 100644 hw/kdrive/linux/apm.c create mode 100644 hw/kdrive/linux/apm.h diff --git a/configure.ac b/configure.ac index 3e8ea10..f911f98 100644 --- a/configure.ac +++ b/configure.ac @@ -631,6 +631,7 @@ AC_ARG_ENABLE(xaa, AS_HELP_STRING([--enable-xaa], [Build XAA (defa AC_ARG_ENABLE(vgahw, AS_HELP_STRING([--enable-vgahw], [Build Xorg with vga access (default: enabled)]), [VGAHW=$enableval], [VGAHW=yes]) AC_ARG_ENABLE(vbe, AS_HELP_STRING([--enable-vbe], [Build Xorg with VBE module (default: enabled)]), [VBE=$enableval], [VBE=yes]) AC_ARG_ENABLE(int10-module, AS_HELP_STRING([--enable-int10-module], [Build Xorg with int10 module (default: enabled)]), [INT10MODULE=$enableval], [INT10MODULE=yes]) +AC_ARG_ENABLE(apm, AS_HELP_STRING([--enable-apm], [Build Xorg with APM support (default: enabled)]), [APM=$enableval], [APM=yes]) dnl DDXes. AC_ARG_ENABLE(xorg, AS_HELP_STRING([--enable-xorg], [Build Xorg server (default: auto)]), [XORG=$enableval], [XORG=auto]) @@ -1129,6 +1130,7 @@ AM_CONDITIONAL(XF86UTILS, test "x$XF86UTILS" = xyes) AM_CONDITIONAL(XAA, test "x$XAA" = xyes) AM_CONDITIONAL(VGAHW, test "x$VGAHW" = xyes) AM_CONDITIONAL(VBE, test "x$VBE" = xyes) +AM_CONDITIONAL(APM, test "x$APM" = xyes) AM_CONDITIONAL(INT10MODULE, test "x$INT10MODULE" = xyes) AC_DEFINE(SHAPE, 1, [Support SHAPE extension]) diff --git a/hw/kdrive/linux/Makefile.am b/hw/kdrive/linux/Makefile.am index 93e5d2f..e9f311f 100644 --- a/hw/kdrive/linux/Makefile.am +++ b/hw/kdrive/linux/Makefile.am @@ -10,6 +10,11 @@ liblinux_la_SOURCES = liblinux_la_SOURCES += linux.c +if APM +AM_CFLAGS += -DHAVE_APM +liblinux_la_SOURCES += apm.c apm.h +endif + if KDRIVE_KBD liblinux_la_SOURCES += keyboard.c endif diff --git a/hw/kdrive/linux/apm.c b/hw/kdrive/linux/apm.c new file mode 100644 index 0000000..bc51e04 --- /dev/null +++ b/hw/kdrive/linux/apm.c @@ -0,0 +1,121 @@ +/* + * Copyright © 1999 Keith Packard + * Copyright © 2010 Mikhail Gusarov <[email protected]> + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +#include <kdrive-config.h> +#endif +#include "kdrive.h" + +#include <errno.h> +#include <sys/ioctl.h> +#include <linux/apm_bios.h> + +#include "apm.h" + +#ifdef FNONBLOCK +#define NOBLOCK FNONBLOCK +#else +#define NOBLOCK FNDELAY +#endif + +static int LinuxApmFd = -1; +static Bool LinuxApmRunning; + +static void +LinuxApmBlock (pointer blockData, OSTimePtr pTimeout, pointer pReadmask) +{ +} + +static void +LinuxApmWakeup (pointer blockData, int result, pointer pReadmask) +{ + fd_set *readmask = (fd_set *) pReadmask; + + if (result > 0 && LinuxApmFd >= 0 && FD_ISSET (LinuxApmFd, readmask)) + { + apm_event_t event; + Bool running = LinuxApmRunning; + int cmd = APM_IOC_SUSPEND; + + while (read (LinuxApmFd, &event, sizeof (event)) == sizeof (event)) + { + switch (event) { + case APM_SYS_STANDBY: + case APM_USER_STANDBY: + running = FALSE; + cmd = APM_IOC_STANDBY; + break; + case APM_SYS_SUSPEND: + case APM_USER_SUSPEND: + case APM_CRITICAL_SUSPEND: + running = FALSE; + cmd = APM_IOC_SUSPEND; + break; + case APM_NORMAL_RESUME: + case APM_CRITICAL_RESUME: + case APM_STANDBY_RESUME: + running = TRUE; + break; + } + } + if (running && !LinuxApmRunning) + { + KdResume (); + LinuxApmRunning = TRUE; + } + else if (!running && LinuxApmRunning) + { + KdSuspend (); + LinuxApmRunning = FALSE; + ioctl (LinuxApmFd, cmd, 0); + } + } +} + +void +LinuxApmOpen(void) +{ + LinuxApmFd = open ("/dev/apm_bios", 2); + if (LinuxApmFd < 0 && errno == ENOENT) + LinuxApmFd = open ("/dev/misc/apm_bios", 2); + if (LinuxApmFd >= 0) + { + LinuxApmRunning = TRUE; + fcntl (LinuxApmFd, F_SETFL, fcntl (LinuxApmFd, F_GETFL) | NOBLOCK); + RegisterBlockAndWakeupHandlers (LinuxApmBlock, LinuxApmWakeup, 0); + AddEnabledDevice (LinuxApmFd); + } +} + + +void +LinuxApmClose(void) +{ + if (LinuxApmFd >= 0) + { + RemoveBlockAndWakeupHandlers (LinuxApmBlock, LinuxApmWakeup, 0); + RemoveEnabledDevice (LinuxApmFd); + close (LinuxApmFd); + LinuxApmFd = -1; + } +} diff --git a/hw/kdrive/linux/apm.h b/hw/kdrive/linux/apm.h new file mode 100644 index 0000000..9378b40 --- /dev/null +++ b/hw/kdrive/linux/apm.h @@ -0,0 +1,8 @@ +#ifndef _KDRIVE_LINUX_APM_H_ +#define _KDRIVE_LINUX_APM_H_ + +void LinuxApmOpen(void); + +void LinuxApmClose(void); + +#endif diff --git a/hw/kdrive/linux/linux.c b/hw/kdrive/linux/linux.c index 9863c14..d2e3360 100644 --- a/hw/kdrive/linux/linux.c +++ b/hw/kdrive/linux/linux.c @@ -31,7 +31,10 @@ #include <sys/stat.h> #include <sys/ioctl.h> #include <X11/keysym.h> -#include <linux/apm_bios.h> + +#ifdef HAVE_APM +#include "apm.h" +#endif #ifdef KDRIVE_MOUSE extern KdPointerDriver LinuxMouseDriver; @@ -51,7 +54,6 @@ extern KdKeyboardDriver LinuxKeyboardDriver; static int vtno; int LinuxConsoleFd; -int LinuxApmFd = -1; static int activeVT; static Bool enabled; @@ -180,65 +182,6 @@ LinuxSetSwitchMode (int mode) } static void -LinuxApmBlock (pointer blockData, OSTimePtr pTimeout, pointer pReadmask) -{ -} - -static Bool LinuxApmRunning; - -static void -LinuxApmWakeup (pointer blockData, int result, pointer pReadmask) -{ - fd_set *readmask = (fd_set *) pReadmask; - - if (result > 0 && LinuxApmFd >= 0 && FD_ISSET (LinuxApmFd, readmask)) - { - apm_event_t event; - Bool running = LinuxApmRunning; - int cmd = APM_IOC_SUSPEND; - - while (read (LinuxApmFd, &event, sizeof (event)) == sizeof (event)) - { - switch (event) { - case APM_SYS_STANDBY: - case APM_USER_STANDBY: - running = FALSE; - cmd = APM_IOC_STANDBY; - break; - case APM_SYS_SUSPEND: - case APM_USER_SUSPEND: - case APM_CRITICAL_SUSPEND: - running = FALSE; - cmd = APM_IOC_SUSPEND; - break; - case APM_NORMAL_RESUME: - case APM_CRITICAL_RESUME: - case APM_STANDBY_RESUME: - running = TRUE; - break; - } - } - if (running && !LinuxApmRunning) - { - KdResume (); - LinuxApmRunning = TRUE; - } - else if (!running && LinuxApmRunning) - { - KdSuspend (); - LinuxApmRunning = FALSE; - ioctl (LinuxApmFd, cmd, 0); - } - } -} - -#ifdef FNONBLOCK -#define NOBLOCK FNONBLOCK -#else -#define NOBLOCK FNDELAY -#endif - -static void LinuxEnable (void) { if (enabled) @@ -248,19 +191,10 @@ LinuxEnable (void) kdSwitchPending = FALSE; ioctl (LinuxConsoleFd, VT_RELDISP, VT_ACKACQ); } - /* - * Open the APM driver - */ - LinuxApmFd = open ("/dev/apm_bios", 2); - if (LinuxApmFd < 0 && errno == ENOENT) - LinuxApmFd = open ("/dev/misc/apm_bios", 2); - if (LinuxApmFd >= 0) - { - LinuxApmRunning = TRUE; - fcntl (LinuxApmFd, F_SETFL, fcntl (LinuxApmFd, F_GETFL) | NOBLOCK); - RegisterBlockAndWakeupHandlers (LinuxApmBlock, LinuxApmWakeup, 0); - AddEnabledDevice (LinuxApmFd); - } + +#ifdef HAVE_APM + LinuxApmOpen(); +#endif /* * now get the VT @@ -292,13 +226,9 @@ LinuxDisable (void) ioctl (LinuxConsoleFd, VT_RELDISP, 1); } enabled = FALSE; - if (LinuxApmFd >= 0) - { - RemoveBlockAndWakeupHandlers (LinuxApmBlock, LinuxApmWakeup, 0); - RemoveEnabledDevice (LinuxApmFd); - close (LinuxApmFd); - LinuxApmFd = -1; - } +#ifdef HAVE_APM + LinuxApmClose(); +#endif } static void diff --git a/hw/xfree86/os-support/bsd/Makefile.am b/hw/xfree86/os-support/bsd/Makefile.am index b6ecdf1..27150b7 100644 --- a/hw/xfree86/os-support/bsd/Makefile.am +++ b/hw/xfree86/os-support/bsd/Makefile.am @@ -1,15 +1,19 @@ noinst_LTLIBRARIES = libbsd.la # APM support. +if APM if BSD_KQUEUE_APM -APM_SOURCES = $(srcdir)/bsd_kqueue_apm.c + APM_SOURCES = $(srcdir)/bsd_kqueue_apm.c else if BSD_APM -APM_SOURCES = $(srcdir)/bsd_apm.c + APM_SOURCES = $(srcdir)/bsd_apm.c else -APM_SOURCES = $(srcdir)/../shared/pm_noop.c + APM_SOURCES = $(srcdir)/../shared/pm_noop.c endif endif +else + APM_SOURCES = $(srcdir)/../shared/pm_noop.c +endif if FREEBSD_KLDLOAD KMOD_SOURCES = bsd_kmod.c diff --git a/hw/xfree86/os-support/linux/Makefile.am b/hw/xfree86/os-support/linux/Makefile.am index 7a82627..c578e69 100644 --- a/hw/xfree86/os-support/linux/Makefile.am +++ b/hw/xfree86/os-support/linux/Makefile.am @@ -20,10 +20,12 @@ ACPI_SRCS = lnx_acpi.c lnx_apm.c XORG_CFLAGS += -DHAVE_ACPI endif +if APM if LNXAPM APM_SRCS = lnx_apm.c XORG_CFLAGS += -DHAVE_APM endif +endif liblinux_la_SOURCES = lnx_init.c lnx_video.c \ lnx_agp.c lnx_kmod.c lnx_bell.c \ diff --git a/hw/xfree86/os-support/solaris/Makefile.am b/hw/xfree86/os-support/solaris/Makefile.am index 5163f44..b5bbb85 100644 --- a/hw/xfree86/os-support/solaris/Makefile.am +++ b/hw/xfree86/os-support/solaris/Makefile.am @@ -10,6 +10,12 @@ else AGP_SRC = $(srcdir)/../shared/agp_noop.c endif +if APM +APM_SRC = sun_apm.c +else +APM_SRC = $(srcdir)/../shared/pm_noop.c +endif + SOLARIS_INOUT_SRC = solar...@[email protected] DISTCLEANFILES = solar...@[email protected] @@ -18,7 +24,7 @@ solar...@[email protected]: solar...@[email protected] noinst_LTLIBRARIES = libsolaris.la libsolaris_la_SOURCES = sun_init.c \ - sun_vid.c sun_bell.c $(AGP_SRC) sun_apm.c \ + sun_vid.c sun_bell.c $(AGP_SRC) $(APM_SRC) \ $(srcdir)/../shared/kmod_noop.c \ $(srcdir)/../shared/posix_tty.c \ $(srcdir)/../shared/sigio.c \ -- 1.6.3.3 I would like to get some {Reviewed,Tested}-by on this patch, especially from people who can test on BSD and Solaris.
_______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
