Пример #1
0
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;
}
Пример #2
0
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);
}
Пример #3
0
/* 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 );
}
Пример #4
0
/* 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);
}
Пример #5
0
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);
  }
}
Пример #6
0
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);
}
Пример #7
0
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);
}
Пример #8
0
void ugui_fill(int x, int y, int width, int height, unsigned int color) {
	rfbFillRect(server, x, y, x+width, y+height, color);
}