feat: allow applets to be shared modules
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user