1 #ifdef HAVE_XORG_CONFIG_H
2 #include <xorg-config.h>
10 #include "xf86_OSproc.h"
11 #include "xf86_OSlib.h"
13 #include <machine/apmvar.h>
15 #define APM_DEVICE "/dev/apm"
17 static pointer APMihPtr
= NULL
;
18 static void bsdCloseAPM(void);
23 } bsdToXF86Array
[] = {
24 {APM_STANDBY_REQ
, XF86_APM_SYS_STANDBY
},
25 {APM_SUSPEND_REQ
, XF86_APM_SYS_SUSPEND
},
26 {APM_NORMAL_RESUME
, XF86_APM_NORMAL_RESUME
},
27 {APM_CRIT_RESUME
, XF86_APM_CRITICAL_RESUME
},
28 {APM_BATTERY_LOW
, XF86_APM_LOW_BATTERY
},
29 {APM_POWER_CHANGE
, XF86_APM_POWER_STATUS_CHANGE
},
30 {APM_UPDATE_TIME
, XF86_APM_UPDATE_TIME
},
31 {APM_CRIT_SUSPEND_REQ
, XF86_APM_CRITICAL_SUSPEND
},
32 {APM_USER_STANDBY_REQ
, XF86_APM_USER_STANDBY
},
33 {APM_USER_SUSPEND_REQ
, XF86_APM_USER_SUSPEND
},
34 {APM_SYS_STANDBY_RESUME
, XF86_APM_STANDBY_RESUME
},
35 #ifdef APM_CAPABILITY_CHANGE
36 {APM_CAPABILITY_CHANGE
, XF86_APM_CAPABILITY_CHANGED
},
40 #define numApmEvents (sizeof(bsdToXF86Array) / sizeof(bsdToXF86Array[0]))
47 for (i
= 0; i
< numApmEvents
; i
++) {
48 if (type
== bsdToXF86Array
[i
].apmBsd
) {
49 return bsdToXF86Array
[i
].xf86
;
52 return XF86_APM_UNKNOWN
;
56 * APM events can be requested direclty from /dev/apm
59 bsdPMGetEventFromOS(int fd
, pmEvent
* events
, int num
)
61 struct apm_event_info bsdEvent
;
64 for (i
= 0; i
< num
; i
++) {
66 if (ioctl(fd
, APM_IOC_NEXTEVENT
, &bsdEvent
) < 0) {
67 if (errno
!= EAGAIN
) {
68 xf86Msg(X_WARNING
, "bsdPMGetEventFromOS: APM_IOC_NEXTEVENT"
69 " %s\n", strerror(errno
));
73 events
[i
] = bsdToXF86(bsdEvent
.type
);
79 * XXX This won't work on /dev/apm !
80 * We should either use /dev/apm_ctl (and kill apmd(8))
81 * or talk to apmd (but its protocol is not publically available)...
84 bsdPMConfirmEventToOs(int fd
, pmEvent event
)
87 case XF86_APM_SYS_STANDBY
:
88 case XF86_APM_USER_STANDBY
:
89 if (ioctl(fd
, APM_IOC_STANDBY
, NULL
) == 0)
90 return PM_WAIT
; /* should we stop the Xserver in standby, too? */
93 case XF86_APM_SYS_SUSPEND
:
94 case XF86_APM_CRITICAL_SUSPEND
:
95 case XF86_APM_USER_SUSPEND
:
96 if (ioctl(fd
, APM_IOC_SUSPEND
, NULL
) == 0)
100 case XF86_APM_STANDBY_RESUME
:
101 case XF86_APM_NORMAL_RESUME
:
102 case XF86_APM_CRITICAL_RESUME
:
103 case XF86_APM_STANDBY_FAILED
:
104 case XF86_APM_SUSPEND_FAILED
:
116 if (APMihPtr
|| !xf86Info
.pmFlag
) {
120 if ((fd
= open(APM_DEVICE
, O_RDWR
)) == -1) {
123 xf86PMGetEventFromOs
= bsdPMGetEventFromOS
;
124 xf86PMConfirmEventToOs
= bsdPMConfirmEventToOs
;
125 APMihPtr
= xf86AddGeneralHandler(fd
, xf86HandlePMEvents
, NULL
);
135 fd
= xf86RemoveGeneralHandler(APMihPtr
);