1
0
mirror of https://github.com/KDE/krfb synced 2026-07-01 07:41:17 -07:00
Files
krfb/krfb/trayicon.cpp
Antti Savolainen c521740404 Format project
Command used to format: git ls-files | grep -E '\.(cpp|h|hpp|c)$' | xargs clang-format -i --style file
2026-04-25 06:49:43 +00:00

136 lines
4.3 KiB
C++

/*
SPDX-FileCopyrightText: 2010 Collabora Ltd <info@collabora.co.uk>
SPDX-FileContributor: George Kiagiadakis <george.kiagiadakis@collabora.co.uk>
SPDX-FileCopyrightText: 2001-2002 Tim Jansen <tim@tjansen.de>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "trayicon.h"
#include "mainwindow.h"
#include "rfbclient.h"
#include "rfbservermanager.h"
#include <QIcon>
#include <QMenu>
#include <KAboutApplicationDialog>
#include <KAboutData>
#include <KActionCollection>
#include <KConfigGroup>
#include <KLocalizedString>
#include <KStandardAction>
#include <KToggleAction>
#include <QDialog>
class ClientActions
{
public:
ClientActions(RfbClient *client, QMenu *menu, QAction *before);
virtual ~ClientActions();
private:
QMenu *m_menu = nullptr;
QAction *m_title = nullptr;
QAction *m_disconnectAction = nullptr;
QAction *m_enableControlAction = nullptr;
QAction *m_separator = nullptr;
};
ClientActions::ClientActions(RfbClient *client, QMenu *menu, QAction *before)
: m_menu(menu)
{
m_title = m_menu->insertSection(before, client->name());
m_disconnectAction = new QAction(i18n("Disconnect"), m_menu);
m_menu->insertAction(before, m_disconnectAction);
QObject::connect(m_disconnectAction, &QAction::triggered, client, &RfbClient::closeConnection);
if (client->controlCanBeEnabled()) {
m_enableControlAction = new KToggleAction(i18n("Enable Remote Control"), m_menu);
m_enableControlAction->setChecked(client->controlEnabled());
m_menu->insertAction(before, m_enableControlAction);
QObject::connect(m_enableControlAction, &KToggleAction::triggered,
client, &RfbClient::setControlEnabled);
QObject::connect(client, &RfbClient::controlEnabledChanged,
m_enableControlAction, &KToggleAction::setChecked);
} else {
m_enableControlAction = nullptr;
}
m_separator = m_menu->insertSeparator(before);
}
ClientActions::~ClientActions()
{
m_menu->removeAction(m_title);
delete m_title;
m_menu->removeAction(m_disconnectAction);
delete m_disconnectAction;
if (m_enableControlAction) {
m_menu->removeAction(m_enableControlAction);
delete m_enableControlAction;
}
m_menu->removeAction(m_separator);
delete m_separator;
}
//**********
TrayIcon::TrayIcon(QWidget *mainWindow)
: KStatusNotifierItem(mainWindow)
{
setIconByPixmap(QIcon::fromTheme(QStringLiteral("krfb-symbolic")).pixmap(22, 22, QIcon::Disabled));
setToolTipTitle(i18n("Desktop Sharing - disconnected"));
setCategory(KStatusNotifierItem::ApplicationStatus);
connect(RfbServerManager::instance(), &RfbServerManager::clientConnected,
this, &TrayIcon::onClientConnected);
connect(RfbServerManager::instance(), &RfbServerManager::clientDisconnected,
this, &TrayIcon::onClientDisconnected);
m_aboutAction = KStandardAction::aboutApp(this, &TrayIcon::showAbout, this);
contextMenu()->addAction(m_aboutAction);
}
void TrayIcon::onClientConnected(RfbClient *client)
{
if (m_clientActions.isEmpty()) { // first client connected
setIconByName(QStringLiteral("krfb-symbolic"));
setToolTipTitle(i18n("Desktop Sharing - connected with %1", client->name()));
setStatus(KStatusNotifierItem::Active);
} else { // Nth client connected, N != 1
setToolTipTitle(i18n("Desktop Sharing - connected"));
}
m_clientActions[client] = new ClientActions(client, contextMenu(), m_aboutAction);
}
void TrayIcon::onClientDisconnected(RfbClient *client)
{
ClientActions *actions = m_clientActions.take(client);
delete actions;
if (m_clientActions.isEmpty()) {
setIconByPixmap(QIcon::fromTheme(QStringLiteral("krfb-symbolic")).pixmap(22, 22, QIcon::Disabled));
setToolTipTitle(i18n("Desktop Sharing - disconnected"));
setStatus(KStatusNotifierItem::Passive);
} else if (m_clientActions.size() == 1) { // clients number dropped back to 1
RfbClient *client = m_clientActions.constBegin().key();
setToolTipTitle(i18n("Desktop Sharing - connected with %1", client->name()));
}
}
void TrayIcon::showAbout()
{
auto *dialog = new KAboutApplicationDialog(KAboutData::applicationData());
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->show();
}