static void selPaintButtons(rfbSelectData* m,Bool invertOk,Bool invertCancel) { rfbScreenInfoPtr s = m->screen; Pixel bcolour = m->backColour; Pixel colour = m->colour; rfbFillRect(s,m->x1,m->okY-m->textH,m->x2,m->okY,bcolour); if(invertOk) { rfbFillRect(s,m->okBX,m->okY-m->textH,m->okBX+m->buttonWidth,m->okY,colour); rfbDrawStringWithClip(s,m->font,m->okX+m->xhot,m->okY-1+m->yhot,okStr, m->x1,m->okY-m->textH,m->x2,m->okY, bcolour,colour); } else rfbDrawString(s,m->font,m->okX+m->xhot,m->okY-1+m->yhot,okStr,colour); if(invertCancel) { rfbFillRect(s,m->cancelBX,m->okY-m->textH, m->cancelBX+m->buttonWidth,m->okY,colour); rfbDrawStringWithClip(s,m->font,m->cancelX+m->xhot,m->okY-1+m->yhot, cancelStr,m->x1,m->okY-m->textH,m->x2,m->okY, bcolour,colour); } else rfbDrawString(s,m->font,m->cancelX+m->xhot,m->okY-1+m->yhot,cancelStr,colour); m->okInverted = invertOk; m->cancelInverted = invertCancel; }
void vcDeleteCharacters(vncConsolePtr c, int f) { int g, x, y; g = c->width - c->x - f; x = c->x * c->cWidth; y = c->y * c->cHeight; vcHideCursor(c); if (g > 0) { memcpy(c->screenBuffer + c->y * c->width + c->x, c->screenBuffer + c->y * c->width + c->x + f, g); #ifdef USE_ATTRIBUTE_BUFFER if( c->attributeBuffer ) memcpy(c->attributeBuffer + c->y * c->width + c->x, c->attributeBuffer + c->y * c->width + c->x + f, g); #endif rfbDoCopyRect( c->screen, x, y, c->screen->width - f * c->cWidth, y + c->cHeight, - f * c->cWidth, 0); } memset( c->screenBuffer + c->y * c->width + g, ' ', f ); #ifdef USE_ATTRIBUTE_BUFFER if( c->attributeBuffer ) memset( c->attributeBuffer + c->y * c->width + g, 0x07, f ); #endif rfbFillRect( c->screen, x + g * c->cWidth, y, c->screen->width, y + c->cHeight, c->backColour); }
/* before using this function, hide the cursor */ void vcScroll(vncConsolePtr c,int lineCount) { if(lineCount==0) return; /* rfbLog("begin scroll\n"); */ // vcHideCursor(c); // c->dontDrawCursor=TRUE; if(lineCount>=(c->sheight - c->sstart) || lineCount<=- (c->sheight - c->sstart)) { // Nothing to really scroll - just clear a viewport memset( c->screenBuffer + c->sstart * c->width, '.', ( c->sheight - c->sstart ) * c->width); #ifdef USE_ATTRIBUTE_BUFFER if( c->attributeBuffer ) memset( c->attributeBuffer + c->sstart * c->width, 0x07, ( c->sheight - c->sstart ) * c->width); #endif rfbFillRect( c->screen, 0, c->sstart * c->cHeight, c->screen->width, c->sheight * c->cHeight, c->backColour); return; } if(lineCount>0) vcDeleteLines( c, c->sstart, lineCount ); else vcInsertLines( c, c->sstart, -lineCount ); }
/* line is relative to displayStart */ static void selPaintLine(rfbSelectData* m,int line,Bool invert) { int y1 = m->y1+line*m->textH, y2 = y1+m->textH; if(y2>m->y2) y2=m->y2; rfbFillRect(m->screen,m->x1,y1,m->x2,y2,invert?m->colour:m->backColour); if(m->displayStart+line<m->listSize) rfbDrawStringWithClip(m->screen,m->font,m->x1+m->xhot,y2-1+m->yhot, m->list[m->displayStart+line], m->x1,y1,m->x2,y2, invert?m->backColour:m->colour, invert?m->backColour:m->colour); }
static void showFont(int index) { char buffer[1024]; if(!rfbScreen) return; if(curFont) rfbFreeFont(curFont); strcpy(buffer,FONTDIR); strcat(buffer,fontlist[index]); curFont = rfbLoadConsoleFont(buffer); rfbFillRect(rfbScreen,210,30-20,210+10*16,30-20+256*20/16,0xb77797); if(curFont) { int i,j; for(j=0;j<256;j+=16) for(i=0;i<16;i++) rfbDrawCharWithClip(rfbScreen,curFont,210+10*i,30+j*20/16,j+i, 0,0,640,480,0xffffff,0x000000); } }
void vcDeleteLines(vncConsolePtr c, int from, int f) { int g, y; g = c->sheight - from - f; y = from * c->cHeight; vcHideCursor(c); if( g > 0 ) { memcpy(c->screenBuffer + from * c->width, c->screenBuffer + (from + f) * c->width, g * c->width); #ifdef USE_ATTRIBUTE_BUFFER if( c->attributeBuffer ) memcpy(c->attributeBuffer + from * c->width, c->attributeBuffer + (from + f) * c->width, g * c->width); #endif rfbDoCopyRect( c->screen, 0, from * c->cHeight, c->screen->width, (c->sheight - f) * c->cHeight, 0, - f * c->cHeight); } // Fill inserted line(s) with spaces memset(c->screenBuffer + (from + g) * c->width, ' ', f * c->width); #ifdef USE_ATTRIBUTE_BUFFER if(c->attributeBuffer) memset(c->screenBuffer + (from + g) * c->width, 0x07, f * c->width); #endif rfbFillRect( c->screen, 0, y + g * c->cHeight, c->screen->width, c->sheight * c->cHeight, c->backColour); }
int rfbSelectBox(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font, char** list, int x1,int y1,int x2,int y2, Pixel colour,Pixel backColour, int border,SelectionChangedHookPtr selChangedHook) { int bpp = rfbScreen->bitsPerPixel/8; char* frameBufferBackup; void* screenDataBackup = rfbScreen->screenData; KbdAddEventProcPtr kbdAddEventBackup = rfbScreen->kbdAddEvent; PtrAddEventProcPtr ptrAddEventBackup = rfbScreen->ptrAddEvent; GetCursorProcPtr getCursorPtrBackup = rfbScreen->getCursorPtr; DisplayHookPtr displayHookBackup = rfbScreen->displayHook; rfbSelectData selData; int i,j,k; int fx1,fy1,fx2,fy2; /* for font bbox */ if(list==0 || *list==0) return(-1); rfbWholeFontBBox(font, &fx1, &fy1, &fx2, &fy2); selData.textH = fy2-fy1; /* I need at least one line for the choice and one for the buttons */ if(y2-y1<selData.textH*2+3*border) return(-1); selData.xhot = -fx1; selData.yhot = -fy2; selData.x1 = x1+border; selData.y1 = y1+border; selData.y2 = y2-selData.textH-3*border; selData.x2 = x2-2*border; selData.pageH = (selData.y2-selData.y1)/selData.textH; i = rfbWidthOfString(font,okStr); j = rfbWidthOfString(font,cancelStr); selData.buttonWidth= k = 4*border+(i<j)?j:i; selData.okBX = x1+(x2-x1-2*k)/3; if(selData.okBX<x1+border) /* too narrow! */ return(-1); selData.cancelBX = x1+k+(x2-x1-2*k)*2/3; selData.okX = selData.okBX+(k-i)/2; selData.cancelX = selData.cancelBX+(k-j)/2; selData.okY = y2-border; rfbUndrawCursor(rfbScreen); frameBufferBackup = (char*)malloc(bpp*(x2-x1)*(y2-y1)); selData.state = SELECTING; selData.screen = rfbScreen; selData.font = font; selData.list = list; selData.colour = colour; selData.backColour = backColour; for(i=0;list[i];i++); selData.selected = i; selData.listSize = i; selData.displayStart = i; selData.lastButtons = 0; selData.selChangedHook = selChangedHook; rfbScreen->screenData = &selData; rfbScreen->kbdAddEvent = selKbdAddEvent; rfbScreen->ptrAddEvent = selPtrAddEvent; rfbScreen->getCursorPtr = selGetCursorPtr; rfbScreen->displayHook = 0; /* backup screen */ for(j=0;j<y2-y1;j++) memcpy(frameBufferBackup+j*(x2-x1)*bpp, rfbScreen->frameBuffer+j*rfbScreen->paddedWidthInBytes+x1*bpp, (x2-x1)*bpp); /* paint list and buttons */ rfbFillRect(rfbScreen,x1,y1,x2,y2,colour); selPaintButtons(&selData,FALSE,FALSE); selSelect(&selData,0); /* modal loop */ while(selData.state == SELECTING) rfbProcessEvents(rfbScreen,20000); /* copy back screen data */ for(j=0;j<y2-y1;j++) memcpy(rfbScreen->frameBuffer+j*rfbScreen->paddedWidthInBytes+x1*bpp, frameBufferBackup+j*(x2-x1)*bpp, (x2-x1)*bpp); free(frameBufferBackup); rfbMarkRectAsModified(rfbScreen,x1,y1,x2,y2); rfbScreen->screenData = screenDataBackup; rfbScreen->kbdAddEvent = kbdAddEventBackup; rfbScreen->ptrAddEvent = ptrAddEventBackup; rfbScreen->getCursorPtr = getCursorPtrBackup; rfbScreen->displayHook = displayHookBackup; if(selData.state==CANCEL) selData.selected=-1; return(selData.selected); }
void ugui_fill(int x, int y, int width, int height, unsigned int color) { rfbFillRect(server, x, y, x+width, y+height, color); }