diff options
Diffstat (limited to 'sysutils')
-rw-r--r-- | sysutils/klaptopdaemon/Makefile | 13 | ||||
-rw-r--r-- | sysutils/klaptopdaemon/files/extrapatch-acpi-support | 534 | ||||
-rw-r--r-- | sysutils/klaptopdaemon/pkg-descr | 3 |
3 files changed, 547 insertions, 3 deletions
diff --git a/sysutils/klaptopdaemon/Makefile b/sysutils/klaptopdaemon/Makefile index 79603d373d95..0730785819f6 100644 --- a/sysutils/klaptopdaemon/Makefile +++ b/sysutils/klaptopdaemon/Makefile @@ -16,10 +16,12 @@ DISTNAME= kdeutils-${PORTVERSION} DIST_SUBDIR= KDE MAINTAINER= kde@FreeBSD.org -COMMENT= APM monitor for KDE +COMMENT= Power management utility for KDE CONFLICTS= kdeutils-3.1.* kdeutils-3.2.[0-3] +OPTIONS= ACPI "Contributed ACPI support patch" off + USE_KDELIBS_VER=3 PREFIX= ${KDE_PREFIX} @@ -32,8 +34,15 @@ WRKSRC= ${WRKDIR}/kdeutils-${PORTVERSION} USE_LDCONFIG= yes LDCONFIG_DIRS+= %%PREFIX%%/lib %%PREFIX%%/lib/kde3 +.include <bsd.port.pre.mk> + +.if defined(WITH_ACPI) +EXTRA_PATCHES+= ${PATCHDIR}/extrapatch-acpi-support +ONLY_FOR_ARCHS+=amd64 +.endif + pre-configure: ${ECHO_CMD} ${PORTNAME} > ${WRKSRC}/inst-apps .include "${.CURDIR}/../../x11/kde3/Makefile.kde" -.include <bsd.port.mk> +.include <bsd.port.post.mk> diff --git a/sysutils/klaptopdaemon/files/extrapatch-acpi-support b/sysutils/klaptopdaemon/files/extrapatch-acpi-support new file mode 100644 index 000000000000..71f1a7cb65ef --- /dev/null +++ b/sysutils/klaptopdaemon/files/extrapatch-acpi-support @@ -0,0 +1,534 @@ +--- klaptopdaemon/portable.cpp.orig 2007-09-14 18:54:04.000000000 +0400 ++++ klaptopdaemon/portable.cpp 2007-09-14 18:54:18.000000000 +0400 +@@ -1,7 +1,7 @@ + /* + * portable.cpp + * +- * $Id: portable.cpp 629304 2007-02-02 09:55:28Z dfaure $ ++ * $Id: portable.cpp 540996 2006-05-15 09:55:42Z mueller $ + * + * Copyright (c) 1999 Paul Campbell <paul@taniwha.com> + * +@@ -1957,19 +1957,19 @@ + laptop_portable::get_button(LaptopButton l) // true if a button is pressed + { + if (::has_acpi()) { +- QString name; ++ QString *name=0; + switch (l) { + case LidButton: +- name = acpi_lid_name; ++ name = &acpi_lid_name; + break; + case PowerButton: +- name = acpi_power_name; ++ name = &acpi_power_name; + break; + default: + break; + } +- if (!name.isEmpty()) { +- QFile f(name); ++ if (name) { ++ QFile f(*name); + if (f.open(IO_ReadOnly)) { + while (!f.atEnd()) { + QString l; +@@ -2001,7 +2001,488 @@ + return(0); + } + +-#elif defined(__FreeBSD__) && HAVE_MACHINE_APM_BIOS_H ++#elif defined(__FreeBSD__) ++ ++#include <osreldate.h> ++ ++#if __FreeBSD_version >= 502010 ++ ++/* ++** This is the FreeBSD-specific code for FreeBSD newer than 5.2.1. ++*/ ++ ++#include <sys/param.h> ++ ++#include <errno.h> ++#include <fcntl.h> ++#include <sys/ioctl.h> ++#include <sysexits.h> ++#include <unistd.h> ++ ++#include <dev/acpica/acpiio.h> ++ ++#define ACPIDEV "/dev/acpi" ++ ++ ++#include <qpushbutton.h> ++#include <qobject.h> ++#include <kactivelabel.h> ++#include <kprocess.h> ++ ++// ++// returns 1 if we support power management ++// ++/* ++791:int laptop_portable::has_apm(int type) ++806:int laptop_portable::has_acpi(int type) ++857:int laptop_portable::has_power_management() ++873:int laptop_portable::has_battery_time() ++886:int laptop_portable::has_suspend() ++903:int laptop_portable::has_standby() ++921:int laptop_portable::has_hibernation() ++940:KActiveLabel *laptop_portable::no_power_management_explanation(QWidget *parent) ++955:QLabel *laptop_portable::how_to_do_suspend_resume(QWidget *parent) ++1041:QLabel *laptop_portable::pcmcia_info(int x, QWidget *parent) ++1062:void laptop_portable::invoke_standby() ++1096:void laptop_portable::invoke_suspend() ++1135:void laptop_portable::invoke_hibernation() ++1184:struct power_result laptop_portable::poll_battery_state() ++1264:bool laptop_portable::has_lav() ++1269:float laptop_portable::get_load_average() ++1287:int laptop_portable::has_cpufreq() { ++1301:QString laptop_portable::cpu_frequency() { ++ ++2067:int laptop_portable::has_battery_time() ++2092:int laptop_portable::has_suspend() ++2113:int laptop_portable::has_standby() ++2136:int laptop_portable::has_hibernation() ++2147:KActiveLabel *laptop_portable::no_power_management_explanation(QWidget *parent) ++2180:QLabel *laptop_portable::how_to_do_suspend_resume(QWidget *parent) ++2191:QLabel *laptop_portable::pcmcia_info(int x, QWidget *parent) ++2200:void laptop_portable::invoke_standby() ++2216:void laptop_portable::invoke_suspend() ++2231:void laptop_portable::invoke_hibernation() ++2252:int laptop_portable::has_acpi(int) ++2258:int laptop_portable::has_apm(int type) ++2285:struct power_result laptop_portable::poll_battery_state() ++2326:bool laptop_portable::has_lav() { return 0; } ++2328:float laptop_portable::get_load_average() ++2334:int laptop_portable::has_cpufreq() { ++2339:QString laptop_portable::cpu_frequency() ++*/ ++#include <iostream> ++using namespace std; ++ ++// ++// something changed maybe we need to check out environment again ++// ++void ++laptop_portable::power_management_restart() ++{ ++ // INSERT HERE ++} ++ ++int ++laptop_portable::has_power_management() ++{ ++ /*int ret, fd; ++ ++ fd = ::open(ACPIDEV, O_RDWR); ++ if (fd == -1) ++ fd = ::open(ACPIDEV, O_RDONLY); ++ if (fd == -1) { ++ return 0; ++ } ++ else { ++ ::close(fd); ++ return 1; ++ }*/ ++ if (::access(ACPIDEV, O_RDWR) == -1) ++ if (::access(ACPIDEV, O_RDONLY) == -1) { ++ return 0; ++ } ++ else return 1; ++} ++// ++// returns 1 if the BIOS returns the time left in the battery rather than a % of full ++// ++int laptop_portable::has_battery_time() ++{ ++ int ret, fd; ++ union acpi_battery_ioctl_arg battio; ++ ++ battio.unit = 0; ++ ++ fd = ::open(ACPIDEV, O_RDWR); ++ if (fd == -1) ++ fd = ::open(ACPIDEV, O_RDONLY); ++ if (fd == -1) { ++ return 0; ++ } ++ ++ if (ioctl(fd, ACPIIO_BATT_GET_BIF, &battio) == -1) { ++ return (0); ++ } ++ ::close(fd); ++ return 1; ++} ++ ++// ++// returns 1 if we can perform a change-to-suspend-mode operation for the user ++// (has_power_management() has already returned 1) ++// ++int laptop_portable::has_suspend() ++{ ++ /*int ret, fd = ::open(APMDEV, O_RDWR); ++ ++ if (fd == -1) ++ return 0; ++ ++ struct apm_info info; ++ ret=ioctl(fd, APMIO_GETINFO, &info); ++ ::close(fd); ++ ++ if (ret == -1) ++ return 0; ++ ++ return (info.ai_capabilities & 0x02);*/ ++ return 0; ++} ++// ++// returns 1 if we can perform a change-to-standby-mode operation for the user ++// (has_power_management() has already returned 1) ++// ++int laptop_portable::has_standby() ++{ ++ /*int ret, fd = ::open(APMDEV, O_RDWR); ++ ++ if (fd == -1) ++ return 0; ++ ++ struct apm_info info; ++ ret=ioctl(fd, APMIO_GETINFO, &info); ++ ::close(fd); ++ ++ if (ret == -1) ++ return 0; ++ ++ return (info.ai_capabilities & 0x01);*/ ++ return 0; ++} ++// ++// returns 1 if we can perform a change-to-hibernate-mode for a user ++// (has_power_management() has already returned 1) [hibernate is the save-to-disk mode ++// not supported by linux - different laptops have their own - the first here is for ++// a ThinkPad] ++// ++int laptop_portable::has_hibernation() ++{ ++ if (::access(PATH_TPCTL, X_OK)==0) ++ return(1); ++ return(0); ++} ++ ++// ++// explain to the user what they need to do if has_power_management() returned 0 ++// to get any software they lack ++// ++KActiveLabel *laptop_portable::no_power_management_explanation(QWidget *parent) ++{ ++ int fd; ++ KActiveLabel *explain; ++ ++ fd = ::open(ACPIDEV, O_RDWR); ++ if (fd == -1) { ++ switch (errno) { ++ case ENOENT: ++ explain = new KActiveLabel(i18n("There is no /dev/acpi file on this system. Please review the FreeBSD handbook on how to add acpi support to your kernel(man 4 acpi)."), parent); ++ break; ++ case EACCES: ++ explain = new KActiveLabel(i18n("Your system has the proper device node for ACPI support, however you cannot access it. If you are logged in as root right now, you have a problem, otherwise contact your local sysadmin and ask for read/write access to /dev/acpi."), parent); ++ break; ++ case ENXIO: ++ explain = new KActiveLabel(i18n("Your kernel lacks support for ACPI."), parent); ++ break; ++ break; ++ default: ++ explain = new KActiveLabel(i18n("There was a generic error while opening /dev/acpi."), parent); ++ break; ++ } ++ } else { ++ close(fd); ++ explain = new KActiveLabel(i18n("ACPI has most likely been disabled."), parent); ++ } ++ ++ return(explain); ++} ++ ++// ++// explain to the user what they need to do to get suspend/resume to work from user mode ++// ++QLabel *laptop_portable::how_to_do_suspend_resume(QWidget *parent) ++{ ++ QLabel* note = new QLabel(" ", parent); ++ return(note); ++} ++ ++ ++// ++// pcmcia support - this will be replaced by better - pcmcia support being worked on by ++// others ++// ++QLabel *laptop_portable::pcmcia_info(int x, QWidget *parent) ++{ ++ if (x == 0) ++ return(new QLabel(i18n("No PCMCIA controller detected"), parent)); ++ return(new QLabel(i18n(""), parent)); ++} ++// ++// puts us into standby mode ++// ++void laptop_portable::invoke_standby() ++{ ++ /*int fd = ::open(APMDEV, O_RDWR); ++ ++ if (fd == -1) ++ return; ++ ++ ioctl(fd, APMIO_STANDBY, NULL); ++ ::close(fd);*/ ++ ++ return; ++} ++ ++// ++// puts us into suspend mode ++// ++void laptop_portable::invoke_suspend() ++{ ++ /*int fd = ::open(APMDEV, O_RDWR); ++ ++ if (fd == -1) ++ return; ++ ++ ioctl(fd, APMIO_SUSPEND, NULL); ++ ::close(fd);*/ ++ ++ return; ++} ++// ++// puts us into hibernate mode ++// ++void laptop_portable::invoke_hibernation() ++{ ++ KProcess thisProc; ++ ++ if (::access(PATH_TPCTL, X_OK)==0) { ++ thisProc << PATH_TPCTL; ++ thisProc << "---hibernate"; ++ thisProc.start(KProcess::Block); ++ return; ++ } ++} ++ ++void ++laptop_portable::acpi_set_mask(bool, bool, bool, bool, bool ) ++{ ++ // INSERT HERE ++} ++ ++int laptop_portable::has_acpi(int) ++{ ++ if (::access(ACPIDEV, O_RDONLY) != 0) return 0; ++ return (1); ++} ++ ++int laptop_portable::has_apm(int type) ++{ ++ if (type == 1) // implement me .... this is the hook that pops up the panel for making /usr/sbin/apm setuid ++ return 0; ++ return (0); ++} ++ ++void ++laptop_portable::apm_set_mask(bool , bool ) ++{ ++} ++ ++ ++// ++// adds extra widgets to the battery panel ++// ++void ++laptop_portable::extra_config(QWidget * /*parent*/, KConfig * /*config*/, QVBoxLayout * /*layout*/) ++{ ++ // INSERT HERE ++} ++ ++ ++ ++// ++// return current battery state ++// ++struct power_result laptop_portable::poll_battery_state() ++{ ++ struct power_result p; ++ ++ int ret, fd; ++ union acpi_battery_ioctl_arg battio; ++ ++ battio.unit = ACPI_BATTERY_ALL_UNITS; ++ ret = 0; ++ ++ fd = ::open(ACPIDEV, O_RDONLY); ++ if (fd == -1) { ++ goto bad; ++ } ++ ++ if (ioctl(fd, ACPIIO_BATT_GET_BATTINFO, &battio) == -1) { ++ goto bad; ++ } ++ ++ if (ioctl(fd, ACPIIO_ACAD_GET_STATUS, &ret) == -1) { ++ goto bad; ++ } ++ ++ ::close(fd); ++ ++ p.powered = ret; ++ p.percentage = battio.battinfo.cap; ++ p.time = battio.battinfo.min; ++ return(p); ++ ++bad: ++ p.powered = 1; ++ p.percentage = 100; ++ p.time = 0; ++ return(p); ++} ++ ++// ++// return the system load ++// ++ ++bool laptop_portable::has_lav() { return 1; } ++ ++float laptop_portable::get_load_average() ++{ ++ // INSERT HERE ++ return(-1); ++} ++ ++int laptop_portable::has_cpufreq() { ++ // INSERT HERE ++ return 0; ++} ++ ++QString laptop_portable::cpu_frequency() { ++ // INSERT HERE ++ return ""; ++} ++ ++int ++laptop_portable::has_brightness() ++{ ++ // INSERT HERE ++ return 0; ++} ++ ++void ++laptop_portable::set_brightness(bool /*blank*/, int /*val*/) // val = 0-255 255 brightest, 0 means dimmest (if !blank it must be still visible), ++{ ++ // INSERT HERE ++} ++ ++int ++laptop_portable::get_brightness() ++{ ++ // INSERT HERE ++ return(-1); // means can't extract it ++} ++ ++bool ++laptop_portable::get_system_performance(bool, int ¤t, QStringList &s, bool *&) // do something to help get system profiles from places like ACPI ++{ ++ // INSERT HERE ++ current = 0; ++ s.clear(); ++ return(0); // if no profiles are available ++} ++ ++bool ++laptop_portable::get_system_throttling(bool, int ¤t, QStringList &s, bool *&) // do something to help get system throttling data from places like ACPI ++{ ++ // INSERT HERE ++ current = 0; ++ s.clear(); ++ return(0); ++} ++ ++void ++laptop_portable::set_system_performance(QString) ++{ ++ // INSERT HERE ++} ++ ++void ++laptop_portable::set_system_throttling(QString) ++{ ++ // INSERT HERE ++} ++ ++bool ++laptop_portable::has_button(LaptopButton) // true if we have support for a particular button ++{ ++ // INSERT HERE ++ return(0); ++} ++ ++bool ++laptop_portable::get_button(LaptopButton) // true if a button is pressed ++{ ++ // INSERT HERE ++ return(0); ++} ++ ++void ++laptop_portable::get_battery_status(int &num_batteries, QStringList &names, QStringList &state, QStringList &values) // get multiple battery status ++{ ++ struct power_result r; ++ ++ if (!has_power_management()) { ++ num_batteries = 0; ++ names.clear(); ++ state.clear(); ++ values.clear(); ++ return; ++ } ++ ++ // INSERT HERE ++ ++ num_batteries = 1; ++ r = poll_battery_state(); ++ names.append("BAT1"); ++ state.append("yes"); ++ QString s; ++ s.setNum(r.percentage); ++ values.append(s); ++} ++ ++bool ++laptop_portable::has_software_suspend(int /*type*/) ++{ ++ return false; // (::has_software_suspend(type)); ++} ++ ++void ++laptop_portable::software_suspend_set_mask(bool /*hibernate*/) ++{ ++ // software_suspend_is_preferred = hibernate; ++} ++ ++#endif ++ ++#if defined(__FreeBSD__) && defined(HAVE_MACHINE_APM_BIOS_H) && (__FreeBSD_version < 502010) + + /* + ** This is the FreeBSD-specific code. +@@ -2426,6 +2907,7 @@ + // software_suspend_is_preferred = hibernate; + } + ++#endif + + #elif defined(__NetBSD_APM__) + diff --git a/sysutils/klaptopdaemon/pkg-descr b/sysutils/klaptopdaemon/pkg-descr index a542523efdc1..6d45c0758fee 100644 --- a/sysutils/klaptopdaemon/pkg-descr +++ b/sysutils/klaptopdaemon/pkg-descr @@ -1 +1,2 @@ -Klaptopdaemon is an APM monitor for KDE, useful for monitoring battery status. +Klaptopdaemon is a power management utility for KDE, useful for monitoring +battery status. |