static void init_mit_saver_extension (saver_info *si) { int i; Pixmap *blank_pix = (Pixmap *) calloc (sizeof(Pixmap), si->nscreens); for (i = 0; i < si->nscreens; i++) { saver_screen_info *ssi = &si->screens[i]; XID kill_id = 0; Atom kill_type = 0; Window root = RootWindowOfScreen (ssi->screen); blank_pix[i] = XCreatePixmap (si->dpy, root, 1, 1, 1); /* Kill off the old MIT-SCREEN-SAVER client if there is one. This tends to generate X errors, though (possibly due to a bug in the server extension itself?) so just ignore errors here. */ if (XScreenSaverGetRegistered (si->dpy, XScreenNumberOfScreen (ssi->screen), &kill_id, &kill_type) && kill_id != blank_pix[i]) { XErrorHandler old_handler = XSetErrorHandler (ignore_all_errors_ehandler); XKillClient (si->dpy, kill_id); XSync (si->dpy, False); XSetErrorHandler (old_handler); } XScreenSaverSelectInput (si->dpy, root, ScreenSaverNotifyMask); XScreenSaverRegister (si->dpy, XScreenNumberOfScreen (ssi->screen), (XID) blank_pix[i], XA_PIXMAP); } free(blank_pix); }
EAPI void ecore_x_screensaver_event_listen_set(Eina_Bool on) { #ifdef ECORE_XSS Ecore_X_Window root; LOGFN(__FILE__, __LINE__, __FUNCTION__); root = DefaultRootWindow(_ecore_x_disp); if (on) XScreenSaverSelectInput(_ecore_x_disp, root, ScreenSaverNotifyMask); else XScreenSaverSelectInput(_ecore_x_disp, root, 0); #else return; on = EINA_FALSE; #endif /* ifdef ECORE_XSS */ }
static void screenSaverSetXScreenSaver( CompDisplay *d, Bool enable ) { SCREENSAVER_DISPLAY(d); if( enable && !sd->XSScontext.init ) { int dummy; if( !XScreenSaverQueryExtension(d->display, &sd->XSScontext.first_event, &dummy ) ) { compLogMessage ("screensaver", CompLogLevelWarn, "XScreenSaver Extension not available"); return; } sd->XSScontext.init = True; XGetScreenSaver( d->display, &sd->XSScontext.timeout, &sd->XSScontext.interval, \ &sd->XSScontext.prefer_blanking, &sd->XSScontext.allow_exposures); XSetScreenSaver( d->display, (int)(screensaverGetAfter(d)*60.0), sd->XSScontext.interval, 0, AllowExposures); Window root = DefaultRootWindow (d->display); XSetWindowAttributes attr; int mask = 0; XScreenSaverSetAttributes( d->display,root, -100,-100,1,1,0 ,CopyFromParent,CopyFromParent,CopyFromParent,mask,&attr); XScreenSaverSelectInput( d->display, root, ScreenSaverNotifyMask ); } if( !enable && sd->XSScontext.init ) { sd->XSScontext.init = False; XSetScreenSaver( d->display, sd->XSScontext.timeout, sd->XSScontext.interval, \ sd->XSScontext.prefer_blanking, sd->XSScontext.allow_exposures); Window root = DefaultRootWindow (d->display); XScreenSaverSelectInput( d->display, root, 0 ); XScreenSaverUnsetAttributes( d->display, root ); } }
static void ExtInitSS(int available) { if (!available) return; if (EDebug(EDBUG_TYPE_VERBOSE)) { XScreenSaverInfo *xssi = XScreenSaverAllocInfo(); XScreenSaverQueryInfo(disp, WinGetXwin(VROOT), xssi); Eprintf(" Screen saver window=%#lx\n", xssi->window); XFree(xssi); } XScreenSaverSelectInput(disp, WinGetXwin(VROOT), ScreenSaverNotifyMask | ScreenSaverCycleMask); }
int main(int argc, char *argv[]) { XEvent ev; struct sigaction act = { }; int evbase, errbase; if (argc < 2) errx(2, "usage: xssstart command [argument ...]\n"); if ((dpy = XOpenDisplay(NULL)) == NULL) errx(1, "no display"); atexit(closedisplay); if (!XScreenSaverQueryExtension(dpy, &evbase, &errbase)) errx(1, "X11 extension MIT-SCREEN-SAVER not supported"); XSetErrorHandler(eh); XScreenSaverSelectInput(dpy, DefaultRootWindow(dpy), ScreenSaverNotifyMask); act.sa_handler = sigchld; act.sa_flags = SA_NOCLDSTOP | SA_RESTART; if (sigaction(SIGCHLD, &act, NULL) == -1) err(1, "sigaction"); while (XNextEvent(dpy, &ev) == 0) { if (((XScreenSaverNotifyEvent *)&ev)->state == ScreenSaverOn && child == 0) { switch ((child = fork())) { case -1: err(1, "fork"); case 0: execvp(argv[1], argv + 1); dpy = NULL; err(1, "exec"); } } } return 0; }
// =================================== // main... // ----------------------------------- int main (int argc,char *argv[]) { XSetWindowAttributes attr; Display* dpy; Window root; char mydisp [256] = ""; int fg = 0; int screen; int c; // ============================ // get commandline options... // ---------------------------- while (1) { int option_index = 0; static struct option long_options[] = { {"display" , 1 , 0 , 'd'}, {"pid" , 1 , 0 , 'p'}, {"help" , 0 , 0 , 'h'}, {"timeout" , 1 , 0 , 't'}, {"foreground" , 0 , 0 , 'f'}, {"output" , 0 , 0 , 'o'}, {0 , 0 , 0 , 0 } }; c = getopt_long ( argc, argv, "hd:p:t:fo",long_options, &option_index ); if (c == -1) break; switch (c) { case 'h': usage(); exit(0); case 't': timeout = atoi(optarg); break; case 'd': strcpy(mydisp,optarg); break; case 'p': pid = atoi(optarg); break; case 'o': output = 1; break; case 'f': fg = 1; break; default: usage(); exit(1); } } // prove pid... // -------------- if (pid == 0) { printf("xidle: no valid pid defined\n"); exit(1); } // open display... // ------------------ if (strcmp(mydisp,"") == 0) { dpy = XOpen("null"); } else { dpy = XOpen(mydisp); } if (dpy == NULL) { printf("xidle: unable to open display: %s\n",mydisp); exit(1); } // go for daemon... // ----------------- if (fg == 0) { daemon(1,0); } // install signal handler... // -------------------------- signal( SIGHUP , handlesighup ); signal( SIGCHLD , handlesigchld ); signal( SIGTRAP , timerstatus ); signal( SIGCONT , handlesigreset ); // default window is the root window... // ------------------------------------- root = DefaultRootWindow(dpy); screen = DefaultScreen(dpy); // look if the MIT extension is available... // ------------------------------------------- if (!XScreenSaverQueryExtension (dpy, &ss_event, &ss_error)) { exit(1); } XScreenSaverSelectInput (dpy, root, ScreenSaverNotifyMask); XSync (dpy, False); // select keyboard for press and release... // ------------------------------------------ attr.event_mask = KeyPressMask | PointerMotionMask; XSelectInput(dpy, DefaultRootWindow(dpy), attr.event_mask); // set internal screen saver timeout... // --------------------------------------- timersignal(); setsaver(dpy,timeout); while(1) { XEvent event; XScreenSaverNotifyEvent *sevent; XNextEvent (dpy, &event); // ========================================== // reset timer for pointer motion events... // ------------------------------------------ if (event.type == MotionNotify) { triggerreset(); } // ===================================================== // reset timer for keyevents differently from Escape... // ----------------------------------------------------- else if (event.type == KeyPress) { XKeyEvent *e = (XKeyEvent*)&event; if (e->keycode == ESC) { Exit(); } else { triggerreset(); } } // ========================================== // catch screen saver event... // ------------------------------------------ else if (event.type == ss_event) { sevent = (XScreenSaverNotifyEvent *) &event; if (sevent->state == ScreenSaverOn) { // get screen saver event... // -------------------------- Exit(); } } // ============================================== // put back event to the queue if not handled... // ---------------------------------------------- else { XPutBackEvent(dpy,&event); } } XCloseDisplay(dpy); return(0); }