[Spice-devel] [PATCH win-vdagent] Don't refresh displays config when updating

Alon Levy alevy at redhat.com
Mon Jul 7 07:26:42 PDT 2014


On 06/19/2014 08:20 PM, Marc-André Lureau wrote:
> 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.
> 

ACK

nice comment ;)

> 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();
> 



More information about the Spice-devel mailing list