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

573 lines
14 KiB
C
Raw Blame History

#include "Tools.h"
/***********************************************/
/* Fonction d'ecriture en relief */
/***********************************************/
void DrawString(Display *dpy,GC gc,Window win,int x,int y,char *str,
int strl,unsigned long ForeC,unsigned long HiC,
unsigned long BackC,int WithRelief)
{
if (WithRelief)
{
XSetBackground(dpy,gc,BackC);
XSetForeground(dpy,gc,HiC);
XDrawImageString(dpy,win,gc,x+1,y+1,str,strl);
XSetForeground(dpy,gc,ForeC);
XDrawString(dpy,win,gc,x,y,str,strl);
}
else
{
XSetBackground(dpy,gc,BackC);
XSetForeground(dpy,gc,ForeC);
XDrawImageString(dpy,win,gc,x,y+1,str,strl);
}
}
/**************************************************/
/* Retourne le titre de l'option id du menu */
/**************************************************/
char* GetMenuTitle(char *str,int id)
{
int i=1;
int w=0;
int w2=0;
char* TempStr;
while ((str[w+w2]!='\0')&&(str[w+w2]!='|'))
w2++;
while ((i<id)&&(str[w]!='\0'))
{
i++;
if (str[w+w2]=='|') w2++;
w=w+w2;
w2=0;
while ((str[w+w2]!='\0')&&(str[w+w2]!='|'))
w2++;
}
TempStr=(char*)calloc(sizeof(char),w2+1);
TempStr=strncpy(TempStr,&str[w],w2);
return TempStr;
}
/***********************************************************/
/* Dessine le contenu de la fenetre du popup-menu */
/***********************************************************/
void DrawPMenu(struct XObj *xobj,Window WinPop,int h,int StrtOpt)
{
XSegment segm[2];
int i;
char *str;
int x,y;
int width,height;
Window Root;
int asc,desc,dir;
XCharStruct struc;
XGetGeometry(xobj->display,WinPop,&Root,&x,&y,&width,&height,&i,&i);
for (i=0;i<2;i++)
{
segm[0].x1=i;
segm[0].y1=i;
segm[0].x2=width-i-1;
segm[0].y2=i;
segm[1].x1=i;
segm[1].y1=i;
segm[1].x2=i;
segm[1].y2=height-i-1;
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[li].pixel);
XDrawSegments(xobj->display,WinPop,xobj->gc,segm,2);
segm[0].x1=1+i;
segm[0].y1=height-i-1;
segm[0].x2=width-i-1;
segm[0].y2=height-i-1;
segm[1].x1=width-i-1;
segm[1].y1=i;
segm[1].x2=width-i-1;
segm[1].y2=height-i-1;
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[shad].pixel);
XDrawSegments(xobj->display,WinPop,xobj->gc,segm,2);
}
/* Ecriture des options */
x=0;
for (i=StrtOpt;i<=xobj->value3;i++)
{
str=(char*)GetMenuTitle(xobj->title,i);
if (x<XTextWidth(xobj->xfont,str,strlen(str)))
x=XTextWidth(xobj->xfont,str,strlen(str));
free(str);
}
for (i=StrtOpt;i<=xobj->value3;i++)
{
str=(char*)GetMenuTitle(xobj->title,i);
XTextExtents(xobj->xfont,"lp",strlen("lp"),&dir,&asc,&desc,&struc);
y=h*(i-StrtOpt)+asc+4;
DrawString(xobj->display,xobj->gc,WinPop,width-x-8,y,str,
strlen(str),xobj->TabColor[fore].pixel,
xobj->TabColor[li].pixel,xobj->TabColor[back].pixel,
!xobj->flags[1]);
free(str);
}
}
/***********************************************************/
/* Dessine l'option active d'un menu */
/***********************************************************/
void SelectMenu(struct XObj *xobj,Window WinPop,int hOpt,int newvalue,int Show)
{
XSegment segm[2];
int i;
int x,y;
int width,height;
Window Root;
XGetGeometry(xobj->display,WinPop,&Root,&x,&y,&width,&height,&i,&i);
y=hOpt*(newvalue-1);
for (i=0;i<2;i++)
{
segm[0].x1=i+2;
segm[0].y1=i+y+2;
segm[0].x2=width-i-3;
segm[0].y2=i+y+2;
segm[1].x1=i+2;
segm[1].y1=i+y+2;
segm[1].x2=i+2;
segm[1].y2=y+hOpt-4-i;
if (Show)
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[li].pixel);
else
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[back].pixel);
XDrawSegments(xobj->display,WinPop,xobj->gc,segm,2);
segm[0].x1=i+3;
segm[0].y1=y-i-3+hOpt;
segm[0].x2=width-i-3;
segm[0].y2=y-i-3+hOpt;
segm[1].x1=width-i-3;
segm[1].y1=i+y+2;
segm[1].x2=width-i-3;
segm[1].y2=i+y-4+hOpt;
if (Show)
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[shad].pixel);
else
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[back].pixel);
XDrawSegments(xobj->display,WinPop,xobj->gc,segm,2);
}
}
/**************************************************/
/* Compte le nombre d'option contenu dans un menu */
/**************************************************/
int CountOption(char *str)
{
int i=1;
int w=0;
while (str[w]!='\0')
{
if (str[w]=='|') i++;
w++;
}
return i;
}
/*****************************************/
/* Dessine l'icone et le titre du widget */
/*****************************************/
void DrawIconStr(int offset,struct XObj *xobj,int DoRedraw)
{
int i,j;
char *str;
int asc,desc,dir;
XCharStruct struc;
XTextExtents(xobj->xfont,"lp",strlen("lp"),&dir,&asc,&desc,&struc);
if (DoRedraw)
{
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[back].pixel);
XFillRectangle(xobj->display,xobj->win,xobj->gc,4,4,xobj->width-8,xobj->height-8);
}
if (xobj->iconPixmap==None) /* Si l'icone n'existe pas */
{
str=GetMenuTitle(xobj->title,1);
j=xobj->height/2+(asc+desc)/2+offset-3;
i=(xobj->width-XTextWidth(xobj->xfont,str,strlen(str)))/2+offset;
DrawString(xobj->display,xobj->gc,xobj->win,i,j,str,
strlen(str),xobj->TabColor[fore].pixel,xobj->TabColor[li].pixel,
xobj->TabColor[back].pixel,!xobj->flags[1]);
free(str);
}
else /* Si l'icone existe */
{
if (xobj->title!=NULL)
{
str=GetMenuTitle(xobj->title,1);
if (strlen(str)!=0)
{
i=(xobj->width-XTextWidth(xobj->xfont,str,strlen(str)))/2+offset;
j=((xobj->height - xobj->icon_h)/4)*3 + xobj->icon_h+offset+(asc+desc)/2-3;
DrawString(xobj->display,xobj->gc,xobj->win,i,j,str,
strlen(str),xobj->TabColor[fore].pixel,xobj->TabColor[li].pixel,
xobj->TabColor[back].pixel,!xobj->flags[1]);
}
free(str);
}
/* Dessin de l'icone */
if (xobj->icon_maskPixmap!=None)
XSetClipMask(xobj->display,xobj->gc,xobj->icon_maskPixmap);
j=(xobj->height - xobj->icon_h)/2+offset;
i=(xobj->width - xobj->icon_w)/2+offset;
XSetClipOrigin(xobj->display,xobj->gc,i,j);
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[fore].pixel);
XCopyArea(xobj->display,xobj->iconPixmap,xobj->win,xobj->gc,0,0,
xobj->icon_w,xobj->icon_h,i,j);
XSetClipMask(xobj->display,xobj->gc,None);
}
}
/***********************************************/
/* Fonction de dessin d'un rectangle en relief */
/***********************************************/
void DrawReliefRect(int x,int y,int width,int height,struct XObj *xobj,
unsigned int LiC, unsigned int ShadC,unsigned int ForeC,int RectIn)
{
XSegment segm[2];
int i;
int j;
/* XSetForeground(xobj->display,xobj->gc,xobj->TabColor[back].pixel);
XFillRectangle(xobj->display,xobj->win,xobj->gc,x,y,width,height);*/
width--;
height--;
for (i=1;i<3;i++)
{
j=-1-i;
segm[0].x1=i+x;
segm[0].y1=i+y;
segm[0].x2=i+x;
segm[0].y2=height+j+y+1;
segm[1].x1=i+x;
segm[1].y1=i+y;
segm[1].x2=width+j+x+1;
segm[1].y2=i+y;
XSetForeground(xobj->display,xobj->gc,LiC);
XDrawSegments(xobj->display,xobj->win,xobj->gc,segm,2);
segm[0].x1=width+j+x+1;
segm[0].y1=i+1+y;
segm[0].x2=width+j+x+1;
segm[0].y2=height+j+y+1;
segm[1].x1=i+1+x;
segm[1].y1=height+j+y+1;
segm[1].x2=width+j+x+1;
segm[1].y2=height+j+y+1;
XSetForeground(xobj->display,xobj->gc,ShadC);
XDrawSegments(xobj->display,xobj->win,xobj->gc,segm,2);
}
XSetForeground(xobj->display,xobj->gc,ForeC);
if (RectIn==1) /* Rectangle a l'interieur */
XDrawRectangle(xobj->display,xobj->win,xobj->gc,x+3,y+3,
width-6,height-6);
else if (RectIn==0) /* Rectangle a l'exterieur */
XDrawRectangle(xobj->display,xobj->win,xobj->gc,x,y,width,height);
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[fore].pixel);
}
/***********************************************/
/* Calcul ascent de la police */
/***********************************************/
int GetAscFont(XFontStruct *xfont)
{
int asc,desc,dir;
XCharStruct struc;
XTextExtents(xfont,"lp",strlen("lp"),&dir,&asc,&desc,&struc);
return asc;
}
/***********************************************/
/* Insertion d'un str dans le titre d'un objet */
/***********************************************/
int InsertText(struct XObj *xobj,char *str,int SizeStr)
{
int Size;
int NewPos;
int i;
/* Insertion du caractere dans le titre */
NewPos=xobj->value;
Size=strlen(xobj->title);
xobj->title=(char*)realloc(xobj->title,(1+SizeStr+Size)*sizeof(char));
memmove(&xobj->title[NewPos+SizeStr],&xobj->title[NewPos],
Size-NewPos+1);
for (i=NewPos;i<NewPos+SizeStr;i++)
xobj->title[i]=str[i-NewPos];
NewPos=NewPos+SizeStr;
return NewPos;
}
/******************************************************/
/* Lecture d'un morceau de texte de xobj->value <20> End */
/******************************************************/
char *GetText(struct XObj *xobj,int End)
{
char *str;
int a,b;
if (End>xobj->value)
{
a=xobj->value;
b=End;
}
else
{
b=xobj->value;
a=End;
}
str=(char*)calloc(b-a+2,1);
memcpy(str,&xobj->title[a],b-a);
str[b-a+1]='\0';
return str;
}
void UnselectAllTextField(struct XObj **txobj)
{
int i;
for (i=0;i<nbobj;i++)
if (txobj[i]->TypeWidget==TextField)
if (txobj[i]->value2!=txobj[i]->value)
{
txobj[i]->value2=txobj[i]->value;
txobj[i]->DrawObj(txobj[i]);
return;
}
}
void SelectOneTextField(struct XObj *xobj)
{
int i;
for (i=0;i<nbobj;i++)
if ((tabxobj[i]->TypeWidget==TextField)&&(xobj!=tabxobj[i]))
if (tabxobj[i]->value2!=tabxobj[i]->value)
{
tabxobj[i]->value2=tabxobj[i]->value;
tabxobj[i]->DrawObj(tabxobj[i]);
return;
}
}
/************************************************************/
/* Dessine une fleche direction nord */
/************************************************************/
void DrawArrowN(struct XObj *xobj,int x,int y,int Press)
{
XSegment segm[4];
segm[0].x1=5+x;
segm[0].y1=1+y;
segm[0].x2=0+x;
segm[0].y2=12+y;
segm[1].x1=5+x;
segm[1].y1=3+y;
segm[1].x2=1+x;
segm[1].y2=12+y;
if (Press==1)
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[shad].pixel);
else
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[li].pixel);
XDrawSegments(xobj->display,xobj->win,xobj->gc,segm,2);
segm[0].x1=2+x;
segm[0].y1=11+y;
segm[0].x2=11+x;
segm[0].y2=11+y;
segm[1].x1=1+x;
segm[1].y1=12+y;
segm[1].x2=12+x;
segm[1].y2=12+y;
segm[2].x1=6+x;
segm[2].y1=0+y;
segm[2].x2=12+x;
segm[2].y2=12+y;
segm[3].x1=6+x;
segm[3].y1=2+y;
segm[3].x2=10+x;
segm[3].y2=11+y;
if (Press==1)
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[li].pixel);
else
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[shad].pixel);
XDrawSegments(xobj->display,xobj->win,xobj->gc,segm,4);
}
/************************************************************/
/* Dessine une fleche direction sud */
/************************************************************/
void DrawArrowS(struct XObj *xobj,int x,int y,int Press)
{
XSegment segm[4];
segm[0].x1=0+x;
segm[0].y1=0+y;
segm[0].x2=12+x;
segm[0].y2=0+y;
segm[1].x1=1+x;
segm[1].y1=1+y;
segm[1].x2=11+x;
segm[1].y2=1+y;
segm[2].x1=1+x;
segm[2].y1=1+y;
segm[2].x2=5+x;
segm[2].y2=10+y;
segm[3].x1=2+x;
segm[3].y1=1+y;
segm[3].x2=5+x;
segm[3].y2=8+y;
if (Press==1)
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[shad].pixel);
else
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[li].pixel);
XDrawSegments(xobj->display,xobj->win,xobj->gc,segm,4);
segm[0].x1=6+x;
segm[0].y1=11+y;
segm[0].x2=12+x;
segm[0].y2=1+y;
segm[1].x1=6+x;
segm[1].y1=10+y;
segm[1].x2=10+x;
segm[1].y2=2+y;
if (Press==1)
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[li].pixel);
else
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[shad].pixel);
XDrawSegments(xobj->display,xobj->win,xobj->gc,segm,2);
}
void DrawArrowE(struct XObj *xobj,int x,int y,int Press)
{
XSegment segm[4];
segm[0].x1=12+x;
segm[0].y1=6+y;
segm[0].x2=1+x;
segm[0].y2=12+y;
segm[1].x1=10+x;
segm[1].y1=6+y;
segm[1].x2=2+x;
segm[1].y2=10+y;
if (Press==1)
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[li].pixel);
else
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[shad].pixel);
XDrawSegments(xobj->display,xobj->win,xobj->gc,segm,2);
segm[0].x1=0+x;
segm[0].y1=0+y;
segm[0].x2=0+x;
segm[0].y2=12+y;
segm[1].x1=1+x;
segm[1].y1=0+y;
segm[1].x2=1+x;
segm[1].y2=11+y;
segm[2].x1=0+x;
segm[2].y1=0+y;
segm[2].x2=11+x;
segm[2].y2=5+y;
segm[3].x1=0+x;
segm[3].y1=1+y;
segm[3].x2=9+x;
segm[3].y2=5+y;
if (Press==1)
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[shad].pixel);
else
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[li].pixel);
XDrawSegments(xobj->display,xobj->win,xobj->gc,segm,4);
}
void DrawArrowW(struct XObj *xobj,int x,int y,int Press)
{
XSegment segm[4];
segm[0].x1=2+x;
segm[0].y1=5+y;
segm[0].x2=12+x;
segm[0].y2=0+y;
segm[1].x1=4+x;
segm[1].y1=5+y;
segm[1].x2=10+x;
segm[1].y2=2+y;
if (Press==1)
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[shad].pixel);
else
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[li].pixel);
XDrawSegments(xobj->display,xobj->win,xobj->gc,segm,2);
segm[0].x1=0+x;
segm[0].y1=6+y;
segm[0].x2=12+x;
segm[0].y2=12+y;
segm[1].x1=2+x;
segm[1].y1=6+y;
segm[1].x2=11+x;
segm[1].y2=10+y;
segm[2].x1=12+x;
segm[2].y1=1+y;
segm[2].x2=12+x;
segm[2].y2=12+y;
segm[3].x1=11+x;
segm[3].y1=2+y;
segm[3].x2=11+x;
segm[3].y2=11+y;
if (Press==1)
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[li].pixel);
else
XSetForeground(xobj->display,xobj->gc,xobj->TabColor[shad].pixel);
XDrawSegments(xobj->display,xobj->win,xobj->gc,segm,4);
}
int PtInRect(XPoint pt,XRectangle rect)
{
return ((pt.x>=rect.x)&&(pt.y>=rect.y)&&
(pt.x<=rect.x+rect.width)&&(pt.y<=rect.y+rect.height));
}
/* Arret pendant t*1/60 de secondes */
void Wait(int t)
{
struct timeval *tv;
long tus,ts;
tv=(struct timeval*)calloc(1,sizeof(struct timeval));
gettimeofday(tv,NULL);
tus=tv->tv_usec;
ts=tv->tv_sec;
while (((tv->tv_usec-tus)+(tv->tv_sec-ts)*1000000)<16667*t)
gettimeofday(tv,NULL);
free(tv);
}
int IsItDoubleClic(struct XObj *xobj)
{
XEvent Event;
XFlush(xobj->display);
Wait(12);
return (XCheckTypedEvent(xobj->display,ButtonPress,&Event));
}