forked from Ivasoft/DSView
Fix issue #266, double-click open dsl file on Windows
This commit is contained in:
@@ -70,7 +70,38 @@ int main(int argc, char *argv[])
|
|||||||
QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
|
QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
|
||||||
#endif // QT_VERSION
|
#endif // QT_VERSION
|
||||||
|
|
||||||
QApplication a(argc, argv);
|
#ifdef _WIN32
|
||||||
|
// Under Windows, we need to manually retrieve the command-line arguments and convert them from UTF-16 to UTF-8.
|
||||||
|
// This prevents data loss if there are any characters that wouldn't fit in the local ANSI code page.
|
||||||
|
int argcUTF16 = 0;
|
||||||
|
LPWSTR* argvUTF16 = CommandLineToArgvW(GetCommandLineW(), &argcUTF16);
|
||||||
|
|
||||||
|
std::vector<QByteArray> argvUTF8Q;
|
||||||
|
|
||||||
|
std::for_each(argvUTF16, argvUTF16 + argcUTF16, [&argvUTF8Q](const LPWSTR& arg) {
|
||||||
|
argvUTF8Q.emplace_back(QString::fromUtf16(reinterpret_cast<const char16_t*>(arg), -1).toUtf8());
|
||||||
|
});
|
||||||
|
|
||||||
|
LocalFree(argvUTF16);
|
||||||
|
|
||||||
|
// Ms::runApplication() wants an argv-style array of raw pointers to the arguments, so let's create a vector of them.
|
||||||
|
std::vector<char*> argvUTF8;
|
||||||
|
|
||||||
|
for (auto& arg : argvUTF8Q)
|
||||||
|
argvUTF8.push_back(arg.data());
|
||||||
|
|
||||||
|
// Don't use the arguments passed to main(), because they're in the local ANSI code page.
|
||||||
|
Q_UNUSED(argc);
|
||||||
|
Q_UNUSED(argv);
|
||||||
|
|
||||||
|
int argcFinal = argcUTF16;
|
||||||
|
char** argvFinal = argvUTF8.data();
|
||||||
|
#else
|
||||||
|
int argcFinal = argc;
|
||||||
|
char** argvFinal = argv;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QApplication a(argcFinal, argvFinal);
|
||||||
a.setStyle(new MyStyle);
|
a.setStyle(new MyStyle);
|
||||||
|
|
||||||
// Set some application metadata
|
// Set some application metadata
|
||||||
@@ -88,7 +119,7 @@ int main(int argc, char *argv[])
|
|||||||
{0, 0, 0, 0}
|
{0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
const int c = getopt_long(argc, argv,
|
const int c = getopt_long(argcFinal, argvFinal,
|
||||||
"l:Vh?", long_options, NULL);
|
"l:Vh?", long_options, NULL);
|
||||||
if (c == -1)
|
if (c == -1)
|
||||||
break;
|
break;
|
||||||
@@ -118,11 +149,11 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (argc - optind > 1) {
|
if (argcFinal - optind > 1) {
|
||||||
fprintf(stderr, "Only one file can be openened.\n");
|
fprintf(stderr, "Only one file can be openened.\n");
|
||||||
return 1;
|
return 1;
|
||||||
} else if (argc - optind == 1)
|
} else if (argcFinal - optind == 1)
|
||||||
open_file = argv[argc - 1];
|
open_file = argvFinal[argcFinal - 1];
|
||||||
|
|
||||||
// Initialise DS_RES_PATH
|
// Initialise DS_RES_PATH
|
||||||
QDir dir(QCoreApplication::applicationDirPath());
|
QDir dir(QCoreApplication::applicationDirPath());
|
||||||
|
|||||||
@@ -109,7 +109,8 @@ MainWindow::MainWindow(DeviceManager &device_manager,
|
|||||||
{
|
{
|
||||||
setup_ui();
|
setup_ui();
|
||||||
if (open_file_name) {
|
if (open_file_name) {
|
||||||
const QString s(QString::fromUtf8(open_file_name));
|
qDebug("Open file: %s", open_file_name);
|
||||||
|
const QString s(QString::fromUtf8(open_file_name));
|
||||||
QMetaObject::invokeMethod(this, "load_file",
|
QMetaObject::invokeMethod(this, "load_file",
|
||||||
Qt::QueuedConnection,
|
Qt::QueuedConnection,
|
||||||
Q_ARG(QString, s));
|
Q_ARG(QString, s));
|
||||||
|
|||||||
Reference in New Issue
Block a user