summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@redhat.com>2010-11-01 23:45:43 +0100
committerAlon Levy <alevy@redhat.com>2011-01-17 20:29:33 +0200
commite5bfed8194851cf9b096bf1c908e6d2c0f2e4472 (patch)
tree9840611fc7e24195d87c2d2566e65e5ec3955663
parentf0e27a2636361bc0336cdebd69a44ecde2752ca2 (diff)
downloadspice-e5bfed8194851cf9b096bf1c908e6d2c0f2e4472.tar.gz
spice-e5bfed8194851cf9b096bf1c908e6d2c0f2e4472.tar.xz
spice-e5bfed8194851cf9b096bf1c908e6d2c0f2e4472.zip
client inputs: stop blinking keyboard when out of focus
We could introduce another boolean to prevent changes, or just reuse _active_modifiers_event = true to prevent further update. Additionaly this patch restore the keyboard state when focusing out, which is fine when dealing with full remote desktop, but should be reconsidered if/when SPICE supports remote windows managed by client window manager for instance, imho.
-rw-r--r--client/inputs_channel.cpp14
-rw-r--r--client/inputs_channel.h2
2 files changed, 15 insertions, 1 deletions
diff --git a/client/inputs_channel.cpp b/client/inputs_channel.cpp
index 9ff5479f..c5275800 100644
--- a/client/inputs_channel.cpp
+++ b/client/inputs_channel.cpp
@@ -404,10 +404,14 @@ void InputsChannel::set_local_modifiers()
void InputsChannel::on_focus_in()
{
+ Lock lock(_update_modifiers_lock);
+ _active_modifiers_event = false;
+ _on_focus_modifiers = Platform::get_keyboard_lock_modifiers();
+
#ifdef SYNC_REMOTE_MODIFIERS
Message* message = new Message(SPICE_MSGC_INPUTS_KEY_MODIFIERS);
SpiceMsgcKeyModifiers modifiers;
- modifiers.modifiers = Platform::get_keyboard_lock_modifiers();
+ modifiers.modifiers = _on_focus_modifiers;
_marshallers->msgc_inputs_key_modifiers(message->marshaller(), &modifiers);
post_message(message);
#else
@@ -415,6 +419,14 @@ void InputsChannel::on_focus_in()
#endif
}
+void InputsChannel::on_focus_out()
+{
+ Lock lock(_update_modifiers_lock);
+ _active_modifiers_event = true;
+ _modifiers = _on_focus_modifiers;
+ set_local_modifiers();
+}
+
void InputsChannel::init_scan_code(int index)
{
ASSERT((index & 0x80) == 0);
diff --git a/client/inputs_channel.h b/client/inputs_channel.h
index 00e185ce..254ed450 100644
--- a/client/inputs_channel.h
+++ b/client/inputs_channel.h
@@ -34,6 +34,7 @@ public:
virtual void on_key_down(RedKey key);
virtual void on_key_up(RedKey key);
virtual void on_focus_in();
+ virtual void on_focus_out();
void on_mouse_position(int x, int y, int buttons_state, int display_id);
@@ -72,6 +73,7 @@ private:
bool _active_motion;
int _motion_count;
uint32_t _modifiers;
+ uint32_t _on_focus_modifiers;
Mutex _update_modifiers_lock;
bool _active_modifiers_event;