Skip to content

Commit

Permalink
[sailfish-webview] Send colour change notification when EmbedLiteView…
Browse files Browse the repository at this point in the history
… is initialised

Waits for the "embedliteviewcreated" notification to be observed before
sending out the initial colour scheme changed notification back to the
engine. This ensures the colour change notification will be received and
so the ambience state will be correct on browser starts up.
  • Loading branch information
llewelld authored and rainemak committed Sep 29, 2024
1 parent 21a9ef1 commit da2a436
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 6 deletions.
52 changes: 48 additions & 4 deletions lib/webenginesettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

#include "webengine.h"
#include "webenginesettings.h"
#include "webenginesettings_p.h"

#include <silicatheme.h>

Expand All @@ -28,6 +29,7 @@
#include "logging.h"

Q_GLOBAL_STATIC(SailfishOS::WebEngineSettings, webEngineSettingsInstance)
Q_GLOBAL_STATIC(SailfishOS::WebEngineSettingsPrivate, webEngineSettingsPrivateInstance)

#define SAILFISH_WEBENGINE_DEFAULT_PIXEL_RATIO 1.5

Expand Down Expand Up @@ -67,6 +69,21 @@ int getPressAndHoldDelay()

const int PressAndHoldDelay(getPressAndHoldDelay());

SailfishOS::WebEngineSettingsPrivate *SailfishOS::WebEngineSettingsPrivate::instance()
{
return webEngineSettingsPrivateInstance();
}

SailfishOS::WebEngineSettingsPrivate::WebEngineSettingsPrivate(QObject *parent)
: QObject(parent)
{
}

SailfishOS::WebEngineSettingsPrivate::~WebEngineSettingsPrivate()
{
}


/*!
\brief Initialises the WebEngineSettings class.
Expand Down Expand Up @@ -120,13 +137,20 @@ void SailfishOS::WebEngineSettings::initialize()

// Notify gecko when the ambience switches between light and dark
if (engineSettings->isInitialized()) {
engineSettings->notifyColorSchemeChanged();
engineSettings->d->notifyColorSchemeChanged();
} else {
connect(engineSettings, &QMozEngineSettings::initialized,
engineSettings, &SailfishOS::WebEngineSettings::notifyColorSchemeChanged);
engineSettings->d, &SailfishOS::WebEngineSettingsPrivate::notifyColorSchemeChanged);
}
connect(silicaTheme, &Silica::Theme::colorSchemeChanged,
engineSettings, &SailfishOS::WebEngineSettings::notifyColorSchemeChanged);
engineSettings->d, &SailfishOS::WebEngineSettingsPrivate::notifyColorSchemeChanged);

// Subscribe to gecko messages
// When the embedliteviewcreated notification is received the ambience notification will be sent again
SailfishOS::WebEngine *webEngine = SailfishOS::WebEngine::instance();
connect(webEngine, &SailfishOS::WebEngine::recvObserve,
engineSettings->d, &SailfishOS::WebEngineSettingsPrivate::oneShotNotifyColorSchemeChanged);
webEngine->addObserver(QStringLiteral("embedliteviewcreated"));

isInitialized = true;

Expand Down Expand Up @@ -215,7 +239,7 @@ void SailfishOS::WebEngineSettings::initialize()
\internal
\brief Notifies gecko about ambience color scheme changes.
*/
void SailfishOS::WebEngineSettings::notifyColorSchemeChanged()
void SailfishOS::WebEngineSettingsPrivate::notifyColorSchemeChanged()
{
Silica::Theme *silicaTheme = Silica::Theme::instance();
QString scheme = silicaTheme->colorScheme() == Silica::Theme::LightOnDark
Expand All @@ -224,6 +248,25 @@ void SailfishOS::WebEngineSettings::notifyColorSchemeChanged()
SailfishOS::WebEngine::instance()->notifyObservers(QStringLiteral("ambience-theme-changed"), scheme);
}

/*!
\internal
\brief Notifies gecko about ambience color scheme change and removes observer.
*/
void SailfishOS::WebEngineSettingsPrivate::oneShotNotifyColorSchemeChanged(const QString &message, const QVariant &data)
{
Q_UNUSED(data);
if (message == QLatin1String("embedliteviewcreated")) {
SailfishOS::WebEngine *webEngine = SailfishOS::WebEngine::instance();
// Remove the observer and disconnect the signal
webEngine->removeObserver(QStringLiteral("embedliteviewcreated"));
disconnect(webEngine, &SailfishOS::WebEngine::recvObserve,
this, &SailfishOS::WebEngineSettingsPrivate::oneShotNotifyColorSchemeChanged);

// Notify about the ambience state
notifyColorSchemeChanged();
}
}

/*!
\brief Returns the instance of the singleton WebEngineSettings class.
Expand All @@ -247,6 +290,7 @@ SailfishOS::WebEngineSettings *SailfishOS::WebEngineSettings::instance()
*/
SailfishOS::WebEngineSettings::WebEngineSettings(QObject *parent)
: QMozEngineSettings(parent)
, d(WebEngineSettingsPrivate::instance())
{
}

Expand Down
6 changes: 4 additions & 2 deletions lib/webenginesettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@

namespace SailfishOS {

class WebEngineSettingsPrivate;

class WebEngineSettings : public QMozEngineSettings
{
Q_OBJECT
Expand All @@ -31,8 +33,8 @@ class WebEngineSettings : public QMozEngineSettings
explicit WebEngineSettings(QObject *parent = 0);
virtual ~WebEngineSettings();

private slots:
void notifyColorSchemeChanged();
private:
WebEngineSettingsPrivate *d;
};

}
Expand Down
36 changes: 36 additions & 0 deletions lib/webenginesettings_p.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef SAILFISHOS_WEBENGINE_SETTINGS_P_H
#define SAILFISHOS_WEBENGINE_SETTINGS_P_H

#include <QObject>
#include <QString>
#include <webenginesettings.h>

#ifndef Q_QDOC

namespace SailfishOS {

class WebEngineSettingsPrivate : public QObject
{
Q_OBJECT

public:
static WebEngineSettingsPrivate * instance();

explicit WebEngineSettingsPrivate(QObject *parent = 0);
~WebEngineSettingsPrivate();

public slots:
void notifyColorSchemeChanged();
void oneShotNotifyColorSchemeChanged(const QString &message, const QVariant &data);

friend class WebEngineSettings;
};

}

#endif // !Q_QDOC
#endif // SAILFISHOS_WEBENGINE_SETTINGS_P_H

0 comments on commit da2a436

Please sign in to comment.