From 1eccd64198bf4c02ec1769d89a6f55aff0c7be37 Mon Sep 17 00:00:00 2001 From: instinc Date: Thu, 7 Feb 2002 02:12:51 +0000 Subject: [PATCH] Fixes the mouse direction problem (sorry, I couldn't test locally) Fixes the font switch 8x8 <-> 8x16 and clears the screen accordingly. Known issue: the headerbar is still not displayed --- bochs/gui/sdl.cc | 213 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 153 insertions(+), 60 deletions(-) diff --git a/bochs/gui/sdl.cc b/bochs/gui/sdl.cc index d2aea04b8..b53dbe39a 100644 --- a/bochs/gui/sdl.cc +++ b/bochs/gui/sdl.cc @@ -1,6 +1,7 @@ #define _MULTI_THREAD #include +#include #include #include @@ -13,7 +14,20 @@ #define LOG_THIS bx_gui. +#define _SDL_DEBUG_ME_ +#ifdef _SDL_DEBUG_ME_ +void we_are_here(void) +{ + return; +} +#endif + +struct bitmaps { + SDL_Surface *surface; + SDL_Rect src,dst; + void (*cb)(void); +}; SDL_Thread *sdl_thread; SDL_Surface *sdl_screen, *sdl_fullscreen; @@ -22,6 +36,7 @@ int sdl_fullscreen_toggle; int sdl_grab; int res_x, res_y; int headerbar_height; +int headerbar_offset; int textres_x, textres_y; int fontwidth = 8, fontheight = 16; unsigned tilewidth, tileheight; @@ -32,6 +47,7 @@ Uint32 headerbar_fg, headerbar_bg; Bit8u old_mousebuttons=0, new_mousebuttons=0; int old_mousex=0, new_mousex=0; int old_mousey=0, new_mousey=0; +vector sdl_bitmaps; #if SDL_BYTEORDER == SDL_LIL_ENDIAN #define SWAP16(X) (X) @@ -319,7 +335,7 @@ void bx_gui_c::handle_events(void) new_mousebuttons = ((sdl_event.motion.state & 0x01)|((sdl_event.motion.state>>1)&0x02)); bx_devices.keyboard->mouse_motion( sdl_event.motion.xrel, - sdl_event.motion.yrel, + -sdl_event.motion.yrel, new_mousebuttons ); old_mousebuttons = new_mousebuttons; old_mousex = (int)(sdl_event.motion.x); @@ -357,7 +373,7 @@ void bx_gui_c::handle_events(void) // send motion information bx_devices.keyboard->mouse_motion( new_mousex - old_mousex, - new_mousey - old_mousey, + -(new_mousey - old_mousey), new_mousebuttons ); // mark current state to diff with next packet old_mousebuttons = new_mousebuttons; @@ -493,15 +509,23 @@ void bx_gui_c::dimension_update( if( y > x ) { y = y>>1; - font = &sdl_font8x8[0][0]; - fontheight = 8; - fontwidth = 8; + if( font != &sdl_font8x8[0][0] ) + { + bx_gui.clear_screen(); + font = &sdl_font8x8[0][0]; + fontheight = 8; + fontwidth = 8; + } } else { - font = &sdl_font8x16[0][0]; - fontheight = 16; - fontwidth = 8; + if( font != &sdl_font8x16[0][0] ) + { + bx_gui.clear_screen(); + font = &sdl_font8x16[0][0]; + fontheight = 16; + fontwidth = 8; + } } if( (x == res_x) && (y == res_y )) return; @@ -558,8 +582,71 @@ unsigned bx_gui_c::create_bitmap( unsigned xdim, unsigned ydim) { - cout << "sdl: create bitmap" <surface = SDL_CreateRGBSurface( + SDL_SWSURFACE, + xdim, + ydim, + 32, +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + 0xff000000, + 0x00ff0000, + 0x0000ff00, + 0x000000ff +#else + 0x000000ff, + 0x0000ff00, + 0x00ff0000, + 0xff000000 +#endif + ); + if( !tmp->surface ) + { + delete tmp; + bx_gui.exit(); + LOG_THIS setonoff(LOGLEV_PANIC, ACT_FATAL); + BX_PANIC (("Unable to create requested bitmap")); + } + tmp->src.w = xdim; + tmp->src.h = ydim; + tmp->src.x = 0; + tmp->src.y = 0; + tmp->dst.x = -1; + tmp->dst.y = 0; + tmp->dst.w = xdim; + tmp->dst.h = ydim; + tmp->cb = NULL; + buf = (Uint32 *)tmp->surface->pixels; + disp = tmp->surface->pitch/4; + do + { + buf_row = buf; + xdim = tmp->src.w / 8; + do + { + pixels = *bmap++; + for(unsigned i=0;i<8;i++) + { + if( (pixels & 0x80) == 0 ) + *buf++ = headerbar_bg; + else + *buf++ = headerbar_fg; + pixels = pixels << 1; + } + } while( --xdim ); + buf = buf_row + disp; + } while( --ydim ); + SDL_UpdateRect( + tmp->surface, + 0, 0, + tmp->src.w, + tmp->src.h ); + sdl_bitmaps.push_back(*tmp); + return sdl_bitmaps.size()-1; } @@ -568,8 +655,26 @@ unsigned bx_gui_c::headerbar_bitmap( unsigned alignment, void (*f)(void)) { - cout << "sdl: headerbar bitmap" <= sdl_bitmaps.size() ) return 0; + + sdl_bitmaps[bmap_id].dst.x = headerbar_offset; + headerbar_offset + sdl_bitmaps[bmap_id].src.w; + sdl_bitmaps[bmap_id].cb = f; + if( sdl_screen ) + { + SDL_BlitSurface( + sdl_bitmaps[bmap_id].surface, + &sdl_bitmaps[bmap_id].src, + sdl_screen, + &sdl_bitmaps[bmap_id].dst); + SDL_UpdateRect( + sdl_screen, + sdl_bitmaps[bmap_id].dst.x, + sdl_bitmaps[bmap_id].dst.y, + sdl_bitmaps[bmap_id].src.w, + sdl_bitmaps[bmap_id].src.h); + } + return bmap_id; } @@ -577,7 +682,10 @@ void bx_gui_c::replace_bitmap( unsigned hbar_id, unsigned bmap_id) { - cout << "sdl: replace bitmap" << endl; + sdl_bitmaps[bmap_id].dst.x = sdl_bitmaps[hbar_id].dst.x; + sdl_bitmaps[bmap_id].cb = sdl_bitmaps[hbar_id].cb; + sdl_bitmaps[hbar_id].dst.x = -1; + sdl_bitmaps[hbar_id].cb = NULL; } @@ -585,12 +693,16 @@ void bx_gui_c::show_headerbar(void) { Uint32 *buf; Uint32 *buf_row; + Uint32 disp; int rowsleft = headerbar_height; int colsleft; + int bitmapscount = sdl_bitmaps.size(); if( !sdl_screen ) return; + disp = sdl_screen->pitch/4; buf = (Uint32 *)sdl_screen->pixels; + // draw headerbar background do { colsleft = res_x; @@ -599,15 +711,29 @@ void bx_gui_c::show_headerbar(void) { *buf++ = headerbar_bg; } while( --colsleft ); - buf = buf_row + sdl_screen->pitch/4; + buf = buf_row + disp; } while( --rowsleft ); - SDL_UpdateRect(sdl_screen,0,0,res_x,headerbar_height); -} + SDL_UpdateRect( sdl_screen, 0,0,res_x,headerbar_height); - -void update_floppy_status_buttons (void) -{ - cout << "sdl: update floppy status buttons" <