int VGLMouseInit(int mode) { struct mouse_info mouseinfo; int error; VGLMouseSetStdImage(); mouseinfo.operation = MOUSE_MODE; mouseinfo.u.mode.signal = SIGUSR2; if ((error = ioctl(0, CONS_MOUSECTL, &mouseinfo))) return error; signal(SIGUSR2, VGLMouseAction); mouseinfo.operation = MOUSE_GETINFO; ioctl(0, CONS_MOUSECTL, &mouseinfo); VGLMouseXpos = mouseinfo.u.data.x; VGLMouseYpos = mouseinfo.u.data.y; VGLMouseButtons = mouseinfo.u.data.buttons; VGLMouseMode(mode); return 0; }
void display( VGLBitmap *pic, byte *red, byte *green, byte *blue, struct action *e) { VGLBitmap target; int x,y,i=0,j=0; VGLMouseMode(VGL_MOUSEHIDE); VGLRestorePalette(); /* XXX Broken in r!=2. Libvgl bug. */ //VGLClear(VGLDisplay,0); VGLBitmapCopy(&bkg,0,0,VGLDisplay,0,0,bkg.Xsize,bkg.Ysize); if(e!=NULL) { if(e->zoom!=1 || e->rotate) { target.Bitmap=(byte *)calloc(pic->Xsize*pic->Ysize*e->zoom*e->zoom,1); if(e->rotate) { target.Xsize=pic->Ysize*e->zoom; target.Ysize=pic->Xsize*e->zoom; } else { target.Xsize=pic->Xsize*e->zoom; target.Ysize=pic->Ysize*e->zoom; } target.Type=pic->Type; for(x=0;x<pic->Xsize;x++) { for(y=0;y<pic->Ysize;y++) { for(i=0;i<e->zoom;i++) { for(j=0;j<e->zoom;j++) { if(e->rotate) { VGLSetXY(&target,target.Xsize-(e->zoom*y+i),e->zoom*x+j,VGLGetXY(pic,x,y)); } else { VGLSetXY(&target,e->zoom*x+i,e->zoom*y+j,VGLGetXY(pic,x,y)); } } } } } } else { target.Bitmap=(byte *)calloc(pic->Xsize*pic->Ysize,sizeof(byte)); target.Xsize=pic->Xsize; target.Ysize=pic->Ysize; target.Type=pic->Type; VGLBitmapCopy(pic,0,0,&target,0,0,pic->Xsize,pic->Ysize); } } else { target.Bitmap=(byte *)calloc(pic->Xsize*pic->Ysize,sizeof(byte)); target.Xsize=pic->Xsize; target.Ysize=pic->Ysize; target.Type=pic->Type; VGLBitmapCopy(pic,0,0,&target,0,0,pic->Xsize,pic->Ysize); } VGLSetPalette(red, green, blue); if(e!=NULL) { VGLBitmapCopy(&target,0,0,VGLDisplay,e->Xshift,e->Yshift,target.Xsize,target.Ysize); } else { VGLBitmapCopy(&target,0,0,VGLDisplay,0,0,target.Xsize,target.Ysize); } VGLMouseMode(VGL_MOUSESHOW); free(target.Bitmap); }
int pop_up(char *title,int x, int y) { VGLBitmap sav,clr; int x1,y1,width,height,i,j; int last_pos,cur_pos,max_item; char buttons; char *t; sav.Type=VGLDisplay->Type; clr.Type=VGLDisplay->Type; width=0; height=0; max_item=0; i=0; while(std_menu[i].descr!=NULL) { height++; max_item++; if(strlen(std_menu[i].descr)>width) width=strlen(std_menu[i].descr); i++; } width=width*8+2; height=height*9+4+8; sav.Xsize=width; sav.Ysize=height; clr.Xsize=width; clr.Ysize=height; sav.Bitmap=(byte *)calloc(width*height,1); clr.Bitmap=(byte *)calloc(width*height,1); if(x>(VGLDisplay->Xsize-width)) x1=VGLDisplay->Xsize-width; else x1=x; if(y>(VGLDisplay->Ysize-height)) y1=VGLDisplay->Ysize-height; else y1=y; VGLMouseMode(VGL_MOUSEHIDE); VGLBitmapCopy(VGLDisplay,x1,y1,&sav,0,0,width,height); VGLFilledBox(VGLDisplay,x1,y1,x1+width-1,y1+height-1,pal_colors-1); VGLBitmapString(VGLDisplay,x1+1,y1+1,title,0,pal_colors-1,0,0); VGLLine(VGLDisplay,x1,y1+9,x1+width,y1+9,0); i=0; while(std_menu[i].descr!=NULL) { VGLBitmapString(VGLDisplay,x1+1,y1+11+i*9,std_menu[i].descr,0,pal_colors-1,0,0); i++; } last_pos=-1; VGLMouseMode(VGL_MOUSESHOW); do { pause(); VGLMouseStatus(&x,&y,&buttons); cur_pos=(y-y1-11)/9; if((cur_pos<0)||(cur_pos>max_item-1)) { if(last_pos==-1) last_pos=0; VGLBitmapString(VGLDisplay,x1+1,y1+11+last_pos*9,std_menu[last_pos].descr,0,pal_colors-1,0,0); last_pos=-1; } else if(last_pos!=cur_pos) { if(last_pos==-1) last_pos=0; VGLBitmapString(VGLDisplay,x1+1,y1+11+last_pos*9,std_menu[last_pos].descr,0,pal_colors-1,0,0); VGLBitmapString(VGLDisplay,x1+1,y1+11+cur_pos*9,std_menu[cur_pos].descr,pal_colors/2+1,pal_colors-1,0,0); last_pos=cur_pos; } } while (buttons & MOUSE_BUTTON3DOWN); VGLMouseMode(VGL_MOUSEHIDE); /* XXX Screws up totally when r==3. Libvgl bug! */ VGLBitmapCopy(&clr,0,0,VGLDisplay,x1,y1,width,height); VGLBitmapCopy(&sav,0,0,VGLDisplay,x1,y1,width,height); VGLMouseMode(VGL_MOUSESHOW); free(sav.Bitmap); free(clr.Bitmap); changed++; if((cur_pos>=0) && (cur_pos<max_item)) { std_menu[cur_pos].func(x,y,std_menu[cur_pos].hotkey); } changed++; return(0); }