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