2339 lines
67 KiB
Plaintext
2339 lines
67 KiB
Plaintext
----------------------------------------------------------------------
|
|
Patch name: patch.beos-gui-fabo-template
|
|
Author: Marton Fabo <morton@eik.bme.hu>
|
|
Date: Thu, 6 Dec 2001 19:52:18 +0100 (CET)
|
|
|
|
Detailed description:
|
|
Same as patch.beos-gui-fabo, except this version uses C++ templates.
|
|
|
|
I grabbed the CVS snapshot of 20011129, started with the BeOS GUI code found in
|
|
it, rewrote it totally (almost no original code left), and I now have a Bochs
|
|
that runs under BeOS quite nicely. New features compared to the BeOS GUI code
|
|
found in the above snapshot:
|
|
|
|
- color support in text mode (not perfect yet, but not BW at least)
|
|
- almost full keyboard capturing (modifier keys work, function keys also,
|
|
keypad, arrow keys work, capslock doesn't work properly, numlock not at all.
|
|
I need some help about how to tell Bochs to switch those properly)
|
|
- full mouse capturing, it works quite great!
|
|
|
|
Also see beos-gui-fabo.capture-filter and the associated README.
|
|
|
|
Patch was created with:
|
|
cvs diff -u
|
|
Apply patch to what version:
|
|
cvs from December 7, 2001
|
|
Instructions:
|
|
To patch, go to main bochs directory.
|
|
Type "patch -p0 < THIS_PATCH_FILE".
|
|
----------------------------------------------------------------------
|
|
Index: gui/beos.cc
|
|
===================================================================
|
|
RCS file: /cvsroot/bochs/bochs/gui/beos.cc,v
|
|
retrieving revision 1.12
|
|
diff -u -r1.12 beos.cc
|
|
--- gui/beos.cc 2001/12/07 18:52:24 1.12
|
|
+++ gui/beos.cc 2001/12/07 19:17:41
|
|
@@ -1,5 +1,5 @@
|
|
/////////////////////////////////////////////////////////////////////////
|
|
-// $Id: patch.beos-gui-fabo-template,v 1.1 2001/12/07 19:22:54 bdenney Exp $
|
|
+// $Id: patch.beos-gui-fabo-template,v 1.1 2001/12/07 19:22:54 bdenney Exp $
|
|
/////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (C) 2001 MandrakeSoft S.A.
|
|
@@ -28,6 +28,7 @@
|
|
#include <app/Application.h>
|
|
#include <interface/Window.h>
|
|
#include <interface/View.h>
|
|
+#include <MessageFilter.h>
|
|
#include <interface/Screen.h>
|
|
#include <interface/Bitmap.h>
|
|
#include <interface/GraphicsDefs.h>
|
|
@@ -39,1161 +40,1260 @@
|
|
#include <string.h>
|
|
|
|
#include "bochs.h"
|
|
-//#include "icon_bochs.h"
|
|
+// #include "icon_bochs.h"
|
|
#include "font/vga.bitmap.h"
|
|
|
|
#define LOG_THIS bx_gui.
|
|
|
|
-#define PAD_NEAREST(n, quantum) (( ((n) + ((quantum) - 1)) / (n) ) * (n))
|
|
+#undef uint8
|
|
+#undef int32
|
|
+#undef uint32
|
|
+
|
|
+#define BOCHS_APP_SIG "application/x-vnd.MandrakeSoft-BeBochs"
|
|
+#define SCANCODE_BUFSIZE 20
|
|
+#define MOUSE_BUFSIZE 20
|
|
+#define MOUSE_L 0x00000001
|
|
+#define MOUSE_R 0x00000002
|
|
+#define INITIAL_SCREEN_WIDTH 640
|
|
+#define INITIAL_SCREEN_HEIGHT 350
|
|
+
|
|
+const uint32 MSG_REQUEST_CAPTURE = 'CFrq';
|
|
+const uint32 MSG_START_CAPTURE = 'strt';
|
|
+const uint32 MSG_ALREADY_CAPTURING = 'CFac';
|
|
+const uint32 MSG_CAPTURE_OK = 'CFok';
|
|
+const uint32 MSG_BAD_MESSAGE = 'CFbm';
|
|
+const uint32 MSG_STOP_CAPTURE = 'stop';
|
|
+
|
|
+const uint32 INPUT_TYPE_KEYBOARD = 0x00000001;
|
|
+const uint32 INPUT_TYPE_MOUSE = 0x00000002;
|
|
+
|
|
+const uint32 MSG_ENQ_COMMAND = 'BCec';
|
|
+
|
|
+// ========== STRUCTS ==========
|
|
+
|
|
+struct mouse_event
|
|
+{
|
|
+ mouse_event() { }
|
|
+ mouse_event(uint32 X, uint32 Y, uint32 buttons):
|
|
+ x(X), y(Y), buttonState(buttons) { }
|
|
+ uint32 x;
|
|
+ uint32 y;
|
|
+ uint32 buttonState;
|
|
+};
|
|
|
|
+// ========== CLASSES ==========
|
|
|
|
-
|
|
-class BochsApplication : public BApplication {
|
|
-
|
|
+template <class ContentType> class Queue
|
|
+{
|
|
public:
|
|
- BochsApplication();
|
|
- };
|
|
+ Queue(uint32 maxItems, const char *name);
|
|
+ ~Queue();
|
|
+ bool Enq(const ContentType &item);
|
|
+ bool Deq(ContentType *item);
|
|
+ bool QueueEmpty() { return (fHead == fTail); }
|
|
+ uint32 ItemCount() { return (fTail > fHead) ? fTail - fHead : fHead + fMaxItems - fTail; }
|
|
+ ContentType &ItemAt(uint32 index) { return fItems[(fHead + index) % fMaxItems]; }
|
|
+private:
|
|
+ ContentType *fItems;
|
|
+ uint32 fMaxItems;
|
|
+ uint32 fHead;
|
|
+ uint32 fTail;
|
|
+ const char *fName;
|
|
+};
|
|
|
|
-class BochsWindow : public BWindow {
|
|
+class BochsApplication: public BApplication
|
|
+{
|
|
+public:
|
|
+ BochsApplication(bx_gui_c *bxGui, int argc, char **argv,
|
|
+ uint32 tileWidth, uint32 tileHeight, uint32 headerBarHeight, void (*powerHandlerFunc)());
|
|
+ ~BochsApplication();
|
|
+ static int32 runme(void *data);
|
|
+ virtual bool QuitRequested();
|
|
+ virtual void Quit();
|
|
+ void BxExit();
|
|
+private:
|
|
+ void (*fPowerHandlerFunc)();
|
|
+};
|
|
|
|
+class BochsWindow: public BWindow
|
|
+{
|
|
public:
|
|
- BochsWindow(BRect frame);
|
|
- virtual bool QuitRequested();
|
|
- virtual void FrameResized(float width, float height);
|
|
- };
|
|
+ BochsWindow(BRect frame);
|
|
+ virtual bool QuitRequested();
|
|
+};
|
|
|
|
-class BochsView : public BView {
|
|
+class BochsView: public BView {
|
|
+public:
|
|
+ BochsView(BRect frame, char *name, uint32 headerHeight, uint32 tileWidth, uint32 tileHeight);
|
|
+ ~BochsView();
|
|
+ virtual void AttachedToWindow();
|
|
+ virtual void DetachedFromWindow();
|
|
+ virtual void Draw(BRect updateRect);
|
|
+ virtual void KeyDown(const char *bytes, int32 numBytes);
|
|
+ virtual void KeyUp(const char *bytes, int32 numBytes);
|
|
+ virtual void MouseDown(BPoint point);
|
|
+ virtual void MouseUp(BPoint point);
|
|
+ virtual void MouseMoved(BPoint point, uint32 transit, const BMessage *message);
|
|
+ virtual void MessageReceived(BMessage *msg);
|
|
+ virtual void WindowActivated(bool active);
|
|
+ virtual void Pulse();
|
|
+ void HandleEvents();
|
|
+ void ClearScreen();
|
|
+ void TextUpdate(uint8 *oldText, uint8 *newText,
|
|
+ uint32 cursorX, uint32 cursorY, uint32 rowCount);
|
|
+ void GraphicsTileUpdate(uint8 *tile, uint32 xPos, uint32 yPos);
|
|
+ bool PaletteChange(uint32 index, uint32 red, uint32 green, uint32 blue);
|
|
+ void DimensionUpdate(uint32 x, uint32 y);
|
|
+ void HandleEnableMouse(bool enable);
|
|
+ uint32 CreateBitmap(const uchar *bitmap, uint32 width, uint32 height);
|
|
+ uint32 HeaderbarBitmap(uint32 bitmapID, uint32 alignment, void (*f)(void));
|
|
+ void ReplaceBitmap(uint32 headerBarID, uint32 bitmapID);
|
|
+ void ShowHeaderbar();
|
|
+ void GotCapturedInput(BMessage *msg);
|
|
+ //Queue<uint32> *KeyQueue() { return &fKeyQueue; }
|
|
+ //Queue<mouse_event> *MouseQueue() { return &fMouseQueue; }
|
|
+ //Queue<void (*)(void)> *CommandQueue() { return &fCommandQueue; }
|
|
+ static void release_mouse();
|
|
+
|
|
private:
|
|
- BBitmap *backing_store;
|
|
- BView *backing_view;
|
|
+ void ShowCursor(bool show);
|
|
+ uchar ReverseBitorder(uchar b);
|
|
+ void CaptureInput();
|
|
+ void ReleaseInput();
|
|
|
|
-public:
|
|
- BochsView(BRect frame, char *name);
|
|
- ~BochsView();
|
|
- virtual void AttachedToWindow();
|
|
- virtual void Draw(BRect updateRect);
|
|
- virtual void KeyDown(const char *bytes, int32 numBytes);
|
|
- virtual void KeyUp(const char *bytes, int32 numBytes);
|
|
- virtual void MouseDown(BPoint point);
|
|
- virtual void MouseUp(BPoint point);
|
|
- virtual void MouseMoved(BPoint point,
|
|
- uint32 transit, const BMessage *message);
|
|
- void DrawBitmap(const BBitmap *aBitmap, BPoint where);
|
|
- void FillRect(BRect r, pattern p = B_SOLID_HIGH);
|
|
- void SetHighColor(uchar r, uchar g, uchar b, uchar a = 255);
|
|
- void SetLowColor(uchar r, uchar g, uchar b, uchar a = 255);
|
|
- void SetFont(const BFont *font, uint32 mask = B_FONT_ALL);
|
|
- void set_text_colors(void);
|
|
- void set_inv_text_colors(void);
|
|
- void set_headerbar_colors(void);
|
|
- };
|
|
-
|
|
-
|
|
-void GUI_end(void);
|
|
-void enq_key_event(Bit32u key, Bit32u press_release);
|
|
-Bit32u deq_key_event(void);
|
|
-#define SCANCODE_BUFSIZE 20
|
|
-static Bit32u keyevents[SCANCODE_BUFSIZE];
|
|
-static unsigned head=0, tail=0;
|
|
-static bool view_attached = 0;
|
|
-
|
|
-static BochsApplication *myApplication = NULL;
|
|
-static BochsWindow *aWindow = NULL;
|
|
-static BochsView *aView = NULL;
|
|
-static BView *canvas = NULL;
|
|
-static uint8 cmap_index[256]; // indeces into system colormap
|
|
-
|
|
-static BRect rect;
|
|
-static BPoint image_origin;
|
|
-static BBitmap *image = NULL;
|
|
-static BScreen *screen;
|
|
-static unsigned long rowsize_padded=0;
|
|
-static uint8 *rawdata = NULL;
|
|
-
|
|
-//static int rows=25, columns=80;
|
|
-
|
|
-static unsigned font_width, font_height;
|
|
-static Bit8u blank_line[80];
|
|
-static unsigned dimension_x, dimension_y;
|
|
-
|
|
-//static unsigned imDepth, imWide, imBPP;
|
|
-
|
|
-// current cursor coordinates
|
|
-//IRA=> Start
|
|
-static BPoint current;
|
|
-static BPoint previous;
|
|
-static Bit8u mouse_button_state = 0;
|
|
-//IRA=> End
|
|
-//static int prev_x=-1, prev_y=-1;
|
|
-//static int current_x=-1, current_y=-1;
|
|
-
|
|
-static unsigned prev_block_cursor_x=0;
|
|
-static unsigned prev_block_cursor_y=0;
|
|
-
|
|
-static void headerbar_click(int x, int y);
|
|
-
|
|
-Bit8u ascii_to_scancode[0x7f] = {
|
|
- 0, 0, 0, 0, 0, 0, 0, 0,
|
|
- 0, 0, 0, 0, 0, 0, 0, 0,
|
|
- 0, 0, 0, 0, 0, 0, 0, 0,
|
|
- 0, 0, 0, 0, 0, 0, 0, 0,
|
|
- 0x39, 0x02, 0x28, 0x04, 0x05, 0x06, 0x08, 0x28, /* !"#$%&' */
|
|
- 0x0a, 0x0b, 0x09, 0x0d, 0x33, 0x0c, 0x34, 0x35, /* ()*+,-./ */
|
|
- 0x0b, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, /* 01234567 */
|
|
- 0x09, 0x0a, 0x27, 0x27, 0x33, 0x0d, 0x34, 0x35, /* 89:;<=>? */
|
|
- 0x03, 0x1e, 0x30, 0x2e, 0x20, 0x12, 0x21, 0x22, /* @ABCDEFG */
|
|
- 0x23, 0x17, 0x24, 0x25, 0x26, 0x32, 0x31, 0x18, /* HIJKLMNO */
|
|
- 0x19, 0x10, 0x13, 0x1f, 0x14, 0x16, 0x2f, 0x11, /* PQRSTUVW */
|
|
- 0x2d, 0x15, 0x2c, 0x1a, 0x2b, 0x1b, 0x07, 0x0c, /* XYZ[\]^_ */
|
|
- 0x29, 0x1e, 0x30, 0x2e, 0x20, 0x12, 0x21, 0x22, /* `abcdefg */
|
|
- 0x23, 0x17, 0x24, 0x25, 0x26, 0x32, 0x31, 0x18, /* hijklmno */
|
|
- 0x19, 0x10, 0x13, 0x1f, 0x14, 0x16, 0x2f, 0x11, /* pqrstuvw */
|
|
- 0x2d, 0x15, 0x2c, 0x1a, 0x2b, 0x1b, 0x29 /* xyz{|}~ */
|
|
- };
|
|
-
|
|
-extern Bit8u graphics_snapshot[32 * 1024];
|
|
-//extern pc_keyb_c *pc_keyboard;
|
|
-
|
|
-
|
|
-
|
|
-
|
|
-unsigned col_vals[256], curr_foreground, curr_background;
|
|
-
|
|
-static unsigned x_tilesize, y_tilesize;
|
|
-
|
|
-struct {
|
|
- BBitmap *bmap;
|
|
- unsigned xdim;
|
|
- unsigned ydim;
|
|
- } bx_bitmaps[BX_MAX_PIXMAPS];
|
|
-unsigned bx_bitmap_entries = 0;
|
|
-
|
|
-static struct {
|
|
- BBitmap *bitmap;
|
|
- unsigned xdim;
|
|
- unsigned ydim;
|
|
- unsigned xorigin;
|
|
- unsigned yorigin;
|
|
- unsigned alignment;
|
|
- void (*f)(void);
|
|
- } bx_headerbar_entry[BX_MAX_HEADERBAR_ENTRIES];
|
|
-static unsigned bx_headerbar_y = 0;
|
|
-static unsigned bx_headerbar_entries = 0;
|
|
-static unsigned bx_bitmap_left_xorigin = 0; // pixels from left
|
|
-static unsigned bx_bitmap_right_xorigin = 0; // pixels from right
|
|
-
|
|
-static void headerbar_click(int x, int y);
|
|
-static unsigned char reverse_bitorder(unsigned char b);
|
|
-static void create_vga_font(void);
|
|
-static BBitmap *vgafont[256];
|
|
-
|
|
-static bx_gui_c *bx_gui_c_ptr;
|
|
+ BBitmap *fBackBitmap;
|
|
+ BView *fBackView;
|
|
+ uint32 fLastModifiers;
|
|
+ uint32 fLastMouseX, fLastMouseY;
|
|
+ uint32 fCursorX, fCursorY;
|
|
+ uint8 fCursorValue[2];
|
|
+ bool fCursorVisible;
|
|
+ bool fInTextMode;
|
|
+ BScreen fScreen;
|
|
+ uint8 fColorMap[256]; // indices into system colormap
|
|
+ BBitmap *fVgafont[256];
|
|
+ BBitmap *fCursorBitmap;
|
|
+ uint32 fTileWidth;
|
|
+ uint32 fTileHeight;
|
|
+ bool fUseStandardInput;
|
|
+ bool fMouseEnabled;
|
|
+ BHandler *fCaptureTarget;
|
|
+
|
|
+ Queue<uint32> fKeyQueue;
|
|
+ Queue<mouse_event> fMouseQueue;
|
|
+ Queue<void (*)(void)> fCommandQueue;
|
|
+
|
|
+ struct
|
|
+ {
|
|
+ BBitmap *bmap;
|
|
+ unsigned xdim;
|
|
+ unsigned ydim;
|
|
+ } fBitmaps[BX_MAX_PIXMAPS];
|
|
+ uint32 fBitmapCount;
|
|
+
|
|
+ struct
|
|
+ {
|
|
+ BBitmap *bitmap;
|
|
+ unsigned xdim;
|
|
+ unsigned ydim;
|
|
+ unsigned xorigin;
|
|
+ unsigned yorigin;
|
|
+ unsigned alignment;
|
|
+ void (*f)(void);
|
|
+ } fHeaderEntries[BX_MAX_HEADERBAR_ENTRIES];
|
|
+ uint32 fHeaderEntryCount;
|
|
+
|
|
+ uint32 fHeaderHeight;
|
|
+ uint32 fHeaderLeft; // pixels from left
|
|
+ uint32 fHeaderRight; // pixels from right
|
|
+};
|
|
|
|
- void
|
|
-bx_gui_c::specific_init(bx_gui_c *th, int argc, char **argv,
|
|
- unsigned tilewidth, unsigned tileheight,
|
|
- unsigned header_bar_y)
|
|
+class ModifierFilter: public BMessageFilter
|
|
{
|
|
- unsigned i;
|
|
-#if BX_CPU_LEVEL < 2
|
|
- char *window_name = "Bochs 8086 emulator, http://world.std.com/~bochs";
|
|
-#elif BX_CPU_LEVEL == 2
|
|
- char *window_name = "Bochs 80286 emulator, http://world.std.com/~bochs";
|
|
-#elif BX_CPU_LEVEL == 3
|
|
- char *window_name = "Bochs 80386 emulator, http://world.std.com/~bochs";
|
|
-#else
|
|
- char *window_name = "Bochs 80386+ emulator, http://world.std.com/~bochs";
|
|
-#endif
|
|
-
|
|
- bx_gui_c_ptr = th;
|
|
-UNUSED(argc);
|
|
-UNUSED(argv);
|
|
-UNUSED(window_name);
|
|
- th->put("BGUI");
|
|
-
|
|
-if (bx_options.Oprivate_colormap->get ()) {
|
|
- BX_INFO(( "BeOS: private_colormap option not handled yet."));
|
|
- }
|
|
-
|
|
- x_tilesize = tilewidth;
|
|
- y_tilesize = tileheight;
|
|
- bx_headerbar_y = header_bar_y;
|
|
-
|
|
- for (i=0; i<80; i++) {
|
|
- blank_line[i] = ' ';
|
|
- }
|
|
-
|
|
-
|
|
- font_width = 8;
|
|
- font_height = 16;
|
|
-
|
|
- // width = columns * font_width;
|
|
- // height = rows * font_height;
|
|
-
|
|
-BX_INFO(("font_width = %u", (unsigned) font_width));
|
|
-BX_INFO(("font_height = %u", (unsigned) font_height));
|
|
-
|
|
- // Create pixmap of depth 1 (bitmap) for icon
|
|
- // icon_pixmap = XCreateBitmapFromData(bx_x_display, win,
|
|
- // (char *) bochs_icon_bits, bochs_icon_width, bochs_icon_height);
|
|
+public:
|
|
+ ModifierFilter(BHandler *target);
|
|
+ virtual filter_result Filter(BMessage *msg, BHandler **target);
|
|
+private:
|
|
+ BHandler *fTarget;
|
|
+};
|
|
|
|
- curr_background = 0;
|
|
- // XSetBackground(bx_x_display, gc, col_vals[curr_background]);
|
|
- curr_foreground = 1;
|
|
- // XSetForeground(bx_x_display, gc, col_vals[curr_foreground]);
|
|
- //XGrabPointer( bx_x_display, win, True, 0, GrabModeAsync, GrabModeAsync,
|
|
- // win, None, CurrentTime );
|
|
- //XFlush(bx_x_display);
|
|
+class CaptureTarget: public BHandler
|
|
+{
|
|
+public:
|
|
+ CaptureTarget(BochsView *myTarget): fMyTarget(myTarget) { }
|
|
+ virtual void MessageReceived(BMessage *msg);
|
|
+private:
|
|
+ BochsView *fMyTarget;
|
|
+};
|
|
|
|
- myApplication = new BochsApplication();
|
|
+// ========== GLOBAL DATA ==========
|
|
|
|
- // wait until window on screen
|
|
- while (1) {
|
|
- aWindow->Lock();
|
|
- if (aWindow->IsHidden()) {
|
|
- aWindow->Unlock();
|
|
- continue;
|
|
- }
|
|
- aWindow->Unlock();
|
|
- break;
|
|
- }
|
|
+static BochsApplication *bApp = NULL;
|
|
+static BochsView *bView = NULL;
|
|
|
|
- screen = new BScreen;
|
|
- // start out with all color map indeces pointing to Black
|
|
- cmap_index[0] = screen->IndexForColor(0, 0, 0);
|
|
- for (unsigned i=1; i<256; i++) {
|
|
- cmap_index[i] = cmap_index[0];
|
|
- }
|
|
+// ========== keytable ==========
|
|
+
|
|
+static const uint8 key_to_scancode[] = {
|
|
+ 0,
|
|
+ BX_KEY_ESC,
|
|
+ BX_KEY_F1,
|
|
+ BX_KEY_F2,
|
|
+ BX_KEY_F3,
|
|
+ BX_KEY_F4,
|
|
+ BX_KEY_F5,
|
|
+ BX_KEY_F6,
|
|
+ BX_KEY_F7,
|
|
+ BX_KEY_F8,
|
|
+ BX_KEY_F9,
|
|
+ BX_KEY_F10,
|
|
+ BX_KEY_F11,
|
|
+ BX_KEY_F12,
|
|
+ BX_KEY_PRINT,
|
|
+ BX_KEY_SCRL_LOCK,
|
|
+ BX_KEY_PAUSE, /*0x10*/
|
|
+ BX_KEY_GRAVE,
|
|
+ BX_KEY_1,
|
|
+ BX_KEY_2,
|
|
+ BX_KEY_3,
|
|
+ BX_KEY_4,
|
|
+ BX_KEY_5,
|
|
+ BX_KEY_6,
|
|
+ BX_KEY_7,
|
|
+ BX_KEY_8,
|
|
+ BX_KEY_9,
|
|
+ BX_KEY_0,
|
|
+ BX_KEY_MINUS,
|
|
+ BX_KEY_EQUALS,
|
|
+ BX_KEY_BACKSPACE,
|
|
+ BX_KEY_INSERT,
|
|
+ BX_KEY_HOME, /*0x20*/
|
|
+ BX_KEY_PAGE_UP,
|
|
+ BX_KEY_NUM_LOCK,
|
|
+ BX_KEY_KP_DIVIDE,
|
|
+ BX_KEY_KP_MULTIPLY,
|
|
+ BX_KEY_KP_SUBTRACT,
|
|
+ BX_KEY_TAB,
|
|
+ BX_KEY_Q,
|
|
+ BX_KEY_W,
|
|
+ BX_KEY_E,
|
|
+ BX_KEY_R,
|
|
+ BX_KEY_T,
|
|
+ BX_KEY_Y,
|
|
+ BX_KEY_U,
|
|
+ BX_KEY_I,
|
|
+ BX_KEY_O,
|
|
+ BX_KEY_P, /*0x30*/
|
|
+ BX_KEY_LEFT_BRACKET,
|
|
+ BX_KEY_RIGHT_BRACKET,
|
|
+ BX_KEY_BACKSLASH,
|
|
+ BX_KEY_DELETE,
|
|
+ BX_KEY_END,
|
|
+ BX_KEY_PAGE_DOWN,
|
|
+ BX_KEY_KP_HOME,
|
|
+ BX_KEY_KP_UP,
|
|
+ BX_KEY_KP_PAGE_UP,
|
|
+ BX_KEY_KP_ADD,
|
|
+ BX_KEY_CAPS_LOCK,
|
|
+ BX_KEY_A,
|
|
+ BX_KEY_S,
|
|
+ BX_KEY_D,
|
|
+ BX_KEY_F,
|
|
+ BX_KEY_G, /*0x40*/
|
|
+ BX_KEY_H,
|
|
+ BX_KEY_J,
|
|
+ BX_KEY_K,
|
|
+ BX_KEY_L,
|
|
+ BX_KEY_SEMICOLON,
|
|
+ BX_KEY_SINGLE_QUOTE,
|
|
+ BX_KEY_ENTER,
|
|
+ BX_KEY_KP_LEFT,
|
|
+ BX_KEY_KP_5,
|
|
+ BX_KEY_KP_RIGHT,
|
|
+ BX_KEY_SHIFT_L,
|
|
+ BX_KEY_Z,
|
|
+ BX_KEY_X,
|
|
+ BX_KEY_C,
|
|
+ BX_KEY_V,
|
|
+ BX_KEY_B, /*0x50*/
|
|
+ BX_KEY_N,
|
|
+ BX_KEY_M,
|
|
+ BX_KEY_COMMA,
|
|
+ BX_KEY_PERIOD,
|
|
+ BX_KEY_SLASH,
|
|
+ BX_KEY_SHIFT_R,
|
|
+ BX_KEY_UP,
|
|
+ BX_KEY_KP_END,
|
|
+ BX_KEY_KP_DOWN,
|
|
+ BX_KEY_KP_PAGE_DOWN,
|
|
+ BX_KEY_KP_ENTER,
|
|
+ BX_KEY_CTRL_L,
|
|
+ BX_KEY_ALT_L,
|
|
+ BX_KEY_SPACE,
|
|
+ BX_KEY_ALT_R,
|
|
+ BX_KEY_CTRL_R, /*0x60*/
|
|
+ BX_KEY_LEFT,
|
|
+ BX_KEY_DOWN,
|
|
+ BX_KEY_RIGHT,
|
|
+ BX_KEY_KP_INSERT,
|
|
+ BX_KEY_KP_DELETE
|
|
+};
|
|
+
|
|
+// ========== class Queue definitions ==========
|
|
+
|
|
+template <class ContentType>
|
|
+Queue<ContentType>::Queue(uint32 maxItems, const char *name):
|
|
+ fMaxItems(maxItems),
|
|
+ fHead(0),
|
|
+ fTail(0)
|
|
+{
|
|
+ fItems = new ContentType[fMaxItems];
|
|
+ fName = strdup(name);
|
|
+}
|
|
+
|
|
+template <class ContentType>
|
|
+Queue<ContentType>::~Queue()
|
|
+{
|
|
+ delete [] fItems;
|
|
+ delete fName;
|
|
+}
|
|
+
|
|
+template <class ContentType>
|
|
+bool Queue<ContentType>::Enq(const ContentType &item)
|
|
+{
|
|
+ if ( ((fTail + 1) % fMaxItems) == fHead )
|
|
+ {
|
|
+ BX_DEBUG(("%s enqueue: buffer full", fName));
|
|
+ return false;
|
|
+ }
|
|
+ fItems[fTail] = item;
|
|
+ fTail = (fTail + 1) % fMaxItems;
|
|
+ return true;
|
|
+}
|
|
+
|
|
+template <class ContentType>
|
|
+bool Queue<ContentType>::Deq(ContentType *item)
|
|
+{
|
|
+ if ( fHead == fTail )
|
|
+ {
|
|
+ BX_DEBUG(("%s dequeue: buffer empty", fName));
|
|
+ return false;
|
|
+ }
|
|
+ *item = fItems[fHead];
|
|
+ fHead = (fHead + 1) % fMaxItems;
|
|
+ return true;
|
|
+}
|
|
+
|
|
+// ========== class BochsApplication definitions ==========
|
|
+
|
|
+BochsApplication::BochsApplication(bx_gui_c *bxGui, int argc, char **argv,
|
|
+ uint32 tileWidth, uint32 tileHeight, uint32 header_bar_y, void (*powerHandlerFunc)()):
|
|
+ BApplication(BOCHS_APP_SIG),
|
|
+ fPowerHandlerFunc(powerHandlerFunc)
|
|
+{
|
|
+ bxGui->put("BGUI");
|
|
+
|
|
+ if (bx_options.Oprivate_colormap->get ())
|
|
+ {
|
|
+ BX_INFO(( "BeOS: private_colormap option not handled yet."));
|
|
+ }
|
|
+
|
|
+ // -------------------------------
|
|
+
|
|
+ BRect rect(0, 0, INITIAL_SCREEN_WIDTH - 1, INITIAL_SCREEN_HEIGHT + header_bar_y);
|
|
+
|
|
+ BochsWindow *window = new BochsWindow(rect.OffsetToCopy(5, 80));
|
|
+
|
|
+ bView = new BochsView(rect, "BochsView", header_bar_y, tileWidth, tileHeight);
|
|
|
|
- rect.Set(0,0, x_tilesize-1, y_tilesize-1);
|
|
- image = new BBitmap(rect, B_COLOR_8_BIT);
|
|
- rowsize_padded = PAD_NEAREST(x_tilesize, sizeof(int32));
|
|
- rawdata = new uint8[rowsize_padded * y_tilesize];
|
|
+ // add view to window
|
|
+ window->AddChild(bView);
|
|
|
|
- create_vga_font();
|
|
+ // make window visible
|
|
+ window->Show();
|
|
}
|
|
-
|
|
-
|
|
|
|
- void
|
|
-bx_gui_c::handle_events(void)
|
|
+BochsApplication::~BochsApplication()
|
|
{
|
|
- Bit32u key;
|
|
-
|
|
- while ( head != tail ) {
|
|
- key = deq_key_event();
|
|
- bx_devices.keyboard->gen_scancode(key);
|
|
- }
|
|
-//IRA=> Start
|
|
- if (aView) {
|
|
- unsigned long buttons;
|
|
- aView->LockLooper();
|
|
- aView->GetMouse(¤t, &buttons, false);
|
|
- aView->UnlockLooper();
|
|
-
|
|
- Bit8u newstate = 0; //please note: 2nd and 3rd button are mapped the same
|
|
- if (buttons & B_PRIMARY_MOUSE_BUTTON)
|
|
- newstate |= 0x01;
|
|
- if (buttons & B_SECONDARY_MOUSE_BUTTON)
|
|
- newstate |= 0x02;
|
|
- if (buttons & B_TERTIARY_MOUSE_BUTTON)
|
|
- newstate |= 0x02;
|
|
-
|
|
- if (current != previous ||
|
|
- mouse_button_state != newstate) {
|
|
- int dx = (int)(current.x - previous.x) *2;
|
|
- int dy = -(int)((current.y - previous.y) *2);
|
|
- bx_devices.keyboard->mouse_motion( dx, dy, newstate);
|
|
- mouse_button_state = newstate;
|
|
- previous = current;
|
|
- }
|
|
- }
|
|
-//IRA=> End
|
|
+ bApp = NULL;
|
|
}
|
|
|
|
- void
|
|
-bx_gui_c::flush(void)
|
|
+int32 BochsApplication::runme(void *data)
|
|
{
|
|
- if (view_attached)
|
|
- aView->Flush();
|
|
+ be_app->Lock();
|
|
+ be_app->Run();
|
|
}
|
|
-
|
|
|
|
- void
|
|
-bx_gui_c::clear_screen(void)
|
|
+bool BochsApplication::QuitRequested()
|
|
{
|
|
- aWindow->Lock();
|
|
- aView->FillRect(BRect(0, bx_headerbar_y, dimension_x-1, dimension_y-1), B_SOLID_LOW);
|
|
- aWindow->Unlock();
|
|
+ BMessage msg(MSG_ENQ_COMMAND);
|
|
+ msg.AddPointer("command", (void*)fPowerHandlerFunc);
|
|
+ bView->Window()->PostMessage(&msg, bView);
|
|
+ return false;
|
|
}
|
|
-
|
|
-
|
|
|
|
- void
|
|
-bx_gui_c::text_update(Bit8u *old_text, Bit8u *new_text,
|
|
- unsigned long cursor_x, unsigned long cursor_y,
|
|
- unsigned nrows)
|
|
+void BochsApplication::Quit()
|
|
{
|
|
- unsigned i, x, y;
|
|
- BPoint point;
|
|
- unsigned char achar;
|
|
- unsigned nchars;
|
|
-
|
|
- aWindow->Lock();
|
|
-
|
|
- // Number of characters on screen, variable number of rows
|
|
- nchars = 80*nrows;
|
|
-
|
|
- // first draw over character at original block cursor location
|
|
- if ( (prev_block_cursor_y*80 + prev_block_cursor_x) < nchars ) {
|
|
- achar = new_text[(prev_block_cursor_y*80 + prev_block_cursor_x)*2];
|
|
- point.Set(prev_block_cursor_x*8, prev_block_cursor_y*16 + bx_headerbar_y);
|
|
- aView->DrawBitmap(vgafont[achar], point );
|
|
- }
|
|
-
|
|
- for (i=0; i<nchars*2; i+=2) {
|
|
- if ( (old_text[i]!=new_text[i]) ||
|
|
- (old_text[i+1]!=new_text[i+1]) ) {
|
|
-
|
|
- achar = new_text[i];
|
|
-
|
|
- x = (i/2) % 80;
|
|
- y = (i/2) / 80;
|
|
-
|
|
- point.Set(x*8, y*16 + bx_headerbar_y);
|
|
- aView->DrawBitmap(vgafont[achar], point );
|
|
- }
|
|
- }
|
|
-
|
|
- prev_block_cursor_x = cursor_x;
|
|
- prev_block_cursor_y = cursor_y;
|
|
-
|
|
- // now draw character at new block cursor location in reverse
|
|
- if ( (cursor_y*80 + cursor_x) < nchars ) {
|
|
- achar = new_text[(cursor_y*80 + cursor_x)*2];
|
|
- point.Set(cursor_x*8, cursor_y*16 + bx_headerbar_y);
|
|
- aView->set_inv_text_colors();
|
|
- aView->DrawBitmap(vgafont[achar], point );
|
|
- aView->set_text_colors();
|
|
- }
|
|
-
|
|
- aWindow->Unlock();
|
|
+ uint32 lockCount = 0;
|
|
+ while (IsLocked())
|
|
+ {
|
|
+ Unlock();
|
|
+ lockCount++;
|
|
+ }
|
|
+ bView->LockLooper();
|
|
+ bView->Window()->Close();
|
|
+ while (lockCount--) Lock();
|
|
}
|
|
-
|
|
|
|
- void
|
|
-bx_gui_c::graphics_tile_update(Bit8u *tile, unsigned x0, unsigned y0)
|
|
+void BochsApplication::BxExit()
|
|
{
|
|
- for (unsigned y=0; y<y_tilesize; y++) {
|
|
- for (unsigned x=0; x<x_tilesize; x++) {
|
|
- rawdata[y*rowsize_padded + x] = cmap_index[ tile[y*x_tilesize + x] ];
|
|
- }
|
|
- }
|
|
- aWindow->Lock();
|
|
- image->SetBits(rawdata, rowsize_padded * y_tilesize, 0, B_COLOR_8_BIT);
|
|
- image_origin.Set(x0, y0 + bx_headerbar_y);
|
|
-
|
|
- aView->DrawBitmap( image, image_origin );
|
|
- aWindow->Unlock();
|
|
+ if (Lock()) Quit();
|
|
}
|
|
|
|
+// ========== class BochsWindow definitions ==========
|
|
|
|
- Boolean
|
|
-bx_gui_c::palette_change(unsigned index, unsigned red, unsigned green, unsigned blue)
|
|
+BochsWindow::BochsWindow(BRect frame):
|
|
+ BWindow(frame, "Bochs", B_TITLED_WINDOW, B_NOT_RESIZABLE)
|
|
{
|
|
- cmap_index[index] = screen->IndexForColor(
|
|
- red, green, blue);
|
|
- return(1);
|
|
-}
|
|
|
|
-
|
|
- void
|
|
-bx_gui_c::dimension_update(unsigned x, unsigned y)
|
|
-{
|
|
- aWindow->Lock();
|
|
- aWindow->ResizeTo(x, y + bx_headerbar_y);
|
|
- aWindow->Unlock();
|
|
}
|
|
-
|
|
-
|
|
-//////////////////////////////////////////////////////
|
|
-
|
|
|
|
- void
|
|
-GUI_end()
|
|
+bool BochsWindow::QuitRequested()
|
|
{
|
|
- //myApplication->Run();
|
|
-
|
|
- delete(myApplication);
|
|
+ be_app->PostMessage(B_QUIT_REQUESTED);
|
|
+ return false;
|
|
}
|
|
-
|
|
-BochsApplication::BochsApplication()
|
|
- : BApplication("application/x-vnd.Be-Bochs")
|
|
-{
|
|
- BRect aRect;
|
|
-
|
|
- int left, right, top, bottom;
|
|
- left = 5;
|
|
- top = 80;
|
|
- dimension_x = 640;
|
|
- dimension_y = 480 + bx_headerbar_y;
|
|
- right = left + dimension_x - 1;
|
|
- bottom = top + dimension_y - 1;
|
|
|
|
- // set up a rectangle and instantiate a new window
|
|
- aRect.Set(left, top, right, bottom);
|
|
- aWindow = new BochsWindow(aRect);
|
|
+// ========== class BochsView definitions ==========
|
|
|
|
- // set up a rectangle and instantiate a new view
|
|
- // view rect should be same size as window rect but with left top at (0, 0)
|
|
- aRect.OffsetTo(B_ORIGIN);
|
|
- aView = new BochsView(aRect, "BochsView");
|
|
- aView->SetViewColor(0, 0, 0);
|
|
-
|
|
- aView->set_text_colors();
|
|
-
|
|
- // add view to window
|
|
- aWindow->AddChild(aView);
|
|
-
|
|
- // make window visible
|
|
- aWindow->Show();
|
|
+BochsView::BochsView(BRect rect, char *name, uint32 headerHeight, uint32 tileWidth, uint32 tileHeight):
|
|
+ BView(rect, name, B_FOLLOW_ALL, B_WILL_DRAW | B_PULSE_NEEDED),
|
|
+ fLastModifiers(0),
|
|
+ fCursorX(0), fCursorY(0),
|
|
+ fCursorVisible(false),
|
|
+ fInTextMode(true),
|
|
+ fTileWidth(tileWidth),
|
|
+ fTileHeight(tileHeight),
|
|
+ fUseStandardInput(true),
|
|
+ fMouseEnabled(false),
|
|
+ fKeyQueue(SCANCODE_BUFSIZE, "keyboard queue"),
|
|
+ fMouseQueue(MOUSE_BUFSIZE, "mouse queue"),
|
|
+ fCommandQueue(10, "headerbar queue"),
|
|
+ fBitmapCount(0),
|
|
+ fHeaderEntryCount(0),
|
|
+ fHeaderHeight(headerHeight),
|
|
+ fHeaderLeft(0),
|
|
+ fHeaderRight(0)
|
|
+{
|
|
+ SetViewColor(0, 0, 0);
|
|
+ fBackBitmap = new BBitmap(rect, B_BITMAP_ACCEPTS_VIEWS, B_CMAP8);
|
|
+ fBackView = new BView(rect,"BackView", B_FOLLOW_ALL, B_WILL_DRAW);
|
|
+ fBackView->SetViewColor(0, 0, 0);
|
|
+ fBackBitmap->AddChild(fBackView);
|
|
+
|
|
+ fCaptureTarget = new CaptureTarget(this);
|
|
+
|
|
+ // start out with all color map indeces pointing to Black
|
|
+ fColorMap[0] = fScreen.IndexForColor(0, 0, 0);
|
|
+ for (unsigned i=1; i<256; i++)
|
|
+ {
|
|
+ fColorMap[i] = fColorMap[0];
|
|
+ }
|
|
+
|
|
+ BX_INFO(( "BeOS: creating VGA font from bitmaps" ));
|
|
+
|
|
+ // VGA font is 8wide x 16high
|
|
+ uint8 *bits;
|
|
+ for (uint32 c = 0; c < 256; c++)
|
|
+ {
|
|
+ fVgafont[c] = new BBitmap(BRect(0,0, 7,15), B_MONOCHROME_1_BIT);
|
|
+ if (!fVgafont[c])
|
|
+ {
|
|
+ BX_PANIC(("beos: could not create bitmap"));
|
|
+ }
|
|
+
|
|
+ int32 bytesPerRow = fVgafont[c]->BytesPerRow();
|
|
+ bits = (uint8*)fVgafont[c]->Bits();
|
|
+ memset(bits, 0, fVgafont[c]->BitsLength());
|
|
+ for (uint32 i = 0; i < 16; i++)
|
|
+ {
|
|
+ bits[i * bytesPerRow] = ReverseBitorder(bx_vgafont[c].data[i]);
|
|
+ }
|
|
+ }
|
|
}
|
|
|
|
-//void set_palette_entry(long i,rgb_color c);
|
|
-
|
|
-BochsWindow::BochsWindow(BRect frame)
|
|
- : BWindow(frame, "BeBochs V1.3.pre compiled Bernd Korz", B_TITLED_WINDOW, B_NOT_RESIZABLE)
|
|
+BochsView::~BochsView()
|
|
{
|
|
+ delete fBackBitmap;
|
|
+ for (int32 i = 0; i < 256; i++) delete fVgafont[i];
|
|
+ delete fCursorBitmap;
|
|
+ delete fCaptureTarget;
|
|
+ bView = NULL;
|
|
}
|
|
|
|
-bool BochsWindow::QuitRequested()
|
|
+void BochsView::AttachedToWindow()
|
|
{
|
|
- be_app->PostMessage(B_QUIT_REQUESTED);
|
|
- return(TRUE);
|
|
+ SetViewColor(B_TRANSPARENT_COLOR);
|
|
+ MakeFocus(true);
|
|
+ Window()->AddFilter(new ModifierFilter(this));
|
|
+ be_app->AddHandler(fCaptureTarget);
|
|
+ BMessage modifiersMessage(B_MODIFIERS_CHANGED);
|
|
+ modifiersMessage.AddInt32("modifiers", (int32)modifiers());
|
|
+ Window()->PostMessage(&modifiersMessage, this);
|
|
+ BPoint p;
|
|
+ uint32 buttons;
|
|
+ GetMouse(&p, &buttons);
|
|
+ fLastMouseX = (uint32)p.x;
|
|
+ fLastMouseY = (uint32)p.y;
|
|
+}
|
|
+
|
|
+void BochsView::DetachedFromWindow()
|
|
+{
|
|
+ if (be_app->Lock())
|
|
+ {
|
|
+ be_app->RemoveHandler(fCaptureTarget);
|
|
+ be_app->Unlock();
|
|
+ }
|
|
}
|
|
|
|
-
|
|
- void
|
|
-BochsWindow::FrameResized(float width, float height)
|
|
+void BochsView::Draw(BRect rect)
|
|
{
|
|
- dimension_x = unsigned(width);
|
|
- dimension_y = unsigned(height) + bx_headerbar_y;
|
|
- if ( bx_gui_c_ptr )
|
|
- bx_gui_c_ptr->show_headerbar();
|
|
+ if (fBackBitmap->Lock())
|
|
+ {
|
|
+ fBackView->Sync();
|
|
+ fBackBitmap->Unlock();
|
|
+ }
|
|
+ DrawBitmapAsync(fBackBitmap, rect, rect);
|
|
+}
|
|
+
|
|
+void BochsView::MouseDown(BPoint point)
|
|
+{
|
|
+ if (point.y < fHeaderHeight)
|
|
+ {
|
|
+ int xorigin;
|
|
+ for (unsigned i = 0; i < fHeaderEntryCount; i++)
|
|
+ {
|
|
+ if (fHeaderEntries[i].alignment == BX_GRAVITY_LEFT)
|
|
+ xorigin = fHeaderEntries[i].xorigin;
|
|
+ else
|
|
+ xorigin = bView->Bounds().IntegerWidth() - fHeaderEntries[i].xorigin;
|
|
+ if ( (point.x >= xorigin) && (point.x < (xorigin + int(fHeaderEntries[i].xdim))) )
|
|
+ {
|
|
+ fCommandQueue.Enq(fHeaderEntries[i].f);
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ return;
|
|
+ }
|
|
+ uint32 buttons;
|
|
+ Window()->CurrentMessage()->FindInt32("buttons", (int32*)&buttons);
|
|
+
|
|
+ fMouseQueue.Enq(mouse_event(0, 0,
|
|
+ ((buttons & B_PRIMARY_MOUSE_BUTTON) ? MOUSE_L : 0) |
|
|
+ ((buttons & B_SECONDARY_MOUSE_BUTTON) ? MOUSE_R : 0)));
|
|
+
|
|
+ BX_DEBUG(("mousedown()"));
|
|
}
|
|
-
|
|
-
|
|
-//------------------------------
|
|
|
|
-
|
|
-BochsView::BochsView(BRect rect, char *name)
|
|
- : BView(rect, name, B_FOLLOW_ALL, B_WILL_DRAW)
|
|
+void BochsView::MouseUp(BPoint point)
|
|
{
|
|
- backing_store = new BBitmap(rect, B_BITMAP_ACCEPTS_VIEWS, B_COLOR_8_BIT);
|
|
- backing_view = new BView(rect,"backing store", B_FOLLOW_ALL, B_WILL_DRAW);
|
|
- backing_store->AddChild(backing_view);
|
|
+ uint32 buttons;
|
|
+ Window()->CurrentMessage()->FindInt32("buttons", (int32*)&buttons);
|
|
+
|
|
+ fMouseQueue.Enq(mouse_event(0, 0,
|
|
+ ((buttons & B_PRIMARY_MOUSE_BUTTON) ? MOUSE_L : 0) |
|
|
+ ((buttons & B_SECONDARY_MOUSE_BUTTON) ? MOUSE_R : 0)));
|
|
+
|
|
+ BX_DEBUG(( "mouseup()" ));
|
|
+}
|
|
+
|
|
+void BochsView::MouseMoved(BPoint point, uint32 transit, const BMessage *message)
|
|
+{
|
|
+ if (!fUseStandardInput && fMouseEnabled)
|
|
+ {
|
|
+ be_app->ObscureCursor();
|
|
+ return;
|
|
+ }
|
|
+ uint32 buttons;
|
|
+ Window()->CurrentMessage()->FindInt32("buttons", (int32*)&buttons);
|
|
+ fMouseQueue.Enq(mouse_event((uint32)point.x - fLastMouseX, fLastMouseY - (uint32)point.y,
|
|
+ ((buttons & B_PRIMARY_MOUSE_BUTTON) ? MOUSE_L : 0) |
|
|
+ ((buttons & B_SECONDARY_MOUSE_BUTTON) ? MOUSE_R : 0)));
|
|
+ fLastMouseX = (uint32)point.x;
|
|
+ fLastMouseY = (uint32)point.y;
|
|
+ BX_DEBUG(( "mousemoved()" ));
|
|
}
|
|
|
|
- void
|
|
-BochsView::set_text_colors(void)
|
|
+void BochsView::KeyDown(const char *bytes, int32 numBytes)
|
|
{
|
|
- aView->SetHighColor(255, 255, 255);
|
|
- aView->SetLowColor(0, 0, 0);
|
|
+ int32 key;
|
|
+ Window()->CurrentMessage()->FindInt32("key", &key);
|
|
+ fKeyQueue.Enq(key_to_scancode[key] | BX_KEY_PRESSED);
|
|
}
|
|
|
|
- void
|
|
-BochsView::set_inv_text_colors(void)
|
|
+void BochsView::KeyUp(const char *bytes, int32 numBytes)
|
|
{
|
|
- aView->SetHighColor(0, 0, 0);
|
|
- aView->SetLowColor(255, 255, 255);
|
|
+ int32 key;
|
|
+ Window()->CurrentMessage()->FindInt32("key", &key);
|
|
+ fKeyQueue.Enq(key_to_scancode[key] | BX_KEY_RELEASED);
|
|
+}
|
|
+
|
|
+void BochsView::MessageReceived(BMessage *msg)
|
|
+{
|
|
+ switch (msg->what)
|
|
+ {
|
|
+ case MSG_ENQ_COMMAND:
|
|
+ {
|
|
+ void (*command)(void);
|
|
+ msg->FindPointer("command", (void**)&command);
|
|
+ fCommandQueue.Enq(command);
|
|
+ }
|
|
+ break;
|
|
+ case B_MODIFIERS_CHANGED:
|
|
+ {
|
|
+ uint32 modifiers = 0;
|
|
+ msg->FindInt32("modifiers", (int32*)&modifiers);
|
|
+ //fprintf(stderr, "# modifiers: %08x -> %08x\n", fLastModifiers, modifiers);
|
|
+ if (!(fLastModifiers & B_LEFT_SHIFT_KEY) && (modifiers & B_LEFT_SHIFT_KEY))
|
|
+ {
|
|
+ fKeyQueue.Enq(BX_KEY_SHIFT_L | BX_KEY_PRESSED);
|
|
+ //fprintf(stderr, "# left shift down\n");
|
|
+ }
|
|
+ else if ((fLastModifiers & B_LEFT_SHIFT_KEY) && !(modifiers & B_LEFT_SHIFT_KEY))
|
|
+ {
|
|
+ fKeyQueue.Enq(BX_KEY_SHIFT_L | BX_KEY_RELEASED);
|
|
+ //fprintf(stderr, "# left shift up\n");
|
|
+ }
|
|
+
|
|
+ if (!(fLastModifiers & B_RIGHT_SHIFT_KEY) && (modifiers & B_RIGHT_SHIFT_KEY))
|
|
+ {
|
|
+ fKeyQueue.Enq(BX_KEY_SHIFT_R | BX_KEY_PRESSED);
|
|
+ //fprintf(stderr, "# right shift down\n");
|
|
+ }
|
|
+ else if ((fLastModifiers & B_RIGHT_SHIFT_KEY) && !(modifiers & B_RIGHT_SHIFT_KEY))
|
|
+ {
|
|
+ fKeyQueue.Enq(BX_KEY_SHIFT_R | BX_KEY_RELEASED);
|
|
+ //fprintf(stderr, "# right shift up\n");
|
|
+ }
|
|
+
|
|
+ if (!(fLastModifiers & B_CONTROL_KEY) && (modifiers & B_CONTROL_KEY))
|
|
+ {
|
|
+ fKeyQueue.Enq(BX_KEY_CTRL_L | BX_KEY_PRESSED);
|
|
+ //fprintf(stderr, "# left ctrl down\n");
|
|
+ }
|
|
+ else if ((fLastModifiers & B_CONTROL_KEY) && !(modifiers & B_CONTROL_KEY))
|
|
+ {
|
|
+ fKeyQueue.Enq(BX_KEY_CTRL_L | BX_KEY_RELEASED);
|
|
+ //fprintf(stderr, "# left ctrl up\n");
|
|
+ }
|
|
+
|
|
+ if (!(fLastModifiers & B_OPTION_KEY) && (modifiers & B_OPTION_KEY))
|
|
+ {
|
|
+ fKeyQueue.Enq(BX_KEY_CTRL_R | BX_KEY_PRESSED);
|
|
+ //fprintf(stderr, "# right ctrl down\n");
|
|
+ }
|
|
+ else if ((fLastModifiers & B_OPTION_KEY) && !(modifiers & B_OPTION_KEY))
|
|
+ {
|
|
+ fKeyQueue.Enq(BX_KEY_CTRL_R | BX_KEY_RELEASED);
|
|
+ //fprintf(stderr, "# right ctrl up\n");
|
|
+ }
|
|
+
|
|
+ if (!(fLastModifiers & B_LEFT_COMMAND_KEY) && (modifiers & B_LEFT_COMMAND_KEY))
|
|
+ {
|
|
+ fKeyQueue.Enq(BX_KEY_ALT_L | BX_KEY_PRESSED);
|
|
+ //fprintf(stderr, "# left alt down\n");
|
|
+ }
|
|
+ else if ((fLastModifiers & B_LEFT_COMMAND_KEY) && !(modifiers & B_LEFT_COMMAND_KEY))
|
|
+ {
|
|
+ fKeyQueue.Enq(BX_KEY_ALT_L | BX_KEY_RELEASED);
|
|
+ //fprintf(stderr, "# left alt up\n");
|
|
+ }
|
|
+
|
|
+ if (!(fLastModifiers & B_RIGHT_COMMAND_KEY) && (modifiers & B_RIGHT_COMMAND_KEY))
|
|
+ {
|
|
+ fKeyQueue.Enq(BX_KEY_ALT_R | BX_KEY_PRESSED);
|
|
+ //fprintf(stderr, "# right alt down\n");
|
|
+ }
|
|
+ else if ((fLastModifiers & B_RIGHT_COMMAND_KEY) && !(modifiers & B_RIGHT_COMMAND_KEY))
|
|
+ {
|
|
+ fKeyQueue.Enq(BX_KEY_ALT_R | BX_KEY_RELEASED);
|
|
+ //fprintf(stderr, "# right alt up\n");
|
|
+ }
|
|
+
|
|
+ if (!(fLastModifiers & B_CAPS_LOCK) && (modifiers & B_CAPS_LOCK))
|
|
+ {
|
|
+ fKeyQueue.Enq(BX_KEY_CAPS_LOCK | BX_KEY_PRESSED);
|
|
+ fKeyQueue.Enq(BX_KEY_CAPS_LOCK | BX_KEY_RELEASED);
|
|
+ //fprintf(stderr, "# caps down\n");
|
|
+ }
|
|
+ else if ((fLastModifiers & B_CAPS_LOCK) && !(modifiers & B_CAPS_LOCK))
|
|
+ {
|
|
+ fKeyQueue.Enq(BX_KEY_CAPS_LOCK | BX_KEY_PRESSED);
|
|
+ fKeyQueue.Enq(BX_KEY_CAPS_LOCK | BX_KEY_RELEASED);
|
|
+ //fprintf(stderr, "# caps up\n");
|
|
+ }
|
|
+
|
|
+ if (!(fLastModifiers & B_SCROLL_LOCK) && (modifiers & B_SCROLL_LOCK))
|
|
+ {
|
|
+ fKeyQueue.Enq(BX_KEY_SCRL_LOCK | BX_KEY_PRESSED);
|
|
+ fKeyQueue.Enq(BX_KEY_SCRL_LOCK | BX_KEY_RELEASED);
|
|
+ //fprintf(stderr, "# scrollock down\n");
|
|
+ }
|
|
+ else if ((fLastModifiers & B_SCROLL_LOCK) && !(modifiers & B_SCROLL_LOCK))
|
|
+ {
|
|
+ fKeyQueue.Enq(BX_KEY_SCRL_LOCK | BX_KEY_PRESSED);
|
|
+ fKeyQueue.Enq(BX_KEY_SCRL_LOCK | BX_KEY_RELEASED);
|
|
+ //fprintf(stderr, "# scrollock up\n");
|
|
+ }
|
|
+
|
|
+ if (!(fLastModifiers & B_NUM_LOCK) && (modifiers & B_NUM_LOCK))
|
|
+ {
|
|
+ fKeyQueue.Enq(BX_KEY_NUM_LOCK | BX_KEY_PRESSED);
|
|
+ fKeyQueue.Enq(BX_KEY_NUM_LOCK | BX_KEY_RELEASED);
|
|
+ //fprintf(stderr, "# num down\n");
|
|
+ }
|
|
+ else if ((fLastModifiers & B_NUM_LOCK) && !(modifiers & B_NUM_LOCK))
|
|
+ {
|
|
+ fKeyQueue.Enq(BX_KEY_NUM_LOCK | BX_KEY_PRESSED);
|
|
+ fKeyQueue.Enq(BX_KEY_NUM_LOCK | BX_KEY_RELEASED);
|
|
+ //fprintf(stderr, "# num up\n");
|
|
+ }
|
|
+ fLastModifiers = modifiers;
|
|
+ }
|
|
+ break;
|
|
+ default:
|
|
+ BView::MessageReceived(msg);
|
|
+ }
|
|
+}
|
|
+
|
|
+void BochsView::GotCapturedInput(BMessage *msg)
|
|
+{
|
|
+ switch (msg->what)
|
|
+ {
|
|
+ case B_MOUSE_MOVED:
|
|
+ {
|
|
+ uint32 buttons;
|
|
+ msg->FindInt32("buttons", (int32*)&buttons);
|
|
+ BPoint motion;
|
|
+ msg->FindPoint("motion", &motion);
|
|
+ fMouseQueue.Enq(mouse_event((uint32)motion.x, -(uint32)motion.y,
|
|
+ ((buttons & B_PRIMARY_MOUSE_BUTTON) ? MOUSE_L : 0) |
|
|
+ ((buttons & B_SECONDARY_MOUSE_BUTTON) ? MOUSE_R : 0)));
|
|
+ BX_DEBUG(( "mousemoved()" ));
|
|
+ }
|
|
+ break;
|
|
+ case B_MOUSE_DOWN:
|
|
+ case B_MOUSE_UP:
|
|
+ {
|
|
+ uint32 buttons;
|
|
+ msg->FindInt32("buttons", (int32*)&buttons);
|
|
+ if (buttons & B_PRIMARY_MOUSE_BUTTON && buttons & B_SECONDARY_MOUSE_BUTTON)
|
|
+ {
|
|
+ fCommandQueue.Enq(release_mouse);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ fMouseQueue.Enq(mouse_event(0, 0,
|
|
+ ((buttons & B_PRIMARY_MOUSE_BUTTON) ? MOUSE_L : 0) |
|
|
+ ((buttons & B_SECONDARY_MOUSE_BUTTON) ? MOUSE_R : 0)));
|
|
+
|
|
+ //BX_DEBUG(("mousedown()"));
|
|
+ }
|
|
+ break;
|
|
+ case B_KEY_DOWN:
|
|
+ case B_UNMAPPED_KEY_DOWN:
|
|
+ {
|
|
+ int32 key;
|
|
+ msg->FindInt32("key", &key);
|
|
+ fKeyQueue.Enq(key_to_scancode[key] | BX_KEY_PRESSED);
|
|
+ }
|
|
+ break;
|
|
+ case B_KEY_UP:
|
|
+ case B_UNMAPPED_KEY_UP:
|
|
+ {
|
|
+ int32 key;
|
|
+ msg->FindInt32("key", &key);
|
|
+ fKeyQueue.Enq(key_to_scancode[key] | BX_KEY_RELEASED);
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+void BochsView::WindowActivated(bool active)
|
|
+{
|
|
+ if (active) CaptureInput();
|
|
+ else ReleaseInput();
|
|
+}
|
|
+
|
|
+void BochsView::CaptureInput()
|
|
+{
|
|
+ BMessenger inputServer("application/x-vnd.Be-input_server");
|
|
+ BMessage msg(MSG_REQUEST_CAPTURE);
|
|
+ msg.AddMessenger("target", BMessenger(fCaptureTarget));
|
|
+ msg.AddInt32("command", MSG_START_CAPTURE);
|
|
+ msg.AddInt32("input", (fMouseEnabled ? INPUT_TYPE_MOUSE : 0) | INPUT_TYPE_KEYBOARD);
|
|
+ inputServer.SendMessage(&msg, &msg);
|
|
+ if (msg.what == MSG_CAPTURE_OK)
|
|
+ {
|
|
+ BX_INFO(( "capturing keyboard%s input", (fMouseEnabled ? " and mouse" : "")));
|
|
+ fUseStandardInput = false;
|
|
+ if (fMouseEnabled) be_app->ObscureCursor();
|
|
+ else be_app->ShowCursor();
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ BX_ERROR(( "couldn't set up input capturing, using loser method" ));
|
|
+ fUseStandardInput = true;
|
|
+ BMessage modifiersMessage(B_MODIFIERS_CHANGED);
|
|
+ modifiersMessage.AddInt32("modifiers", (int32)modifiers());
|
|
+ Window()->PostMessage(&modifiersMessage, this);
|
|
+ }
|
|
+}
|
|
+
|
|
+void BochsView::ReleaseInput()
|
|
+{
|
|
+ BMessenger inputServer("application/x-vnd.Be-input_server");
|
|
+ BMessage msg(MSG_REQUEST_CAPTURE);
|
|
+ msg.AddInt32("command", MSG_STOP_CAPTURE);
|
|
+ inputServer.SendMessage(&msg);
|
|
+ be_app->ShowCursor();
|
|
+ fUseStandardInput = true;
|
|
+}
|
|
+
|
|
+void BochsView::Pulse()
|
|
+{
|
|
+ if (!fInTextMode) return;
|
|
+ if (fBackView->LockLooper())
|
|
+ {
|
|
+ ShowCursor(!fCursorVisible);
|
|
+ fBackView->UnlockLooper();
|
|
+ }
|
|
+}
|
|
+
|
|
+void BochsView::HandleEvents()
|
|
+{
|
|
+ if (LockLooper())
|
|
+ {
|
|
+ //Queue<uint32> *keyQueue = bView->KeyQueue();
|
|
+ while (!fKeyQueue.QueueEmpty())
|
|
+ {
|
|
+ uint32 key;
|
|
+ fKeyQueue.Deq(&key);
|
|
+ bx_devices.keyboard->gen_scancode(key);
|
|
+ }
|
|
+
|
|
+ //Queue<mouse_event> *mouseQueue = bView->MouseQueue();
|
|
+ while (!fMouseQueue.QueueEmpty())
|
|
+ {
|
|
+ mouse_event event;
|
|
+ fMouseQueue.Deq(&event);
|
|
+ if (fMouseEnabled) bx_devices.keyboard->mouse_motion(event.x,
|
|
+ event.y, event.buttonState);
|
|
+ }
|
|
+
|
|
+ //Queue<void (*)(void)> *commandQueue = bView->CommandQueue();
|
|
+ while (!fCommandQueue.QueueEmpty())
|
|
+ {
|
|
+ void (*f)(void);
|
|
+ fCommandQueue.Deq(&f);
|
|
+ f();
|
|
+ }
|
|
+ UnlockLooper();
|
|
+ }
|
|
+}
|
|
+
|
|
+void BochsView::ClearScreen()
|
|
+{
|
|
+ if (fBackBitmap->Lock())
|
|
+ {
|
|
+ fBackView->SetLowColor(0, 0, 0);
|
|
+ BRect rect(fBackView->Bounds());
|
|
+ rect.top += fHeaderHeight;
|
|
+ fBackView->FillRect(rect, B_SOLID_LOW);
|
|
+ fBackBitmap->Unlock();
|
|
+ }
|
|
+ if (LockLooper())
|
|
+ {
|
|
+ Invalidate();
|
|
+ UnlockLooper();
|
|
+ }
|
|
+}
|
|
+
|
|
+void BochsView::TextUpdate(uint8 *oldText, uint8 *newText,
|
|
+ uint32 cursorX, uint32 cursorY, uint32 rowCount)
|
|
+{
|
|
+ if (LockLooper() && fBackBitmap->Lock())
|
|
+ {
|
|
+ fInTextMode = true;
|
|
+ bool cursorWasShown = fCursorVisible;
|
|
+ ShowCursor(false);
|
|
+ for (uint32 i = 0; i < rowCount * 80 * 2; i += 2)
|
|
+ {
|
|
+ if ( (oldText[i] != newText[i]) ||
|
|
+ (oldText[i+1]!=newText[i+1]) )
|
|
+ {
|
|
+ uint8 achar = newText[i];
|
|
+ uint8 acolor = newText[i + 1];
|
|
+
|
|
+ fBackView->SetLowColor(fScreen.ColorForIndex(fColorMap[acolor >> 4]));
|
|
+ fBackView->SetHighColor(fScreen.ColorForIndex(fColorMap[acolor & 0x0F]));
|
|
+
|
|
+ BPoint point(((i / 2) % 80) * 8, (i/2) / 80 * 16 + fHeaderHeight);
|
|
+ fBackView->DrawBitmapAsync(fVgafont[achar], point);
|
|
+ Invalidate(fVgafont[achar]->Bounds().OffsetToSelf(point));
|
|
+ }
|
|
+ }
|
|
+
|
|
+ fCursorX = cursorX;
|
|
+ fCursorY = cursorY;
|
|
+
|
|
+ if ( (cursorY * 80 + cursorX) < rowCount * 80 )
|
|
+ {
|
|
+ fCursorValue[0] = newText[(cursorY * 80 + cursorX) * 2];
|
|
+ fCursorValue[1] = newText[(cursorY * 80 + cursorX) * 2 + 1];
|
|
+ }
|
|
+ ShowCursor(cursorWasShown);
|
|
+ fBackBitmap->Unlock();
|
|
+ UnlockLooper();
|
|
+ }
|
|
+}
|
|
+
|
|
+void BochsView::GraphicsTileUpdate(uint8 *tile, uint32 x0, uint32 y0)
|
|
+{
|
|
+ if (LockLooper())
|
|
+ {
|
|
+ fInTextMode = false;
|
|
+ ShowCursor(false);
|
|
+ uint8 *bits = (uint8*)fBackBitmap->Bits();
|
|
+ int32 bytesPerRow = fBackBitmap->BytesPerRow();
|
|
+ bits += (y0 + fHeaderHeight) * bytesPerRow + x0;
|
|
+ if (fBackBitmap->Lock())
|
|
+ {
|
|
+ fBackView->Sync();
|
|
+ for (uint32 y = 0; y < fTileHeight; y++)
|
|
+ {
|
|
+ for (uint32 x = 0; x < fTileWidth; x++)
|
|
+ {
|
|
+ *(bits + x) = fColorMap[ tile[y*fTileWidth + x] ];
|
|
+ }
|
|
+ bits += bytesPerRow;
|
|
+ }
|
|
+ fBackBitmap->Unlock();
|
|
+ }
|
|
+ Invalidate(BRect(x0, y0 + fHeaderHeight, x0 + fTileWidth - 1, y0 + fHeaderHeight + fTileHeight -1));
|
|
+ UnlockLooper();
|
|
+ }
|
|
+}
|
|
+
|
|
+bool BochsView::PaletteChange(uint32 index, uint32 red, uint32 green, uint32 blue)
|
|
+{
|
|
+ if (LockLooper())
|
|
+ {
|
|
+ fColorMap[index] = fScreen.IndexForColor(red, green, blue);
|
|
+ UnlockLooper();
|
|
+ }
|
|
+ return true;
|
|
+}
|
|
+
|
|
+void BochsView::DimensionUpdate(uint32 x, uint32 y)
|
|
+{
|
|
+ if (LockLooper())
|
|
+ {
|
|
+ BRect rect(Bounds().OffsetToSelf(0, 0));
|
|
+ if (x != (uint32)rect.IntegerWidth() || y + fHeaderHeight != (uint32)rect.IntegerHeight())
|
|
+ {
|
|
+ Window()->ResizeTo(x, y + fHeaderHeight);
|
|
+ delete fBackBitmap;
|
|
+ rect.Set(0, 0, x, y + fHeaderHeight);
|
|
+ fBackBitmap = new BBitmap(rect, B_BITMAP_ACCEPTS_VIEWS, B_CMAP8);
|
|
+ fBackView = new BView(rect,"BackView", B_FOLLOW_NONE, B_WILL_DRAW);
|
|
+ fBackBitmap->AddChild(fBackView);
|
|
+ ShowHeaderbar();
|
|
+ }
|
|
+ UnlockLooper();
|
|
+ }
|
|
+}
|
|
+
|
|
+void BochsView::HandleEnableMouse(bool enable)
|
|
+{
|
|
+ if (LockLooper())
|
|
+ {
|
|
+ fMouseEnabled = enable;
|
|
+ if (Window()->IsActive()) CaptureInput();
|
|
+ UnlockLooper();
|
|
+ }
|
|
+}
|
|
+
|
|
+uint32 BochsView::CreateBitmap(const uchar *bmap, uint32 xdim, uint32 ydim)
|
|
+{
|
|
+ if (LockLooper())
|
|
+ {
|
|
+ if (fBitmapCount >= BX_MAX_PIXMAPS)
|
|
+ {
|
|
+ BX_PANIC(("beos: too many pixmaps, increase BX_MAX_PIXMAPS"));
|
|
+ }
|
|
+
|
|
+ uint32 bmpIndex = fBitmapCount++;
|
|
+
|
|
+ fBitmaps[bmpIndex].bmap =
|
|
+ new BBitmap(BRect(0, 0, xdim-1, ydim-1), B_MONOCHROME_1_BIT);
|
|
+ if (!fBitmaps[bmpIndex].bmap)
|
|
+ {
|
|
+ BX_PANIC(("beos: could not create bitmap"));
|
|
+ }
|
|
+
|
|
+ int32 bitsLength = fBitmaps[bmpIndex].bmap->BitsLength();
|
|
+ uchar *bits = (uchar *) fBitmaps[bmpIndex].bmap->Bits();
|
|
+ for (int32 i = 0; i < bitsLength; i++)
|
|
+ {
|
|
+ bits[i] = ReverseBitorder(bmap[i]);
|
|
+ }
|
|
+
|
|
+ fBitmaps[bmpIndex].xdim = xdim;
|
|
+ fBitmaps[bmpIndex].ydim = ydim;
|
|
+ UnlockLooper();
|
|
+ return bmpIndex;
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+uint32 BochsView::HeaderbarBitmap(uint32 bmap_id, uint32 alignment, void (*f)(void))
|
|
+{
|
|
+ if (LockLooper())
|
|
+ {
|
|
+ if ( (fHeaderEntryCount + 1) > BX_MAX_HEADERBAR_ENTRIES )
|
|
+ BX_PANIC(("beos: too many headerbar entries, increase BX_MAX_HEADERBAR_ENTRIES"));
|
|
+
|
|
+
|
|
+ uint32 hbIndex = fHeaderEntryCount++;
|
|
+
|
|
+ fHeaderEntries[hbIndex].bitmap = fBitmaps[bmap_id].bmap;
|
|
+ fHeaderEntries[hbIndex].xdim = fBitmaps[bmap_id].xdim;
|
|
+ fHeaderEntries[hbIndex].ydim = fBitmaps[bmap_id].ydim;
|
|
+ fHeaderEntries[hbIndex].alignment = alignment;
|
|
+ fHeaderEntries[hbIndex].f = f;
|
|
+ if (alignment == BX_GRAVITY_LEFT)
|
|
+ {
|
|
+ fHeaderEntries[hbIndex].xorigin = fHeaderLeft;
|
|
+ fHeaderEntries[hbIndex].yorigin = 0;
|
|
+ fHeaderLeft += fBitmaps[bmap_id].xdim;
|
|
+ }
|
|
+ else // BX_GRAVITY_RIGHT
|
|
+ {
|
|
+ fHeaderRight += fBitmaps[bmap_id].xdim;
|
|
+ fHeaderEntries[hbIndex].xorigin = fHeaderRight;
|
|
+ fHeaderEntries[hbIndex].yorigin = 0;
|
|
+ }
|
|
+ UnlockLooper();
|
|
+ return(hbIndex);
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+void BochsView::ReplaceBitmap(uint32 hbar_id, uint32 bmap_id)
|
|
+{
|
|
+ if (LockLooper() && fBackBitmap->Lock())
|
|
+ {
|
|
+ uint32 xorigin;
|
|
+
|
|
+ fHeaderEntries[hbar_id].bitmap = fBitmaps[bmap_id].bmap;
|
|
+
|
|
+ if (fHeaderEntries[hbar_id].alignment == BX_GRAVITY_LEFT)
|
|
+ xorigin = fHeaderEntries[hbar_id].xorigin;
|
|
+ else
|
|
+ xorigin = Bounds().IntegerWidth() - fHeaderEntries[hbar_id].xorigin;
|
|
+ fBackView->SetLowColor(0, 0, 0);
|
|
+ fBackView->SetHighColor(0, 100, 0);
|
|
+ fBackView->DrawBitmapAsync(fHeaderEntries[hbar_id].bitmap, BPoint(xorigin, 0));
|
|
+ fBackBitmap->Unlock();
|
|
+ Invalidate(fHeaderEntries[hbar_id].bitmap->Bounds().OffsetToSelf(xorigin, 0));
|
|
+ UnlockLooper();
|
|
+ }
|
|
}
|
|
|
|
- void
|
|
-BochsView::set_headerbar_colors(void)
|
|
+void BochsView::ShowHeaderbar()
|
|
{
|
|
- aView->SetHighColor(0, 0, 0);
|
|
- aView->SetLowColor(255, 255, 255);
|
|
+ if (LockLooper() && fBackBitmap->Lock())
|
|
+ {
|
|
+ uint32 xorigin;
|
|
+ fBackView->SetLowColor(0, 0, 0);
|
|
+ fBackView->SetHighColor(0, 100, 0);
|
|
+ BRect rect(Bounds());
|
|
+ rect.bottom = rect.top + fHeaderHeight - 1;
|
|
+ fBackView->FillRect(rect, B_SOLID_LOW);
|
|
+ for (unsigned i = 0; i < fHeaderEntryCount; i++)
|
|
+ {
|
|
+ if (fHeaderEntries[i].alignment == BX_GRAVITY_LEFT)
|
|
+ xorigin = fHeaderEntries[i].xorigin;
|
|
+ else
|
|
+ xorigin = rect.IntegerWidth() - fHeaderEntries[i].xorigin;
|
|
+ fBackView->DrawBitmapAsync( fHeaderEntries[i].bitmap, BPoint(xorigin, 0) );
|
|
+ }
|
|
+ fBackBitmap->Unlock();
|
|
+ Invalidate(rect);
|
|
+ UnlockLooper();
|
|
+ }
|
|
}
|
|
|
|
-void BochsView::AttachedToWindow()
|
|
+void BochsView::ShowCursor(bool show)
|
|
{
|
|
- BFont font(be_fixed_font);
|
|
-
|
|
- aWindow->Lock();
|
|
- font.SetSize(16);
|
|
- font.SetFlags(B_DISABLE_ANTIALIASING);
|
|
- aView->SetFont(&font);
|
|
-
|
|
- aView->MakeFocus(true);
|
|
- aWindow->Unlock();
|
|
-
|
|
- view_attached = 1;
|
|
+ if (fBackBitmap->Lock())
|
|
+ {
|
|
+ fCursorVisible = show;
|
|
+ BRect rect;
|
|
+ if (show)
|
|
+ {
|
|
+ BPoint point(fCursorX * 8, fHeaderHeight + fCursorY * 16 + 14);
|
|
+ rect.Set(point.x, point.y, point.x + 7, point.y + 1);
|
|
+ fBackView->SetHighColor(fScreen.ColorForIndex(fColorMap[fCursorValue[1] & 0x0F]));
|
|
+ fBackView->FillRect(rect, B_SOLID_HIGH);
|
|
+ Invalidate(rect);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ BPoint point(fCursorX * 8, fHeaderHeight + fCursorY * 16);
|
|
+ rect.Set(point.x, point.y, point.x + 7, point.y + 15);
|
|
+ fBackView->SetHighColor(fScreen.ColorForIndex(fColorMap[fCursorValue[1] & 0x0F]));
|
|
+ fBackView->SetLowColor(fScreen.ColorForIndex(fColorMap[fCursorValue[1] >> 4]));
|
|
+ fBackView->DrawBitmapAsync(fVgafont[fCursorValue[0]], point);
|
|
+ }
|
|
+ Invalidate(rect);
|
|
+ fBackBitmap->Unlock();
|
|
+ }
|
|
}
|
|
|
|
-void BochsView::MouseDown(BPoint point)
|
|
+uchar BochsView::ReverseBitorder(uchar b)
|
|
{
|
|
- UNUSED(point);
|
|
- if (point.y < BX_HEADER_BAR_Y) {
|
|
- headerbar_click(int(point.x), int(point.y));
|
|
- return;
|
|
- }
|
|
- BX_DEBUG(("mousedown()"));
|
|
+ uchar ret=0;
|
|
+ for (uint32 i=0; i<8; i++)
|
|
+ {
|
|
+ ret |= (b & 0x01) << (7-i);
|
|
+ b >>= 1;
|
|
+ }
|
|
+ return ret;
|
|
}
|
|
|
|
-void BochsView::MouseUp(BPoint point)
|
|
+void BochsView::release_mouse()
|
|
{
|
|
- UNUSED(point);
|
|
- // currently a place holder function
|
|
- BX_DEBUG(( "mouseup()" ));
|
|
- BView::MouseUp(point);
|
|
+ bx_options.Omouse_enabled->set(false);
|
|
}
|
|
|
|
-void BochsView::MouseMoved(BPoint point,
|
|
- uint32 transit, const BMessage *message)
|
|
-{
|
|
- UNUSED(point);
|
|
- UNUSED(transit);
|
|
- UNUSED(message);
|
|
- BX_DEBUG(( "mousemoved()" ));
|
|
-}
|
|
+// ========== class ModifierFilter definitions ==========
|
|
|
|
-void BochsView::KeyDown(const char *bytes, int32 numBytes)
|
|
+ModifierFilter::ModifierFilter(BHandler *target):
|
|
+ BMessageFilter(B_MODIFIERS_CHANGED),
|
|
+ fTarget(target)
|
|
{
|
|
- BMessage *msg;
|
|
- //int32 key;
|
|
- int32 modifiers;
|
|
-
|
|
- uint8 byte;
|
|
-
|
|
- msg = Window()->CurrentMessage();
|
|
- if ( !msg ) {
|
|
- BX_DEBUG(( "keydown() msg NULL" ));
|
|
- return;
|
|
- }
|
|
- modifiers = msg->FindInt32("modifiers");
|
|
-#if 0
|
|
- B_SHIFT_KEY = 0x00000001,
|
|
- B_COMMAND_KEY = 0x00000002,
|
|
- B_CONTROL_KEY = 0x00000004,
|
|
- B_CAPS_LOCK = 0x00000008,
|
|
- B_SCROLL_LOCK = 0x00000010,
|
|
- B_NUM_LOCK = 0x00000020,
|
|
- B_OPTION_KEY = 0x00000040,
|
|
- B_MENU_KEY = 0x00000080,
|
|
- B_LEFT_SHIFT_KEY = 0x00000100,
|
|
- B_RIGHT_SHIFT_KEY = 0x00000200,
|
|
- B_LEFT_COMMAND_KEY = 0x00000400,
|
|
- B_RIGHT_COMMAND_KEY = 0x00000800,
|
|
- B_LEFT_CONTROL_KEY = 0x00001000,
|
|
- B_RIGHT_CONTROL_KEY = 0x00002000,
|
|
- B_LEFT_OPTION_KEY = 0x00004000,
|
|
- B_RIGHT_OPTION_KEY = 0x00008000
|
|
-#endif
|
|
-//if (modifiers) {
|
|
-// fprintf(stderr, "# modifiers = %08x\n", (unsigned) modifiers);
|
|
-// }
|
|
-
|
|
- if (numBytes == 1) {
|
|
- //fprintf(stderr, "# down: char %02xh\n", (unsigned) bytes[0]);
|
|
- byte = bytes[0];
|
|
- if ( byte == 0x00 ) {
|
|
- // Ctrl-Space
|
|
- enq_key_event(BX_KEY_CTRL_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_SPACE, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_SPACE, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_CTRL_L, BX_KEY_RELEASED);
|
|
- return;
|
|
- }
|
|
- if ( byte == 0x1b ) {
|
|
- // Esc
|
|
- if (modifiers & B_CONTROL_KEY)
|
|
- enq_key_event(BX_KEY_CTRL_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_ESC, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_ESC, BX_KEY_RELEASED);
|
|
- if (modifiers & B_CONTROL_KEY)
|
|
- enq_key_event(BX_KEY_CTRL_L, BX_KEY_RELEASED);
|
|
- return;
|
|
- }
|
|
- if ( (byte >= 0x30) && (byte <= 0x39) ) {
|
|
- // 0 .. 9
|
|
- byte -= 0x30;
|
|
- enq_key_event(BX_KEY_0 + byte, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_0 + byte, BX_KEY_RELEASED);
|
|
- return;
|
|
- }
|
|
- if ( (byte >= 0x41) && (byte <= 0x5A) ) {
|
|
- // A .. Z
|
|
- byte -= 0x41;
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_A + byte, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_A + byte, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- return;
|
|
- }
|
|
- if ( (byte >= 0x61) && (byte <= 0x7A) ) {
|
|
- // a .. z
|
|
- byte -= 0x61;
|
|
- enq_key_event(BX_KEY_A + byte, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_A + byte, BX_KEY_RELEASED);
|
|
- return;
|
|
- }
|
|
- switch (byte) {
|
|
- case 0x20: // Space
|
|
- enq_key_event(BX_KEY_SPACE, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_SPACE, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x21: // Exclamation Point
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_1, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_1, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x22: // Double Quotes
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_SINGLE_QUOTE, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_SINGLE_QUOTE, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x23: // Pound Sign
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_3, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_3, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x24: // Dollar Sign
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_4, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_4, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x25: // Percent
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_5, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_5, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x26: // Ampersand
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_7, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_7, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x27: // Single Quote
|
|
- enq_key_event(BX_KEY_SINGLE_QUOTE, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_SINGLE_QUOTE, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x28: // Left Paren
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_9, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_9, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x29: // Right Paren
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_0, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_0, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x2a: // Multiply
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_8, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_8, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x2b: // Add
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_EQUALS, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_EQUALS, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x2c: // Comma
|
|
- enq_key_event(BX_KEY_COMMA, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_COMMA, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x2d: // Minus
|
|
- enq_key_event(BX_KEY_MINUS, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_MINUS, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x2e: // Period
|
|
- enq_key_event(BX_KEY_PERIOD, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_PERIOD, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x2f: // Slash
|
|
- enq_key_event(BX_KEY_SLASH, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_SLASH, BX_KEY_RELEASED);
|
|
- break;
|
|
-
|
|
- case 0x3a: // Colon
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_SEMICOLON, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_SEMICOLON, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x3b: // Semi-Colon
|
|
- enq_key_event(BX_KEY_SEMICOLON, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_SEMICOLON, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x3c: // Less Than
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_COMMA, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_COMMA, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x3d: // Equals
|
|
- enq_key_event(BX_KEY_EQUALS, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_EQUALS, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x3e: // Greater Than
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_PERIOD, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_PERIOD, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x3f: // Question Mark
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_SLASH, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_SLASH, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x40: // At Sign
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_2, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_2, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
-
|
|
- case 0x5b: // Left Bracket
|
|
- enq_key_event(BX_KEY_LEFT_BRACKET, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_LEFT_BRACKET, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x5c: // Back Slash
|
|
- enq_key_event(BX_KEY_BACKSLASH, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_BACKSLASH, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x5d: // Right Bracket
|
|
- enq_key_event(BX_KEY_RIGHT_BRACKET, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_RIGHT_BRACKET, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x5e: // Caret
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_6, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_6, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x5f: // Underscore
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_MINUS, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_MINUS, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x60: // Grave Accent
|
|
- enq_key_event(BX_KEY_GRAVE, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_GRAVE, BX_KEY_RELEASED);
|
|
- break;
|
|
-
|
|
- case 0x7b: // Left Brace
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_LEFT_BRACKET, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_LEFT_BRACKET, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x7c: // Verticle Bar
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_BACKSLASH, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_BACKSLASH, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x7d: // Right Brace
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_RIGHT_BRACKET, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_RIGHT_BRACKET, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
- case 0x7e: // Tilde
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_GRAVE, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_GRAVE, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_SHIFT_L, BX_KEY_RELEASED);
|
|
- break;
|
|
-
|
|
- case B_BACKSPACE:
|
|
- enq_key_event(BX_KEY_BACKSPACE, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_BACKSPACE, BX_KEY_RELEASED);
|
|
- break;
|
|
- case B_ENTER: //case B_RETURN:
|
|
- enq_key_event(BX_KEY_ENTER, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_ENTER, BX_KEY_RELEASED);
|
|
- break;
|
|
- case B_TAB:
|
|
- enq_key_event(BX_KEY_TAB, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_TAB, BX_KEY_RELEASED);
|
|
- break;
|
|
- case B_LEFT_ARROW:
|
|
- enq_key_event(BX_KEY_LEFT, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_LEFT, BX_KEY_RELEASED);
|
|
- break;
|
|
- case B_RIGHT_ARROW:
|
|
- enq_key_event(BX_KEY_RIGHT, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_RIGHT, BX_KEY_RELEASED);
|
|
- break;
|
|
- case B_UP_ARROW:
|
|
- enq_key_event(BX_KEY_UP, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_UP, BX_KEY_RELEASED);
|
|
- break;
|
|
- case B_DOWN_ARROW:
|
|
- enq_key_event(BX_KEY_DOWN, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_DOWN, BX_KEY_RELEASED);
|
|
- break;
|
|
-#if 0
|
|
- case B_FUNCTION_KEY: break;
|
|
- msg->FindInt32("key", &key);
|
|
- switch ( key ) {
|
|
- case B_F1_KEY: break;
|
|
- case B_F2_KEY: break;
|
|
- case B_F3_KEY: break;
|
|
- case B_F4_KEY: break;
|
|
- case B_F5_KEY: break;
|
|
- case B_F6_KEY: break;
|
|
- case B_F7_KEY: break;
|
|
- case B_F8_KEY: break;
|
|
- case B_F9_KEY: break;
|
|
- case B_F10_KEY: break;
|
|
- case B_F11_KEY: break;
|
|
- case B_F12_KEY: break;
|
|
- case B_PRINT_KEY: break;
|
|
- case B_SCROLL_KEY: break;
|
|
- case B_PAUSE_KEY: break;
|
|
- default:
|
|
- fprintf(stderr, "# keydown() unknown function key %08xh\n",
|
|
- (unsigned) key);
|
|
- }
|
|
-#endif
|
|
- case B_INSERT: break;
|
|
- enq_key_event(BX_KEY_INSERT, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_INSERT, BX_KEY_RELEASED);
|
|
- break;
|
|
- case B_DELETE: break;
|
|
- enq_key_event(BX_KEY_DELETE, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_DELETE, BX_KEY_RELEASED);
|
|
- break;
|
|
- case B_HOME: break;
|
|
- enq_key_event(BX_KEY_HOME, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_HOME, BX_KEY_RELEASED);
|
|
- break;
|
|
- case B_END: break;
|
|
- enq_key_event(BX_KEY_END, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_END, BX_KEY_RELEASED);
|
|
- break;
|
|
- case B_PAGE_UP: break;
|
|
- enq_key_event(BX_KEY_PAGE_UP, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_PAGE_UP, BX_KEY_RELEASED);
|
|
- break;
|
|
- case B_PAGE_DOWN: break;
|
|
- enq_key_event(BX_KEY_PAGE_DOWN, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_PAGE_DOWN, BX_KEY_RELEASED);
|
|
- break;
|
|
-
|
|
- default:
|
|
- if ( (byte >= 0x01) && (byte <= 0x1a) ) {
|
|
- // If the above keys dont catch this case, synthesize a
|
|
- // Ctrl-A .. Ctrl-Z event
|
|
- byte -= 1;
|
|
- enq_key_event(BX_KEY_CTRL_L, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_A + byte, BX_KEY_PRESSED);
|
|
- enq_key_event(BX_KEY_A + byte, BX_KEY_RELEASED);
|
|
- enq_key_event(BX_KEY_CTRL_L, BX_KEY_RELEASED);
|
|
- return;
|
|
- }
|
|
- fprintf(stderr, "# keydown: char %02xh unhandled\n",
|
|
- (unsigned) bytes[0]);
|
|
- return;
|
|
- }
|
|
- return;
|
|
- }
|
|
- else {
|
|
- // ignore for now
|
|
- fprintf(stderr, "# keydown() ignoring multibyte key\n");
|
|
- }
|
|
-}
|
|
-
|
|
-void BochsView::KeyUp(const char *bytes, int32 numBytes)
|
|
-{
|
|
- UNUSED(bytes);
|
|
- UNUSED(numBytes);
|
|
-}
|
|
|
|
-void BochsView::Draw(BRect rect)
|
|
-{
|
|
- DrawBitmapAsync(backing_store, rect, rect);
|
|
}
|
|
|
|
-BochsView::~BochsView()
|
|
+filter_result ModifierFilter::Filter(BMessage *msg, BHandler **target)
|
|
{
|
|
- delete backing_store;
|
|
- delete backing_view;
|
|
+ *target = fTarget;
|
|
+ return B_DISPATCH_MESSAGE;
|
|
}
|
|
|
|
-void
|
|
-BochsView::SetFont(const BFont *font, uint32 mask)
|
|
+void CaptureTarget::MessageReceived(BMessage *msg)
|
|
{
|
|
- backing_store->Lock();
|
|
- backing_view->SetFont(font,mask);
|
|
- backing_store->Unlock();
|
|
+ if (fMyTarget->LockLooper())
|
|
+ {
|
|
+ fMyTarget->GotCapturedInput(msg);
|
|
+ fMyTarget->UnlockLooper();
|
|
+ }
|
|
}
|
|
|
|
-void
|
|
-BochsView::SetHighColor(uchar r, uchar g, uchar b, uchar a)
|
|
-{
|
|
- backing_store->Lock();
|
|
- backing_view->SetHighColor(r,g,b,a);
|
|
- backing_store->Unlock();
|
|
-}
|
|
+// ========== class bx_gui_c definitions ==========
|
|
|
|
-void
|
|
-BochsView::SetLowColor(uchar r, uchar g, uchar b, uchar a)
|
|
+void bx_gui_c::specific_init(bx_gui_c *th, int argc, char **argv,
|
|
+ unsigned tilewidth, unsigned tileheight,
|
|
+ unsigned header_bar_y)
|
|
{
|
|
- backing_store->Lock();
|
|
- backing_view->SetLowColor(r,g,b,a);
|
|
- backing_store->Unlock();
|
|
+ BX_DEBUG(("init"));
|
|
+ bApp = new BochsApplication(th, argc, argv, tilewidth, tileheight, header_bar_y, power_handler);
|
|
+ be_app->Unlock();
|
|
+ thread_id appThread = spawn_thread(BochsApplication::runme, "App thread", B_NORMAL_PRIORITY, NULL);
|
|
+ resume_thread(appThread);
|
|
}
|
|
|
|
-void
|
|
-BochsView::DrawBitmap(const BBitmap *aBitmap, BPoint where)
|
|
+void bx_gui_c::handle_events(void)
|
|
{
|
|
- backing_store->Lock();
|
|
- backing_view->DrawBitmap(aBitmap,where);
|
|
- backing_store->Unlock();
|
|
- BRect r = aBitmap->Bounds();
|
|
- r.OffsetBy(where);
|
|
- Invalidate(r);
|
|
+ bView->HandleEvents();
|
|
}
|
|
|
|
-void
|
|
-BochsView::FillRect(BRect r, pattern p)
|
|
+void bx_gui_c::flush(void)
|
|
{
|
|
- backing_store->Lock();
|
|
- backing_view->FillRect(r,p);
|
|
- backing_store->Unlock();
|
|
- Invalidate(r);
|
|
+ BX_DEBUG(("flush"));
|
|
+ if (!bView)
|
|
+ {
|
|
+ BX_DEBUG(("flush called before init"));
|
|
+ return;
|
|
+ }
|
|
+ bView->Flush();
|
|
}
|
|
|
|
-
|
|
-
|
|
- void
|
|
-enq_key_event(Bit32u key, Bit32u press_release)
|
|
+void bx_gui_c::clear_screen(void)
|
|
{
|
|
- if ( ((tail+1) % SCANCODE_BUFSIZE) == head ) {
|
|
- fprintf(stderr, "# enq_key_event: buffer full\n");
|
|
- return;
|
|
- }
|
|
- keyevents[tail] = key | press_release;
|
|
- tail = (tail + 1) % SCANCODE_BUFSIZE;
|
|
+ BX_DEBUG(("clear_screen"));
|
|
+ bView->ClearScreen();
|
|
}
|
|
|
|
- Bit32u
|
|
-deq_key_event(void)
|
|
+void bx_gui_c::text_update(Bit8u *old_text, Bit8u *new_text,
|
|
+ unsigned long cursor_x, unsigned long cursor_y,
|
|
+ unsigned nrows)
|
|
{
|
|
- Bit32u key;
|
|
-
|
|
- if ( head == tail ) {
|
|
- fprintf(stderr, "# deq_key_event: buffer empty\n");
|
|
- return(0);
|
|
- }
|
|
- key = keyevents[head];
|
|
- head = (head + 1) % SCANCODE_BUFSIZE;
|
|
- return(key);
|
|
+ BX_DEBUG(("text_update"));
|
|
+ bView->TextUpdate(old_text, new_text, cursor_x, cursor_y, nrows);
|
|
}
|
|
|
|
- unsigned char
|
|
-reverse_bitorder(unsigned char b)
|
|
+void bx_gui_c::graphics_tile_update(Bit8u *tile, unsigned x0, unsigned y0)
|
|
{
|
|
- unsigned char ret=0;
|
|
- for (unsigned i=0; i<8; i++) {
|
|
- ret |= (b & 0x01) << (7-i);
|
|
- b >>= 1;
|
|
- }
|
|
- return(ret);
|
|
+ //fprintf(stderr, "# gui: graphics_update\n");
|
|
+ bView->GraphicsTileUpdate(tile, x0, y0);
|
|
}
|
|
|
|
- unsigned
|
|
-bx_gui_c::create_bitmap(const unsigned char *bmap,
|
|
- unsigned xdim, unsigned ydim)
|
|
+Boolean bx_gui_c::palette_change(unsigned index, unsigned red, unsigned green, unsigned blue)
|
|
{
|
|
- BRect rect(0.0, 0.0, xdim-1, ydim-1);
|
|
- int32 bitslength;
|
|
- //int32 bytesperrow;
|
|
- unsigned char *data;
|
|
-
|
|
- if (bx_bitmap_entries >= BX_MAX_PIXMAPS) {
|
|
- BX_PANIC(("beos: too many pixmaps, increase BX_MAX_PIXMAPS"));
|
|
- }
|
|
-
|
|
- bx_bitmaps[bx_bitmap_entries].bmap =
|
|
- new BBitmap(rect, B_MONOCHROME_1_BIT);
|
|
-
|
|
- bitslength = bx_bitmaps[bx_bitmap_entries].bmap->BitsLength();
|
|
- //bytesperrow = bx_bitmaps[bx_bitmap_entries].bmap->BytesPerRow();
|
|
- data = (unsigned char *) bx_bitmaps[bx_bitmap_entries].bmap->Bits();
|
|
- for (int32 i=0; i<bitslength; i++) {
|
|
- data[i] = reverse_bitorder(bmap[i]);
|
|
- }
|
|
-
|
|
- bx_bitmaps[bx_bitmap_entries].xdim = xdim;
|
|
- bx_bitmaps[bx_bitmap_entries].ydim = ydim;
|
|
- if (!bx_bitmaps[bx_bitmap_entries].bmap) {
|
|
- BX_PANIC(("beos: could not create bitmap"));
|
|
- }
|
|
- bx_bitmap_entries++;
|
|
- return(bx_bitmap_entries-1); // return index as handle
|
|
+ BX_DEBUG(("palette_change"));
|
|
+ return bView->PaletteChange(index, red, green, blue);
|
|
}
|
|
|
|
- unsigned
|
|
-bx_gui_c::headerbar_bitmap(unsigned bmap_id, unsigned alignment,
|
|
- void (*f)(void))
|
|
+void bx_gui_c::dimension_update(unsigned x, unsigned y)
|
|
{
|
|
- unsigned hb_index;
|
|
-
|
|
- if ( (bx_headerbar_entries+1) > BX_MAX_HEADERBAR_ENTRIES )
|
|
- BX_PANIC(("beos: too many headerbar entries, increase BX_MAX_HEADERBAR_ENTRIES"));
|
|
-
|
|
- bx_headerbar_entries++;
|
|
- hb_index = bx_headerbar_entries - 1;
|
|
-
|
|
- bx_headerbar_entry[hb_index].bitmap = bx_bitmaps[bmap_id].bmap;
|
|
- bx_headerbar_entry[hb_index].xdim = bx_bitmaps[bmap_id].xdim;
|
|
- bx_headerbar_entry[hb_index].ydim = bx_bitmaps[bmap_id].ydim;
|
|
- bx_headerbar_entry[hb_index].alignment = alignment;
|
|
- bx_headerbar_entry[hb_index].f = f;
|
|
- if (alignment == BX_GRAVITY_LEFT) {
|
|
- bx_headerbar_entry[hb_index].xorigin = bx_bitmap_left_xorigin;
|
|
- bx_headerbar_entry[hb_index].yorigin = 0;
|
|
- bx_bitmap_left_xorigin += bx_bitmaps[bmap_id].xdim;
|
|
- }
|
|
- else { // BX_GRAVITY_RIGHT
|
|
- bx_bitmap_right_xorigin += bx_bitmaps[bmap_id].xdim;
|
|
- bx_headerbar_entry[hb_index].xorigin = bx_bitmap_right_xorigin;
|
|
- bx_headerbar_entry[hb_index].yorigin = 0;
|
|
- }
|
|
- return(hb_index);
|
|
+ //fprintf(stderr, "dimension_update %d x %d\n", x, y);
|
|
+ bView->DimensionUpdate(x, y);
|
|
}
|
|
|
|
- void
|
|
-bx_gui_c::replace_bitmap(unsigned hbar_id, unsigned bmap_id)
|
|
+void bx_gui_c::exit(void)
|
|
{
|
|
- unsigned xorigin;
|
|
-
|
|
- bx_headerbar_entry[hbar_id].bitmap = bx_bitmaps[bmap_id].bmap;
|
|
-
|
|
- if (bx_headerbar_entry[hbar_id].alignment == BX_GRAVITY_LEFT)
|
|
- xorigin = bx_headerbar_entry[hbar_id].xorigin;
|
|
- else
|
|
- xorigin = dimension_x - bx_headerbar_entry[hbar_id].xorigin;
|
|
- aWindow->Lock();
|
|
- aView->set_headerbar_colors();
|
|
- aView->DrawBitmap(bx_headerbar_entry[hbar_id].bitmap, BPoint(xorigin, 0));
|
|
- aView->set_text_colors();
|
|
- aWindow->Unlock();
|
|
+ BX_DEBUG(("exit"));
|
|
+ bApp->BxExit();
|
|
}
|
|
|
|
- void
|
|
-bx_gui_c::show_headerbar(void)
|
|
+void bx_gui_c::mouse_enabled_changed_specific(Boolean val)
|
|
{
|
|
- unsigned xorigin;
|
|
- BPoint origin;
|
|
-
|
|
- // clear header bar area to white
|
|
-
|
|
- aWindow->Lock();
|
|
- aView->set_headerbar_colors();
|
|
- aView->FillRect(BRect(0, 0, dimension_x-1, bx_headerbar_y-1), B_SOLID_LOW);
|
|
- for (unsigned i=0; i<bx_headerbar_entries; i++) {
|
|
- if (bx_headerbar_entry[i].alignment == BX_GRAVITY_LEFT)
|
|
- xorigin = bx_headerbar_entry[i].xorigin;
|
|
- else
|
|
- xorigin = dimension_x - bx_headerbar_entry[i].xorigin;
|
|
- origin.Set(xorigin, 0);
|
|
- aView->DrawBitmap( bx_headerbar_entry[i].bitmap, origin );
|
|
- }
|
|
- aView->set_text_colors();
|
|
- aWindow->Unlock();
|
|
+ //fprintf(stderr, "mouse_enabled_changed to %s\n", val ? "enabled" : "disabled");
|
|
+ bView->HandleEnableMouse(val);
|
|
}
|
|
-
|
|
|
|
- void
|
|
-headerbar_click(int x, int y)
|
|
+unsigned bx_gui_c::create_bitmap(const unsigned char *bmap,
|
|
+ unsigned xdim, unsigned ydim)
|
|
{
|
|
- int xorigin;
|
|
-
|
|
- // assuming y is in bounds
|
|
- UNUSED(y);
|
|
- for (unsigned i=0; i<bx_headerbar_entries; i++) {
|
|
- if (bx_headerbar_entry[i].alignment == BX_GRAVITY_LEFT)
|
|
- xorigin = bx_headerbar_entry[i].xorigin;
|
|
- else
|
|
- xorigin = dimension_x - bx_headerbar_entry[i].xorigin;
|
|
- if ( (x>=xorigin) && (x<(xorigin+int(bx_headerbar_entry[i].xdim))) ) {
|
|
- bx_headerbar_entry[i].f();
|
|
- return;
|
|
- }
|
|
- }
|
|
+ BX_DEBUG(("create_bitmap"));
|
|
+ return bView->CreateBitmap(bmap, xdim, ydim);
|
|
}
|
|
|
|
-
|
|
- void
|
|
-create_vga_font(void)
|
|
+unsigned bx_gui_c::headerbar_bitmap(unsigned bmap_id, unsigned alignment, void (*f)(void))
|
|
{
|
|
- int32 bitslength;
|
|
- int32 bytesperrow;
|
|
- unsigned char *data;
|
|
- BRect brect(0,0, 7,15);
|
|
-
|
|
- BX_INFO(( "BeOS: creating VGA font from bitmaps" ));
|
|
-
|
|
- // VGA font is 8wide x 16high
|
|
- for (unsigned c=0; c<256; c++) {
|
|
- vgafont[c] = new BBitmap(brect, B_MONOCHROME_1_BIT);
|
|
- if (!vgafont[c]) {
|
|
- BX_PANIC(("beos: could not create bitmap"));
|
|
- }
|
|
-
|
|
- bitslength = vgafont[c]->BitsLength();
|
|
- bytesperrow = vgafont[c]->BytesPerRow();
|
|
- data = (unsigned char *) vgafont[c]->Bits();
|
|
- memset(data, 0, bitslength);
|
|
- for (unsigned i=0; i<16; i++) {
|
|
- data[i*bytesperrow] = reverse_bitorder(bx_vgafont[c].data[i]);
|
|
- }
|
|
- }
|
|
+ BX_DEBUG(("headerbar_bitmap"));
|
|
+ return bView->HeaderbarBitmap(bmap_id, alignment, f);
|
|
}
|
|
|
|
-
|
|
- void
|
|
-bx_gui_c::exit(void)
|
|
+void bx_gui_c::replace_bitmap(unsigned hbar_id, unsigned bmap_id)
|
|
{
|
|
- fprintf(stderr, "# WARNING: BEOS: bx_gui_c::exit() not implemented yet.\n");
|
|
+ BX_DEBUG(("replace_bitmap"));
|
|
+ bView->ReplaceBitmap(hbar_id, bmap_id);
|
|
}
|
|
-
|
|
-//IRA=> Start
|
|
-// This is called whenever the mouse_enabled parameter changes. It
|
|
-// can change because of a gui event such as clicking on the mouse-enable
|
|
-// bitmap or pressing the middle button, or from the control panel.
|
|
-// In all those cases, setting the parameter value will get you here.
|
|
|
|
- void
|
|
-bx_gui_c::mouse_enabled_changed_specific (Boolean val)
|
|
+void bx_gui_c::show_headerbar(void)
|
|
{
|
|
- BX_DEBUG (("mouse_enabled=%d, BeOS specific code", val?1:0));
|
|
- if (val) {
|
|
- BX_INFO(("[x] Mouse on"));
|
|
-// mouse_enable_x = current_x;
|
|
-// mouse_enable_y = current_y;
|
|
- be_app->HideCursor();
|
|
- // Move the cursor to a 'safe' place
|
|
-// warp_cursor(warp_home_x-current_x, warp_home_y-current_y);
|
|
- } else {
|
|
- BX_INFO(("[x] Mouse off"));
|
|
- be_app->ShowCursor();
|
|
-// warp_cursor(mouse_enable_x-current_x, mouse_enable_y-current_y);
|
|
- }
|
|
+ BX_DEBUG(("show_headrebar"));
|
|
+ bView->ShowHeaderbar();
|
|
}
|
|
-//IRA=> End
|