diff options
| author | ladevieq <ladevie.quentin@gmail.com> | 2021-01-22 23:11:12 +0100 |
|---|---|---|
| committer | ladevieq <ladevie.quentin@gmail.com> | 2021-01-22 23:11:12 +0100 |
| commit | 953f8ffb5b1cbb732b4dac57ac9e2ec0cdebfcdf (patch) | |
| tree | f37c2b1a1c65720b5ca47b6c2bcf1419a3728be7 | |
| parent | b48567d87fd0eac152e387d633ae782aea89cb9e (diff) | |
Handle modifiers and mouse events
| -rw-r--r-- | include/window.hpp | 22 | ||||
| -rw-r--r-- | src/main.cpp | 22 | ||||
| -rw-r--r-- | src/window.cpp | 28 |
3 files changed, 65 insertions, 7 deletions
diff --git a/include/window.hpp b/include/window.hpp index 85f0a18..7667bbc 100644 --- a/include/window.hpp +++ b/include/window.hpp @@ -16,6 +16,22 @@ class vkrenderer; #include <Windows.h> #endif +enum MODIFIERS { + SHIFT = 1, + LOCK = 2, + CTRL = 4, + ALT = 8, + MOD2 = 16, + MOD3 = 32, + MOD4 = 64, + MOD5 = 128, + BUTTON1 = 256, + BUTTON2 = 512, + BUTTON3 = 1024, + BUTTON4 = 2048, + BUTTON5 = 4096, +}; + enum KEYS { SPACE, Z, @@ -29,13 +45,19 @@ enum EVENT_TYPES: int32_t { RESIZE, KEY_PRESS, KEY_RELEASE, + BUTTON_PRESS, + BUTTON_RELEASE, + MOVE }; struct event { uint32_t width; uint32_t height; // KEYS key; + uint32_t modifiers; uint32_t keycode; + int32_t x; + int32_t y; EVENT_TYPES type; }; diff --git a/src/main.cpp b/src/main.cpp index fb6319e..d7e6462 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -72,19 +72,33 @@ int main() { break; } case EVENT_TYPES::KEY_PRESS: { + auto move_speed = 0.1; + if (event.modifiers & MODIFIERS::SHIFT) { + move_speed *= 10; + } + switch((uint8_t)event.keycode) { case('w'): { - renderer.mapped_data->cam.move(renderer.mapped_data->cam.forward * 0.1); + renderer.mapped_data->cam.move(renderer.mapped_data->cam.forward * move_speed); break; } case('s'): { - renderer.mapped_data->cam.move(-renderer.mapped_data->cam.forward * 0.1); + renderer.mapped_data->cam.move(-renderer.mapped_data->cam.forward * move_speed); + break; + } + case('d'): { + renderer.mapped_data->cam.move(renderer.mapped_data->cam.right * move_speed); + break; + } + case('a'): { + renderer.mapped_data->cam.move(-renderer.mapped_data->cam.right * move_speed); break; } - default: - std::cerr << (uint8_t)event.keycode << std::endl; } } + case EVENT_TYPES::MOVE: { + std::cerr << "X : " << event.x << " Y : " << event.y << std::endl; + } default: { } } diff --git a/src/window.cpp b/src/window.cpp index 34427ce..43fff2a 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -15,8 +15,10 @@ window::window(uint32_t width, uint32_t height) auto screen_info = xcb_setup_roots_iterator(setup).data; uint32_t events[] = { - XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_KEY_PRESS | - XCB_EVENT_MASK_KEY_RELEASE, + XCB_EVENT_MASK_STRUCTURE_NOTIFY | + XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE | + XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE | + XCB_EVENT_MASK_POINTER_MOTION, }; xcb_create_window( connection, @@ -120,14 +122,34 @@ void window::poll_events() { auto key_press_event = (xcb_key_press_event_t*)event; auto keysym = xkb_state_key_get_one_sym(keyboard_state, key_press_event->detail); struct event new_event = { - .type = EVENT_TYPES::KEY_PRESS + .type = event->response_type == XCB_KEY_PRESS ? EVENT_TYPES::KEY_PRESS :EVENT_TYPES::KEY_RELEASE }; + new_event.modifiers = key_press_event->state; new_event.keycode = keysym; events.push_back(new_event); break; } + case XCB_BUTTON_RELEASE: + case XCB_BUTTON_PRESS: { + auto key_press_event = (xcb_key_press_event_t*)event; + struct event new_event = { + .type = event->response_type == XCB_BUTTON_PRESS ? EVENT_TYPES::BUTTON_PRESS :EVENT_TYPES::BUTTON_RELEASE + }; + + events.push_back(new_event); + break; + } + case XCB_MOTION_NOTIFY: { + auto motion_event = (xcb_motion_notify_event_t*)event; + events.push_back({ + .x = motion_event->event_x, + .y = motion_event->event_y, + .type = EVENT_TYPES::MOVE, + }); + break; + } case XCB_CLIENT_MESSAGE: { auto client_message_event = (xcb_client_message_event_t*)event; if (client_message_event->data.data32[0] == win_delete_atom) { |
