/*
* 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);
}
}