void WaylandInputEvent::createNewKeymap() { m_xkbInfo.shift_mod = xkb_map_mod_get_index(m_xkbInfo.keymap, XKB_MOD_NAME_SHIFT); m_xkbInfo.caps_mod = xkb_map_mod_get_index(m_xkbInfo.keymap, XKB_MOD_NAME_CAPS); m_xkbInfo.ctrl_mod = xkb_map_mod_get_index(m_xkbInfo.keymap, XKB_MOD_NAME_CTRL); m_xkbInfo.alt_mod = xkb_map_mod_get_index(m_xkbInfo.keymap, XKB_MOD_NAME_ALT); m_xkbInfo.mod2_mod = xkb_map_mod_get_index(m_xkbInfo.keymap, "Mod2"); m_xkbInfo.mod3_mod = xkb_map_mod_get_index(m_xkbInfo.keymap, "Mod3"); m_xkbInfo.super_mod = xkb_map_mod_get_index(m_xkbInfo.keymap, XKB_MOD_NAME_LOGO); m_xkbInfo.mod5_mod = xkb_map_mod_get_index(m_xkbInfo.keymap, "Mod5"); m_xkbInfo.num_led = xkb_map_led_get_index(m_xkbInfo.keymap, XKB_LED_NAME_NUM); m_xkbInfo.caps_led = xkb_map_led_get_index(m_xkbInfo.keymap, XKB_LED_NAME_CAPS); m_xkbInfo.scroll_led = xkb_map_led_get_index(m_xkbInfo.keymap, XKB_LED_NAME_SCROLL); char *keymapStr = xkb_map_get_as_string(m_xkbInfo.keymap); if (keymapStr == NULL){ LOG_ERROR("WaylandX11InputEvent", "Failed to get string version of keymap"); return; } m_xkbInfo.keymap_size = strlen(keymapStr) + 1; m_xkbInfo.keymap_fd = createAnonymousFile(m_xkbInfo.keymap_size); if (m_xkbInfo.keymap_fd < 0){ LOG_WARNING("WaylandX11InputEvent", "Creating a keymap file for " << (unsigned long)m_xkbInfo.keymap_size << " bytes failed"); goto err_keymapStr; } m_xkbInfo.keymap_area = (char*)mmap(NULL, m_xkbInfo.keymap_size, PROT_READ | PROT_WRITE, MAP_SHARED, m_xkbInfo.keymap_fd, 0); if (m_xkbInfo.keymap_area == MAP_FAILED){ LOG_WARNING("WaylandX11InputEvent", "Failed to mmap() " << (unsigned long) m_xkbInfo.keymap_size << " bytes"); goto err_dev_zero; } strcpy(m_xkbInfo.keymap_area, keymapStr); free(keymapStr); return; err_dev_zero: close(m_xkbInfo.keymap_fd); m_xkbInfo.keymap_fd = -1; err_keymapStr: free(keymapStr); exit(EXIT_FAILURE); }
wl_buffer* createShmBuffer(wl_shm* shm, uint32_t width, uint32_t height) { int32_t stride = width * 4; int32_t size = stride * height; int fd = createAnonymousFile(size); mData = reinterpret_cast<uint8_t*>( mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)); if (mData == MAP_FAILED) { close(fd); throw WLException("Cannot create shm buffer"); } wl_shm_pool* pool = wl_shm_create_pool(shm, fd, size); wl_buffer* buff = wl_shm_pool_create_buffer(pool, 0, width, height, stride, WL_SHM_FORMAT_XRGB8888); wl_shm_pool_destroy(pool); close(fd); return buff; }
xdl_int XdevLWindowWayland::createBuffer() { // Couldn't create anonymous file. m_fd = createAnonymousFile(getWidth() * getHeight() * 4); if(-1 == m_fd) { XDEVL_MODULE_ERROR("mmap failed\n"); return ERR_ERROR; } // Couldn't map memory. m_shm_data = (xdl_uint8*)mmap(NULL, getWidth() * getHeight() * 4, PROT_READ | PROT_WRITE, MAP_SHARED, m_fd, 0); if(m_shm_data == MAP_FAILED) { XDEVL_MODULE_ERROR("mmap failed\n"); close(m_fd); return ERR_ERROR; } m_pool = wl_shm_create_pool(m_sharedMemory, m_fd, getWidth() * getHeight() * 4); m_buffer = wl_shm_pool_create_buffer(m_pool, 0, getWidth(), getHeight(), getWidth() * 4, WL_SHM_FORMAT_XRGB8888); wl_shm_pool_destroy(m_pool); return ERR_OK; }