00001
00002
00003
00004
#include "X.h"
00005
#include "xf86.h"
00006
#include "xf86Priv.h"
00007
#include "xf86Xinput.h"
00008
00009 int (*xf86PMGetEventFromOs)(
int fd,
pmEvent *
events,
int num) = NULL;
00010 pmWait (*xf86PMConfirmEventToOs)(
int fd,
pmEvent event) = NULL;
00011
00012 static Bool suspended = FALSE;
00013
00014
static char *
00015 eventName(pmEvent event)
00016 {
00017
switch(
event) {
00018
case XF86_APM_SYS_STANDBY:
return (
"System Standby Request");
00019
case XF86_APM_SYS_SUSPEND:
return (
"System Suspend Request");
00020
case XF86_APM_CRITICAL_SUSPEND:
return (
"Critical Suspend");
00021
case XF86_APM_USER_STANDBY:
return (
"User System Standby Request");
00022
case XF86_APM_USER_SUSPEND:
return (
"User System Suspend Request");
00023
case XF86_APM_STANDBY_RESUME:
return (
"System Standby Resume");
00024
case XF86_APM_NORMAL_RESUME:
return (
"Normal Resume System");
00025
case XF86_APM_CRITICAL_RESUME:
return (
"Critical Resume System");
00026
case XF86_APM_LOW_BATTERY:
return (
"Battery Low");
00027
case XF86_APM_POWER_STATUS_CHANGE:
return (
"Power Status Change");
00028
case XF86_APM_UPDATE_TIME:
return (
"Update Time");
00029
case XF86_APM_CAPABILITY_CHANGED:
return (
"Capability Changed");
00030
case XF86_APM_STANDBY_FAILED:
return (
"Standby Request Failed");
00031
case XF86_APM_SUSPEND_FAILED:
return (
"Suspend Request Failed");
00032
default:
return (
"Unknown Event");
00033 }
00034 }
00035
00036
static void
00037 suspend (pmEvent event, Bool undo)
00038 {
00039
int i;
00040
InputInfoPtr pInfo;
00041
00042
for (
i = 0;
i <
xf86NumScreens;
i++) {
00043
xf86EnableAccess(
xf86Screens[
i]);
00044
if (
xf86Screens[
i]->
EnableDisableFBAccess)
00045 (*
xf86Screens[
i]->
EnableDisableFBAccess) (
i, FALSE);
00046 }
00047
#if !defined(__EMX__)
00048
DisableDevice((
DeviceIntPtr)
xf86Info.
pKeyboard);
00049 pInfo =
xf86InputDevs;
00050
while (pInfo) {
00051
DisableDevice(pInfo->
dev);
00052 pInfo = pInfo->
next;
00053 }
00054
#endif
00055
xf86EnterServerState(
SETUP);
00056
for (
i = 0;
i <
xf86NumScreens;
i++) {
00057
xf86EnableAccess(
xf86Screens[
i]);
00058
if (
xf86Screens[
i]->
PMEvent)
00059
xf86Screens[
i]->
PMEvent(
i,
event,undo);
00060
else {
00061
xf86Screens[
i]->
LeaveVT(
i, 0);
00062
xf86Screens[
i]->
vtSema = FALSE;
00063 }
00064 }
00065
xf86AccessLeave();
00066
xf86AccessLeaveState();
00067 }
00068
00069
static void
00070 resume(pmEvent event, Bool undo)
00071 {
00072
int i;
00073
InputInfoPtr pInfo;
00074
00075
xf86AccessEnter();
00076
xf86EnterServerState(
SETUP);
00077
for (
i = 0;
i <
xf86NumScreens;
i++) {
00078
xf86EnableAccess(
xf86Screens[
i]);
00079
if (
xf86Screens[
i]->
PMEvent)
00080
xf86Screens[
i]->
PMEvent(
i,
event,undo);
00081
else {
00082
xf86Screens[
i]->
vtSema = TRUE;
00083
xf86Screens[
i]->
EnterVT(
i, 0);
00084 }
00085 }
00086
xf86EnterServerState(
OPERATING);
00087
for (
i = 0;
i <
xf86NumScreens;
i++) {
00088
xf86EnableAccess(
xf86Screens[
i]);
00089
if (
xf86Screens[
i]->
EnableDisableFBAccess)
00090 (*
xf86Screens[
i]->
EnableDisableFBAccess) (
i, TRUE);
00091 }
00092
SaveScreens(SCREEN_SAVER_FORCER, ScreenSaverReset);
00093
#if !defined(__EMX__)
00094
pInfo =
xf86InputDevs;
00095
while (pInfo) {
00096
EnableDevice(pInfo->
dev);
00097 pInfo = pInfo->
next;
00098 }
00099
EnableDevice((
DeviceIntPtr)
xf86Info.
pKeyboard);
00100
#endif
00101
}
00102
00103
static void
00104 DoApmEvent(pmEvent event, Bool undo)
00105 {
00106
00107
00108
00109
00110
00111
int i;
00112
00113
switch(
event) {
00114
case XF86_APM_SYS_STANDBY:
00115
case XF86_APM_SYS_SUSPEND:
00116
case XF86_APM_CRITICAL_SUSPEND:
00117
case XF86_APM_USER_STANDBY:
00118
case XF86_APM_USER_SUSPEND:
00119
00120
if (!undo && !
suspended) {
00121
suspend(
event,undo);
00122
suspended = TRUE;
00123 }
else if (undo &&
suspended) {
00124
resume(
event,undo);
00125
suspended = FALSE;
00126 }
00127
break;
00128
case XF86_APM_STANDBY_RESUME:
00129
case XF86_APM_NORMAL_RESUME:
00130
case XF86_APM_CRITICAL_RESUME:
00131
if (
suspended) {
00132
resume(
event,undo);
00133
suspended = FALSE;
00134 }
00135
break;
00136
default:
00137
xf86EnterServerState(
SETUP);
00138
for (
i = 0;
i <
xf86NumScreens;
i++) {
00139
xf86EnableAccess(
xf86Screens[
i]);
00140
if (
xf86Screens[
i]->
PMEvent)
00141
xf86Screens[
i]->
PMEvent(
i,
event,undo);
00142 }
00143
xf86EnterServerState(
OPERATING);
00144
break;
00145 }
00146 }
00147
00148
#define MAX_NO_EVENTS 8
00149
00150
void
00151 xf86HandlePMEvents(
int fd, pointer data)
00152 {
00153
pmEvent events[MAX_NO_EVENTS];
00154
int i,
n;
00155
Bool wait = FALSE;
00156
00157
if (!
xf86PMGetEventFromOs)
00158
return;
00159
00160
if ((
n =
xf86PMGetEventFromOs(
fd,
events,MAX_NO_EVENTS))) {
00161
do {
00162
for (
i = 0;
i <
n;
i++) {
00163
xf86MsgVerb(
X_INFO,3,
"PM Event received: %s\n",
00164
eventName(
events[
i]));
00165
DoApmEvent(
events[
i],FALSE);
00166
switch (
xf86PMConfirmEventToOs(
fd,
events[
i])) {
00167
case PM_WAIT:
00168 wait = TRUE;
00169
break;
00170
case PM_CONTINUE:
00171 wait = FALSE;
00172
break;
00173
case PM_FAILED:
00174
DoApmEvent(
events[
i],TRUE);
00175 wait = FALSE;
00176
break;
00177
default:
00178
break;
00179 }
00180 }
00181
if (wait)
00182
n =
xf86PMGetEventFromOs(
fd,
events,MAX_NO_EVENTS);
00183
else
00184
break;
00185 }
while (1);
00186 }
00187 }