diff options
author | Yonit Halperin <yhalperi@redhat.com> | 2011-08-25 15:03:30 +0300 |
---|---|---|
committer | Yonit Halperin <yhalperi@redhat.com> | 2011-08-25 15:04:27 +0300 |
commit | 11fe46f1390adbaa67d83e4ec9cc20913b6519b3 (patch) | |
tree | 6b6f1912de84c3f1b956e59b9904723ea4adc5ba | |
parent | 6862c810f311ecc5c6cc945cb8c0104415aac765 (diff) | |
download | spice-11fe46f1390adbaa67d83e4ec9cc20913b6519b3.tar.gz spice-11fe46f1390adbaa67d83e4ec9cc20913b6519b3.tar.xz spice-11fe46f1390adbaa67d83e4ec9cc20913b6519b3.zip |
client: setting monitors resolution before resizing screens, RHBZ #728252
fix for "client: fix endless recursion in rearrange_monitors, RHBZ #692976"
-rw-r--r-- | client/application.cpp | 41 | ||||
-rw-r--r-- | client/application.h | 5 |
2 files changed, 34 insertions, 12 deletions
diff --git a/client/application.cpp b/client/application.cpp index b43cf1d2..b3a73bdb 100644 --- a/client/application.cpp +++ b/client/application.cpp @@ -1368,7 +1368,8 @@ void Application::on_screen_unlocked(RedScreen& screen) void Application::rearrange_monitors(bool force_capture, bool enter_full_screen, - RedScreen* screen) + RedScreen* screen, + std::vector<SpicePoint> *sizes) { bool capture; bool toggle_full_screen; @@ -1386,7 +1387,7 @@ void Application::rearrange_monitors(bool force_capture, hide(); } #endif - prepare_monitors(); + prepare_monitors(sizes); position_screens(); if (enter_full_screen) { // toggling to full screen @@ -1445,16 +1446,19 @@ void Application::assign_monitors() } } -void Application::prepare_monitors() +void Application::prepare_monitors(std::vector<SpicePoint> *sizes) { //todo: test match of monitors size/position against real world size/position for (int i = 0; i < (int)_screens.size(); i++) { Monitor* mon; if (_screens[i] && (mon = _screens[i]->get_monitor())) { - if (_screens[i]->is_size_locked()) { - SpicePoint size = _screens[i]->get_size(); - mon->set_mode(size.x, size.y); + if (sizes) { + mon->set_mode((*sizes)[i].x, (*sizes)[i].y); + } else { + SpicePoint size = _screens[i]->get_size(); + mon->set_mode(size.x, size.y); + } } else { SpicePoint size = mon->get_size(); _screens[i]->resize(size.x, size.y); @@ -1590,14 +1594,31 @@ bool Application::toggle_full_screen() void Application::resize_screen(RedScreen *screen, int width, int height) { - Monitor* mon; + std::vector<SpicePoint> sizes; + std::vector<SpicePoint> *p_sizes = NULL; + bool capture = false; + if (_full_screen) { - if ((mon = screen->get_monitor())) { - mon->set_mode(width, height); + capture = (_main_screen == screen) && _active_screen && + _active_screen->is_mouse_captured(); + sizes.resize(_screens.size()); + for (int i = 0; i < (int)_screens.size(); i++) { + if (_screens[i]) { + if (_screens[i] == screen) { + sizes[i].x = width; + sizes[i].y = height; + } else { + sizes[i] = _screens[i]->get_size(); + } + } } + p_sizes = &sizes; } + rearrange_monitors(false, false, NULL, p_sizes); screen->resize(width, height); - rearrange_monitors(false, false); + if (capture) { + screen->capture_mouse(); + } if (screen->is_out_of_sync()) { _out_of_sync = true; /* If the client monitor cannot handle the guest resolution diff --git a/client/application.h b/client/application.h index 80797531..c70c7fa2 100644 --- a/client/application.h +++ b/client/application.h @@ -306,10 +306,11 @@ private: void destroy_monitors(); void assign_monitors(); void restore_monitors(); - void prepare_monitors(); + void prepare_monitors(std::vector<SpicePoint> *sizes); void rearrange_monitors(bool force_capture, bool enter_full_screen, - RedScreen* screen = NULL); + RedScreen* screen = NULL, + std::vector<SpicePoint> *sizes = NULL); void position_screens(); void show_full_screen(); void send_key_down(RedKey key); |