diff --git a/default/elephant/omarchy_themes.lua b/default/elephant/omarchy_themes.lua index 1f21d847..02baa0a9 100644 --- a/default/elephant/omarchy_themes.lua +++ b/default/elephant/omarchy_themes.lua @@ -4,67 +4,93 @@ Name = "omarchythemes" NamePretty = "Omarchy Themes" +-- Check if file exists using Lua (no subprocess) +local function file_exists(path) + local f = io.open(path, "r") + if f then + f:close() + return true + end + return false +end + +-- Get first matching file from directory using ls (single call for fallback) +local function first_image_in_dir(dir) + local handle = io.popen("ls -1 '" .. dir .. "' 2>/dev/null | head -n 1") + if handle then + local file = handle:read("*l") + handle:close() + if file and file ~= "" then + return dir .. "/" .. file + end + end + return nil +end + -- The main function elephant will call function GetEntries() local entries = {} - local theme_dir = os.getenv("HOME") .. "/.config/omarchy/themes" + local user_theme_dir = os.getenv("HOME") .. "/.config/omarchy/themes" + local omarchy_path = os.getenv("OMARCHY_PATH") or "" + local default_theme_dir = omarchy_path .. "/themes" - -- First, get all theme directories - local find_dirs_cmd = "find -L '" .. theme_dir .. "' -mindepth 1 -maxdepth 1 -type d 2>/dev/null" + local seen_themes = {} - local handle = io.popen(find_dirs_cmd) - if not handle then - return entries - end + -- Helper function to process themes from a directory + local function process_themes_from_dir(theme_dir) + -- Single find call to get all theme directories + local handle = io.popen("find -L '" .. theme_dir .. "' -mindepth 1 -maxdepth 1 -type d 2>/dev/null") + if not handle then + return + end - for theme_path in handle:lines() do - local theme_name = theme_path:match(".*/(.+)$") + for theme_path in handle:lines() do + local theme_name = theme_path:match(".*/(.+)$") - if theme_name then - -- find preview image - local find_preview_cmd = "find -L '" - .. theme_path - .. "' -maxdepth 1 -type f \\( -name 'preview.png' -o -name 'preview.jpg' \\) 2>/dev/null | head -n 1" - local preview_handle = io.popen(find_preview_cmd) - local preview_path = nil + if theme_name and not seen_themes[theme_name] then + seen_themes[theme_name] = true - if preview_handle then - preview_path = preview_handle:read("*l") - preview_handle:close() - end + -- Check for preview images directly (no subprocess) + local preview_path = nil + local preview_png = theme_path .. "/preview.png" + local preview_jpg = theme_path .. "/preview.jpg" - -- If no preview found, use first image from backgrounds folder - if not preview_path or preview_path == "" then - local bg_cmd = "find -L '" - .. theme_path - .. "/backgrounds' -maxdepth 1 -type f \\( -iname '*.png' -o -iname '*.jpg' -o -iname '*.jpeg' \\) 2>/dev/null | head -n 1" - local bg_handle = io.popen(bg_cmd) - if bg_handle then - preview_path = bg_handle:read("*l") - bg_handle:close() + if file_exists(preview_png) then + preview_path = preview_png + elseif file_exists(preview_jpg) then + preview_path = preview_jpg + else + -- Fallback: get first image from backgrounds (one ls call) + preview_path = first_image_in_dir(theme_path .. "/backgrounds") + end + + if preview_path and preview_path ~= "" then + local display_name = theme_name:gsub("_", " "):gsub("%-", " ") + display_name = display_name:gsub("(%a)([%w_']*)", function(first, rest) + return first:upper() .. rest:lower() + end) + display_name = display_name .. " " + + table.insert(entries, { + Text = display_name, + Preview = preview_path, + PreviewType = "file", + Actions = { + activate = "omarchy-theme-set " .. theme_name, + }, + }) end end - - if preview_path and preview_path ~= "" then - local display_name = theme_name:gsub("_", " "):gsub("%-", " ") - display_name = display_name:gsub("(%a)([%w_']*)", function(first, rest) - return first:upper() .. rest:lower() - end) - display_name = display_name .. " " - - table.insert(entries, { - Text = display_name, - Preview = preview_path, - PreviewType = "file", - Actions = { - activate = "omarchy-theme-set " .. theme_name, - }, - }) - end end + + handle:close() end - handle:close() + -- Process user themes first (they take precedence) + process_themes_from_dir(user_theme_dir) + -- Then process default themes (only if not already seen) + process_themes_from_dir(default_theme_dir) + return entries end