xenocara/app/fvwm/extras/FvwmScript/Widgets/Swallow.c

159 lines
3.7 KiB
C

#include "Tools.h"
extern int fd[2];
/***********************************************/
/* Fonction pour Swallow */
/***********************************************/
void DrawRelief(struct XObj *xobj)
{
XSegment segm[2];
int i;
if (xobj->value!=0)
{
for (i=1;i<4;i++)
{
segm[0].x1=xobj->x-i;
segm[0].y1=xobj->y-i;
segm[0].x2=xobj->x+xobj->width+i-2;
segm[0].y2=xobj->y-i;
segm[1].x1=xobj->x-i;
segm[1].y1=xobj->y-i;
segm[1].x2=xobj->x-i;
segm[1].y2=xobj->y+xobj->height+i-2;
if (xobj->value==-1)
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[shad].pixel);
else
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[li].pixel);
XDrawSegments(xobj->display,*xobj->ParentWin,xobj->gc,segm,2);
segm[0].x1=xobj->x-i;
segm[0].y1=xobj->y+xobj->height+i-1;
segm[0].x2=xobj->x+xobj->width+i-1;
segm[0].y2=xobj->y+xobj->height+i-1;
segm[1].x1=xobj->x+xobj->width+i-1;
segm[1].y1=xobj->y-i;
segm[1].x2=xobj->x+xobj->width+i-1;
segm[1].y2=xobj->y+xobj->height+i-1;
if (xobj->value==-1)
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[li].pixel);
else
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[shad].pixel);
XDrawSegments(xobj->display,*xobj->ParentWin,xobj->gc,segm,2);
}
}
}
void InitSwallow(struct XObj *xobj)
{
unsigned long mask;
XSetWindowAttributes Attr;
/* Enregistrement des couleurs et de la police */
MyAllocNamedColor(xobj->display,*xobj->colormap,xobj->forecolor,&xobj->TabColor[fore]);
MyAllocNamedColor(xobj->display,*xobj->colormap,xobj->backcolor,&xobj->TabColor[back]);
MyAllocNamedColor(xobj->display,*xobj->colormap,xobj->licolor,&xobj->TabColor[li]);
MyAllocNamedColor(xobj->display,*xobj->colormap,xobj->shadcolor,&xobj->TabColor[shad]);
MyAllocNamedColor(xobj->display,*xobj->colormap,"#000000",&xobj->TabColor[black]);
MyAllocNamedColor(xobj->display,*xobj->colormap,"#FFFFFF",&xobj->TabColor[white]);
mask=0;
xobj->win=XCreateWindow(xobj->display,*xobj->ParentWin,
-1000,-1000,xobj->width,xobj->height,0,
CopyFromParent,InputOutput,CopyFromParent,
mask,&Attr);
/* Redimensionnement du widget */
if (xobj->height<30)
xobj->height=30;
if (xobj->width<30)
xobj->width=30;
if (xobj->swallow!=NULL)
{
SendText(fd,xobj->swallow,0);
}
else
fprintf(stderr,"Error\n");
}
void DestroySwallow(struct XObj *xobj)
{
XSetCloseDownMode(xobj->display,DestroyAll);
/* Arrete le programme swallow */
if (xobj->win!=None)
XKillClient(xobj->display, xobj->win);
}
void DrawSwallow(struct XObj *xobj)
{
DrawRelief(xobj);
}
void EvtMouseSwallow(struct XObj *xobj,XButtonEvent *EvtButton)
{
}
void EvtKeySwallow(struct XObj *xobj,XKeyEvent *EvtKey)
{
}
/* Recupere le pointeur de la fenetre Swallow */
void CheckForHangon(struct XObj *xobj,unsigned long *body)
{
char *cbody;
cbody=(char*)calloc(100,sizeof(char));
sprintf(cbody,"%s",(char *)&body[3]);
if(strcmp(cbody,xobj->title)==0)
{
xobj->win = (Window)body[0];
free(xobj->title);
xobj->title=(char*)calloc(sizeof(char),20);
sprintf(xobj->title,"No window");
XUnmapWindow(xobj->display,xobj->win);
XSetWindowBorderWidth(xobj->display,xobj->win,0);
}
free(cbody);
}
void swallow(struct XObj *xobj,unsigned long *body)
{
if(xobj->win == (Window)body[0])
{
XReparentWindow(xobj->display,xobj->win,*xobj->ParentWin,xobj->x,xobj->y);
XResizeWindow(xobj->display,xobj->win,xobj->width,xobj->height);
XMapWindow(xobj->display,xobj->win);
}
}
void ProcessMsgSwallow(struct XObj *xobj,unsigned long type,unsigned long *body)
{
switch(type)
{
case M_MAP:
swallow(xobj,body);
break;
case M_RES_NAME:
break;
case M_RES_CLASS:
break;
case M_WINDOW_NAME:
CheckForHangon(xobj,body);
break;
default:
break;
}
}