int main(void) { xcb_window_t window; xcb_gcontext_t graphics_context; xcb_pixmap_t pixmap; connection = xcb_connect(NULL, NULL); // Callers need to use xcb_connection_has_error() to check for failure. screen = xcb_setup_roots_iterator(xcb_get_setup(connection)).data; window = create_window(); graphics_context = create_graphics_context(window); pixmap = xcb_create_pixmap_from_bitmap_data(connection, window, neko_bits, neko_width, neko_height, screen->root_depth, screen->black_pixel, screen->white_pixel, NULL); if(!pixmap) puts("NEKO ERROR"); xcb_flush(connection); event_loop(window, graphics_context, pixmap); puts("bye!"); return EXIT_SUCCESS; }
xcb_cursor_t create_cursor(xcb_connection_t *conn, xcb_screen_t *screen, xcb_window_t win, int choice) { xcb_pixmap_t bitmap; xcb_pixmap_t mask; xcb_cursor_t cursor; unsigned char *curs_bits; unsigned char *mask_bits; int curs_w, curs_h; switch (choice) { case CURS_NONE: curs_bits = curs_invisible_bits; mask_bits = curs_invisible_bits; curs_w = curs_invisible_width; curs_h = curs_invisible_height; break; case CURS_WIN: curs_bits = curs_windows_bits; mask_bits = mask_windows_bits; curs_w = curs_windows_width; curs_h = curs_windows_height; break; case CURS_DEFAULT: default: return XCB_NONE; /* XCB_NONE is xcb's way of saying "don't change the cursor" */ } bitmap = xcb_create_pixmap_from_bitmap_data(conn, win, curs_bits, curs_w, curs_h, 1, screen->white_pixel, screen->black_pixel, NULL); mask = xcb_create_pixmap_from_bitmap_data(conn, win, mask_bits, curs_w, curs_h, 1, screen->white_pixel, screen->black_pixel, NULL); cursor = xcb_generate_id(conn); xcb_create_cursor(conn, cursor, bitmap, mask, 65535, 65535, 65535, 0, 0, 0, 0, 0); xcb_free_pixmap(conn, bitmap); xcb_free_pixmap(conn, mask); return cursor; }
xcb_cursor_t QXcbCursor::createNonStandardCursor(int cshape) { xcb_cursor_t cursor = 0; xcb_connection_t *conn = xcb_connection(); if (cshape == Qt::BlankCursor) { xcb_pixmap_t cp = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(), cur_blank_bits, 16, 16, 1, 0, 0, 0); xcb_pixmap_t mp = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(), cur_blank_bits, 16, 16, 1, 0, 0, 0); cursor = xcb_generate_id(conn); xcb_create_cursor(conn, cursor, cp, mp, 0, 0, 0, 0xFFFF, 0xFFFF, 0xFFFF, 8, 8); } else if (cshape >= Qt::SizeVerCursor && cshape < Qt::SizeAllCursor) { int i = (cshape - Qt::SizeVerCursor) * 2; xcb_pixmap_t pm = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(), const_cast<uint8_t*>(cursor_bits16[i]), 16, 16, 1, 0, 0, 0); xcb_pixmap_t pmm = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(), const_cast<uint8_t*>(cursor_bits16[i + 1]), 16, 16, 1, 0, 0, 0); cursor = xcb_generate_id(conn); xcb_create_cursor(conn, cursor, pm, pmm, 0, 0, 0, 0xFFFF, 0xFFFF, 0xFFFF, 8, 8); } else if ((cshape >= Qt::SplitVCursor && cshape <= Qt::SplitHCursor) || cshape == Qt::WhatsThisCursor || cshape == Qt::BusyCursor) { int i = (cshape - Qt::SplitVCursor) * 2; xcb_pixmap_t pm = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(), const_cast<uint8_t*>(cursor_bits32[i]), 32, 32, 1, 0, 0, 0); xcb_pixmap_t pmm = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(), const_cast<uint8_t*>(cursor_bits32[i + 1]), 32, 32, 1, 0, 0, 0); int hs = (cshape == Qt::PointingHandCursor || cshape == Qt::WhatsThisCursor || cshape == Qt::BusyCursor) ? 0 : 16; cursor = xcb_generate_id(conn); xcb_create_cursor(conn, cursor, pm, pmm, 0, 0, 0, 0xFFFF, 0xFFFF, 0xFFFF, hs, hs); } else if (cshape == Qt::ForbiddenCursor) { int i = (cshape - Qt::ForbiddenCursor) * 2; xcb_pixmap_t pm = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(), const_cast<uint8_t*>(cursor_bits20[i]), 20, 20, 1, 0, 0, 0); xcb_pixmap_t pmm = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(), const_cast<uint8_t*>(cursor_bits20[i + 1]), 20, 20, 1, 0, 0, 0); cursor = xcb_generate_id(conn); xcb_create_cursor(conn, cursor, pm, pmm, 0, 0, 0, 0xFFFF, 0xFFFF, 0xFFFF, 10, 10); } else if (cshape == Qt::OpenHandCursor || cshape == Qt::ClosedHandCursor) { bool open = cshape == Qt::OpenHandCursor; xcb_pixmap_t pm = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(), const_cast<uint8_t*>(open ? openhand_bits : closedhand_bits), 16, 16, 1, 0, 0, 0); xcb_pixmap_t pmm = xcb_create_pixmap_from_bitmap_data(conn, m_screen->root(), const_cast<uint8_t*>(open ? openhandm_bits : closedhandm_bits), 16, 16, 1, 0, 0, 0); cursor = xcb_generate_id(conn); xcb_create_cursor(conn, cursor, pm, pmm, 0, 0, 0, 0xFFFF, 0xFFFF, 0xFFFF, 8, 8); } else if (cshape == Qt::DragCopyCursor || cshape == Qt::DragMoveCursor || cshape == Qt::DragLinkCursor) { QImage image = QGuiApplicationPrivate::instance()->getPixmapCursor(static_cast<Qt::CursorShape>(cshape)).toImage(); if (!image.isNull()) { xcb_pixmap_t pm = qt_xcb_XPixmapFromBitmap(m_screen, image); xcb_pixmap_t pmm = qt_xcb_XPixmapFromBitmap(m_screen, image.createAlphaMask()); cursor = xcb_generate_id(conn); xcb_create_cursor(conn, cursor, pm, pmm, 0, 0, 0, 0xFFFF, 0xFFFF, 0xFFFF, 8, 8); xcb_free_pixmap(conn, pm); xcb_free_pixmap(conn, pmm); } } return cursor; }