summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYonit Halperin <yhalperi@redhat.com>2011-08-25 15:03:30 +0300
committerYonit Halperin <yhalperi@redhat.com>2011-08-25 15:04:27 +0300
commit11fe46f1390adbaa67d83e4ec9cc20913b6519b3 (patch)
tree6b6f1912de84c3f1b956e59b9904723ea4adc5ba
parent6862c810f311ecc5c6cc945cb8c0104415aac765 (diff)
downloadspice-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.cpp41
-rw-r--r--client/application.h5
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);