Add desktop app service and VM dev session tooling

Introduces a new `core/applications` QML/C++ module (`Nebula.Applications`) to discover `.desktop` entries, expose filterable application models, and launch installed apps safely from the shell. The desktop launcher now uses real installed apps with themed icon loading and fallback glyphs, adds output-aware surface sizing via `OutputTracker`, and wires in image/icon providers. It also adds VMware-focused Sway/shell wrapper scripts, updates Sway config/session env defaults, and refreshes README docs to document the new development flow and Desktop 0.1 behavior.
This commit is contained in:
2026-08-26 17:19:30 +12:00
parent a7d204f241
commit b0c95b9e78
31 changed files with 1673 additions and 72 deletions
+39
View File
@@ -1,11 +1,48 @@
#include "DesktopIconProvider.hpp"
#include <LayerShellQt/Shell>
#include <QCoreApplication>
#include <QDir>
#include <QGuiApplication>
#include <QIcon>
#include <QQmlApplicationEngine>
#include <QQuickWindow>
#include <QUrl>
#include <QtGlobal>
namespace {
void initializeIconTheme()
{
if (QIcon::themeName().isEmpty()) {
const QStringList candidates = {
QStringLiteral("Adwaita"),
QStringLiteral("Yaru"),
QStringLiteral("ubuntu-mono-dark"),
QStringLiteral("breeze"),
QStringLiteral("hicolor"),
};
const QStringList searchPaths = QIcon::themeSearchPaths();
for (const QString &theme : candidates) {
for (const QString &root : searchPaths) {
if (QDir(root + QLatin1Char('/') + theme).exists()) {
QIcon::setThemeName(theme);
break;
}
}
if (!QIcon::themeName().isEmpty())
break;
}
}
if (QIcon::fallbackThemeName().isEmpty())
QIcon::setFallbackThemeName(QStringLiteral("hicolor"));
}
} // namespace
int main(int argc, char *argv[])
{
LayerShellQt::Shell::useLayerShell();
@@ -16,10 +53,12 @@ int main(int argc, char *argv[])
app.setOrganizationName(QStringLiteral("NebulaOS"));
app.setDesktopFileName(QStringLiteral("org.nebulaos.shell"));
initializeIconTheme();
QQuickWindow::setDefaultAlphaBuffer(true);
QQmlApplicationEngine engine;
engine.addImportPath(QStringLiteral("qrc:/qt/qml"));
engine.addImageProvider(QStringLiteral("desktopicon"), new DesktopIconProvider);
QObject::connect(
&engine,