In some circumstances, when one display is in fullscreen but others are not, the display regions can sometimes overlap (rhbz #1002156). There are other cases where the auto-align code lines up monitors in the wrong order because they are moved after they've been resized. In general, the root cause for all of these problems is that the SpiceMainChannel object doesn't know the exact size and position of all displays at the time when it is aligning monitors and sending down a new configuration. To solve this issue, introduce a new signal ('monitors-config-requested') that is emitted by the main channel immediately before it sends down a new configuration. Displays can listen to this signal and then update their current state within the signal handler so that the main channel has up-to-date information to use for configuring the monitors. --- Note that this is a (partial) alternative proposal since my earlier workaround (https://www.redhat.com/archives/virt-tools-list/2013-October/msg00010.html) was rejected. A full fix will also require a small patch to virt-viewer. gtk/channel-main.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/gtk/channel-main.c b/gtk/channel-main.c index c449e86..9f3f2b5 100644 --- a/gtk/channel-main.c +++ b/gtk/channel-main.c @@ -152,6 +152,7 @@ enum { SPICE_MAIN_CLIPBOARD_SELECTION_REQUEST, SPICE_MAIN_CLIPBOARD_SELECTION_RELEASE, SPICE_MIGRATION_STARTED, + SPICE_MAIN_MONITORS_CONFIG_REQUESTED, SPICE_MAIN_LAST_SIGNAL, }; @@ -707,6 +708,26 @@ static void spice_main_channel_class_init(SpiceMainChannelClass *klass) G_TYPE_UINT); /** + * SpiceMainChannel::monitors-config-requested: + * @main: the #SpiceMainChannel that emitted the signal + * + * Inform all displays that we're about to send a monitors config message + * down to the agent. This gives clients a chance to update their current + * size and position before the displays are reconfigured + * + * Since: 0.22 + **/ + signals[SPICE_MAIN_MONITORS_CONFIG_REQUESTED] = + g_signal_new("monitors-config-requested", + G_OBJECT_CLASS_TYPE(gobject_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + + /** * SpiceMainChannel::migration-started: * @main: the #SpiceMainChannel that emitted the signal * @session: a migration #SpiceSession @@ -790,7 +811,8 @@ static void do_emit_main_context(GObject *object, int signum, gpointer params) switch (signum) { case SPICE_MAIN_CLIPBOARD_RELEASE: case SPICE_MAIN_AGENT_UPDATE: - case SPICE_MAIN_MOUSE_UPDATE: { + case SPICE_MAIN_MOUSE_UPDATE: + case SPICE_MAIN_MONITORS_CONFIG_REQUESTED: { g_signal_emit(object, signals[signum], 0); break; } @@ -1065,6 +1087,11 @@ gboolean spice_main_send_monitor_config(SpiceMainChannel *channel) size_t size; g_return_val_if_fail(SPICE_IS_MAIN_CHANNEL(channel), FALSE); + + /* give all displays a chance to update their current position and size + * before we send the configuration down */ + g_signal_emit(channel, signals[SPICE_MAIN_MONITORS_CONFIG_REQUESTED], 0); + c = channel->priv; g_return_val_if_fail(c->agent_connected, FALSE); -- 1.8.3.1 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel