xenocara/app/fvwm/extras/FvwmDebug/FvwmDebug.c

540 lines
15 KiB
C
Raw Normal View History

/* This module, and the entire FvwmDebug 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. */
#include "config.h"
#include <stdio.h>
#include <signal.h>
#include <fcntl.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <unistd.h>
#include <ctype.h>
#include <stdlib.h>
#include "../../fvwm/module.h"
#include "FvwmDebug.h"
char *MyName;
int fd_width;
int fd[2];
/*
** spawn_xtee - code to execute xtee from a running executable &
** redirect stdout & stderr to it. Currently sends both to same xtee,
** but you rewrite this to spawn off 2 xtee's - one for each stream.
*/
pid_t spawn_xtee(void)
{
pid_t pid;
int PIPE[2];
char *argarray[256];
setvbuf(stdout,NULL,_IOLBF,0); /* line buffered */
if (pipe(PIPE))
{
perror("spawn_xtee");
fprintf(stderr, "ERROR ERRATA -- Failed to create pipe for xtee.\n");
return 0;
}
argarray[0] = "xtee";
argarray[1] = "-nostdout";
argarray[2] = NULL;
if (!(pid = fork())) /* child */
{
dup2(PIPE[0], STDIN_FILENO);
close(PIPE[0]);
close(PIPE[1]);
execvp("xtee",argarray);
exit(1); /* shouldn't get here... */
}
else /* parent */
{
if (ReapChildrenPid(pid) != pid)
{
dup2(PIPE[1], STDOUT_FILENO);
dup2(PIPE[1], STDERR_FILENO);
close(PIPE[0]);
close(PIPE[1]);
}
}
return pid;
} /* spawn_xtee */
/***********************************************************************
*
* Procedure:
* main - start of module
*
***********************************************************************/
int main(int argc, char **argv)
{
char *temp, *s;
/* Save our program name - for error messages */
temp = argv[0];
s=strrchr(argv[0], '/');
if (s != NULL)
temp = s + 1;
MyName = safemalloc(strlen(temp)+2);
strcpy(MyName,"*");
strcat(MyName, temp);
if((argc != 6)&&(argc != 7))
{
fprintf(stderr,"%s Version %s should only be executed by fvwm!\n",MyName,
VERSION);
exit(1);
}
/* Dead pipe == Fvwm died */
signal (SIGPIPE, DeadPipe);
fd[0] = atoi(argv[1]);
fd[1] = atoi(argv[2]);
#if 0
spawn_xtee();
#endif
/* Data passed in command line */
fprintf(stderr,"Application Window 0x%s\n",argv[4]);
fprintf(stderr,"Application Context %s\n",argv[5]);
fd_width = GetFdWidth();
/* Create a list of all windows */
/* Request a list of all windows,
* wait for ConfigureWindow packets */
SendInfo(fd,"Send_WindowList",0);
Loop(fd);
return 0;
}
/***********************************************************************
*
* Procedure:
* Loop - wait for data to process
*
***********************************************************************/
void Loop(int *fd)
{
unsigned long header[3], *body;
while(1)
{
if(ReadFvwmPacket(fd[1],header,&body) > 0)
{
process_message(header[1],body);
free(body);
}
}
}
/***********************************************************************
*
* Procedure:
* Process message - examines packet types, and takes appropriate action
*
***********************************************************************/
void process_message(unsigned long type,unsigned long *body)
{
switch(type)
{
case M_ADD_WINDOW:
list_add(body);
case M_CONFIGURE_WINDOW:
list_configure(body);
break;
case M_DESTROY_WINDOW:
list_destroy(body);
break;
case M_FOCUS_CHANGE:
list_focus(body);
break;
case M_NEW_PAGE:
list_new_page(body);
break;
case M_NEW_DESK:
list_new_desk(body);
break;
case M_RAISE_WINDOW:
list_raise(body);
break;
case M_LOWER_WINDOW:
list_lower(body);
break;
case M_ICONIFY:
list_iconify(body);
break;
case M_MAP:
list_map(body);
break;
case M_ICON_LOCATION:
list_icon_loc(body);
break;
case M_DEICONIFY:
list_deiconify(body);
break;
case M_WINDOW_NAME:
list_window_name(body);
break;
case M_ICON_NAME:
list_icon_name(body);
break;
case M_RES_CLASS:
list_class(body);
break;
case M_RES_NAME:
list_res_name(body);
break;
case M_END_WINDOWLIST:
list_end();
break;
case M_DEFAULTICON:
case M_ICON_FILE:
default:
list_unknown(body);
break;
}
}
/***********************************************************************
*
* Procedure:
* SIGPIPE handler - SIGPIPE means fvwm is dying
*
***********************************************************************/
void DeadPipe(int nonsense)
{
fprintf(stderr,"FvwmDebug: DeadPipe\n");
exit(0);
}
/***********************************************************************
*
* Procedure:
* list_add - displays packet contents to stderr
*
***********************************************************************/
void list_add(unsigned long *body)
{
fprintf(stderr,"Add Window\n");
fprintf(stderr,"\t ID %lx\n",body[0]);
fprintf(stderr,"\t frame ID %lx\n",body[1]);
fprintf(stderr,"\t fvwm ptr %lx\n",body[2]);
fprintf(stderr,"\t frame x %ld\n",(long)body[3]);
fprintf(stderr,"\t frame y %ld\n",(long)body[4]);
fprintf(stderr,"\t frame w %ld\n",(long)body[5]);
fprintf(stderr,"\t frame h %ld\n",(long)body[6]);
fprintf(stderr,"\t desk %ld\n",(long)body[7]);
fprintf(stderr,"\t flags %lx\n",body[8]);
fprintf(stderr,"\t title height %ld\n",(long)body[9]);
fprintf(stderr,"\t border width %ld\n",(long)body[10]);
fprintf(stderr,"\t window base width %ld\n",(long)body[11]);
fprintf(stderr,"\t window base height %ld\n",(long)body[12]);
fprintf(stderr,"\t window resize width increment %ld\n",(long)body[13]);
fprintf(stderr,"\t window resize height increment %ld\n",(long)body[14]);
fprintf(stderr,"\t window min width %ld\n",(long)body[15]);
fprintf(stderr,"\t window min height %ld\n",(long)body[16]);
fprintf(stderr,"\t window max %ld\n",(long)body[17]);
fprintf(stderr,"\t window max %ld\n",(long)body[18]);
fprintf(stderr,"\t icon label window %lx\n",body[19]);
fprintf(stderr,"\t icon pixmap window %lx\n",body[20]);
fprintf(stderr,"\t window gravity %lx\n",body[21]);
}
/***********************************************************************
*
* Procedure:
* list_configure - displays packet contents to stderr
*
***********************************************************************/
void list_configure(unsigned long *body)
{
fprintf(stderr,"Configure Window\n");
fprintf(stderr,"\t ID %lx\n",body[0]);
fprintf(stderr,"\t frame ID %lx\n",body[1]);
fprintf(stderr,"\t fvwm ptr %lx\n",body[2]);
fprintf(stderr,"\t frame x %ld\n",(long)body[3]);
fprintf(stderr,"\t frame y %ld\n",(long)body[4]);
fprintf(stderr,"\t frame w %ld\n",(long)body[5]);
fprintf(stderr,"\t frame h %ld\n",(long)body[6]);
fprintf(stderr,"\t desk %ld\n",(long)body[7]);
fprintf(stderr,"\t flags %lx\n",body[8]);
fprintf(stderr,"\t title height %ld\n",(long)body[9]);
fprintf(stderr,"\t border width %ld\n",(long)body[10]);
fprintf(stderr,"\t window base width %ld\n",(long)body[11]);
fprintf(stderr,"\t window base height %ld\n",(long)body[12]);
fprintf(stderr,"\t window resize width increment %ld\n",(long)body[13]);
fprintf(stderr,"\t window resize height increment %ld\n",(long)body[14]);
fprintf(stderr,"\t window min width %ld\n",(long)body[15]);
fprintf(stderr,"\t window min height %ld\n",(long)body[16]);
fprintf(stderr,"\t window max %ld\n",(long)body[17]);
fprintf(stderr,"\t window max %ld\n",(long)body[18]);
fprintf(stderr,"\t icon label window %lx\n",body[19]);
fprintf(stderr,"\t icon pixmap window %lx\n",body[20]);
fprintf(stderr,"\t window gravity %lx\n",body[21]);
}
/***********************************************************************
*
* Procedure:
* list_destroy - displays packet contents to stderr
*
***********************************************************************/
void list_destroy(unsigned long *body)
{
fprintf(stderr,"destroy\n");
fprintf(stderr,"\t ID %lx\n",body[0]);
fprintf(stderr,"\t frame ID %lx\n",body[1]);
fprintf(stderr,"\t fvwm ptr %lx\n",body[2]);
}
/***********************************************************************
*
* Procedure:
* list_focus - displays packet contents to stderr
*
***********************************************************************/
void list_focus(unsigned long *body)
{
fprintf(stderr,"focus\n");
fprintf(stderr,"\t ID %lx\n",body[0]);
fprintf(stderr,"\t frame ID %lx\n",body[1]);
fprintf(stderr,"\t fvwm ptr %lx\n",body[2]);
}
/***********************************************************************
*
* Procedure:
* list_new_page - displays packet contents to stderr
*
***********************************************************************/
void list_new_page(unsigned long *body)
{
fprintf(stderr,"new page\n");
fprintf(stderr,"\t x %ld\n",(long)body[0]);
fprintf(stderr,"\t y %ld\n",(long)body[1]);
fprintf(stderr,"\t desk %ld\n",(long)body[2]);
}
/***********************************************************************
*
* Procedure:
* list_new_desk - displays packet contents to stderr
*
***********************************************************************/
void list_new_desk(unsigned long *body)
{
fprintf(stderr,"new desk\n");
fprintf(stderr,"\t desk %ld\n",(long)body[0]);
}
/***********************************************************************
*
* Procedure:
* list_raise - displays packet contents to stderr
*
***********************************************************************/
void list_raise(unsigned long *body)
{
fprintf(stderr,"raise\n");
fprintf(stderr,"\t ID %lx\n",body[0]);
fprintf(stderr,"\t frame ID %lx\n",body[1]);
fprintf(stderr,"\t fvwm ptr %lx\n",body[2]);
}
/***********************************************************************
*
* Procedure:
* list_lower - displays packet contents to stderr
*
***********************************************************************/
void list_lower(unsigned long *body)
{
fprintf(stderr,"lower\n");
fprintf(stderr,"\t ID %lx\n",body[0]);
fprintf(stderr,"\t frame ID %lx\n",body[1]);
fprintf(stderr,"\t fvwm ptr %lx\n",body[2]);
}
/***********************************************************************
*
* Procedure:
* list_unknow - handles an unrecognized packet.
*
***********************************************************************/
void list_unknown(unsigned long *body)
{
fprintf(stderr,"Unknown packet type\n");
}
/***********************************************************************
*
* Procedure:
* list_iconify - displays packet contents to stderr
*
***********************************************************************/
void list_iconify(unsigned long *body)
{
fprintf(stderr,"iconify\n");
fprintf(stderr,"\t ID %lx\n",body[0]);
fprintf(stderr,"\t frame ID %lx\n",body[1]);
fprintf(stderr,"\t fvwm ptr %lx\n",body[2]);
fprintf(stderr,"\t icon x %ld\n",(long)body[3]);
fprintf(stderr,"\t icon y %ld\n",(long)body[4]);
fprintf(stderr,"\t icon w %ld\n",(long)body[5]);
fprintf(stderr,"\t icon h %ld\n",(long)body[6]);
}
/***********************************************************************
*
* Procedure:
* list_map - displays packet contents to stderr
*
***********************************************************************/
void list_map(unsigned long *body)
{
fprintf(stderr,"map\n");
fprintf(stderr,"\t ID %lx\n",body[0]);
fprintf(stderr,"\t frame ID %lx\n",body[1]);
fprintf(stderr,"\t fvwm ptr %lx\n",body[2]);
}
/***********************************************************************
*
* Procedure:
* list_icon_loc - displays packet contents to stderr
*
***********************************************************************/
void list_icon_loc(unsigned long *body)
{
fprintf(stderr,"icon location\n");
fprintf(stderr,"\t ID %lx\n",body[0]);
fprintf(stderr,"\t frame ID %lx\n",body[1]);
fprintf(stderr,"\t fvwm ptr %lx\n",body[2]);
fprintf(stderr,"\t icon x %ld\n",(long)body[3]);
fprintf(stderr,"\t icon y %ld\n",(long)body[4]);
fprintf(stderr,"\t icon w %ld\n",(long)body[5]);
fprintf(stderr,"\t icon h %ld\n",(long)body[6]);
}
/***********************************************************************
*
* Procedure:
* list_deiconify - displays packet contents to stderr
*
***********************************************************************/
void list_deiconify(unsigned long *body)
{
fprintf(stderr,"de-iconify\n");
fprintf(stderr,"\t ID %lx\n",body[0]);
fprintf(stderr,"\t frame ID %lx\n",body[1]);
fprintf(stderr,"\t fvwm ptr %lx\n",body[2]);
}
/***********************************************************************
*
* Procedure:
* list_window_name - displays packet contents to stderr
*
***********************************************************************/
void list_window_name(unsigned long *body)
{
fprintf(stderr,"window name\n");
fprintf(stderr,"\t ID %lx\n",body[0]);
fprintf(stderr,"\t frame ID %lx\n",body[1]);
fprintf(stderr,"\t fvwm ptr %lx\n",body[2]);
fprintf(stderr,"\t window name %s\n",(char *)(&body[3]));
}
/***********************************************************************
*
* Procedure:
* list_icon_name - displays packet contents to stderr
*
***********************************************************************/
void list_icon_name(unsigned long *body)
{
fprintf(stderr,"icon name\n");
fprintf(stderr,"\t ID %lx\n",body[0]);
fprintf(stderr,"\t frame ID %lx\n",body[1]);
fprintf(stderr,"\t fvwm ptr %lx\n",body[2]);
fprintf(stderr,"\t icon name %s\n",(char *)(&body[3]));
}
/***********************************************************************
*
* Procedure:
* list_class - displays packet contents to stderr
*
***********************************************************************/
void list_class(unsigned long *body)
{
fprintf(stderr,"window class\n");
fprintf(stderr,"\t ID %lx\n",body[0]);
fprintf(stderr,"\t frame ID %lx\n",body[1]);
fprintf(stderr,"\t fvwm ptr %lx\n",body[2]);
fprintf(stderr,"\t window class %s\n",(char *)(&body[3]));
}
/***********************************************************************
*
* Procedure:
* list_res_name - displays packet contents to stderr
*
***********************************************************************/
void list_res_name(unsigned long *body)
{
fprintf(stderr,"class resource name\n");
fprintf(stderr,"\t ID %lx\n",body[0]);
fprintf(stderr,"\t frame ID %lx\n",body[1]);
fprintf(stderr,"\t fvwm ptr %lx\n",body[2]);
fprintf(stderr,"\t resource name %s\n",(char *)(&body[3]));
}
/***********************************************************************
*
* Procedure:
* list_end - displays packet contents to stderr
*
***********************************************************************/
void list_end(void)
{
fprintf(stderr,"Send_WindowList End\n");
}