summaryrefslogtreecommitdiffstats
path: root/client/display_channel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'client/display_channel.cpp')
-rw-r--r--client/display_channel.cpp31
1 files changed, 29 insertions, 2 deletions
diff --git a/client/display_channel.cpp b/client/display_channel.cpp
index 9f8fba80..0050a21c 100644
--- a/client/display_channel.cpp
+++ b/client/display_channel.cpp
@@ -60,7 +60,8 @@ public:
{
Application* app = (Application*)events_loop.get_owner();
_channel.destroy_canvas();
- _channel.screen()->set_mode(_width, _height, _depth);
+ _channel.screen()->lock_size();
+ _channel.screen()->resize(_width, _height);
_channel.create_canvas(app->get_canvas_types(), _width, _height, _depth);
}
@@ -71,6 +72,22 @@ private:
int _depth;
};
+class UnlockScreenEvent: public Event {
+public:
+ UnlockScreenEvent(RedScreen* screen)
+ : _screen (screen->ref())
+ {
+ }
+
+ virtual void response(AbstractProcessLoop& events_loop)
+ {
+ (*_screen)->unlock_size();
+ }
+
+private:
+ AutoRef<RedScreen> _screen;
+};
+
class DisplayMarkEvent: public Event {
public:
DisplayMarkEvent(int screen_id)
@@ -1088,9 +1105,14 @@ void DisplayChannel::on_disconnect()
if (screen()) {
screen()->set_update_interrupt_trigger(NULL);
}
+
AutoRef<DetachChannelsEvent> detach_channels(new DetachChannelsEvent(*this));
get_client().push_event(*detach_channels);
- detach_from_screen(get_client().get_application());
+ if (screen()) {
+ AutoRef<UnlockScreenEvent> unlock_event(new UnlockScreenEvent(screen()));
+ get_client().push_event(*unlock_event);
+ detach_from_screen(get_client().get_application());
+ }
get_client().deactivate_interval_timer(*_streams_timer);
AutoRef<SyncEvent> sync_event(new SyncEvent());
get_client().push_event(*sync_event);
@@ -1280,7 +1302,12 @@ void DisplayChannel::handle_reset(RedPeer::InMessage *message)
if (_canvas.get()) {
_canvas->clear();
}
+
AutoRef<ResetTimer> reset_timer(new ResetTimer(screen()->ref(), get_client()));
+
+ AutoRef<UnlockScreenEvent> unlock_event(new UnlockScreenEvent(screen()));
+ get_client().push_event(*unlock_event);
+
detach_from_screen(get_client().get_application());
_palette_cache.clear();