From 0764b02cedebf3baddfdc6624a1eccf0b5fb8f89 Mon Sep 17 00:00:00 2001 From: Volker Ruppert Date: Sun, 11 Apr 2004 18:04:34 +0000 Subject: [PATCH] - status bar with indicators for cdrom, floppy, harddisk and keyboard added (TODO: display text) - function replace_bitmap() completed - already present feature 'charmap change' removed from TODO list --- bochs/gui/rfb.cc | 73 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 66 insertions(+), 7 deletions(-) diff --git a/bochs/gui/rfb.cc b/bochs/gui/rfb.cc index d29e5da05..509bc104f 100644 --- a/bochs/gui/rfb.cc +++ b/bochs/gui/rfb.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: rfb.cc,v 1.33 2004-04-09 10:25:55 vruppert Exp $ +// $Id: rfb.cc,v 1.34 2004-04-11 18:04:34 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2000 Psyon.Org! @@ -24,10 +24,9 @@ // RFB still to do : // - properly handle SetPixelFormat, including big/little-endian flag // - depth > 8bpp support -// - on-board vga card font support instead of vgafont.h // - dimension update support // - optional compression support -// - bottom leds support +// - status bar text support // Define BX_PLUGGABLE in files that can be compiled into plugins. For @@ -46,6 +45,7 @@ public: bx_rfb_gui_c (void) {} DECLARE_GUI_VIRTUAL_METHODS() void get_capabilities(Bit16u *xres, Bit16u *yres, Bit16u *bpp); + void statusbar_setitem(int element, bx_bool active); }; // declare one instance of the gui object and call macro to insert the @@ -137,6 +137,11 @@ static unsigned long rfbCursorX = 0; static unsigned long rfbCursorY = 0; static unsigned long rfbOriginLeft = 0; static unsigned long rfbOriginRight = 0; +static unsigned rfbStatusbarY = 18; +static unsigned rfbStatusitemPos[12] = { + 0, 170, 210, 250, 290, 330, 370, 410, 450, 490, 530, 570 +}; +static bx_bool rfbStatusitemActive[12]; static unsigned int text_rows=25, text_cols=80; static unsigned int font_height=16, font_width=8; @@ -199,7 +204,7 @@ void bx_rfb_gui_c::specific_init(int argc, char **argv, unsigned tilewidth, unsi rfbHeaderbarY = headerbar_y; rfbDimensionX = 640; - rfbDimensionY = 480 + rfbHeaderbarY; + rfbDimensionY = 480 + rfbHeaderbarY + rfbStatusbarY; rfbStretchedX = rfbDimensionX; rfbStretchedY = rfbDimensionY; rfbTileX = tilewidth; @@ -263,6 +268,35 @@ void bx_rfb_gui_c::specific_init(int argc, char **argv, unsigned tilewidth, unsi if (timeout < 0) BX_PANIC(("timeout! no client present")); } +void rfbSetStatus(int element, bx_bool active) +{ + char *newBits, color; + int xleft, xsize; + + rfbStatusitemActive[element] = active; + xleft = rfbStatusitemPos[element] + 2; + xsize = rfbStatusitemPos[element+1] - xleft - 1; + newBits = (char *)malloc(((xsize / 8) + 1) * (rfbStatusbarY - 2)); + memset(newBits, 0, ((xsize / 8) + 1) * (rfbStatusbarY - 2)); + for (unsigned i=0; i<(rfbStatusbarY - 2); i++) { + newBits[((xsize / 8) + 1) * i] = 0; + } + color = active?0xa0:0xf0; + DrawBitmap(xleft, rfbDimensionY - rfbStatusbarY + 1, xsize, rfbStatusbarY - 2, newBits, color, true); + free(newBits); +} + +void bx_rfb_gui_c::statusbar_setitem(int element, bx_bool active) +{ + if (element < 0) { + for (unsigned i = 0; i < statusitem_count; i++) { + rfbSetStatus(i+1, active); + } + } else if ((unsigned)element < statusitem_count) { + rfbSetStatus(element+1, active); + } +} + #ifdef WIN32 bool InitWinsock() { @@ -609,7 +643,7 @@ void bx_rfb_gui_c::flush(void) // clear the area that defines the headerbar. void bx_rfb_gui_c::clear_screen(void) { - memset(&rfbScreen[rfbDimensionX * rfbHeaderbarY], 0, rfbDimensionX * (rfbDimensionY - rfbHeaderbarY)); + memset(&rfbScreen[rfbDimensionX * rfbHeaderbarY], 0, rfbDimensionX * (rfbDimensionY - rfbHeaderbarY - rfbStatusbarY)); } @@ -859,8 +893,8 @@ unsigned bx_rfb_gui_c::headerbar_bitmap(unsigned bmap_id, unsigned alignment, vo void bx_rfb_gui_c::show_headerbar(void) { - char *newBits; - unsigned int i, xorigin; + char *newBits, value; + unsigned int i, xorigin, addr; newBits = (char *)malloc(rfbDimensionX * rfbHeaderbarY); memset(newBits, 0, (rfbDimensionX * rfbHeaderbarY)); @@ -874,6 +908,20 @@ void bx_rfb_gui_c::show_headerbar(void) DrawBitmap(xorigin, 0, rfbBitmaps[rfbHeaderbarBitmaps[i].index].xdim, rfbBitmaps[rfbHeaderbarBitmaps[i].index].ydim, rfbBitmaps[rfbHeaderbarBitmaps[i].index].bmap, (char)0xf0, false); } free(newBits); + newBits = (char *)malloc(rfbDimensionX * rfbStatusbarY / 8); + memset(newBits, 0, (rfbDimensionX * rfbStatusbarY / 8)); + for (i = 1; i < 12; i++) { + addr = rfbStatusitemPos[i] / 8; + value = 1 << (rfbStatusitemPos[i] % 8); + for (unsigned j=1; j