e:/XFree86 for RH 8.0/XFree86-4.2.0/xc/programs/Xserver/hw/xfree86/common/xf86PM.c

Go to the documentation of this file.
00001 /* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86PM.c,v 3.5 2001/10/01 13:44:01 eich Exp $ */ 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 * we leave that as a global function for now. I don't know if 00108 * this might cause problems in the future. It is a global server 00109 * variable therefore it needs to be in a server info structure 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: /*do we want to delay a critical suspend?*/ 00117 case XF86_APM_USER_STANDBY: 00118 case XF86_APM_USER_SUSPEND: 00119 /* should we do this ? */ 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 }

Generated on Mon May 10 20:25:03 2004 for XFree86 by doxygen 1.3.7