1 /*
2 Copyright (C) 2002-2010 Karl J. Runge <runge@karlrunge.com>
3 All rights reserved.
4
5 This file is part of x11vnc.
6
7 x11vnc is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or (at
10 your option) any later version.
11
12 x11vnc is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with x11vnc; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA
20 or see <http://www.gnu.org/licenses/>.
21
22 In addition, as a special exception, Karl J. Runge
23 gives permission to link the code of its release of x11vnc with the
24 OpenSSL project's "OpenSSL" library (or with modified versions of it
25 that use the same license as the "OpenSSL" library), and distribute
26 the linked executables. You must obey the GNU General Public License
27 in all respects for all of the code used other than "OpenSSL". If you
28 modify this file, you may extend this exception to your version of the
29 file, but you are not obligated to do so. If you do not wish to do
30 so, delete this exception statement from your version.
31 */
32
33 /* -- macosxCGP.c -- */
34
macosxCGP_unused(void)35 void macosxCGP_unused(void) {}
36
37 #if (defined(__MACH__) && defined(__APPLE__))
38
39 #include <ApplicationServices/ApplicationServices.h>
40 #include <Cocoa/Cocoa.h>
41 #include <Carbon/Carbon.h>
42
43 int macosxCGP_save_dim(void);
44 int macosxCGP_restore_dim(void);
45 int macosxCGP_save_sleep(void);
46 int macosxCGP_restore_sleep(void);
47 int macosxCGP_init_dimming(void);
48 int macosxCGP_undim(void);
49 int macosxCGP_dim_shutdown(void);
50 void macosxCGP_screensaver_timer_off(void);
51 void macosxCGP_screensaver_timer_on(void);
52
53 #include <IOKit/pwr_mgt/IOPMLib.h>
54 #include <IOKit/pwr_mgt/IOPM.h>
55
56 extern CGDirectDisplayID displayID;
57
58 static unsigned long dim_time;
59 static unsigned long sleep_time;
60 static int dim_time_saved = 0;
61 static int sleep_time_saved = 0;
62 static int initialized = 0;
63 static mach_port_t master_dev_port;
64 static io_connect_t power_mgt;
65
66 extern int client_count;
67 extern int macosx_nodimming;
68 extern int macosx_nosleep;
69 extern int macosx_noscreensaver;
70
71 static EventLoopTimerUPP sstimerUPP;
72 static EventLoopTimerRef sstimer;
73
macosxCG_screensaver_timer(EventLoopTimerRef timer,void * data)74 void macosxCG_screensaver_timer(EventLoopTimerRef timer, void *data) {
75 if (0) fprintf(stderr, "macosxCG_screensaver_timer: %d\n", (int) time(0));
76 if (!timer || !data) {}
77 if (macosx_nosleep && client_count) {
78 if (0) fprintf(stderr, "UpdateSystemActivity: %d\n", (int) time(0));
79 UpdateSystemActivity(IdleActivity);
80 }
81 }
82
macosxCGP_screensaver_timer_off(void)83 void macosxCGP_screensaver_timer_off(void) {
84 if (0) fprintf(stderr, "macosxCGP_screensaver_timer_off: %d\n", (int) time(0));
85 RemoveEventLoopTimer(sstimer);
86 DisposeEventLoopTimerUPP(sstimerUPP);
87 }
88
macosxCGP_screensaver_timer_on(void)89 void macosxCGP_screensaver_timer_on(void) {
90 if (0) fprintf(stderr, "macosxCGP_screensaver_timer_on: %d\n", (int) time(0));
91 sstimerUPP = NewEventLoopTimerUPP(macosxCG_screensaver_timer);
92 InstallEventLoopTimer(GetMainEventLoop(), kEventDurationSecond * 30,
93 kEventDurationSecond * 30, sstimerUPP, NULL, &sstimer);
94 }
95
macosxCGP_save_dim(void)96 int macosxCGP_save_dim(void) {
97 if (IOPMGetAggressiveness(power_mgt, kPMMinutesToDim,
98 &dim_time) != kIOReturnSuccess) {
99 return 0;
100 }
101 dim_time_saved = 1;
102 return 1;
103 }
104
macosxCGP_restore_dim(void)105 int macosxCGP_restore_dim(void) {
106 if (! dim_time_saved) {
107 return 0;
108 }
109 if (IOPMSetAggressiveness(power_mgt, kPMMinutesToDim,
110 dim_time) != kIOReturnSuccess) {
111 return 0;
112 }
113 dim_time_saved = 0;
114 dim_time = 0;
115 return 1;
116 }
117
macosxCGP_save_sleep(void)118 int macosxCGP_save_sleep(void) {
119 if (IOPMGetAggressiveness(power_mgt, kPMMinutesToSleep,
120 &sleep_time) != kIOReturnSuccess) {
121 return 0;
122 }
123 sleep_time_saved = 1;
124 return 1;
125 }
126
macosxCGP_restore_sleep(void)127 int macosxCGP_restore_sleep(void) {
128 if (! sleep_time_saved) {
129 return 0;
130 }
131 if (IOPMSetAggressiveness(power_mgt, kPMMinutesToSleep,
132 dim_time) != kIOReturnSuccess) {
133 return 0;
134 }
135 sleep_time_saved = 0;
136 sleep_time = 0;
137 return 1;
138 }
139
macosxCGP_init_dimming(void)140 int macosxCGP_init_dimming(void) {
141 if (IOMasterPort(bootstrap_port, &master_dev_port) !=
142 kIOReturnSuccess) {
143 return 0;
144 }
145 if (!(power_mgt = IOPMFindPowerManagement(master_dev_port))) {
146 return 0;
147 }
148 if (macosx_nodimming) {
149 if (! macosxCGP_save_dim()) {
150 return 0;
151 }
152 if (IOPMSetAggressiveness(power_mgt, kPMMinutesToDim, 0)
153 != kIOReturnSuccess) {
154 return 0;
155 }
156 }
157 if (macosx_nosleep) {
158 if (! macosxCGP_save_sleep()) {
159 return 0;
160 }
161 if (IOPMSetAggressiveness(power_mgt, kPMMinutesToSleep, 0)
162 != kIOReturnSuccess) {
163 return 0;
164 }
165 }
166
167 initialized = 1;
168 return 1;
169 }
170
macosxCGP_undim(void)171 int macosxCGP_undim(void) {
172 if (! initialized) {
173 return 0;
174 }
175 if (! macosx_nodimming) {
176 if (! macosxCGP_save_dim()) {
177 return 0;
178 }
179 if (IOPMSetAggressiveness(power_mgt, kPMMinutesToDim, 0)
180 != kIOReturnSuccess) {
181 return 0;
182 }
183 if (! macosxCGP_restore_dim()) {
184 return 0;
185 }
186 }
187 if (! macosx_nosleep) {
188 if (! macosxCGP_save_sleep()) {
189 return 0;
190 }
191 if (IOPMSetAggressiveness(power_mgt, kPMMinutesToSleep, 0)
192 != kIOReturnSuccess) {
193 return 0;
194 }
195 if (! macosxCGP_restore_sleep()) {
196 return 0;
197 }
198 }
199 return 1;
200 }
201
macosxCGP_dim_shutdown(void)202 int macosxCGP_dim_shutdown(void) {
203 if (! initialized) {
204 return 0;
205 }
206 if (dim_time_saved) {
207 if (! macosxCGP_restore_dim()) {
208 return 0;
209 }
210 }
211 if (sleep_time_saved) {
212 if (! macosxCGP_restore_sleep()) {
213 return 0;
214 }
215 }
216 return 1;
217 }
218
219 #endif /* __APPLE__ */
220
221
222