/*
* Flashes root window when RING modem status detected
*
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <signal.h>
#include <sys/stat.h>
#include <linux/serial.h>
#include <X11/X.h>
#include <X11/Xlib.h>

#define FALSE 0
#define TRUE 1

#define FLASH_BG   0xff0000
#define DEFAULT_BG 0x00008b

#define CAPS_LED 1
#define SLEEPTIME 10

Display *dpy;
Window win;

unsigned long old_fg;
int tty;


void flash(void)
{
       int i;

       for (i = 0; i < SLEEPTIME; i++) {
               XSetWindowBackground(dpy, win, FLASH_BG);
               XClearWindow(dpy, win);
               XFlush(dpy);
               usleep(500000);
               XSetWindowBackground(dpy, win, DEFAULT_BG);
               XClearWindow(dpy, win);
               XFlush(dpy);
               usleep(500000);
       }
}


void cleanup(int sig)
{
       XSetWindowBackground(dpy, win, DEFAULT_BG);
       XClearWindow(dpy, win);
       XFlush(dpy);
       XCloseDisplay(dpy);
       close(tty);
       raise(sig);
}


void init(void)
{
       XGCValues gcv;

       if ((tty = open("/dev/cua3", O_RDWR)) == -1) {
               perror("open");
               exit(1);
       }
       signal(SIGTERM, cleanup);
       dpy = XOpenDisplay(NULL);
       win = RootWindow(dpy, 0);
}


void main(void)
{
       int old_count;
       struct serial_icounter_struct cs;

       init();

       ioctl(tty, TIOCGICOUNT, &cs);
       old_count = cs.rng;

       while(1) {
               ioctl(tty, TIOCGICOUNT, &cs);
               if(cs.rng != old_count) {
                       flash();
                       old_count = cs.rng;
               } else
                       usleep(500000);
       }
}