/** * Sets the off timeout (in unit of seconds). * @param new_timeout Amount of time of inactivity before the monitor is shut off. * @ingroup Ecore_X_DPMS_Group */ EAPI void ecore_x_dpms_timeout_off_set(unsigned int new_timeout) { #ifdef ECORE_XDPMS unsigned short standby, suspend, off; LOGFN(__FILE__, __LINE__, __FUNCTION__); DPMSGetTimeouts(_ecore_x_disp, &standby, &suspend, &off); DPMSSetTimeouts(_ecore_x_disp, standby, suspend, new_timeout); #endif /* ifdef ECORE_XDPMS */ }
/** * Sets the timeouts. The values are in unit of seconds. * @param standby Amount of time of inactivity before standby mode will be invoked. * @param suspend Amount of time of inactivity before the screen is placed into suspend mode. * @param off Amount of time of inactivity before the monitor is shut off. * @ingroup Ecore_X_DPMS_Group */ EAPI Eina_Bool ecore_x_dpms_timeouts_set(unsigned int standby, unsigned int suspend, unsigned int off) { #ifdef ECORE_XDPMS LOGFN(__FILE__, __LINE__, __FUNCTION__); return DPMSSetTimeouts(_ecore_x_disp, standby, suspend, off) ? EINA_TRUE : EINA_FALSE; #else /* ifdef ECORE_XDPMS */ return EINA_FALSE; #endif /* ifdef ECORE_XDPMS */ }
/** * gpm_dpms_clear_timeouts: **/ static gboolean gpm_dpms_clear_timeouts (GpmDpms *dpms) { gboolean ret = FALSE; /* never going to work */ if (!dpms->priv->dpms_capable) { egg_debug ("not DPMS capable"); goto out; } egg_debug ("set timeouts to zero"); ret = DPMSSetTimeouts (dpms->priv->display, 0, 0, 0); out: return ret; }
guint gsd_power_enable_screensaver_watchdog (void) { int dummy; guint id; /* Make sure that Xorg's DPMS extension never gets in our * way. The defaults are now applied in Fedora 20 from * being "0" by default to being "600" by default */ gdk_x11_display_error_trap_push (gdk_display_get_default ()); if (DPMSQueryExtension(GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), &dummy, &dummy)) DPMSSetTimeouts (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), 0, 0, 0); gdk_x11_display_error_trap_pop_ignored (gdk_display_get_default ()); id = g_timeout_add_seconds (XSCREENSAVER_WATCHDOG_TIMEOUT, disable_builtin_screensaver, NULL); g_source_set_name_by_id (id, "[gnome-settings-daemon] disable_builtin_screensaver"); return id; }
/* called on signal or if DPMS changed, or other problem */ void reset(int sig) { if (grab) { if (verbose) { fprintf(stderr, "calling XUngrabServer()\n"); } XUngrabServer(dpy); } if (verbose) { fprintf(stderr, "resetting original DPMS values.\n"); } fprintf(stderr, "blockdpy: reset sig=%d called\n", sig); DPMSEnable(dpy); DPMSSetTimeouts(dpy, standby, suspend, off); XFlush(dpy); if (sig) { XCloseDisplay(dpy); exit(0); } }
int main(int argc, char **argv) { Display *dpy; int g15screen_fd; int event; int error; BOOL enabled = True; CARD16 power = 0; int dummy = 0, lights = True, change = 0; int i; struct sigaction new_action; char * enable_cmd = NULL; char * disable_cmd = NULL; int dpms_timeout = 0; for (i=0;i<argc;i++) { char argument[20]; memset(argument,0,20); strncpy(argument,argv[i],19); if (!strncmp(argument, "-a",2) || !strncmp(argument, "--activate",10)) { if(argv[i+1]!=NULL){ sscanf(argv[i+1],"%i",&dpms_timeout); i++; }else{ printf("%s --activate requires an argument <minutes to activation>\n",argv[0]); exit(1); } } if (!strncmp(argument, "-e",2) || !strncmp(argument, "--cmd-enable",12)) { if(argv[i+1]!=NULL){ enable_cmd = malloc(strlen(argv[i+1])+1); memcpy(enable_cmd, argv[i+1], strlen(argv[i+1])); i++; } } if (!strncmp(argument, "-d",2) || !strncmp(argument, "--cmd-disable",13)) { if(argv[i+1]!=NULL){ disable_cmd = malloc(strlen(argv[i+1])+1); memcpy(disable_cmd, argv[i+1], strlen(argv[i+1])); i++; } } if (!strncmp(argument, "-v",2) || !strncmp(argument, "--version",9)) { printf("%s version %s\n",argv[0],VERSION); exit(0); } if (!strncmp(argument, "-b",2) || !strncmp(argument, "--bright",13)) { bright=1; } if (!strncmp(argument, "-h",2) || !strncmp(argument, "--help",6)) { printf(" %s version %s\n (c)2007 Mike Lampard\n\n",argv[0],VERSION); printf(" -a or --activate <minutes> - cause DPMS to be activated in <minutes> if no activity.\n"); printf(" By default, %s will simply monitor DPMS status, and\n",argv[0]); printf(" requires a screensaver to activate. \n"); printf(" In this mode, no screensver is needed.\n"); printf(" %s will shut the monitor down on its own after <minutes>\n",argv[0]); printf(" with no keyboard or mouse activity.\n"); printf(" -e or --cmd-enable <cmd to run> - Run program <cmd> when DPMS is activated.\n\n"); printf(" -d or --cmd-disable <cmd to run> - Run program <cmd> when DPMS is de-activated.\n\n"); printf(" -b or --bright - When the keyboard is woken up, set the LEDs to bright.\n\n"); printf(" -v or --version - Show program version\n\n"); printf(" -h or --help - This page\n\n"); exit(0); } } dpy = XOpenDisplay(getenv("DISPLAY")); if (!dpy) { printf("Unable to open display %s - exiting\n",getenv("DISPLAY")); return 1; } do { if((g15screen_fd = new_g15_screen(G15_G15RBUF))<0){ printf("Sorry, cant connect to the G15daemon - retrying\n"); sleep(2); } }while(g15screen_fd<0); if (!DPMSQueryExtension (dpy, &event, &error)) { printf ("XDPMS extension not supported.\n"); return 1; } if (!DPMSCapable(dpy)) { printf("DPMS is not enabled... exiting\n"); return 1; } if (dpms_timeout>0) { DPMSEnable(dpy); DPMSSetTimeouts(dpy,dpms_timeout*60,dpms_timeout*60,0); } new_action.sa_handler = sighandler; new_action.sa_flags = 0; sigaction(SIGINT, &new_action, NULL); sigaction(SIGQUIT, &new_action, NULL); while(!leaving) { int fg_check = g15_send_cmd (g15screen_fd, G15DAEMON_IS_FOREGROUND, dummy); if (! DPMSInfo (dpy, &power, &enabled)) { printf ("unable to get DPMS state.\n"); return 1; } switch(power) { case DPMSModeOn: { if (lights == False) { change = 1; fork_child(enable_cmd); } lights = True; break; } case DPMSModeStandby: case DPMSModeSuspend: case DPMSModeOff: { if(lights == True){ change = 1; fork_child(disable_cmd); } lights = False; break; } } if (fg_check==1 && lights == True && change == 0) { // foreground g15_send_cmd (g15screen_fd, G15DAEMON_SWITCH_PRIORITIES, dummy); } if(change) { toggle_g15lights(g15screen_fd,lights,fg_check); change=0; } sleep (1); } close(g15screen_fd); if(enable_cmd!=NULL) free(enable_cmd); if(disable_cmd!=NULL) free(disable_cmd); XCloseDisplay(dpy); return 0; }
int main(int argc, char** argv) { int verbose = 0, bg = 0; int i, ev, er; char *lock_cmd = "xlock"; char *flag_file = NULL; char estr[100], cmd[500]; struct stat sbuf; CARD16 power; CARD16 desired = DPMSModeOff; BOOL state; /* setup the lock command. it may be reset by -lock below. */ if (getenv("XLOCK_CMD")) { lock_cmd = (char *) getenv("XLOCK_CMD"); } /* process cmd line: */ for (i=1; i<argc; i++) { if (!strcmp(argv[i], "-display")) { sprintf(estr, "DISPLAY=%s", argv[++i]); putenv(strdup(estr)); } else if (!strcmp(argv[i], "-auth")) { sprintf(estr, "XAUTHORITY=%s", argv[++i]); putenv(strdup(estr)); } else if (!strcmp(argv[i], "-lock")) { lock_cmd = argv[++i]; } else if (!strcmp(argv[i], "-f")) { flag_file = argv[++i]; unlink(flag_file); } else if (!strcmp(argv[i], "-grab")) { grab = 1; } else if (!strcmp(argv[i], "-bg")) { bg = 1; } else if (!strcmp(argv[i], "-v")) { verbose = 1; } else if (!strcmp(argv[i], "-standby")) { desired = DPMSModeStandby; } else if (!strcmp(argv[i], "-suspend")) { desired = DPMSModeSuspend; } else if (!strcmp(argv[i], "-off")) { desired = DPMSModeOff; } } /* we want it to go into background to avoid blocking, so add '&'. */ strcpy(cmd, lock_cmd); strcat(cmd, " &"); lock_cmd = cmd; /* close any file descriptors we may have inherited (e.g. port 5900) */ for (i=3; i<=100; i++) { close(i); } /* open DISPLAY */ dpy = XOpenDisplay(NULL); if (! dpy) { fprintf(stderr, "XOpenDisplay failed.\n"); exit(1); } /* check for DPMS extension */ if (! DPMSQueryExtension(dpy, &ev, &er)) { fprintf(stderr, "DPMSQueryExtension failed.\n"); exit(1); } if (! DPMSCapable(dpy)) { fprintf(stderr, "DPMSCapable failed.\n"); exit(1); } /* make sure DPMS is enabled */ if (! DPMSEnable(dpy)) { fprintf(stderr, "DPMSEnable failed.\n"); exit(1); } /* retrieve the timeouts for later resetting */ if (! DPMSGetTimeouts(dpy, &standby, &suspend, &off)) { fprintf(stderr, "DPMSGetTimeouts failed.\n"); exit(1); } if (! standby || ! suspend || ! off) { /* if none, set to some reasonable values */ standby = 900; suspend = 1200; off = 1800; } if (verbose) { fprintf(stderr, "DPMS timeouts: %d %d %d\n", standby, suspend, off); } /* now set them to very small values */ if (desired == DPMSModeOff) { if (! DPMSSetTimeouts(dpy, 1, 1, 1)) { fprintf(stderr, "DPMSSetTimeouts failed.\n"); exit(1); } } else if (desired == DPMSModeSuspend) { if (! DPMSSetTimeouts(dpy, 1, 1, 0)) { fprintf(stderr, "DPMSSetTimeouts failed.\n"); exit(1); } } else if (desired == DPMSModeStandby) { if (! DPMSSetTimeouts(dpy, 1, 0, 0)) { fprintf(stderr, "DPMSSetTimeouts failed.\n"); exit(1); } } XFlush(dpy); /* set handlers for clean up in case we terminate via signal */ signal(SIGHUP, reset); signal(SIGINT, reset); signal(SIGQUIT, reset); signal(SIGABRT, reset); signal(SIGTERM, reset); /* force state into DPMS Off (lowest power) mode */ if (! DPMSForceLevel(dpy, desired)) { fprintf(stderr, "DPMSForceLevel failed.\n"); exit(1); } XFlush(dpy); /* read state */ msleep(500); if (! DPMSInfo(dpy, &power, &state)) { fprintf(stderr, "DPMSInfo failed.\n"); exit(1); } fprintf(stderr, "power: %d state: %d\n", power, state); /* grab display if desired. NOT WORKING */ if (grab) { if (verbose) { fprintf(stderr, "calling XGrabServer()\n"); } XGrabServer(dpy); } /* go into background if desired. */ if (bg) { pid_t p; if ((p = fork()) != 0) { if (p < 0) { fprintf(stderr, "problem forking.\n"); exit(1); } else { /* XXX no fd closing */ exit(0); } } } /* main loop: */ while (1) { /* reassert DPMSModeOff (desired) */ if (verbose) fprintf(stderr, "reasserting desired DPMSMode\n"); DPMSForceLevel(dpy, desired); XFlush(dpy); /* wait a bit */ msleep(200); /* check for flag file appearence */ if (flag_file && stat(flag_file, &sbuf) == 0) { if (verbose) { fprintf(stderr, "flag found: %s\n", flag_file); } unlink(flag_file); reset(0); exit(0); } /* check state and power level */ if (! DPMSInfo(dpy, &power, &state)) { fprintf(stderr, "DPMSInfo failed.\n"); reset(0); exit(1); } if (verbose) { fprintf(stderr, "power: %d state: %d\n", power, state); } if (!state || power != desired) { /* Someone (or maybe a cat) is evidently watching... */ fprintf(stderr, "DPMS CHANGE: power: %d state: %d\n", power, state); break; } } reset(0); fprintf(stderr, "locking screen with command: \"%s\"\n", lock_cmd); system(lock_cmd); exit(0); }