⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gobject.c

📁 LastWave
💻 C
📖 第 1 页 / 共 5 页
字号:
    /*       * First we perform the messages that cannot be redifined by class messages     */        /* Delete message */    if (!strcmp(msge,"delete")) {       SetResultInt((int) DeleteGObject(o));      continue;    }    /* Back message */    if (!strcmp(msge,"back")) {       BackGObject(o,YES);            SetResultInt(1);      continue;    }    /* Front message */    if (!strcmp(msge,"front")) {       FrontGObject(o,YES);            SetResultInt(1);      continue;    }      /* IsIn message */    if (!strcmp(msge,"isin")) {       argv = ParseArgv(argv,tFLOAT,&fx,tFLOAT,&fy,0);      Local2Global(o,fx,fy,&x,&y);      SetResultInt(IsInGObject(o,&o1,x,y)>=0);      o->classCur = o->gclass;      continue;    }    /* move message */    if (!strcmp(msge,"move")) {       argv = ParseArgv(argv,tFLOAT,&rx,tFLOAT,&ry,0);      MoveResizeDrawGObject(o,rx,ry,o->rw,o->rh);      SetResultInt(1);      o->classCur = o->gclass;      continue;    }    /* pmove message */    if (!strcmp(msge,"pmove")) {       argv = ParseArgv(argv,tINT,&w,tINT,&h,0);      if (!IsWin(o)) {        Local2Global((GOBJECT) o->father,o->rx,o->ry,&x,&y);        Global2Local((GOBJECT) o->father,x+w,y+h,&rx,&ry);      }      else {        rx = o->x+w;        ry = o->y+h;      }      MoveResizeDrawGObject(o,rx,ry,o->rw,o->rh);      SetResultInt(1);      o->classCur = o->gclass;      continue;    }    /* class message */    if (!strcmp(msge,"class")) {       argv = ParseArgv(argv,tSTR_,NULL,&str,0);      if (str != NULL) {        class = (GCLASS) GetElemHashTable(theGClasses,str);        if (class == NULL) Errorf("Class '%s' does not exist",str);        SetResultInt((int) IsSubClass(o->gclass,class));      }      else SetResultStr(o->gclass->name);      o->classCur = o->gclass;      continue;    }    /* id message */    if (!strcmp(msge,"id")) {       NoMoreArgs(argv);      SetResultf("%p",o);      o->classCur = o->gclass;      continue;    }        /* resize message */    if (!strcmp(msge,"resize")) {       argv = ParseArgv(argv,tFLOAT,&rw,tFLOAT,&rh,0);      MoveResizeDrawGObject(o,o->rx,o->ry,rw,rh);      SetResultInt(1);      o->classCur = o->gclass;      continue;    }    /* g2l message */    if (!strcmp(msge,"g2l")) {       argv = ParseArgv(argv,tINT,&x,tINT,&y,tINT_,-1,&w,tINT_,-1,&h,0);      if (w < 0 || h < 0)  {        Global2Local(o,x,y,&rx,&ry);        lv = TNewListv();        AppendFloat2Listv(lv,rx);        AppendFloat2Listv(lv,ry);        SetResultValue(lv);      }      else {        Global2LocalRect(o,x,y,w,h,&rx,&ry,&rw,&rh,NormalRect);        lv = TNewListv();        AppendFloat2Listv(lv,rx);        AppendFloat2Listv(lv,ry);        AppendFloat2Listv(lv,rw);        AppendFloat2Listv(lv,rh);        SetResultValue(lv);      }      o->classCur = o->gclass;      continue;    }    /* l2g message */    if (!strcmp(msge,"l2g")) {       argv = ParseArgv(argv,tFLOAT,&rx,tFLOAT,&ry,tFLOAT_,-1.,&rw,tFLOAT_,-1.,&rh,0);      if (rw < 0 || rh < 0)  {        Local2Global(o,rx,ry,&x,&y);        lv = TNewListv();        AppendInt2Listv(lv,x);        AppendInt2Listv(lv,y);        SetResultValue(lv);      }      else {        Local2GlobalRect(o,rx,ry,rw,rh,LargeRect,&x,&y,&w,&h);        lv = TNewListv();        AppendInt2Listv(lv,x);        AppendInt2Listv(lv,y);        AppendInt2Listv(lv,w);        AppendInt2Listv(lv,h);        SetResultValue(lv);      }      o->classCur = o->gclass;      continue;    }    /* father message */    if (!strcmp(msge,"father")) {       NoMoreArgs(argv);      if (o->father == NULL) SetResultValue(nullValue);      else {        SetResultStr(GetNameGObject((GOBJECT) (o->father)));        o->classCur = o->gclass;      }      continue;    }    /* Hide message */    if (!strcmp(msge,"hide")) {       NoMoreArgs(argv);      HideGObject(o);      SetResultInt(1);      o->classCur = o->gclass;      continue;    }    /* Show message */    if (!strcmp(msge,"show")) {       NoMoreArgs(argv);      ShowGObject(o);      SetResultInt(1);      o->classCur = o->gclass;      continue;    }    /* Class dependent messages */    class = o->classCur;    while (class != NULL) {      /* Should we execute a script ? */      if (class->msgeSCommand && strcmp(*argv1,"add")) {        DoScriptArgv(o,class->msgeSCommand,argv1);        if (toplevelCur->flagReturn) break;      }      /* Should we execute a C function ? */      else if (class->msge) {        if ((*(class->msge))(o,msge,argv)) break;      }      /* Try the fatherClass */      class = class->fatherClass;    }        o->classCur = o->gclass;  }}/*************************************************** * * * Functions that deal with parsing GObjects * * ***************************************************//* * Search for a list  of  gobjects whose name matches the pattern 'filter' * The gobjects must be direct son (if flagDeepSearch == NO) of 'o' or any  * son of 'o' (if flagDeepSearch == YES). * If list == NULL then the gobjects we are searching for are windows. * The gobjects must be of class 'class' (unless class == NULL) * The result list is set in the array 'gobjects' and the length of this list is set in '*nGObjects'. * The list must have a maximum length of 'maxNGObjects' * * It returns NO if an error occurred otherwise it returns YES. */  static char SearchGObjectList(GOBJECT o, char *filter, GCLASS class, int maxNGObjects, GOBJECT *gobjects,int *nGObjects, char flagDeepSearch) {  GOBJECT obj;  GLIST list;  HASHTABLE hash;  GOBJECT back;  char *str;  char flagWild;      /* If name is ^ then we must go 1 level up */  if (!strcmp(filter,"^")) {    if (o == NULL) return(YES);    if (class && !IsSubClass(o->father->gclass,class)) return(YES);    gobjects[(*nGObjects)++] = (GOBJECT) o->father;    return(YES);  }    if (o && !IsGList(o)) Errorf("SearchGObjectList() : Weird error");  list = (GLIST) o;    /* If list  is NULL we must use the window hashtable otherwise we use the glist hashtable */  if (list == NULL) {    hash = theWindowsHT;    back = (GOBJECT) theWindows;  }  else {    hash = list->theGObjects;    back = list->back;  }    /* Does the filter contain a wild card character ? */  flagWild = NO;  str = filter;  while (*str != '\0') {    if (*str == '*' || *str == '[' || *str == '?') {      flagWild = YES;      break;    }    str++;  }       /* Look at the first level of the glist */  /* If there is no wild card character we just use the hash table */  if (!flagWild) {    obj = (GOBJECT) GetElemHashTable(hash,filter);    if (obj != NULL) {      if (*nGObjects>=maxNGObjects) return(YES);      if (!class || IsSubClass(obj->gclass,class)) {        gobjects[(*nGObjects)++] = obj;      }    }  }  else {    /* Otherwise we have to go through the whole 'back' list */    for (obj = back; obj != NULL; obj = obj->front) {      if (class && !IsSubClass(obj->gclass,class)) continue;      if (MatchStr(obj->name,filter)) {        if (*nGObjects>=maxNGObjects) return(YES);        gobjects[(*nGObjects)++] = obj;      }    }  }    if (!flagDeepSearch) return(YES);    /* Recursive search */  for (obj = back; obj != NULL; obj = obj->front) {    if (IsGList(obj)) {      if (!SearchGObjectList(obj,filter,class,maxNGObjects,gobjects,nGObjects,flagDeepSearch)) return(NO);    }  }    return(YES);}/* * Parse the string 'str0' which must be a valid gobject filter name (using wild cards) and returns the list of the matching gobjects * * The result list is set in the array 'gobjects' and the length of this list is set in '*nGObjects'. * The list must have a maximum length of 'maxNGObjects' * If 'glist' is not NULL then 'str0' starts with a dot and the objects should be sons (direct or not) of 'glist'. * * It returns NO if an error occurred otherwise it returns YES. */  static char ParseGObjectList__(char *str0, GLIST glist, int maxNGObjects, GOBJECT *gobjects,int *nGObjects){  WINDOW win;  GOBJECT *list1,*list2,*list;  int nList1,nList2,n,i;  char c;  char *str1, *str2;  char flagDeepSearch;  GCLASS class,class1;  static GOBJECT gobjList1[MaxSizeGObjectList],gobjList2[MaxSizeGObjectList];    /* init the result */  *nGObjects = 0;  /* Some basic tests */    if (str0 == NULL) return(YES);  if (*str0 == '\0') return(YES);    /* If glist is not NULL then the begining is easy */  if (glist != NULL) {    if (*str0 != '.') {      SetErrorf("ParseGObjectList__() : Bad name '%s' for gobject of glist '%s'",str0,GetNameGObject((GOBJECT) glist));      return(NO);    }    str1 = str0;    class = NULL;    *gobjList1 = (GOBJECT) glist;    nList1 = 1;  }    /* Otherwise it's a whole different story ! */  else {        /*     * Getting an eventual class conversion 'class:a.b.c'      */    class = NULL;    str1 = str0;    while (*str1 != '\0' && *str1 != ':') str1++;    if (*str1 == ':') {      *str1 = '\0';      class = (GCLASS) GetElemHashTable(theGClasses,str0);      if (class == NULL) {        SetErrorf("ParseGObjectList__() : Bad class name in gobject name '%s'",str0);        *str1 = ':';        return(NO);      }      *str1 = ':';      str0 = str1+1;    }                 /* If it starts with a '.', we must get the current window */    if (*str0 == '.') {          if (ParseWindow_(".",NULL,&win) == NO) return(NO);         /* If there is nothing else then we must check the class if any and return */      if (str0[1] == '\0') {        if (class && !IsSubClass(win->gclass,class)) {          SetErrorf("ParseGObjectList__() : Bad class '%s' for current window '%s'",class->name,win->name);          return (NO);        }         *gobjects = (GOBJECT) win;        (*nGObjects)++;        if (class) gobjects[0]->classCur = class;        else gobjects[0]->classCur = gobjects[0]->gclass;        return(YES);      }      str1 = str0;          gobjList1[0] = (GOBJECT) win;      nList1 = 1;      }      /* Otherwise we look for the first name */    else {      str1 = str0;      while(*str1 != '\0' && *str1 != '.') str1++;      c = *str1;      *str1 = '\0';          /* Search for @Variables first */      if (*str0 == '@') {         if (toplevelCur->lastEvent == NULL || toplevelCur->lastEvent->type == NoEvent || toplevelCur->lastEvent->object == NULL) {          SetErrorf("ParseGObjectList__() : No current gobject event for @ variable",str0);          *str1 = c;          return(NO);            }        if (!strncmp(str0,"@object",7)) {          str2 = str0+7;          *gobjList1 = toplevelCur->lastEvent->object;        }        else if (!strncmp(str0,"@father",7)) {          *gobjList1 = (GOBJECT) toplevelCur->lastEvent->object->father;          if (*gobjList1 == NULL) {            SetErrorf("ParseGObjectList__() : Current event gobject does not have any father",str0);            *str1 = c;            return(NO);          }          str2 = str0+7;        }        else if (!strncmp(str0,"window",7)) {          *gobjList1 = (GOBJECT) GetWin(toplevelCur->lastEvent->object);          str2 = str0+6;        }        else {          SetErrorf("ParseGObjectList__() : Bad object name '%s'",str0);          return(NO);        }            /* Are we done ? */         *str1 = c;            if (c != '.' && c != '\0') {          SetErrorf("ParseGObjectList__() : Bad event variable '%s'",str0);          return(NO);        }        if (c == '\0') {          if (class && !IsSubClass((*gobjList1)->gclass,class)) {            SetErrorf("ParseGObjectList__() : Bad class '%s' for gobject '%s'",class->name,(*gobjList1)->name);            return (NO);          }          *gobjects = *gobjList1;          *nGObjects = 1;          if (class) gobjects[0]->classCur = class;          else gobjects[0]->classCur = gobjects[0]->gclass;          return(YES);        }              /* Get ready for the following */        nList1 = 1;        str1 = str2;            }        /* Regular variables */      else {        if (c == '\0') {          SearchGObjectList(NULL,str0,class,maxNGObjects,gobjects,nGObjects,NO);          *str1 = c;          if (class) {            for (i=0;i< (*nGObjects);i++) {              gobjects[i]->classCur = class;            }          }          return(YES);        }        else if (str1[1] != '^') {          n = 0;          SearchGObjectList(NULL,str0,theGListClass,MaxSizeGObjectList,gobjList1,&n,NO);          nList1 = n;        }        else {          n = 0;          SearchGObjectList(NULL,str0,NULL,MaxSizeGObjectList,gobjList1,&n,NO);          nList1 = n;        }        *str1 = c;        if (n == 0) return(YES);      }    }  }    /* Some inits before the loop */  list1 = gobjList1;  list2 = gobjList2;  nList2 = 0;  if (*str1 != '.') Errorf("MERDE");    if (nList1 != 1) Errorf("MERDE1");    /* Now we start The Loop ! (str1 is pointing to a '.') */  while(1) {    if (*str1 != '.') Errorf("MERDE2");      /* If there is two dots then we should 'deep search' the next object */    str1++;    if (str1[0] == '.') {      flagDeepSearch = YES;      str1++;    } else flagDeepSearch = NO;        /* Look for the next name */    str2 = str1;    while(*str2 != '\0' && *str2 != '.') str2++;    c = *str2;    *str2 = '\0';        /* Let's loop on the object of list1 and get list2 */    if (c == '\0') class1 = class;    else if (str2[1] != '^') class1 = theGListClass;    else class1 = NULL;    nList2 = 0;    for (i=0;i<nList1;i++) {      SearchGObjectList(list1[i],str1,class1,MaxSizeGObjectList,list2,&nList2,flagDeepSearch);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -