|
|
|
@ -1,4 +1,10 @@ |
|
|
|
|
#include "internal.h" |
|
|
|
|
#include "xkb_unicode.h" |
|
|
|
|
|
|
|
|
|
#include <linux/input.h> |
|
|
|
|
|
|
|
|
|
// FIXME Remove me when done debugging!
|
|
|
|
|
#include <stdio.h> |
|
|
|
|
|
|
|
|
|
MirPixelFormat FindValidPixelFormat() |
|
|
|
|
{ |
|
|
|
@ -26,6 +32,258 @@ MirPixelFormat FindValidPixelFormat() |
|
|
|
|
return mir_pixel_format_invalid; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Taken from wl_init.c
|
|
|
|
|
static int toGLFWKeyCode(uint32_t key) |
|
|
|
|
{ |
|
|
|
|
switch (key) |
|
|
|
|
{ |
|
|
|
|
case KEY_GRAVE: return GLFW_KEY_GRAVE_ACCENT; |
|
|
|
|
case KEY_1: return GLFW_KEY_1; |
|
|
|
|
case KEY_2: return GLFW_KEY_2; |
|
|
|
|
case KEY_3: return GLFW_KEY_3; |
|
|
|
|
case KEY_4: return GLFW_KEY_4; |
|
|
|
|
case KEY_5: return GLFW_KEY_5; |
|
|
|
|
case KEY_6: return GLFW_KEY_6; |
|
|
|
|
case KEY_7: return GLFW_KEY_7; |
|
|
|
|
case KEY_8: return GLFW_KEY_8; |
|
|
|
|
case KEY_9: return GLFW_KEY_9; |
|
|
|
|
case KEY_0: return GLFW_KEY_0; |
|
|
|
|
case KEY_MINUS: return GLFW_KEY_MINUS; |
|
|
|
|
case KEY_EQUAL: return GLFW_KEY_EQUAL; |
|
|
|
|
case KEY_Q: return GLFW_KEY_Q; |
|
|
|
|
case KEY_W: return GLFW_KEY_W; |
|
|
|
|
case KEY_E: return GLFW_KEY_E; |
|
|
|
|
case KEY_R: return GLFW_KEY_R; |
|
|
|
|
case KEY_T: return GLFW_KEY_T; |
|
|
|
|
case KEY_Y: return GLFW_KEY_Y; |
|
|
|
|
case KEY_U: return GLFW_KEY_U; |
|
|
|
|
case KEY_I: return GLFW_KEY_I; |
|
|
|
|
case KEY_O: return GLFW_KEY_O; |
|
|
|
|
case KEY_P: return GLFW_KEY_P; |
|
|
|
|
case KEY_LEFTBRACE: return GLFW_KEY_LEFT_BRACKET; |
|
|
|
|
case KEY_RIGHTBRACE: return GLFW_KEY_RIGHT_BRACKET; |
|
|
|
|
case KEY_A: return GLFW_KEY_A; |
|
|
|
|
case KEY_S: return GLFW_KEY_S; |
|
|
|
|
case KEY_D: return GLFW_KEY_D; |
|
|
|
|
case KEY_F: return GLFW_KEY_F; |
|
|
|
|
case KEY_G: return GLFW_KEY_G; |
|
|
|
|
case KEY_H: return GLFW_KEY_H; |
|
|
|
|
case KEY_J: return GLFW_KEY_J; |
|
|
|
|
case KEY_K: return GLFW_KEY_K; |
|
|
|
|
case KEY_L: return GLFW_KEY_L; |
|
|
|
|
case KEY_SEMICOLON: return GLFW_KEY_SEMICOLON; |
|
|
|
|
case KEY_APOSTROPHE: return GLFW_KEY_APOSTROPHE; |
|
|
|
|
case KEY_Z: return GLFW_KEY_Z; |
|
|
|
|
case KEY_X: return GLFW_KEY_X; |
|
|
|
|
case KEY_C: return GLFW_KEY_C; |
|
|
|
|
case KEY_V: return GLFW_KEY_V; |
|
|
|
|
case KEY_B: return GLFW_KEY_B; |
|
|
|
|
case KEY_N: return GLFW_KEY_N; |
|
|
|
|
case KEY_M: return GLFW_KEY_M; |
|
|
|
|
case KEY_COMMA: return GLFW_KEY_COMMA; |
|
|
|
|
case KEY_DOT: return GLFW_KEY_PERIOD; |
|
|
|
|
case KEY_SLASH: return GLFW_KEY_SLASH; |
|
|
|
|
case KEY_BACKSLASH: return GLFW_KEY_BACKSLASH; |
|
|
|
|
case KEY_ESC: return GLFW_KEY_ESCAPE; |
|
|
|
|
case KEY_TAB: return GLFW_KEY_TAB; |
|
|
|
|
case KEY_LEFTSHIFT: return GLFW_KEY_LEFT_SHIFT; |
|
|
|
|
case KEY_RIGHTSHIFT: return GLFW_KEY_RIGHT_SHIFT; |
|
|
|
|
case KEY_LEFTCTRL: return GLFW_KEY_LEFT_CONTROL; |
|
|
|
|
case KEY_RIGHTCTRL: return GLFW_KEY_RIGHT_CONTROL; |
|
|
|
|
case KEY_LEFTALT: return GLFW_KEY_LEFT_ALT; |
|
|
|
|
case KEY_RIGHTALT: return GLFW_KEY_RIGHT_ALT; |
|
|
|
|
case KEY_LEFTMETA: return GLFW_KEY_LEFT_SUPER; |
|
|
|
|
case KEY_RIGHTMETA: return GLFW_KEY_RIGHT_SUPER; |
|
|
|
|
case KEY_MENU: return GLFW_KEY_MENU; |
|
|
|
|
case KEY_NUMLOCK: return GLFW_KEY_NUM_LOCK; |
|
|
|
|
case KEY_CAPSLOCK: return GLFW_KEY_CAPS_LOCK; |
|
|
|
|
case KEY_PRINT: return GLFW_KEY_PRINT_SCREEN; |
|
|
|
|
case KEY_SCROLLLOCK: return GLFW_KEY_SCROLL_LOCK; |
|
|
|
|
case KEY_PAUSE: return GLFW_KEY_PAUSE; |
|
|
|
|
case KEY_DELETE: return GLFW_KEY_DELETE; |
|
|
|
|
case KEY_BACKSPACE: return GLFW_KEY_BACKSPACE; |
|
|
|
|
case KEY_ENTER: return GLFW_KEY_ENTER; |
|
|
|
|
case KEY_HOME: return GLFW_KEY_HOME; |
|
|
|
|
case KEY_END: return GLFW_KEY_END; |
|
|
|
|
case KEY_PAGEUP: return GLFW_KEY_PAGE_UP; |
|
|
|
|
case KEY_PAGEDOWN: return GLFW_KEY_PAGE_DOWN; |
|
|
|
|
case KEY_INSERT: return GLFW_KEY_INSERT; |
|
|
|
|
case KEY_LEFT: return GLFW_KEY_LEFT; |
|
|
|
|
case KEY_RIGHT: return GLFW_KEY_RIGHT; |
|
|
|
|
case KEY_DOWN: return GLFW_KEY_DOWN; |
|
|
|
|
case KEY_UP: return GLFW_KEY_UP; |
|
|
|
|
case KEY_F1: return GLFW_KEY_F1; |
|
|
|
|
case KEY_F2: return GLFW_KEY_F2; |
|
|
|
|
case KEY_F3: return GLFW_KEY_F3; |
|
|
|
|
case KEY_F4: return GLFW_KEY_F4; |
|
|
|
|
case KEY_F5: return GLFW_KEY_F5; |
|
|
|
|
case KEY_F6: return GLFW_KEY_F6; |
|
|
|
|
case KEY_F7: return GLFW_KEY_F7; |
|
|
|
|
case KEY_F8: return GLFW_KEY_F8; |
|
|
|
|
case KEY_F9: return GLFW_KEY_F9; |
|
|
|
|
case KEY_F10: return GLFW_KEY_F10; |
|
|
|
|
case KEY_F11: return GLFW_KEY_F11; |
|
|
|
|
case KEY_F12: return GLFW_KEY_F12; |
|
|
|
|
case KEY_F13: return GLFW_KEY_F13; |
|
|
|
|
case KEY_F14: return GLFW_KEY_F14; |
|
|
|
|
case KEY_F15: return GLFW_KEY_F15; |
|
|
|
|
case KEY_F16: return GLFW_KEY_F16; |
|
|
|
|
case KEY_F17: return GLFW_KEY_F17; |
|
|
|
|
case KEY_F18: return GLFW_KEY_F18; |
|
|
|
|
case KEY_F19: return GLFW_KEY_F19; |
|
|
|
|
case KEY_F20: return GLFW_KEY_F20; |
|
|
|
|
case KEY_F21: return GLFW_KEY_F21; |
|
|
|
|
case KEY_F22: return GLFW_KEY_F22; |
|
|
|
|
case KEY_F23: return GLFW_KEY_F23; |
|
|
|
|
case KEY_F24: return GLFW_KEY_F24; |
|
|
|
|
case KEY_KPSLASH: return GLFW_KEY_KP_DIVIDE; |
|
|
|
|
case KEY_KPDOT: return GLFW_KEY_KP_MULTIPLY; |
|
|
|
|
case KEY_KPMINUS: return GLFW_KEY_KP_SUBTRACT; |
|
|
|
|
case KEY_KPPLUS: return GLFW_KEY_KP_ADD; |
|
|
|
|
case KEY_KP0: return GLFW_KEY_KP_0; |
|
|
|
|
case KEY_KP1: return GLFW_KEY_KP_1; |
|
|
|
|
case KEY_KP2: return GLFW_KEY_KP_2; |
|
|
|
|
case KEY_KP3: return GLFW_KEY_KP_3; |
|
|
|
|
case KEY_KP4: return GLFW_KEY_KP_4; |
|
|
|
|
case KEY_KP5: return GLFW_KEY_KP_5; |
|
|
|
|
case KEY_KP6: return GLFW_KEY_KP_6; |
|
|
|
|
case KEY_KP7: return GLFW_KEY_KP_7; |
|
|
|
|
case KEY_KP8: return GLFW_KEY_KP_8; |
|
|
|
|
case KEY_KP9: return GLFW_KEY_KP_9; |
|
|
|
|
case KEY_KPCOMMA: return GLFW_KEY_KP_DECIMAL; |
|
|
|
|
case KEY_KPEQUAL: return GLFW_KEY_KP_EQUAL; |
|
|
|
|
case KEY_KPENTER: return GLFW_KEY_KP_ENTER; |
|
|
|
|
default: return GLFW_KEY_UNKNOWN; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void HandleKeyEvent(MirKeyEvent const key, _GLFWwindow* window) |
|
|
|
|
{ |
|
|
|
|
int pressed = key.action == mir_key_action_up ? GLFW_RELEASE : GLFW_PRESS; |
|
|
|
|
|
|
|
|
|
// FIXME Get the correct modifiers
|
|
|
|
|
_glfwInputKey(window, toGLFWKeyCode(key.scan_code), key.scan_code, pressed, 0); |
|
|
|
|
|
|
|
|
|
long text = _glfwKeySym2Unicode(key.key_code); |
|
|
|
|
|
|
|
|
|
// FIXME fill in mod, and last argument
|
|
|
|
|
_glfwInputChar(window, text, 0, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void HandleMouseButton(_GLFWwindow* window, int pressed, MirMotionButton button) |
|
|
|
|
{ |
|
|
|
|
static int last_button; |
|
|
|
|
int glfw_button; |
|
|
|
|
|
|
|
|
|
switch (button) |
|
|
|
|
{ |
|
|
|
|
case mir_motion_button_primary: |
|
|
|
|
glfw_button = GLFW_MOUSE_BUTTON_LEFT; |
|
|
|
|
break; |
|
|
|
|
case mir_motion_button_secondary: |
|
|
|
|
glfw_button = GLFW_MOUSE_BUTTON_RIGHT; |
|
|
|
|
break; |
|
|
|
|
case mir_motion_button_tertiary: |
|
|
|
|
glfw_button = GLFW_MOUSE_BUTTON_MIDDLE; |
|
|
|
|
break; |
|
|
|
|
case mir_motion_button_forward: |
|
|
|
|
// FIXME What is the forward button?
|
|
|
|
|
glfw_button = GLFW_MOUSE_BUTTON_4; |
|
|
|
|
break; |
|
|
|
|
case mir_motion_button_back: |
|
|
|
|
// FIXME What is the back button?
|
|
|
|
|
glfw_button = GLFW_MOUSE_BUTTON_5; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
glfw_button = last_button; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
last_button = glfw_button; |
|
|
|
|
|
|
|
|
|
// FIXME Get the modifiers
|
|
|
|
|
_glfwInputMouseClick(window, glfw_button, pressed, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// TODO Confirm the x/y is correct and no futher work needs to be done.
|
|
|
|
|
void HandleMouseMotion(_GLFWwindow* window, int x, int y) |
|
|
|
|
{ |
|
|
|
|
_glfwInputCursorMotion(window, x, y); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// TODO Confirm it really wants the dx/dy and that they are in the correct direction!
|
|
|
|
|
void HandleMouseScroll(_GLFWwindow* window, int dx, int dy) |
|
|
|
|
{ |
|
|
|
|
_glfwInputScroll(window, dx, dy); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void HandleMouseEvent(MirMotionEvent const motion, int cord_index, _GLFWwindow* window) |
|
|
|
|
{ |
|
|
|
|
switch (motion.action) |
|
|
|
|
{ |
|
|
|
|
case mir_motion_action_down: |
|
|
|
|
case mir_motion_action_pointer_down: |
|
|
|
|
HandleMouseButton(window, GLFW_PRESS, motion.button_state); |
|
|
|
|
break; |
|
|
|
|
case mir_motion_action_up: |
|
|
|
|
case mir_motion_action_pointer_up: |
|
|
|
|
HandleMouseButton(window, GLFW_RELEASE, motion.button_state); |
|
|
|
|
break; |
|
|
|
|
case mir_motion_action_hover_move: |
|
|
|
|
case mir_motion_action_move: |
|
|
|
|
HandleMouseMotion(window, |
|
|
|
|
motion.pointer_coordinates[cord_index].x, |
|
|
|
|
motion.pointer_coordinates[cord_index].y); |
|
|
|
|
break; |
|
|
|
|
case mir_motion_action_outside: |
|
|
|
|
break; |
|
|
|
|
case mir_motion_action_scroll: |
|
|
|
|
HandleMouseScroll(window, |
|
|
|
|
motion.pointer_coordinates[cord_index].hscroll, |
|
|
|
|
motion.pointer_coordinates[cord_index].vscroll); |
|
|
|
|
break; |
|
|
|
|
case mir_motion_action_cancel: |
|
|
|
|
case mir_motion_action_hover_enter: |
|
|
|
|
case mir_motion_action_hover_exit: |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void HandleMotionEvent(MirMotionEvent const motion, _GLFWwindow* window) |
|
|
|
|
{ |
|
|
|
|
int cord_index; |
|
|
|
|
for (cord_index = 0; cord_index < motion.pointer_count; cord_index++) { |
|
|
|
|
HandleMouseEvent(motion, cord_index, window); |
|
|
|
|
/*
|
|
|
|
|
// TODO Does GLFW handle touch events?
|
|
|
|
|
if (motion.pointer_coordinates[cord_index].tool_type == mir_motion_tool_type_finger) { |
|
|
|
|
HandleTouchEvent(motion, cord_index, window); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
HandleMouseEvent(motion, cord_index, window); |
|
|
|
|
} |
|
|
|
|
*/ |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void HandleInput(MirSurface* surface, MirEvent const* event, void* context) |
|
|
|
|
{ |
|
|
|
|
switch (event->type) |
|
|
|
|
{ |
|
|
|
|
case(mir_event_type_key): |
|
|
|
|
HandleKeyEvent(event->key, (_GLFWwindow*)context); |
|
|
|
|
break; |
|
|
|
|
case(mir_event_type_motion): |
|
|
|
|
HandleMotionEvent(event->motion, (_GLFWwindow*)context); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
////// GLFW platform API //////
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
@ -52,16 +310,12 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window, |
|
|
|
|
.output_id = mir_display_output_id_invalid |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/* // Add the HandleInput function somewhere... to handle events from the windows
|
|
|
|
|
MirEventDelegate delegate = |
|
|
|
|
{ |
|
|
|
|
HandleInput, |
|
|
|
|
NULL |
|
|
|
|
window |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
mir_surface_set_event_handler(window->mir.surface, &delegate); |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
params.pixel_format = FindValidPixelFormat(); |
|
|
|
|
if (params.pixel_format == mir_pixel_format_invalid) |
|
|
|
|
{ |
|
|
|
@ -80,6 +334,8 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window, |
|
|
|
|
|
|
|
|
|
window->mir.native_window = mir_surface_get_egl_native_window(window->mir.surface); |
|
|
|
|
|
|
|
|
|
mir_surface_set_event_handler(window->mir.surface, &delegate); |
|
|
|
|
|
|
|
|
|
return GL_TRUE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|