summaryrefslogtreecommitdiff
path: root/app/fvwm/extras/FvwmScript/Instructions.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/fvwm/extras/FvwmScript/Instructions.c')
-rw-r--r--app/fvwm/extras/FvwmScript/Instructions.c1266
1 files changed, 1266 insertions, 0 deletions
diff --git a/app/fvwm/extras/FvwmScript/Instructions.c b/app/fvwm/extras/FvwmScript/Instructions.c
new file mode 100644
index 000000000..29aa2f083
--- /dev/null
+++ b/app/fvwm/extras/FvwmScript/Instructions.c
@@ -0,0 +1,1266 @@
+#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;
+
+}