~lukas-kde/qtmir/betterSessionManagement

« back to all changes in this revision

Viewing changes to src/platforms/mirserver/screensmodel.cpp

  • Committer: Lukáš Tinkl
  • Date: 2017-03-24 11:51:00 UTC
  • mfrom: (590.1.35 qtmir)
  • Revision ID: lukas.tinkl@canonical.com-20170324115100-n0itqdupc26qe6g6
merge trunk, resolve conflicts

Show diffs side-by-side

added added

removed removed

Lines of Context:
79
79
    qCDebug(QTMIR_SCREENS) << "ScreensModel::onCompositorStarting";
80
80
    m_compositing = true;
81
81
 
82
 
    update();
 
82
    update(); // must handle all hardware changes before starting the renderer
83
83
 
84
 
    // (Re)Start Qt's render thread by setting all windows with a corresponding screen to exposed.
85
 
    allWindowsSetExposed(true);
 
84
    startRenderer();
86
85
}
87
86
 
88
87
void ScreensModel::onCompositorStopping()
90
89
    qCDebug(QTMIR_SCREENS) << "ScreensModel::onCompositorStopping";
91
90
    m_compositing = false;
92
91
 
93
 
    // Stop Qt's render threads by setting all its windows it obscured. Must
94
 
    // block until all windows have their GL contexts released.
95
 
    allWindowsSetExposed(false);
 
92
    haltRenderer(); // must stop all rendering before handling any hardware changes
96
93
 
97
94
    update();
98
95
}
221
218
    return canUpdateExisting;
222
219
}
223
220
 
224
 
void ScreensModel::allWindowsSetExposed(bool exposed)
 
221
/*
 
222
 * ScreensModel::startRenderer()
 
223
 * (Re)Start Qt's render thread by setting all windows with a corresponding screen to exposed.
 
224
 * It is asynchronous, it returns before the render thread(s) have started.
 
225
 */
 
226
void ScreensModel::startRenderer()
 
227
{
 
228
    Q_FOREACH (const auto screen, m_screenList) {
 
229
        // Only set windows exposed on displays which are turned on, as the GL context Mir provided
 
230
        // is invalid in that situation
 
231
        if (screen->powerMode() == mir_power_mode_on) {
 
232
            const auto window = static_cast<ScreenWindow *>(screen->window());
 
233
            if (window && window->window()) {
 
234
                window->setExposed(true);
 
235
            }
 
236
        }
 
237
    }
 
238
}
 
239
 
 
240
/*
 
241
 * ScreensModel::haltRenderer()
 
242
 * Stop Qt's render thread(s) by setting all windows with a corresponding screen to not exposed.
 
243
 * It is blocking, it returns after the render thread(s) have all stopped.
 
244
 */
 
245
void ScreensModel::haltRenderer()
225
246
{
226
247
    Q_FOREACH (const auto screen, m_screenList) {
227
248
        const auto window = static_cast<ScreenWindow *>(screen->window());
228
249
        if (window && window->window()) {
229
 
            window->setExposed(exposed);
 
250
            window->setExposed(false);
230
251
        }
231
252
    }
232
253
}