Mercurial > sdl-ios-xcode
diff src/video/bwindow/SDL_BWin.h @ 1895:c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 10 Jul 2006 21:04:37 +0000 |
parents | 6162b8d921ce |
children | 99210400e8b9 |
line wrap: on
line diff
--- a/src/video/bwindow/SDL_BWin.h Thu Jul 06 18:01:37 2006 +0000 +++ b/src/video/bwindow/SDL_BWin.h Mon Jul 10 21:04:37 2006 +0000 @@ -38,521 +38,556 @@ #include "SDL_events.h" #include "SDL_BView.h" -extern "C" { +extern "C" +{ #include "../../events/SDL_events_c.h" }; -class SDL_BWin : public BDirectWindow +class SDL_BWin:public BDirectWindow { -public: - SDL_BWin(BRect bounds) : - BDirectWindow(bounds, "Untitled", B_TITLED_WINDOW, 0) { - InitKeyboard(); - last_buttons = 0; + public: + SDL_BWin(BRect bounds):BDirectWindow(bounds, "Untitled", + B_TITLED_WINDOW, 0) + { + InitKeyboard(); + last_buttons = 0; - the_view = NULL; -#if SDL_VIDEO_OPENGL - SDL_GLView = NULL; -#endif - SDL_View = NULL; - Unlock(); - shown = false; - inhibit_resize = false; - } - - virtual ~SDL_BWin() { - Lock(); - if ( the_view ) { + the_view = NULL; #if SDL_VIDEO_OPENGL - if ( the_view == SDL_GLView ) { - SDL_GLView->UnlockGL(); - } + SDL_GLView = NULL; #endif - RemoveChild(the_view); - the_view = NULL; - } - Unlock(); + SDL_View = NULL; + Unlock(); + shown = false; + inhibit_resize = false; + } + + virtual ~ SDL_BWin() + { + Lock(); + if (the_view) { #if SDL_VIDEO_OPENGL - if ( SDL_GLView ) { - delete SDL_GLView; - } + if (the_view == SDL_GLView) { + SDL_GLView->UnlockGL(); + } #endif - if ( SDL_View ) { - delete SDL_View; - } - } - - virtual void InitKeyboard(void) { - for ( uint i=0; i<SDL_TABLESIZE(keymap); ++i ) - keymap[i] = SDLK_UNKNOWN; + RemoveChild(the_view); + the_view = NULL; + } + Unlock(); +#if SDL_VIDEO_OPENGL + if (SDL_GLView) { + delete SDL_GLView; + } +#endif + if (SDL_View) { + delete SDL_View; + } + } + + virtual void InitKeyboard(void) + { + for (uint i = 0; i < SDL_TABLESIZE(keymap); ++i) + keymap[i] = SDLK_UNKNOWN; - keymap[0x01] = SDLK_ESCAPE; - keymap[B_F1_KEY] = SDLK_F1; - keymap[B_F2_KEY] = SDLK_F2; - keymap[B_F3_KEY] = SDLK_F3; - keymap[B_F4_KEY] = SDLK_F4; - keymap[B_F5_KEY] = SDLK_F5; - keymap[B_F6_KEY] = SDLK_F6; - keymap[B_F7_KEY] = SDLK_F7; - keymap[B_F8_KEY] = SDLK_F8; - keymap[B_F9_KEY] = SDLK_F9; - keymap[B_F10_KEY] = SDLK_F10; - keymap[B_F11_KEY] = SDLK_F11; - keymap[B_F12_KEY] = SDLK_F12; - keymap[B_PRINT_KEY] = SDLK_PRINT; - keymap[B_SCROLL_KEY] = SDLK_SCROLLOCK; - keymap[B_PAUSE_KEY] = SDLK_PAUSE; - keymap[0x11] = SDLK_BACKQUOTE; - keymap[0x12] = SDLK_1; - keymap[0x13] = SDLK_2; - keymap[0x14] = SDLK_3; - keymap[0x15] = SDLK_4; - keymap[0x16] = SDLK_5; - keymap[0x17] = SDLK_6; - keymap[0x18] = SDLK_7; - keymap[0x19] = SDLK_8; - keymap[0x1a] = SDLK_9; - keymap[0x1b] = SDLK_0; - keymap[0x1c] = SDLK_MINUS; - keymap[0x1d] = SDLK_EQUALS; - keymap[0x1e] = SDLK_BACKSPACE; - keymap[0x1f] = SDLK_INSERT; - keymap[0x20] = SDLK_HOME; - keymap[0x21] = SDLK_PAGEUP; - keymap[0x22] = SDLK_NUMLOCK; - keymap[0x23] = SDLK_KP_DIVIDE; - keymap[0x24] = SDLK_KP_MULTIPLY; - keymap[0x25] = SDLK_KP_MINUS; - keymap[0x26] = SDLK_TAB; - keymap[0x27] = SDLK_q; - keymap[0x28] = SDLK_w; - keymap[0x29] = SDLK_e; - keymap[0x2a] = SDLK_r; - keymap[0x2b] = SDLK_t; - keymap[0x2c] = SDLK_y; - keymap[0x2d] = SDLK_u; - keymap[0x2e] = SDLK_i; - keymap[0x2f] = SDLK_o; - keymap[0x30] = SDLK_p; - keymap[0x31] = SDLK_LEFTBRACKET; - keymap[0x32] = SDLK_RIGHTBRACKET; - keymap[0x33] = SDLK_BACKSLASH; - keymap[0x34] = SDLK_DELETE; - keymap[0x35] = SDLK_END; - keymap[0x36] = SDLK_PAGEDOWN; - keymap[0x37] = SDLK_KP7; - keymap[0x38] = SDLK_KP8; - keymap[0x39] = SDLK_KP9; - keymap[0x3a] = SDLK_KP_PLUS; - keymap[0x3b] = SDLK_CAPSLOCK; - keymap[0x3c] = SDLK_a; - keymap[0x3d] = SDLK_s; - keymap[0x3e] = SDLK_d; - keymap[0x3f] = SDLK_f; - keymap[0x40] = SDLK_g; - keymap[0x41] = SDLK_h; - keymap[0x42] = SDLK_j; - keymap[0x43] = SDLK_k; - keymap[0x44] = SDLK_l; - keymap[0x45] = SDLK_SEMICOLON; - keymap[0x46] = SDLK_QUOTE; - keymap[0x47] = SDLK_RETURN; - keymap[0x48] = SDLK_KP4; - keymap[0x49] = SDLK_KP5; - keymap[0x4a] = SDLK_KP6; - keymap[0x4b] = SDLK_LSHIFT; - keymap[0x4c] = SDLK_z; - keymap[0x4d] = SDLK_x; - keymap[0x4e] = SDLK_c; - keymap[0x4f] = SDLK_v; - keymap[0x50] = SDLK_b; - keymap[0x51] = SDLK_n; - keymap[0x52] = SDLK_m; - keymap[0x53] = SDLK_COMMA; - keymap[0x54] = SDLK_PERIOD; - keymap[0x55] = SDLK_SLASH; - keymap[0x56] = SDLK_RSHIFT; - keymap[0x57] = SDLK_UP; - keymap[0x58] = SDLK_KP1; - keymap[0x59] = SDLK_KP2; - keymap[0x5a] = SDLK_KP3; - keymap[0x5b] = SDLK_KP_ENTER; - keymap[0x5c] = SDLK_LCTRL; - keymap[0x5d] = SDLK_LALT; - keymap[0x5e] = SDLK_SPACE; - keymap[0x5f] = SDLK_RALT; - keymap[0x60] = SDLK_RCTRL; - keymap[0x61] = SDLK_LEFT; - keymap[0x62] = SDLK_DOWN; - keymap[0x63] = SDLK_RIGHT; - keymap[0x64] = SDLK_KP0; - keymap[0x65] = SDLK_KP_PERIOD; - keymap[0x66] = SDLK_LMETA; - keymap[0x67] = SDLK_RMETA; - keymap[0x68] = SDLK_MENU; - keymap[0x69] = SDLK_EURO; - keymap[0x6a] = SDLK_KP_EQUALS; - keymap[0x6b] = SDLK_POWER; - } + keymap[0x01] = SDLK_ESCAPE; + keymap[B_F1_KEY] = SDLK_F1; + keymap[B_F2_KEY] = SDLK_F2; + keymap[B_F3_KEY] = SDLK_F3; + keymap[B_F4_KEY] = SDLK_F4; + keymap[B_F5_KEY] = SDLK_F5; + keymap[B_F6_KEY] = SDLK_F6; + keymap[B_F7_KEY] = SDLK_F7; + keymap[B_F8_KEY] = SDLK_F8; + keymap[B_F9_KEY] = SDLK_F9; + keymap[B_F10_KEY] = SDLK_F10; + keymap[B_F11_KEY] = SDLK_F11; + keymap[B_F12_KEY] = SDLK_F12; + keymap[B_PRINT_KEY] = SDLK_PRINT; + keymap[B_SCROLL_KEY] = SDLK_SCROLLOCK; + keymap[B_PAUSE_KEY] = SDLK_PAUSE; + keymap[0x11] = SDLK_BACKQUOTE; + keymap[0x12] = SDLK_1; + keymap[0x13] = SDLK_2; + keymap[0x14] = SDLK_3; + keymap[0x15] = SDLK_4; + keymap[0x16] = SDLK_5; + keymap[0x17] = SDLK_6; + keymap[0x18] = SDLK_7; + keymap[0x19] = SDLK_8; + keymap[0x1a] = SDLK_9; + keymap[0x1b] = SDLK_0; + keymap[0x1c] = SDLK_MINUS; + keymap[0x1d] = SDLK_EQUALS; + keymap[0x1e] = SDLK_BACKSPACE; + keymap[0x1f] = SDLK_INSERT; + keymap[0x20] = SDLK_HOME; + keymap[0x21] = SDLK_PAGEUP; + keymap[0x22] = SDLK_NUMLOCK; + keymap[0x23] = SDLK_KP_DIVIDE; + keymap[0x24] = SDLK_KP_MULTIPLY; + keymap[0x25] = SDLK_KP_MINUS; + keymap[0x26] = SDLK_TAB; + keymap[0x27] = SDLK_q; + keymap[0x28] = SDLK_w; + keymap[0x29] = SDLK_e; + keymap[0x2a] = SDLK_r; + keymap[0x2b] = SDLK_t; + keymap[0x2c] = SDLK_y; + keymap[0x2d] = SDLK_u; + keymap[0x2e] = SDLK_i; + keymap[0x2f] = SDLK_o; + keymap[0x30] = SDLK_p; + keymap[0x31] = SDLK_LEFTBRACKET; + keymap[0x32] = SDLK_RIGHTBRACKET; + keymap[0x33] = SDLK_BACKSLASH; + keymap[0x34] = SDLK_DELETE; + keymap[0x35] = SDLK_END; + keymap[0x36] = SDLK_PAGEDOWN; + keymap[0x37] = SDLK_KP7; + keymap[0x38] = SDLK_KP8; + keymap[0x39] = SDLK_KP9; + keymap[0x3a] = SDLK_KP_PLUS; + keymap[0x3b] = SDLK_CAPSLOCK; + keymap[0x3c] = SDLK_a; + keymap[0x3d] = SDLK_s; + keymap[0x3e] = SDLK_d; + keymap[0x3f] = SDLK_f; + keymap[0x40] = SDLK_g; + keymap[0x41] = SDLK_h; + keymap[0x42] = SDLK_j; + keymap[0x43] = SDLK_k; + keymap[0x44] = SDLK_l; + keymap[0x45] = SDLK_SEMICOLON; + keymap[0x46] = SDLK_QUOTE; + keymap[0x47] = SDLK_RETURN; + keymap[0x48] = SDLK_KP4; + keymap[0x49] = SDLK_KP5; + keymap[0x4a] = SDLK_KP6; + keymap[0x4b] = SDLK_LSHIFT; + keymap[0x4c] = SDLK_z; + keymap[0x4d] = SDLK_x; + keymap[0x4e] = SDLK_c; + keymap[0x4f] = SDLK_v; + keymap[0x50] = SDLK_b; + keymap[0x51] = SDLK_n; + keymap[0x52] = SDLK_m; + keymap[0x53] = SDLK_COMMA; + keymap[0x54] = SDLK_PERIOD; + keymap[0x55] = SDLK_SLASH; + keymap[0x56] = SDLK_RSHIFT; + keymap[0x57] = SDLK_UP; + keymap[0x58] = SDLK_KP1; + keymap[0x59] = SDLK_KP2; + keymap[0x5a] = SDLK_KP3; + keymap[0x5b] = SDLK_KP_ENTER; + keymap[0x5c] = SDLK_LCTRL; + keymap[0x5d] = SDLK_LALT; + keymap[0x5e] = SDLK_SPACE; + keymap[0x5f] = SDLK_RALT; + keymap[0x60] = SDLK_RCTRL; + keymap[0x61] = SDLK_LEFT; + keymap[0x62] = SDLK_DOWN; + keymap[0x63] = SDLK_RIGHT; + keymap[0x64] = SDLK_KP0; + keymap[0x65] = SDLK_KP_PERIOD; + keymap[0x66] = SDLK_LMETA; + keymap[0x67] = SDLK_RMETA; + keymap[0x68] = SDLK_MENU; + keymap[0x69] = SDLK_EURO; + keymap[0x6a] = SDLK_KP_EQUALS; + keymap[0x6b] = SDLK_POWER; + } - /* Override the Show() method so we can tell when we've been shown */ - virtual void Show(void) { - BWindow::Show(); - shown = true; - } - virtual bool Shown(void) { - return (shown); - } - /* If called, the next resize event will not be forwarded to SDL. */ - virtual void InhibitResize(void) { - inhibit_resize=true; - } - /* Handle resizing of the window */ - virtual void FrameResized(float width, float height) { - if(inhibit_resize) - inhibit_resize = false; - else - SDL_PrivateResize((int)width, (int)height); - } - virtual int CreateView(Uint32 flags, Uint32 gl_flags) { - int retval; + /* Override the Show() method so we can tell when we've been shown */ + virtual void Show(void) + { + BWindow::Show(); + shown = true; + } + virtual bool Shown(void) + { + return (shown); + } + /* If called, the next resize event will not be forwarded to SDL. */ + virtual void InhibitResize(void) + { + inhibit_resize = true; + } + /* Handle resizing of the window */ + virtual void FrameResized(float width, float height) + { + if (inhibit_resize) + inhibit_resize = false; + else + SDL_PrivateResize((int) width, (int) height); + } + virtual int CreateView(Uint32 flags, Uint32 gl_flags) + { + int retval; - retval = 0; - Lock(); - if ( flags & SDL_OPENGL ) { + retval = 0; + Lock(); + if (flags & SDL_INTERNALOPENGL) { #if SDL_VIDEO_OPENGL - if ( SDL_GLView == NULL ) { - SDL_GLView = new BGLView(Bounds(), "SDL GLView", - B_FOLLOW_ALL_SIDES, (B_WILL_DRAW|B_FRAME_EVENTS), - gl_flags); - } - if ( the_view != SDL_GLView ) { - if ( the_view ) { - RemoveChild(the_view); - } - AddChild(SDL_GLView); - SDL_GLView->LockGL(); - the_view = SDL_GLView; - } + if (SDL_GLView == NULL) { + SDL_GLView = new BGLView(Bounds(), "SDL GLView", + B_FOLLOW_ALL_SIDES, + (B_WILL_DRAW | B_FRAME_EVENTS), + gl_flags); + } + if (the_view != SDL_GLView) { + if (the_view) { + RemoveChild(the_view); + } + AddChild(SDL_GLView); + SDL_GLView->LockGL(); + the_view = SDL_GLView; + } #else - SDL_SetError("OpenGL support not enabled"); - retval = -1; + SDL_SetError("OpenGL support not enabled"); + retval = -1; #endif - } else { - if ( SDL_View == NULL ) { - SDL_View = new SDL_BView(Bounds()); - } - if ( the_view != SDL_View ) { - if ( the_view ) { + } else { + if (SDL_View == NULL) { + SDL_View = new SDL_BView(Bounds()); + } + if (the_view != SDL_View) { + if (the_view) { #if SDL_VIDEO_OPENGL - if ( the_view == SDL_GLView ) { - SDL_GLView->UnlockGL(); - } + if (the_view == SDL_GLView) { + SDL_GLView->UnlockGL(); + } #endif - RemoveChild(the_view); - } - AddChild(SDL_View); - the_view = SDL_View; - } - } - Unlock(); - return(retval); - } - virtual void SetBitmap(BBitmap *bitmap) { - SDL_View->SetBitmap(bitmap); - } - virtual void SetXYOffset(int x, int y) { + RemoveChild(the_view); + } + AddChild(SDL_View); + the_view = SDL_View; + } + } + Unlock(); + return (retval); + } + virtual void SetBitmap(BBitmap * bitmap) + { + SDL_View->SetBitmap(bitmap); + } + virtual void SetXYOffset(int x, int y) + { #if SDL_VIDEO_OPENGL - if ( the_view == SDL_GLView ) { - return; - } + if (the_view == SDL_GLView) { + return; + } #endif - SDL_View->SetXYOffset(x, y); - } - virtual void GetXYOffset(int &x, int &y) { + SDL_View->SetXYOffset(x, y); + } + virtual void GetXYOffset(int &x, int &y) + { #if SDL_VIDEO_OPENGL - if ( the_view == SDL_GLView ) { - x = 0; - y = 0; - return; - } + if (the_view == SDL_GLView) { + x = 0; + y = 0; + return; + } #endif - SDL_View->GetXYOffset(x, y); - } - virtual bool BeginDraw(void) { - return(Lock()); - } - virtual void DrawAsync(BRect updateRect) { - SDL_View->DrawAsync(updateRect); - } - virtual void EndDraw(void) { - SDL_View->Sync(); - Unlock(); - } + SDL_View->GetXYOffset(x, y); + } + virtual bool BeginDraw(void) + { + return (Lock()); + } + virtual void DrawAsync(BRect updateRect) + { + SDL_View->DrawAsync(updateRect); + } + virtual void EndDraw(void) + { + SDL_View->Sync(); + Unlock(); + } #if SDL_VIDEO_OPENGL - virtual void SwapBuffers(void) { - SDL_GLView->UnlockGL(); - SDL_GLView->LockGL(); - SDL_GLView->SwapBuffers(); - } + virtual void SwapBuffers(void) + { + SDL_GLView->UnlockGL(); + SDL_GLView->LockGL(); + SDL_GLView->SwapBuffers(); + } #endif - virtual BView *View(void) { - return(the_view); - } + virtual BView *View(void) + { + return (the_view); + } - /* Hook functions -- overridden */ - virtual void Minimize(bool minimize) { - /* This is only called when mimimized, not when restored */ - //SDL_PrivateAppActive(minimize, SDL_APPACTIVE); - BWindow::Minimize(minimize); - } - virtual void WindowActivated(bool active) { - SDL_PrivateAppActive(active, SDL_APPINPUTFOCUS); - } - virtual bool QuitRequested(void) { - if ( SDL_BeAppActive > 0 ) { - SDL_PrivateQuit(); - /* We don't ever actually close the window here because - the application should respond to the quit request, - or ignore it as desired. - */ - return(false); - } - return(true); /* Close the app window */ - } - virtual void Quit() { - if (!IsLocked()) - Lock(); - BDirectWindow::Quit(); - } + /* Hook functions -- overridden */ + virtual void Minimize(bool minimize) + { + /* This is only called when mimimized, not when restored */ + //SDL_PrivateAppActive(minimize, SDL_APPACTIVE); + BWindow::Minimize(minimize); + } + virtual void WindowActivated(bool active) + { + SDL_PrivateAppActive(active, SDL_APPINPUTFOCUS); + } + virtual bool QuitRequested(void) + { + if (SDL_BeAppActive > 0) { + SDL_PrivateQuit(); + /* We don't ever actually close the window here because + the application should respond to the quit request, + or ignore it as desired. + */ + return (false); + } + return (true); /* Close the app window */ + } + virtual void Quit() + { + if (!IsLocked()) + Lock(); + BDirectWindow::Quit(); + } - virtual int16 Translate2Unicode(const char *buf) { - int32 state, srclen, dstlen; - unsigned char destbuf[2]; - Uint16 unicode = 0; + virtual int16 Translate2Unicode(const char *buf) + { + int32 state, srclen, dstlen; + unsigned char destbuf[2]; + Uint16 unicode = 0; - if ((uchar)buf[0] > 127) { - state = 0; - srclen = SDL_strlen(buf); - dstlen = sizeof(destbuf); - convert_from_utf8(B_UNICODE_CONVERSION, buf, &srclen, (char *)destbuf, &dstlen, &state); - unicode = destbuf[0]; - unicode <<= 8; - unicode |= destbuf[1]; - } else - unicode = buf[0]; + if ((uchar) buf[0] > 127) { + state = 0; + srclen = SDL_strlen(buf); + dstlen = sizeof(destbuf); + convert_from_utf8(B_UNICODE_CONVERSION, buf, &srclen, + (char *) destbuf, &dstlen, &state); + unicode = destbuf[0]; + unicode <<= 8; + unicode |= destbuf[1]; + } else + unicode = buf[0]; - /* For some reason function keys map to control characters */ + /* For some reason function keys map to control characters */ # define CTRL(X) ((X)-'@') - switch (unicode) { - case CTRL('A'): - case CTRL('B'): - case CTRL('C'): - case CTRL('D'): - case CTRL('E'): - case CTRL('K'): - case CTRL('L'): - case CTRL('P'): - if ( ! (SDL_GetModState() & KMOD_CTRL) ) - unicode = 0; - break; - /* Keyboard input maps newline to carriage return */ - case '\n': - unicode = '\r'; - break; - default: - break; - } + switch (unicode) { + case CTRL('A'): + case CTRL('B'): + case CTRL('C'): + case CTRL('D'): + case CTRL('E'): + case CTRL('K'): + case CTRL('L'): + case CTRL('P'): + if (!(SDL_GetModState() & KMOD_CTRL)) + unicode = 0; + break; + /* Keyboard input maps newline to carriage return */ + case '\n': + unicode = '\r'; + break; + default: + break; + } - return unicode; - } + return unicode; + } - virtual void DispatchMessage(BMessage *msg, BHandler *target) { - switch (msg->what) { - case B_MOUSE_MOVED: - { - BPoint where; - int32 transit; - if (msg->FindPoint("where", &where) == B_OK && msg->FindInt32("be:transit", &transit) == B_OK) { - if (transit == B_EXITED_VIEW) { - if ( SDL_GetAppState() & SDL_APPMOUSEFOCUS ) { - SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS); - be_app->SetCursor(B_HAND_CURSOR); - } - } else { - int x, y; - if ( ! (SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) { - SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS); - SDL_SetCursor(NULL); - } - GetXYOffset(x, y); - x = (int)where.x - x; - y = (int)where.y - y; - SDL_PrivateMouseMotion(0, 0, x, y); - } - } - break; - } + virtual void DispatchMessage(BMessage * msg, BHandler * target) + { + switch (msg->what) { + case B_MOUSE_MOVED: + { + BPoint where; + int32 transit; + if (msg->FindPoint("where", &where) == B_OK + && msg->FindInt32("be:transit", &transit) == B_OK) { + if (transit == B_EXITED_VIEW) { + if (SDL_GetAppState() & SDL_APPMOUSEFOCUS) { + SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS); + be_app->SetCursor(B_HAND_CURSOR); + } + } else { + int x, y; + if (!(SDL_GetAppState() & SDL_APPMOUSEFOCUS)) { + SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS); + SDL_SetCursor(NULL); + } + GetXYOffset(x, y); + x = (int) where.x - x; + y = (int) where.y - y; + SDL_PrivateMouseMotion(0, 0, x, y); + } + } + break; + } - case B_MOUSE_DOWN: - { - /* it looks like mouse down is send only for first clicked - button, each next is not send while last one is holded */ - int32 buttons; - int sdl_buttons = 0; - if (msg->FindInt32("buttons", &buttons) == B_OK) { - /* Add any mouse button events */ - if (buttons & B_PRIMARY_MOUSE_BUTTON) { - sdl_buttons |= SDL_BUTTON_LEFT; - } - if (buttons & B_SECONDARY_MOUSE_BUTTON) { - sdl_buttons |= SDL_BUTTON_RIGHT; - } - if (buttons & B_TERTIARY_MOUSE_BUTTON) { - sdl_buttons |= SDL_BUTTON_MIDDLE; - } - SDL_PrivateMouseButton(SDL_PRESSED, sdl_buttons, 0, 0); + case B_MOUSE_DOWN: + { + /* it looks like mouse down is send only for first clicked + button, each next is not send while last one is holded */ + int32 buttons; + int sdl_buttons = 0; + if (msg->FindInt32("buttons", &buttons) == B_OK) { + /* Add any mouse button events */ + if (buttons & B_PRIMARY_MOUSE_BUTTON) { + sdl_buttons |= SDL_BUTTON_LEFT; + } + if (buttons & B_SECONDARY_MOUSE_BUTTON) { + sdl_buttons |= SDL_BUTTON_RIGHT; + } + if (buttons & B_TERTIARY_MOUSE_BUTTON) { + sdl_buttons |= SDL_BUTTON_MIDDLE; + } + SDL_PrivateMouseButton(SDL_PRESSED, sdl_buttons, 0, 0); - last_buttons = buttons; - } - break; - } + last_buttons = buttons; + } + break; + } - case B_MOUSE_UP: - { - /* mouse up doesn't give which button was released, - only state of buttons (after release, so it's always = 0), - which is not what we need ;] - So we need to store button in mouse down, and restore - in mouse up :( - mouse up is (similarly to mouse down) send only for - first button down (ie. it's no send if we click another button - without releasing previous one first) - but that's probably - because of how drivers are written?, not BeOS itself. */ - int32 buttons; - int sdl_buttons = 0; - if (msg->FindInt32("buttons", &buttons) == B_OK) { - /* Add any mouse button events */ - if ((buttons ^ B_PRIMARY_MOUSE_BUTTON) & last_buttons) { - sdl_buttons |= SDL_BUTTON_LEFT; - } - if ((buttons ^ B_SECONDARY_MOUSE_BUTTON) & last_buttons) { - sdl_buttons |= SDL_BUTTON_RIGHT; - } - if ((buttons ^ B_TERTIARY_MOUSE_BUTTON) & last_buttons) { - sdl_buttons |= SDL_BUTTON_MIDDLE; - } - SDL_PrivateMouseButton(SDL_RELEASED, sdl_buttons, 0, 0); + case B_MOUSE_UP: + { + /* mouse up doesn't give which button was released, + only state of buttons (after release, so it's always = 0), + which is not what we need ;] + So we need to store button in mouse down, and restore + in mouse up :( + mouse up is (similarly to mouse down) send only for + first button down (ie. it's no send if we click another button + without releasing previous one first) - but that's probably + because of how drivers are written?, not BeOS itself. */ + int32 buttons; + int sdl_buttons = 0; + if (msg->FindInt32("buttons", &buttons) == B_OK) { + /* Add any mouse button events */ + if ((buttons ^ B_PRIMARY_MOUSE_BUTTON) & last_buttons) { + sdl_buttons |= SDL_BUTTON_LEFT; + } + if ((buttons ^ B_SECONDARY_MOUSE_BUTTON) & last_buttons) { + sdl_buttons |= SDL_BUTTON_RIGHT; + } + if ((buttons ^ B_TERTIARY_MOUSE_BUTTON) & last_buttons) { + sdl_buttons |= SDL_BUTTON_MIDDLE; + } + SDL_PrivateMouseButton(SDL_RELEASED, sdl_buttons, 0, 0); + + last_buttons = buttons; + } + break; + } - last_buttons = buttons; - } - break; - } + case B_MOUSE_WHEEL_CHANGED: + { + float x, y; + x = y = 0; + if (msg->FindFloat("be:wheel_delta_x", &x) == B_OK + && msg->FindFloat("be:wheel_delta_y", &y) == B_OK) { + if (x < 0 || y < 0) { + SDL_PrivateMouseButton(SDL_PRESSED, + SDL_BUTTON_WHEELDOWN, 0, 0); + SDL_PrivateMouseButton(SDL_RELEASED, + SDL_BUTTON_WHEELDOWN, 0, 0); + } else if (x > 0 || y > 0) { + SDL_PrivateMouseButton(SDL_PRESSED, + SDL_BUTTON_WHEELUP, 0, 0); + SDL_PrivateMouseButton(SDL_RELEASED, + SDL_BUTTON_WHEELUP, 0, 0); + } + } + break; + } - case B_MOUSE_WHEEL_CHANGED: - { - float x, y; - x = y = 0; - if (msg->FindFloat("be:wheel_delta_x", &x) == B_OK && msg->FindFloat("be:wheel_delta_y", &y) == B_OK) { - if (x < 0 || y < 0) { - SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_WHEELDOWN, 0, 0); - SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_WHEELDOWN, 0, 0); - } else if (x > 0 || y > 0) { - SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_WHEELUP, 0, 0); - SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_WHEELUP, 0, 0); - } - } - break; - } - - case B_KEY_DOWN: - case B_UNMAPPED_KEY_DOWN: /* modifier keys are unmapped */ - { - int32 key; - int32 modifiers; - int32 key_repeat; - /* Workaround for SDL message queue being filled too fast because of BeOS own key-repeat mechanism */ - if (msg->FindInt32("be:key_repeat", &key_repeat) == B_OK && key_repeat > 0) - break; + case B_KEY_DOWN: + case B_UNMAPPED_KEY_DOWN: /* modifier keys are unmapped */ + { + int32 key; + int32 modifiers; + int32 key_repeat; + /* Workaround for SDL message queue being filled too fast because of BeOS own key-repeat mechanism */ + if (msg->FindInt32("be:key_repeat", &key_repeat) == B_OK + && key_repeat > 0) + break; - if (msg->FindInt32("key", &key) == B_OK && msg->FindInt32("modifiers", &modifiers) == B_OK) { - SDL_keysym keysym; - keysym.scancode = key; - if ((key > 0) && (key < 128)) { - keysym.sym = keymap[key]; - } else { - keysym.sym = SDLK_UNKNOWN; - } - /* FIX THIS? - it seems SDL_PrivateKeyboard() changes mod value - anyway, and doesn't care about what we setup here */ - keysym.mod = KMOD_NONE; - keysym.unicode = 0; - if (SDL_TranslateUNICODE) { - const char *bytes; - if (msg->FindString("bytes", &bytes) == B_OK) { - /* FIX THIS? - this cares only about first "letter", - so if someone maps some key to print - "BeOS rulez!" only "B" will be used. */ - keysym.unicode = Translate2Unicode(bytes); - } - } - SDL_PrivateKeyboard(SDL_PRESSED, &keysym); - } - break; - } + if (msg->FindInt32("key", &key) == B_OK + && msg->FindInt32("modifiers", &modifiers) == B_OK) { + SDL_keysym keysym; + keysym.scancode = key; + if ((key > 0) && (key < 128)) { + keysym.sym = keymap[key]; + } else { + keysym.sym = SDLK_UNKNOWN; + } + /* FIX THIS? + it seems SDL_PrivateKeyboard() changes mod value + anyway, and doesn't care about what we setup here */ + keysym.mod = KMOD_NONE; + keysym.unicode = 0; + if (SDL_TranslateUNICODE) { + const char *bytes; + if (msg->FindString("bytes", &bytes) == B_OK) { + /* FIX THIS? + this cares only about first "letter", + so if someone maps some key to print + "BeOS rulez!" only "B" will be used. */ + keysym.unicode = Translate2Unicode(bytes); + } + } + SDL_PrivateKeyboard(SDL_PRESSED, &keysym); + } + break; + } - case B_KEY_UP: - case B_UNMAPPED_KEY_UP: /* modifier keys are unmapped */ - { - int32 key; - int32 modifiers; - if (msg->FindInt32("key", &key) == B_OK && msg->FindInt32("modifiers", &modifiers) == B_OK) { - SDL_keysym keysym; - keysym.scancode = key; - if ((key > 0) && (key < 128)) { - keysym.sym = keymap[key]; - } else { - keysym.sym = SDLK_UNKNOWN; - } - keysym.mod = KMOD_NONE; /* FIX THIS? */ - keysym.unicode = 0; - if (SDL_TranslateUNICODE) { - const char *bytes; - if (msg->FindString("bytes", &bytes) == B_OK) { - keysym.unicode = Translate2Unicode(bytes); - } - } - SDL_PrivateKeyboard(SDL_RELEASED, &keysym); - } - break; - } + case B_KEY_UP: + case B_UNMAPPED_KEY_UP: /* modifier keys are unmapped */ + { + int32 key; + int32 modifiers; + if (msg->FindInt32("key", &key) == B_OK + && msg->FindInt32("modifiers", &modifiers) == B_OK) { + SDL_keysym keysym; + keysym.scancode = key; + if ((key > 0) && (key < 128)) { + keysym.sym = keymap[key]; + } else { + keysym.sym = SDLK_UNKNOWN; + } + keysym.mod = KMOD_NONE; /* FIX THIS? */ + keysym.unicode = 0; + if (SDL_TranslateUNICODE) { + const char *bytes; + if (msg->FindString("bytes", &bytes) == B_OK) { + keysym.unicode = Translate2Unicode(bytes); + } + } + SDL_PrivateKeyboard(SDL_RELEASED, &keysym); + } + break; + } - default: - /* move it after switch{} so it's always handled - that way we keep BeOS feautures like: - - CTRL+Q to close window (and other shortcuts) - - PrintScreen to make screenshot into /boot/home - - etc.. */ - //BDirectWindow::DispatchMessage(msg, target); - break; - } - BDirectWindow::DispatchMessage(msg, target); - } + default: + /* move it after switch{} so it's always handled + that way we keep BeOS feautures like: + - CTRL+Q to close window (and other shortcuts) + - PrintScreen to make screenshot into /boot/home + - etc.. */ + //BDirectWindow::DispatchMessage(msg, target); + break; + } + BDirectWindow::DispatchMessage(msg, target); + } -private: + private: #if SDL_VIDEO_OPENGL - BGLView *SDL_GLView; + BGLView * SDL_GLView; #endif - SDL_BView *SDL_View; - BView *the_view; + SDL_BView *SDL_View; + BView *the_view; - bool shown; - bool inhibit_resize; + bool shown; + bool inhibit_resize; - int32 last_buttons; - SDLKey keymap[128]; + int32 last_buttons; + SDLKey keymap[128]; }; #endif /* _SDL_BWin_h */ +/* vi: set ts=4 sw=4 expandtab: */