summaryrefslogtreecommitdiffstats
path: root/x11vnc/macosxCGP.c
diff options
context:
space:
mode:
Diffstat (limited to 'x11vnc/macosxCGP.c')
-rw-r--r--x11vnc/macosxCGP.c186
1 files changed, 186 insertions, 0 deletions
diff --git a/x11vnc/macosxCGP.c b/x11vnc/macosxCGP.c
new file mode 100644
index 0000000..0366f81
--- /dev/null
+++ b/x11vnc/macosxCGP.c
@@ -0,0 +1,186 @@
+/* -- macosxCGP.c -- */
+
+#if (defined(__MACH__) && defined(__APPLE__))
+
+#include <ApplicationServices/ApplicationServices.h>
+#include <Cocoa/Cocoa.h>
+#include <Carbon/Carbon.h>
+
+int macosxCGP_save_dim(void);
+int macosxCGP_restore_dim(void);
+int macosxCGP_save_sleep(void);
+int macosxCGP_restore_sleep(void);
+int macosxCGP_init_dimming(void);
+int macosxCGP_undim(void);
+int macosxCGP_dim_shutdown(void);
+void macosxCGP_screensaver_timer_off(void);
+void macosxCGP_screensaver_timer_on(void);
+
+#include <IOKit/pwr_mgt/IOPMLib.h>
+#include <IOKit/pwr_mgt/IOPM.h>
+
+extern CGDirectDisplayID displayID;
+
+static unsigned long dim_time;
+static unsigned long sleep_time;
+static int dim_time_saved = 0;
+static int sleep_time_saved = 0;
+static int initialized = 0;
+static mach_port_t master_dev_port;
+static io_connect_t power_mgt;
+
+extern int client_count;
+extern int macosx_nodimming;
+extern int macosx_nosleep;
+extern int macosx_noscreensaver;
+
+static EventLoopTimerUPP sstimerUPP;
+static EventLoopTimerRef sstimer;
+
+void macosxCG_screensaver_timer(EventLoopTimerRef timer, void *data) {
+ if (0) fprintf(stderr, "macosxCG_screensaver_timer: %d\n", time(0));
+ if (macosx_nosleep && client_count) {
+ if (0) fprintf(stderr, "UpdateSystemActivity: %d\n", time(0));
+ UpdateSystemActivity(IdleActivity);
+ }
+}
+
+void macosxCGP_screensaver_timer_off(void) {
+ if (0) fprintf(stderr, "macosxCGP_screensaver_timer_off: %d\n", time(0));
+ RemoveEventLoopTimer(sstimer);
+ DisposeEventLoopTimerUPP(sstimerUPP);
+}
+
+void macosxCGP_screensaver_timer_on(void) {
+ if (0) fprintf(stderr, "macosxCGP_screensaver_timer_on: %d\n", time(0));
+ sstimerUPP = NewEventLoopTimerUPP(macosxCG_screensaver_timer);
+ InstallEventLoopTimer(GetMainEventLoop(), kEventDurationSecond * 30,
+ kEventDurationSecond * 30, sstimerUPP, NULL, &sstimer);
+}
+
+int macosxCGP_save_dim(void) {
+ if (IOPMGetAggressiveness(power_mgt, kPMMinutesToDim,
+ &dim_time) != kIOReturnSuccess) {
+ return 0;
+ }
+ dim_time_saved = 1;
+ return 1;
+}
+
+int macosxCGP_restore_dim(void) {
+ if (! dim_time_saved) {
+ return 0;
+ }
+ if (IOPMSetAggressiveness(power_mgt, kPMMinutesToDim,
+ dim_time) != kIOReturnSuccess) {
+ return 0;
+ }
+ dim_time_saved = 0;
+ dim_time = 0;
+ return 1;
+}
+
+int macosxCGP_save_sleep(void) {
+ if (IOPMGetAggressiveness(power_mgt, kPMMinutesToSleep,
+ &sleep_time) != kIOReturnSuccess) {
+ return 0;
+ }
+ sleep_time_saved = 1;
+ return 1;
+}
+
+int macosxCGP_restore_sleep(void) {
+ if (! sleep_time_saved) {
+ return 0;
+ }
+ if (IOPMSetAggressiveness(power_mgt, kPMMinutesToSleep,
+ dim_time) != kIOReturnSuccess) {
+ return 0;
+ }
+ sleep_time_saved = 0;
+ sleep_time = 0;
+ return 1;
+}
+
+int macosxCGP_init_dimming(void) {
+ if (IOMasterPort(bootstrap_port, &master_dev_port) !=
+ kIOReturnSuccess) {
+ return 0;
+ }
+ if (!(power_mgt = IOPMFindPowerManagement(master_dev_port))) {
+ return 0;
+ }
+ if (macosx_nodimming) {
+ if (! macosxCGP_save_dim()) {
+ return 0;
+ }
+ if (IOPMSetAggressiveness(power_mgt, kPMMinutesToDim, 0)
+ != kIOReturnSuccess) {
+ return 0;
+ }
+ }
+ if (macosx_nosleep) {
+ if (! macosxCGP_save_sleep()) {
+ return 0;
+ }
+ if (IOPMSetAggressiveness(power_mgt, kPMMinutesToSleep, 0)
+ != kIOReturnSuccess) {
+ return 0;
+ }
+ }
+
+ initialized = 1;
+ return 1;
+}
+
+int macosxCGP_undim(void) {
+ if (! initialized) {
+ return 0;
+ }
+ if (! macosx_nodimming) {
+ if (! macosxCGP_save_dim()) {
+ return 0;
+ }
+ if (IOPMSetAggressiveness(power_mgt, kPMMinutesToDim, 0)
+ != kIOReturnSuccess) {
+ return 0;
+ }
+ if (! macosxCGP_restore_dim()) {
+ return 0;
+ }
+ }
+ if (! macosx_nosleep) {
+ if (! macosxCGP_save_sleep()) {
+ return 0;
+ }
+ if (IOPMSetAggressiveness(power_mgt, kPMMinutesToSleep, 0)
+ != kIOReturnSuccess) {
+ return 0;
+ }
+ if (! macosxCGP_restore_sleep()) {
+ return 0;
+ }
+ }
+ return 1;
+}
+
+int macosxCGP_dim_shutdown(void) {
+ if (! initialized) {
+ return 0;
+ }
+ if (dim_time_saved) {
+ if (! macosxCGP_restore_dim()) {
+ return 0;
+ }
+ }
+ if (sleep_time_saved) {
+ if (! macosxCGP_restore_sleep()) {
+ return 0;
+ }
+ }
+ return 1;
+}
+
+#endif /* __APPLE__ */
+
+