#include "runapplet.h" #include "ui_runapplet.h" #include "utils.hpp" #include #include #include #include #include #include #include RunApplet::RunApplet(QWidget *parent) : QDialog(parent) , ui(new Ui::RunApplet) { ui->setupUi(this); setFixedSize(400, 175); restoreState(); ui->label->setPixmap(QIcon::fromTheme("system-run-symbolic").pixmap(42, 42)); // https://forum.qt.io/post/291563 ui->cancelBtn->setIcon(style()->standardIcon(QStyle::SP_DialogCancelButton)); ui->okBtn->setIcon(style()->standardIcon(QStyle::SP_DialogOkButton)); ui->browseBtn->setIcon(style()->standardIcon(QStyle::SP_DialogOpenButton)); connect(ui->cancelBtn, &QPushButton::clicked, this, [&]() { qApp->quit(); }); connect(ui->okBtn, &QPushButton::clicked, this, [&]() { runApp(ui->comboBox->currentText()); }); connect(ui->browseBtn, &QPushButton::clicked, this, [&]() { QFileDialog dialog; dialog.setWindowTitle(tr("Browse")); dialog.setMimeTypeFilters({"application/x-executable"}); dialog.exec(); QStringList files = dialog.selectedFiles(); QString file = files.size() == 1 ? files[0] : ""; if (file == "") return; ui->comboBox->lineEdit()->setText(file); }); connect(ui->comboBox->lineEdit(), &QLineEdit::textChanged, this, [&]() { ui->okBtn->setDisabled(ui->comboBox->lineEdit()->text() == ""); }); } RunApplet::~RunApplet() { delete ui; } void RunApplet::runApp(QString command) { QStringList args; int p_argc; uint32_t p_err; wchar_t** p_args = wine_parse_command_line(command.toStdWString().c_str(), &p_argc, &p_err); for (int i = 0; i < p_argc; i++) { args.push_back(QString::fromWCharArray(p_args[i])); } // If the file exists and is not an executable, use QDesktopServices instead QMimeDatabase mimeDb; QMimeType mime = mimeDb.mimeTypeForFile(args[0]); if (QFile::exists(command) && mime.name() != "application/x-executable") { QDesktopServices::openUrl(QUrl::fromLocalFile(command)); return; } QProcess *process = new QProcess; process->setProgram(args[0]); args.remove(0); process->setArguments(args); bool status = process->startDetached(); if (status) { qApp->quit(); } QMessageBox messageBox; messageBox.critical(0, process->program(), QString(tr("Windows cannot find '%1'. Make sure you typed the name correctly, and then try again.")).arg(process->program())); } void RunApplet::closeEvent(QCloseEvent* evt) { saveState(); return QDialog::closeEvent(evt); } void RunApplet::saveState() { // https://stackoverflow.com/a/33639884/16255372 QSettings settings("aero-applets", "run-applet"); QStringList commandHistory; for (int i = 0; i < ui->comboBox->count(); i++) { commandHistory.append(ui->comboBox->itemText(i)); } settings.setValue("commandHistory", commandHistory); } void RunApplet::restoreState() { // https://stackoverflow.com/a/33639884/16255372 QSettings settings("aero-applets", "run-applet"); ui->comboBox->addItems(settings.value("commandHistory").toStringList()); }