📄 x_wrdwindow.c
字号:
0, 0, tx, ty, w, h); if(mywin.screens[ts] == mywin.disp_screen) Redraw(tx, ty, w, h); } break; case 10: { /* line copy */ int cp, sk, i; if(nopts < 2) break; if((cp = opts[0]) < 0) break; if((sk = opts[1]) < 0) break; if(cp + sk == 0) break; simg = XGetImage(mywin.d, mywin.screens[ss], sx1, sy1, w, h, mywin.gscreen_plane_mask, ZPixmap); if(!simg) break; timg = XGetImage(mywin.d, mywin.screens[ts], tx, ty, w, h, mywin.gscreen_plane_mask, ZPixmap); if(!timg) break; y = 0; while(y < h) { for(i = 0; i < cp && y < h; i++, y++) { for(x = 0; x < w; x++) XPutPixel(timg, x, y, XGetPixel(simg, x, y)); } y += sk; } } if(mywin.screens[ts] == mywin.disp_screen) Redraw(tx, ty, w, h); break; case 11: { int etx, ety; while(tx < 0) tx += SIZEX; tx %= SIZEX; while(ty < 0) ty += SIZEY; ty %= SIZEY; etx = tx + w; ety = ty + h; XCopyArea(mywin.d,mywin.screens[ss],mywin.screens[ts],mywin.gcgr, sx1, sx2, w, h, tx, ty); if(etx > SIZEX) XCopyArea(mywin.d,mywin.screens[ss],mywin.screens[ts],mywin.gcgr, sx1 + (etx - SIZEX), sy1, w - (etx - SIZEX), h, 0, ty); if(ety > SIZEY) XCopyArea(mywin.d,mywin.screens[ss],mywin.screens[ts],mywin.gcgr, sx1, sy1 + (ety - SIZEY), w, h - (ety - SIZEY), tx, 0); if(etx > SIZEX && ety > SIZEY) { XCopyArea(mywin.d,mywin.screens[ss],mywin.screens[ts],mywin.gcgr, sx1 + (etx - SIZEX), sy1 + (ety - SIZEY), w - (etx - SIZEX), h - (ety - SIZEY), 0, 0); } if(mywin.screens[ts] == mywin.disp_screen) { if(etx < SIZEX && ety < SIZEY) Redraw(tx, ty, w, h); else Redraw(0, 0, SIZEX, SIZEY); } } break; case 12: { unsigned long psm, ptm; int plane_map[4] = {2, 0, 1, 3}; psm = mywin.pmask[plane_map[opts[0] & 3]] | mywin.basepix; ptm = mywin.pmask[plane_map[opts[1] & 3]] | mywin.basepix; simg = XGetImage(mywin.d, mywin.screens[ss], sx1, sy1, w, h, mywin.gscreen_plane_mask, ZPixmap); if(!simg) break; timg = XGetImage(mywin.d, mywin.screens[ts], tx, ty, w, h, mywin.gscreen_plane_mask, ZPixmap); if(!timg) break; for(y = 0; y < h; y++) for(x = 0; x < w; x++) { int p1, p2; p1 = XGetPixel(simg, x, y); p2 = XGetPixel(timg, x, y); if(p1 & psm) p2 |= ptm; else p2 &= ~ptm; XPutPixel(timg, x, y, p2); } if(mywin.screens[ts] == mywin.disp_screen) Redraw(tx, ty, w, h); } break; } if(simg != NULL) XDestroyImage(simg); if(timg != NULL) XDestroyImage(timg); x_GMode(gmode_save);}static void MyDestroyImage(XImage *img){ img->data = NULL; /* Don't free in XDestroyImage() */ XDestroyImage(img);}void x_PLoad(char *filename){ static XImage *image = NULL; if(image == NULL) { image=XCreateImage(mywin.d, DefaultVisual(mywin.d,DefaultScreen(mywin.d)), DefaultDepth(mywin.d,DefaultScreen(mywin.d)), ZPixmap,0,None,SIZEX,SIZEY,8,0); image->data = image_buffer; } memset(image->data, 0, SIZEX * SIZEY); if(!pho_load_pixel(image,mywin.curcoltab,filename)) return; XPutImage(mywin.d,mywin.active_screen,mywin.gc ,image,0,0,0,0,SIZEX,SIZEY); if(mywin.active_screen==mywin.disp_screen) Redraw(0,0,SIZEX,SIZEY);}void x_Mag(magdata *mag,int32 x,int32 y,int32 s,int32 p){ XImage *image; int pixsizex,pixsizey; if(mag==NULL){ ctl->cmsg(CMSG_INFO,VERB_VERBOSE,"mag ERROR!\n"); return; } x=(x==WRD_NOARG)?mag->xorig:x; y=(y==WRD_NOARG)?mag->yorig:y; p=(p==WRD_NOARG)?0:p; x=x+mag->xorig/8*8-mag->xorig; pixsizex=mag->xend-mag->xorig/8*8+1; pixsizey=mag->yend-mag->yorig+1; mag->pal[0]=17; x_Pal(mag->pal,16); if(mywin.active_screen==mywin.screens[0]){ /* Foreground screen */ mag->pal[0]=18; x_Pal(mag->pal,16); } else { /* Background screen */ mag->pal[0]=19; x_Pal(mag->pal,16); } if((p&1)==0){ mag->pal[0]=0; x_Pal(mag->pal,16); } if(p==2) return; image=XCreateImage(mywin.d, DefaultVisual(mywin.d,DefaultScreen(mywin.d)), DefaultDepth(mywin.d,DefaultScreen(mywin.d)), ZPixmap,0,None,pixsizex,pixsizey,8,0); image->data=image_buffer; memset(image->data, 0, pixsizex*pixsizey); mag_load_pixel(image,mywin.curcoltab,mag); XPutImage(mywin.d,mywin.active_screen,mywin.gc ,image,0,0,x,y,pixsizex,pixsizey); if(mywin.active_screen==mywin.disp_screen) Redraw(x,y,pixsizex,pixsizey); MyDestroyImage(image);}void x_Gcls(int mode){ int gmode_save; gmode_save = mywin.gmode; if(mode==0) mode=15; x_GMode(mode); XSetFunction(mywin.d,mywin.gcgr,GXclear); XFillRectangle(mywin.d,mywin.active_screen,mywin.gcgr,0,0,SIZEX,SIZEY); XSetFunction(mywin.d,mywin.gcgr,GXcopy); x_GMode(gmode_save); Redraw(0,0,SIZEX,SIZEY);}void x_Ton(int param){ mywin.ton=param; Redraw(0,0,SIZEX,SIZEY);}void x_Gon(int param){ mywin.gon=param; Redraw(0,0,SIZEX,SIZEY);}void x_RedrawControl(int flag){ mywin.redrawflag = flag; if(flag) { Redraw(0,0,SIZEX,SIZEY); store_palette(); } XFlush(mywin.d);}void x_Gline(int *params,int nparam){ int x, y, w, h; /* Update rectangle region */ unsigned long color; Pixmap screen; x = min(params[0], params[2]); y = min(params[1], params[3]); w = max(params[0], params[2]) - x + 1; h = max(params[1], params[3]) - y + 1; screen = mywin.active_screen; switch(params[5]) { default: case 0: if (truecolor) color = (unsigned long) params[4]; else color = mywin.curcoltab[params[4]].pixel; XSetForeground(mywin.d,mywin.gcgr,color); XDrawLine(mywin.d,screen,mywin.gcgr, params[0],params[1],params[2],params[3]); break; case 1: if (truecolor) color = (unsigned long) params[4]; else color = mywin.curcoltab[params[4]].pixel; XSetForeground(mywin.d,mywin.gcgr,color); XDrawRectangle(mywin.d,screen,mywin.gcgr,x,y,w-1,h-1); break; case 2: if (truecolor) color = (unsigned long) params[6]; else color = mywin.curcoltab[params[6]].pixel; XSetForeground(mywin.d,mywin.gcgr,color); XFillRectangle(mywin.d,screen,mywin.gcgr,x,y,w,h); break; } if(mywin.active_screen==mywin.disp_screen) Redraw(x,y,w,h);}void x_GCircle(int *params,int nparam){ int pad=0; int (*Linefunc)(); Linefunc=XDrawArc; if(nparam>=5){ switch(params[4]){ default: case 0: case 1: Linefunc=XDrawArc; if (truecolor) XSetForeground(mywin.d,mywin.gcgr,(unsigned long) params[3]); else XSetForeground(mywin.d,mywin.gcgr,mywin.curcoltab[params[3]].pixel); pad=-1; break; case 2: Linefunc=XFillArc; if (truecolor) XSetForeground(mywin.d,mywin.gcgr,(unsigned long) params[5]); else XSetForeground(mywin.d,mywin.gcgr,mywin.curcoltab[params[5]].pixel); break; } } if(nparam>=3){ int xcorner,ycorner,width,height,angle; xcorner=params[0]-params[2];/*x_center-radius*/ ycorner=params[1]-params[2];/*y_center-radius*/ width=height=params[2]*2;/*radius*2*/ angle=360*64; (*Linefunc)(mywin.d,mywin.active_screen,mywin.gcgr,xcorner,ycorner, width+pad,height+pad, 0,angle); if(mywin.active_screen==mywin.disp_screen) Redraw(xcorner,ycorner,width,height); }}#define FOREGROUND_PALLET 0void x_Pal(int *param,int nparam){ int pallet; if(nparam==NUMPXL){ pallet=param[0]; nparam--; param++; } else pallet=FOREGROUND_PALLET; if(nparam==NUMPXL-1){ int i; for(i=0;i<NUMPXL;i++){ col12toXColor(param[i],&mywin.gcolor[pallet][i]); } if(pallet==FOREGROUND_PALLET){ memcpy(mywin.curcoltab,mywin.gcolor[FOREGROUND_PALLET],sizeof(mywin.curcoltab)); if(mywin.redrawflag) store_palette(); } }}void x_Palrev(int pallet){ int i; if(pallet < 0 || pallet > MAXPAL) return; for(i = 0; i < NUMPXL; i++){ mywin.gcolor[pallet][i].red ^= 0xffff; mywin.gcolor[pallet][i].green ^= 0xffff; mywin.gcolor[pallet][i].blue ^= 0xffff; } if(pallet == FOREGROUND_PALLET){ memcpy(mywin.curcoltab, mywin.gcolor[FOREGROUND_PALLET], sizeof(mywin.curcoltab)); if(mywin.redrawflag) store_palette(); }}void x_Gscreen(int active,int appear){ if(active<NUMVSCREEN) mywin.active_screen=mywin.screens[active]; if((appear<NUMVSCREEN)&&(mywin.disp_screen!=mywin.screens[appear])){ mywin.disp_screen=mywin.screens[appear]; Redraw(0,0,SIZEX,SIZEY); }}#define FADE_REDUCE_TIME 0.1void x_Fade(int *params,int nparam,int step,int maxstep){ static XColor *frompal=NULL,*topal=NULL; if(params==NULL){ int i; if(frompal==NULL||topal==NULL) return; if(step==maxstep){ memcpy(mywin.curcoltab,topal,sizeof(mywin.curcoltab)); memcpy(mywin.gcolor[0],mywin.curcoltab,sizeof(mywin.curcoltab)); } else{ int tmp; if(!mywin.redrawflag) return; if(truecolor) { /* @FADE for TrueColor takes many CPU powers. * So reduce @FADE controls. */ if((step & 1) == 0 || aq_filled() < AUDIO_BUFFER_SIZE) return; /* Skip fade */ } for(i=0;i<NUMPXL;i++){ tmp=(topal[i].red-frompal[i].red)/maxstep; mywin.curcoltab[i].red=tmp*step+frompal[i].red; tmp=(topal[i].green-frompal[i].green)/maxstep; mywin.curcoltab[i].green=tmp*step+frompal[i].green; tmp=(topal[i].blue-frompal[i].blue)/maxstep; mywin.curcoltab[i].blue=tmp*step+frompal[i].blue; } } if(mywin.redrawflag) store_palette(); } else{ if(params[2] == 0 && params[1] < MAXPAL) { memcpy(mywin.curcoltab,mywin.gcolor[params[1]],sizeof(mywin.curcoltab)); memcpy(mywin.gcolor[0],mywin.curcoltab,sizeof(mywin.curcoltab)); if(mywin.redrawflag) { store_palette(); } } else if(params[0] < MAXPAL && params[1] < MAXPAL) { frompal=mywin.gcolor[params[0]]; topal=mywin.gcolor[params[1]]; } else frompal=topal=NULL; return; }}void x_Startup(int version){ int i; Parse(-1); memset(mywin.scrnbuf, 0, LINES*sizeof(Linbuf *)); mywin.curline = 0; mywin.curcol = 0; mywin.ton = 1; mywin.gon = 1; mywin.curattr = 0; x_VRel(); x_GMode(-1); InitColor(mywin.cmap, False); mywin.active_screen = mywin.disp_screen = mywin.screens[0]; XSetForeground(mywin.d, mywin.gcgr, mywin.curcoltab[0].pixel); XSetForeground(mywin.d, mywin.gc, mywin.txtcolor[COLOR_DEFAULT].pixel); for(i = 0; i < NUMVSCREEN; i++) XFillRectangle(mywin.d, mywin.screens[i], mywin.gcgr, 0, 0, SIZEX, SIZEY); XFillRectangle(mywin.d, mywin.offscr, mywin.gcgr, 0, 0, SIZEX, SIZEY); XSetWindowBackgroundPixmap(mywin.d, mywin.w, mywin.offscr); XFillRectangle(mywin.d, mywin.w, mywin.gcgr, 0, 0, SIZEX, SIZEY); if(truecolor && shm_screen) XFillRectangle(mywin.d, shm_screen->pm, mywin.gcgr, 0, 0, SIZEX, SIZEY);}/*Graphic Definition*/#define GRPH_LINE_MODE 1#define GRPH_CIRCLE_MODE 2#define GRPH_PAL_CHANGE 3#define GRPH_FADE 4#define GRPH_FADE_STEP 5static void GrphCMD(int *params,int nparam){ switch(params[0]){ case GRPH_LINE_MODE: x_Gline(params+1,nparam-1); break; case GRPH_CIRCLE_MODE: x_GCircle(params+1,nparam-1); break; case GRPH_PAL_CHANGE: x_Pal(params+1,nparam-1); break; case GRPH_FADE: x_Fade(params+1,nparam-1,-1,-1); break; case GRPH_FADE_STEP: x_Fade(NULL,0,params[1],params[2]); break; }}/***************************************************** * VT parser * * ******************************************************/#define MAXPARAM 20static int Parse(int c){ static int *prstbl=groundtable; static char mbcs; static int params[MAXPARAM],nparam=0; static int hankaku=0; static int savcol,savline; static long savattr; if(c==-1) { prstbl=groundtable; mbcs=0; nparam=0; hankaku=0; savcol=savline=0; return 0; } if(mbcs&& prstbl !=mbcstable&& prstbl !=scstable&& prstbl !=scstable){ mbcs=0; } switch(prstbl[c]){ case CASE_IGNORE_STATE: prstbl=igntable; break; case CASE_IGNORE_ESC: prstbl=iestable; break; case CASE_ESC: prstbl=esctable; break; case CASE_ESC_IGNORE: prstbl=eigtable; break; case CASE_ESC_DIGIT: if(nparam<MAXPARAM){ if(params[nparam]==DEFAULT){ params[nparam]=0; } params[nparam]*=10; params[nparam]+=c-'0'; } break; case CASE_ESC_SEMI: nparam++; params[nparam]=DEFAULT; break; case CASE_TAB: mywin.curcol+=TAB_SET; mywin.curcol&=~(TAB_SET-1); break; case CASE_BS: if(mywin.curcol > 0) mywin.curcol--;#if 0 /* ^H maybe work backward character in MIMPI's screen */ DelChar(mywin.curline,mywin.curcol); mywin.scrnbuf[mywin.curline][mywin.curcol].c=0; mywin.scrnbuf[mywin.curline][mywin.curcol].attr=0;#endif break; case CASE_CSI_STATE:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -