📄 3deffects.c
字号:
if(num>7) num=7; maxlen=0; for(f=0;f<num;f++) { len=vgatextsize(3,ptr); if(len>maxlen) maxlen=len; fdetailstr[f]=ptr; ptr+=strlen(ptr)+1; } /* ok, we also want some room for the labels :-) */ wide=maxlen+fdlabelwidth; }wide+=40;x1=((vga_getxdim()-wide)>>1);y1=((vga_getydim()-high)>>1);x2=((vga_getxdim()+wide)>>1);y2=((vga_getydim()+high)>>1);if(save_and_restore) save_area(x1,y1,x2,y2);blank_area(x1,y1,x2,y2,idx_medium);/* draw outer box */drawbutton(x1,y1,x2,y2,NULL,0,light,dark,mouseblack,0);/* finally, I've got around to doing different types of msgbox! */switch(replytype) { /* a box with a single 'OK' button, for warnings, errors, etc. */ case MSGBOXTYPE_OK: drawbutton(but1.x1=((vga_getxdim()-40)>>1),but1.y1=y2-35, but1.x2=((vga_getxdim()+40)>>1),but1.y2=y2-10, "Ok",1,light,dark,mouseblack,txt); setcolour(txt); vgadrawtext(x1+20,y1+10,3,message); set_max_text_width(NO_CLIP_FONT); do { key=mousecur_wait_for_keys_or_mouse(ttyfd); if(has_mouse && is_end_click_left()) { int mx=mouse_getx(),my=mouse_gety(); if(mx>=but1.x1 && mx<=but1.x2 && my>=but1.y1 && my<=but1.y2) key=RK_ENTER; } } while(key!=RK_ESC && key!=RK_ENTER); retval=1; break; /* a special case for the file-details dialog. Already have 7 * strings parsed from message. The layout is based on xzgv's. */ case MSGBOXTYPE_FILEDETAILS: { static char *desc1="Details from OS"; static char *desc2="Details from thumbnail"; static char *desc2_pic="Details from picture"; int group1_x,group1_y; int group2_x,group2_y; int f,y,len; int dim_from_pic=(fdetailstr[6][0]=='p'); int got_dim=(fdetailstr[6][1]!='0'); fdetailstr[6]++; drawbutton(but1.x1=((vga_getxdim()-40)>>1),but1.y1=y2-35, but1.x2=((vga_getxdim()+40)>>1),but1.y2=y2-10, "Ok",1,light,dark,mouseblack,txt);#define GROUP_BOX(x1,y1,x2,y2,desc,desc_col) \ draw3dbox(x1,y1,x2,y2,1,0,light,dark); \ draw3dbox(x1+1,y1+1,x2-1,y2-1,1,1,light,dark); \ setcolour(idx_medium); \ len=vgatextsize(2,desc); \ for(f=0;f<2;f++) vga_drawline(x1+5,y1+f,x1+5+10+len,y1+f); \ setcolour(desc_col); \ vgadrawtext(x1+5+5,y1-4,2,desc); group1_x=x1+10; group1_y=y1+15; group2_x=group1_x; group2_y=but1.y1-52; GROUP_BOX(group1_x,group1_y,x2-11,group2_y-15,desc1,txt); GROUP_BOX(group2_x,group2_y,x2-11,but1.y1-10, dim_from_pic?desc2_pic:desc2, got_dim?txt:dark); y=group1_y+15; for(f=0;f<7;f++,y+=24) { setcolour(txt); if(f==6) { y=group2_y+15; if(!got_dim) { setcolour(dark); fdetailstr[f]="unknown"; } } vgadrawtext(group1_x+fdlabelwidth-10-vgatextsize(3,fdlabels[f]),y, 3,fdlabels[f]); vgadrawtext(group1_x+fdlabelwidth,y,3,fdetailstr[f]); } } set_max_text_width(NO_CLIP_FONT); do { key=mousecur_wait_for_keys_or_mouse(ttyfd); if(has_mouse && is_end_click_left()) { int mx=mouse_getx(),my=mouse_gety(); if(mx>=but1.x1 && mx<=but1.x2 && my>=but1.y1 && my<=but1.y2) key=RK_ENTER; } } while(key!=RK_ESC && key!=RK_ENTER); retval=1; break; /* a box with two buttons, 'Yes' and 'No'. Enter or 'y' selects yes, * Esc or 'n' selects no. */ case MSGBOXTYPE_YESNO: drawbutton(but1.x1=(vga_getxdim()>>1)-50,but1.y1=y2-35, but1.x2=(vga_getxdim()>>1)-10,but1.y2=y2-10, "Yes",1,light,dark,mouseblack,txt); drawbutton(but2.x1=(vga_getxdim()>>1)+10,but2.y1=y2-35, but2.x2=(vga_getxdim()>>1)+50,but2.y2=y2-10, "No",1,light,dark,mouseblack,txt); setcolour(txt); vgadrawtext(x1+20,y1+10,3,message); /* draw message */ set_max_text_width(NO_CLIP_FONT); do { key=mousecur_wait_for_keys_or_mouse(ttyfd); if(has_mouse && is_end_click_left()) { int mx=mouse_getx(),my=mouse_gety(); if(mx>=but1.x1 && mx<=but1.x2 && my>=but1.y1 && my<=but1.y2) key='y'; if(mx>=but2.x1 && mx<=but2.x2 && my>=but2.y1 && my<=but2.y2) key='n'; } } while(key!=RK_ESC && key!=RK_ENTER && key!='y' && key!='n'); retval=(key==RK_ENTER || key=='y'); break; default: retval=0; }if(save_and_restore) { restore_area(); if(savedpal) vga_setpalvec(0,256,palsav); last_msgbox_did_restore=1; }if(!msgbox_draw_ok && has_mouse) save_mouse_pos();return(retval);}/* get line of input (presumed to be a directory, though this is * not checked). Expands `~' to $HOME. */char *cm_getline(int ttyfd,char *prompt,int light,int dark,int txt,int med){static char buf[256],*retptr=NULL;char *homeptr;int pos,c,tmp;int x1,y1,x2,y2,boxwidth,boxheight;int insert=1;int maxlen=sizeof(buf)-1;int firsttime=1;int curofs=0;if(retptr!=NULL && retptr!=buf) { free(retptr); retptr=NULL; }pos=0; *buf=0;boxwidth=620;boxheight=90;x1=((vga_getxdim()-boxwidth)>>1);y1=((vga_getydim()-boxheight)>>1);x2=((vga_getxdim()+boxwidth)>>1);y2=((vga_getydim()+boxheight)>>1);save_area(x1,y1,x2,y2);blank_area(x1,y1,x2,y2,med);/* draw outer box */drawbutton(x1,y1,x2,y2,NULL,0,light,dark,idx_blacknz,0);draw3dbox(x1+9,y2-46,x2-9,y2-9,1,0,light,dark);/* draw prompt */setcolour(txt);vgadrawtext(x1+30,y1+15,3,prompt);set_max_text_width(560);do { if(firsttime) c=RK_NO_KEY; else do { c=mousecur_wait_for_keys_or_mouse(ttyfd); } while(c==RK_NO_KEY); setcolour(med); tmp=vgadrawtext(x1+30,y2-35,3,buf); vgadrawtext(x1+30+curofs,y2-35,3,"_"); if(firsttime) firsttime=0; else switch(c) { case 'b'-0x60: case RK_CURSOR_LEFT: if(pos>0) pos--; break; case 'f'-0x60: case RK_CURSOR_RIGHT: if(pos<strlen(buf)) pos++; break; case 'a'-0x60: case RK_HOME: pos=0; break; case 'e'-0x60: case RK_END: pos=strlen(buf); break; case 'i'-0x60: case RK_INSERT: insert=!insert; break; case 'd'-0x60: case RK_DELETE: /* delete forwards */ if(pos<strlen(buf)) memmove(buf+pos,buf+pos+1,strlen(buf)-pos); break; case 8: case 127: /* delete backwards */ if(pos>0) { memmove(buf+pos-1,buf+pos,strlen(buf+pos)+1); pos--; } break; default: /* if printable, insert it (or overwrite) */ if(c>=32 && c<127) { if(insert) { if(strlen(buf)<maxlen) { if(pos<=strlen(buf)) memmove(buf+pos+1,buf+pos,strlen(buf+pos)+1); buf[pos++]=c; } } else { if(strlen(buf)<maxlen || pos<strlen(buf)) { if(pos>=strlen(buf)) buf[pos+1]=0; buf[pos++]=c; } } } } /* draw text and cursor */ setcolour(txt); tmp=buf[pos]; buf[pos]=0; curofs=vgatextsize(3,buf); buf[pos]=tmp; vgadrawtext(x1+30,y2-35,3,buf); vgadrawtext(x1+30+curofs,y2-35,3,"_"); }while(c!=RK_ENTER && c!=RK_ESC);set_max_text_width(NO_CLIP_FONT);restore_area();if(c==RK_ESC) return(NULL);/* expand tilde if needed; only dealt with if it's first char, * and the ~user form isn't supported. */if(*buf!='~') return(buf);homeptr=getenv("HOME");if(homeptr==NULL) homeptr=buf+strlen(buf); /* point at a NUL *//* we want length of homeptr string, plus length of existing string * minus the first char (the tilde), plus space for the NUL. */if((retptr=malloc(strlen(homeptr)+strlen(buf)))==NULL) return(NULL);/* the memory will be freed on any subsequent call to this routine */strcpy(retptr,homeptr);strcat(retptr,buf+1);return(retptr);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -