Home | History | Annotate | Download | only in x11vnc
      1 /*
      2    Copyright (C) 2002-2010 Karl J. Runge <runge (at) 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 
     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 
     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 
     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 
     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 
     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 
    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 
    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 
    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 
    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 
    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 
    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