1267 lines
26 KiB
C
1267 lines
26 KiB
C
#include "types.h"
|
|
|
|
extern int fd[2];
|
|
extern Window ref;
|
|
|
|
void (*TabCom[30]) (int NbArg,long *TabArg);
|
|
char *(*TabFunc[20]) (int *NbArg, long *TabArg);
|
|
int (*TabComp[15]) (char *arg1,char *arg2);
|
|
|
|
extern X11base *x11base;
|
|
extern int grab_serve;
|
|
extern struct XObj *tabxobj[100];
|
|
extern void LoadIcon(struct XObj *xobj);
|
|
|
|
extern int nbobj;
|
|
extern char **TabVVar;
|
|
extern int TabIdObj[101];
|
|
extern char *ScriptName;
|
|
extern char *ModuleName;
|
|
extern TypeBuffSend BuffSend;
|
|
extern Atom propriete;
|
|
|
|
char *BufCom;
|
|
char Command[255]="None";
|
|
time_t TimeCom=0;
|
|
|
|
/*************************************************************/
|
|
/* Ensemble de fonction de comparaison de deux entiers */
|
|
/*************************************************************/
|
|
int Inf(char *arg1,char *arg2)
|
|
{
|
|
int an1,an2;
|
|
an1=atoi(arg1);
|
|
an2=atoi(arg2);
|
|
return (an1<an2);
|
|
}
|
|
|
|
int InfEq(char *arg1,char *arg2)
|
|
{
|
|
int an1,an2;
|
|
an1=atoi(arg1);
|
|
an2=atoi(arg2);
|
|
return (an1<=an2);
|
|
}
|
|
|
|
int Equal(char *arg1,char *arg2)
|
|
{
|
|
int an1,an2;
|
|
an1=atoi(arg1);
|
|
an2=atoi(arg2);
|
|
return (strcmp(arg1,arg2)==0);
|
|
}
|
|
|
|
int SupEq(char *arg1,char *arg2)
|
|
{
|
|
int an1,an2;
|
|
an1=atoi(arg1);
|
|
an2=atoi(arg2);
|
|
return (an1>=an2);
|
|
}
|
|
|
|
int Sup(char *arg1,char *arg2)
|
|
{
|
|
int an1,an2;
|
|
an1=atoi(arg1);
|
|
an2=atoi(arg2);
|
|
return (an1>an2);
|
|
}
|
|
|
|
int Diff(char *arg1,char *arg2)
|
|
{
|
|
int an1,an2;
|
|
an1=atoi(arg1);
|
|
an2=atoi(arg2);
|
|
return (strcmp(arg1,arg2)!=0);
|
|
}
|
|
|
|
/*****************************************************/
|
|
/* Fonction qui retourne la valeur d'un argument */
|
|
/*****************************************************/
|
|
char *CalcArg (long *TabArg,int *Ix)
|
|
{
|
|
char *TmpStr;
|
|
int i;
|
|
|
|
if (TabArg[*Ix]>100000) /* Cas du codage d'un nombre */
|
|
{
|
|
i=(int)TabArg[*Ix]-200000;
|
|
TmpStr=(char*)calloc(1,sizeof(char)*10);
|
|
sprintf(TmpStr,"%d",i);
|
|
}
|
|
else if (TabArg[*Ix]<-200000)/* Cas d'un id de fonction de comparaison */
|
|
{
|
|
i=TabArg[*Ix]+250000;
|
|
TmpStr=(char*)calloc(1,sizeof(char)*10);
|
|
sprintf(TmpStr,"%d",i);
|
|
}
|
|
else if (TabArg[*Ix]< -100000) /* Cas d'un id de fonction */
|
|
{
|
|
TmpStr=TabFunc[TabArg[*Ix]+150000](Ix,TabArg);
|
|
}
|
|
else /* Cas d'une variable */
|
|
{
|
|
TmpStr=strdup(TabVVar[TabArg[*Ix]]);
|
|
}
|
|
return (TmpStr);
|
|
}
|
|
|
|
/*************************************************************/
|
|
/* Ensemble des fonctions pour recuperer les prop d'un objet */
|
|
/*************************************************************/
|
|
char *FuncGetValue(int *NbArg, long *TabArg)
|
|
{
|
|
char *tmp;
|
|
long Id;
|
|
|
|
(*NbArg)++; /* La fonction GetValue n'a qu'un seul argument */
|
|
tmp=CalcArg(TabArg,NbArg);
|
|
Id=atoi(tmp);
|
|
free(tmp);
|
|
tmp=(char*)calloc(1,sizeof(char)*10);
|
|
sprintf(tmp,"%d",tabxobj[TabIdObj[Id]]->value);
|
|
return tmp;
|
|
}
|
|
|
|
/* Fonction qui retourne le titre d'un objet */
|
|
char *FuncGetTitle(int *NbArg, long *TabArg)
|
|
{
|
|
char *tmp;
|
|
long Id;
|
|
|
|
(*NbArg)++;
|
|
tmp=CalcArg(TabArg,NbArg);
|
|
Id=atoi(tmp);
|
|
free(tmp);
|
|
if (TabIdObj[Id]!=-1)
|
|
tmp=strdup(tabxobj[TabIdObj[Id]]->title);
|
|
else
|
|
{
|
|
fprintf(stderr,"Widget %d doesn't exist\n",(int)Id);
|
|
tmp=(char*)calloc(1,sizeof(char));
|
|
tmp[0]='\0';
|
|
}
|
|
return tmp;
|
|
}
|
|
|
|
/* Fonction qui retourne la sortie d'une commande */
|
|
char *FuncGetOutput(int *NbArg, long *TabArg)
|
|
{
|
|
char *cmndbuf;
|
|
char *str;
|
|
int line,index,i=2,j=0,k,NewWord;
|
|
FILE *f;
|
|
int maxsize=32000;
|
|
int size;
|
|
|
|
(*NbArg)++;
|
|
cmndbuf=CalcArg(TabArg,NbArg);
|
|
(*NbArg)++;
|
|
str=CalcArg(TabArg,NbArg);
|
|
line=atoi(str);
|
|
free(str);
|
|
(*NbArg)++;
|
|
str=CalcArg(TabArg,NbArg);
|
|
index=atoi(str);
|
|
free(str);
|
|
|
|
if ((strcmp(Command,cmndbuf))||((time(NULL)-TimeCom)>1)||(TimeCom==0))
|
|
{
|
|
if ((f = popen(cmndbuf,"r")) == NULL)
|
|
{
|
|
fprintf(stderr,"%s: can't run %s\n",ScriptName,cmndbuf);
|
|
str=(char*)calloc(sizeof(char),10);
|
|
free(cmndbuf);
|
|
return str;
|
|
}
|
|
else
|
|
{
|
|
if (strcmp(Command,"None"))
|
|
free(BufCom);
|
|
BufCom=(char*)calloc(sizeof(char),maxsize);
|
|
size=fread(BufCom,1,maxsize,f);
|
|
pclose(f);
|
|
strcpy(Command,cmndbuf);
|
|
TimeCom=time(NULL);
|
|
}
|
|
}
|
|
|
|
/* Recherche de la ligne */
|
|
while ((i<=line)&&(BufCom[j]!='\0'))
|
|
{
|
|
j++;
|
|
if (BufCom[j]=='\n') i++;
|
|
}
|
|
|
|
/* Recherche du mot */
|
|
if (index!=-1)
|
|
{
|
|
if (i!=2) j++;
|
|
i=1;
|
|
NewWord=0;
|
|
while ((i<index)&&(BufCom[j]!='\n')&&(BufCom[j]!='\0'))
|
|
{
|
|
j++;
|
|
if (BufCom[j]==' ')
|
|
{
|
|
if (NewWord)
|
|
{
|
|
i++;
|
|
NewWord=0;
|
|
}
|
|
}
|
|
else
|
|
if (!NewWord) NewWord=1;
|
|
}
|
|
str=(char*)calloc(sizeof(char),255);
|
|
sscanf(&BufCom[j],"%s",str);
|
|
}
|
|
else /* Lecture de la ligne complete */
|
|
{
|
|
if (i!=2) j++;
|
|
k=j;
|
|
while ((BufCom[k]!='\n')&&(BufCom[k]!='\0'))
|
|
k++;
|
|
str=(char*)calloc(sizeof(char),k-j+1);
|
|
memmove(str,&BufCom[j],k-j);
|
|
str[k-j]='\0';
|
|
}
|
|
|
|
free(cmndbuf);
|
|
return str;
|
|
}
|
|
|
|
/* Convertion decimal vers hexadecimal */
|
|
char *FuncNumToHex(int *NbArg, long *TabArg)
|
|
{
|
|
char *str;
|
|
int value,nbchar;
|
|
int i,j;
|
|
|
|
(*NbArg)++;
|
|
str=CalcArg(TabArg,NbArg);
|
|
value=atoi(str);
|
|
free(str);
|
|
(*NbArg)++;
|
|
str=CalcArg(TabArg,NbArg);
|
|
nbchar=atoi(str);
|
|
free(str);
|
|
|
|
str=(char*)calloc(1,nbchar+10);
|
|
sprintf(str,"%X",value);
|
|
j=strlen(str);
|
|
if (j<nbchar)
|
|
{
|
|
memmove(&str[nbchar-j],str,j);
|
|
for (i=0;i<(nbchar-j);i++)
|
|
str[i]='0';
|
|
}
|
|
|
|
return str;
|
|
}
|
|
|
|
/* Convertion hexadecimal vers decimal */
|
|
char *FuncHexToNum(int *NbArg, long *TabArg)
|
|
{
|
|
char *str,*str2;
|
|
int k;
|
|
|
|
(*NbArg)++;
|
|
str=CalcArg(TabArg,NbArg);
|
|
if (str[0]=='#')
|
|
memmove(str,&str[1],strlen(str));
|
|
k=(int)strtol(str,NULL,16);
|
|
free(str);
|
|
|
|
str2=(char*)calloc(1,20);
|
|
sprintf(str2,"%d",k);
|
|
return str2;
|
|
}
|
|
|
|
char *FuncAdd(int *NbArg, long *TabArg)
|
|
{
|
|
char *str;
|
|
int val1,val2;
|
|
|
|
(*NbArg)++;
|
|
str=CalcArg(TabArg,NbArg);
|
|
val1=atoi(str);
|
|
free(str);
|
|
(*NbArg)++;
|
|
str=CalcArg(TabArg,NbArg);
|
|
val2=atoi(str);
|
|
free(str);
|
|
str=(char*)calloc(1,20);
|
|
sprintf(str,"%d",val1+val2);
|
|
return str;
|
|
}
|
|
|
|
char *FuncMult(int *NbArg, long *TabArg)
|
|
{
|
|
char *str;
|
|
int val1,val2;
|
|
|
|
(*NbArg)++;
|
|
str=CalcArg(TabArg,NbArg);
|
|
val1=atoi(str);
|
|
free(str);
|
|
(*NbArg)++;
|
|
str=CalcArg(TabArg,NbArg);
|
|
val2=atoi(str);
|
|
free(str);
|
|
str=(char*)calloc(1,20);
|
|
sprintf(str,"%d",val1*val2);
|
|
return str;
|
|
}
|
|
|
|
char *FuncDiv(int *NbArg, long *TabArg)
|
|
{
|
|
char *str;
|
|
int val1,val2;
|
|
|
|
(*NbArg)++;
|
|
str=CalcArg(TabArg,NbArg);
|
|
val1=atoi(str);
|
|
free(str);
|
|
(*NbArg)++;
|
|
str=CalcArg(TabArg,NbArg);
|
|
val2=atoi(str);
|
|
free(str);
|
|
str=(char*)calloc(1,20);
|
|
sprintf(str,"%d",val1/val2);
|
|
return str;
|
|
}
|
|
|
|
char *RemainderOfDiv(int *NbArg, long *TabArg)
|
|
{
|
|
#ifndef HAVE_DIV
|
|
return strdup("Unsupported function: div");
|
|
#else
|
|
char *str;
|
|
int val1,val2;
|
|
div_t res;
|
|
|
|
(*NbArg)++;
|
|
str=CalcArg(TabArg,NbArg);
|
|
val1=atoi(str);
|
|
free(str);
|
|
(*NbArg)++;
|
|
str=CalcArg(TabArg,NbArg);
|
|
val2=atoi(str);
|
|
free(str);
|
|
str=(char*)calloc(1,20);
|
|
res=div(val1,val2);
|
|
sprintf(str,"%d",res.rem);
|
|
return str;
|
|
#endif
|
|
}
|
|
|
|
|
|
char *FuncStrCopy(int *NbArg, long *TabArg)
|
|
{
|
|
char *str,*strsrc;
|
|
int i1,i2;
|
|
|
|
(*NbArg)++;
|
|
strsrc=CalcArg(TabArg,NbArg);
|
|
(*NbArg)++;
|
|
str=CalcArg(TabArg,NbArg);
|
|
i1=atoi(str);
|
|
if (i1<1) i1=1;
|
|
free(str);
|
|
(*NbArg)++;
|
|
str=CalcArg(TabArg,NbArg);
|
|
i2=atoi(str);
|
|
if (i2<1) i2=1;
|
|
free(str);
|
|
|
|
if ((i1<=i2)&&(i1<=strlen(strsrc)))
|
|
{
|
|
if (i2>strlen(strsrc)) i2=strlen(strsrc);
|
|
str=(char*)calloc(1,i2-i1+2);
|
|
memmove(str,&strsrc[i1-1],i2-i1+1);
|
|
}
|
|
else
|
|
{
|
|
str=(char*)calloc(1,1);
|
|
}
|
|
|
|
free(strsrc);
|
|
return str;
|
|
}
|
|
|
|
/* Lancement d'un script avec pipe */
|
|
char *LaunchScript (int *NbArg,long *TabArg)
|
|
{
|
|
char *arg,*execstr,*str,*scriptarg,*scriptname;
|
|
int leng,i;
|
|
Atom MyAtom;
|
|
|
|
/* Lecture des arguments */
|
|
(*NbArg)++;
|
|
arg=CalcArg(TabArg,NbArg);
|
|
|
|
str=(char*)calloc(100,sizeof(char));
|
|
|
|
/* Calcul du nom du script fils */
|
|
x11base->TabScriptId[x11base->NbChild+2]=(char*)calloc(strlen(x11base->TabScriptId[1])+4,sizeof(char));
|
|
|
|
if (x11base->NbChild<98)
|
|
{
|
|
i=16;
|
|
do
|
|
{
|
|
sprintf(x11base->TabScriptId[x11base->NbChild+2],"%s%x",x11base->TabScriptId[1],i);
|
|
MyAtom=XInternAtom(x11base->display,x11base->TabScriptId[x11base->NbChild+2],False);
|
|
i++;
|
|
}
|
|
while (XGetSelectionOwner(x11base->display,MyAtom)!=None);
|
|
}
|
|
else
|
|
{
|
|
fprintf(stderr,"Too many launched script\n");
|
|
sprintf(str,"-1");
|
|
return str;
|
|
}
|
|
|
|
/* Construction de la commande */
|
|
execstr=(char*)calloc(strlen(ModuleName)+strlen(arg)+
|
|
strlen(x11base->TabScriptId[x11base->NbChild+2])+5,sizeof(char));
|
|
scriptname=(char*)calloc(sizeof(char),100);
|
|
sscanf(arg,"%s",scriptname);
|
|
scriptarg=(char*)calloc(sizeof(char),strlen(arg));
|
|
scriptarg=(char*)strncpy(scriptarg,&arg[strlen(scriptname)],strlen(arg)-strlen(scriptname));
|
|
sprintf(execstr,"%s %s %s %s",ModuleName,scriptname,
|
|
x11base->TabScriptId[x11base->NbChild+2],scriptarg);
|
|
free(scriptname);
|
|
free(scriptarg);
|
|
free(arg);
|
|
|
|
/* Envoi de la commande */
|
|
write(fd[0], &ref, sizeof(Window));
|
|
leng = strlen(execstr);
|
|
write(fd[0], &leng, sizeof(int));
|
|
write(fd[0], execstr, leng);
|
|
leng = 1;
|
|
write(fd[0], &leng, sizeof(int));
|
|
free(execstr);
|
|
|
|
/* Retourne l'id du fils */
|
|
sprintf(str,"%d",x11base->NbChild+2);
|
|
x11base->NbChild++;
|
|
return str;
|
|
}
|
|
|
|
char *GetScriptFather (int *NbArg,long *TabArg)
|
|
{
|
|
char *str;
|
|
|
|
str=(char*)calloc(10,sizeof(char));
|
|
sprintf(str,"0");
|
|
return str;
|
|
}
|
|
|
|
char *GetTime (int *NbArg,long *TabArg)
|
|
{
|
|
char *str;
|
|
time_t t;
|
|
|
|
str=(char*)calloc(20,sizeof(char));
|
|
t=time(NULL);
|
|
sprintf(str,"%ld",(long)t-x11base->BeginTime);
|
|
return str;
|
|
}
|
|
|
|
char *GetScriptArg (int *NbArg,long *TabArg)
|
|
{
|
|
char *str;
|
|
int val1;
|
|
|
|
(*NbArg)++;
|
|
str=CalcArg(TabArg,NbArg);
|
|
val1=atoi(str);
|
|
free(str);
|
|
|
|
str=(char*)calloc(strlen(x11base->TabArg[val1])+1,sizeof(char));
|
|
str=strcpy(str,x11base->TabArg[val1]);
|
|
|
|
return str;
|
|
}
|
|
|
|
char *ReceivFromScript (int *NbArg,long *TabArg)
|
|
{
|
|
char *arg,*msg;
|
|
int send;
|
|
Atom AReceiv,ASend,type;
|
|
static XEvent event;
|
|
unsigned long longueur,octets_restant;
|
|
unsigned char *donnees="";
|
|
int format;
|
|
int NbEssai=0;
|
|
|
|
(*NbArg)++;
|
|
arg=CalcArg(TabArg,NbArg);
|
|
send=(int)atoi(arg);
|
|
free(arg);
|
|
|
|
msg=(char*)calloc(256,sizeof(char));
|
|
sprintf(msg,"No message");
|
|
|
|
/* Recuperation des atomes */
|
|
AReceiv=XInternAtom(x11base->display,x11base->TabScriptId[1],True);
|
|
if (AReceiv==None)
|
|
{
|
|
fprintf(stderr,"Error with atome\n");
|
|
return msg;
|
|
}
|
|
|
|
if ((send>=0)&&(send<99))
|
|
if (x11base->TabScriptId[send]!=NULL)
|
|
{
|
|
ASend=XInternAtom(x11base->display,x11base->TabScriptId[send],True);
|
|
if (ASend==None)
|
|
fprintf(stderr,"Error with atome\n");
|
|
}
|
|
else
|
|
return msg;
|
|
else
|
|
return msg;
|
|
|
|
/* Recuperation du message */
|
|
XConvertSelection(x11base->display,ASend,AReceiv,propriete,x11base->win,CurrentTime);
|
|
while ((!XCheckTypedEvent(x11base->display,SelectionNotify,&event))&&(NbEssai<25000))
|
|
NbEssai++;
|
|
if (event.xselection.property!=None)
|
|
if (event.xselection.selection==ASend)
|
|
{
|
|
XGetWindowProperty(x11base->display,event.xselection.requestor,event.xselection.property,0,
|
|
8192,False,event.xselection.target,&type,&format,&longueur,&octets_restant,
|
|
&donnees);
|
|
if (longueur>0)
|
|
{
|
|
msg=(char*)realloc((void*)msg,(longueur+1)*sizeof(char));
|
|
msg=strcpy(msg,donnees);
|
|
XDeleteProperty(x11base->display,event.xselection.requestor,event.xselection.property);
|
|
XFree(donnees);
|
|
}
|
|
}
|
|
|
|
return msg;
|
|
}
|
|
|
|
|
|
/***********************************************/
|
|
/* Ensemble des commandes possible pour un obj */
|
|
/***********************************************/
|
|
|
|
void Exec (int NbArg,long *TabArg)
|
|
{
|
|
int leng;
|
|
char *execstr;
|
|
char *tempstr;
|
|
int i;
|
|
|
|
execstr=(char*)calloc(1,256);
|
|
for (i=0;i<NbArg;i++)
|
|
{
|
|
tempstr=CalcArg(TabArg,&i);
|
|
execstr=strcat(execstr,tempstr);
|
|
free(tempstr);
|
|
}
|
|
|
|
write(fd[0], &ref, sizeof(Window));
|
|
leng = strlen(execstr);
|
|
write(fd[0], &leng, sizeof(int));
|
|
write(fd[0], execstr, leng);
|
|
leng = 1;
|
|
write(fd[0], &leng, sizeof(int));
|
|
|
|
|
|
free(execstr);
|
|
}
|
|
|
|
void HideObj (int NbArg,long *TabArg)
|
|
{
|
|
char *arg[1];
|
|
int IdItem;
|
|
int i=0;
|
|
|
|
arg[0]=CalcArg(TabArg,&i);
|
|
IdItem= TabIdObj[atoi(arg[0])];
|
|
|
|
tabxobj[IdItem]->flags[0]=True;
|
|
/* On cache la fentre pour la faire disparaitre */
|
|
XUnmapWindow(x11base->display,tabxobj[IdItem]->win);
|
|
free(arg[0]);
|
|
}
|
|
|
|
void ShowObj (int NbArg,long *TabArg)
|
|
{
|
|
char *arg[1];
|
|
int IdItem;
|
|
int i=0;
|
|
|
|
arg[0]=CalcArg(TabArg,&i);
|
|
IdItem= TabIdObj[atoi(arg[0])];
|
|
|
|
tabxobj[IdItem]->flags[0]=False;
|
|
XMapWindow(x11base->display,tabxobj[IdItem]->win);
|
|
tabxobj[IdItem]->DrawObj(tabxobj[IdItem]);
|
|
free(arg[0]);
|
|
}
|
|
|
|
void ChangeValue (int NbArg,long *TabArg)
|
|
{
|
|
int i=0;
|
|
char *arg[2];
|
|
|
|
arg[0]=CalcArg(TabArg,&i);
|
|
i++;
|
|
arg[1]=CalcArg(TabArg,&i);
|
|
|
|
tabxobj[TabIdObj[atoi(arg[0])]]->value=atoi(arg[1]);
|
|
/* On redessine l'objet pour le mettre a jour */
|
|
tabxobj[TabIdObj[atoi(arg[0])]]->DrawObj(tabxobj[TabIdObj[atoi(arg[0])]]);
|
|
free(arg[0]);
|
|
free(arg[1]);
|
|
}
|
|
|
|
void ChangeValueMax (int NbArg,long *TabArg)
|
|
{
|
|
int i=0;
|
|
char *arg[2];
|
|
int j;
|
|
|
|
arg[0]=CalcArg(TabArg,&i);
|
|
j=atoi(arg[0]);
|
|
i++;
|
|
arg[1]=CalcArg(TabArg,&i);
|
|
|
|
tabxobj[TabIdObj[j]]->value3=atoi(arg[1]);
|
|
/* On redessine l'objet pour le mettre a jour */
|
|
if (tabxobj[TabIdObj[j]]->value>tabxobj[TabIdObj[j]]->value3)
|
|
{
|
|
tabxobj[TabIdObj[j]]->value=atoi(arg[1]);
|
|
tabxobj[TabIdObj[j]]->DrawObj(tabxobj[TabIdObj[j]]);
|
|
}
|
|
free(arg[0]);
|
|
free(arg[1]);
|
|
}
|
|
|
|
void ChangeValueMin (int NbArg,long *TabArg)
|
|
{
|
|
int i=0;
|
|
char *arg[2];
|
|
int j;
|
|
|
|
arg[0]=CalcArg(TabArg,&i);
|
|
i++;
|
|
arg[1]=CalcArg(TabArg,&i);
|
|
j=atoi(arg[0]);
|
|
|
|
tabxobj[TabIdObj[j]]->value2=atoi(arg[1]);
|
|
/* On redessine l'objet pour le mettre a jour */
|
|
if (tabxobj[TabIdObj[j]]->value<tabxobj[TabIdObj[j]]->value2)
|
|
{
|
|
tabxobj[TabIdObj[j]]->value=atoi(arg[1]);
|
|
tabxobj[TabIdObj[j]]->DrawObj(tabxobj[TabIdObj[j]]);
|
|
}
|
|
free(arg[0]);
|
|
free(arg[1]);
|
|
}
|
|
|
|
void ChangePos (int NbArg,long *TabArg)
|
|
{
|
|
int i=0;
|
|
char *arg[3];
|
|
int an[3];
|
|
int IdItem;
|
|
|
|
arg[0]=CalcArg(TabArg,&i);
|
|
i++;
|
|
arg[1]=CalcArg(TabArg,&i);
|
|
i++;
|
|
arg[2]=CalcArg(TabArg,&i);
|
|
|
|
IdItem= TabIdObj[atoi(arg[0])];
|
|
for (i=1;i<3;i++)
|
|
an[i]=atoi(arg[i]);
|
|
tabxobj[IdItem]->x=an[1];
|
|
tabxobj[IdItem]->y=an[2];
|
|
XMoveWindow(x11base->display,tabxobj[IdItem]->win,an[1],an[2]);
|
|
|
|
free(arg[0]);
|
|
free(arg[1]);
|
|
free(arg[2]);
|
|
|
|
}
|
|
|
|
void ChangeFont (int NbArg,long *TabArg)
|
|
{
|
|
int i=0;
|
|
char *arg[2];
|
|
int IdItem;
|
|
XFontStruct *xfont;
|
|
|
|
arg[0]=CalcArg(TabArg,&i);
|
|
i++;
|
|
arg[1]=CalcArg(TabArg,&i);
|
|
IdItem= TabIdObj[atoi(arg[0])];
|
|
|
|
tabxobj[IdItem]->font=strdup(arg[1]);
|
|
if ((xfont=XLoadQueryFont(tabxobj[IdItem]->display,tabxobj[IdItem]->font))==NULL)
|
|
{
|
|
fprintf(stderr,"Can't load font %s\n",tabxobj[IdItem]->font);
|
|
}
|
|
else
|
|
{
|
|
XFreeFont(tabxobj[IdItem]->display,tabxobj[IdItem]->xfont);
|
|
tabxobj[IdItem]->xfont=xfont;
|
|
XSetFont(tabxobj[IdItem]->display,tabxobj[IdItem]->gc,tabxobj[IdItem]->xfont->fid);
|
|
}
|
|
tabxobj[IdItem]->DrawObj(tabxobj[IdItem]);
|
|
free(arg[0]);
|
|
free(arg[1]);
|
|
}
|
|
|
|
void ChangeSize (int NbArg,long *TabArg)
|
|
{
|
|
int i=0;
|
|
char *arg[3];
|
|
int an[3];
|
|
int IdItem;
|
|
|
|
arg[0]=CalcArg(TabArg,&i);
|
|
i++;
|
|
arg[1]=CalcArg(TabArg,&i);
|
|
i++;
|
|
arg[2]=CalcArg(TabArg,&i);
|
|
|
|
IdItem= TabIdObj[atoi(arg[0])];
|
|
for (i=1;i<3;i++)
|
|
an[i]=atoi(arg[i]);
|
|
tabxobj[IdItem]->width=an[1];
|
|
tabxobj[IdItem]->height=an[2];
|
|
XResizeWindow(x11base->display,tabxobj[IdItem]->win,an[1],an[2]);
|
|
tabxobj[IdItem]->DrawObj(tabxobj[IdItem]);
|
|
free(arg[0]);
|
|
free(arg[1]);
|
|
free(arg[2]);
|
|
}
|
|
|
|
void ChangeTitle (int NbArg,long *TabArg)
|
|
{
|
|
int i=0;
|
|
char *arg[2];
|
|
int IdItem;
|
|
|
|
arg[0]=CalcArg(TabArg,&i);
|
|
i++;
|
|
arg[1]=CalcArg(TabArg,&i);
|
|
IdItem= TabIdObj[atoi(arg[0])];
|
|
|
|
tabxobj[IdItem]->title=strdup(arg[1]);
|
|
tabxobj[IdItem]->DrawObj(tabxobj[IdItem]);
|
|
free(arg[0]);
|
|
free(arg[1]);
|
|
}
|
|
|
|
void ChangeIcon (int NbArg,long *TabArg)
|
|
{
|
|
int i=0;
|
|
char *arg[2];
|
|
int IdItem;
|
|
|
|
arg[0]=CalcArg(TabArg,&i);
|
|
i++;
|
|
arg[1]=CalcArg(TabArg,&i);
|
|
IdItem= TabIdObj[atoi(arg[0])];
|
|
/* if (tabxobj[IdItem]->icon!=NULL)
|
|
{
|
|
free(tabxobj[IdItem]->icon);
|
|
if (tabxobj[IdItem]->iconPixmap!=None)
|
|
XFreePixmap(tabxobj[IdItem]->display,tabxobj[IdItem]->iconPixmap);
|
|
if (tabxobj[IdItem]->icon_maskPixmap!=None)
|
|
XFreePixmap(tabxobj[IdItem]->display,tabxobj[IdItem]->icon_maskPixmap);
|
|
}*/
|
|
tabxobj[IdItem]->icon=strdup(arg[1]);
|
|
LoadIcon(tabxobj[IdItem]);
|
|
tabxobj[IdItem]->DrawObj(tabxobj[IdItem]);
|
|
free(arg[0]);
|
|
free(arg[1]);
|
|
}
|
|
|
|
void ChangeForeColor (int NbArg,long *TabArg)
|
|
{
|
|
int i=0;
|
|
char *arg[2];
|
|
int IdItem;
|
|
|
|
arg[0]=CalcArg(TabArg,&i);
|
|
i++;
|
|
arg[1]=CalcArg(TabArg,&i);
|
|
IdItem= TabIdObj[atoi(arg[0])];
|
|
|
|
/* Liberation de la couleur */
|
|
XFreeColors(tabxobj[IdItem]->display,*(tabxobj[IdItem])->colormap,
|
|
(void*)(&(tabxobj[IdItem])->TabColor[fore]),1,0);
|
|
|
|
tabxobj[IdItem]->forecolor=(char*)calloc(100,sizeof(char));
|
|
sprintf(tabxobj[IdItem]->forecolor,"%s",arg[1]);
|
|
|
|
MyAllocNamedColor(tabxobj[IdItem]->display,*(tabxobj[IdItem])->colormap,
|
|
tabxobj[IdItem]->forecolor,&(tabxobj[IdItem])->TabColor[fore]);
|
|
|
|
tabxobj[IdItem]->DrawObj(tabxobj[IdItem]);
|
|
|
|
free(arg[0]);
|
|
free(arg[1]);
|
|
|
|
}
|
|
|
|
void ChangeBackColor (int NbArg,long *TabArg)
|
|
{
|
|
int i=0;
|
|
char *arg[2];
|
|
int IdItem;
|
|
|
|
arg[0]=CalcArg(TabArg,&i);
|
|
i++;
|
|
arg[1]=CalcArg(TabArg,&i);
|
|
IdItem= TabIdObj[atoi(arg[0])];
|
|
|
|
/* Liberation de la couleur */
|
|
XFreeColors(tabxobj[IdItem]->display,*(tabxobj[IdItem])->colormap,
|
|
(void*)(&(tabxobj[IdItem])->TabColor[back]),1,0);
|
|
|
|
tabxobj[IdItem]->backcolor=(char*)calloc(100,sizeof(char));
|
|
sprintf(tabxobj[IdItem]->backcolor,"%s",arg[1]);
|
|
|
|
MyAllocNamedColor(tabxobj[IdItem]->display,*(tabxobj[IdItem])->colormap,
|
|
tabxobj[IdItem]->backcolor,&(tabxobj[IdItem])->TabColor[back]);
|
|
|
|
tabxobj[IdItem]->DrawObj(tabxobj[IdItem]);
|
|
|
|
free(arg[0]);
|
|
free(arg[1]);
|
|
}
|
|
|
|
void SetVar (int NbArg,long *TabArg)
|
|
{
|
|
int i;
|
|
char *str,*tempstr;
|
|
|
|
str=(char*)calloc(sizeof(char),1);
|
|
for (i=1;i<NbArg;i++)
|
|
{
|
|
tempstr=CalcArg(TabArg,&i);
|
|
str=(char*)realloc((void*)str,sizeof(char)*(1+strlen(str)+strlen(tempstr)));
|
|
str=strcat(str,tempstr);
|
|
free(tempstr);
|
|
}
|
|
|
|
free(TabVVar[TabArg[0]]);
|
|
TabVVar[TabArg[0]]=str;
|
|
}
|
|
|
|
void SendSign (int NbArg,long *TabArg)
|
|
{
|
|
int i=0;
|
|
char *arg[2];
|
|
int IdItem;
|
|
int TypeMsg;
|
|
|
|
arg[0]=CalcArg(TabArg,&i);
|
|
i++;
|
|
arg[1]=CalcArg(TabArg,&i);
|
|
IdItem= TabIdObj[atoi(arg[0])];
|
|
TypeMsg=atoi(arg[1]);
|
|
SendMsg(tabxobj[IdItem],TypeMsg);
|
|
free(arg[0]);
|
|
free(arg[1]);
|
|
}
|
|
|
|
void WarpPointer(int NbArg,long *TabArg)
|
|
{
|
|
int i=0;
|
|
char *arg;
|
|
int IdItem;
|
|
|
|
arg=CalcArg(TabArg,&i);
|
|
IdItem= TabIdObj[atoi(arg)];
|
|
/* Deplacement du pointeur sur l'objet */
|
|
XWarpPointer(x11base->display,None,tabxobj[IdItem]->win,0,0,0,0,
|
|
tabxobj[IdItem]->width/2,tabxobj[IdItem]->height+10);
|
|
free(arg);
|
|
}
|
|
|
|
void Quit (int NbArg,long *TabArg)
|
|
{
|
|
int i;
|
|
static XEvent event;
|
|
fd_set in_fdset;
|
|
extern int x_fd;
|
|
Atom MyAtom;
|
|
int NbEssai=0;
|
|
struct timeval tv;
|
|
|
|
#ifdef DEBUG /* For debugging */
|
|
XSync(x11base->display,0);
|
|
#endif
|
|
|
|
/* On cache la fenetre */
|
|
XUnmapWindow(x11base->display,x11base->win);
|
|
XFlush(x11base->display);
|
|
|
|
/* Le script ne possede plus la propriete */
|
|
MyAtom=XInternAtom(x11base->display,x11base->TabScriptId[1],False);
|
|
XSetSelectionOwner(x11base->display,MyAtom,x11base->root,CurrentTime);
|
|
|
|
/* On verifie si tous les messages ont ete envoyes */
|
|
while((BuffSend.NbMsg>0)&&(NbEssai<10000))
|
|
{
|
|
tv.tv_sec = 1;
|
|
tv.tv_usec = 0;
|
|
FD_ZERO(&in_fdset);
|
|
FD_SET(x_fd,&in_fdset);
|
|
select(32, SELECT_TYPE_ARG234 &in_fdset, NULL, NULL, &tv);
|
|
if (FD_ISSET(x_fd, &in_fdset))
|
|
{
|
|
if (XCheckTypedEvent(x11base->display,SelectionRequest,&event))
|
|
SendMsgToScript(event);
|
|
else
|
|
NbEssai++;
|
|
}
|
|
}
|
|
XFlush(x11base->display);
|
|
|
|
/* Attente de deux secondes afin d'etre sur que tous */
|
|
/* les messages soient arrives a destination */
|
|
/* On quitte proprement le serveur X */
|
|
for (i=0;i<nbobj;i++)
|
|
tabxobj[i]->DestroyObj(tabxobj[i]);
|
|
XFlush(x11base->display);
|
|
/* XSync(x11base->display,True);*/
|
|
sleep(2);
|
|
XFreeGC(x11base->display,x11base->gc);
|
|
XFreeColormap(x11base->display,x11base->colormap);
|
|
XDestroyWindow(x11base->display,x11base->win);
|
|
XCloseDisplay(x11base->display);
|
|
exit(0);
|
|
}
|
|
|
|
void IfThen (int NbArg,long *TabArg)
|
|
{
|
|
char *arg[10];
|
|
int i,j;
|
|
int CurrArg=0;
|
|
int IdFuncComp = 0;
|
|
|
|
/* Verification de la condition */
|
|
for (j=0;j<NbArg-2;j++)
|
|
{
|
|
if (TabArg[j]>100000) /* Cas du codage d'un nombre */
|
|
{
|
|
i=(int)TabArg[j]-200000;
|
|
arg[CurrArg]=(char*)calloc(1,sizeof(char)*10);
|
|
sprintf(arg[CurrArg],"%d",i);
|
|
CurrArg++;
|
|
}
|
|
else if (TabArg[j]<-200000)/* Cas d'un id de fonction de comparaison */
|
|
{
|
|
IdFuncComp=TabArg[j]+250000;
|
|
}
|
|
else if (TabArg[j]<-100000) /* Cas d'un id de fonction */
|
|
{
|
|
arg[CurrArg]=TabFunc[TabArg[j]+150000](&j,TabArg);
|
|
CurrArg++;
|
|
}
|
|
else /* Cas d'une variable */
|
|
{
|
|
arg[CurrArg]=strdup(TabVVar[TabArg[j]]);
|
|
CurrArg++;
|
|
}
|
|
}
|
|
|
|
/* Comparaison des arguments */
|
|
if (TabComp[IdFuncComp](arg[0],arg[1]))
|
|
ExecBloc((Bloc*)TabArg[NbArg-2]);
|
|
else if (TabArg[NbArg-1]!=0)
|
|
ExecBloc((Bloc*)TabArg[NbArg-1]);
|
|
|
|
free(arg[0]);
|
|
free(arg[1]);
|
|
}
|
|
|
|
/* Instruction boucle */
|
|
void Loop (int NbArg,long *TabArg)
|
|
{
|
|
int IdVar;
|
|
char *arg[2];
|
|
int limit[2];
|
|
int i;
|
|
int CurrArg=0;
|
|
|
|
/* le premier argument est une variable */
|
|
IdVar=TabArg[0];
|
|
/*On ajuste la taille de la var pour contenir un nombre */
|
|
TabVVar[TabArg[0]]=(char*)realloc(TabVVar[TabArg[0]],sizeof(char)*10);
|
|
/* Calcul des 2 autres arguments */
|
|
for (i=1;i<NbArg-1;i++)
|
|
{
|
|
if (TabArg[i]>100000) /* Cas du codage d'un nombre */
|
|
{
|
|
i=(int)TabArg[i]-200000;
|
|
arg[CurrArg]=(char*)calloc(1,sizeof(char)*10);
|
|
sprintf(arg[CurrArg],"%d",i);
|
|
}
|
|
else if (TabArg[i]<-100000) /* Cas d'un id de fonction */
|
|
{
|
|
arg[CurrArg]=TabFunc[TabArg[i]+150000](&i,TabArg);
|
|
}
|
|
else /* Cas d'une variable */
|
|
arg[CurrArg]=strdup(TabVVar[TabArg[i]]);
|
|
CurrArg++;
|
|
}
|
|
limit[0]=atoi(arg[0]);
|
|
limit[1]=atoi(arg[1]);
|
|
if (limit[0]<limit[1])
|
|
for (i=limit[0];i<=limit[1];i++)
|
|
{
|
|
/* On met a jour la variable */
|
|
sprintf(TabVVar[TabArg[0]],"%d",i);
|
|
ExecBloc((Bloc*)TabArg[NbArg-1]);
|
|
}
|
|
else
|
|
for (i=limit[0];i<=limit[1];i++)
|
|
{
|
|
sprintf(TabVVar[TabArg[0]],"%d",i);
|
|
ExecBloc((Bloc*)TabArg[NbArg-1]);
|
|
}
|
|
|
|
free(arg[0]);
|
|
free(arg[1]);
|
|
}
|
|
|
|
/* Instruction While */
|
|
void While (int NbArg,long *TabArg)
|
|
{
|
|
char *arg[3],*str;
|
|
int i;
|
|
int Loop=1;
|
|
int IdFuncComp;
|
|
|
|
while (Loop)
|
|
{
|
|
i=0;
|
|
arg[0]=CalcArg(TabArg,&i);
|
|
i++;
|
|
str=CalcArg(TabArg,&i);
|
|
IdFuncComp=atoi(str);
|
|
free(str);
|
|
i++;
|
|
arg[1]=CalcArg(TabArg,&i);
|
|
|
|
Loop=TabComp[IdFuncComp](arg[0],arg[1]);
|
|
if (Loop) ExecBloc((Bloc*)TabArg[NbArg-1]);
|
|
free(arg[0]);
|
|
free(arg[1]);
|
|
}
|
|
}
|
|
|
|
|
|
void WriteToFile (int NbArg,long *TabArg)
|
|
{
|
|
int i=0;
|
|
char *arg[2],str[50],*tempstr,*home,*file;
|
|
FILE *f;
|
|
char StrBegin[100];
|
|
char StrEnd[10];
|
|
size_t size;
|
|
char *buf;
|
|
int maxsize=32000;
|
|
int CurrPos=0,CurrPos2;
|
|
int OldPID;
|
|
|
|
arg[0]=CalcArg(TabArg,&i);
|
|
arg[1]=(char*)calloc(1,256);
|
|
for (i=1;i<NbArg;i++)
|
|
{
|
|
tempstr=CalcArg(TabArg,&i);
|
|
arg[1]=strcat(arg[1],tempstr);
|
|
free(tempstr);
|
|
}
|
|
if (arg[1][strlen(arg[1])-1]!='\n')
|
|
{
|
|
i=strlen(arg[1]);
|
|
arg[1]=(char*)realloc(arg[1],strlen(arg[1])+2);
|
|
arg[1][i]='\n';
|
|
arg[1][i+1]='\0';
|
|
}
|
|
|
|
sprintf(StrEnd,"#end\n");
|
|
sprintf(StrBegin,"#%s,",ScriptName);
|
|
|
|
buf=(char*)calloc(1,maxsize);
|
|
|
|
if (arg[0][0]!='/')
|
|
{
|
|
file=strdup(arg[0]);
|
|
home=getenv("HOME");
|
|
arg[0]=(char*)realloc(arg[0],sizeof(char)*(strlen(arg[0])+4+strlen(home)));
|
|
sprintf(arg[0],"%s/%s",home,file);
|
|
/* free(home);*/ /* BUG */
|
|
free(file);
|
|
}
|
|
f=fopen(arg[0],"a+");
|
|
fseek(f,0,SEEK_SET);
|
|
size=fread(buf,1,maxsize,f);
|
|
while(((strncmp(StrBegin,&buf[CurrPos],strlen(StrBegin)))!=0)&&(CurrPos<size))
|
|
CurrPos++;
|
|
if (CurrPos==size)
|
|
{
|
|
sprintf(buf,"%s\n%s%d\n",buf,StrBegin,getpid());
|
|
sprintf(buf,"%s%s",buf,arg[1]);
|
|
sprintf(buf,"%s%s\n",buf,StrEnd);
|
|
}
|
|
else
|
|
{
|
|
sscanf(&buf[CurrPos+strlen(StrBegin)],"%d",&OldPID);
|
|
if (OldPID==getpid())
|
|
{
|
|
sprintf(str,"%d\n",OldPID);
|
|
while(((strncmp(StrEnd,&buf[CurrPos],strlen(StrEnd)))!=0)&&(CurrPos<size))
|
|
CurrPos++;
|
|
memmove(&buf[CurrPos+strlen(arg[1])],&buf[CurrPos],strlen(buf)-CurrPos);
|
|
memmove(&buf[CurrPos],arg[1],strlen(arg[1]));
|
|
}
|
|
else /* Remplacement des anciennes commandes */
|
|
{
|
|
CurrPos=CurrPos+strlen(StrBegin);
|
|
CurrPos2=CurrPos;
|
|
while(((strncmp(StrEnd,&buf[CurrPos2],strlen(StrEnd)))!=0)&&(CurrPos2<size))
|
|
CurrPos2++;
|
|
sprintf(str,"%d\n%s",getpid(),arg[1]);
|
|
memmove(&buf[CurrPos+strlen(str)],&buf[CurrPos2],strlen(buf)-CurrPos2);
|
|
buf[strlen(buf)-((CurrPos2-CurrPos)-strlen(str))]='\0';
|
|
memmove(&buf[CurrPos],str,strlen(str));
|
|
}
|
|
}
|
|
|
|
fclose(f);
|
|
f=fopen(arg[0],"w");
|
|
if (f==NULL)
|
|
{
|
|
fprintf(stderr,"Enable to open file %s\n",arg[0]);
|
|
return;
|
|
}
|
|
fwrite(buf,1,strlen(buf),f);
|
|
fclose(f);
|
|
|
|
free(arg[0]);
|
|
free(arg[1]);
|
|
}
|
|
|
|
void SendToScript (int NbArg,long *TabArg)
|
|
{
|
|
char *tempstr,*Msg,*R;
|
|
int dest;
|
|
int j=0;
|
|
Atom myatom;
|
|
|
|
/* Calcul destinataire */
|
|
tempstr=CalcArg(TabArg,&j);
|
|
dest=(int)atoi(tempstr);
|
|
free(tempstr);
|
|
|
|
/* Calcul contenu */
|
|
Msg=(char*)calloc(256,sizeof(char));
|
|
for (j=1;j<NbArg;j++)
|
|
{
|
|
tempstr=CalcArg(TabArg,&j);
|
|
Msg=(char*)realloc((void*)Msg,strlen(Msg)+strlen(tempstr)+1);
|
|
Msg=strcat(Msg,tempstr);
|
|
free(tempstr);
|
|
}
|
|
|
|
/* Calcul recepteur */
|
|
R=(char*)calloc(strlen(x11base->TabScriptId[dest])+1,sizeof(char));
|
|
sprintf(R,"%s",x11base->TabScriptId[dest]);
|
|
myatom=XInternAtom(x11base->display,R,True);
|
|
|
|
if ((BuffSend.NbMsg<40)&&(XGetSelectionOwner(x11base->display,myatom)!=None))
|
|
{
|
|
/* Enregistrement dans le buffer du message */
|
|
BuffSend.TabMsg[BuffSend.NbMsg].Msg=Msg;
|
|
/* Enregistrement dans le buffer du destinataire */
|
|
BuffSend.TabMsg[BuffSend.NbMsg].R=R;
|
|
/* Enregistrement du message */
|
|
BuffSend.NbMsg++;
|
|
|
|
/* Reveil du destinataire */
|
|
XConvertSelection(x11base->display,XInternAtom(x11base->display,x11base->TabScriptId[dest],True)
|
|
,propriete,propriete,x11base->win,CurrentTime);
|
|
}
|
|
else
|
|
{
|
|
fprintf(stderr,"Too many messages sended\n");
|
|
free(Msg);
|
|
}
|
|
}
|
|
|
|
/****************************************************/
|
|
/* Fonction d'initialisation de TabCom et TabFunc */
|
|
/****************************************************/
|
|
void InitCom()
|
|
{
|
|
/* commande */
|
|
TabCom[1]=Exec;
|
|
TabCom[2]=HideObj;
|
|
TabCom[3]=ShowObj;
|
|
TabCom[4]=ChangeValue;
|
|
TabCom[5]=ChangePos;
|
|
TabCom[6]=ChangeSize;
|
|
TabCom[7]=ChangeIcon;
|
|
TabCom[8]=ChangeTitle;
|
|
TabCom[9]=ChangeFont;
|
|
TabCom[10]=ChangeForeColor;
|
|
TabCom[11]=SetVar;
|
|
TabCom[12]=SendSign;
|
|
TabCom[13]=Quit;
|
|
TabCom[14]=IfThen;
|
|
TabCom[15]=Loop;
|
|
TabCom[16]=While;
|
|
TabCom[17]=WarpPointer;
|
|
TabCom[18]=WriteToFile;
|
|
TabCom[19]=ChangeBackColor;
|
|
TabCom[21]=ChangeValueMax;
|
|
TabCom[22]=ChangeValueMin;
|
|
TabCom[23]=SendToScript;
|
|
|
|
/* Fonction */
|
|
TabFunc[1]=FuncGetValue;
|
|
TabFunc[2]=FuncGetTitle;
|
|
TabFunc[3]=FuncGetOutput;
|
|
TabFunc[4]=FuncNumToHex;
|
|
TabFunc[5]=FuncHexToNum;
|
|
TabFunc[6]=FuncAdd;
|
|
TabFunc[7]=FuncMult;
|
|
TabFunc[8]=FuncDiv;
|
|
TabFunc[9]=FuncStrCopy;
|
|
TabFunc[10]=LaunchScript;
|
|
TabFunc[11]=GetScriptFather;
|
|
TabFunc[12]=ReceivFromScript;
|
|
TabFunc[13]=RemainderOfDiv;
|
|
TabFunc[14]=GetTime;
|
|
TabFunc[15]=GetScriptArg;
|
|
|
|
/* Fonction de comparaison */
|
|
TabComp[1]=Inf;
|
|
TabComp[2]=InfEq;
|
|
TabComp[3]=Equal;
|
|
TabComp[4]=SupEq;
|
|
TabComp[5]=Sup;
|
|
TabComp[6]=Diff;
|
|
|
|
}
|