aboutsummaryrefslogtreecommitdiff
path: root/src/mainwindow.cpp
diff options
context:
space:
mode:
authorLibravatar Keshav <keshavnrj@gmail.com>2022-05-10 10:09:53 +0530
committerLibravatar Keshav <keshavnrj@gmail.com>2022-05-10 10:17:26 +0530
commit81faa022735b155ac0773e1cc849474a0719c523 (patch)
tree81dd2ce375ab7696511b44555861fae8392bab60 /src/mainwindow.cpp
parent8c0df6d34bba406e4d8e2711e4f5134a24107b2e (diff)
downloadwhatsie-81faa022735b155ac0773e1cc849474a0719c523.tar.gz
whatsie-81faa022735b155ac0773e1cc849474a0719c523.zip
feat: implement IPC & other improvements
- lets run only one instance of application - lets pass arguments from secondary instances to main instance - open new chat without reloading page - restore application with commandline argument to secondary instance: example: whatsie whatsapp://whatsie will restore the primary instance of whatsie process
Diffstat (limited to 'src/mainwindow.cpp')
-rw-r--r--src/mainwindow.cpp98
1 files changed, 66 insertions, 32 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index b828593..f32d24b 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -128,8 +128,8 @@ void MainWindow::initRateWidget() {
}
void MainWindow::runMinimized() {
- this->minimizeAction->trigger();
- notify("Whatsie", "Whatsie started minimized in tray");
+ this->minimizeAction->trigger();
+ notify("Whatsie", "Whatsie started minimized in tray. Click to Open.");
}
MainWindow::~MainWindow() { webEngine->deleteLater(); }
@@ -137,12 +137,6 @@ MainWindow::~MainWindow() { webEngine->deleteLater(); }
void MainWindow::loadAppWithArgument(const QString &arg) {
// https://faq.whatsapp.com/iphone/how-to-link-to-whatsapp-from-a-different-app/?lang=en
- // The WhatsApp Messenger application
- if (arg.contains("://app")) {
- this->show(); // restore app
- return;
- }
-
// PASSED SCHEME whatsapp://send?text=Hello%2C%20World!&phone=919568388397"
// CONVERTED URI
// https://web.whatsapp.com/send?phone=919568388397&text=Hello%2C%20World New
@@ -151,15 +145,28 @@ void MainWindow::loadAppWithArgument(const QString &arg) {
QString newArg = arg;
newArg = newArg.replace("?", "&");
QUrlQuery query(newArg);
- QString phone, phoneStr, text, textStr, urlStr;
- // create send url equivalent
+
+ static QString phone, phoneStr, text, textStr, urlStr;
phone = query.queryItemValue("phone");
text = query.queryItemValue("text");
- phoneStr = phone.isEmpty() ? "" : "phone=" + phone;
- textStr = text.isEmpty() ? "" : "text=" + text;
- urlStr = "https://web.whatsapp.com/send?" + phoneStr + "&" + textStr;
- this->webEngine->page()->load(QUrl(urlStr));
- return;
+
+ webEngine->page()->runJavaScript(
+ "openNewChatWhatsieDefined()", [this](const QVariant &result) {
+ if (result.toString().contains("true")) {
+ this->webEngine->page()->runJavaScript(
+ QString("openNewChatWhatsie(\"%1\",\"%2\")").arg(phone, text));
+ this->notify(QApplication::applicationName(),
+ "New chat with " + phoneStr +
+ " is ready. Click to Open.");
+ } else {
+ // create send url equivalent
+ phoneStr = phone.isEmpty() ? "" : "phone=" + phone;
+ textStr = text.isEmpty() ? "" : "text=" + text;
+ urlStr =
+ "https://web.whatsapp.com/send?" + phoneStr + "&" + textStr;
+ this->webEngine->page()->load(QUrl(urlStr));
+ }
+ });
}
}
@@ -198,7 +205,9 @@ void MainWindow::updateWindowTheme() {
}
QList<QWidget *> widgets = this->findChildren<QWidget *>();
- foreach (QWidget *w, widgets) { w->setPalette(qApp->palette()); }
+ foreach (QWidget *w, widgets) {
+ w->setPalette(qApp->palette());
+ }
setNotificationPresenter(webEngine->page()->profile());
if (lockWidget != nullptr) {
@@ -485,19 +494,19 @@ void MainWindow::notify(QString title, QString message) {
if (windowState().testFlag(Qt::WindowMinimized) ||
!windowState().testFlag(Qt::WindowActive)) {
activateWindow();
- //raise();
+ // raise();
this->show();
}
});
} else {
auto popup = new NotificationPopup(webEngine);
connect(popup, &NotificationPopup::notification_clicked, popup, [=]() {
- if (windowState().testFlag(Qt::WindowMinimized) ||
- !windowState().testFlag(Qt::WindowActive) ||
- this->isHidden()) {
- this->show();
- setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
- }
+ if (windowState().testFlag(Qt::WindowMinimized) ||
+ !windowState().testFlag(Qt::WindowActive) || this->isHidden()) {
+ this->show();
+ setWindowState((windowState() & ~Qt::WindowMinimized) |
+ Qt::WindowActive);
+ }
});
popup->style()->polish(qApp);
popup->setMinimumWidth(300);
@@ -794,8 +803,7 @@ void MainWindow::createWebPage(bool offTheRecord) {
connect(profile, &QWebEngineProfile::downloadRequested,
&m_downloadManagerWidget, &DownloadManagerWidget::downloadRequested);
- connect(page,
- SIGNAL(fullScreenRequested(QWebEngineFullScreenRequest)), this,
+ connect(page, SIGNAL(fullScreenRequested(QWebEngineFullScreenRequest)), this,
SLOT(fullScreenRequested(QWebEngineFullScreenRequest)));
double currentFactor = settings.value("zoomFactor", 1.0).toDouble();
@@ -814,8 +822,8 @@ void MainWindow::setNotificationPresenter(QWebEngineProfile *profile) {
connect(popup, &NotificationPopup::notification_clicked, popup, [=]() {
if (windowState().testFlag(Qt::WindowMinimized) ||
!windowState().testFlag(Qt::WindowActive) || this->isHidden()) {
- this->show();
- setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
+ this->show();
+ setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
}
});
@@ -833,11 +841,12 @@ void MainWindow::setNotificationPresenter(QWebEngineProfile *profile) {
settings.value("notificationTimeOut", 9000).toInt());
trayIcon->disconnect(trayIcon, SIGNAL(messageClicked()));
connect(trayIcon, &QSystemTrayIcon::messageClicked, trayIcon, [=]() {
- if (windowState().testFlag(Qt::WindowMinimized) ||
- !windowState().testFlag(Qt::WindowActive) || this->isHidden()) {
- this->show();
- setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
- }
+ if (windowState().testFlag(Qt::WindowMinimized) ||
+ !windowState().testFlag(Qt::WindowActive) || this->isHidden()) {
+ this->show();
+ setWindowState((windowState() & ~Qt::WindowMinimized) |
+ Qt::WindowActive);
+ }
});
} else {
@@ -890,10 +899,27 @@ void MainWindow::handleLoadFinished(bool loaded) {
checkLoadedCorrectly();
updatePageTheme();
handleZoom();
+ injectNewChatJavaScript();
settingsWidget->refresh();
}
}
+void MainWindow::injectNewChatJavaScript() {
+ QString js = "const openNewChatWhatsie = (phone,text) => { "
+ "const link = document.createElement('a');"
+ "link.setAttribute('href', "
+ "`whatsapp://send/?phone=${phone}&text=${text}`);"
+ "document.body.append(link);"
+ "link.click();"
+ "document.body.removeChild(link);"
+ "};"
+ "function openNewChatWhatsieDefined()"
+ "{"
+ " return (openNewChatWhatsie != 'undefined');"
+ "}";
+ webEngine->page()->runJavaScript(js);
+}
+
void MainWindow::checkLoadedCorrectly() {
if (webEngine && webEngine->page()) {
// test 1 based on the class name of body of the page
@@ -1055,3 +1081,11 @@ void MainWindow::tryLock() {
init_lock();
}
}
+
+void MainWindow::alreadyRunning() {
+ QString appname = QApplication::applicationName();
+ this->notify(
+ appname,
+ QString("An instance of %1 is already Running, click to restore.")
+ .arg(appname));
+}