static void red_dispatcher_set_display_peer(RedChannel *channel, RedClient *client, RedsStream *stream, int migration, int num_common_caps, uint32_t *common_caps, int num_caps, uint32_t *caps) { RedWorkerMessageDisplayConnect payload; RedDispatcher *dispatcher; spice_debug("%s", ""); dispatcher = (RedDispatcher *)channel->data; payload.client = client; payload.stream = stream; payload.migration = migration; payload.num_common_caps = num_common_caps; payload.common_caps = spice_malloc(sizeof(uint32_t)*num_common_caps); payload.num_caps = num_caps; payload.caps = spice_malloc(sizeof(uint32_t)*num_caps); memcpy(payload.common_caps, common_caps, sizeof(uint32_t)*num_common_caps); memcpy(payload.caps, caps, sizeof(uint32_t)*num_caps); dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_DISPLAY_CONNECT, &payload); }
static void red_dispatcher_reset_image_cache(RedDispatcher *dispatcher) { RedWorkerMessageResetImageCache payload; dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_RESET_IMAGE_CACHE, &payload); }
static void red_dispatcher_reset_cursor(RedDispatcher *dispatcher) { RedWorkerMessageResetCursor payload; dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_RESET_CURSOR, &payload); }
static void red_dispatcher_driver_unload(RedDispatcher *dispatcher) { RedWorkerMessageDriverUnload payload; dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_DRIVER_UNLOAD, &payload); }
static void red_dispatcher_destroy_surfaces(RedDispatcher *dispatcher) { RedWorkerMessageDestroySurfaces payload; dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_DESTROY_SURFACES, &payload); }
static void red_dispatcher_flush_surfaces_async(RedDispatcher *dispatcher, uint64_t cookie) { RedWorkerMessageFlushSurfacesAsync payload; RedWorkerMessage message = RED_WORKER_MESSAGE_FLUSH_SURFACES_ASYNC; payload.base.cmd = async_command_alloc(dispatcher, message, cookie); dispatcher_send_message(&dispatcher->dispatcher, message, &payload); }
static void red_dispatcher_stop(RedDispatcher *dispatcher) { RedWorkerMessageStop payload; dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_STOP, &payload); }
static void red_dispatcher_reset_memslots(RedDispatcher *dispatcher) { RedWorkerMessageResetMemslots payload; dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_RESET_MEMSLOTS, &payload); }
static void red_dispatcher_del_memslot(RedDispatcher *dispatcher, uint32_t slot_group_id, uint32_t slot_id) { RedWorkerMessageDelMemslot payload; RedWorkerMessage message = RED_WORKER_MESSAGE_DEL_MEMSLOT; payload.slot_group_id = slot_group_id; payload.slot_id = slot_id; dispatcher_send_message(&dispatcher->dispatcher, message, &payload); }
static void red_dispatcher_add_memslot_async(RedDispatcher *dispatcher, QXLDevMemSlot *mem_slot, uint64_t cookie) { RedWorkerMessageAddMemslotAsync payload; RedWorkerMessage message = RED_WORKER_MESSAGE_ADD_MEMSLOT_ASYNC; payload.base.cmd = async_command_alloc(dispatcher, message, cookie); payload.mem_slot = *mem_slot; dispatcher_send_message(&dispatcher->dispatcher, message, &payload); }
static void red_dispatcher_add_memslot(RedDispatcher *dispatcher, QXLDevMemSlot *mem_slot) { RedWorkerMessageAddMemslot payload; payload.mem_slot = *mem_slot; dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_ADD_MEMSLOT, &payload); }
static void red_dispatcher_destroy_surface_wait_sync(RedDispatcher *dispatcher, uint32_t surface_id) { RedWorkerMessageDestroySurfaceWait payload; payload.surface_id = surface_id; dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT, &payload); }
static void red_dispatcher_destroy_primary_surface_sync(RedDispatcher *dispatcher, uint32_t surface_id) { RedWorkerMessageDestroyPrimarySurface payload; payload.surface_id = surface_id; dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_DESTROY_PRIMARY_SURFACE, &payload); red_dispatcher_destroy_primary_surface_complete(dispatcher); }
static RedChannel *red_dispatcher_cursor_channel_create(RedDispatcher *dispatcher) { RedWorkerMessageCursorChannelCreate payload; RedChannel *cursor_channel; dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_CURSOR_CHANNEL_CREATE, &payload); receive_data(dispatcher->dispatcher.send_fd, &cursor_channel, sizeof(RedChannel *)); return cursor_channel; }
static void red_dispatcher_destroy_surface_wait_async(RedDispatcher *dispatcher, uint32_t surface_id, uint64_t cookie) { RedWorkerMessageDestroySurfaceWaitAsync payload; RedWorkerMessage message = RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT_ASYNC; payload.base.cmd = async_command_alloc(dispatcher, message, cookie); payload.surface_id = surface_id; dispatcher_send_message(&dispatcher->dispatcher, message, &payload); }
static RedChannel *red_dispatcher_display_channel_create(RedDispatcher *dispatcher) { RedWorkerMessageDisplayChannelCreate payload; RedChannel *display_channel; dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_DISPLAY_CHANNEL_CREATE, &payload); receive_data(dispatcher->dispatcher.send_fd, &display_channel, sizeof(RedChannel *)); return display_channel; }
void red_dispatcher_set_mouse_mode(uint32_t mode) { RedWorkerMessageSetMouseMode payload; RedDispatcher *now = dispatchers; while (now) { payload.mode = mode; dispatcher_send_message(&now->dispatcher, RED_WORKER_MESSAGE_SET_MOUSE_MODE, &payload); now = now->next; } }
static void red_dispatcher_oom(RedDispatcher *dispatcher) { RedWorkerMessageOom payload; if (test_bit(RED_WORKER_PENDING_OOM, dispatcher->pending)) { return; } set_bit(RED_WORKER_PENDING_OOM, &dispatcher->pending); dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_OOM, &payload); }
static void red_dispatcher_wakeup(RedDispatcher *dispatcher) { RedWorkerMessageWakeup payload; if (test_bit(RED_WORKER_PENDING_WAKEUP, dispatcher->pending)) { return; } set_bit(RED_WORKER_PENDING_WAKEUP, &dispatcher->pending); dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_WAKEUP, &payload); }
static void red_dispatcher_loadvm_commands(RedDispatcher *dispatcher, struct QXLCommandExt *ext, uint32_t count) { RedWorkerMessageLoadvmCommands payload; spice_printerr(""); payload.count = count; payload.ext = ext; dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_LOADVM_COMMANDS, &payload); }
static void red_dispatcher_create_primary_surface_async(RedDispatcher *dispatcher, uint32_t surface_id, QXLDevSurfaceCreate *surface, uint64_t cookie) { RedWorkerMessageCreatePrimarySurfaceAsync payload; RedWorkerMessage message = RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE_ASYNC; dispatcher->surface_create = *surface; payload.base.cmd = async_command_alloc(dispatcher, message, cookie); payload.surface_id = surface_id; payload.surface = *surface; dispatcher_send_message(&dispatcher->dispatcher, message, &payload); }
static void red_dispatcher_display_migrate(RedChannelClient *rcc) { RedWorkerMessageDisplayMigrate payload; RedDispatcher *dispatcher; if (!rcc->channel) { return; } dispatcher = (RedDispatcher *)rcc->channel->data; spice_printerr("channel type %u id %u", rcc->channel->type, rcc->channel->id); payload.rcc = rcc; dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_DISPLAY_MIGRATE, &payload); }
void red_dispatcher_on_sv_change(void) { RedWorkerMessageSetStreamingVideo payload; int compression_level = calc_compression_level(); RedDispatcher *now = dispatchers; while (now) { now->qxl->st->qif->set_compression_level(now->qxl, compression_level); payload.streaming_video = streaming_video; dispatcher_send_message(&now->dispatcher, RED_WORKER_MESSAGE_SET_STREAMING_VIDEO, &payload); now = now->next; } }
static void red_dispatcher_monitors_config_async(RedDispatcher *dispatcher, QXLPHYSICAL monitors_config, int group_id, uint64_t cookie) { RedWorkerMessageMonitorsConfigAsync payload; RedWorkerMessage message = RED_WORKER_MESSAGE_MONITORS_CONFIG_ASYNC; payload.base.cmd = async_command_alloc(dispatcher, message, cookie); payload.monitors_config = monitors_config; payload.group_id = group_id; dispatcher_send_message(&dispatcher->dispatcher, message, &payload); }
static void red_dispatcher_create_primary_surface_sync(RedDispatcher *dispatcher, uint32_t surface_id, QXLDevSurfaceCreate *surface) { RedWorkerMessageCreatePrimarySurface payload; dispatcher->surface_create = *surface; payload.surface_id = surface_id; payload.surface = *surface; dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE, &payload); red_dispatcher_create_primary_surface_complete(dispatcher); }
void red_dispatcher_on_ic_change(void) { RedWorkerMessageSetCompression payload; int compression_level = calc_compression_level(); RedDispatcher *now = dispatchers; while (now) { now->qxl->st->qif->set_compression_level(now->qxl, compression_level); payload.image_compression = image_compression; dispatcher_send_message(&now->dispatcher, RED_WORKER_MESSAGE_SET_COMPRESSION, &payload); now = now->next; } }
static void red_dispatcher_update_area(RedDispatcher *dispatcher, uint32_t surface_id, QXLRect *qxl_area, QXLRect *qxl_dirty_rects, uint32_t num_dirty_rects, uint32_t clear_dirty_region) { RedWorkerMessageUpdate payload; payload.surface_id = surface_id; payload.qxl_area = qxl_area; payload.qxl_dirty_rects = qxl_dirty_rects; payload.num_dirty_rects = num_dirty_rects; payload.clear_dirty_region = clear_dirty_region; dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_UPDATE, &payload); }
static void red_dispatcher_update_area_async(RedDispatcher *dispatcher, uint32_t surface_id, QXLRect *qxl_area, uint32_t clear_dirty_region, uint64_t cookie) { RedWorkerMessage message = RED_WORKER_MESSAGE_UPDATE_ASYNC; RedWorkerMessageUpdateAsync payload; payload.base.cmd = async_command_alloc(dispatcher, message, cookie); payload.surface_id = surface_id; payload.qxl_area = *qxl_area; payload.clear_dirty_region = clear_dirty_region; dispatcher_send_message(&dispatcher->dispatcher, message, &payload); }
static void red_dispatcher_disconnect_cursor_peer(RedChannelClient *rcc) { RedWorkerMessageCursorDisconnect payload; RedDispatcher *dispatcher; if (!rcc->channel) { return; } dispatcher = (RedDispatcher *)rcc->channel->data; spice_printerr(""); payload.rcc = rcc; dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_CURSOR_DISCONNECT, &payload); }
static void red_dispatcher_disconnect_display_peer(RedChannelClient *rcc) { RedWorkerMessageDisplayDisconnect payload; RedDispatcher *dispatcher; if (!rcc->channel) { return; } dispatcher = (RedDispatcher *)rcc->channel->data; spice_printerr(""); payload.rcc = rcc; // TODO: we turned it to be sync, due to client_destroy . Should we support async? - for this we will need ref count // for channels dispatcher_send_message(&dispatcher->dispatcher, RED_WORKER_MESSAGE_DISPLAY_DISCONNECT, &payload); }