예제 #1
0
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);
}
예제 #2
0
 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;
 }
예제 #3
0
	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;
	}