xenocara/app/fvwm/modules/FvwmAuto/FvwmAuto.c

175 lines
4.5 KiB
C

/* This module, and the entire FvwmAuto program, and the concept for
* interfacing this module to the Window Manager, are all original work
* by Robert Nation
*
* Copyright 1994, Robert Nation. No guarantees or warantees or anything
* are provided or implied in any way whatsoever. Use this program at your
* own risk. Permission to use this program for any purpose is given,
* as long as the copyright is kept intact.
*
* reworked by A.Kadlec (albrecht@auto.tuwien.ac.at) 09/96
* to support an arbitrary enter_fn & leave_fn (command line arguments)
* completely reworked, while I was there.
*
* Modified by John Aughey (jha@cs.purdue.edu) 11/96
* to not perform any action when entering the root window
*
* Minor patch by C. Hines 12/96.
*
*/
#define TRUE 1
#define FALSE
#include "config.h"
#ifdef HAVE_SYS_BSDTYPES_H
#include <sys/bsdtypes.h> /* Saul */
#endif
#include <stdio.h>
#include <signal.h>
#include <fcntl.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/time.h>
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
#include <unistd.h>
#include <ctype.h>
#include <stdlib.h>
#include "../../fvwm/module.h"
#include "../../libs/fvwmlib.h"
/***********************************************************************
*
* Procedure:
* SIGPIPE handler - SIGPIPE means fvwm is dying
*
***********************************************************************/
void DeadPipe(int nonsense)
{
exit(0);
}
/***********************************************************************
*
* Procedure:
* main - start of module
*
***********************************************************************/
int main(int argc, char **argv)
{
char *enter_fn="Raise", /* default */
*leave_fn=NULL,
mask_mesg[80];
unsigned long header[HEADER_SIZE],
*body,
last_win = 0, /* last window handled */
focus_win = 0; /* current focus */
int fd_width,
fd[2],
timeout,sec = 0,usec = 0;
struct timeval value,
*delay;
fd_set in_fdset;
if(argc < 7 || argc > 9)
{
fprintf(stderr,"FvwmAuto can use one to three arguments.\n");
exit(1);
}
/* Dead pipes mean fvwm died */
signal (SIGPIPE, DeadPipe);
fd[0] = atoi(argv[1]);
fd[1] = atoi(argv[2]);
if ((timeout = atoi(argv[6])))
{
sec = timeout / 1000;
usec = (timeout % 1000) * 1000;
delay=&value;
} else
delay=NULL;
if (argv[7]) /* if specified */
{
if (*argv[7] && !StrEquals(argv[7],"NOP")) /* not empty */
enter_fn=argv[7]; /* override default */
else
enter_fn=NULL; /* nop */
if (argv[8] && *argv[8] && !StrEquals(argv[8],"NOP"))
/* leave function specified */
leave_fn=argv[8];
}
#ifdef DEBUG
fprintf(stderr,"[FvwmAuto]: timeout: %d EnterFn: >%s< LeaveFn: >%s<\n",timeout,enter_fn,leave_fn);
#endif
fd_width = GetFdWidth();
sprintf(mask_mesg,"SET_MASK %lu\n",(unsigned long)(M_FOCUS_CHANGE));
SendInfo(fd,mask_mesg,0);
while(1)
{
FD_ZERO(&in_fdset);
FD_SET(fd[1],&in_fdset);
if (delay) /* fill in struct - modified by select() */
{
delay->tv_sec = sec;
delay->tv_usec = usec;
}
select(fd_width, SELECT_TYPE_ARG234 &in_fdset, 0, 0,
(focus_win == last_win) ? NULL : delay);
#ifdef DEBUG
fprintf(stderr,"[FvwmAuto]: after select: focus_win: 0x%08lx, last_win: 0x%08lx\n",focus_win, last_win);
fprintf(stderr,"[FvwmAuto]: after select: delay: 0x%08lx, delay struct: %d.%06d sec\n",delay,delay->tv_sec,delay->tv_usec);
#endif
if (FD_ISSET(fd[1], &in_fdset) &&
ReadFvwmPacket(fd[1],header, &body) > 0)
{
focus_win = body[0];
free(body);
#ifdef DEBUG
fprintf(stderr,"[FvwmAuto]: M_FOCUS_CHANGE to 0x%08lx\n",focus_win);
#endif
}
if (((FD_ISSET(fd[1], &in_fdset)==0) == (delay!=NULL)) &&
/* new message and timeout==0 or */
/* no message and timeout>0 */
focus_win!=last_win) /* there's sth. to do */
{
if (last_win && leave_fn) /* if last_win isn't the root */
{
SendInfo(fd,leave_fn,last_win);
#ifdef DEBUG
fprintf(stderr,"[FvwmAuto]: executing %s on window 0x%08lx\n",leave_fn,focus_win);
#endif
}
if (focus_win && enter_fn) /* if focus_win isn't the root */
{
SendInfo(fd,enter_fn,focus_win);
#ifdef DEBUG
fprintf(stderr,"[FvwmAuto]: executing %s on window 0x%08lx\n",enter_fn,focus_win);
#endif
}
last_win = focus_win; /* switch to wait mode again */
}
}
return 0;
}