From ee30e70841fdd3b43ed3db204cdb164beef988ce Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Thu, 25 Nov 2010 12:17:56 +0100 Subject: [PATCH] - Fix the info layer not showing when used through the XPI - Do not let the connection gui flash by when a hostname has been specified on the cmdline - Fix spice client locking up when dealing with XIM input (#654265) - Fix modifier keys getting stuck (#655048) - Fix spice client crashing when dealing with XIM ibus input (#655836) - Fix spice client only showing a white screen in full screen mode --- ...Fix-info-layer-sometimes-not-showing.patch | 38 +++++ ...Remove-empty-show-hide-gui-functions.patch | 55 ++++++ ...w-gui-when-connection-info-is-specif.patch | 40 +++++ ...-few-missing-XLockDisplay-calls-rhbz.patch | 4 +- ...odifier-keys-getting-stuck-rhbz-6550.patch | 70 ++++++++ ...nhandled-exception-no-window-proc-cr.patch | 43 +++++ ...w-a-white-screen-if-guest-resolution.patch | 159 ++++++++++++++++++ spice.spec | 20 ++- 8 files changed, 426 insertions(+), 3 deletions(-) create mode 100644 0007-spicec-Fix-info-layer-sometimes-not-showing.patch create mode 100644 0008-spicec-Remove-empty-show-hide-gui-functions.patch create mode 100644 0009-spicec-Don-t-show-gui-when-connection-info-is-specif.patch rename 0007-spicec-x11-Add-a-few-missing-XLockDisplay-calls-rhbz.patch => 0010-spicec-x11-Add-a-few-missing-XLockDisplay-calls-rhbz.patch (91%) create mode 100644 0011-spicec-x11-Fix-modifier-keys-getting-stuck-rhbz-6550.patch create mode 100644 0012-spicec-x11-Fix-unhandled-exception-no-window-proc-cr.patch create mode 100644 0013-spicec-Don-t-show-a-white-screen-if-guest-resolution.patch diff --git a/0007-spicec-Fix-info-layer-sometimes-not-showing.patch b/0007-spicec-Fix-info-layer-sometimes-not-showing.patch new file mode 100644 index 0000000..13c1758 --- /dev/null +++ b/0007-spicec-Fix-info-layer-sometimes-not-showing.patch @@ -0,0 +1,38 @@ +From 6fd1bbb846b0fc4b704c277ffa5974fc565ae05f Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 9 Nov 2010 11:24:59 +0100 +Subject: [PATCH spice 1/7] spicec: Fix info layer sometimes not showing + +Currently we are calling show_info_layer from hide_gui in application.cpp, but +there are 2 cases where this does not happen: + +1) When compiled without gui support hide_gui is a complete nop, so we never + show the info layer when compiled without gui support +2) When run with --controller we never show the gui, and hide_gui + checks if there is a gui to hide as the first thing and if not returns + resulting in show_info_layer not being called, and thus the info layer + not showing when launched from the xpi + +This patch fixes both by adding a call to show_info_layer from +on_visibility_start note that on_visibility_start also calls hide_gui, +so in some cases show_info_layer may be called twice, this is not a +problem as show_info_layer is protected against this. +--- + client/application.cpp | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +diff --git a/client/application.cpp b/client/application.cpp +index d5b24a7..7ef2c78 100644 +--- a/client/application.cpp ++++ b/client/application.cpp +@@ -854,6 +854,7 @@ void Application::on_visibility_start(int screen_id) + } + set_state(VISIBILITY); + hide_gui(); ++ show_info_layer(); + } + + void Application::on_disconnecting() +-- +1.7.3.2 + diff --git a/0008-spicec-Remove-empty-show-hide-gui-functions.patch b/0008-spicec-Remove-empty-show-hide-gui-functions.patch new file mode 100644 index 0000000..db854a0 --- /dev/null +++ b/0008-spicec-Remove-empty-show-hide-gui-functions.patch @@ -0,0 +1,55 @@ +From 8d6b124f2a0e4ab4e3d61415cec77038b94e517f Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 9 Nov 2010 11:32:07 +0100 +Subject: [PATCH spice 2/7] spicec: Remove empty show / hide gui functions + +When compiling without gui support just don't call show / hide +gui, rather then making them stubs, this makes it easier to follow what is +going on. +--- + client/application.cpp | 4 ++++ + client/application.h | 4 ---- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/client/application.cpp b/client/application.cpp +index 7ef2c78..2701641 100644 +--- a/client/application.cpp ++++ b/client/application.cpp +@@ -841,7 +841,9 @@ void Application::on_disconnected(int error_code) + + // todo: display special notification for host switch (during migration) + set_state(DISCONNECTED); ++#ifdef USE_GUI + show_gui(); ++#endif + if (host_switch) { + _client.connect(true); + } +@@ -853,7 +855,9 @@ void Application::on_visibility_start(int screen_id) + return; + } + set_state(VISIBILITY); ++#ifdef USE_GUI + hide_gui(); ++#endif + show_info_layer(); + } + +diff --git a/client/application.h b/client/application.h +index 19c68a5..0e761ec 100644 +--- a/client/application.h ++++ b/client/application.h +@@ -322,10 +322,6 @@ private: + void create_gui_barrier(RedScreen& screen, int id); + void destroyed_gui_barrier(int id); + void destroyed_gui_barriers(); +-#else // USE_GUI +- void show_gui() {} +- void hide_gui() {} +- + #endif // USE_GUI + + // returns the press value before operation (i.e., if it was already pressed) +-- +1.7.3.2 + diff --git a/0009-spicec-Don-t-show-gui-when-connection-info-is-specif.patch b/0009-spicec-Don-t-show-gui-when-connection-info-is-specif.patch new file mode 100644 index 0000000..7389dc6 --- /dev/null +++ b/0009-spicec-Don-t-show-gui-when-connection-info-is-specif.patch @@ -0,0 +1,40 @@ +From 0bb53766fae863b927f82d06eb85e4f5a8e25280 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 9 Nov 2010 11:45:41 +0100 +Subject: [PATCH spice 3/7] spicec: Don't show gui when connection info is specified on the cmdline + +Currently when compiled with the gui enabled if you specify a host to connect +to on the cmdline the gui flashes by (show_gui gets called, then the connect +handler calls hide_gui as soon as the connection is made). + +This patch removes this ugly flashing by of the gui. +--- + client/application.cpp | 10 ++++------ + 1 files changed, 4 insertions(+), 6 deletions(-) + +diff --git a/client/application.cpp b/client/application.cpp +index 2701641..4b22e1f 100644 +--- a/client/application.cpp ++++ b/client/application.cpp +@@ -602,14 +602,12 @@ void Application::on_start_running() + } + //FIXME: _client.connect() or use the following instead? + #ifdef USE_GUI +- if (_gui_mode != GUI_MODE_FULL) { +- connect(); ++ if (_gui_mode == GUI_MODE_FULL) { ++ show_gui(); ++ return; + } +- +- show_gui(); +-#else +- connect(); + #endif // HAVE_GUI ++ connect(); + } + + RedScreen* Application::find_screen(int id) +-- +1.7.3.2 + diff --git a/0007-spicec-x11-Add-a-few-missing-XLockDisplay-calls-rhbz.patch b/0010-spicec-x11-Add-a-few-missing-XLockDisplay-calls-rhbz.patch similarity index 91% rename from 0007-spicec-x11-Add-a-few-missing-XLockDisplay-calls-rhbz.patch rename to 0010-spicec-x11-Add-a-few-missing-XLockDisplay-calls-rhbz.patch index 7cbc8cb..ad6e804 100644 --- a/0007-spicec-x11-Add-a-few-missing-XLockDisplay-calls-rhbz.patch +++ b/0010-spicec-x11-Add-a-few-missing-XLockDisplay-calls-rhbz.patch @@ -1,7 +1,7 @@ -From 084225fda75be2bead6e2dad313b9e861d93bffc Mon Sep 17 00:00:00 2001 +From c5a903b6655f4f6dacb333fa897d60636aa92d58 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Wed, 17 Nov 2010 12:19:41 +0100 -Subject: [PATCH spice] spicec-x11: Add a few missing XLockDisplay calls (rhbz#654265) +Subject: [PATCH spice 4/7] spicec-x11: Add a few missing XLockDisplay calls (rhbz#654265) The XIM functions end up waiting for a reply from the server, so they need locking around them. Idem for the XLookupString call. diff --git a/0011-spicec-x11-Fix-modifier-keys-getting-stuck-rhbz-6550.patch b/0011-spicec-x11-Fix-modifier-keys-getting-stuck-rhbz-6550.patch new file mode 100644 index 0000000..413a4ab --- /dev/null +++ b/0011-spicec-x11-Fix-modifier-keys-getting-stuck-rhbz-6550.patch @@ -0,0 +1,70 @@ +From 0e7a79ae11a905cee128c2429a7738fe43e30586 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Mon, 22 Nov 2010 16:09:15 +0100 +Subject: [PATCH spice 5/7] spicec-x11: Fix modifier keys getting stuck (rhbz#655048) + +Currently modifier keys (ctrl, alt) can get stuck when using the x11 client. +To reproduce under gnome: +-focus the client window without causing it to grab the keyborad (click on + the title bar not the window) +-press crlt + alt + right arrow to switch virtual desktop +-press crlt + alt + left arrow to switch back +-notice ctrl + alt are stuck pressed + +What is happening here is: +-We get a focus out event, caused by the hotkey combi key grab, focus event + notify mode == NotifyGrab, and release all keys -> good +-We get another focus out event, as we really loose the focus. + notify mode == NotifyWhileGrabbed, which we ignore as we already lost + focus before +-We get a focus in event, as the focus is returning to us, but we don't + really have the focus yet, as the hotkey combi key grab is still active + (ie ctrl + alt are still pressed). + We now sync the vm's modifier key state with the current X-server state, + telling the vm ctrl + alt are pressed. Note we do this by directly reading + the X-server keyboard status, we are not getting any key press events from the + X-server -> bad +-We get another focus in event, as we really get the focus back, + notify mode == NotifyUngrab. We ignore this one as already have gained the + focus before. If we were to sync the vm modifier state here, all would be + well we would no longer see the modifier keys pressed, or if we would we + would get a release event when they get released (testing has shown both). + +The solution here is to ignore the first focus in event, and do the modifier +sync on the second focus in event, or more in general to ignore focus events +where notify mode == NotifyWhileGrabbed. +--- + client/x11/red_window.cpp | 10 ++++++++++ + 1 files changed, 10 insertions(+), 0 deletions(-) + +diff --git a/client/x11/red_window.cpp b/client/x11/red_window.cpp +index c50e307..6e8cd58 100644 +--- a/client/x11/red_window.cpp ++++ b/client/x11/red_window.cpp +@@ -866,6 +866,11 @@ void RedWindow_p::win_proc(XEvent& event) + break; + } + case FocusIn: ++ /* Ignore focus events caused by grabbed (hotkeys) */ ++ if (event.xfocus.mode == NotifyWhileGrabbed) { ++ break; ++ } ++ + if (event.xany.serial < focus_serial) { + DBG(0, "Ignored FocusIn win=%p (serial=%d, Last foucs serial=%d)", + red_window, event.xany.serial, focus_serial); +@@ -886,6 +891,11 @@ void RedWindow_p::win_proc(XEvent& event) + } + break; + case FocusOut: ++ /* Ignore focus events caused by grabbed (hotkeys) */ ++ if (event.xfocus.mode == NotifyWhileGrabbed) { ++ break; ++ } ++ + if (event.xany.serial <= focus_serial) { + DBG(0, "Ignored FocusOut win=%p (serial=%d, Last foucs serial=%d)", + red_window, event.xany.serial, focus_serial); +-- +1.7.3.2 + diff --git a/0012-spicec-x11-Fix-unhandled-exception-no-window-proc-cr.patch b/0012-spicec-x11-Fix-unhandled-exception-no-window-proc-cr.patch new file mode 100644 index 0000000..268edca --- /dev/null +++ b/0012-spicec-x11-Fix-unhandled-exception-no-window-proc-cr.patch @@ -0,0 +1,43 @@ +From c8a034f2858f247d6a00ec1ad47de491b7e99575 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 23 Nov 2010 15:32:15 +0100 +Subject: [PATCH spice 6/7] spicec-x11: Fix unhandled exception: no window proc crash (rhbz#655836) + +When XIM + ibus is in use XIM creates an invisible window for its own +purposes, we sometimes get a _GTK_LOAD_ICONTHEMES ClientMessage event on +this window. Since this window was not explicitly created by spicec, it +does not have a Window Context (with the event handling function for the +window in question) set. This would cause spicec to throw an unhandled +exception and exit. + +This patch replaces the exception throwing with silently ignoring +ClientMessage events on Windows without a Context and logging a warning +for other event types. +--- + client/x11/platform.cpp | 10 +++++++++- + 1 files changed, 9 insertions(+), 1 deletions(-) + +diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp +index 2009817..334a74f 100644 +--- a/client/x11/platform.cpp ++++ b/client/x11/platform.cpp +@@ -295,7 +295,15 @@ void XEventHandler::on_event() + } + + if (XFindContext(&_x_display, event.xany.window, _win_proc_context, &proc_pointer)) { +- THROW("no window proc"); ++ /* When XIM + ibus is in use XIM creates an invisible window for ++ its own purposes, we sometimes get a _GTK_LOAD_ICONTHEMES ++ ClientMessage event on this window -> skip logging. */ ++ if (event.type != ClientMessage) { ++ LOG_WARN( ++ "Event on window without a win proc, type: %d, window: %u", ++ event.type, (unsigned int)event.xany.window); ++ } ++ continue; + } + XUnlockDisplay(x_display); + ((XPlatform::win_proc_t)proc_pointer)(event); +-- +1.7.3.2 + diff --git a/0013-spicec-Don-t-show-a-white-screen-if-guest-resolution.patch b/0013-spicec-Don-t-show-a-white-screen-if-guest-resolution.patch new file mode 100644 index 0000000..3b7297a --- /dev/null +++ b/0013-spicec-Don-t-show-a-white-screen-if-guest-resolution.patch @@ -0,0 +1,159 @@ +From 6437f11de2ceee2be932143c5f3779e232ec3415 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 23 Nov 2010 21:07:56 +0100 +Subject: [PATCH spice 7/7] spicec: Don't show a white screen if guest resolution does not fit fullscreen + +Currently when going / starting fullscreen if the guest resolution for one of +the monitors is higher then that monitor on the client can handle, we show a +white screen. Leaving the user stuck (unless they know the fullscreen key +switch combi) with a white screen when starting the client fullscreen from +the XPI. + +This patch changes the client to fall back to windowed mode in this case +instead. +--- + client/application.cpp | 30 ++++++++++++++++++++++++++++++ + client/application.h | 2 ++ + client/display_channel.cpp | 2 +- + client/screen.h | 2 +- + 4 files changed, 34 insertions(+), 2 deletions(-) + +diff --git a/client/application.cpp b/client/application.cpp +index 4b22e1f..c380373 100644 +--- a/client/application.cpp ++++ b/client/application.cpp +@@ -348,6 +348,7 @@ Application::Application() + , _active (false) + , _full_screen (false) + , _changing_screens (false) ++ , _out_of_sync (false) + , _exit_code (0) + , _active_screen (NULL) + , _num_keys_pressed (0) +@@ -674,6 +675,12 @@ RedScreen* Application::get_screen(int id) + prepare_monitors(); + position_screens(); + screen->show_full_screen(); ++ if (screen->is_out_of_sync()) { ++ _out_of_sync = true; ++ /* If the client monitor cannot handle the guest resolution ++ drop back to windowed mode */ ++ exit_full_screen(); ++ } + + if (capture) { + _main_screen->activate(); +@@ -1492,6 +1499,9 @@ void Application::show_full_screen() + for (int i = 0; i < (int)_screens.size(); i++) { + if (_screens[i]) { + _screens[i]->show_full_screen(); ++ if (_screens[i]->is_out_of_sync()) { ++ _out_of_sync = true; ++ } + } + } + } +@@ -1512,6 +1522,11 @@ void Application::enter_full_screen() + } + _changing_screens = false; + _full_screen = true; ++ /* If the client monitor cannot handle the guest resolution drop back ++ to windowed mode */ ++ if (_out_of_sync) { ++ exit_full_screen(); ++ } + } + + void Application::restore_screens_size() +@@ -1529,6 +1544,9 @@ void Application::exit_full_screen() + if (!_full_screen) { + return; + } ++ if (_out_of_sync) { ++ LOG_WARN("Falling back to windowed mode (guest resolution too large for client?)"); ++ } + LOG_INFO(""); + _changing_screens = true; + release_capture(); +@@ -1544,6 +1562,7 @@ void Application::exit_full_screen() + } + } + _full_screen = false; ++ _out_of_sync = false; + restore_screens_size(); + show(); + _main_screen->activate(); +@@ -1560,6 +1579,17 @@ bool Application::toggle_full_screen() + return _full_screen; + } + ++void Application::resize_screen(RedScreen *screen, int width, int height) ++{ ++ screen->resize(width, height); ++ if (screen->is_out_of_sync()) { ++ _out_of_sync = true; ++ /* If the client monitor cannot handle the guest resolution ++ drop back to windowed mode */ ++ exit_full_screen(); ++ } ++} ++ + void Application::minimize() + { + for (int i = 0; i < (int)_screens.size(); i++) { +diff --git a/client/application.h b/client/application.h +index 0e761ec..5a5a488 100644 +--- a/client/application.h ++++ b/client/application.h +@@ -217,6 +217,7 @@ public: + void enter_full_screen(); + void exit_full_screen(); + bool toggle_full_screen(); ++ void resize_screen(RedScreen *screen, int width, int height); + void minimize(); + void set_title(const std::string& title); + void hide(); +@@ -352,6 +353,7 @@ private: + bool _active; + bool _full_screen; + bool _changing_screens; ++ bool _out_of_sync; + int _exit_code; + RedScreen* _active_screen; + bool _keyboard_state[REDKEY_NUM_KEYS]; +diff --git a/client/display_channel.cpp b/client/display_channel.cpp +index c371f4a..1d5ebf3 100644 +--- a/client/display_channel.cpp ++++ b/client/display_channel.cpp +@@ -57,7 +57,7 @@ public: + { + Application* app = (Application*)events_loop.get_owner(); + _channel.screen()->lock_size(); +- _channel.screen()->resize(_width, _height); ++ app->resize_screen(_channel.screen(), _width, _height); + _channel.create_canvas(0, app->get_canvas_types(), _width, _height, _format); + } + +diff --git a/client/screen.h b/client/screen.h +index d81ebf8..2b40d77 100644 +--- a/client/screen.h ++++ b/client/screen.h +@@ -78,6 +78,7 @@ public: + void set_monitor(Monitor *monitor) { _monitor = monitor;} + Monitor* get_monitor() { return _monitor;} + RedWindow* get_window() { return &_window;} ++ bool is_out_of_sync() { return _out_of_sync;} + void set_cursor(LocalCursor* cursor); + void hide_cursor(); + void exit_full_screen(); +@@ -118,7 +119,6 @@ private: + void notify_new_size(); + void adjust_window_rect(int x, int y); + void save_position(); +- bool is_out_of_sync() { return _out_of_sync;} + void __show_full_screen(); + + bool _invalidate(const SpiceRect& rect, bool urgent, uint64_t& update_mark); +-- +1.7.3.2 + diff --git a/spice.spec b/spice.spec index 739146b..a3059a4 100644 --- a/spice.spec +++ b/spice.spec @@ -13,7 +13,13 @@ Patch3: 0003-Remove-no-longer-used-wstring_printf-functions.patch Patch4: 0004-spicec-x11-Do-not-set-_NET_WM_USER_TIME-to-0-on-star.patch Patch5: 0005-spicec-x11-Listen-for-selection-owner-window-destroy.patch Patch6: 0006-spicec-Make-cegui-log-to-app_data_dir-cegui.log.patch -Patch7: 0007-spicec-x11-Add-a-few-missing-XLockDisplay-calls-rhbz.patch +Patch7: 0007-spicec-Fix-info-layer-sometimes-not-showing.patch +Patch8: 0008-spicec-Remove-empty-show-hide-gui-functions.patch +Patch9: 0009-spicec-Don-t-show-gui-when-connection-info-is-specif.patch +Patch10: 0010-spicec-x11-Add-a-few-missing-XLockDisplay-calls-rhbz.patch +Patch11: 0011-spicec-x11-Fix-modifier-keys-getting-stuck-rhbz-6550.patch +Patch12: 0012-spicec-x11-Fix-unhandled-exception-no-window-proc-cr.patch +Patch13: 0013-spicec-Don-t-show-a-white-screen-if-guest-resolution.patch # https://bugzilla.redhat.com/show_bug.cgi?id=613529 ExclusiveArch: i686 x86_64 @@ -78,6 +84,12 @@ using spice-server, you will need to install spice-server-devel. %patch5 -p1 %patch6 -p1 %patch7 -p1 +%patch8 -p1 +%patch9 -p1 +%patch10 -p1 +%patch11 -p1 +%patch12 -p1 +%patch13 -p1 %build %configure --enable-gui @@ -121,7 +133,13 @@ rm -f %{buildroot}%{_libdir}/libspice-server.la %changelog * Wed Nov 17 2010 Hans de Goede - 0.6.3-4 +- Fix the info layer not showing when used through the XPI +- Do not let the connection gui flash by when a hostname has been specified + on the cmdline - Fix spice client locking up when dealing with XIM input (#654265) +- Fix modifier keys getting stuck (#655048) +- Fix spice client crashing when dealing with XIM ibus input (#655836) +- Fix spice client only showing a white screen in full screen mode * Sat Nov 6 2010 Hans de Goede - 0.6.3-3 - Log to ~/.spicec/cegui.log rather then to CEGUI.log in the cwd, this