[Spice-devel] [PATCH 11/11] Get code more typesafe
Jonathon Jongsma
jjongsma at redhat.com
Fri May 20 20:50:53 UTC 2016
Acked-by: Jonathon Jongsma <jjongsma at redhat.com>
On Fri, 2016-05-20 at 14:01 +0100, Frediano Ziglio wrote:
> Scan remaining code searching for problems with structure
> layout assumptions in the code.
> Where code required some restructuring put some verify checks
> to make sure code won't compile if these assumptions are not
> in place anymore.
>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> server/cache-item.tmpl.c | 1 +
> server/cursor-channel.c | 4 ++--
> server/dcc-encoders.c | 2 +-
> server/dcc-send.c | 14 ++++++--------
> server/dcc.c | 5 +++--
> server/dispatcher.c | 3 +--
> server/display-channel.c | 26 ++++++++++++++------------
> server/image-cache.c | 7 +++++--
> server/main-channel.c | 5 ++---
> server/pixmap-cache.c | 3 ++-
> server/red-replay-qxl.c | 2 +-
> server/smartcard.c | 4 ++--
> server/tree.c | 12 +++++++-----
> server/tree.h | 8 ++++----
> 14 files changed, 51 insertions(+), 45 deletions(-)
>
> diff --git a/server/cache-item.tmpl.c b/server/cache-item.tmpl.c
> index 0617bea..0f22b35 100644
> --- a/server/cache-item.tmpl.c
> +++ b/server/cache-item.tmpl.c
> @@ -93,6 +93,7 @@ static int FUNC_NAME(add)(CHANNELCLIENT *channel_client,
> uint64_t id, size_t siz
> item = spice_new(RedCacheItem, 1);
>
> channel_client->VAR_NAME(available) -= size;
> + verify(SPICE_OFFSETOF(RedCacheItem, u.cache_data.lru_link) == 0);
> while (channel_client->VAR_NAME(available) < 0) {
> RedCacheItem *tail = (RedCacheItem *)ring_get_tail(&channel_client
> ->VAR_NAME(lru));
> if (!tail) {
> diff --git a/server/cursor-channel.c b/server/cursor-channel.c
> index c257654..23a8cb8 100644
> --- a/server/cursor-channel.c
> +++ b/server/cursor-channel.c
> @@ -321,10 +321,10 @@ static void cursor_channel_send_item(RedChannelClient
> *rcc, RedPipeItem *pipe_it
> cursor_marshall(rcc, m, SPICE_CONTAINEROF(pipe_item,
> RedCursorPipeItem, base));
> break;
> case RED_PIPE_ITEM_TYPE_INVAL_ONE:
> - red_marshall_inval(rcc, m, (RedCacheItem *)pipe_item);
> + red_marshall_inval(rcc, m, SPICE_CONTAINEROF(pipe_item, RedCacheItem,
> u.pipe_data));
> break;
> case RED_PIPE_ITEM_TYPE_VERB:
> - red_marshall_verb(rcc, (RedVerbItem*)pipe_item);
> + red_marshall_verb(rcc, SPICE_CONTAINEROF(pipe_item, RedVerbItem,
> base));
> break;
> case RED_PIPE_ITEM_TYPE_CURSOR_INIT:
> red_reset_cursor_cache(rcc);
> diff --git a/server/dcc-encoders.c b/server/dcc-encoders.c
> index f1dd1bb..65f5a17 100644
> --- a/server/dcc-encoders.c
> +++ b/server/dcc-encoders.c
> @@ -624,7 +624,7 @@ static GlzSharedDictionary *find_glz_dictionary(RedClient
> *client, uint8_t dict_
>
> now = &glz_dictionary_list;
> while ((now = ring_next(&glz_dictionary_list, now))) {
> - GlzSharedDictionary *dict = (GlzSharedDictionary *)now;
> + GlzSharedDictionary *dict = SPICE_CONTAINEROF(now,
> GlzSharedDictionary, base);
> if ((dict->client == client) && (dict->id == dict_id)) {
> ret = dict;
> break;
> diff --git a/server/dcc-send.c b/server/dcc-send.c
> index 44b8448..91adbd7 100644
> --- a/server/dcc-send.c
> +++ b/server/dcc-send.c
> @@ -2381,34 +2381,32 @@ void dcc_send_item(RedChannelClient *rcc, RedPipeItem
> *pipe_item)
> break;
> }
> case RED_PIPE_ITEM_TYPE_INVAL_ONE:
> - marshall_inval_palette(rcc, m, (RedCacheItem *)pipe_item);
> + marshall_inval_palette(rcc, m, SPICE_CONTAINEROF(pipe_item,
> RedCacheItem, u.pipe_data));
> break;
> case RED_PIPE_ITEM_TYPE_STREAM_CREATE: {
> StreamCreateDestroyItem *item = SPICE_CONTAINEROF(pipe_item,
> StreamCreateDestroyItem, base);
> marshall_stream_start(rcc, m, item->agent);
> break;
> }
> - case RED_PIPE_ITEM_TYPE_STREAM_CLIP: {
> - RedStreamClipItem* clip_item = (RedStreamClipItem *)pipe_item;
> - marshall_stream_clip(rcc, m, clip_item);
> + case RED_PIPE_ITEM_TYPE_STREAM_CLIP:
> + marshall_stream_clip(rcc, m, SPICE_CONTAINEROF(pipe_item,
> RedStreamClipItem, base));
> break;
> - }
> case RED_PIPE_ITEM_TYPE_STREAM_DESTROY: {
> StreamCreateDestroyItem *item = SPICE_CONTAINEROF(pipe_item,
> StreamCreateDestroyItem, base);
> marshall_stream_end(rcc, m, item->agent);
> break;
> }
> case RED_PIPE_ITEM_TYPE_UPGRADE:
> - marshall_upgrade(rcc, m, (RedUpgradeItem *)pipe_item);
> + marshall_upgrade(rcc, m, SPICE_CONTAINEROF(pipe_item, RedUpgradeItem,
> base));
> break;
> case RED_PIPE_ITEM_TYPE_VERB:
> - red_marshall_verb(rcc, (RedVerbItem*)pipe_item);
> + red_marshall_verb(rcc, SPICE_CONTAINEROF(pipe_item, RedVerbItem,
> base));
> break;
> case RED_PIPE_ITEM_TYPE_MIGRATE_DATA:
> display_channel_marshall_migrate_data(rcc, m);
> break;
> case RED_PIPE_ITEM_TYPE_IMAGE:
> - red_marshall_image(rcc, m, (RedImageItem *)pipe_item);
> + red_marshall_image(rcc, m, SPICE_CONTAINEROF(pipe_item, RedImageItem,
> base));
> break;
> case RED_PIPE_ITEM_TYPE_PIXMAP_SYNC:
> display_channel_marshall_pixmap_sync(rcc, m);
> diff --git a/server/dcc.c b/server/dcc.c
> index df5123b..66ac710 100644
> --- a/server/dcc.c
> +++ b/server/dcc.c
> @@ -90,7 +90,7 @@ int
> dcc_clear_surface_drawables_from_pipe(DisplayChannelClient *dcc, int surface
> dpi = SPICE_CONTAINEROF(item, RedDrawablePipeItem,
> dpi_pipe_item);
> drawable = dpi->drawable;
> } else if (item->type == RED_PIPE_ITEM_TYPE_UPGRADE) {
> - drawable = ((RedUpgradeItem *)item)->drawable;
> + drawable = SPICE_CONTAINEROF(item, RedUpgradeItem, base)
> ->drawable;
> } else {
> continue;
> }
> @@ -533,7 +533,7 @@ static RedMonitorsConfigItem
> *red_monitors_config_item_new(RedChannel* channel,
> {
> RedMonitorsConfigItem *mci;
>
> - mci = (RedMonitorsConfigItem *)spice_malloc(sizeof(*mci));
> + mci = spice_new(RedMonitorsConfigItem, 1);
> mci->monitors_config = monitors_config;
>
> red_pipe_item_init_full(&mci->pipe_item,
> RED_PIPE_ITEM_TYPE_MONITORS_CONFIG,
> @@ -1326,6 +1326,7 @@ int dcc_pixmap_cache_unlocked_add(DisplayChannelClient
> *dcc, uint64_t id,
> NewCacheItem *tail;
> NewCacheItem **now;
>
> + verify(SPICE_OFFSETOF(NewCacheItem, lru_link) == 0);
> if (!(tail = (NewCacheItem *)ring_get_tail(&cache->lru)) ||
> tail->sync[dcc->id] ==
> serial) {
> cache->available += size;
> diff --git a/server/dispatcher.c b/server/dispatcher.c
> index b9e23f6..8c55881 100644
> --- a/server/dispatcher.c
> +++ b/server/dispatcher.c
> @@ -299,8 +299,7 @@ static int dispatcher_handle_single_read(Dispatcher
> *dispatcher)
> /* TODO: close socketpair? */
> }
> } else if (msg->ack == DISPATCHER_ASYNC && dispatcher->priv
> ->handle_async_done) {
> - dispatcher->priv->handle_async_done(dispatcher->priv->opaque, type,
> - (void *)payload);
> + dispatcher->priv->handle_async_done(dispatcher->priv->opaque, type,
> payload);
> }
> return 1;
> }
> diff --git a/server/display-channel.c b/server/display-channel.c
> index 9f97911..96a6f2f 100644
> --- a/server/display-channel.c
> +++ b/server/display-channel.c
> @@ -390,7 +390,7 @@ static void current_remove(DisplayChannel *display,
> TreeItem *item)
> drawable_remove_from_pipes(drawable);
> current_remove_drawable(display, drawable);
> } else {
> - Container *container = (Container *)now;
> + Container *container = CONTAINER(now);
>
> spice_assert(now->type == TREE_ITEM_TYPE_CONTAINER);
>
> @@ -408,7 +408,7 @@ static void current_remove(DisplayChannel *display,
> TreeItem *item)
> if ((ring_item = ring_next(&container->items, ring_item))) {
> now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
> } else {
> - now = (TreeItem *)container;
> + now = &container->base;
> }
> }
> }
> @@ -433,7 +433,7 @@ static int current_add_equal(DisplayChannel *display,
> DrawItem *item, TreeItem *
> if (other->type != TREE_ITEM_TYPE_DRAWABLE) {
> return FALSE;
> }
> - other_draw_item = (DrawItem *)other;
> + other_draw_item = DRAW_ITEM(other);
>
> if (item->shadow || other_draw_item->shadow || item->effect !=
> other_draw_item->effect) {
> return FALSE;
> @@ -530,7 +530,7 @@ static void __exclude_region(DisplayChannel *display, Ring
> *ring, TreeItem *item
> region_and(&and_rgn, &item->rgn);
> if (!region_is_empty(&and_rgn)) {
> if (IS_DRAW_ITEM(item)) {
> - DrawItem *draw = (DrawItem *)item;
> + DrawItem *draw = DRAW_ITEM(item);
>
> if (draw->effect == QXL_EFFECT_OPAQUE) {
> region_exclude(rgn, &and_rgn);
> @@ -551,8 +551,8 @@ static void __exclude_region(DisplayChannel *display, Ring
> *ring, TreeItem *item
> region_exclude(&shadow->on_hold, &and_rgn);
> region_or(rgn, &and_rgn);
> // in flat representation of current, shadow is always
> his owner next
> - if (!tree_item_contained_by((TreeItem*)shadow,
> *top_ring)) {
> - *top_ring =
> tree_item_container_items((TreeItem*)shadow, ring);
> + if (!tree_item_contained_by(&shadow->base, *top_ring)) {
> + *top_ring = tree_item_container_items(&shadow->base,
> ring);
> }
> }
> } else {
> @@ -571,8 +571,8 @@ static void __exclude_region(DisplayChannel *display, Ring
> *ring, TreeItem *item
> region_exclude(rgn, &and_rgn);
> if ((shadow = tree_item_find_shadow(item))) {
> region_or(rgn, &shadow->on_hold);
> - if (!tree_item_contained_by((TreeItem*)shadow,
> *top_ring)) {
> - *top_ring =
> tree_item_container_items((TreeItem*)shadow, ring);
> + if (!tree_item_contained_by(&shadow->base, *top_ring)) {
> + *top_ring = tree_item_container_items(&shadow->base,
> ring);
> }
> }
> }
> @@ -580,7 +580,7 @@ static void __exclude_region(DisplayChannel *display, Ring
> *ring, TreeItem *item
> Shadow *shadow;
>
> spice_assert(item->type == TREE_ITEM_TYPE_SHADOW);
> - shadow = (Shadow *)item;
> + shadow = SHADOW(item);
> region_exclude(rgn, &and_rgn);
> region_or(&shadow->on_hold, &and_rgn);
> }
> @@ -615,13 +615,14 @@ static void exclude_region(DisplayChannel *display, Ring
> *ring, RingItem *ring_i
> ring_item = now->siblings_link.prev;
> current_remove(display, now);
> if (last && *last == now) {
> + verify(SPICE_OFFSETOF(TreeItem, siblings_link) == 0);
> *last = (TreeItem *)ring_next(ring, ring_item);
> }
> } else if (now->type == TREE_ITEM_TYPE_CONTAINER) {
> - Container *container = (Container *)now;
> + Container *container = CONTAINER(now);
> if ((ring_item = ring_get_head(&container->items))) {
> ring = &container->items;
> - spice_assert(((TreeItem *)ring_item)->container);
> + spice_assert(SPICE_CONTAINEROF(ring_item, TreeItem,
> siblings_link)->container);
> continue;
> }
> ring_item = &now->siblings_link;
> @@ -633,6 +634,7 @@ static void exclude_region(DisplayChannel *display, Ring
> *ring, RingItem *ring_i
> }
> }
>
> + verify(SPICE_OFFSETOF(TreeItem, siblings_link) == 0);
> while ((last && *last == (TreeItem *)ring_item) ||
> !(ring_item = ring_next(ring, ring_item))) {
> if (ring == top_ring) {
> @@ -755,7 +757,7 @@ static int current_add(DisplayChannel *display, Ring
> *ring, Drawable *drawable)
> exclude_base = NULL;
> }
> if (sibling->type == TREE_ITEM_TYPE_CONTAINER) {
> - container = (Container *)sibling;
> + container = CONTAINER(sibling);
> ring = &container->items;
> item->base.container = container;
> now = ring_next(ring, ring);
> diff --git a/server/image-cache.c b/server/image-cache.c
> index 4237034..8fb090f 100644
> --- a/server/image-cache.c
> +++ b/server/image-cache.c
> @@ -74,11 +74,12 @@ static void image_cache_remove(ImageCache *cache,
> ImageCacheItem *item)
>
> static void image_cache_put(SpiceImageCache *spice_cache, uint64_t id,
> pixman_image_t *image)
> {
> - ImageCache *cache = (ImageCache *)spice_cache;
> + ImageCache *cache = SPICE_CONTAINEROF(spice_cache, ImageCache, base);
> ImageCacheItem *item;
>
> #ifndef IMAGE_CACHE_AGE
> if (cache->num_items == IMAGE_CACHE_MAX_ITEMS) {
> + verify(SPICE_OFFSETOF(ImageCacheItem, lru_link) == 0);
> ImageCacheItem *tail = (ImageCacheItem *)ring_get_tail(&cache->lru);
> spice_assert(tail);
> image_cache_remove(cache, tail);
> @@ -103,7 +104,7 @@ static void image_cache_put(SpiceImageCache *spice_cache,
> uint64_t id, pixman_im
>
> static pixman_image_t *image_cache_get(SpiceImageCache *spice_cache, uint64_t
> id)
> {
> - ImageCache *cache = (ImageCache *)spice_cache;
> + ImageCache *cache = SPICE_CONTAINEROF(spice_cache, ImageCache,base);
>
> ImageCacheItem *item = image_cache_find(cache, id);
> if (!item) {
> @@ -133,6 +134,7 @@ void image_cache_reset(ImageCache *cache)
> {
> ImageCacheItem *item;
>
> + verify(SPICE_OFFSETOF(ImageCacheItem, lru_link) == 0);
> while ((item = (ImageCacheItem *)ring_get_head(&cache->lru))) {
> image_cache_remove(cache, item);
> }
> @@ -145,6 +147,7 @@ void image_cache_reset(ImageCache *cache)
>
> void image_cache_aging(ImageCache *cache)
> {
> + verify(SPICE_OFFSETOF(ImageCacheItem, lru_link) == 0);
> #ifdef IMAGE_CACHE_AGE
> ImageCacheItem *item;
>
> diff --git a/server/main-channel.c b/server/main-channel.c
> index e89af97..ca2d6d9 100644
> --- a/server/main-channel.c
> +++ b/server/main-channel.c
> @@ -314,10 +314,9 @@ static void main_notify_item_free(RedPipeItem *base)
> free(data);
> }
>
> -static RedPipeItem *main_notify_item_new(RedChannelClient *rcc, void *data,
> int num)
> +static RedPipeItem *main_notify_item_new(RedChannelClient *rcc, const char
> *msg, int num)
> {
> RedNotifyPipeItem *item = spice_malloc(sizeof(RedNotifyPipeItem));
> - const char *msg = data;
>
> red_pipe_item_init_full(&item->base, RED_PIPE_ITEM_TYPE_MAIN_NOTIFY,
> main_notify_item_free);
> @@ -585,7 +584,7 @@ void main_channel_client_push_uuid(MainChannelClient *mcc,
> const uint8_t uuid[16
>
> void main_channel_client_push_notify(MainChannelClient *mcc, const char *msg)
> {
> - RedPipeItem *item = main_notify_item_new(&mcc->base, (void *)msg, 1);
> + RedPipeItem *item = main_notify_item_new(&mcc->base, msg, 1);
> red_channel_client_pipe_add_push(&mcc->base, item);
> }
>
> diff --git a/server/pixmap-cache.c b/server/pixmap-cache.c
> index a485268..6b818d8 100644
> --- a/server/pixmap-cache.c
> +++ b/server/pixmap-cache.c
> @@ -46,6 +46,7 @@ void pixmap_cache_clear(PixmapCache *cache)
> cache->freezed = FALSE;
> }
>
> + verify(SPICE_OFFSETOF(NewCacheItem, lru_link) == 0);
> while ((item = (NewCacheItem *)ring_get_head(&cache->lru))) {
> ring_remove(&item->lru_link);
> free(item);
> @@ -113,7 +114,7 @@ PixmapCache *pixmap_cache_get(RedClient *client, uint8_t
> id, int64_t size)
>
> now = &pixmap_cache_list;
> while ((now = ring_next(&pixmap_cache_list, now))) {
> - PixmapCache *cache = (PixmapCache *)now;
> + PixmapCache *cache = SPICE_CONTAINEROF(now, PixmapCache, base);
> if ((cache->client == client) && (cache->id == id)) {
> ret = cache;
> ret->refs++;
> diff --git a/server/red-replay-qxl.c b/server/red-replay-qxl.c
> index 60e4183..17019f8 100644
> --- a/server/red-replay-qxl.c
> +++ b/server/red-replay-qxl.c
> @@ -369,7 +369,7 @@ static QXLImage *red_replay_image(SpiceReplay *replay,
> uint32_t flags)
> return NULL;
> }
>
> - qxl = (QXLImage*)spice_malloc0(sizeof(QXLImage));
> + qxl = spice_new0(QXLImage, 1);
> replay_fscanf(replay, "descriptor.id %"PRIu64"\n", &qxl->descriptor.id);
> replay_fscanf(replay, "descriptor.type %d\n", &temp); qxl
> ->descriptor.type = temp;
> replay_fscanf(replay, "descriptor.flags %d\n", &temp); qxl
> ->descriptor.flags = temp;
> diff --git a/server/smartcard.c b/server/smartcard.c
> index 9280038..f68ce48 100644
> --- a/server/smartcard.c
> +++ b/server/smartcard.c
> @@ -440,7 +440,7 @@ static void smartcard_channel_send_data(RedChannelClient
> *rcc, SpiceMarshaller *
> static void smartcard_channel_send_error(
> RedChannelClient *rcc, SpiceMarshaller *m, RedPipeItem *item)
> {
> - RedErrorItem* error_item = (RedErrorItem*)item;
> + RedErrorItem* error_item = SPICE_CONTAINEROF(item, RedErrorItem, base);
>
> smartcard_channel_send_data(rcc, m, item, &error_item->vheader);
> }
> @@ -448,7 +448,7 @@ static void smartcard_channel_send_error(
> static void smartcard_channel_send_msg(RedChannelClient *rcc,
> SpiceMarshaller *m, RedPipeItem *item)
> {
> - RedMsgItem* msg_item = (RedMsgItem*)item;
> + RedMsgItem* msg_item = SPICE_CONTAINEROF(item, RedMsgItem, base);
>
> smartcard_channel_send_data(rcc, m, item, msg_item->vheader);
> }
> diff --git a/server/tree.c b/server/tree.c
> index 9e5a281..7da8d7d 100644
> --- a/server/tree.c
> +++ b/server/tree.c
> @@ -153,7 +153,7 @@ static void dump_item(TreeItem *item, void *data)
> }
> case TREE_ITEM_TYPE_CONTAINER:
> di->level++;
> - di->container = (Container *)item;
> + di->container = CONTAINER(item);
> break;
> case TREE_ITEM_TYPE_SHADOW:
> break;
> @@ -168,7 +168,7 @@ static void tree_foreach(TreeItem *item, void
> (*f)(TreeItem *, void *), void * d
> f(item, data);
>
> if (item->type == TREE_ITEM_TYPE_CONTAINER) {
> - Container *container = (Container*)item;
> + Container *container = CONTAINER(item);
> RingItem *it;
>
> RING_FOREACH(it, &container->items) {
> @@ -240,6 +240,7 @@ void container_cleanup(Container *container)
> while (container && container->items.next == container->items.prev) {
> Container *next = container->base.container;
> if (container->items.next != &container->items) {
> + verify(SPICE_OFFSETOF(TreeItem, siblings_link) == 0);
> TreeItem *item = (TreeItem *)ring_get_head(&container->items);
> spice_assert(item);
> ring_remove(&item->siblings_link);
> @@ -255,7 +256,8 @@ void container_cleanup(Container *container)
> Shadow* tree_item_find_shadow(TreeItem *item)
> {
> while (item->type == TREE_ITEM_TYPE_CONTAINER) {
> - if (!(item = (TreeItem *)ring_get_tail(&((Container *)item)->items)))
> {
> + verify(SPICE_OFFSETOF(TreeItem, siblings_link) == 0);
> + if (!(item = (TreeItem *)ring_get_tail(&CONTAINER(item)->items))) {
> return NULL;
> }
> }
> @@ -264,7 +266,7 @@ Shadow* tree_item_find_shadow(TreeItem *item)
> return NULL;
> }
>
> - return ((DrawItem *)item)->shadow;
> + return DRAW_ITEM(item)->shadow;
> }
>
> Ring *tree_item_container_items(TreeItem *item, Ring *ring)
> @@ -280,7 +282,7 @@ int tree_item_contained_by(TreeItem *item, Ring *ring)
> if (now == ring) {
> return TRUE;
> }
> - } while ((item = (TreeItem *)item->container));
> + } while ((item = &item->container->base));
>
> return FALSE;
> }
> diff --git a/server/tree.h b/server/tree.h
> index 5260ce8..e8da58d 100644
> --- a/server/tree.h
> +++ b/server/tree.h
> @@ -54,7 +54,7 @@ struct Shadow {
> };
>
> #define IS_SHADOW(item) ((item)->type == TREE_ITEM_TYPE_SHADOW)
> -#define SHADOW(item) ((Shadow*)(item))
> +#define SHADOW(item) SPICE_CONTAINEROF(item, Shadow, base)
>
> struct Container {
> TreeItem base;
> @@ -62,7 +62,7 @@ struct Container {
> };
>
> #define IS_CONTAINER(item) ((item)->type == TREE_ITEM_TYPE_CONTAINER)
> -#define CONTAINER(item) ((Container*)(item))
> +#define CONTAINER(item) SPICE_CONTAINEROF(item, Container, base)
>
> struct DrawItem {
> TreeItem base;
> @@ -72,12 +72,12 @@ struct DrawItem {
> };
>
> #define IS_DRAW_ITEM(item) ((item)->type == TREE_ITEM_TYPE_DRAWABLE)
> -#define DRAW_ITEM(item) ((DrawItem*)(item))
> +#define DRAW_ITEM(item) SPICE_CONTAINEROF(item, DrawItem, base)
>
> static inline int is_opaque_item(TreeItem *item)
> {
> return item->type == TREE_ITEM_TYPE_CONTAINER ||
> - (IS_DRAW_ITEM(item) && ((DrawItem *)item)->effect ==
> QXL_EFFECT_OPAQUE);
> + (IS_DRAW_ITEM(item) && DRAW_ITEM(item)->effect == QXL_EFFECT_OPAQUE);
> }
>
> void tree_item_dump (TreeItem *item);
More information about the Spice-devel
mailing list