summaryrefslogtreecommitdiffstats
path: root/src/virt-viewer-session-spice.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/virt-viewer-session-spice.c')
-rw-r--r--src/virt-viewer-session-spice.c43
1 files changed, 25 insertions, 18 deletions
diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c
index f792294..eb0761d 100644
--- a/src/virt-viewer-session-spice.c
+++ b/src/virt-viewer-session-spice.c
@@ -85,7 +85,7 @@ static void virt_viewer_session_spice_channel_destroy(SpiceSession *s,
static void virt_viewer_session_spice_smartcard_insert(VirtViewerSession *session);
static void virt_viewer_session_spice_smartcard_remove(VirtViewerSession *session);
static gboolean virt_viewer_session_spice_fullscreen_auto_conf(VirtViewerSessionSpice *self);
-static void virt_viewer_session_spice_apply_monitor_geometry(VirtViewerSession *self, GdkRectangle *monitors, guint nmonitors);
+static void virt_viewer_session_spice_apply_monitor_geometry(VirtViewerSession *self, GHashTable *monitors);
static void virt_viewer_session_spice_clear_displays(VirtViewerSessionSpice *self)
{
@@ -966,9 +966,10 @@ virt_viewer_session_spice_fullscreen_auto_conf(VirtViewerSessionSpice *self)
GdkScreen *screen = gdk_screen_get_default();
SpiceMainChannel* cmain = virt_viewer_session_spice_get_main_channel(self);
VirtViewerApp *app = NULL;
- GdkRectangle *displays;
+ GHashTable *displays;
+ GHashTableIter iter;
+ gpointer key, value;
gboolean agent_connected;
- gint i;
GList *initial_displays, *l;
guint ndisplays;
@@ -1003,29 +1004,32 @@ virt_viewer_session_spice_fullscreen_auto_conf(VirtViewerSessionSpice *self)
initial_displays = virt_viewer_app_get_initial_displays(app);
ndisplays = g_list_length(initial_displays);
g_debug("Performing full screen auto-conf, %u host monitors", ndisplays);
- displays = g_new0(GdkRectangle, ndisplays);
+ displays = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free);
- for (i = 0, l = initial_displays; l != NULL; l = l->next, i++) {
- GdkRectangle* rect = &displays[i];
+ for (l = initial_displays; l != NULL; l = l->next) {
+ GdkRectangle* rect = g_new0(GdkRectangle, 1);;
gint j = virt_viewer_app_get_initial_monitor_for_display(app, GPOINTER_TO_INT(l->data));
if (j == -1)
continue;
gdk_screen_get_monitor_geometry(screen, j, rect);
+ g_hash_table_insert(displays, l->data, rect);
}
- g_list_free(initial_displays);
- virt_viewer_shift_monitors_to_origin(displays, ndisplays);
+ virt_viewer_shift_monitors_to_origin(displays);
- for (i = 0; i < ndisplays; i++) {
- GdkRectangle *rect = &displays[i];
+ g_hash_table_iter_init(&iter, displays);
+ while (g_hash_table_iter_next(&iter, &key, &value)) {
+ GdkRectangle *rect = value;
+ gint j = GPOINTER_TO_INT(key);
- spice_main_set_display(cmain, i, rect->x, rect->y, rect->width, rect->height);
- spice_main_set_display_enabled(cmain, i, TRUE);
+ spice_main_set_display(cmain, j, rect->x, rect->y, rect->width, rect->height);
+ spice_main_set_display_enabled(cmain, j, TRUE);
g_debug("Set SPICE display %d to (%d,%d)-(%dx%d)",
- i, rect->x, rect->y, rect->width, rect->height);
+ j, rect->x, rect->y, rect->width, rect->height);
}
- g_free(displays);
+ g_list_free(initial_displays);
+ g_hash_table_unref(displays);
spice_main_send_monitor_config(cmain);
self->priv->did_auto_conf = TRUE;
@@ -1109,13 +1113,16 @@ virt_viewer_session_spice_smartcard_remove(VirtViewerSession *session G_GNUC_UNU
}
static void
-virt_viewer_session_spice_apply_monitor_geometry(VirtViewerSession *session, GdkRectangle *monitors, guint nmonitors)
+virt_viewer_session_spice_apply_monitor_geometry(VirtViewerSession *session, GHashTable *monitors)
{
- guint i;
+ GHashTableIter iter;
+ gpointer key = NULL, value = NULL;
VirtViewerSessionSpice *self = VIRT_VIEWER_SESSION_SPICE(session);
- for (i = 0; i < nmonitors; i++) {
- GdkRectangle* rect = &monitors[i];
+ g_hash_table_iter_init(&iter, monitors);
+ while (g_hash_table_iter_next(&iter, &key, &value)) {
+ gint i = GPOINTER_TO_INT(key);
+ GdkRectangle* rect = value;
spice_main_set_display(self->priv->main_channel, i, rect->x,
rect->y, rect->width, rect->height);