X11 Idle Time

Aus Ethersex_Wiki
Wechseln zu: Navigation, Suche

Am Anfang war das Problem ...

wir waren auf der Suche nach einem Programm, das die Zeit der Untätigkeit unter X11 (Xfree oder X.org) feststellt, um in Abhängigkeit davon dann bestimmte Aktionen ausführen zu lassen - oder eben nicht.

Leider gibt es sowas nur in Kombination mit einem Screensaver oder ähnlichem. Eine kleine Kommandozeilenapplikation, die diese Idletime abfrägt, gibts offenbar nicht ...

Die Abhilfe ...

Ein kleines C-Progrämmchen, das genau das macht: die XScreenSaver API fragen, wie lange der User schon den Rechner langweilt und diese Zeit auf stdout zur weiteren Verarbeitung ausgeben (in Millisekunden).

Um das Programm zu kompilieren:

 gcc xidletime.c -L/usr/X11R6/lib -lX11 -lXss -lXext -o xidletime

/*****************************************************************************
 *
 * xidletime
 *
 * derived from xautolock supplied by
 * Authors: Michel Eyckmans (MCE) & Stefan De Troch (SDT)
 *
 * --------------------------------------------------------------------------
 * 
 * Copyright 1990,1992-1999,2001-2002 by Stefan De Troch and Michel Eyckmans.
 * Copyright 2005 by Stefan Siegl <ssiegl@gmx.de>
 * 
 * Versions 2.0 and above of xautolock are available under version 2 of the
 * GNU GPL. 
 * 
 *****************************************************************************/

#include <X11/Xos.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#include <X11/Xresource.h>

#include <X11/extensions/scrnsaver.h>

#include <stdio.h>

int
main (int argc, char* argv[])
{
  Display* d;
  Time idleTime;
  static XScreenSaverInfo* mitInfo = 0; 

 /*
  *  Find out whether there actually is a server on the other side...
  */
  if (!(d = XOpenDisplay (0))) /* = intended */
  {
    fprintf (stderr, "Couldn't connect to %s\n", XDisplayName (0));
    return 1;
  }

  (void) XSync (d, 0);

  if (!mitInfo) mitInfo = XScreenSaverAllocInfo ();
  XScreenSaverQueryInfo (d, DefaultRootWindow (d), mitInfo);
  idleTime = mitInfo->idle;
  printf("%ld\n", idleTime);

  return 0;
}