1 /*
2  * Screensaver code
3  */
4 
5 #ifdef HAVE_CONFIG_H
6 # include <config.h>
7 #endif /* ifdef HAVE_CONFIG_H */
8 
9 #include "Ecore.h"
10 #include "ecore_x_private.h"
11 #include "Ecore_X.h"
12 #include "Ecore_X_Atoms.h"
13 
14 static int _screensaver_available = -1;
15 
16 EAPI Eina_Bool
ecore_x_screensaver_event_available_get(void)17 ecore_x_screensaver_event_available_get(void)
18 {
19    if (_screensaver_available >= 0)
20      return _screensaver_available;
21 
22 #ifdef ECORE_XSS
23    int _screensaver_major, _screensaver_minor;
24 
25    LOGFN;
26    _screensaver_major = 1;
27    _screensaver_minor = 0;
28 
29    if (XScreenSaverQueryVersion(_ecore_x_disp, &_screensaver_major,
30                                 &_screensaver_minor))
31      _screensaver_available = 1;
32    else
33      _screensaver_available = 0;
34 
35 #else /* ifdef ECORE_XSS */
36    _screensaver_available = 0;
37 #endif /* ifdef ECORE_XSS */
38    return _screensaver_available;
39 }
40 
41 EAPI int
ecore_x_screensaver_idle_time_get(void)42 ecore_x_screensaver_idle_time_get(void)
43 {
44 #ifdef ECORE_XSS
45    XScreenSaverInfo *xss;
46    unsigned long _idle;
47    int dummy;
48    int idle;
49 
50    LOGFN;
51    xss = XScreenSaverAllocInfo();
52    XScreenSaverQueryInfo(_ecore_x_disp,
53                          RootWindow(_ecore_x_disp, DefaultScreen(
54                                       _ecore_x_disp)), xss);
55 
56    _idle = xss->idle;
57    XFree(xss);
58    if (DPMSQueryExtension(_ecore_x_disp, &dummy, &dummy))
59      {
60         CARD16 standby, suspend, off;
61         CARD16 state;
62         BOOL onoff;
63 
64         if (DPMSCapable(_ecore_x_disp))
65           {
66              DPMSGetTimeouts(_ecore_x_disp, &standby, &suspend, &off);
67              DPMSInfo(_ecore_x_disp, &state, &onoff);
68 
69              if (onoff)
70                {
71                   switch (state)
72                     {
73                      case DPMSModeStandby:
74                         /* this check is a littlebit paranoid, but be sure */
75                         if (_idle < (unsigned) (standby * 1000))
76                           _idle += (standby * 1000);
77                         break;
78                      case DPMSModeSuspend:
79                         if (_idle < (unsigned) ((suspend + standby) * 1000))
80                           _idle += ((suspend + standby) * 1000);
81                         break;
82                      case DPMSModeOff:
83                         if (_idle < (unsigned) ((off + suspend + standby) * 1000))
84                           _idle += ((off + suspend + standby) * 1000);
85                         break;
86                      case DPMSModeOn:
87                      default:
88                         break;
89                     }
90                }
91           }
92      }
93    idle = _idle / 1000;
94 
95    return idle;
96 #else
97    return 0;
98 #endif /* ifdef ECORE_XSS */
99 }
100 
101 EAPI void
ecore_x_screensaver_set(int timeout,int interval,int prefer_blanking,int allow_exposures)102 ecore_x_screensaver_set(int timeout,
103                         int interval,
104                         int prefer_blanking,
105                         int allow_exposures)
106 {
107    LOGFN;
108    XSetScreenSaver(_ecore_x_disp,
109                    timeout,
110                    interval,
111                    prefer_blanking,
112                    allow_exposures);
113 }
114 
115 EAPI void
ecore_x_screensaver_timeout_set(int timeout)116 ecore_x_screensaver_timeout_set(int timeout)
117 {
118    int pto, pint, pblank, pexpo;
119 
120    LOGFN;
121    XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
122    XSetScreenSaver(_ecore_x_disp, timeout, pint, pblank, pexpo);
123 }
124 
125 EAPI int
ecore_x_screensaver_timeout_get(void)126 ecore_x_screensaver_timeout_get(void)
127 {
128    int pto, pint, pblank, pexpo;
129 
130    LOGFN;
131    XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
132    return pto;
133 }
134 
135 EAPI void
ecore_x_screensaver_blank_set(int blank)136 ecore_x_screensaver_blank_set(int blank)
137 {
138    int pto, pint, pblank, pexpo;
139 
140    LOGFN;
141    XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
142    XSetScreenSaver(_ecore_x_disp, pto, pint, blank, pexpo);
143 }
144 
145 EAPI int
ecore_x_screensaver_blank_get(void)146 ecore_x_screensaver_blank_get(void)
147 {
148    int pto, pint, pblank, pexpo;
149 
150    LOGFN;
151    XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
152    return pblank;
153 }
154 
155 EAPI void
ecore_x_screensaver_expose_set(int expose)156 ecore_x_screensaver_expose_set(int expose)
157 {
158    int pto, pint, pblank, pexpo;
159 
160    LOGFN;
161    XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
162    XSetScreenSaver(_ecore_x_disp, pto, pint, pblank, expose);
163 }
164 
165 EAPI int
ecore_x_screensaver_expose_get(void)166 ecore_x_screensaver_expose_get(void)
167 {
168    int pto, pint, pblank, pexpo;
169 
170    LOGFN;
171    XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
172    return pexpo;
173 }
174 
175 EAPI void
ecore_x_screensaver_interval_set(int interval)176 ecore_x_screensaver_interval_set(int interval)
177 {
178    int pto, pint, pblank, pexpo;
179 
180    LOGFN;
181    XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
182    XSetScreenSaver(_ecore_x_disp, pto, interval, pblank, pexpo);
183 }
184 
185 EAPI int
ecore_x_screensaver_interval_get(void)186 ecore_x_screensaver_interval_get(void)
187 {
188    int pto, pint, pblank, pexpo;
189 
190    LOGFN;
191    XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
192    return pint;
193 }
194 
195 EAPI void
ecore_x_screensaver_event_listen_set(Eina_Bool on)196 ecore_x_screensaver_event_listen_set(Eina_Bool on)
197 {
198 #ifdef ECORE_XSS
199    Ecore_X_Window root;
200 
201    LOGFN;
202    root = DefaultRootWindow(_ecore_x_disp);
203    if (on)
204      XScreenSaverSelectInput(_ecore_x_disp, root,
205                              ScreenSaverNotifyMask | ScreenSaverCycle);
206    else
207      XScreenSaverSelectInput(_ecore_x_disp, root, 0);
208 #else
209    return;
210    on = EINA_FALSE;
211 #endif /* ifdef ECORE_XSS */
212 }
213 
214 
215 EAPI Eina_Bool
ecore_x_screensaver_custom_blanking_enable(void)216 ecore_x_screensaver_custom_blanking_enable(void)
217 {
218 #ifdef ECORE_XSS
219    XSetWindowAttributes attr;
220 
221    XScreenSaverSetAttributes(_ecore_x_disp,
222                              DefaultRootWindow(_ecore_x_disp),
223                              -9999, -9999, 1, 1, 0,
224                              CopyFromParent, InputOnly, CopyFromParent,
225                              0, &attr);
226    return EINA_TRUE;
227 #else
228    return EINA_FALSE;
229 #endif /* ifdef ECORE_XSS */
230 }
231 
232 EAPI Eina_Bool
ecore_x_screensaver_custom_blanking_disable(void)233 ecore_x_screensaver_custom_blanking_disable(void)
234 {
235 #ifdef ECORE_XSS
236    XScreenSaverUnsetAttributes(_ecore_x_disp,
237                                DefaultRootWindow(_ecore_x_disp));
238    return EINA_TRUE;
239 #else
240    return EINA_FALSE;
241 #endif /* ifdef ECORE_XSS */
242 }
243 
244 EINA_DEPRECATED EAPI void
ecore_x_screensaver_supend(void)245 ecore_x_screensaver_supend(void)
246 {
247    ecore_x_screensaver_suspend();
248 }
249 
250 EAPI void
ecore_x_screensaver_suspend(void)251 ecore_x_screensaver_suspend(void)
252 {
253 #ifdef ECORE_XSS
254    XScreenSaverSuspend(_ecore_x_disp, 1);
255 #endif /* ifdef ECORE_XSS */
256 }
257 
258 EAPI void
ecore_x_screensaver_resume(void)259 ecore_x_screensaver_resume(void)
260 {
261 #ifdef ECORE_XSS
262    XScreenSaverSuspend(_ecore_x_disp, 0);
263 #endif /* ifdef ECORE_XSS */
264 }
265 
266 EAPI void
ecore_x_screensaver_reset(void)267 ecore_x_screensaver_reset(void)
268 {
269    XResetScreenSaver(_ecore_x_disp);
270 }
271 
272 EAPI void
ecore_x_screensaver_activate(void)273 ecore_x_screensaver_activate(void)
274 {
275    XActivateScreenSaver(_ecore_x_disp);
276 }
277