feat: allow applets to be shared modules

This commit is contained in:
2026-04-24 14:50:08 +02:00
parent 00c3e37ecf
commit 58d2e773fd
14 changed files with 405 additions and 10 deletions
@@ -30,14 +30,23 @@ enum FileManagerVirtualViewKind : uint8_t {
FM_VIRTUAL_VIEW_SYSTEM_TOOLS,
};
enum FileManagerVirtualEntryKind : uint8_t {
FM_VIRTUAL_ENTRY_NONE = 0,
FM_VIRTUAL_ENTRY_EXTERNAL_APP,
FM_VIRTUAL_ENTRY_BUILTIN,
FM_VIRTUAL_ENTRY_SHARED_APPLET,
};
struct FileManagerLocation {
char path[256];
FileManagerVirtualViewKind virtual_view;
};
struct FileManagerVirtualEntry {
FileManagerVirtualEntryKind kind;
int external_app_index;
DesktopBuiltinId builtin_id;
char shared_applet_path[128];
SvgIcon icon_lg;
SvgIcon icon_sm;
};
@@ -27,8 +27,10 @@ static void filemanager_reset_list_state(FileManagerState* fm) {
static void filemanager_reset_virtual_entry(FileManagerVirtualEntry* entry) {
if (!entry) return;
entry->kind = FM_VIRTUAL_ENTRY_NONE;
entry->external_app_index = -1;
entry->builtin_id = DESKTOP_BUILTIN_NONE;
entry->shared_applet_path[0] = '\0';
entry->icon_lg = {};
entry->icon_sm = {};
}
@@ -50,8 +52,10 @@ static void filemanager_add_root_entry(FileManagerState* fm,
static void filemanager_add_virtual_entry(FileManagerState* fm,
const char* name,
const char* icon_path,
FileManagerVirtualEntryKind kind,
int external_index,
DesktopBuiltinId builtin_id) {
DesktopBuiltinId builtin_id,
const char* shared_applet_path) {
if (!fm || fm->entry_count >= 64) return;
int idx = fm->entry_count;
@@ -61,8 +65,14 @@ static void filemanager_add_virtual_entry(FileManagerState* fm,
fm->is_dir[idx] = false;
fm->drive_indices[idx] = -1;
filemanager_reset_virtual_entry(&fm->virtual_entries[idx]);
fm->virtual_entries[idx].kind = kind;
fm->virtual_entries[idx].external_app_index = external_index;
fm->virtual_entries[idx].builtin_id = builtin_id;
if (shared_applet_path && shared_applet_path[0]) {
montauk::strncpy(fm->virtual_entries[idx].shared_applet_path,
shared_applet_path,
sizeof(fm->virtual_entries[idx].shared_applet_path));
}
if (icon_path && icon_path[0]) {
Color defColor = colors::ICON_COLOR;
@@ -344,8 +354,9 @@ void filemanager_read_apps(FileManagerState* fm) {
}
filemanager_add_virtual_entry(fm, name, icon_path,
FM_VIRTUAL_ENTRY_EXTERNAL_APP,
filemanager_find_external_app(ds, bin_path),
DESKTOP_BUILTIN_NONE);
DESKTOP_BUILTIN_NONE, nullptr);
doc.destroy();
}
@@ -361,7 +372,17 @@ void filemanager_read_system_tools(FileManagerState* fm) {
for (int i = 0; i < builtin_count; i++) {
if (!builtins[i].system_tools_applet) continue;
filemanager_add_virtual_entry(fm, builtins[i].label, builtins[i].icon_path,
-1, builtins[i].id);
FM_VIRTUAL_ENTRY_BUILTIN,
-1, builtins[i].id, nullptr);
}
DesktopSharedAppletEntry applets[32];
int applet_count = desktop_list_system_configuration_applets(fm->desktop, applets, 32);
for (int i = 0; i < applet_count && fm->entry_count < 64; i++) {
filemanager_add_virtual_entry(fm, applets[i].label, applets[i].icon_path,
FM_VIRTUAL_ENTRY_SHARED_APPLET,
-1, DESKTOP_BUILTIN_NONE,
applets[i].library_path);
}
filemanager_reset_list_state(fm);
@@ -197,17 +197,23 @@ void filemanager_open_entry(FileManagerState* fm, int idx) {
if (filemanager_is_virtual_view(fm) && fm->entry_types[idx] == FM_ENTRY_VIRTUAL_APP) {
DesktopState* ds = fm->desktop;
const FileManagerVirtualEntry& entry = fm->virtual_entries[idx];
if (ds && entry.builtin_id != DESKTOP_BUILTIN_NONE) {
if (ds && entry.kind == FM_VIRTUAL_ENTRY_BUILTIN
&& entry.builtin_id != DESKTOP_BUILTIN_NONE) {
desktop_launch_builtin(ds, entry.builtin_id);
return;
}
if (ds && entry.external_app_index >= 0 && entry.external_app_index < ds->external_app_count) {
if (ds && entry.kind == FM_VIRTUAL_ENTRY_EXTERNAL_APP
&& entry.external_app_index >= 0
&& entry.external_app_index < ds->external_app_count) {
const ExternalApp& app = ds->external_apps[entry.external_app_index];
if (app.launch_with_home) {
montauk::spawn(app.binary_path, ds->home_dir);
} else {
montauk::spawn(app.binary_path);
}
} else if (ds && entry.kind == FM_VIRTUAL_ENTRY_SHARED_APPLET
&& entry.shared_applet_path[0] != '\0') {
desktop_launch_shared_applet(ds, entry.shared_applet_path);
}
return;
}