Skip to content

Commit

Permalink
fix multiple window
Browse files Browse the repository at this point in the history
  • Loading branch information
kghost committed Dec 19, 2017
1 parent d94c209 commit 366d42e
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 124 deletions.
117 changes: 47 additions & 70 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

#include <QApplication>
#include <QtGlobal>
#include <QMessageBox>

#include <assert.h>
#include <stdio.h>
Expand Down Expand Up @@ -45,9 +46,6 @@ const char* const short_options = "vhw:e:dp:";
const struct option long_options[] = {
{"version", 0, NULL, 'v'},
{"help", 0, NULL, 'h'},
{"workdir", 1, NULL, 'w'},
{"execute", 1, NULL, 'e'},
{"drop", 0, NULL, 'd'},
{"profile", 1, NULL, 'p'},
{NULL, 0, NULL, 0}
};
Expand All @@ -58,12 +56,9 @@ void print_usage_and_exit(int code)
{
printf("QTerminal %s\n", STR_VERSION);
puts("Usage: qterminal [OPTION]...\n");
puts(" -d, --drop Start in \"dropdown mode\" (like Yakuake or Tilda)");
puts(" -e, --execute <command> Execute command instead of shell");
puts(" -h, --help Print this help");
puts(" -p, --profile Load qterminal with specific options");
puts(" -v, --version Prints application version and exits");
puts(" -w, --workdir <dir> Start session with specified work directory");
puts("\nHomepage: <https://github.com/lxde/qterminal>");
puts("Report bugs to <https://github.com/lxde/qterminal/issues>");
exit(code);
Expand All @@ -75,32 +70,15 @@ void print_version_and_exit(int code=0)
exit(code);
}

void parse_args(int argc, char* argv[], QString& workdir, QString & shell_command, out bool& dropMode)
void parse_args(int argc, char* argv[])
{
int next_option;
dropMode = false;
do{
next_option = getopt_long(argc, argv, short_options, long_options, NULL);
switch(next_option)
{
case 'h':
print_usage_and_exit(0);
case 'w':
workdir = QString(optarg);
break;
case 'e':
shell_command = QString(optarg);
// #15 "Raw" -e params
// Passing "raw" params (like konsole -e mcedit /tmp/tmp.txt") is more preferable - then I can call QString("qterminal -e ") + cmd_line in other programs
while (optind < argc)
{
//printf("arg: %d - %s\n", optind, argv[optind]);
shell_command += ' ' + QString(argv[optind++]);
}
break;
case 'd':
dropMode = true;
break;
case 'p':
Properties::Instance(QString(optarg));
break;
Expand Down Expand Up @@ -132,13 +110,7 @@ int main(int argc, char *argv[])
app->registerOnDbus();
#endif

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

if (workdir.isEmpty())
workdir = QDir::currentPath();
app->setWorkingDirectory(workdir);
parse_args(argc, argv);

const QSettings settings;
const QFileInfo customStyle = QFileInfo(
Expand Down Expand Up @@ -172,31 +144,17 @@ int main(int argc, char *argv[])
#endif
app->installTranslator(&translator);

TerminalConfig initConfig = TerminalConfig(workdir, shell_command);
app->newWindow(dropMode, initConfig);

int ret = app->exec();
delete Properties::Instance();
app->cleanup();

return ret;
}

MainWindow *QTerminalApp::newWindow(bool dropMode, TerminalConfig &cfg)
MainWindow *QTerminalApp::newWindow(TerminalConfig &cfg)
{
MainWindow *window = NULL;
if (dropMode)
{
QWidget *hiddenPreviewParent = new QWidget(0, Qt::Tool);
window = new MainWindow(cfg, dropMode, hiddenPreviewParent);
if (Properties::Instance()->dropShowOnStart)
window->show();
}
else
{
window = new MainWindow(cfg, dropMode);
window->show();
}
MainWindow *window = new MainWindow(cfg, false);
window->show();
return window;
}

Expand All @@ -213,9 +171,50 @@ QTerminalApp *QTerminalApp::Instance(int &argc, char **argv)
return m_instance;
}

namespace Konsole {
__declspec(dllimport) short TargetPtyTcpPort;
}

QTerminalApp::QTerminalApp(int &argc, char **argv)
:QApplication(argc, argv)
{
bridge = new QProcess();
connect(bridge, SIGNAL(errorOccurred(QProcess::ProcessError)), this, SLOT(bridgeErrorOccurred(QProcess::ProcessError))); // connect process signals with your code
connect(bridge, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(bridgeFinished(int, QProcess::ExitStatus))); // connect process signals with your code
connect(bridge, SIGNAL(readyReadStandardOutput()), this, SLOT(bridgeOutput())); // connect process signals with your code
bridge->start("WSL.exe", {"./tcppty"});
}

QTerminalApp::~QTerminalApp() {
bridge->disconnect();
bridge->close();
delete bridge;
}

void QTerminalApp::bridgeErrorOccurred(QProcess::ProcessError error) {
QMessageBox msgBox;
QString msg;
msg.sprintf("Bridge failed (%d), Check your WSL installation.\n\n", error);
msgBox.setIcon(QMessageBox::Critical);
msgBox.setText(msg + bridge->readAllStandardError());
msgBox.exec();
}

void QTerminalApp::bridgeFinished(int exitCode, QProcess::ExitStatus exitStatus) {
QMessageBox msgBox;
QString msg;
msg.sprintf("Bridge exited (%d/%d), Check your WSL installation.\n\n", exitCode, exitStatus);
msgBox.setIcon(QMessageBox::Critical);
msgBox.setText(msg + bridge->readAllStandardError());
msgBox.exec();
}

void QTerminalApp::bridgeOutput() {
auto port = bridge->readLine().trimmed().toInt();
if (port > 0) {
Konsole::TargetPtyTcpPort = port;
newWindow(TerminalConfig());
}
}

QString &QTerminalApp::getWorkingDirectory()
Expand Down Expand Up @@ -295,26 +294,4 @@ QDBusObjectPath QTerminalApp::getActiveWindow()
return qobject_cast<MainWindow*>(aw)->getDbusPath();
}

bool QTerminalApp::isDropMode() {
if (m_windowList.count() == 0) {
return false;
}
MainWindow *wnd = m_windowList.at(0);
return wnd->dropMode();
}

bool QTerminalApp::toggleDropdown() {
if (m_windowList.count() == 0) {
return false;
}
MainWindow *wnd = m_windowList.at(0);
if (!wnd->dropMode()) {
return false;
}
wnd->showHide();
return true;
}


#endif

44 changes: 1 addition & 43 deletions src/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,6 @@
#include "qterminalapp.h"
#include "dbusaddressable.h"

namespace Konsole {
__declspec(dllimport) short TargetPtyTcpPort;
}

typedef std::function<bool(MainWindow&)> checkfn;
Q_DECLARE_METATYPE(checkfn)

Expand All @@ -66,17 +62,10 @@ MainWindow::MainWindow(TerminalConfig &cfg,
m_dropLockButton(0),
m_dropMode(dropMode)
{
bridge = new QProcess();
connect(bridge, SIGNAL(errorOccurred(QProcess::ProcessError)), this, SLOT(bridgeErrorOccurred(QProcess::ProcessError))); // connect process signals with your code
connect(bridge, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(bridgeFinished(int, QProcess::ExitStatus))); // connect process signals with your code
connect(bridge, SIGNAL(readyReadStandardOutput()), this, SLOT(bridgeOutput())); // connect process signals with your code
bridge->start("WSL.exe", {"./tcppty"});

#ifdef HAVE_QDBUS
registerAdapter<WindowAdaptor, MainWindow>(this);
#endif

QTerminalApp::Instance()->addWindow(this);
QTerminalApp::Instance()->addWindow(this);
setAttribute(Qt::WA_TranslucentBackground);
setAttribute(Qt::WA_DeleteOnClose);

Expand Down Expand Up @@ -128,35 +117,7 @@ MainWindow::MainWindow(TerminalConfig &cfg,

connect(consoleTabulator, &TabWidget::currentTitleChanged, this, &MainWindow::onCurrentTitleChanged);
connect(menu_Actions, SIGNAL(aboutToShow()), this, SLOT(updateDisabledActions()));
}

void MainWindow::bridgeErrorOccurred(QProcess::ProcessError error) {
QMessageBox msgBox;
QString msg;
msg.sprintf("Bridge failed (%d), Check your WSL installation.\n\n", error);
msgBox.setIcon(QMessageBox::Critical);
msgBox.setText(msg + bridge->readAllStandardError());
msgBox.exec();
}

void MainWindow::bridgeFinished(int exitCode, QProcess::ExitStatus exitStatus) {
QMessageBox msgBox;
QString msg;
msg.sprintf("Bridge exited (%d/%d), Check your WSL installation.\n\n", exitCode, exitStatus);
msgBox.setIcon(QMessageBox::Critical);
msgBox.setText(msg + bridge->readAllStandardError());
msgBox.exec();
}

void MainWindow::bridgeOutput() {
auto port = bridge->readLine().trimmed().toInt();
if (port > 0) {
Konsole::TargetPtyTcpPort = port;
initialize();
}
}

void MainWindow::initialize() {
/* The tab should be added after all changes are made to
the main window; otherwise, the initial prompt might
get jumbled because of changes in internal geometry. */
Expand All @@ -179,9 +140,6 @@ void MainWindow::rebuildActions()
MainWindow::~MainWindow()
{
QTerminalApp::Instance()->removeWindow(this);
bridge->disconnect();
bridge->close();
delete bridge;
}

void MainWindow::enableDropMode()
Expand Down
7 changes: 1 addition & 6 deletions src/mainwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@


class QToolButton;
class QProcess;

class MainWindow : public QMainWindow, private Ui::mainWindow, public DBusAddressable
{
Q_OBJECT
Expand All @@ -57,7 +57,6 @@ class MainWindow : public QMainWindow, private Ui::mainWindow, public DBusAddres
private:
QActionGroup *tabPosition, *scrollBarPosition, *keyboardCursorShape;
QMenu *tabPosMenu, *scrollPosMenu, *keyboardCursorShapeMenu;
QProcess *bridge;

// A parent object for QObjects that are created dynamically based on settings
// Used to simplify the setting cleanup on reconfiguration: deleting settingOwner frees all related QObjects
Expand All @@ -73,7 +72,6 @@ class MainWindow : public QMainWindow, private Ui::mainWindow, public DBusAddres
const char *slot, QMenu *menu = NULL, const QVariant &data = QVariant());
QMap< QString, QAction * > actions;

void initialize();
void rebuildActions();

void setup_FileMenu_Actions();
Expand All @@ -99,9 +97,6 @@ public slots:
void updateDisabledActions();

private slots:
void bridgeErrorOccurred(QProcess::ProcessError error);
void bridgeFinished(int exitCode, QProcess::ExitStatus exitStatus);
void bridgeOutput();
void on_consoleTabulator_currentChanged(int);
void propertiesChanged();
void actAbout_triggered();
Expand Down
14 changes: 9 additions & 5 deletions src/qterminalapp.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@

#include "mainwindow.h"


class QProcess;
class QTerminalApp : public QApplication
{
Q_OBJECT

public:
MainWindow *newWindow(bool dropMode, TerminalConfig &cfg);
MainWindow *newWindow(TerminalConfig &cfg);
QList<MainWindow*> getWindowList();
void addWindow(MainWindow *window);
void removeWindow(MainWindow *window);
Expand All @@ -29,18 +29,22 @@ Q_OBJECT
QList<QDBusObjectPath> getWindows();
QDBusObjectPath newWindow(const QHash<QString,QVariant> &termArgs);
QDBusObjectPath getActiveWindow();
bool isDropMode();
bool toggleDropdown();
#endif

static void cleanup();

private:
QProcess *bridge;
QString m_workDir;
QList<MainWindow *> m_windowList;
static QTerminalApp *m_instance;
QTerminalApp(int &argc, char **argv);
~QTerminalApp(){};
~QTerminalApp();

private slots:
void bridgeErrorOccurred(QProcess::ProcessError error);
void bridgeFinished(int exitCode, QProcess::ExitStatus exitStatus);
void bridgeOutput();
};

template <class T> T* findParent(QObject *child)
Expand Down

0 comments on commit 366d42e

Please sign in to comment.