From 953f8ffb5b1cbb732b4dac57ac9e2ec0cdebfcdf Mon Sep 17 00:00:00 2001 From: ladevieq Date: Fri, 22 Jan 2021 23:11:12 +0100 Subject: Handle modifiers and mouse events --- src/main.cpp | 22 ++++++++++++++++++---- src/window.cpp | 28 +++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 7 deletions(-) (limited to 'src') 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) { -- cgit v1.3