wnd_proc() is called during ChangeDisplaySettings(), when handling monitors config. However, calling get_displays() will overwrite the desired config. So, while updating from 1 to 4 enabled monitors, when the 2nd monitor config is enabled, the current config is read, and overwrite the rest of the config, so first time only 2nd monitor is enabled, second time, 3rd monitor etc. https://bugzilla.redhat.com/show_bug.cgi?id=1111144 --- vdagent/vdagent.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/vdagent/vdagent.cpp b/vdagent/vdagent.cpp index 15216d9..aa44383 100644 --- a/vdagent/vdagent.cpp +++ b/vdagent/vdagent.cpp @@ -148,6 +148,7 @@ private: bool _running; bool _desktop_switch; DesktopLayout* _desktop_layout; + bool _updating_display_config; DisplaySetting _display_setting; FileXfer _file_xfer; HANDLE _vio_serial; @@ -615,11 +616,14 @@ bool VDAgent::handle_mouse_event(VDAgentMouseState* state) bool VDAgent::handle_mon_config(VDAgentMonitorsConfig* mon_config, uint32_t port) { + VDAgent* a = _singleton; VDIChunk* reply_chunk; VDAgentMessage* reply_msg; VDAgentReply* reply; size_t display_count; + a->_updating_display_config = true; + display_count = _desktop_layout->get_display_count(); for (uint32_t i = 0; i < display_count; i++) { DisplayMode* mode = _desktop_layout->get_display(i); @@ -649,6 +653,10 @@ bool VDAgent::handle_mon_config(VDAgentMonitorsConfig* mon_config, uint32_t port _desktop_layout->set_displays(); } + a->_updating_display_config = false; + /* refresh again, in case something else changed */ + a->_desktop_layout->get_displays(); + DWORD msg_size = VD_MESSAGE_HEADER_SIZE + sizeof(VDAgentReply); reply_chunk = new_chunk(msg_size); if (!reply_chunk) { @@ -1439,7 +1447,8 @@ LRESULT CALLBACK VDAgent::wnd_proc(HWND hwnd, UINT message, WPARAM wparam, LPARA vd_printf("Display change"); // the desktop layout needs to be updated for the mouse // position to be scaled correctly - a->_desktop_layout->get_displays(); + if (!a->_updating_display_config) + a->_desktop_layout->get_displays(); break; case WM_TIMER: a->send_input(); -- 1.9.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel