/*
* LED biff for X
* blinks scroll lock LED when new mail
*
* version 1.0
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <signal.h>
#include <X11/X.h>
#include <X11/Xlib.h>
#define FALSE 0
#define TRUE 1
#define SCRL_LED 3
#define SLEEPTIME 10
Display *dpy;
char mbox_name[50];
int mbox_size, mbox_flag, read_since_last_write;
void set_led(int mode)
{
XKeyboardControl kbd;
kbd.led = SCRL_LED;
kbd.led_mode = mode;
XChangeKeyboardControl(dpy, KBLed | KBLedMode, &kbd);
XFlush(dpy);
}
void blink(void)
{
int i;
for (i = 0; i < SLEEPTIME; i++) {
set_led(LedModeOn);
usleep(500000);
set_led(LedModeOff);
usleep(500000);
}
}
int check_mailbox(void)
{
struct stat st;
int i, n;
if (stat (mbox_name, &st) == 0) {
mbox_size = st.st_size;
read_since_last_write = (st.st_atime > st.st_mtime);
}
if (mbox_size == 0)
return FALSE;
else if (read_since_last_write)
return FALSE;
else
return TRUE;
}
void cleanup(int sig)
{
XCloseDisplay(dpy);
raise(sig);
}
void init(void)
{
char *p;
if (! (p = getenv("MAIL"))) {
printf("Error: environment variable MAIL not set.\n");
exit(1);
}
strcpy(mbox_name, p);
signal(SIGTERM, cleanup);
dpy = XOpenDisplay(NULL);
set_led(LedModeOff);
}
void main(void)
{
init();
while (1) {
if (check_mailbox())
blink();
else
sleep(SLEEPTIME);
}
}