(name.toULong(&success, HEX_BASE));
if(!success)
{
- errors.push_back(tr("%1: hexadecimal number expected").arg(prefix_ + name));
+ errors.push_back(tr("%1: %2 expected").arg(prefix_ + name, tr("hexadecimal number")));
continue;
}
@@ -522,7 +522,7 @@ void EFIBootEditor::importRawEFIData(const QJsonObject &input)
void EFIBootEditor::export_()
{
- QString file_name = QFileDialog::getSaveFileName(this, tr("Save Boot Configuration Dump"), "", tr("JSON documents (*.json)"));
+ QString file_name = QFileDialog::getSaveFileName(this, tr("Save boot configuration dump"), "", tr("JSON documents (*.json)"));
if(!file_name.isEmpty())
exportBootConfiguration(file_name);
}
@@ -577,7 +577,7 @@ void EFIBootEditor::exportBootConfiguration(const QString &file_name)
void EFIBootEditor::dump()
{
- const QString file_name = QFileDialog::getSaveFileName(this, tr("Save Raw EFI Dump"), "", tr("JSON documents (*.json)"));
+ const QString file_name = QFileDialog::getSaveFileName(this, tr("Save raw EFI dump"), "", tr("JSON documents (*.json)"));
if(!file_name.isEmpty())
dumpRawEFIData(file_name);
}
@@ -657,15 +657,21 @@ void EFIBootEditor::dumpRawEFIData(const QString &file_name)
void EFIBootEditor::showAboutBox()
{
auto *about = new QMessageBox(QMessageBox::Information,
- qApp->applicationName(),
- QString("EFI Boot Editor
%1
").arg(QCoreApplication::applicationVersion()),
+ tr("About %1").arg(qApp->applicationName()),
+ QString("%1
"
+ "%2
"
+ "%3
")
+ .arg(qApp->applicationName(), QCoreApplication::applicationVersion(), PROJECT_DESCRIPTION),
QMessageBox::Close,
this);
+ about->setIconPixmap(QIcon::fromTheme("preferences-system").pixmap(128, 128));
about->setInformativeText(tr(
- "License: GNU LGPL Version 3
"
+ "Website
"
+ "The program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
"
+ "License: GNU LGPL Version 3
"
"On Linux uses efivar for EFI variables access.
"
- "Uses Tango Icons as fallback icons
"
- "The program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
"));
+ "Uses Tango Icons as fallback icons.
")
+ .arg(PROJECT_HOMEPAGE_URL));
QObject::connect(about->button(QMessageBox::Close), &QAbstractButton::clicked, about, &QObject::deleteLater);
QObject::connect(qApp, &QApplication::aboutToQuit, about, &QObject::deleteLater);
about->show();
diff --git a/src/form/bootentryform.ui b/src/form/bootentryform.ui
index 865f905d..8dec871f 100644
--- a/src/form/bootentryform.ui
+++ b/src/form/bootentryform.ui
@@ -154,7 +154,8 @@
-
+
+ ..
false
@@ -185,7 +186,8 @@
-
+
+ ..
false
@@ -216,7 +218,8 @@
-
+
+ ..
false
@@ -247,7 +250,8 @@
-
+
+ ..
false
@@ -278,7 +282,8 @@
-
+
+ ..
false
@@ -530,7 +535,10 @@
<html><head/><body><p>Order</p></body></html>
- >\0\xHHHH;_
+ >\0\xHHHH;_
+
+
+ 0x
diff --git a/src/form/bootentrywidget.ui b/src/form/bootentrywidget.ui
index 669904df..9d8433b3 100644
--- a/src/form/bootentrywidget.ui
+++ b/src/form/bootentrywidget.ui
@@ -74,7 +74,7 @@
-
- 0
+ 5
-
@@ -109,6 +109,12 @@
Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop
+
+ 0
+
+
+ -1
+
Qt::NoTextInteraction
@@ -146,6 +152,9 @@
Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop
+
+ -1
+
Qt::NoTextInteraction
@@ -177,7 +186,7 @@
<html><head/><body><p>Boot file path</p></body></html>
- file path
+ File path
Qt::PlainText
@@ -217,7 +226,7 @@
<html><head/><body><p>Optional data, arguments passed to boot executable</p></body></html>
- data
+ Data
Qt::PlainText
diff --git a/src/form/devicepathdialog.ui b/src/form/devicepathdialog.ui
index ccda3f6c..ce017fab 100644
--- a/src/form/devicepathdialog.ui
+++ b/src/form/devicepathdialog.ui
@@ -17,7 +17,7 @@
- Device Path
+ Device path
Device path dialog
@@ -47,7 +47,7 @@
QTabWidget::West
- 10
+ 8
true
@@ -66,7 +66,8 @@
<html><head/><body><p>PCI tab</p></body></html>
-
+
+ ..
PCI
@@ -167,7 +168,8 @@
<html><head/><body><p>HID tab</p></body></html>
-
+
+ ..
HID
@@ -207,7 +209,10 @@
<html><head/><body><p>HID in hexadecimal.</p></body></html>
- <\0\xHHHHHHHH;_
+ <\0\xHHHHHHHH;_
+
+
+ 0x
@@ -239,7 +244,10 @@
<html><head/><body><p>UID in hexadecimal.</p></body></html>
- <\0\xHHHHHHHH;_
+ <\0\xHHHHHHHH;_
+
+
+ 0x
@@ -256,7 +264,8 @@
<html><head/><body><p>USB tab</p></body></html>
-
+
+ ..
USB
@@ -360,7 +369,8 @@
<html><head/><body><p>Vendor tab</p></body></html>
-
+
+ ..
Vendor
@@ -400,7 +410,10 @@
<html><head/><body><p>GUID</p></body></html>
- <HHHHHHHH-HHHH-HHHH-HHHH-HHHHHHHHHHHH;_
+ <HHHHHHHH-HHHH-HHHH-HHHH-HHHHHHHHHHHH;_
+
+
+ ----
@@ -533,7 +546,8 @@
<html><head/><body><p>MAC tab</p></body></html>
-
+
+ ..
MAC
@@ -573,7 +587,10 @@
<html><head/><body><p>MAC address</p></body></html>
- <HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH;_
+ <HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH:HH;_
+
+
+ :::::::::::::::
@@ -625,7 +642,8 @@
<html><head/><body><p>IPv4 tab</p></body></html>
-
+
+ ..
IPv4
@@ -713,10 +731,10 @@
<html><head/><body><p>Local IP address</p></body></html>
- 000.000.000.000
+ 000.000.000.000
- 0.0.0.0
+ 0.0.0.0
@@ -751,10 +769,10 @@
<html><head/><body><p>Remote IP address</p></body></html>
- 000.000.000.000
+ 000.000.000.000
- 0.0.0.0
+ 0.0.0.0
@@ -881,10 +899,10 @@
<html><head/><body><p>Gateway IP address</p></body></html>
- 000.000.000.000
+ 000.000.000.000
- 0.0.0.0
+ 0.0.0.0
@@ -916,7 +934,10 @@
<html><head/><body><p>Subnet mask</p></body></html>
- 000.000.000.000
+ 000.000.000.000
+
+
+ 0.0.0.0
@@ -933,7 +954,8 @@
<html><head/><body><p>IPv6 tab</p></body></html>
-
+
+ ..
IPv6
@@ -1085,7 +1107,10 @@
<html><head/><body><p>Local IP address</p></body></html>
- <HHHH:HHHH:HHHH:HHHH:HHHH:HHHH:HHHH:HHHH
+ <HHHH:HHHH:HHHH:HHHH:HHHH:HHHH:HHHH:HHHH
+
+
+ :::::::
@@ -1120,7 +1145,10 @@
<html><head/><body><p>Remote IP address</p></body></html>
- <HHHH:HHHH:HHHH:HHHH:HHHH:HHHH:HHHH:HHHH
+ <HHHH:HHHH:HHHH:HHHH:HHHH:HHHH:HHHH:HHHH
+
+
+ :::::::
@@ -1208,7 +1236,10 @@
<html><head/><body><p>Gateway IP address</p></body></html>
- <HHHH:HHHH:HHHH:HHHH:HHHH:HHHH:HHHH:HHHH
+ <HHHH:HHHH:HHHH:HHHH:HHHH:HHHH:HHHH:HHHH
+
+
+ :::::::
@@ -1244,7 +1275,8 @@
<html><head/><body><p>SATA tab</p></body></html>
-
+
+ ..
SATA
@@ -1383,7 +1415,8 @@
<html><head/><body><p>Disk tab</p></body></html>
-
+
+ ..
HD
@@ -1461,7 +1494,8 @@
-
+
+ ..
@@ -1534,7 +1568,10 @@
<html><head/><body><p>Partition signature.</p></body></html>
- <HHHHHHHH-HHHH-HHHH-HHHH-HHHHHHHHHHHH;_
+ <HHHHHHHH-HHHH-HHHH-HHHH-HHHHHHHHHHHH;_
+
+
+ ----
@@ -1609,10 +1646,10 @@
<html><head/><body><p>Partition start offset in hexadecimal.</p></body></html>
- <\0\xHHHHHHHHHHHHHHHH;_
+ <\0\xHHHHHHHHHHHHHHHH;_
- 0x0000000000000000
+ 0x0000000000000000
@@ -1644,7 +1681,10 @@
<html><head/><body><p>Partition size in hexadecimal.</p></body></html>
- <\0\xHHHHHHHHHHHHHHHH;_
+ <\0\xHHHHHHHHHHHHHHHH;_
+
+
+ 0x
@@ -1661,7 +1701,8 @@
<html><head/><body><p>File tab</p></body></html>
-
+
+ ..
File
@@ -1715,7 +1756,8 @@
<html><head/><body><p>Firmware file tab</p></body></html>
-
+
+ ..
Firmware file
@@ -1772,7 +1814,8 @@
<html><head/><body><p>Firmware volume tab</p></body></html>
-
+
+ ..
Firmware volume
@@ -1820,16 +1863,17 @@
- BIOS boot specification tab
+ BIOS Boot Specification tab
- BIOS boot specification tab
+ BIOS Boot Specification tab
- <html><head/><body><p>BIOS boot specification tab</p></body></html>
+ <html><head/><body><p>BIOS Boot Specification tab</p></body></html>
-
+
+ ..
BIOS Boot Specification
@@ -1869,7 +1913,10 @@
<html><head/><body><p>Device type</p></body></html>
- <\0\xHH;_
+ <\0\xHH;_
+
+
+ 0x
@@ -1901,7 +1948,10 @@
<html><head/><body><p>Status flag</p></body></html>
- <\0\xHH;_
+ <\0\xHH;_
+
+
+ 0x
@@ -1947,7 +1997,8 @@
<html><head/><body><p>End of hardware tab</p></body></html>
-
+
+ ..
End
@@ -2017,7 +2068,8 @@
<html><head/><body><p>Unknown device path node tab</p></body></html>
-
+
+ ..
Unknown
@@ -2080,14 +2132,20 @@
-
- <\0\xHH;_
+ <\0\xHH;_
+
+
+ 0x
-
- <\0\xHH;_
+ <\0\xHH;_
+
+
+ 0x
diff --git a/src/form/efibooteditor.ui b/src/form/efibooteditor.ui
index aaad24ef..567d389d 100644
--- a/src/form/efibooteditor.ui
+++ b/src/form/efibooteditor.ui
@@ -26,7 +26,8 @@
EFI Boot Editor
-
+
+ ..
@@ -90,7 +91,8 @@
-
+
+ ..
@@ -121,7 +123,8 @@
-
+
+ ..
@@ -152,7 +155,8 @@
-
+
+ ..
@@ -183,7 +187,8 @@
-
+
+ ..
@@ -214,7 +219,8 @@
-
+
+ ..
@@ -325,7 +331,7 @@
- Ttimeout
+ Timeout
Timeout
@@ -348,7 +354,7 @@
0
0
800
- 22
+ 23
@@ -371,7 +377,7 @@
<html><head/><body><p>File menu</p></body></html>
- File
+ &File
@@ -391,7 +397,7 @@
<html><head/><body><p>Help menu</p></body></html>
- Help
+ &Help
@@ -413,13 +419,14 @@
-
+
+ ..
- Exit
+ &Quit
- Exit
+ Quit
<html><head/><body><p>Exit the program</p></body></html>
@@ -430,10 +437,11 @@
-
+
+ ..
- Save
+ &Save
Save
@@ -447,10 +455,11 @@
-
+
+ ..
- Reload
+ &Reload
Reload
@@ -464,10 +473,11 @@
-
+
+ ..
- About EFI Boot Editor
+ About &EFI Boot Editor
About EFI Boot Editor
@@ -478,10 +488,11 @@
-
+
+ ..
- Export
+ &Export
Export
@@ -495,10 +506,11 @@
-
+
+ ..
- Import
+ &Import
Import
@@ -512,10 +524,11 @@
-
+
+ ..
- Dump raw EFI data
+ &Dump raw EFI data
Dump raw EFI data
diff --git a/src/main.cpp b/src/main.cpp
index 7d6edf28..e7161fd4 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,31 +1,53 @@
// SPDX-License-Identifier: LGPL-3.0-or-later
#include
#include
+#include
#include
+#include
#include "efibooteditor.h"
auto main(int argc, char *argv[]) -> int
{
QApplication a(argc, argv);
+ a.setApplicationName(APPLICATION_NAME);
QApplication::setApplicationVersion(VERSION);
QIcon::setFallbackThemeName("Tango");
if(QIcon::themeName().isEmpty())
QIcon::setThemeName("Tango");
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+ const auto translations_path = QLibraryInfo::path(QLibraryInfo::TranslationsPath);
+#else
+ const auto translations_path = QLibraryInfo::location(QLibraryInfo::TranslationsPath);
+#endif
+
+ // Enable translation
+ for(const char *module: {"qt", "qtbase", PROJECT_NAME})
+ {
+ std::unique_ptr translator{std::make_unique()};
+ if(!translator->load(QLocale::system(), module, "_", ":/i18n") && !translator->load(QLocale::system(), module, "_", translations_path))
+ continue;
+
+ a.installTranslator(translator.release());
+ }
+
+ // Check for EFI support
if(auto error_message = EFIBoot::init(); error_message)
{
return QMessageBox::critical(
nullptr,
- "EFI support required",
+ EFIBootEditor::tr("EFI support required"),
QStringFromStdTString(*error_message));
}
+ // Command line support
QCommandLineParser parser;
parser.addHelpOption();
parser.addVersionOption();
parser.process(a);
+ // Show window
EFIBootEditor w;
w.show();
diff --git a/translations/efibooteditor_en.ts b/translations/efibooteditor_en.ts
new file mode 100644
index 00000000..38176b9f
--- /dev/null
+++ b/translations/efibooteditor_en.ts
@@ -0,0 +1,2051 @@
+
+
+
+
+ BootEntryForm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ BootEntryWidget
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DevicePathDialog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ EFIBootEditor
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/windows.rc b/windows.rc
new file mode 100644
index 00000000..98bf6446
--- /dev/null
+++ b/windows.rc
@@ -0,0 +1,28 @@
+#include
+
+IDI_ICON1 ICON DISCARDABLE APPLICATION_ICON
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION VERSION_MAJOR,VERSION_MINOR,VERSION_PATCH,0
+ PRODUCTVERSION VERSION_MAJOR,VERSION_MINOR,VERSION_PATCH,0
+{
+ BLOCK "StringFileInfo"
+ {
+ // U.S. English - Windows, Multilingual
+ BLOCK "040904E4"
+ {
+ VALUE "ProductName", APPLICATION_NAME
+ VALUE "CompanyName", APPLICATION_NAME
+ VALUE "ProductVersion", VERSION
+ VALUE "FileDescription", PROJECT_DESCRIPTION
+ VALUE "FileVersion", VERSION
+ VALUE "InternalName", PROJECT_NAME
+ VALUE "LegalCopyright", APPLICATION_NAME
+ VALUE "OriginalFilename", PROJECT_NAME
+ }
+ }
+ BLOCK "VarFileInfo"
+ {
+ VALUE "Translation", 0x409, 1252 // 1252 = 0x04E4
+ }
+}