void DisplayChannel::on_disconnect()
{
    if (surfaces_mngr.is_present_canvas(0)) {
        Canvas *canvas;

        canvas = surfaces_mngr.get_canvas(0);
        canvas->clear();
    }

    if (screen()) {
        screen()->set_update_interrupt_trigger(NULL);
    }

    AutoRef<DetachChannelsEvent> detach_channels(new DetachChannelsEvent(*this));
    get_client().push_event(*detach_channels);
    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);
    (*sync_event)->wait();
}
예제 #2
0
void RedClient::on_disconnect()
{
    _migrate.abort();
    _connection_id = 0;
    _application.deactivate_interval_timer(*_agent_timer);
    // todo: if migration remains not seemless, we shouldn't
    // resend monitors and display setting to the agent
    _agent_mon_config_sent = false;
    _agent_disp_config_sent = false;
    delete[] _agent_msg_data;
    _agent_msg_data = NULL;
    _agent_msg_pos = 0;
    _agent_tokens = 0;
    AutoRef<SyncEvent> sync_event(new SyncEvent());
    get_client().push_event(*sync_event);
    (*sync_event)->wait();
}