summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/SDL2/src/video/haiku/SDL_BWin.h
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/SDL2/src/video/haiku/SDL_BWin.h')
-rw-r--r--3rdparty/SDL2/src/video/haiku/SDL_BWin.h670
1 files changed, 0 insertions, 670 deletions
diff --git a/3rdparty/SDL2/src/video/haiku/SDL_BWin.h b/3rdparty/SDL2/src/video/haiku/SDL_BWin.h
deleted file mode 100644
index a353e1acade..00000000000
--- a/3rdparty/SDL2/src/video/haiku/SDL_BWin.h
+++ /dev/null
@@ -1,670 +0,0 @@
-/*
- Simple DirectMedia Layer
- Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-*/
-
-#ifndef _SDL_BWin_h
-#define _SDL_BWin_h
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "../../SDL_internal.h"
-#include "SDL.h"
-#include "SDL_syswm.h"
-#include "SDL_bframebuffer.h"
-
-#ifdef __cplusplus
-}
-#endif
-
-#include <stdio.h>
-#include <AppKit.h>
-#include <InterfaceKit.h>
-#include <be/game/DirectWindow.h>
-#if SDL_VIDEO_OPENGL
-#include <be/opengl/GLView.h>
-#endif
-#include "SDL_events.h"
-#include "../../main/haiku/SDL_BApp.h"
-
-
-enum WinCommands {
- BWIN_MOVE_WINDOW,
- BWIN_RESIZE_WINDOW,
- BWIN_SHOW_WINDOW,
- BWIN_HIDE_WINDOW,
- BWIN_MAXIMIZE_WINDOW,
- BWIN_MINIMIZE_WINDOW,
- BWIN_RESTORE_WINDOW,
- BWIN_SET_TITLE,
- BWIN_SET_BORDERED,
- BWIN_SET_RESIZABLE,
- BWIN_FULLSCREEN
-};
-
-
-class SDL_BWin:public BDirectWindow
-{
- public:
- /* Constructor/Destructor */
- SDL_BWin(BRect bounds, window_look look, uint32 flags)
- : BDirectWindow(bounds, "Untitled", look, B_NORMAL_WINDOW_FEEL, flags)
- {
- _last_buttons = 0;
-
-#if SDL_VIDEO_OPENGL
- _SDL_GLView = NULL;
-#endif
- _shown = false;
- _inhibit_resize = false;
- _mouse_focused = false;
- _prev_frame = NULL;
-
- /* Handle framebuffer stuff */
- _connected = _connection_disabled = false;
- _buffer_created = _buffer_dirty = false;
- _trash_window_buffer = false;
- _buffer_locker = new BLocker();
- _bitmap = NULL;
- _clips = NULL;
-
-#ifdef DRAWTHREAD
- _draw_thread_id = spawn_thread(BE_DrawThread, "drawing_thread",
- B_NORMAL_PRIORITY, (void*) this);
- resume_thread(_draw_thread_id);
-#endif
- }
-
- virtual ~ SDL_BWin()
- {
- Lock();
- _connection_disabled = true;
- int32 result;
-
-#if SDL_VIDEO_OPENGL
- if (_SDL_GLView) {
- _SDL_GLView->UnlockGL();
- RemoveChild(_SDL_GLView); /* Why was this outside the if
- statement before? */
- }
-
-#endif
- Unlock();
-#if SDL_VIDEO_OPENGL
- if (_SDL_GLView) {
- delete _SDL_GLView;
- }
-#endif
-
- /* Clean up framebuffer stuff */
- _buffer_locker->Lock();
-#ifdef DRAWTHREAD
- wait_for_thread(_draw_thread_id, &result);
-#endif
- free(_clips);
- delete _buffer_locker;
- }
-
-
- /* * * * * OpenGL functionality * * * * */
-#if SDL_VIDEO_OPENGL
- virtual BGLView *CreateGLView(Uint32 gl_flags) {
- Lock();
- if (_SDL_GLView == NULL) {
- _SDL_GLView = new BGLView(Bounds(), "SDL GLView",
- B_FOLLOW_ALL_SIDES,
- (B_WILL_DRAW | B_FRAME_EVENTS),
- gl_flags);
- }
- AddChild(_SDL_GLView);
- _SDL_GLView->EnableDirectMode(true);
- _SDL_GLView->LockGL(); /* "New" GLViews are created */
- Unlock();
- return (_SDL_GLView);
- }
-
- virtual void RemoveGLView() {
- Lock();
- if(_SDL_GLView) {
- _SDL_GLView->UnlockGL();
- RemoveChild(_SDL_GLView);
- }
- Unlock();
- }
-
- virtual void SwapBuffers(void) {
- _SDL_GLView->UnlockGL();
- _SDL_GLView->LockGL();
- _SDL_GLView->SwapBuffers();
- }
-#endif
-
- /* * * * * Framebuffering* * * * */
- virtual void DirectConnected(direct_buffer_info *info) {
- if(!_connected && _connection_disabled) {
- return;
- }
-
- /* Determine if the pixel buffer is usable after this update */
- _trash_window_buffer = _trash_window_buffer
- || ((info->buffer_state & B_BUFFER_RESIZED)
- || (info->buffer_state & B_BUFFER_RESET)
- || (info->driver_state == B_MODE_CHANGED));
- LockBuffer();
-
- switch(info->buffer_state & B_DIRECT_MODE_MASK) {
- case B_DIRECT_START:
- _connected = true;
-
- case B_DIRECT_MODIFY:
- if(_clips) {
- free(_clips);
- _clips = NULL;
- }
-
- _num_clips = info->clip_list_count;
- _clips = (clipping_rect *)malloc(_num_clips*sizeof(clipping_rect));
- if(_clips) {
- memcpy(_clips, info->clip_list,
- _num_clips*sizeof(clipping_rect));
-
- _bits = (uint8*) info->bits;
- _row_bytes = info->bytes_per_row;
- _bounds = info->window_bounds;
- _bytes_per_px = info->bits_per_pixel / 8;
- _buffer_dirty = true;
- }
- break;
-
- case B_DIRECT_STOP:
- _connected = false;
- break;
- }
-#if SDL_VIDEO_OPENGL
- if(_SDL_GLView) {
- _SDL_GLView->DirectConnected(info);
- }
-#endif
-
-
- /* Call the base object directconnected */
- BDirectWindow::DirectConnected(info);
-
- UnlockBuffer();
-
- }
-
-
-
-
- /* * * * * Event sending * * * * */
- /* Hook functions */
- virtual void FrameMoved(BPoint origin) {
- /* Post a message to the BApp so that it can handle the window event */
- BMessage msg(BAPP_WINDOW_MOVED);
- msg.AddInt32("window-x", (int)origin.x);
- msg.AddInt32("window-y", (int)origin.y);
- _PostWindowEvent(msg);
-
- /* Perform normal hook operations */
- BDirectWindow::FrameMoved(origin);
- }
-
- virtual void FrameResized(float width, float height) {
- /* Post a message to the BApp so that it can handle the window event */
- BMessage msg(BAPP_WINDOW_RESIZED);
-
- msg.AddInt32("window-w", (int)width + 1);
- msg.AddInt32("window-h", (int)height + 1);
- _PostWindowEvent(msg);
-
- /* Perform normal hook operations */
- BDirectWindow::FrameResized(width, height);
- }
-
- virtual bool QuitRequested() {
- BMessage msg(BAPP_WINDOW_CLOSE_REQUESTED);
- _PostWindowEvent(msg);
-
- /* We won't allow a quit unless asked by DestroyWindow() */
- return false;
- }
-
- virtual void WindowActivated(bool active) {
- BMessage msg(BAPP_KEYBOARD_FOCUS); /* Mouse focus sold separately */
- _PostWindowEvent(msg);
- }
-
- virtual void Zoom(BPoint origin,
- float width,
- float height) {
- BMessage msg(BAPP_MAXIMIZE); /* Closest thing to maximization Haiku has */
- _PostWindowEvent(msg);
-
- /* Before the window zooms, record its size */
- if( !_prev_frame )
- _prev_frame = new BRect(Frame());
-
- /* Perform normal hook operations */
- BDirectWindow::Zoom(origin, width, height);
- }
-
- /* Member functions */
- virtual void Show() {
- while(IsHidden()) {
- BDirectWindow::Show();
- }
- _shown = true;
-
- BMessage msg(BAPP_SHOW);
- _PostWindowEvent(msg);
- }
-
- virtual void Hide() {
- BDirectWindow::Hide();
- _shown = false;
-
- BMessage msg(BAPP_HIDE);
- _PostWindowEvent(msg);
- }
-
- virtual void Minimize(bool minimize) {
- BDirectWindow::Minimize(minimize);
- int32 minState = (minimize ? BAPP_MINIMIZE : BAPP_RESTORE);
-
- BMessage msg(minState);
- _PostWindowEvent(msg);
- }
-
-
- /* BView message interruption */
- virtual void DispatchMessage(BMessage * msg, BHandler * target)
- {
- BPoint where; /* Used by mouse moved */
- int32 buttons; /* Used for mouse button events */
- int32 key; /* Used for key events */
-
- switch (msg->what) {
- case B_MOUSE_MOVED:
- int32 transit;
- if (msg->FindPoint("where", &where) == B_OK
- && msg->FindInt32("be:transit", &transit) == B_OK) {
- _MouseMotionEvent(where, transit);
- }
-
- /* FIXME: Apparently a button press/release event might be dropped
- if made before before a different button is released. Does
- B_MOUSE_MOVED have the data needed to check if a mouse button
- state has changed? */
- if (msg->FindInt32("buttons", &buttons) == B_OK) {
- _MouseButtonEvent(buttons);
- }
- break;
-
- case B_MOUSE_DOWN:
- case B_MOUSE_UP:
- /* _MouseButtonEvent() detects any and all buttons that may have
- changed state, as well as that button's new state */
- if (msg->FindInt32("buttons", &buttons) == B_OK) {
- _MouseButtonEvent(buttons);
- }
- break;
-
- case B_MOUSE_WHEEL_CHANGED:
- float x, y;
- if (msg->FindFloat("be:wheel_delta_x", &x) == B_OK
- && msg->FindFloat("be:wheel_delta_y", &y) == B_OK) {
- _MouseWheelEvent((int)x, (int)y);
- }
- break;
-
- case B_KEY_DOWN:
- {
- int32 i = 0;
- int8 byte;
- int8 bytes[4] = { 0, 0, 0, 0 };
- while (i < 4 && msg->FindInt8("byte", i, &byte) == B_OK) {
- bytes[i] = byte;
- i++;
- }
- if (msg->FindInt32("key", &key) == B_OK) {
- _KeyEvent((SDL_Scancode)key, &bytes[0], i, SDL_PRESSED);
- }
- }
- break;
-
- case B_UNMAPPED_KEY_DOWN: /* modifier keys are unmapped */
- if (msg->FindInt32("key", &key) == B_OK) {
- _KeyEvent((SDL_Scancode)key, NULL, 0, SDL_PRESSED);
- }
- break;
-
- case B_KEY_UP:
- case B_UNMAPPED_KEY_UP: /* modifier keys are unmapped */
- if (msg->FindInt32("key", &key) == B_OK) {
- _KeyEvent(key, NULL, 0, SDL_RELEASED);
- }
- break;
-
- default:
- /* move it after switch{} so it's always handled
- that way we keep Haiku features 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);
- }
-
- /* Handle command messages */
- virtual void MessageReceived(BMessage* message) {
- switch (message->what) {
- /* Handle commands from SDL */
- case BWIN_SET_TITLE:
- _SetTitle(message);
- break;
- case BWIN_MOVE_WINDOW:
- _MoveTo(message);
- break;
- case BWIN_RESIZE_WINDOW:
- _ResizeTo(message);
- break;
- case BWIN_SET_BORDERED:
- _SetBordered(message);
- break;
- case BWIN_SET_RESIZABLE:
- _SetResizable(message);
- break;
- case BWIN_SHOW_WINDOW:
- Show();
- break;
- case BWIN_HIDE_WINDOW:
- Hide();
- break;
- case BWIN_MAXIMIZE_WINDOW:
- BWindow::Zoom();
- break;
- case BWIN_MINIMIZE_WINDOW:
- Minimize(true);
- break;
- case BWIN_RESTORE_WINDOW:
- _Restore();
- break;
- case BWIN_FULLSCREEN:
- _SetFullScreen(message);
- break;
- default:
- /* Perform normal message handling */
- BDirectWindow::MessageReceived(message);
- break;
- }
-
- }
-
-
-
- /* Accessor methods */
- bool IsShown() { return _shown; }
- int32 GetID() { return _id; }
- uint32 GetRowBytes() { return _row_bytes; }
- int32 GetFbX() { return _bounds.left; }
- int32 GetFbY() { return _bounds.top; }
- bool ConnectionEnabled() { return !_connection_disabled; }
- bool Connected() { return _connected; }
- clipping_rect *GetClips() { return _clips; }
- int32 GetNumClips() { return _num_clips; }
- uint8* GetBufferPx() { return _bits; }
- int32 GetBytesPerPx() { return _bytes_per_px; }
- bool CanTrashWindowBuffer() { return _trash_window_buffer; }
- bool BufferExists() { return _buffer_created; }
- bool BufferIsDirty() { return _buffer_dirty; }
- BBitmap *GetBitmap() { return _bitmap; }
-#if SDL_VIDEO_OPENGL
- BGLView *GetGLView() { return _SDL_GLView; }
-#endif
-
- /* Setter methods */
- void SetID(int32 id) { _id = id; }
- void SetBufferExists(bool bufferExists) { _buffer_created = bufferExists; }
- void LockBuffer() { _buffer_locker->Lock(); }
- void UnlockBuffer() { _buffer_locker->Unlock(); }
- void SetBufferDirty(bool bufferDirty) { _buffer_dirty = bufferDirty; }
- void SetTrashBuffer(bool trash) { _trash_window_buffer = trash; }
- void SetBitmap(BBitmap *bitmap) { _bitmap = bitmap; }
-
-
-private:
- /* Event redirection */
- void _MouseMotionEvent(BPoint &where, int32 transit) {
- if(transit == B_EXITED_VIEW) {
- /* Change mouse focus */
- if(_mouse_focused) {
- _MouseFocusEvent(false);
- }
- } else {
- /* Change mouse focus */
- if (!_mouse_focused) {
- _MouseFocusEvent(true);
- }
- BMessage msg(BAPP_MOUSE_MOVED);
- msg.AddInt32("x", (int)where.x);
- msg.AddInt32("y", (int)where.y);
-
- _PostWindowEvent(msg);
- }
- }
-
- void _MouseFocusEvent(bool focusGained) {
- _mouse_focused = focusGained;
- BMessage msg(BAPP_MOUSE_FOCUS);
- msg.AddBool("focusGained", focusGained);
- _PostWindowEvent(msg);
-
-/* FIXME: Why were these here?
- if false: be_app->SetCursor(B_HAND_CURSOR);
- if true: SDL_SetCursor(NULL); */
- }
-
- void _MouseButtonEvent(int32 buttons) {
- int32 buttonStateChange = buttons ^ _last_buttons;
-
- /* Make sure at least one button has changed state */
- if( !(buttonStateChange) ) {
- return;
- }
-
- /* Add any mouse button events */
- if(buttonStateChange & B_PRIMARY_MOUSE_BUTTON) {
- _SendMouseButton(SDL_BUTTON_LEFT, buttons &
- B_PRIMARY_MOUSE_BUTTON);
- }
- if(buttonStateChange & B_SECONDARY_MOUSE_BUTTON) {
- _SendMouseButton(SDL_BUTTON_RIGHT, buttons &
- B_PRIMARY_MOUSE_BUTTON);
- }
- if(buttonStateChange & B_TERTIARY_MOUSE_BUTTON) {
- _SendMouseButton(SDL_BUTTON_MIDDLE, buttons &
- B_PRIMARY_MOUSE_BUTTON);
- }
-
- _last_buttons = buttons;
- }
-
- void _SendMouseButton(int32 button, int32 state) {
- BMessage msg(BAPP_MOUSE_BUTTON);
- msg.AddInt32("button-id", button);
- msg.AddInt32("button-state", state);
- _PostWindowEvent(msg);
- }
-
- void _MouseWheelEvent(int32 x, int32 y) {
- /* Create a message to pass along to the BeApp thread */
- BMessage msg(BAPP_MOUSE_WHEEL);
- msg.AddInt32("xticks", x);
- msg.AddInt32("yticks", y);
- _PostWindowEvent(msg);
- }
-
- void _KeyEvent(int32 keyCode, const int8 *keyUtf8, const ssize_t & len, int32 keyState) {
- /* Create a message to pass along to the BeApp thread */
- BMessage msg(BAPP_KEY);
- msg.AddInt32("key-state", keyState);
- msg.AddInt32("key-scancode", keyCode);
- if (keyUtf8 != NULL) {
- msg.AddData("key-utf8", B_INT8_TYPE, (const void*)keyUtf8, len);
- }
- be_app->PostMessage(&msg);
- }
-
- void _RepaintEvent() {
- /* Force a repaint: Call the SDL exposed event */
- BMessage msg(BAPP_REPAINT);
- _PostWindowEvent(msg);
- }
- void _PostWindowEvent(BMessage &msg) {
- msg.AddInt32("window-id", _id);
- be_app->PostMessage(&msg);
- }
-
- /* Command methods (functions called upon by SDL) */
- void _SetTitle(BMessage *msg) {
- const char *title;
- if(
- msg->FindString("window-title", &title) != B_OK
- ) {
- return;
- }
- SetTitle(title);
- }
-
- void _MoveTo(BMessage *msg) {
- int32 x, y;
- if(
- msg->FindInt32("window-x", &x) != B_OK ||
- msg->FindInt32("window-y", &y) != B_OK
- ) {
- return;
- }
- MoveTo(x, y);
- }
-
- void _ResizeTo(BMessage *msg) {
- int32 w, h;
- if(
- msg->FindInt32("window-w", &w) != B_OK ||
- msg->FindInt32("window-h", &h) != B_OK
- ) {
- return;
- }
- ResizeTo(w, h);
- }
-
- void _SetBordered(BMessage *msg) {
- bool bEnabled;
- if(msg->FindBool("window-border", &bEnabled) != B_OK) {
- return;
- }
- SetLook(bEnabled ? B_BORDERED_WINDOW_LOOK : B_NO_BORDER_WINDOW_LOOK);
- }
-
- void _SetResizable(BMessage *msg) {
- bool bEnabled;
- if(msg->FindBool("window-resizable", &bEnabled) != B_OK) {
- return;
- }
- if (bEnabled) {
- SetFlags(Flags() & ~(B_NOT_RESIZABLE | B_NOT_ZOOMABLE));
- } else {
- SetFlags(Flags() | (B_NOT_RESIZABLE | B_NOT_ZOOMABLE));
- }
- }
-
- void _Restore() {
- if(IsMinimized()) {
- Minimize(false);
- } else if(IsHidden()) {
- Show();
- } else if(_prev_frame != NULL) { /* Zoomed */
- MoveTo(_prev_frame->left, _prev_frame->top);
- ResizeTo(_prev_frame->Width(), _prev_frame->Height());
- }
- }
-
- void _SetFullScreen(BMessage *msg) {
- bool fullscreen;
- if(
- msg->FindBool("fullscreen", &fullscreen) != B_OK
- ) {
- return;
- }
- SetFullScreen(fullscreen);
- }
-
- /* Members */
-#if SDL_VIDEO_OPENGL
- BGLView * _SDL_GLView;
-#endif
-
- int32 _last_buttons;
- int32 _id; /* Window id used by SDL_BApp */
- bool _mouse_focused; /* Does this window have mouse focus? */
- bool _shown;
- bool _inhibit_resize;
-
- BRect *_prev_frame; /* Previous position and size of the window */
-
- /* Framebuffer members */
- bool _connected,
- _connection_disabled,
- _buffer_created,
- _buffer_dirty,
- _trash_window_buffer;
- uint8 *_bits;
- uint32 _row_bytes;
- clipping_rect _bounds;
- BLocker *_buffer_locker;
- clipping_rect *_clips;
- int32 _num_clips;
- int32 _bytes_per_px;
- thread_id _draw_thread_id;
-
- BBitmap *_bitmap;
-};
-
-
-/* FIXME:
- * An explanation of framebuffer flags.
- *
- * _connected - Original variable used to let the drawing thread know
- * when changes are being made to the other framebuffer
- * members.
- * _connection_disabled - Used to signal to the drawing thread that the window
- * is closing, and the thread should exit.
- * _buffer_created - True if the current buffer is valid
- * _buffer_dirty - True if the window should be redrawn.
- * _trash_window_buffer - True if the window buffer needs to be trashed partway
- * through a draw cycle. Occurs when the previous
- * buffer provided by DirectConnected() is invalidated.
- */
-#endif