I was playing with simple visual timer to help kids focus onto given task and needed a way to prevent a screen from turning off (aka blanking) during the countdown.
As it happens, this isn't very difficult, but information on how to do it is a bit scattered. As far as I know the method described below is allowed withing Jolla store, but I haven't published this timer yet (I'll need to add user-selectable countdowns first, in addition of fixed ones) so I can't be completely sure.
This can't be done (yet?) with QML only, so some C++ is required, but fortunately no deeper magic is required.
First, you'll need to create simple helper object that can be called fromQML.
Header (note: when working with Qt classes the class definition, even simple one like this, absolutely must be in external header (.h) file; you can't include it in .cpp file as it will fail mysteriously to compile. Want to guess how I found this out? *eye roll*)
class BlankPrevent : public QObject { Q_OBJECT public: Q_INVOKABLE void prevent(int prevent); };
Source:
void BlankPrevent::prevent(int prevent) { QDBusConnection system = QDBusConnection::connectToBus(QDBusConnection::SystemBus, "system"); QDBusInterface interface("com.nokia.mce", "/com/nokia/mce/request", "com.nokia.mce.request", system); if (prevent) { interface.call(QLatin1String("req_display_blanking_pause")); } else { interface.call(QLatin1String("req_display_cancel_blanking_pause")); } }
Above is shamelessly borrowed from this source, so credit where credit is due. Also you'll need add proper includes, as well as "QT += dbus" to your .pro file.
If your app is C++ only, you can simply call this function every now and then and it's done. From QML you'll need a bit more. First, add component registration to your C++ main();
qmlRegisterType("harbour.myapp.CustomComponents", 1, 0, "BlankPrevent");
And now it can be added as an item in your QML;
import harbour.myapp.CustomComponents 1.0 ... BlankPrevent { // as part of SilicaFlickable from example id: blanker } ... property int refresh: 0; Timer { interval: 15000; // adjust as needed running: true; repeat: true; onTriggered: { blanker.prevent(1); } }And done, your app will stay on as long as your app is on foreground. And do remember to call prevent(0) when you are done.
Ei kommentteja:
Lähetä kommentti