From 5ff1fbe175af17fbb808c5ea942f465a932da3af Mon Sep 17 00:00:00 2001 From: "Christopher R. Nelson" Date: Tue, 21 Jul 2026 11:44:41 -0400 Subject: Rename app from er_xdg_pipe_menu to xdg_pipe_menu Drop the "er-" prefix throughout: module/atom names, filenames, socket paths, and docs. It was an implementation detail, not part of the app's identity. Co-Authored-By: Claude Sonnet 5 --- src/er_xdg_pipe_menu_renderer.erl | 78 --------------------------------------- 1 file changed, 78 deletions(-) delete mode 100644 src/er_xdg_pipe_menu_renderer.erl (limited to 'src/er_xdg_pipe_menu_renderer.erl') diff --git a/src/er_xdg_pipe_menu_renderer.erl b/src/er_xdg_pipe_menu_renderer.erl deleted file mode 100644 index f89d868..0000000 --- a/src/er_xdg_pipe_menu_renderer.erl +++ /dev/null @@ -1,78 +0,0 @@ -%%%------------------------------------------------------------------- -%% @doc Renders parsed desktop entries as an Openbox pipe menu. -%% -%% Given a list of `#desktop_entry{}' records, produces the XML that -%% Openbox expects on stdout from a pipe menu: one `' submenu -%% per category, each containing an `' per visible entry in -%% that category (entries with `hidden = true' are dropped). An entry -%% belonging to several categories appears in each of their submenus; -%% an entry with no categories is placed in a catch-all `Other' -%% submenu. Categories are sorted case-insensitively, and entries -%% within a submenu are sorted case-insensitively by name. -%% @end -%%%------------------------------------------------------------------- - --module(er_xdg_pipe_menu_renderer). - --include("er_xdg_pipe_menu.hrl"). - --export([render/1]). - --define(OTHER_CATEGORY, <<"Other">>). - --spec render([#desktop_entry{}]) -> binary(). -render(Entries) -> - Visible = [E || E <- Entries, not E#desktop_entry.hidden], - Grouped = group_by_category(Visible), - Categories = lists:sort(fun category_lt/2, maps:keys(Grouped)), - Menu = {openbox_pipe_menu, [], submenus_content(Categories, Grouped)}, - Xml = xmerl:export_simple( - [Menu], - xmerl_xml, - [{prolog, ["\n"]}] - ), - iolist_to_binary([Xml, "\n"]). - -group_by_category(Entries) -> - lists:foldl(fun add_entry_to_categories/2, #{}, Entries). - -add_entry_to_categories(#desktop_entry{categories = []} = E, Acc) -> - add_entry_to_category(?OTHER_CATEGORY, E, Acc); -add_entry_to_categories(#desktop_entry{categories = Cats} = E, Acc) -> - lists:foldl(fun(Cat, Acc0) -> add_entry_to_category(Cat, E, Acc0) end, Acc, Cats). - -add_entry_to_category(Cat, E, Acc) -> - maps:update_with(Cat, fun(Es) -> [E | Es] end, [E], Acc). - -category_lt(A, B) -> string:lowercase(A) =< string:lowercase(B). - -by_name(#desktop_entry{name = A}, #desktop_entry{name = B}) -> - string:lowercase(A) =< string:lowercase(B). - -submenus_content(Categories, Grouped) -> - lists:foldr( - fun(Cat, Acc) -> ["\n ", submenu_element(Cat, Grouped) | Acc] end, ["\n"], Categories - ). - -submenu_element(Cat, Grouped) -> - Entries = lists:sort(fun by_name/2, maps:get(Cat, Grouped)), - {menu, [{id, Cat}, {label, Cat}], items_content(Entries)}. - -items_content(Entries) -> - lists:foldr(fun(E, Acc) -> ["\n ", item_element(E) | Acc] end, ["\n "], Entries). - -item_element(#desktop_entry{name = Name, exec = Exec, icon = Icon}) -> - {item, item_attrs(Name, Icon), [ - "\n ", - {action, [{name, <<"Execute">>}], [ - "\n ", - {command, [], [text(Exec)]}, - "\n " - ]}, - "\n " - ]}. - -item_attrs(Name, undefined) -> [{label, Name}]; -item_attrs(Name, Icon) -> [{label, Name}, {icon, Icon}]. - -text(Bin) -> unicode:characters_to_list(Bin). -- cgit v1.2.3