/* this does not take owership of pointer_item, it makes a copy */ int APP_CC xrdp_cache_add_pointer_static(struct xrdp_cache *self, struct xrdp_pointer_item *pointer_item, int index) { if (self == 0) { return 0; } self->pointer_items[index].x = pointer_item->x; self->pointer_items[index].y = pointer_item->y; g_memcpy(self->pointer_items[index].data, pointer_item->data, 32 * 32 * 4); g_memcpy(self->pointer_items[index].mask, pointer_item->mask, 32 * 32 / 8); self->pointer_items[index].stamp = self->pointer_stamp; self->pointer_items[index].bpp = pointer_item->bpp; xrdp_wm_send_pointer(self->wm, index, self->pointer_items[index].data, self->pointer_items[index].mask, self->pointer_items[index].x, self->pointer_items[index].y, self->pointer_items[index].bpp); self->wm->current_pointer = index; DEBUG(("adding pointer at %d", index)); return index; }
/* added the pointer to the cache and send it to client, it also sets the client if it finds it returns the index in the cache does not take ownership of pointer_item */ int APP_CC xrdp_cache_add_pointer(struct xrdp_cache* self, struct xrdp_pointer_item* pointer_item) { int i; int oldest; int index; if (self == 0) { return 0; } self->pointer_stamp++; /* look for match */ for (i = 2; i < self->pointer_cache_entries; i++) { if (self->pointer_items[i].x == pointer_item->x && self->pointer_items[i].y == pointer_item->y && g_memcmp(self->pointer_items[i].data, pointer_item->data, 32 * 32 * 3) == 0 && g_memcmp(self->pointer_items[i].mask, pointer_item->mask, 32 * 32 / 8) == 0) { self->pointer_items[i].stamp = self->pointer_stamp; xrdp_wm_set_pointer(self->wm, i); self->wm->current_pointer = i; DEBUG(("found pointer at %d", i)); return i; } } /* look for oldest */ index = 2; oldest = 0x7fffffff; for (i = 2; i < self->pointer_cache_entries; i++) { if (self->pointer_items[i].stamp < oldest) { oldest = self->pointer_items[i].stamp; index = i; } } self->pointer_items[index].x = pointer_item->x; self->pointer_items[index].y = pointer_item->y; g_memcpy(self->pointer_items[index].data, pointer_item->data, 32 * 32 * 3); g_memcpy(self->pointer_items[index].mask, pointer_item->mask, 32 * 32 / 8); self->pointer_items[index].stamp = self->pointer_stamp; xrdp_wm_send_pointer(self->wm, index, self->pointer_items[index].data, self->pointer_items[index].mask, self->pointer_items[index].x, self->pointer_items[index].y); self->wm->current_pointer = index; DEBUG(("adding pointer at %d", index)); return index; }