void xcbosd_expose(xcbosd *osd) { assert (osd); lprintf("expose (state:%d)\n", osd->clean ); switch (osd->mode) { case XCBOSD_SHAPED: xcb_shape_mask(osd->connection, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_BOUNDING, osd->u.shaped.window, 0, 0, osd->u.shaped.mask_bitmap); if( osd->clean==DRAWN ) { if( !osd->u.shaped.mapped ) { unsigned int stack_mode = XCB_STACK_MODE_ABOVE; xcb_configure_window(osd->connection, osd->u.shaped.window, XCB_CONFIG_WINDOW_STACK_MODE, &stack_mode); xcb_map_window(osd->connection, osd->u.shaped.window); } osd->u.shaped.mapped = 1; xcb_copy_area(osd->connection, osd->bitmap, osd->u.shaped.window, osd->gc, 0, 0, 0, 0, osd->width, osd->height); } else { if( osd->u.shaped.mapped ) xcb_unmap_window(osd->connection, osd->u.shaped.window); osd->u.shaped.mapped = 0; } break; case XCBOSD_COLORKEY: if( osd->clean!=UNDEFINED ) xcb_copy_area(osd->connection, osd->bitmap, osd->window, osd->gc, 0, 0, 0, 0, osd->width, osd->height); } }
static void _eventd_nd_xcb_surface_shape(EventdNdSurface *self) { EventdNdBackendContext *context = self->context; if ( context->compositing || ( ! context->shape ) ) return; xcb_pixmap_t shape_id; cairo_t *cr; cairo_surface_t *shape; shape_id = xcb_generate_id(context->xcb_connection); xcb_create_pixmap(context->xcb_connection, 1, shape_id, context->screen->root, self->width, self->height); shape = cairo_xcb_surface_create_for_bitmap(context->xcb_connection, context->screen, shape_id, self->width, self->height); cr = cairo_create(shape); cairo_set_source_rgba(cr, 1, 1, 1, 1); self->context->nd->notification_shape(self->notification, cr); cairo_destroy(cr); cairo_surface_destroy(shape); xcb_shape_mask(context->xcb_connection, XCB_SHAPE_SO_INTERSECT, XCB_SHAPE_SK_BOUNDING, self->window, 0, 0, shape_id); xcb_free_pixmap(context->xcb_connection, shape_id); }
/** * Sets the shape of the given window to the given pixmap. * @param dest_win The given window. * @param source_mask A 2-bit depth pixmap that provides the new shape of the window. * * Sets the shape of the window @p dest_win to the pixmap @p source_mask. * @ingroup Ecore_X_Shape_Group */ EAPI void ecore_x_window_shape_mask_set(Ecore_X_Window dest_win, Ecore_X_Pixmap source_mask) { #ifdef ECORE_XCB_SHAPE xcb_shape_mask(_ecore_xcb_conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_BOUNDING, dest_win, 0, 0, source_mask); #endif /* ECORE_XCB_SHAPE */ } /* ecore_x_window_shape_mask_set */