Skip to content

Commit

Permalink
Single instance for drop-down mode (#1131)
Browse files Browse the repository at this point in the history
Based on D-Bus.
  • Loading branch information
tsujan committed May 24, 2024
1 parent 20e9e15 commit ee11676
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 12 deletions.
56 changes: 46 additions & 10 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@

const char* const short_options = "vhw:e:dp:";

static const char* serviceName = "org.lxqt.QTerminal";
static const char* ifaceName = "org.lxqt.QTerminal.Process";

const struct option long_options[] = {
{"version", 0, nullptr, 'v'},
{"help", 0, nullptr, 'h'},
Expand Down Expand Up @@ -139,15 +142,22 @@ int main(int argc, char *argv[])
QSettings::setDefaultFormat(QSettings::IniFormat);

QTerminalApp *app = QTerminalApp::Instance(argc, argv);
#ifdef HAVE_QDBUS
app->registerOnDbus();
#endif

QString workdir;
QStringList shell_command;
bool dropMode = false;
parse_args(argc, argv, workdir, shell_command, dropMode);

#ifdef HAVE_QDBUS
app->registerOnDbus(dropMode);
#endif

if (!app->isPrimaryInstance())
{
app->requestDropDown();
return 0;
}

Properties::Instance()->migrate_settings();
Properties::Instance()->loadSettings();

Expand Down Expand Up @@ -282,7 +292,7 @@ QList<MainWindow *> QTerminalApp::getWindowList()
}

#ifdef HAVE_QDBUS
void QTerminalApp::registerOnDbus()
void QTerminalApp::registerOnDbus(bool dropDown)
{
if (!QDBusConnection::sessionBus().isConnected())
{
Expand All @@ -291,14 +301,28 @@ void QTerminalApp::registerOnDbus()
"\teval `dbus-launch --auto-syntax`\n");
return;
}
QString serviceName = QStringLiteral("org.lxqt.QTerminal-%1").arg(getpid());
if (!QDBusConnection::sessionBus().registerService(serviceName))

if (dropDown)
{
fprintf(stderr, "%s\n", qPrintable(QDBusConnection::sessionBus().lastError().message()));
return;
if (!QDBusConnection::sessionBus().registerService(QLatin1String(serviceName)))
{
m_isPrimaryInstance = false;
return;
}
new ProcessAdaptor(this);
QDBusConnection::sessionBus().registerObject(QStringLiteral("/"), this);
}
else
{
if (!QDBusConnection::sessionBus().registerService(QLatin1String(serviceName)
+ QStringLiteral("-%1").arg(getpid())))
{
fprintf(stderr, "%s\n", qPrintable(QDBusConnection::sessionBus().lastError().message()));
return;
}
new ProcessAdaptor(this);
QDBusConnection::sessionBus().registerObject(QStringLiteral("/"), this);
}
new ProcessAdaptor(this);
QDBusConnection::sessionBus().registerObject(QStringLiteral("/"), this);
}

QList<QDBusObjectPath> QTerminalApp::getWindows()
Expand Down Expand Up @@ -347,6 +371,18 @@ bool QTerminalApp::toggleDropdown() {
return true;
}

void QTerminalApp::requestDropDown()
{
QDBusInterface iface(QLatin1String(serviceName),
QStringLiteral("/"),
QLatin1String(ifaceName), QDBusConnection::sessionBus(), this);
iface.call(QStringLiteral("toggleDropdown"));
}

bool QTerminalApp::isPrimaryInstance() {
return m_isPrimaryInstance;
}


#endif

7 changes: 5 additions & 2 deletions src/qterminalapp.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,14 @@ Q_OBJECT
void setWorkingDirectory(const QString &wd);

#ifdef HAVE_QDBUS
void registerOnDbus();
void registerOnDbus(bool dropDown);
QList<QDBusObjectPath> getWindows();
QDBusObjectPath newWindow(const QHash<QString,QVariant> &termArgs);
QDBusObjectPath getActiveWindow();
bool isDropMode();
bool toggleDropdown();
void requestDropDown();
bool isPrimaryInstance();
#endif

static void cleanup();
Expand All @@ -39,6 +41,7 @@ Q_OBJECT
QString m_workDir;
QList<MainWindow *> m_windowList;
static QTerminalApp *m_instance;
bool m_isPrimaryInstance = true;
QTerminalApp(int &argc, char **argv);
~QTerminalApp() override{};
};
Expand All @@ -59,4 +62,4 @@ template <class T> T* findParent(QObject *child)
}
}

#endif
#endif

0 comments on commit ee11676

Please sign in to comment.