[Spice-devel] [PATCH vdagent-win] vdagent: fix cursor position sync on multimon rhbz#757819
Alon Levy
alevy at redhat.com
Tue Jan 31 08:14:15 PST 2012
On Mon, Jan 23, 2012 at 12:59:22PM +0200, Arnon Gilboa wrote:
> On any change of the display settings, driven by client message or guest user,
> normalize all display positions to non-negative coordinates, and update total
> width and height of the virtual desktop.
>
> The bug was due to wrong handling of (non-primary) displays positioned on
> negative coordinates.
Looks good, but can you give a better example of how something goes
wrong in the patch comment?
ACK
> ---
> vdagent/desktop_layout.cpp | 52 +++++++++++++++++++++++++++----------------
> vdagent/desktop_layout.h | 1 +
> 2 files changed, 34 insertions(+), 19 deletions(-)
>
> diff --git a/vdagent/desktop_layout.cpp b/vdagent/desktop_layout.cpp
> index 0eada52..0ba7248 100644
> --- a/vdagent/desktop_layout.cpp
> +++ b/vdagent/desktop_layout.cpp
> @@ -44,10 +44,6 @@ void DesktopLayout::get_displays()
> DEVMODE mode;
> DWORD display_id;
> DWORD dev_id = 0;
> - LONG min_x = 0;
> - LONG min_y = 0;
> - LONG max_x = 0;
> - LONG max_y = 0;
> bool attached;
>
> lock();
> @@ -81,22 +77,10 @@ void DesktopLayout::get_displays()
> attached = !!(dev_info.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP);
> EnumDisplaySettings(dev_info.DeviceName, ENUM_CURRENT_SETTINGS, &mode);
> _displays[display_id] = new DisplayMode(mode.dmPosition.x, mode.dmPosition.y,
> - mode.dmPelsWidth, mode.dmPelsHeight,
> - mode.dmBitsPerPel, attached);
> - if (attached) {
> - min_x = min(min_x, mode.dmPosition.x);
> - min_y = min(min_y, mode.dmPosition.y);
> - max_x = max(max_x, mode.dmPosition.x + (LONG)mode.dmPelsWidth);
> - max_y = max(max_y, mode.dmPosition.y + (LONG)mode.dmPelsHeight);
> - }
> - }
> - if (min_x || min_y) {
> - for (Displays::iterator iter = _displays.begin(); iter != _displays.end(); iter++) {
> - (*iter)->move_pos(-min_x, -min_y);
> - }
> + mode.dmPelsWidth, mode.dmPelsHeight,
> + mode.dmBitsPerPel, attached);
> }
> - _total_width = max_x - min_x;
> - _total_height = max_y - min_y;
> + normalize_displays_pos();
> unlock();
> }
>
> @@ -147,10 +131,40 @@ void DesktopLayout::set_displays()
> }
> if (dev_sets) {
> ChangeDisplaySettingsEx(NULL, NULL, NULL, 0, NULL);
> + normalize_displays_pos();
> }
> unlock();
> }
>
> +// Normalize all display positions to non-negative coordinates and update total width and height of
> +// the virtual desktop. Caller is responsible to lock() & unlock().
> +void DesktopLayout::normalize_displays_pos()
> +{
> + Displays::iterator iter;
> + DisplayMode* mode;
> + LONG min_x = 0;
> + LONG min_y = 0;
> + LONG max_x = 0;
> + LONG max_y = 0;
> +
> + for (iter = _displays.begin(); iter != _displays.end(); iter++) {
> + mode = *iter;
> + if (mode->_attached) {
> + min_x = min(min_x, mode->_pos_x);
> + min_y = min(min_y, mode->_pos_y);
> + max_x = max(max_x, mode->_pos_x + (LONG)mode->_width);
> + max_y = max(max_y, mode->_pos_y + (LONG)mode->_height);
> + }
> + }
> + if (min_x || min_y) {
> + for (iter = _displays.begin(); iter != _displays.end(); iter++) {
> + (*iter)->move_pos(-min_x, -min_y);
> + }
> + }
> + _total_width = max_x - min_x;
> + _total_height = max_y - min_y;
> +}
> +
> bool DesktopLayout::consistent_displays()
> {
> DISPLAY_DEVICE dev_info;
> diff --git a/vdagent/desktop_layout.h b/vdagent/desktop_layout.h
> index caab84f..c43ff03 100644
> --- a/vdagent/desktop_layout.h
> +++ b/vdagent/desktop_layout.h
> @@ -73,6 +73,7 @@ public:
>
> private:
> void clean_displays();
> + void normalize_displays_pos();
> static bool consistent_displays();
> static bool is_attached(LPCTSTR dev_name);
> static bool get_qxl_device_id(WCHAR* device_key, DWORD* device_id);
> --
> 1.7.4.1
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
More information about the Spice-devel
mailing list