int delete_key_handler(char *input, int *cursor, int *len) { int this_cursor = *cursor; int this_len = *len; if (this_len != this_cursor) { int i; int len; /* 从光标所在位置开始,输入字符串依次向后移动一位 */ for (i = this_cursor; i < this_len; i++) input[i] = input[i + 1]; /* 输入字符串最后一个字符清零 */ input[this_len--] = '\0'; /* 计算从光标所在位置字符串长度 */ len = strlen(input + this_cursor); /* 输出从光标所在位置开始的字符串 */ sh_write(input + this_cursor, len); /* 输出空格,覆盖最后一个字符 */ sh_write(" ", 1); /* 光标回退 */ for (i = 0; i <= len; i++) sh_write("\b", 1); } *cursor = this_cursor; *len = this_len; return RET_READ_CHAR_CONT; }
void send_net(net_header_rec *nh, unsigned int *list, char *text, char *byname) { int f; char s[100]; long l1; sprintf(s,"%sP0-WT.NET",net_data); f=sh_open(s,O_RDWR | O_BINARY | O_APPEND | O_CREAT, S_IREAD | S_IWRITE); sh_lseek(f,0L,SEEK_END); if (!list) nh->list_len=0; if (!text) nh->length=0; if (nh->list_len) nh->tosys=0; l1=nh->length; if (byname && *byname) nh->length += strlen(byname)+1; sh_write(f,(void *)nh,sizeof(net_header_rec)); if (nh->list_len) sh_write(f,(void *)list,2*(nh->list_len)); if (byname && *byname) sh_write(f,byname, strlen(byname)+1); if (nh->length) sh_write(f,(void *)text,l1); sh_close(f); }
long huge_xfer(int fd, void huge *buf, unsigned sz, unsigned nel, int wr) { long nxfr=0, len=((long)sz) * ((long)nel); char huge *xbuf = (char huge *)buf; unsigned cur,cur1; while (len>0) { if (len>MAX_XFER) cur=MAX_XFER; else cur=len; if (wr) cur1=sh_write(fd,(char *)xbuf,cur); else cur1=sh_read(fd,(char *)xbuf,cur); if (cur1!=65535) { len -= cur1; nxfr += cur1; xbuf = ((char huge *)buf) + nxfr; /* not xbuf += cur1 due to bug in certain version of compiler */ } if (cur1!=cur) break; } return(nxfr); }
static void input_back(int back, char *input, int *cursor, int *len) { int this_cursor = *cursor; int this_len = *len; while (back--) { if (this_len == this_cursor) { input[--this_cursor] = 0; sh_write("\b \b", 3); } else { int i; int len; /* 光标位置向后移动一位 */ this_cursor--; /* 从光标所在位置开始,输入字符串依次向后移动一位 */ for (i = this_cursor; i <= this_len; i++) { input[i] = input[i + 1]; } /* 计算从光标所在位置字符串长度 */ len = strlen(input + this_cursor); /* 输出退格符,并且光标位置向后移动一位,即覆盖要删除的字符 */ sh_write("\b", 1); /* 输出从光标所在位置开始的字符串 */ sh_write(input + this_cursor, len); /* 输出空格,覆盖最后一个字符 */ sh_write(" ", 1); /* 光标回退 */ for (i = 0; i <= len; i++) { sh_write("\b", 1); } } this_len--; } *cursor = this_cursor; *len = this_len; return; }
void save_gat(int f) { long l; l=((long)gat_section)*GATSECLEN; sh_lseek(f,l,SEEK_SET); sh_write(f,(void *)gat,4096); lock_status(); status.filechange[filechange_posts]++; save_status(); }
void add_post(postrec *pp) { postrec p; int close_file=0; /* open the sub, if necessary */ if (sub_f <= 0) { open_sub(1); close_file=1; } if (sub_f>=0) { /* get updated info */ read_status(); sh_lseek(sub_f, 0L, SEEK_SET); sh_read(sub_f, &p, sizeof(postrec)); /* one more post */ p.owneruser++; nummsgs=p.owneruser; sh_lseek(sub_f, 0L, SEEK_SET); sh_write(sub_f, &p, sizeof(postrec)); /* add the new post */ sh_lseek(sub_f, ((long)nummsgs)*sizeof(postrec), SEEK_SET); sh_write(sub_f, pp, sizeof(postrec)); /* we've modified the sub */ believe_cache=0; subchg=0; sub_dates[curlsub]=pp->qscan; } if (close_file) close_sub(); }
int ctrl_B_key_handler(char *input, int *cursor, int *len) { int this_cursor = *cursor; if (this_cursor) { sh_write("\b", 1); this_cursor--; } *cursor = this_cursor; return RET_READ_CHAR_CONT; }
void x_on_keypress(XEvent *event) { XKeyEvent *e = &event->xkey; KeySym ksym; char buf[32]; int len; Status status; len = XmbLookupString(X.xic, e, buf, sizeof(buf)-1, &ksym, &status); if (!term_handle_keypress(ksym, e->state) && len > 0) { sh_write(buf, len); } }
int ctrl_F_key_handler(char *input, int *cursor, int *len) { int this_cursor = *cursor; int this_len = *len; if (this_cursor < this_len) { sh_write(&input[this_cursor], 1); this_cursor++; } *cursor = this_cursor; *len = this_len; return RET_READ_CHAR_CONT; }
void save_status(void) /* saves system status in memory to disk */ { char s[81]; if (statusfile<0) { sprintf(s,"%sSTATUS.DAT",syscfg.datadir); statusfile=sh_open1(s,O_RDWR | O_BINARY); } else { lseek(statusfile, 0L, SEEK_SET); } if (statusfile<0) { printf("STATUS.DAT >CANNOT< be saved!!"); } else { sh_write(statusfile, (void *)(&status), sizeof(statusrec)); statusfile=sh_close(statusfile); } }
int ctrl_P_key_handler(char *input, int *cursor, int *len) { char *history_input = NULL; sh_clean_input(input, cursor, len); history_input = get_prev_history(); if (history_input) { strcpy(input, history_input); *cursor = *len = strlen(input); sh_write(input, *len); } return RET_READ_CHAR_CONT; }
void write_user(unsigned int un, userrec *u) { char s[81]; long pos; int f; if ((un<1) || (un>syscfg.maxusers)) return; sprintf(s,"%sUSER.LST",syscfg.datadir); f=sh_open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE); if (f>=0) { pos=((long) syscfg.userreclen) * ((long) un); sh_lseek(f,pos,SEEK_SET); sh_write(f, (void *)u, syscfg.userreclen); sh_close(f); } }
void savebase(int b) /* saves message information in memory to disk */ { int f; char s[81]; sprintf(s, "%s%s.SUB", syscfg.datadir, subboards[b].filename); f = sh_open(s, O_RDWR | O_BINARY | O_TRUNC | O_CREAT, S_IREAD | S_IWRITE); sh_lseek(f, 0L, SEEK_SET); msgs[0].owneruser = nummsgs; sh_write(f, (void *)(&msgs[0]), ((nummsgs+1) * sizeof(postrec))); sh_close(f); if (nummsgs) { sub_dates[b]=msgs[nummsgs].qscan; } else { sub_dates[b]=1; } lock_status(); status.filechange[filechange_posts]++; save_status(); }
void remove_link(messagerec *m1, char *aux) /* deletes a message */ { messagerec m; char s[81],s1[81]; int f; long csec,nsec; m=*m1; strcpy(s,syscfg.msgsdir); switch(m.storage_type) { case 0: case 1: ltoa(m.stored_as,s1,16); if (m.storage_type==1) { strcat(s,aux); strcat(s,"\\"); } strcat(s,s1); unlink(s); break; case 2: f=open_file(aux); csec=m.stored_as; while ((csec>0) && (csec<2048)) { nsec=(long) gat[csec]; gat[csec]=0; csec=nsec; } sh_lseek(f,0L,SEEK_SET); sh_write(f,(void *)gat,4096); sh_close(f); break; default: /* illegal storage type */ break; } setcbrk(1); }
int ctrl_H_key_handler(char *input, int *cursor, int *len) { int back = 0; int this_len = *len; int this_cursor = *cursor; if (this_len == 0 || this_cursor == 0) { sh_write("\a", 1); return RET_READ_CHAR_CONT; } back = 1; if (back) { input_back(back, input, cursor, len); return RET_READ_CHAR_CONT; } return RET_READ_CHAR_DONE; }
void set_gat_section(int f, int section) { long l,l1; int i; if (gat_section!=section) { l=filelength(f); l1=((long)section)*GATSECLEN; if (l<l1) { chsize(f,l1); l=l1; } sh_lseek(f,l1,SEEK_SET); if (l<(l1+4096L)) { for (i=0; i<2048; i++) gat[i]=0; sh_write(f,(void *)gat, 4096); } else { sh_read(f,(void *)gat, 4096); } gat_section=section; } }
int open_file(char *fn) /* opens a WWIV Type-2 data file */ { int f,i; char s[81]; sprintf(s,"%s%s.DAT",syscfg.msgsdir,fn); f=sh_open1(s,O_RDWR | O_BINARY); if (f<0) { f=sh_open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE); for (i=0; i<2048; i++) gat[i]=0; sh_write(f,(void *)gat,4096); strcpy(gatfn,fn); /* chsize(f,4096L + (75L * 1024L)); */ } if (strcmp(gatfn,fn)) { sh_lseek(f,0L,SEEK_SET); sh_read(f,(void *)gat,4096); strcpy(gatfn,fn); } return(f); }
void savefile(char *b, long l1, messagerec *m1, char *aux) /* saves a message in memory to disk */ { int f,gatp,i5,i4,gati[128]; messagerec m; char s[81],s1[81]; int section; long l2; setcbrk(0); m=*m1; switch(m.storage_type) { case 0: case 1: lock_status(); m.stored_as=status.qscanptr++; save_status(); ltoa(m.stored_as,s1,16); strcpy(s,syscfg.msgsdir); if (m.storage_type==1) { strcat(s,aux); strcat(s,"\\"); } strcat(s,s1); f=sh_open(s,O_RDWR | O_CREAT | O_BINARY,S_IREAD | S_IWRITE); sh_write(f, (void *)b,l1); sh_close(f); break; case 2: f=open_file(aux); if (f>0) { for (section=0; section<1024; section++) { set_gat_section(f,section); gatp=0; i5=(int) ((l1 + 511L)/512L); i4=1; while ((gatp<i5) && (i4<2048)) { if (gat[i4]==0) gati[gatp++]=i4; ++i4; } if (gatp>=i5) { l2=MSG_STARTING; gati[gatp]=-1; for (i4=0; i4<i5; i4++) { sh_lseek(f,l2 + 512L * (long)(gati[i4]),SEEK_SET); sh_write(f,(void *)(&b[i4*512]),512); gat[gati[i4]]=gati[i4+1]; } save_gat(f); break; } } sh_close(f); } m.stored_as=((long) gati[0]) + ((long)gat_section)*2048L; break; case 255: f=sh_open(aux,O_RDWR | O_CREAT | O_BINARY,S_IREAD | S_IWRITE); sh_write(f, (void *)b,l1); sh_close(f); break; default: break; } farfree((void *)b); *m1=m; }
int ctrl_C_key_handler(char *input, int *cursor, int *len) { sh_write("\a", 1); return RET_READ_CHAR_DONE; }
int iscan1(int si, int quick) /* * Initializes use of a sub value (subboards[], not usub[]). If quick, then * don't worry about anything detailed, just grab qscan info. */ { postrec p; /* make sure we have cache space */ if (!cache) { cache=malloca(MAX_TO_CACHE*sizeof(postrec)); if (!cache) return(0); } /* forget it if an invalid sub # */ if ((si<0) || (si>=num_subs)) return(0); /* skip this stuff if being called from the WFC cache code */ if (!quick) { /* go to correct net # */ if (xsubs[si].num_nets) set_net_num(xsubs[si].nets[0].net_num); else set_net_num(0); /* see if a sub has changed */ read_status(); /* if already have this one set, nothing more to do */ if (si==currsub) return(1); } currsub=si; /* sub cache no longer valid */ believe_cache=0; /* set sub filename */ sprintf(subdat_fn,"%s%s.SUB",syscfg.datadir,subboards[si].filename); /* open file, and create it if necessary */ if (open_sub(0)<0) { if (open_sub(1)<0) return(0); p.owneruser=0; sh_write(sub_f,(void *) &p,sizeof(postrec)); } /* set sub */ curlsub=si; subchg=0; last_msgnum=0; /* read in first rec, specifying # posts */ sh_lseek(sub_f,0L,SEEK_SET); sh_read(sub_f,&p, sizeof(postrec)); nummsgs=p.owneruser; /* read in sub date, if don't already know it */ if (sub_dates[si]==0) { if (nummsgs) { sh_lseek(sub_f, ((long) nummsgs)*sizeof(postrec), SEEK_SET); sh_read(sub_f, &p, sizeof(postrec)); sub_dates[si]=p.qscan; } else { sub_dates[si]=1; } } /* close file */ close_sub(); /* iscanned correctly */ return(1); }
int normal_char_type_handler(char c, char *input, int *cursor, int *len) { int this_cursor = *cursor; int this_len = *len; /* 回车 */ if (c == '\n') { sh_write("\n", 1); return RET_READ_CHAR_DONE; } /* 换行 */ if (c == '\r') { sh_write("\r\n", 2); return RET_READ_CHAR_DONE; } if (this_cursor == this_len) { /* * 正常字符串输入,光标位置与输入字符串长度值相等, * 在已输入字符串末尾插入新的字符 */ /* append to end of line */ if ((short)c == 20 && this_cursor == 0) { return RET_READ_CHAR_DONE; } input[this_cursor] = c; if (this_len < (RL_BUF_SIZE - 1)) { /* 未超出输入字符串最大长度,光标位置和输入字符串长度值加1 */ this_len++; this_cursor++; } else { /* 超出输入字符串最大长度,返回最大输入字符串 */ sh_write("\a", 1); return RET_READ_CHAR_DONE; } } else { /* * 光标位置与输入字符串长度值不相等,主要操作是在已输入字符串 * 中间插入新的字符 */ /* insert */ int i = 0; /* move everything one character to the right */ if (this_len >= (RL_BUF_SIZE - 2)) { this_len--; } for (i = this_len; i >= this_cursor; i--) { input[i + 1] = input[i]; } /* sh_write what we've just added */ input[this_cursor] = c; sh_write(&input[this_cursor], this_len - this_cursor + 1); for (i = 0; i < (this_len - this_cursor + 1); i++) { sh_write("\b", 1); } this_len++; this_cursor++; } *cursor = this_cursor; *len = this_len; return RET_READ_CHAR_CONT; }
void deletemsg(int mn) { postrec *p1, p; int close_file=0; unsigned int nb; char *buf; // char scratch[181]; long len, l, cp; /* open file, if needed */ if (sub_f <= 0) { open_sub(1); close_file=1; } /* see if anything changed */ read_status(); if (sub_f >= 0) { if ((mn>0) && (mn<=nummsgs)) { buf=(char *)malloca(BUFSIZE); if (buf) { p1=get_post(mn); remove_link(&(p1->msg),(subboards[curlsub].filename)); cp=((long)mn+1)*sizeof(postrec); len=((long)(nummsgs+1))*sizeof(postrec); do { l=len-cp; if (l<BUFSIZE) nb=(int)l; else nb=BUFSIZE; if (nb) { sh_lseek(sub_f, cp, SEEK_SET); sh_read(sub_f, buf, nb); sh_lseek(sub_f, cp-sizeof(postrec), SEEK_SET); sh_write(sub_f, buf, nb); cp += nb; } } while (nb==BUFSIZE); /* update # msgs */ sh_lseek(sub_f, 0L, SEEK_SET); sh_read(sub_f, &p, sizeof(postrec)); p.owneruser--; nummsgs=p.owneruser; sh_lseek(sub_f, 0L, SEEK_SET); sh_write(sub_f, &p, sizeof(postrec)); /* cache is now invalid */ believe_cache = 0; bbsfree(buf); } } } /* close file, if needed */ if (close_file) close_sub(); }
void gate_msg(net_header_rec *nh, char *text, unsigned short nn, char *byname,unsigned int *list, unsigned short fnn) { char newname[128], fn[100], qn[100], on[100]; char *ti, nm[82], *ss; int f,i; unsigned short ntl; if (strlen(text)<80) { ti=text; text+=strlen(ti)+1; ntl=nh->length-strlen(ti)-1; ss=strchr(text,'\r'); if (ss && (ss-text<80) && (ss-text<ntl)) { strncpy(nm,text,ss-text); nm[ss-text]=0; ss++; if (*ss=='\n') ss++; nh->length-=(ss-text); ntl-=(ss-text); text=ss; qn[0]=on[0]=0; if (fnn==65535) { strcpy(newname,nm); ss=strrchr(newname,'@'); if (ss) { sprintf(ss+1,"%u",net_networks[nn].sysnum); ss=strrchr(nm,'@'); if (ss) { ++ss; while ((*ss>='0') && (*ss<='9')) ++ss; strcat(newname,ss); } strcat(newname,"\r\n"); } } else { if ((nm[0]=='`') && (nm[1]=='`')) { for (i=strlen(nm)-2; i>0; i--) { if ((nm[i]=='`') && (nm[i+1]=='`')) { break; } } if (i>0) { i+=2; strncpy(qn,nm,i); qn[i]=' '; qn[i+1]=0; } } else i=0; if (qn[0]==0) { ss=strrchr(nm,'#'); if (ss) { if ((ss[1]>='0') && (ss[1]<='9')) { *ss=0; ss--; while ((ss>nm) && (*ss==' ')) { *ss=0; ss--; } } } if (nm[0]) { if (nh->fromuser) sprintf(qn,"``%s`` ",nm); else strcpy(on,nm); } } if ((on[0]==0) && (nh->fromuser==0)) { strcpy(on,nm+i); } if (on[0]) sprintf(newname,"%s%s %s AT %u\r\n",qn, net_networks[fnn].name, on, nh->fromsys); else sprintf(newname,"%s%s #%u AT %u\r\n",qn, net_networks[fnn].name, nh->fromuser, nh->fromsys); nh->fromsys=net_networks[nn].sysnum; nh->fromuser=0; } nh->length += strlen(newname); if ((nh->main_type == main_type_email_name) || (nh->main_type == main_type_new_post)) nh->length += strlen(byname)+1; sprintf(fn,"%sP0-WT.NET",net_data); f=sh_open(fn,O_RDWR|O_BINARY|O_APPEND | O_CREAT, S_IREAD|S_IWRITE); if (f) { sh_lseek(f,0L,SEEK_END); if (!list) nh->list_len=0; if (nh->list_len) nh->tosys=0; sh_write(f,nh, sizeof(net_header_rec)); if (nh->list_len) sh_write(f,list,2*(nh->list_len)); if ((nh->main_type == main_type_email_name) || (nh->main_type == main_type_new_post)) sh_write(f,byname, strlen(byname)+1); sh_write(f,ti,strlen(ti)+1); sh_write(f,newname,strlen(newname)); sh_write(f,text,ntl); sh_close(f); } } } }
void send_email2(void) { char s[81],scratch[81],log[81]; int f, i; long len,len2; char *b; long thetime,dat; int len3; mailrec m,m1; userrec ur; messagerec msg; struct date dt; struct time tm; char *month[] = {"Bug","Jan","Feb","Mar","Apr","May","Jun", "Jul","Aug","Sep","Oct","Nov","Dec"}; m.touser=user_to_num; time(&thetime); len=(unsigned) strlen(buffer); len2=len; b=((char *)malloc(len+1024)); len=0; sprintf(log,"þ Incoming mail for %s from %s (%s)\n",fido_to_user,fido_from_user,origi_node); write_log(log); sprintf(s,"%s (%s)",fido_from_user,origi_node); addline(b,s,&len); /* Get date/time of Email creation. */ /* Ditto the \015 for the time/date string. */ strncpy(scratch,fido_date_line,20); scratch[20]='\0'; /* Build the date - cumbersome, but it needs to be done */ /* Build tblock as we go along so we can have a pretty date */ scratch[2] = '\0'; /* make day a string */ dt.da_day = atoi(scratch); for (i=1;i<13;i++) if (strncmpi(month[i],&scratch[3],3) == 0) { dt.da_mon = i; break; } scratch[9] = '\0'; /* make year a string */ dt.da_year = atoi(&scratch[7]); if (dt.da_year>90) dt.da_year += 1900; else dt.da_year += 2000; scratch[13] = '\0'; /* make hour a string */ tm.ti_hour = atoi(&scratch[11]); scratch[16] = '\0'; /* make minute a string */ tm.ti_min = atoi(&scratch[14]); scratch[19] = '\0'; /* make second a string */ tm.ti_sec = atoi(&scratch[17]); tm.ti_hund = 0; dat = dostounix(&dt,&tm); strncpy(scratch,ctime(&(time_t)dat),24); scratch[24]='\0'; strcat(scratch,"\r\n"); strcpy(s,scratch); addline(b,s,&len); strcat(b,buffer); len += len2; len=(unsigned) strlen(b); if (b[len-1]!=26) b[len++]=26; m.msg.storage_type=2; msg.stored_as=0L; msg.storage_type=2; savefile(b,len,&msg,"EMAIL"); m.msg=msg; i=0; strcpy(m.title,fido_title); // i=strlen(m.title); // m.title[i+1]=net_num; // m.title[i+2]=0; m.title[80]=net_num; m.title[81]=0; // i=0; read_user(user_to_num,&ur); ++ur.waiting; write_user(user_to_num,&ur); lock_status(); save_status(); m.anony=i; m.fromsys=atoi(wwiv_node); m.fromuser=0; m.tosys=0; m.status=status_new_net; time((long *)&(m.daten)); f=open_email(1); len3=(int) filelength(f)/sizeof(mailrec); if (len3==0) i=0; else { i=len3-1; sh_lseek(f,((long) (i))*(sizeof(mailrec)), SEEK_SET); sh_read(f,(void *)&m1,sizeof(mailrec)); while ((i>0) && (m1.tosys==0) && (m1.touser==0)) { --i; sh_lseek(f,((long) (i))*(sizeof(mailrec)), SEEK_SET); sh_read(f,(void *)&m1,sizeof(mailrec)); } if ((m1.tosys) || (m1.touser)) ++i; } sh_lseek(f,((long) (i))*(sizeof(mailrec)), SEEK_SET); sh_write(f,(void *)&m,sizeof(mailrec)); sh_close(f); free(buffer); }
static UWORD crysbind(WORD opcode, LONG pglobal, WORD control[], WORD int_in[], WORD int_out[], LONG addr_in[]) { LONG maddr; LONG tree; WORD mouse, ret; WORD unsupported = FALSE; maddr = 0; ret = TRUE; switch(opcode) { /* Application Manager */ case APPL_INIT: #if DBG_GEMSUPER aestrace("appl_init()"); #endif LWSET(pglobal, AES_VERSION); /* version number */ LWSET(pglobal+2, 0x0001); /* num of concurrent procs*/ /* LLSET(pglobal, 0x00010200L); */ LWSET(pglobal+4, rlr->p_pid); sh_deskf(0, pglobal+6); LWSET(pglobal+20, gl_nplanes); LLSET(pglobal+22, ADDR(&D)); /* reset dispatcher */ /* count to let the app*/ /* run a while. */ dspcnt = 0; ret = ap_init(); break; case APPL_READ: case APPL_WRITE: ap_rdwr(opcode == APPL_READ ? MU_MESAG : MU_SDMSG, fpdnm(NULLPTR, AP_RWID), AP_LENGTH, AP_PBUFF); break; case APPL_FIND: ret = ap_find( AP_PNAME ); break; case APPL_TPLAY: ap_tplay(AP_TBUFFER, AP_TLENGTH, AP_TSCALE); break; case APPL_TRECORD: ret = ap_trecd(AP_TBUFFER, AP_TLENGTH); break; #if CONF_WITH_PCGEM case APPL_YIELD: dsptch(); break; #endif case APPL_EXIT: #if DBG_GEMSUPER aestrace("appl_exit()"); #endif ap_exit(); break; /* Event Manager */ case EVNT_KEYBD: ret = ev_block(MU_KEYBD, 0x0L); break; case EVNT_BUTTON: ret = ev_button(B_CLICKS, B_MASK, B_STATE, &EV_MX); break; case EVNT_MOUSE: ret = ev_mouse((MOBLK *)&MO_FLAGS, &EV_MX); break; case EVNT_MESAG: #if DBG_GEMSUPER aestrace("evnt_mesag()"); #endif ap_rdwr(MU_MESAG, rlr, 16, ME_PBUFF); break; case EVNT_TIMER: ev_timer( HW(T_HICOUNT) + LW(T_LOCOUNT) ); break; case EVNT_MULTI: #if DBG_GEMSUPER aestrace("evnt_multi()"); #endif if (MU_FLAGS & MU_TIMER) maddr = HW(MT_HICOUNT) + LW(MT_LOCOUNT); tree = HW(MB_CLICKS) | LW((MB_MASK << 8) | MB_STATE); ret = ev_multi(MU_FLAGS, (MOBLK *)&MMO1_FLAGS, (MOBLK *)&MMO2_FLAGS, maddr, tree, MME_PBUFF, &EV_MX); break; case EVNT_DCLICK: ret = ev_dclick(EV_DCRATE, EV_DCSETIT); break; /* Menu Manager */ case MENU_BAR: if (gl_mnppd == rlr || gl_mnppd == NULL) mn_bar(MM_ITREE, SHOW_IT, rlr->p_pid); else menu_tree[rlr->p_pid] = (SHOW_IT) ? MM_ITREE : 0x0L; break; case MENU_ICHECK: do_chg(MM_ITREE, ITEM_NUM, CHECKED, CHECK_IT, FALSE, FALSE); break; case MENU_IENABLE: do_chg(MM_ITREE, (ITEM_NUM & 0x7fff), DISABLED, !ENABLE_IT, ((ITEM_NUM & 0x8000) != 0x0), FALSE); break; case MENU_TNORMAL: if (gl_mntree == menu_tree[rlr->p_pid]) do_chg(MM_ITREE, TITLE_NUM, SELECTED, !NORMAL_IT, TRUE, TRUE); break; case MENU_TEXT: tree = MM_ITREE; strcpy((char *)LLGET(OB_SPEC(ITEM_NUM)), (char *)MM_PTEXT); break; case MENU_REGISTER: ret = mn_register(MM_PID, MM_PSTR); break; case MENU_UNREGISTER: #if CONF_WITH_PCGEM /* distinguish between menu_unregister() and menu_popup() */ if (IN_LEN == 1) mn_unregister( MM_MID ); else #endif unsupported = TRUE; break; case MENU_CLICK: /* distinguish between menu_click() and menu_attach() */ /* * although menu_click() is PC-GEM only, it's always * enabled because the desktop uses it. */ if (IN_LEN == 2) { if (MN_SETIT) gl_mnclick = MN_CLICK; ret = gl_mnclick; } else unsupported = TRUE; break; /* Object Manager */ case OBJC_ADD: ob_add(OB_TREE, OB_PARENT, OB_CHILD); break; case OBJC_DELETE: ob_delete(OB_TREE, OB_DELOB); break; case OBJC_DRAW: gsx_sclip((GRECT *)&OB_XCLIP); ob_draw(OB_TREE, OB_DRAWOB, OB_DEPTH); break; case OBJC_FIND: ret = ob_find(OB_TREE, OB_STARTOB, OB_DEPTH, OB_MX, OB_MY); break; case OBJC_OFFSET: ob_offset(OB_TREE, OB_OBJ, &OB_XOFF, &OB_YOFF); break; case OBJC_ORDER: ob_order(OB_TREE, OB_OBJ, OB_NEWPOS); break; case OBJC_EDIT: gsx_sclip(&gl_rfull); OB_ODX = OB_IDX; ret = ob_edit(OB_TREE, OB_OBJ, OB_CHAR, &OB_ODX, OB_KIND); break; case OBJC_CHANGE: gsx_sclip((GRECT *)&OB_XCLIP); ob_change(OB_TREE, OB_DRAWOB, OB_NEWSTATE, OB_REDRAW); break; /* Form Manager */ case FORM_DO: ret = fm_do(FM_FORM, FM_START); break; case FORM_DIAL: ret = fm_dial(FM_TYPE, (GRECT *)&FM_X); break; case FORM_ALERT: ret = fm_alert(FM_DEFBUT, FM_ASTRING); break; case FORM_ERROR: ret = fm_error(FM_ERRNUM); break; case FORM_CENTER: ob_center(FM_FORM, (GRECT *)&FM_XC); break; case FORM_KEYBD: gsx_sclip(&gl_rfull); FM_OCHAR = FM_ICHAR; FM_ONXTOB = FM_INXTOB; ret = fm_keybd(FM_FORM, FM_OBJ, &FM_OCHAR, &FM_ONXTOB); break; case FORM_BUTTON: gsx_sclip(&gl_rfull); ret = fm_button(FM_FORM, FM_OBJ, FM_CLKS, &FM_ONXTOB); break; /* Graphics Manager */ case GRAF_RUBBOX: gr_rubbox(GR_I1, GR_I2, GR_I3, GR_I4, &GR_O1, &GR_O2); break; case GRAF_DRAGBOX: gr_dragbox(GR_I1, GR_I2, GR_I3, GR_I4, (GRECT *)&GR_I5, &GR_O1, &GR_O2); break; case GRAF_MBOX: gr_movebox(GR_I1, GR_I2, GR_I3, GR_I4, GR_I5, GR_I6); break; case GRAF_GROWBOX: gr_growbox((GRECT *)&GR_I1, (GRECT *)&GR_I5); break; case GRAF_SHRINKBOX: gr_shrinkbox((GRECT *)&GR_I1, (GRECT *)&GR_I5); break; case GRAF_WATCHBOX: ret = gr_watchbox(GR_TREE, GR_OBJ, GR_INSTATE, GR_OUTSTATE); break; case GRAF_SLIDEBOX: ret = gr_slidebox(GR_TREE, GR_PARENT, GR_OBJ, GR_ISVERT); break; case GRAF_HANDLE: GR_WCHAR = gl_wchar; GR_HCHAR = gl_hchar; GR_WBOX = gl_wbox; GR_HBOX = gl_hbox; ret = gl_handle; break; case GRAF_MOUSE: if (GR_MNUMBER > 255) { if (GR_MNUMBER == M_OFF) gsx_moff(); if (GR_MNUMBER == M_ON) gsx_mon(); } else { if (GR_MNUMBER != 255) { switch(GR_MNUMBER) { case 1: mouse = MICE01; break; case 2: mouse = MICE02; break; case 3: mouse = MICE03; break; case 4: mouse = MICE04; break; case 5: mouse = MICE05; break; case 6: mouse = MICE06; break; case 7: mouse = MICE07; break; default: mouse = MICE00; break; } maddr = *(LONG *) &rs_bitblk[mouse]; } else maddr = GR_MADDR; gsx_mfset(maddr); } break; case GRAF_MKSTATE: gr_mkstate(&GR_MX, &GR_MY, &GR_MSTATE, &GR_KSTATE); break; /* Scrap Manager */ case SCRP_READ: ret = sc_read((BYTE*)SC_PATH); break; case SCRP_WRITE: ret = sc_write((const BYTE*)SC_PATH); break; #if CONF_WITH_PCGEM case SCRP_CLEAR: ret = sc_clear(); break; #endif /* File Selector Manager */ case FSEL_INPUT: ret = fs_input((BYTE*)FS_IPATH, (BYTE*)FS_ISEL, &FS_BUTTON, NULL); break; case FSEL_EXINPUT: ret = fs_input((BYTE*)FS_IPATH, (BYTE*)FS_ISEL, &FS_BUTTON, (BYTE *)FS_ILABEL); break; /* Window Manager */ case WIND_CREATE: ret = wm_create(WM_KIND, (GRECT *)&WM_WX); break; case WIND_OPEN: wm_open(WM_HANDLE, (GRECT *)&WM_WX); break; case WIND_CLOSE: wm_close(WM_HANDLE); break; case WIND_DELETE: wm_delete(WM_HANDLE); break; case WIND_GET: wm_get(WM_HANDLE, WM_WFIELD, &WM_OX); break; case WIND_SET: wm_set(WM_HANDLE, WM_WFIELD, &WM_IX); break; case WIND_FIND: ret = wm_find(WM_MX, WM_MY); break; case WIND_UPDATE: wm_update(WM_BEGUP); break; case WIND_CALC: wm_calc(WM_WCTYPE, WM_WCKIND, WM_WCIX, WM_WCIY, WM_WCIW, WM_WCIH, &WM_WCOX, &WM_WCOY, &WM_WCOW, &WM_WCOH); break; case WIND_NEW: wm_new(); break; /* Resource Manager */ case RSRC_LOAD: ret = rs_load(pglobal, RS_PFNAME); break; case RSRC_FREE: ret = rs_free(pglobal); break; case RSRC_GADDR: ret = rs_gaddr(pglobal, RS_TYPE, RS_INDEX, &ad_rso); break; case RSRC_SADDR: ret = rs_saddr(pglobal, RS_TYPE, RS_INDEX, RS_INADDR); break; case RSRC_OBFIX: rs_obfix(RS_TREE, RS_OBJ); break; /* Shell Manager */ case SHEL_READ: sh_read((BYTE*)SH_PCMD, (BYTE*)SH_PTAIL); break; case SHEL_WRITE: ret = sh_write(SH_DOEX, SH_ISGR, SH_ISCR, (const BYTE*)SH_PCMD, (const BYTE*)SH_PTAIL); break; case SHEL_GET: sh_get((void*)SH_PBUFFER, SH_LEN); break; case SHEL_PUT: sh_put((const void *)SH_PDATA, SH_LEN); break; case SHEL_FIND: ret = sh_find((BYTE*)SH_PATH); break; case SHEL_ENVRN: sh_envrn((BYTE**)SH_PATH, (const BYTE*)SH_SRCH); break; #if CONF_WITH_PCGEM case SHEL_RDEF: sh_rdef((BYTE*)SH_LPCMD, (BYTE*)SH_LPDIR); break; case SHEL_WDEF: sh_wdef((const BYTE*)SH_LPCMD, (const BYTE*)SH_LPDIR); break; #endif default: unsupported = TRUE; break; } if (unsupported) { kprintf("Bad AES function %d\n", opcode); if (opcode != 0) /* Ignore the 0 since some PRGs are this call */ fm_show(ALNOFUNC, &opcode, 1); ret = -1; } return(ret); }