|
|
|
|
@@ -30,11 +30,123 @@ SOFTWARE.
|
|
|
|
|
|
|
|
|
|
using namespace polygun::window;
|
|
|
|
|
|
|
|
|
|
static const KeyCode g_haiku_keycode_to_keycode[] = {
|
|
|
|
|
KeyCode::KEY_NONE,
|
|
|
|
|
KeyCode::KEY_ESCAPE,
|
|
|
|
|
KeyCode::KEY_F1,
|
|
|
|
|
KeyCode::KEY_F2,
|
|
|
|
|
KeyCode::KEY_F3,
|
|
|
|
|
KeyCode::KEY_F4,
|
|
|
|
|
KeyCode::KEY_F5,
|
|
|
|
|
KeyCode::KEY_F6,
|
|
|
|
|
KeyCode::KEY_F7,
|
|
|
|
|
KeyCode::KEY_F8,
|
|
|
|
|
KeyCode::KEY_F9,
|
|
|
|
|
KeyCode::KEY_F10,
|
|
|
|
|
KeyCode::KEY_F11,
|
|
|
|
|
KeyCode::KEY_F12,
|
|
|
|
|
KeyCode::KEY_PRINT_SCREEN,
|
|
|
|
|
KeyCode::KEY_SCROLL_LOCK,
|
|
|
|
|
KeyCode::KEY_PAUSE,
|
|
|
|
|
KeyCode::KEY_TILDE,
|
|
|
|
|
KeyCode::KEY_1,
|
|
|
|
|
KeyCode::KEY_2,
|
|
|
|
|
KeyCode::KEY_3,
|
|
|
|
|
KeyCode::KEY_4,
|
|
|
|
|
KeyCode::KEY_5,
|
|
|
|
|
KeyCode::KEY_6,
|
|
|
|
|
KeyCode::KEY_7,
|
|
|
|
|
KeyCode::KEY_8,
|
|
|
|
|
KeyCode::KEY_9,
|
|
|
|
|
KeyCode::KEY_0,
|
|
|
|
|
KeyCode::KEY_MINUS,
|
|
|
|
|
KeyCode::KEY_EQUALS,
|
|
|
|
|
KeyCode::KEY_BACKSPACE,
|
|
|
|
|
KeyCode::KEY_INSERT,
|
|
|
|
|
KeyCode::KEY_HOME,
|
|
|
|
|
KeyCode::KEY_PAGE_UP,
|
|
|
|
|
KeyCode::KEY_NUM_LOCK,
|
|
|
|
|
KeyCode::KEY_NUM_SLASH,
|
|
|
|
|
KeyCode::KEY_NUM_MULTIPLY,
|
|
|
|
|
KeyCode::KEY_NUM_MINUS,
|
|
|
|
|
KeyCode::KEY_TAB,
|
|
|
|
|
KeyCode::KEY_Q,
|
|
|
|
|
KeyCode::KEY_W,
|
|
|
|
|
KeyCode::KEY_E,
|
|
|
|
|
KeyCode::KEY_R,
|
|
|
|
|
KeyCode::KEY_T,
|
|
|
|
|
KeyCode::KEY_Y,
|
|
|
|
|
KeyCode::KEY_U,
|
|
|
|
|
KeyCode::KEY_I,
|
|
|
|
|
KeyCode::KEY_O,
|
|
|
|
|
KeyCode::KEY_P,
|
|
|
|
|
KeyCode::KEY_LEFT_SQUARE_BRACKET,
|
|
|
|
|
KeyCode::KEY_RIGHT_SQUARE_BRACKET,
|
|
|
|
|
KeyCode::KEY_BACKSLASH,
|
|
|
|
|
KeyCode::KEY_DELETE,
|
|
|
|
|
KeyCode::KEY_END,
|
|
|
|
|
KeyCode::KEY_PAGE_DOWN,
|
|
|
|
|
KeyCode::KEY_NUM_7,
|
|
|
|
|
KeyCode::KEY_NUM_8,
|
|
|
|
|
KeyCode::KEY_NUM_9,
|
|
|
|
|
KeyCode::KEY_NUM_PLUS,
|
|
|
|
|
KeyCode::KEY_CAPS_LOCK,
|
|
|
|
|
KeyCode::KEY_A,
|
|
|
|
|
KeyCode::KEY_S,
|
|
|
|
|
KeyCode::KEY_D,
|
|
|
|
|
KeyCode::KEY_F,
|
|
|
|
|
KeyCode::KEY_G,
|
|
|
|
|
KeyCode::KEY_H,
|
|
|
|
|
KeyCode::KEY_J,
|
|
|
|
|
KeyCode::KEY_K,
|
|
|
|
|
KeyCode::KEY_L,
|
|
|
|
|
KeyCode::KEY_SEMICOLON,
|
|
|
|
|
KeyCode::KEY_QUOTE,
|
|
|
|
|
KeyCode::KEY_RETURN,
|
|
|
|
|
KeyCode::KEY_NUM_4,
|
|
|
|
|
KeyCode::KEY_NUM_5,
|
|
|
|
|
KeyCode::KEY_NUM_6,
|
|
|
|
|
KeyCode::KEY_LEFT_SHIFT,
|
|
|
|
|
KeyCode::KEY_Z,
|
|
|
|
|
KeyCode::KEY_X,
|
|
|
|
|
KeyCode::KEY_C,
|
|
|
|
|
KeyCode::KEY_V,
|
|
|
|
|
KeyCode::KEY_B,
|
|
|
|
|
KeyCode::KEY_N,
|
|
|
|
|
KeyCode::KEY_M,
|
|
|
|
|
KeyCode::KEY_COMMA,
|
|
|
|
|
KeyCode::KEY_DOT,
|
|
|
|
|
KeyCode::KEY_SLASH,
|
|
|
|
|
KeyCode::KEY_RIGHT_SHIFT,
|
|
|
|
|
KeyCode::KEY_UP,
|
|
|
|
|
KeyCode::KEY_NUM_1,
|
|
|
|
|
KeyCode::KEY_NUM_2,
|
|
|
|
|
KeyCode::KEY_NUM_3,
|
|
|
|
|
KeyCode::KEY_NUM_RETURN,
|
|
|
|
|
KeyCode::KEY_LEFT_CONTROL,
|
|
|
|
|
KeyCode::KEY_LEFT_ALT,
|
|
|
|
|
KeyCode::KEY_SPACE,
|
|
|
|
|
KeyCode::KEY_RIGHT_ALT,
|
|
|
|
|
KeyCode::KEY_RIGHT_CONTROL,
|
|
|
|
|
KeyCode::KEY_LEFT,
|
|
|
|
|
KeyCode::KEY_DOWN,
|
|
|
|
|
KeyCode::KEY_RIGHT,
|
|
|
|
|
KeyCode::KEY_NUM_0,
|
|
|
|
|
KeyCode::KEY_NUM_DOT,
|
|
|
|
|
KeyCode::KEY_LEFT_SUPER,
|
|
|
|
|
KeyCode::KEY_RIGHT_SUPER,
|
|
|
|
|
KeyCode::KEY_CONTEXT
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static BApplication* g_app = nullptr;
|
|
|
|
|
|
|
|
|
|
HaikuWindow::HaikuWindow(const std::string& title, unsigned width, unsigned height, renderer::RendererType renderer_type) :
|
|
|
|
|
BDirectWindow(BRect(10, 10, width, height), title.c_str(), B_TITLED_WINDOW, 0),
|
|
|
|
|
Window()
|
|
|
|
|
BWindow(BRect(10, 10, width, height), title.c_str(), B_TITLED_WINDOW, 0),
|
|
|
|
|
Window(),
|
|
|
|
|
#if defined(RENDERER_GL) || defined(RENDERER_LEGACY_GL)
|
|
|
|
|
m_gl_context(nullptr),
|
|
|
|
|
#endif
|
|
|
|
|
m_prev_mouse_buttons(0)
|
|
|
|
|
{
|
|
|
|
|
m_type = WindowType::WINDOW_TYPE_HAIKU;
|
|
|
|
|
switch(renderer_type) {
|
|
|
|
|
@@ -78,14 +190,75 @@ bool HaikuWindow::QuitRequested() {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void HaikuWindow::MessageReceived(BMessage* msg) {
|
|
|
|
|
msg->PrintToStream();
|
|
|
|
|
void HaikuWindow::DispatchMessage(BMessage* msg, BHandler* target) {
|
|
|
|
|
Event event;
|
|
|
|
|
bool handled = false;
|
|
|
|
|
switch(msg->what) {
|
|
|
|
|
case B_KYD:
|
|
|
|
|
LOG_VERBOSE("Key down!");
|
|
|
|
|
default:
|
|
|
|
|
BDirectWindow::MessageReceived(msg);
|
|
|
|
|
case B_KEY_DOWN:
|
|
|
|
|
case B_KEY_UP: {
|
|
|
|
|
int key;
|
|
|
|
|
const bool pressed = msg->what==B_KEY_DOWN;
|
|
|
|
|
if(msg->FindInt32("key", &key)==B_OK && static_cast<size_t>(key)<sizeof(g_haiku_keycode_to_keycode)/sizeof(KeyCode)) {
|
|
|
|
|
event.m_type = pressed?EventType::EVENT_TYPE_KEY_DOWN:EventType::EVENT_TYPE_KEY_UP;
|
|
|
|
|
event.m_data.m_key_event.m_key = g_haiku_keycode_to_keycode[key];
|
|
|
|
|
m_pressed_keyboard_keys[event.m_data.m_key_event.m_key] = pressed;
|
|
|
|
|
handled = true;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case B_MOUSE_UP:
|
|
|
|
|
case B_MOUSE_DOWN: {
|
|
|
|
|
int buttons;
|
|
|
|
|
const bool pressed = msg->what==B_MOUSE_DOWN;
|
|
|
|
|
if(msg->FindInt32("buttons", &buttons)==B_OK) {
|
|
|
|
|
event.m_type = pressed?EventType::EVENT_TYPE_MOUSE_BUTTON_DOWN:EVENT_TYPE_MOUSE_BUTTON_UP;
|
|
|
|
|
if(buttons&B_PRIMARY_MOUSE_BUTTON || m_prev_mouse_buttons&B_PRIMARY_MOUSE_BUTTON) {
|
|
|
|
|
event.m_data.m_mouse_event.m_button = MouseButton::MOUSE_BUTTON_LEFT;
|
|
|
|
|
push_event(event);
|
|
|
|
|
handled = true;
|
|
|
|
|
}
|
|
|
|
|
if(buttons&B_SECONDARY_MOUSE_BUTTON || m_prev_mouse_buttons&B_SECONDARY_MOUSE_BUTTON) {
|
|
|
|
|
event.m_data.m_mouse_event.m_button = MouseButton::MOUSE_BUTTON_RIGHT;
|
|
|
|
|
push_event(event);
|
|
|
|
|
handled = true;
|
|
|
|
|
}
|
|
|
|
|
if(buttons&B_TERTIARY_MOUSE_BUTTON || m_prev_mouse_buttons&B_TERTIARY_MOUSE_BUTTON) {
|
|
|
|
|
event.m_data.m_mouse_event.m_button = MouseButton::MOUSE_BUTTON_MIDDLE;
|
|
|
|
|
push_event(event);
|
|
|
|
|
handled = true;
|
|
|
|
|
}
|
|
|
|
|
if(handled) {
|
|
|
|
|
m_pressed_mouse_buttons[event.m_data.m_mouse_event.m_button] = pressed;
|
|
|
|
|
handled = false;
|
|
|
|
|
}
|
|
|
|
|
m_prev_mouse_buttons = buttons;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case B_MOUSE_MOVED: {
|
|
|
|
|
BPoint where;
|
|
|
|
|
if(msg->FindPoint("where", &where)==B_OK) {
|
|
|
|
|
event.m_type = EventType::EVENT_TYPE_MOUSE_MOVE;
|
|
|
|
|
m_mouse_x = event.m_data.m_mouse_event.m_x = where.x;
|
|
|
|
|
m_mouse_y = event.m_data.m_mouse_event.m_x = where.y;
|
|
|
|
|
handled = true;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case B_MOUSE_WHEEL_CHANGED: {
|
|
|
|
|
float y;
|
|
|
|
|
if(msg->FindFloat("be:wheel_delta_y", &y)==B_OK) {
|
|
|
|
|
event.m_type = EventType::EVENT_TYPE_MOUSE_WHEEL;
|
|
|
|
|
event.m_data.m_mouse_event.m_wheel_offset = y;
|
|
|
|
|
handled = true;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(handled)
|
|
|
|
|
push_event(event);
|
|
|
|
|
else
|
|
|
|
|
BWindow::DispatchMessage(msg, target);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void HaikuWindow::init_application() {
|
|
|
|
|
|