Subject: pkg/13345: kdeutils2: klaptopdaemon support for NetBSD 1.5
To: None <gnats-bugs@gnats.netbsd.org>
From: None <srp@zgi.com>
List: netbsd-bugs
Date: 06/29/2001 17:44:21
>Number:         13345
>Category:       pkg
>Synopsis:       kdeutils2: klaptopdaemon support for NetBSD 1.5
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    pkg-manager
>State:          open
>Class:          change-request
>Submitter-Id:   net
>Arrival-Date:   Fri Jun 29 17:42:00 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator:     Scott Presnell
>Release:        20010503
>Organization:
Self
>Environment:

NetBSD 1.5R (TAJO) #6: Thu May  3 21:00:38 PDT 2001
    scott@tajo:/usr/src/sys/arch/i386/compile/TAJO
Architecture: i386
Machine: i386
>Description:

	klaptopdaemon in kdeutils for kde 2.1 controls advanced power
	management (apm).  Initially there was no support for NetBSD,
	the following patch provides basic support (standby, suspend,
	battery and ac-power tracking)

>How-To-Repeat:
	N/A

>Fix:

--- portable.cpp.orig	Fri Jun 29 17:19:29 2001
+++ portable.cpp	Fri Jun 29 17:30:35 2001
@@ -657,6 +657,238 @@
 {
 	return(1);
 }
+
+#elif  __NetBSD__
+
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <machine/apmvar.h>
+#include <iostream.h>
+
+//
+// klaptopdeamon interface to NetBSD 1.5 apm.
+// Scott Presnell, srp@zgi.com, srp@tworoads.net
+// Fri Jun 29 17:21:25 PDT 2001
+// Tested on Dell I4K running NetBSD 1.5R
+//
+#define APMDEV "/dev/apm"
+
+//
+//	Check for apm in kernel by talking to /dev/apm
+//	(opening read only is allowed by any process).
+//	returns 1 if we support power management
+//
+int
+laptop_portable::has_power_management()
+{
+	int ret, fd = ::open(APMDEV, O_RDONLY);
+
+	if (fd == -1) {
+	  return 0;
+	}
+
+	struct apm_power_info info;
+	ret=ioctl(fd, APM_IOC_GETPOWER, &info);
+	::close(fd);
+
+	if (ret == -1) {
+	  return 0;
+	}
+
+	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 = ::open(APMDEV, O_RDONLY);
+
+	if (fd == -1)
+	  return 0;
+
+	struct apm_power_info info;
+	ret=ioctl(fd, APM_IOC_GETPOWER, &info);
+	::close(fd);
+
+	if (ret == -1)
+	  return 0;
+
+	return (info.minutes_left != 0xffff);
+}
+
+//
+//	returns 1 if we can perform a change-to-suspend-mode operation for the user
+//	(ust check to see if we have the binary)
+//	(has_power_management() has already returned 1)
+//
+int laptop_portable::has_suspend()
+{
+
+	struct stat s;
+        if (stat("/usr/sbin/apm", &s))
+		return(0);
+	return(1);
+}
+
+//
+//	returns 1 if we can perform a change-to-standby-mode operation for the user
+//	(just check to see if we have the binary)
+//	(has_power_management() has already returned 1)
+//
+int laptop_portable::has_standby()
+{
+
+	struct stat s;
+        if (stat("/usr/sbin/apm", &s))
+		return(0);
+	return(1);
+}
+
+//
+//	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]
+//	No support in NetBSD at this time.
+//
+int laptop_portable::has_hibernation()
+{
+	return(0);
+}
+
+//
+//	explain to the user what they need to do if has_power_management() returned 0
+//	to get any software they lack
+//
+QLabel *laptop_portable::no_power_management_explanation(QWidget *parent)
+{
+  int fd;
+  QLabel *explain;
+
+  fd = ::open(APMDEV, O_RDONLY);
+  if (fd == -1) {
+    switch (errno) {
+    case ENOENT:
+      explain = new QLabel("There is no /dev/apm file on this system.  Pleae review the NetBSD documentation on how to create a device node for the apm device driver (man 4 apm)", parent);
+      break;
+    case EACCES:
+      explain = new QLabel("Your system has the proper device node for apm support, however you can't access it. If you have apm in the kernel this should not happen", parent);
+      break;
+    case ENXIO:
+      explain = new QLabel("Your kernel lacks support for Advanced Power Managment.", parent);
+      break;
+      break;
+    default:
+      explain = new QLabel("There was some generic error while opening /dev/apm.", parent);
+      break;
+    }
+  } else {
+    close(fd);
+    explain = new QLabel("APM has most likely been disabled.  Oops", parent);
+  }
+  
+  explain->setMinimumSize(explain->sizeHint());       
+  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(i18n(" "), parent);
+        note->setMinimumSize(note->sizeHint()); 
+	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
+//	Use apm rather than ioctls in case they are running apmd
+//	(as they should be).
+//
+void laptop_portable::invoke_standby()
+{
+	::system("/usr/sbin/apm -S");    
+}
+
+//
+//	puts us into suspend mode
+//	Use apm rather than ioctls in case they are running apmd
+//	(as they should be).
+//
+void laptop_portable::invoke_suspend()
+{
+
+	::system("/usr/sbin/apm -z");    
+}
+
+//
+//	puts us into hibernate mode
+//	No hibernate mode for NetBSD.
+//
+void laptop_portable::invoke_hibernation()
+{
+	return;
+}
+
+
+//
+//	return current battery state
+//
+struct power_result laptop_portable::poll_battery_state()
+{
+	struct power_result p;
+       	int ret;
+
+       	int fd = ::open(APMDEV, O_RDONLY);
+
+       	if (fd == -1)
+         	goto bad;
+
+       	struct apm_power_info info;
+       	ret=ioctl(fd, APM_IOC_GETPOWER, &info);
+       	::close(fd);
+	
+       	if (ret == -1)
+         	goto bad;
+
+       	p.powered = (info.ac_state == APM_AC_ON);
+       	p.percentage = (info.battery_life==255 ? 100 : info.battery_life);
+       	p.time = (info.minutes_left != 0xffff ? info.minutes_left : -1);
+       	return(p);
+
+bad:
+       	p.powered = 1; 
+	p.percentage = 100;
+	p.time = 0;
+	return(p);
+}
+
+//
+//
+//	returns true if any mouse or kdb activity has been detected
+//	
+int laptop_portable::poll_activity()
+{
+	return(1);
+}
 #else
 
 // INSERT HERE

>Release-Note:
>Audit-Trail:
>Unformatted: