- 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
This commit is contained in:
parent
f4d936daa9
commit
ee30e70841
38
0007-spicec-Fix-info-layer-sometimes-not-showing.patch
Normal file
38
0007-spicec-Fix-info-layer-sometimes-not-showing.patch
Normal file
@ -0,0 +1,38 @@
|
||||
From 6fd1bbb846b0fc4b704c277ffa5974fc565ae05f Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
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
|
||||
|
55
0008-spicec-Remove-empty-show-hide-gui-functions.patch
Normal file
55
0008-spicec-Remove-empty-show-hide-gui-functions.patch
Normal file
@ -0,0 +1,55 @@
|
||||
From 8d6b124f2a0e4ab4e3d61415cec77038b94e517f Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
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
|
||||
|
@ -0,0 +1,40 @@
|
||||
From 0bb53766fae863b927f82d06eb85e4f5a8e25280 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
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
|
||||
|
@ -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 <hdegoede@redhat.com>
|
||||
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.
|
@ -0,0 +1,70 @@
|
||||
From 0e7a79ae11a905cee128c2429a7738fe43e30586 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
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
|
||||
|
@ -0,0 +1,43 @@
|
||||
From c8a034f2858f247d6a00ec1ad47de491b7e99575 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
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
|
||||
|
159
0013-spicec-Don-t-show-a-white-screen-if-guest-resolution.patch
Normal file
159
0013-spicec-Don-t-show-a-white-screen-if-guest-resolution.patch
Normal file
@ -0,0 +1,159 @@
|
||||
From 6437f11de2ceee2be932143c5f3779e232ec3415 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
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
|
||||
|
20
spice.spec
20
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 <hdegoede@redhat.com> - 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 <hdegoede@redhat.com> - 0.6.3-3
|
||||
- Log to ~/.spicec/cegui.log rather then to CEGUI.log in the cwd, this
|
||||
|
Loading…
Reference in New Issue
Block a user