revolver

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 7851f1a65c777e5d3464bf3bba08b7b68389bf81
parent 79e2c5d6ed704a7e372d24ff7f3978b65ce1e203
Author: Samdal <samdal@protonmail.com>
Date:   Thu, 27 Mar 2025 19:28:48 +0100

changes

Diffstat:
Mexamples/idraw2d.c | 3+--
Msrc/platform/gfx/xcb_impl.c | 216+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
2 files changed, 130 insertions(+), 89 deletions(-)

diff --git a/examples/idraw2d.c b/examples/idraw2d.c @@ -43,7 +43,6 @@ int main(void) { } } - { // clear rv_command_t* clear = rv_cmd_push_type(scratch.arena, &rpass->commands, RV_COMMAND_CLEAR); rv_render_clear_desc_t* clear_desc = rv_render_push_clear_desc(scratch.arena, clear, RV_RENDER_CLEAR_FLAG_COLOR); @@ -70,7 +69,7 @@ int main(void) { "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n" "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n" "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n" - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ()[]{}!\"\\'#%$&/+-?!~*<>,.;:|" + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789()[]{}!\"\\'#%$&/+-?!~*<>,.;:|" ); rv_rect r = rv_rct(.xy = rv_v2(20, 500 - font->point_size), .wh = gs_asset_font_text_dimensions(font, demo_text)); diff --git a/src/platform/gfx/xcb_impl.c b/src/platform/gfx/xcb_impl.c @@ -24,6 +24,8 @@ struct rv_window_handle_t { xcb_intern_atom_reply_t* close_reply; void* render; bool32 sent_initial_events; + + bool32 vsync; }; ////////////////////////////////////////////////////////////////// @@ -33,11 +35,10 @@ struct rv_window_handle_t { RV_INTERNAL struct { bool32 is_init; - xcb_connection_t* connection; + xcb_connection_t* conn; rv_window_handle_t* window_list; - const xcb_query_extension_reply_t *xkb_extension_reply; struct { @@ -59,9 +60,9 @@ RV_INTERNAL struct { s32 entries_size; } type_map[64]; s32 type_map_size; -} xcb_context; +} xcb_ctx; -#define xcb_maybe_window(w) ((w) ? (w) : (xcb_context.window_list)) +#define xcb_maybe_window(w) ((w) ? (w) : (xcb_ctx.window_list)) ////////////////////////////////////////////////////////////////// @@ -166,15 +167,19 @@ RV_GLOBAL void* egl_attach(xcb_window_t window, xcb_connection_t* connection, bo } } - EGLint attr[] = { - EGL_GL_COLORSPACE, EGL_GL_COLORSPACE_LINEAR, // or use EGL_GL_COLORSPACE_SRGB for sRGB framebuffer - EGL_RENDER_BUFFER, EGL_BACK_BUFFER, - EGL_NONE, - }; - EGLSurface* surface = eglCreateWindowSurface(egl_context.egl_display, egl_context.config, window, attr); - if (surface == EGL_NO_SURFACE) { - rv_abort_msg(1, "Cannot create EGL surface"); + EGLSurface* surface; + { // surface + EGLint attr[] = { + EGL_GL_COLORSPACE, EGL_GL_COLORSPACE_LINEAR, // or use EGL_GL_COLORSPACE_SRGB for sRGB framebuffer + EGL_RENDER_BUFFER, EGL_BACK_BUFFER, + EGL_NONE, + }; + + surface = eglCreateWindowSurface(egl_context.egl_display, egl_context.config, window, attr); + if (surface == EGL_NO_SURFACE) { + rv_abort_msg(1, "Cannot create EGL surface"); + } } eglMakeCurrent(egl_context.egl_display, surface, surface, egl_context.egl_context); @@ -211,6 +216,7 @@ RV_GLOBAL void rv_window_render_end(rv_window_handle_t* window) EGLSurface* surface = w->render; eglSwapBuffers(egl_context.egl_display, surface); } + xcb_flush(xcb_ctx.conn); } #else // RV_RENDER_OPENGL @@ -240,10 +246,10 @@ u32 mods_from_real_virtual(u32 rmod, u32 vmod_low, u32 vmod_high) { XCB_XKB_MAP_PART_KEY_SYMS ) RV_INTERNAL void make_xcb_context(void) { - if (xcb_context.is_init) return; - xcb_context.is_init = true; + if (xcb_ctx.is_init) return; + xcb_ctx.is_init = true; - xcb_context.connection = xcb_connect(NULL, NULL); + xcb_ctx.conn = xcb_connect(NULL, NULL); { // xkb @@ -263,8 +269,8 @@ RV_INTERNAL void make_xcb_context(void) { { const xcb_query_extension_reply_t *reply; - xcb_context.xkb_extension_reply = xcb_get_extension_data(xcb_context.connection, &xcb_xkb_id); - if (!xcb_context.xkb_extension_reply) + xcb_ctx.xkb_extension_reply = xcb_get_extension_data(xcb_ctx.conn, &xcb_xkb_id); + if (!xcb_ctx.xkb_extension_reply) rv_abort_msg(1, "no XKB in X server"); } @@ -272,10 +278,10 @@ RV_INTERNAL void make_xcb_context(void) { xcb_xkb_use_extension_cookie_t cookie; xcb_xkb_use_extension_reply_t *reply = NULL; - cookie = xcb_xkb_use_extension(xcb_context.connection, + cookie = xcb_xkb_use_extension(xcb_ctx.conn, XCB_XKB_MAJOR_VERSION, XCB_XKB_MINOR_VERSION); - reply = xcb_xkb_use_extension_reply(xcb_context.connection, cookie, NULL); + reply = xcb_xkb_use_extension_reply(xcb_ctx.conn, cookie, NULL); if (!reply) rv_abort_msg(1, "couldn't use XKB extension"); @@ -292,11 +298,11 @@ RV_INTERNAL void make_xcb_context(void) { xcb_generic_error_t *error = NULL; // Send the XkbGetMap request. - cookie = xcb_xkb_get_map(xcb_context.connection, + cookie = xcb_xkb_get_map(xcb_ctx.conn, XCB_XKB_ID_USE_CORE_KBD, XKB_COMPONENTS_MASK, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - reply = xcb_xkb_get_map_reply(xcb_context.connection, cookie, &error); + reply = xcb_xkb_get_map_reply(xcb_ctx.conn, cookie, &error); if (!reply || error) rv_abort_msg(1, "couldn't get get_map reply: error_code %d", error->error_code); @@ -327,22 +333,22 @@ RV_INTERNAL void make_xcb_context(void) { &map); } - rv_mem_zero(xcb_context.keycode_converter_list, sizeof(xcb_context.keycode_converter_list)); + rv_mem_zero(xcb_ctx.keycode_converter_list, sizeof(xcb_ctx.keycode_converter_list)); // Get types { s32 length = xcb_xkb_get_map_map_types_rtrn_length(reply, &map); - rv_assert(length <= rv_array_size(xcb_context.type_map)); - length = rv_min(length, rv_array_size(xcb_context.type_map)); - xcb_context.type_map_size = length; + rv_assert(length <= rv_array_size(xcb_ctx.type_map)); + length = rv_min(length, rv_array_size(xcb_ctx.type_map)); + xcb_ctx.type_map_size = length; xcb_xkb_key_type_iterator_t iter = xcb_xkb_get_map_map_types_rtrn_iterator(reply, &map); for (int i = 0; i < length; i++) { xcb_xkb_key_type_t *type = iter.data; - xcb_context.type_map[i].mask = type->mods_mask; + xcb_ctx.type_map[i].mask = type->mods_mask; #if RV_XKB_DEBUG printf("type (%d):\n", i); #endif @@ -350,9 +356,9 @@ RV_INTERNAL void make_xcb_context(void) { { s32 length2 = xcb_xkb_key_type_map_length(type); - rv_assert(length2 <= rv_array_size(xcb_context.type_map[i].entries)); - length2 = rv_min(length2, rv_array_size(xcb_context.type_map[i].entries)); - xcb_context.type_map[i].entries_size = length2; + rv_assert(length2 <= rv_array_size(xcb_ctx.type_map[i].entries)); + length2 = rv_min(length2, rv_array_size(xcb_ctx.type_map[i].entries)); + xcb_ctx.type_map[i].entries_size = length2; xcb_xkb_kt_map_entry_iterator_t iter2 = xcb_xkb_key_type_map_iterator(type); @@ -367,9 +373,9 @@ RV_INTERNAL void make_xcb_context(void) { entry->level ); #endif - xcb_context.type_map[i].entries[j].active = entry->active; - xcb_context.type_map[i].entries[j].mask = entry->mods_mask; - xcb_context.type_map[i].entries[j].level = entry->level; + xcb_ctx.type_map[i].entries[j].active = entry->active; + xcb_ctx.type_map[i].entries[j].mask = entry->mods_mask; + xcb_ctx.type_map[i].entries[j].level = entry->level; xcb_xkb_kt_map_entry_next(&iter2); } @@ -392,9 +398,9 @@ RV_INTERNAL void make_xcb_context(void) { xcb_xkb_key_sym_map_t *sym_map = iter.data; s32 num_groups = sym_map->groupInfo; - xcb_context.keycode_converter_list[i + reply->firstKeySym].num_groups = num_groups; + xcb_ctx.keycode_converter_list[i + reply->firstKeySym].num_groups = num_groups; for (s32 g = 0; g < rv_min(4, num_groups); g++) { - xcb_context.keycode_converter_list[i + reply->firstKeySym].kt_index[g] = sym_map->kt_index[g]; + xcb_ctx.keycode_converter_list[i + reply->firstKeySym].kt_index[g] = sym_map->kt_index[g]; } #if RV_XKB_DEBUG @@ -421,7 +427,7 @@ RV_INTERNAL void make_xcb_context(void) { printf("\tsym(%d): 0x%x\n", j, keysym); #endif - xcb_context.keycode_converter_list[i + reply->firstKeySym].keysyms[j] = keysym; + xcb_ctx.keycode_converter_list[i + reply->firstKeySym].keysyms[j] = keysym; } xcb_xkb_key_sym_map_next(&iter); @@ -429,7 +435,7 @@ RV_INTERNAL void make_xcb_context(void) { } { // add xkb events - xcb_void_cookie_t cookie = xcb_xkb_select_events(xcb_context.connection, + xcb_void_cookie_t cookie = xcb_xkb_select_events(xcb_ctx.conn, XCB_XKB_ID_USE_CORE_KBD, XCB_XKB_EVENT_TYPE_STATE_NOTIFY, 0, @@ -440,11 +446,11 @@ RV_INTERNAL void make_xcb_context(void) { } { - xcb_xkb_get_state_cookie_t cookie = xcb_xkb_get_state(xcb_context.connection, XCB_XKB_ID_USE_CORE_KBD); - xcb_xkb_get_state_reply_t* reply = xcb_xkb_get_state_reply(xcb_context.connection, cookie, NULL); + xcb_xkb_get_state_cookie_t cookie = xcb_xkb_get_state(xcb_ctx.conn, XCB_XKB_ID_USE_CORE_KBD); + xcb_xkb_get_state_reply_t* reply = xcb_xkb_get_state_reply(xcb_ctx.conn, cookie, NULL); - xcb_context.mods = reply->mods; - xcb_context.group = reply->group; + xcb_ctx.mods = reply->mods; + xcb_ctx.group = reply->group; free(reply); } @@ -458,23 +464,23 @@ RV_INTERNAL xcb_keysym_t keycode_to_keysym(u8 keycode, u32 mods) s32 level = 0; { // look up key level - s32 group = rv_min(xcb_context.keycode_converter_list[keycode].num_groups, xcb_context.group); + s32 group = rv_min(xcb_ctx.keycode_converter_list[keycode].num_groups, xcb_ctx.group); - if (xcb_context.keycode_converter_list[keycode].num_groups) { - s32 key_type = xcb_context.keycode_converter_list[keycode].kt_index[group]; + if (xcb_ctx.keycode_converter_list[keycode].num_groups) { + s32 key_type = xcb_ctx.keycode_converter_list[keycode].kt_index[group]; - mods &= xcb_context.type_map[key_type].mask; - for (s32 e = 0; e < xcb_context.type_map[key_type].entries_size; e++) { - if (xcb_context.type_map[key_type].entries[e].active && - xcb_context.type_map[key_type].entries[e].mask == mods) { - level = xcb_context.type_map[key_type].entries[e].level; + mods &= xcb_ctx.type_map[key_type].mask; + for (s32 e = 0; e < xcb_ctx.type_map[key_type].entries_size; e++) { + if (xcb_ctx.type_map[key_type].entries[e].active && + xcb_ctx.type_map[key_type].entries[e].mask == mods) { + level = xcb_ctx.type_map[key_type].entries[e].level; break; } } } } - return xcb_context.keycode_converter_list[keycode].keysyms[level]; + return xcb_ctx.keycode_converter_list[keycode].keysyms[level]; } ////////////////////////////////////////////////////////////////// @@ -489,12 +495,12 @@ RV_GLOBAL rv_window_handle_t* rv_create_window(rv_window_desc_t desc) { // create the window // get the first screen - xcb_screen_t* screen = xcb_setup_roots_iterator(xcb_get_setup(xcb_context.connection)).data; + xcb_screen_t* screen = xcb_setup_roots_iterator(xcb_get_setup(xcb_ctx.conn)).data; // set up masks uint32_t mask = 0; uint32_t values[2]; - res->window_id = xcb_generate_id(xcb_context.connection); + res->window_id = xcb_generate_id(xcb_ctx.conn); mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK; @@ -504,57 +510,60 @@ RV_GLOBAL rv_window_handle_t* rv_create_window(rv_window_desc_t desc) XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW ; + // default window size rv_vec2 size = desc.rect.wh; if (size.x == 0) size.x = 150; if (size.y == 0) size.y = 150; - xcb_create_window(xcb_context.connection, // connection + xcb_create_window(xcb_ctx.conn, // connection XCB_COPY_FROM_PARENT, // depth res->window_id, // window Id screen->root, // parent window desc.rect.x, desc.rect.y, // x, y size.x, size.y, // width, height - 10, // border_width + 0, // border_width XCB_WINDOW_CLASS_INPUT_OUTPUT, // class screen->root_visual, // visual mask, values); // masks // map the window on the screen - xcb_map_window(xcb_context.connection, res->window_id); + xcb_map_window(xcb_ctx.conn, res->window_id); } { // change window title - xcb_intern_atom_cookie_t utf8_string_cookie = xcb_intern_atom(xcb_context.connection, 0, 11, "UTF8_STRING"); - xcb_intern_atom_reply_t* utf8_string_reply = xcb_intern_atom_reply(xcb_context.connection, utf8_string_cookie, 0); + xcb_intern_atom_cookie_t utf8_string_cookie = xcb_intern_atom(xcb_ctx.conn, 0, 11, "UTF8_STRING"); + xcb_intern_atom_reply_t* utf8_string_reply = xcb_intern_atom_reply(xcb_ctx.conn, utf8_string_cookie, 0); xcb_atom_t m_utf8_string_atom = utf8_string_reply->atom; free(utf8_string_reply); - xcb_change_property(xcb_context.connection, XCB_PROP_MODE_REPLACE, res->window_id, + xcb_change_property(xcb_ctx.conn, XCB_PROP_MODE_REPLACE, res->window_id, XCB_ATOM_WM_NAME, m_utf8_string_atom, 8, desc.name.len, desc.name.str); } { // setup close handler event - xcb_intern_atom_cookie_t protocolCookie = xcb_intern_atom_unchecked(xcb_context.connection, 1, 12, "WM_PROTOCOLS"); - xcb_intern_atom_reply_t* protocolReply = xcb_intern_atom_reply(xcb_context.connection, protocolCookie, 0); - xcb_intern_atom_cookie_t closeCookie = xcb_intern_atom_unchecked(xcb_context.connection, 0, 16, "WM_DELETE_WINDOW"); - res->close_reply = xcb_intern_atom_reply(xcb_context.connection, closeCookie, 0); - xcb_change_property(xcb_context.connection, XCB_PROP_MODE_REPLACE, res->window_id, protocolReply->atom, 4, 32, 1, &(res->close_reply->atom)); + xcb_intern_atom_cookie_t protocolCookie = xcb_intern_atom_unchecked(xcb_ctx.conn, 1, 12, "WM_PROTOCOLS"); + xcb_intern_atom_reply_t* protocolReply = xcb_intern_atom_reply(xcb_ctx.conn, protocolCookie, 0); + xcb_intern_atom_cookie_t closeCookie = xcb_intern_atom_unchecked(xcb_ctx.conn, 0, 16, "WM_DELETE_WINDOW"); + res->close_reply = xcb_intern_atom_reply(xcb_ctx.conn, closeCookie, 0); + xcb_change_property(xcb_ctx.conn, XCB_PROP_MODE_REPLACE, res->window_id, protocolReply->atom, 4, 32, 1, &(res->close_reply->atom)); free(protocolReply); } if (desc.attach_render) { #if RV_RENDER_OPENGL - res->render = egl_attach(res->window_id, xcb_context.connection, desc.vsync); + res->render = egl_attach(res->window_id, xcb_ctx.conn, desc.vsync); #endif } - xcb_flush(xcb_context.connection); + res->vsync = desc.vsync; + + xcb_flush(xcb_ctx.conn); xcb_generic_event_t *e; - while ((e = xcb_wait_for_event(xcb_context.connection))) { + while ((e = xcb_wait_for_event(xcb_ctx.conn))) { bool32 done = false; if ((e->response_type & ~0x80) == XCB_EXPOSE) { @@ -567,15 +576,15 @@ RV_GLOBAL rv_window_handle_t* rv_create_window(rv_window_desc_t desc) } { - xcb_get_geometry_cookie_t geom_cookie = xcb_get_geometry(xcb_context.connection, res->window_id); - xcb_get_geometry_reply_t* reply = xcb_get_geometry_reply(xcb_context.connection, geom_cookie, NULL); + xcb_get_geometry_cookie_t geom_cookie = xcb_get_geometry(xcb_ctx.conn, res->window_id); + xcb_get_geometry_reply_t* reply = xcb_get_geometry_reply(xcb_ctx.conn, geom_cookie, NULL); if (reply) { res->last_size = rv_v2(reply->width, reply->height); free(reply); } } - rv_llist_stack_push(xcb_context.window_list, res); + rv_llist_stack_push(xcb_ctx.window_list, res); return res; } @@ -597,11 +606,11 @@ RV_GLOBAL void rv_destroy_window(rv_window_handle_t** handle) free(handle[0]->close_reply); - xcb_destroy_window(xcb_context.connection, handle[0]->window_id); + xcb_destroy_window(xcb_ctx.conn, handle[0]->window_id); - xcb_flush(xcb_context.connection); + xcb_flush(xcb_ctx.conn); - for (rv_window_handle_t** window_iter = &xcb_context.window_list; *window_iter; window_iter = &window_iter[0]->next) { + for (rv_window_handle_t** window_iter = &xcb_ctx.window_list; *window_iter; window_iter = &window_iter[0]->next) { if (*window_iter == *handle) { *window_iter = handle[0]->next; break; @@ -613,7 +622,7 @@ RV_GLOBAL void rv_destroy_window(rv_window_handle_t** handle) } rv_window_handle_t* xcb_get_window(xcb_window_t window) { - for (rv_window_handle_t* w = xcb_context.window_list; w; w = w->next) { + for (rv_window_handle_t* w = xcb_ctx.window_list; w; w = w->next) { if (window == w->window_id) { return w; } @@ -626,11 +635,13 @@ rv_window_handle_t* xcb_get_window(xcb_window_t window) { RV_GLOBAL rv_event_t* rv_get_events(rv_arena* arena, rv_event_flags_t flags) { + xcb_flush(xcb_ctx.conn); + rv_event_t* res_first = NULL; rv_event_t* res_last = NULL; // force send initial events... - for (rv_window_handle_t* w = xcb_context.window_list; w; w = w->next) { + for (rv_window_handle_t* w = xcb_ctx.window_list; w; w = w->next) { if (!w->sent_initial_events) { w->sent_initial_events = true; rv_event_t* n; @@ -638,25 +649,24 @@ RV_GLOBAL rv_event_t* rv_get_events(rv_arena* arena, rv_event_flags_t flags) n = rv_push_compound(arena, rv_event_t, {.type = RV_EVENT_WINDOW_RESIZE, .window_resize = w}); rv_llist_queue_push(res_first, res_last, n); - n = rv_push_compound(arena, rv_event_t, {.type = RV_EVENT_KEY_PRESS, .key_press.mods = xcb_context.mods, .key_press.group = xcb_context.group}); + n = rv_push_compound(arena, rv_event_t, {.type = RV_EVENT_KEY_PRESS, .key_press.mods = xcb_ctx.mods, .key_press.group = xcb_ctx.group}); rv_llist_queue_push(res_first, res_last, n); } } xcb_generic_event_t *event; - while ((event = xcb_poll_for_event(xcb_context.connection))) { - + while ((event = xcb_poll_for_event(xcb_ctx.conn))) { rv_event_t new_ev = {0}; bool32 is_press = false; switch (event->response_type & ~0x80) { case XCB_EXPOSE: { - xcb_flush(xcb_context.connection); + xcb_flush(xcb_ctx.conn); } break; case XCB_CLIENT_MESSAGE: { - for (rv_window_handle_t* w = xcb_context.window_list; w; w = w->next) { + for (rv_window_handle_t* w = xcb_ctx.window_list; w; w = w->next) { if (((xcb_client_message_event_t*)event)->data.data32[0] == w->close_reply->atom) { new_ev.type = RV_EVENT_WINDOW_CLOSE; new_ev.window_close = w; @@ -681,7 +691,7 @@ RV_GLOBAL rv_event_t* rv_get_events(rv_arena* arena, rv_event_flags_t flags) new_ev.key_press.window = xcb_get_window(key_event->event); - xcb_keysym_t keysym = keycode_to_keysym(keycode, xcb_context.mods); + xcb_keysym_t keysym = keycode_to_keysym(keycode, xcb_ctx.mods); // TODO(Samdal): look up conversion map for multi-keys and dead keys { // convert (some) dead keys to real keys... @@ -872,8 +882,8 @@ RV_GLOBAL rv_event_t* rv_get_events(rv_arena* arena, rv_event_flags_t flags) } } new_ev.key_press.keycode = kc; - new_ev.key_press.mods = xcb_context.mods; - new_ev.key_press.group = xcb_context.group; + new_ev.key_press.mods = xcb_ctx.mods; + new_ev.key_press.group = xcb_ctx.group; new_ev.key_press.native_keycode = keycode; { @@ -927,10 +937,11 @@ RV_GLOBAL rv_event_t* rv_get_events(rv_arena* arena, rv_event_flags_t flags) new_ev.window_resize = w; if (w) { if (w->last_size.x != conf_event->width || w->last_size.y != conf_event->height) { - new_ev.type = RV_EVENT_WINDOW_RESIZE; w->last_size = rv_v2(conf_event->width, conf_event->height); + new_ev.type = RV_EVENT_WINDOW_RESIZE; } } + xcb_flush(xcb_ctx.conn); } break; case XCB_ENTER_NOTIFY: { xcb_enter_notify_event_t* enter_event = (xcb_leave_notify_event_t*)event; @@ -943,12 +954,41 @@ RV_GLOBAL rv_event_t* rv_get_events(rv_arena* arena, rv_event_flags_t flags) new_ev.window_leave = xcb_get_window(leave_event->event); } break; + case XCB_MOTION_NOTIFY: + case XCB_FOCUS_IN: + case XCB_FOCUS_OUT: + case XCB_GRAPHICS_EXPOSURE: + case XCB_NO_EXPOSURE: + case XCB_VISIBILITY_NOTIFY: + case XCB_CREATE_NOTIFY: + case XCB_DESTROY_NOTIFY: + case XCB_UNMAP_NOTIFY: + case XCB_MAP_NOTIFY: + case XCB_MAP_REQUEST: + case XCB_REPARENT_NOTIFY: + case XCB_CONFIGURE_REQUEST: + case XCB_GRAVITY_NOTIFY: + case XCB_RESIZE_REQUEST: + case XCB_CIRCULATE_NOTIFY: + case XCB_CIRCULATE_REQUEST: + case XCB_PROPERTY_NOTIFY: + case XCB_COLORMAP_NOTIFY: + { + printf("unhandled event (one of above in source code): %d\n", event->response_type & ~0x80); + } break; + case XCB_GE_GENERIC: { + // GE generic event... + } break; + case 0: { + puts("X11 error!"); + } break; + default: { - if (xcb_context.xkb_extension_reply->first_event == (event->response_type & ~0x80)) { + if (xcb_ctx.xkb_extension_reply->first_event == (event->response_type & ~0x80)) { xcb_xkb_state_notify_event_t *state = (xcb_xkb_state_notify_event_t *)event; - xcb_context.mods = state->mods; - xcb_context.group = state->group; + xcb_ctx.mods = state->mods; + xcb_ctx.group = state->group; } else { printf("unhandled event: %d\n", event->response_type & ~0x80); @@ -964,6 +1004,8 @@ RV_GLOBAL rv_event_t* rv_get_events(rv_arena* arena, rv_event_flags_t flags) free(event); } + xcb_flush(xcb_ctx.conn); + rv_keyboard_context_update(&rv_keyboard_context, res_first); return res_first; @@ -980,8 +1022,8 @@ RV_GLOBAL rv_vec2 rv_window_size(rv_window_handle_t* window) RV_GLOBAL rv_vec2 rv_window_mouse_pos(rv_window_handle_t* window) { rv_vec2 ret = {0}; - xcb_query_pointer_cookie_t cookie = xcb_query_pointer(xcb_context.connection, xcb_maybe_window(window)->window_id); - xcb_query_pointer_reply_t* reply = xcb_query_pointer_reply(xcb_context.connection, cookie, NULL); + xcb_query_pointer_cookie_t cookie = xcb_query_pointer(xcb_ctx.conn, xcb_maybe_window(window)->window_id); + xcb_query_pointer_reply_t* reply = xcb_query_pointer_reply(xcb_ctx.conn, cookie, NULL); if (reply) { ret = rv_v2( reply->win_x,