void ZLEwlViewWidget::invertRegion(int x0, int y0, int x1, int y1, bool flush) { unsigned int pixel; for(int i = x0; i <= x1; i++) { for(int j = y0; j <= y1; j++) { pixel = 0xffffff & xcb_image_get_pixel(im, i, j); for(int idx = 0; idx < 4; idx++) { if(pixel == (0xffffff & pal[idx])) { xcb_image_put_pixel(im, i, j, pal[3 - idx]); break; } } } } uint8_t send_event; if(flush) send_event = 1; else send_event = 0; xcb_image_shm_put (connection, window, gc, im, shminfo, x0, y0, x0, y0, x1 - x0, y1 - y0, send_event); if(flush) xcb_flush(connection); }
void x_client_icon::update_wm_hints_icon(void) { xcb_free_pixmap(m_c(), m_wm_hints_icon); m_wm_hints_icon = XCB_NONE; xcb_generic_error_t * error; xcb_get_property_cookie_t c = xcb_icccm_get_wm_hints(m_c(), m_x_client.window()); xcb_get_property_reply_t * r = xcb_get_property_reply(m_c(), c, &error); if (error) { std::free(error); } else { xcb_icccm_wm_hints_t wm_hints; xcb_icccm_get_wm_hints_from_reply(&wm_hints, r); if (wm_hints.flags & XCB_ICCCM_WM_HINT_ICON_PIXMAP) { unsigned int width, height; { Window root; int x, y; unsigned int border_width, depth; XGetGeometry(m_c.dpy(), wm_hints.icon_pixmap, &root, &x, &y, &width, &height, &border_width, &depth); m_icon_geometry.first = width; m_icon_geometry.second = height; } xcb_image_t * icon_rgb = xcb_image_get(m_c(), wm_hints.icon_pixmap, 0, 0, width, height, 0xffffffff, XCB_IMAGE_FORMAT_XY_PIXMAP); xcb_image_t * icon_mask; if (wm_hints.flags & XCB_ICCCM_WM_HINT_ICON_MASK) { icon_mask = xcb_image_get(m_c(), wm_hints.icon_mask, 0, 0, width, height, 0xffffffff, XCB_IMAGE_FORMAT_XY_PIXMAP); } else { icon_mask = xcb_image_create_native( m_c(), width, height, XCB_IMAGE_FORMAT_Z_PIXMAP, 32, NULL, 0, NULL); std::memset(icon_mask->data, 0xff, width * height * (icon_mask->bpp / icon_mask->stride)); } xcb_image_t * icon_rgba = xcb_image_create_native( m_c(), width, height, XCB_IMAGE_FORMAT_Z_PIXMAP, 32, NULL, 0, NULL); for (std::size_t x = 0; x < width; ++x) { for (std::size_t y = 0; y < height; ++y) { uint32_t rgba = 0; if (xcb_image_get_pixel(icon_mask, x, y)) { uint32_t rgb = xcb_image_get_pixel(icon_rgb, x, y); uint8_t * s = (uint8_t *)&rgb; uint8_t * d = (uint8_t *)&rgba; d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; d[3] = 0xff; } xcb_image_put_pixel(icon_rgba, x, y, rgba); } } m_wm_hints_icon = xcb_generate_id(m_c()); xcb_create_pixmap( m_c(), 32, m_wm_hints_icon, m_c.root_window(), width, height); xcb_gcontext_t gc = xcb_generate_id(m_c()); xcb_create_gc(m_c(), gc, m_wm_hints_icon, 0, NULL); xcb_image_put(m_c(), m_wm_hints_icon, gc, icon_rgba, 0, 0, 0); xcb_image_destroy(icon_rgb); xcb_image_destroy(icon_mask); xcb_image_destroy(icon_rgba); xcb_free_gc(m_c(), gc); } } if (r) std::free(r); }