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

📄 3deffects.c

📁 zgv-5.6,一个Linux系统下的图片浏览器(VGA/SVGA)
💻 C
📖 第 1 页 / 共 2 页
字号:
  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 + -