diff -Naur icewm-20211011/src/aclock.cc icewm-20211011.edited4/src/aclock.cc
--- icewm-20211011/src/aclock.cc	2021-04-14 19:35:37.000000000 -0400
+++ icewm-20211011.edited4/src/aclock.cc	2021-04-19 19:01:03.000000000 -0400
@@ -164,33 +164,13 @@
 
 void YClock::handleClick(const XButtonEvent &up, int count) {
     if (up.button == 1) {
-        if (clockCommand && clockCommand[0] &&
-            (taskBarLaunchOnSingleClick ? count == 1 : !(count % 2)))
-            smActionListener->runCommandOnce(clockClassHint, clockCommand, &fPid);
-#ifdef DEBUG
+		//smActionListener->runCommandOnce(clockClassHint, clockCommand, &fPid);
+		system("ktsuss /usr/local/bin/setDate.py&");
     } else if (up.button == 2) {
-        if ((count % 2) == 0)
-            countEvents = !countEvents;
-#endif
-    }
-    else if (up.button == Button3) {
-        fMenu = new YMenu();
-        fMenu->setActionListener(this);
-        fMenu->addItem(_("CLOCK"), -2, null, actionNull)->setEnabled(false);
-        fMenu->addSeparator();
-        fMenu->addItem("%H:%M", -2, null, actionClockHM);
-        fMenu->addItem("%H:%M:%S", -2, null, actionClockHMS);
-        fMenu->addItem("%d %H:%M", -2, null, actionClockDHM);
-        if (!prettyClock)
-            fMenu->addItem(_("Date"), -2, null, actionClockDate);
-        fMenu->addItem(_("Default"), -2, null, actionClockDefault);
-        fMenu->addItem(_("_Disable"), -2, null, actionClose);
-        fMenu->addItem(_("_UTC"), -2, null, actionClockUTC)->setChecked(clockUTC);
-        fMenu->popup(nullptr, nullptr, nullptr, up.x_root, up.y_root,
-                     YPopupWindow::pfCanFlipVertical |
-                     YPopupWindow::pfCanFlipHorizontal |
-                     YPopupWindow::pfPopupMenu);
-    }
+		system("runBrowser http://www.time.gov/&");
+    } else if (up.button == 3) {
+		system("ktsuss /usr/local/bin/settimezone&");
+	}
 }
 
 void YClock::changeTimeFormat(const char* format) {
diff -Naur icewm-20211011/src/default.h icewm-20211011.edited4/src/default.h
--- icewm-20211011/src/default.h	2021-04-14 19:35:37.000000000 -0400
+++ icewm-20211011.edited4/src/default.h	2021-04-19 19:58:11.000000000 -0400
@@ -24,7 +24,7 @@
 XIV(bool, focusRootWindow,                      false)
 XIV(bool, pointerColormap,                      true)
 XIV(bool, sizeMaximized,                        false)
-XIV(bool, showMoveSizeStatus,                   true)
+XIV(bool, showMoveSizeStatus,                   false)
 XIV(bool, workspaceSwitchStatus,                true)
 XIV(bool, beepOnNewMail,                        false)
 XIV(bool, warpPointer,                          false)
@@ -32,19 +32,19 @@
 XIV(bool, opaqueMove,                           true)
 XIV(bool, opaqueResize,                         true)
 XIV(bool, hideTitleBarWhenMaximized,            false)
-XSV(const char *, winMenuItems,                 "rmsnxfhualyticw")
+XSV(const char *, winMenuItems,                 "nxfic")
 XIV(bool, showTaskBar,                          true)
 XIV(bool, taskBarAtTop,                         false)
 XIV(bool, taskBarKeepBelow,                     false)
 XIV(bool, taskBarShowClock,                     true)
 XIV(bool, taskBarShowApm,                       false)
-XIV(bool, taskBarShowApmAuto,                   true)
-XIV(bool, taskBarShowApmTime,                   true)
-XIV(bool, taskBarShowApmGraph,                  true)
-XIV(bool, taskBarShowMailboxStatus,             true)
+XIV(bool, taskBarShowApmAuto,                   false)
+XIV(bool, taskBarShowApmTime,                   false)
+XIV(bool, taskBarShowApmGraph,                  false)
+XIV(bool, taskBarShowMailboxStatus,             false)
 XIV(bool, taskBarShowStartMenu,                 true)
-XIV(bool, taskBarShowWindowListMenu,            true)
-XIV(bool, taskBarShowWorkspaces,                true)
+XIV(bool, taskBarShowWindowListMenu,            false)
+XIV(bool, taskBarShowWorkspaces,                false)
 XIV(bool, taskBarShowWindows,                   true)
 XIV(int, taskBarShowShowDesktopButton,          1)
 
@@ -65,23 +65,23 @@
 XSV(const char *, taskBarWorkspacesLimit,       0)
 XIV(bool, taskBarUseMouseWheel,                 true)
 XIV(int, taskBarTaskGrouping,                   0)
-XIV(bool, pagerShowPreview,                     true)
-XIV(bool, pagerShowWindowIcons,                 true)
-XIV(bool, pagerShowMinimized,                   true)
-XIV(bool, pagerShowBorders,                     true)
-XIV(bool, pagerShowLabels,                      true)
+XIV(bool, pagerShowPreview,                     false)
+XIV(bool, pagerShowWindowIcons,                 false)
+XIV(bool, pagerShowMinimized,                   false)
+XIV(bool, pagerShowBorders,                     false)
+XIV(bool, pagerShowLabels,                      false)
 XIV(bool, pagerShowNumbers,                     false)
-XIV(bool, taskBarShowCPUStatus,                 true)
-XIV(bool, cpustatusShowRamUsage,                true)
-XIV(bool, cpustatusShowSwapUsage,               true)
-XIV(bool, cpustatusShowAcpiTemp,                true)
+XIV(bool, taskBarShowCPUStatus,                 false)
+XIV(bool, cpustatusShowRamUsage,                false)
+XIV(bool, cpustatusShowSwapUsage,               false)
+XIV(bool, cpustatusShowAcpiTemp,                false)
 XIV(bool, cpustatusShowAcpiTempInGraph,         false)
-XIV(bool, cpustatusShowCpuFreq,                 true)
+XIV(bool, cpustatusShowCpuFreq,                 false)
 XIV(bool, netstatusShowOnlyRunning,             false)
-XIV(bool, taskBarShowMEMStatus,                 true)
-XIV(bool, taskBarShowNetStatus,                 true)
+XIV(bool, taskBarShowMEMStatus,                 false)
+XIV(bool, taskBarShowNetStatus,                 false)
 XIV(bool, taskBarLaunchOnSingleClick,           true)
-XIV(bool, taskBarShowCollapseButton,            false)
+XIV(bool, taskBarShowCollapseButton,            true)
 XIV(bool, minimizeToDesktop,                    false)
 XIV(bool, miniIconsPlaceHorizontal,             false)
 XIV(bool, miniIconsRightToLeft,                 false)
@@ -127,14 +127,14 @@
 XIV(bool, clientMouseActions,                   true)
 XIV(bool, showPrograms,                         false)
 XIV(bool, showSettingsMenu,                     true)
-XIV(bool, showFocusModeMenu,                    true)
+XIV(bool, showFocusModeMenu,                    false)
 XIV(bool, showThemesMenu,                       true)
 XIV(bool, showLogoutMenu,                       true)
 XIV(bool, showLogoutSubMenu,                    true)
 XIV(bool, showAbout,                            true)
-XIV(bool, showRun,                              true)
-XIV(bool, showWindowList,                       true)
-XIV(bool, showHelp,                             true)
+XIV(bool, showRun,                              false)
+XIV(bool, showWindowList,                       false)
+XIV(bool, showHelp,                             false)
 XIV(bool, allowFullscreen,                      true)
 XIV(bool, fullscreenUseAllMonitors,             false)
 XIV(bool, enableAddressBar,                     true)
@@ -175,21 +175,21 @@
 
 XSV(const char *, acpiIgnoreBatteries,          0)
 XSV(const char *, mailBoxPath,                  0)
-XSV(const char *, mailCommand,                  TERM " -name mutt -e mutt")
-XSV(const char *, mailClassHint,                "mutt.XTerm")
+XSV(const char *, mailCommand,                  0)
+XSV(const char *, mailClassHint,                0)
 XSV(const char *, newMailCommand,               0)
-XSV(const char *, lockCommand,                  0)
-XSV(const char *, clockCommand,                 "xclock -name icewm -title Clock")
-XSV(const char *, clockClassHint,               "icewm.XClock")
+XSV(const char *, lockCommand,                  "xlock -mode matrix")
+XSV(const char *, clockCommand,                 "runBrowser http://www.time.gov/")
+XSV(const char *, clockClassHint,               0)
 XSV(const char *, runDlgCommand,                0)
 XSV(const char *, openCommand,                  0)
 XSV(const char *, terminalCommand,              TERM " -hold")
 XSV(const char *, logoutCommand,                0)
 XSV(const char *, logoutCancelCommand,          0)
-#if __linux__
-XSV(const char *, shutdownCommand,              "test -e /run/systemd/system && systemctl poweroff")
-XSV(const char *, rebootCommand,                "test -e /run/systemd/system && systemctl reboot")
-XSV(const char *, suspendCommand,               "test -e /run/systemd/system && systemctl suspend")
+#if defined(__linux__)
+XSV(const char *, shutdownCommand,              "sudo /sbin/shutdown -h now")
+XSV(const char *, rebootCommand,                "sudo /sbin/shutdown -r now")
+XSV(const char *, suspendCommand,               0)
 #else
 XSV(const char *, shutdownCommand,              0)
 XSV(const char *, rebootCommand,                0)
@@ -218,13 +218,13 @@
    )
 XSV(const char *, addressBarCommand,            0)
 #ifdef CONFIG_I18N
-XSV(const char *, fmtTime,                      "%X")
+XSV(const char *, fmtTime,                      "%-I:%M")
 XSV(const char *, fmtTimeAlt,                   NULL)
-XSV(const char *, fmtDate,                      "%c")
+XSV(const char *, fmtDate,                      "%A  %m/%d/%Y%n%T  %Z %n%nLeft-Click to set the time %nR-Click to set timezone %nMiddle for U.S. Official Time")
 #else
-XSV(const char *, fmtTime,                      "%H:%M:%S")
+XSV(const char *, fmtTime,                      "%-I:%M")
 XSV(const char *, fmtTimeAlt,                   NULL)
-XSV(const char *, fmtDate,                      "%Y-%m-%d %H:%M:%S %z %B %A")
+XSV(const char *, fmtDate,                      "%A  %m/%d/%Y%n%T  %Z %n%nLeft-Click to set the time %nR-Click to set timezone %nMiddle for U.S. Official Time")
 #endif
 
 #ifdef CFGDEF
diff -Naur icewm-20211011/src/fdomenu.cc icewm-20211011.edited4/src/fdomenu.cc
--- icewm-20211011/src/fdomenu.cc	2021-04-14 19:35:37.000000000 -0400
+++ icewm-20211011.edited4/src/fdomenu.cc	2021-04-21 14:19:39.000000000 -0400
@@ -1,18 +1,16 @@
 /*
  *  FDOmenu - Menu code generator for icewm
- *  Copyright (C) 2015-2018 Eduard Bloch
+ *  Copyright (C) 2015 Eduard Bloch
  *
  *  Inspired by icewm-menu-gnome2 and Freedesktop.org specifications
  *  Using pure glib/gio code and a built-in menu structure instead
  *  the XML based external definition (as suggested by FD.o specs)
  *
- *  Released under terms of the GNU Library General Public License
+ *  Release under terms of the GNU Library General Public License
  *  (version 2.0)
  *
  *  2015/02/05: Eduard Bloch <edi@gmx.de>
  *  - initial version
- *  2018/08:
- *  - overhauled program design and menu construction code, added sub-category handling
  */
 
 #include "config.h"
@@ -20,735 +18,380 @@
 #include "sysdep.h"
 #include "intl.h"
 #include "appnames.h"
-#include <ctype.h>
-#include "debug.h"
+#include "ctype.h"
 
-char const *ApplicationName(nullptr);
-
-#ifndef LPCSTR // mind the MFC
-// easier to read...
-typedef const char* LPCSTR;
-#endif
+char const *ApplicationName;
 
 #include <glib.h>
-#include <gmodule.h>
 #include <glib/gprintf.h>
 #include <glib/gstdio.h>
 #include <gio/gdesktopappinfo.h>
-#include "ycollections.h"
 
-// program options
-bool add_sep_before(false), add_sep_after(false), no_sep_others(false), no_sub_cats(false);
+typedef GTree* tMenuContainer;
 
-template<typename T, void TFreeFunc(T)>
-struct auto_raii {
-    T m_p;
-    auto_raii(T xp) :
-            m_p(xp) {
-    }
-    ~auto_raii() {
-        if (m_p)
-            TFreeFunc(m_p);
-    }
+template<class T>
+struct auto_gfree
+{
+	T *m_p;
+	auto_gfree() : m_p(NULL) {};
+	auto_gfree(T *xp) : m_p(xp) {};
+	~auto_gfree() { g_free(m_p); }
 };
-typedef auto_raii<gpointer, g_free> auto_gfree;
-typedef auto_raii<gpointer, g_object_unref> auto_gunref;
-
-static int cmpUtf8(const void *p1, const void *p2) {
-    return g_utf8_collate((LPCSTR ) p1, (LPCSTR ) p2);
-}
-
-class tDesktopInfo;
-typedef YVec<const gchar*> tCharVec;
-tCharVec sys_folders, home_folders;
-tCharVec* sys_home_folders[] = { &sys_folders, &home_folders, nullptr };
-tCharVec* home_sys_folders[] = { &home_folders, &sys_folders, nullptr };
-
-struct tListMeta {
-    LPCSTR title, key, icon;
-    LPCSTR const * const parent_sec;
-    enum eLoadFlags {
-        NONE = 0,
-        DEFAULT_TRANSLATED = 1,
-        SYSTEM_TRANSLATED = 2,
-        DEFAULT_ICON = 4,
-        FALLBACK_ICON = 8,
-        SYSTEM_ICON = 16,
-    };
-    short load_state_icon, load_state_title;
+struct auto_gunref
+{
+	GObject *m_p;
+	auto_gunref(GObject *xp): m_p(xp) {};
+	~auto_gunref() { g_object_unref(m_p); }
 };
-GHashTable* meta_lookup_data;
-tListMeta* lookup_category(LPCSTR key)
+
+bool find_in_zArray(const char * const *arrToScan, const char *keyword)
 {
-    tListMeta* ret = (tListMeta*) g_hash_table_lookup(meta_lookup_data, key);
-    if(ret)
-    {
-        // auto-translate the default title for the user's language
-        if(ret->title == nullptr)
-            ret->title = _(ret->key);
-    }
-    return ret;
+	for(const gchar * const * p=arrToScan;*p;++p)
+		if(!strcmp(keyword, *p))
+			return true;
+	return false;
 }
 
-
-
-struct t_menu_node;
-extern t_menu_node root;
-
-// very basic, avoid vtables!
-struct t_menu_node {
-protected:
-    // for leafs -> NULL, otherwise sub-menu contents
-    GTree* store;
-    LPCSTR progCmd;
-public:
-    const tListMeta *meta;
-    t_menu_node(const tListMeta* desc): store(nullptr), progCmd(nullptr), meta(desc) {}
-
-    struct t_print_meta {
-        int count, level;
-        t_menu_node* print_separated;
-    };
-    static gboolean print_node(gpointer key, gpointer value, gpointer pr_meta) {
-        ((t_menu_node*) value)->print((t_print_meta*) pr_meta);
-        return FALSE;
-    }
-
-    void print(t_print_meta *ctx) {
-        if(!meta) return;
-        LPCSTR title = Elvis(meta->title, meta->key);
-
-        if(!store)
-        {
-            if(title && progCmd) {
-                if(ctx->count == 0 && add_sep_before)
-                    puts("separator");
-                printf("prog \"%s\" %s %s\n",
-                        title,
-                        meta->icon,
-                        progCmd);
-            }
-            ctx->count++;
-            return;
-        }
-
-        if (!g_tree_nnodes(store))
-            return;
-
-        if (ctx->level == 1 && !no_sep_others
-                && 0 == strcmp(meta->key, "Other")) {
-            ctx->print_separated = this;
-            return;
-        }
-
-        // root level does not have a name, for others open category menu
-        if (ctx->level > 0) {
-            if (ctx->count == 0 && add_sep_before)
-                puts("separator");
-            ctx->count++;
-            printf("menu \"%s\" %s {\n", title, meta->icon);
-        }
-        ctx->level++;
-        g_tree_foreach(store, print_node, ctx);
-        if(ctx->level == 1 && ctx->print_separated)
-        {
-            puts("separator");
-            no_sep_others = true;
-            ctx->print_separated->print(ctx);
-        }
-        ctx->level--;
-        if (ctx->level > 0)
-#ifndef DEBUG
-            puts("}");
+// for optional bits that are not consuming much and
+// it's OK to leak them, OS will clean up soon enough
+//#define FREEASAP
+#ifdef FREEASAP
+#define opt_g_free(x) g_free(x);
 #else
-            printf("# end of menu \"%s\"\n}\n", title);
+#define opt_g_free(x)
 #endif
-        if(add_sep_after && ctx->level == 0 && ctx->count > 0)
-            puts("separator");
 
-    }
+tMenuContainer msettings=0, mdevelopment=0, maccessories=0, meducation=0,
+		mgames=0, mgraphics=0, maudio=0, mvideo=0, mnetwork=0, moffice=0, mgeography=0, 
+ 		mutility=0, mother=0, mwine=0, meditors=0, maccessibility=0;
 
-    /**
-     * Usual print method for the root node
-     */
-    void print() {
-        t_print_meta ctx = {0,0,nullptr};
-        print(&ctx);
-    }
-
-    void add(t_menu_node* node) {
-        if (!store)
-            store = g_tree_new(cmpUtf8);
-        if(node->meta->title || node->meta->key)
-            g_tree_replace(store, (gpointer) Elvis(node->meta->title, node->meta->key), (gpointer) node);
-    }
-
-    /**
-     * Returns a sub-menu which is named by the title (or key) of the provided information.
-     * Creates one as needed or finds existing one.
-     */
-    t_menu_node* get_subtree(const tListMeta* info) {
-        const char* title = Elvis(info->title, info->key);
-        if (store) {
-            void* existing = g_tree_lookup(store, title);
-            if (existing)
-                return (t_menu_node*) existing;
-        }
-        t_menu_node* tree = new t_menu_node(info);
-        add(tree);
-        return tree;
-    }
-
-    /**
-     * Find and examine the possible subcategory, try to assign it to the particular main category with the proper structure.
-     * When succeeded, blank out the main category pointer in matched_main_cats.
-     */
-    void try_add_to_subcat(t_menu_node* pNode, const tListMeta* subCatCandidate, YVec<tListMeta*> &matched_main_cats)
-    {
-        t_menu_node *pTree = &root;
-        // skip the rest of the further nesting (cannot fit into any)
-        bool skipping = false;
-
-        tListMeta* pNewCatInfo = nullptr;
-        tListMeta** ppLastMainCat = nullptr;
-
-        for (const char * const *pSubCatName = subCatCandidate->parent_sec;
-                *pSubCatName; ++pSubCatName) {
-            // stop nesting, add to the last visited/created submenu
-            bool store_here = **pSubCatName == '|';
-            if (skipping && store_here) {
-                skipping = false;
-                pTree = &root;
-                continue;
-            }
-            if (store_here) {
-                pTree->get_subtree(subCatCandidate)->add(pNode);
-                // main menu was served, don't come here again
-                if (ppLastMainCat)
-                    *ppLastMainCat = nullptr;
-            }
-
-            skipping = true;
-            // check main category filter, enter from root for main categories
-
-            for (tListMeta** ppMainCat = matched_main_cats.data;
-                    ppMainCat < matched_main_cats.data + matched_main_cats.size;
-                    ++ppMainCat) {
-
-                if (!*ppMainCat)
-                    continue;
-
-                // empty filter means ANY
-                if (**pSubCatName == '\0'
-                        || 0 == strcmp(*pSubCatName, (**ppMainCat).key)) {
-                    // the category is enabled!
-                    skipping = false;
-                    pTree = &root;
-                    pNewCatInfo = *ppMainCat;
-                    ppLastMainCat = ppMainCat;
-                    break;
-                }
-            }
-            if (skipping)
-                continue;
-            // if not on first node, make or find submenues for the comming tokens
-            if(!pNewCatInfo)
-                pNewCatInfo = lookup_category(*pSubCatName);
-            if(!pNewCatInfo)
-                return; // heh? fantasy category? Let caller handle it
-            pTree = pTree->get_subtree(pNewCatInfo);
-        }
-    }
-    void add_by_categories(t_menu_node* pNode, gchar **ppCats) {
-        static YVec<tListMeta*> matched_main_cats, matched_sub_cats;
-        matched_main_cats.size = matched_sub_cats.size = 0;
-
-        for (gchar **pCatKey = ppCats; pCatKey && *pCatKey; ++pCatKey) {
-            if (!**pCatKey)
-                continue; // empty?
-            tListMeta *pResolved = lookup_category(*pCatKey);
-            if (!pResolved) continue;
-            if(!pResolved->parent_sec)
-                matched_main_cats.add(pResolved);
-            else
-                matched_sub_cats.add(pResolved);
-        }
-        if (matched_main_cats.size == 0)
-            matched_main_cats.add(lookup_category("Other"));
-        if(!no_sub_cats) {
-            for (tListMeta** p = matched_sub_cats.data;
-                    p < matched_sub_cats.data + matched_sub_cats.size; ++p) {
-
-                try_add_to_subcat(pNode, *p, matched_main_cats);
-            }
-        }
-        for (tListMeta** p = matched_main_cats.data;
-                p < matched_main_cats.data + matched_main_cats.size; ++p) {
-
-            if (*p == nullptr)
-                continue;
-            get_subtree(*p)->add(pNode);
-        }
-    }
-};
-
-/*
- * Two relevant columns from https://specifications.freedesktop.org/menu-spec/latest/apas02.html
- * exported as CSV with , delimiter and with manual fix of HardwareSettings order.
- *
- * Powered by PERL! See contrib/conv_cat.pl
- */
-
-#include "fdospecgen.h"
-
-bool checkSuffix(const char* szFilename, const char* szFileSfx)
+struct tListMeta
 {
-    const char* pSfx = strrchr(szFilename, '.');
-    return pSfx && 0 == strcmp(pSfx+1, szFileSfx);
-}
-
-// for short-living objects describing the information we get from desktop files
-class tDesktopInfo {
-public:
-    GDesktopAppInfo *pInfo;
-    LPCSTR d_file;
-    tDesktopInfo(LPCSTR szFileName) : d_file(szFileName)  {
-        pInfo = g_desktop_app_info_new_from_filename(szFileName);
-        if (!pInfo)
-            return;
-// tear down if not permitted
-        if (!g_app_info_should_show(*this)) {
-            g_object_unref(pInfo);
-            pInfo = nullptr;
-            return;
-        }
-    }
-
-    inline operator GAppInfo*() {
-        return (GAppInfo*) pInfo;
-    }
-
-    inline operator GDesktopAppInfo*() {
-        return pInfo;
-    }
-
-    ~tDesktopInfo() { }
-
-    LPCSTR get_name() const {
-        if (!pInfo)
-            return nullptr;
-        return g_app_info_get_display_name((GAppInfo*) pInfo);
-    }
-
-    char * get_icon_path() const {
-        GIcon *pIcon = g_app_info_get_icon((GAppInfo*) pInfo);
-        auto_gunref free_icon((GObject*) pIcon);
-
-        if (pIcon) {
-            char *icon_path = g_icon_to_string(pIcon);
-            if (!icon_path)
-                return nullptr;
-            // if absolute then we are done here
-            if (icon_path[0] == '/')
-                return icon_path;
-            // err, not owned! auto_gfree free_orig_icon_path(icon_path);
-            return icon_path;
-        }
-        return nullptr;
-    }
+	const char *title;
+	tMenuContainer* store;
 };
-
-tListMeta no_description = {nullptr,nullptr,nullptr,nullptr};
-
-t_menu_node root(&no_description);
-
-// variant with local description data
-struct t_menu_node_app : t_menu_node
+tListMeta menuinfo[] =
 {
-    tListMeta description;
-    t_menu_node_app(const tDesktopInfo& dinfo) : t_menu_node(&description),
-            description(no_description) {
-        description.icon = Elvis((const char*) dinfo.get_icon_path(), "-");
-
-        LPCSTR cmdraw = g_app_info_get_commandline((GAppInfo*) dinfo.pInfo);
-        if (!cmdraw || !*cmdraw)
-            return;
-
-        description.title = description.key = Elvis(dinfo.get_name(), "<UNKNOWN>");
-
-        // if the strings contains the exe and then only file/url tags that we wouldn't
-        // set anyway, THEN create a simplified version and use it later (if bSimpleCmd is true)
-        // OR use the original command through a wrapper (if bSimpleCmd is false)
-        bool bUseSimplifiedCmd = true;
-        gchar * cmdMod = g_strdup(cmdraw);
-        gchar *pcut = strpbrk(cmdMod, " \f\n\r\t\v");
-
-        if (pcut) {
-            bool bExpectXchar = false;
-            for (gchar *p = pcut; *p && bUseSimplifiedCmd; ++p) {
-                int c = (unsigned) *p;
-                if (bExpectXchar) {
-                    if (strchr("FfuU", c))
-                        bExpectXchar = false;
-                    else
-                        bUseSimplifiedCmd = false;
-                    continue;
-                } else if (c == '%') {
-                    bExpectXchar = true;
-                    continue;
-                } else {
-                    if (isspace(unsigned(c)))
-                        continue;
-                    else {
-                        if (!strchr(p, '%'))
-                            goto cmdMod_is_good_as_is;
-                        else
-                            bUseSimplifiedCmd = false;
-                    }
-                }
-            }
-
-            if (bExpectXchar)
-                bUseSimplifiedCmd = false;
-            if (bUseSimplifiedCmd)
-                *pcut = '\0';
-            cmdMod_is_good_as_is: ;
-        }
-
-        bool bForTerminal = false;
-    #if GLIB_VERSION_CUR_STABLE >= G_ENCODE_VERSION(2, 36)
-        bForTerminal = g_desktop_app_info_get_boolean(dinfo.pInfo, "Terminal");
-    #else
-        // cannot check terminal property, callback is as safe bet
-        bUseSimplifiedCmd = false;
-    #endif
-
-        if (bUseSimplifiedCmd && !bForTerminal) // best case
-            progCmd = cmdMod;
-    #ifdef XTERMCMD
-        else if (bForTerminal && bUseSimplifiedCmd)
-            progCmd = g_strjoin(" ", QUOTE(XTERMCMD), "-e", cmdMod, NULL);
-    #endif
-        else
-            // not simple command or needs a terminal started via launcher callback, or both
-            progCmd = g_strdup_printf("%s \"%s\"", ApplicationName, dinfo.d_file);
-    }
-};
-
-struct tFromTo { LPCSTR from; LPCSTR to;};
-// match transformations applied by some DEs
-const tFromTo SameCatMap[] = {
-        {"Utilities", "Utility"},
-        {"Sound & Video", "AudioVideo"},
-        {"Sound", "Audio"},
-        {"File", "FileTools"},
-        {"Terminal Applications", "TerminalEmulator"},
-        {"Mathematics", "Math"},
-        {"Arcade", "ArcadeGame"},
-        {"Card Games", "CardGame"}
-};
-const tFromTo SameIconMap[] = {
-        { "AudioVideo", "Audio" },
-        { "AudioVideo", "Video" }
+{ N_("Accessibility"), &maccessibility },
+{ N_("Settings"), &msettings },
+{ N_("Development"), &mdevelopment },
+{ N_("Accessories"), &maccessories },
+{ N_("Education"), &meducation },
+{ N_("Geography"), &mgeography },
+{ N_("Video"), &mvideo },
+{ N_("Games"), &mgames },
+{ N_("Graphics"), &mgraphics },
+{ N_("Audio"), &maudio },
+{ N_("Network"), &mnetwork },
+{ N_("Office"), &moffice },
+{ N_("WINE"), &mwine },
+{ N_("Editors"), &meditors },
+{ N_("Utility"), &mutility },
+{ N_("Other"), &mother }
 };
-typedef void (*tFuncInsertInfo)(LPCSTR szDesktopFile);
-void pickup_folder_info(LPCSTR szDesktopFile) {
-    GKeyFile *kf = g_key_file_new();
-    auto_raii<GKeyFile*, g_key_file_free> free_kf(kf);
-
-    if (!g_key_file_load_from_file(kf, szDesktopFile, G_KEY_FILE_NONE, nullptr))
-        return;
-    LPCSTR cat_name = g_key_file_get_string(kf, "Desktop Entry", "Name", nullptr);
-    // looks like bad data
-    if(!cat_name || !*cat_name)
-        return;
-    // try a perfect match by name or file name
-    tListMeta* pCat = lookup_category(cat_name);
-    if(!pCat)
-    {
-        gchar* bn(g_path_get_basename(szDesktopFile));
-        auto_gfree cleanr(bn);
-        char* dot = strchr(bn, '.');
-        if(dot)
-        {
-            *dot = 0x0;
-            pCat = lookup_category(bn);
-        }
-    }
-    for(const tFromTo* p=SameCatMap;
-            !pCat && p < SameCatMap+ACOUNT(SameCatMap);
-            ++p) {
-
-        if(0 == strcmp(cat_name, p->from))
-            pCat = lookup_category(p->to);
-    }
-
-    if(!pCat)
-        return;
-    if (pCat->load_state_icon < tListMeta::SYSTEM_ICON) {
-        LPCSTR icon_name = g_key_file_get_string (kf, "Desktop Entry",
-                                                       "Icon", nullptr);
-        if (icon_name && *icon_name) {
-            pCat->icon = icon_name;
-            pCat->load_state_icon = tListMeta::SYSTEM_ICON;
-        }
-    }
-    if (pCat->load_state_title < tListMeta::SYSTEM_TRANSLATED) {
-        LPCSTR cat_title = g_key_file_get_locale_string (kf,
-                                                              "Desktop Entry",
-                                                              "Name", nullptr,
-                                                              nullptr);
-        if (!cat_title) return;
-        pCat->title = cat_title;
-        LPCSTR cat_title_c = g_key_file_get_string (kf, "Desktop Entry",
-                                                         "Name", nullptr);
-        bool same_trans = 0 == strcmp (cat_title_c, cat_title);
-        if (!same_trans) pCat->load_state_title = tListMeta::SYSTEM_TRANSLATED;
-        // otherwise: not sure, keep searching for a better translation
-    }
-    // something special, donate the icon to similar items unless they have a better one
 
-    for(const tFromTo* p=SameIconMap; p < SameIconMap + ACOUNT(SameIconMap);
-            ++p) {
-
-        if (strcmp (pCat->key, p->from))
-            continue;
+void proc_dir(const char *path, unsigned depth=0)
+{
+	GDir *pdir = g_dir_open (path, 0, NULL);
+	if(!pdir)
+		return;
+	struct tdircloser {
+		GDir *m_p;
+		tdircloser(GDir *p) : m_p(p) {};
+		~tdircloser() { g_dir_close(m_p);}
+	} dircloser(pdir);
+
+	const gchar *szFilename(NULL);
+	while(NULL != (szFilename = g_dir_read_name (pdir)))
+	{
+		if(!szFilename)
+			continue;
+		gchar *szFullName = g_strjoin("/", path, szFilename, NULL);
+		auto_gfree<gchar> xxfree(szFullName);
+		static GStatBuf buf;
+		if(g_stat(szFullName, &buf))
+			return;
+		if(S_ISDIR(buf.st_mode))
+		{
+			static ino_t reclog[6];
+			for(unsigned i=0; i<depth; ++i)
+			{
+				if(reclog[i] == buf.st_ino)
+					goto dir_visited_before;
+			}
+			if(depth<ACOUNT(reclog))
+			{
+				reclog[++depth] = buf.st_ino;
+				proc_dir(szFullName, depth);
+				--depth;
+			}
+			dir_visited_before:;
+		}
+
+		if(!S_ISREG(buf.st_mode))
+			continue;
+
+		GDesktopAppInfo *pInfo = g_desktop_app_info_new_from_filename (szFullName);
+		if(!pInfo)
+			continue;
+		auto_gunref ___pinfo_releaser((GObject*)pInfo);
+
+		if(!g_app_info_should_show((GAppInfo*) pInfo))
+			continue;
+
+		const char *cmdraw = g_app_info_get_commandline ((GAppInfo*) pInfo);
+		if(!cmdraw || !*cmdraw)
+			continue;
+
+		// if the strings contains the exe and then only file/url tags that we wouldn't
+		// set anyway, THEN create a simplified version and use it later (if bSimpleCmd is true)
+		// OR use the original command through a wrapper (if bSimpleCmd is false)
+		bool bUseSimplifiedCmd = true;
+		gchar * cmdMod = g_strdup(cmdraw);
+		auto_gfree<gchar> cmdfree(cmdMod);
+		gchar *pcut = strpbrk(cmdMod, " \f\n\r\t\v");
+
+		if(pcut)
+		{
+			bool bExpectXchar=false;
+			for(gchar *p=pcut; *p && bUseSimplifiedCmd; ++p)
+			{
+				int c = (unsigned) *p;
+				if (bExpectXchar)
+				{
+					if (strchr("FfuU", c))
+						bExpectXchar = false;
+					else
+						bUseSimplifiedCmd = false;
+					continue;
+				}
+				else if (c == '%')
+				{
+					bExpectXchar = true;
+					continue;
+				}
+				else if (isspace(unsigned(c)))
+					continue;
+				else if(! strchr(p, '%'))
+					goto cmdMod_is_good_as_is;
+				else
+					bUseSimplifiedCmd = false;
+			}
+
+			if(bExpectXchar)
+				bUseSimplifiedCmd = false;
+			if(bUseSimplifiedCmd)
+				*pcut = '\0';
+			cmdMod_is_good_as_is:;
+		}
+
+		const char *pName=g_app_info_get_name( (GAppInfo*) pInfo);
+		if(!pName)
+			continue;
+		const char *pCats=g_desktop_app_info_get_categories(pInfo);
+		if(!pCats)
+			pCats="Other";
+		if(0 == strncmp(pCats, "X-", 2))
+			continue;
+
+		const char *sicon = "-";
+		GIcon *pIcon=g_app_info_get_icon( (GAppInfo*) pInfo);
+		auto_gfree<char> iconstringrelease;
+		if (pIcon)
+		{
+			char *s = g_icon_to_string(pIcon);
+			iconstringrelease.m_p=s;
+			sicon=s;
+		}
+
+		gchar *menuLine;
+		bool bForTerminal = false;
+#if GLIB_VERSION_CUR_STABLE >= G_ENCODE_VERSION(2, 36)
+		bForTerminal = g_desktop_app_info_get_boolean(pInfo, "Terminal");
+#else
+		// cannot check terminal property, callback is as safe bet
+		bUseSimplifiedCmd = false;
+#endif
 
-        tListMeta *t = lookup_category (p->to);
-        // give them at least some icon for now
-        if (t && t->load_state_icon < tListMeta::FALLBACK_ICON) {
-            t->icon = pCat->icon;
-            t->load_state_icon = tListMeta::FALLBACK_ICON;
-        }
+		if(bUseSimplifiedCmd && !bForTerminal) // best case
+			menuLine = g_strjoin(" ", sicon, cmdMod, NULL);
+#ifdef XTERMCMD
+		else if(bForTerminal && bUseSimplifiedCmd)
+			menuLine = g_strjoin(" ", sicon, QUOTE(XTERMCMD), "-e", cmdMod, NULL);
+#endif
+		else // not simple command or needs a terminal started via launcher callback, or both
+			menuLine = g_strdup_printf("%s %s \"%s\"", sicon, ApplicationName, szFullName);
 
-    }
+		// Pigeonholing roughly by guessed menu structure
+#define add2menu(x) { g_tree_replace(x, g_strdup(pName), menuLine); }
+		gchar **ppCats = g_strsplit(pCats, ";", -1);
+		if (find_in_zArray(ppCats, "Office"))
+			add2menu(moffice)
+		else if (find_in_zArray(ppCats, "Accessories"))
+			add2menu(maccessories)
+		else if (find_in_zArray(ppCats, "Audio"))
+			add2menu(maudio)
+		else if (strstr(pCats, "Editor"))
+			add2menu(meditors)
+		else if (strstr(pCats, "Development"))
+			add2menu(mdevelopment)
+		else if (find_in_zArray(ppCats, "Network"))
+			add2menu(mnetwork)
+		else if (find_in_zArray(ppCats, "Video"))
+			add2menu(mvideo)
+		else if (find_in_zArray(ppCats, "Education"))
+			add2menu(meducation)
+		else if (strstr(pCats, "Geography"))	
+			add2menu(mgeography)
+		else if (find_in_zArray(ppCats, "Game"))
+			add2menu(mgames)
+		else if (find_in_zArray(ppCats, "Graphics"))
+			add2menu(mgraphics)
+		else if (strstr(pCats, "Accessibility"))
+			add2menu(maccessibility)
+		else if (find_in_zArray(ppCats, "Settings"))
+			continue;
+		else if (strstr(pCats, "Utility"))
+			continue;
+		else
+		{
+#if GLIB_VERSION_CUR_STABLE >= G_ENCODE_VERSION(2, 34)
+			const char *pwmclass = g_desktop_app_info_get_startup_wm_class(pInfo);
+			if (pwmclass && strstr(pwmclass, "Wine"))
+				add2menu(mwine)
+			else
+#endif
+			if (strstr(cmdraw, " wine "))
+				add2menu(mwine)
+			else
+//				add2menu(mother)
+				continue;
+		}
+		g_strfreev(ppCats);
+	}
 }
 
-void insert_app_info(const char* szDesktopFile) {
-    tDesktopInfo dinfo(szDesktopFile);
-    if (!dinfo.pInfo)
-        return;
-
-    LPCSTR pCats = g_desktop_app_info_get_categories(dinfo.pInfo);
-    if (!pCats)
-        pCats = "Other";
-    if (0 == strncmp(pCats, "X-", 2))
-        return;
-
-    t_menu_node* pNode = new t_menu_node_app(dinfo);
-    // Pigeonholing roughly by guessed menu structure
-
-    gchar **ppCats = g_strsplit(pCats, ";", -1);
-    root.add_by_categories(pNode, ppCats);
-    g_strfreev(ppCats);
-
+static gboolean printKey(const char *key, const char *value, void*)
+{
+	printf("prog \"%s\" %s\n", key, value);
+	return FALSE;
 }
 
-void proc_dir_rec(LPCSTR syspath, unsigned depth,
-        tFuncInsertInfo process_keyfile, LPCSTR szSubfolder,
-        LPCSTR szFileSfx) {
-    gchar *path = g_strjoin("/", syspath, szSubfolder, NULL);
-    auto_gfree relmem_path(path);
-    GDir *pdir = g_dir_open(path, 0, nullptr);
-    if (!pdir)
-        return;
-    auto_raii<GDir*, g_dir_close> dircloser(pdir);
-
-    const gchar *szFilename(nullptr);
-    while (nullptr != (szFilename = g_dir_read_name(pdir))) {
-        if (!szFilename || !checkSuffix(szFilename, szFileSfx))
-            continue;
-
-        gchar *szFullName = g_strjoin("/", path, szFilename, NULL);
-        auto_gfree xxfree(szFullName);
-        static GStatBuf buf;
-        if (0 != g_stat(szFullName, &buf))
-            continue;
-        if (S_ISDIR(buf.st_mode)) {
-            static ino_t reclog[6];
-            for (unsigned i = 0; i < depth; ++i) {
-                if (reclog[i] == buf.st_ino)
-                    goto dir_visited_before;
-            }
-            if (depth < ACOUNT(reclog)) {
-                reclog[++depth] = buf.st_ino;
-                proc_dir_rec(szFullName, depth, process_keyfile, szSubfolder,
-                        szFileSfx);
-                --depth;
-            }
-            dir_visited_before: ;
-        }
-
-        if (!S_ISREG(buf.st_mode))
-            continue;
+void print_submenu(const char *title, tMenuContainer data)
+{
+	if(!data || !g_tree_nnodes(data))
+		return;
+	printf("menu \"%s\" folder {\n", title);
+	g_tree_foreach(data, (GTraverseFunc) printKey, NULL);
+	puts("}");
+}
 
-        process_keyfile(szFullName);
-    }
+void dump_menu()
+{
+	for (tListMeta *p=menuinfo; p < menuinfo+ACOUNT(menuinfo)-1; ++p)
+		print_submenu(p->title, * p->store);
+//	puts("separator");
+	print_submenu(menuinfo[ACOUNT(menuinfo)-1].title, * menuinfo[ACOUNT(menuinfo)-1].store);
 }
 
-bool launch(LPCSTR dfile, LPCSTR *argv, int argc) {
-    GDesktopAppInfo *pInfo = g_desktop_app_info_new_from_filename(dfile);
-    if (!pInfo)
-        return false;
+bool launch(const char *dfile, const char **argv, int argc)
+{
+	GDesktopAppInfo *pInfo = g_desktop_app_info_new_from_filename (dfile);
+	if(!pInfo)
+		return false;
 #if 0 // g_file_get_uri crashes, no idea why, even enforcing file prefix doesn't help
-    if (argc>0)
-    {
-        GList* parms=NULL;
-        for (int i=0; i<argc; ++i)
-        parms=g_list_append(parms,
-                g_strdup_printf("%s%s", strstr(argv[i], "://") ? "" : "file://",
-                        argv[i]));
-        return g_app_info_launch ((GAppInfo *)pInfo,
-                parms, NULL, NULL);
-    }
-    else
+	if(argc>0)
+	{
+		GList* parms=NULL;
+		for(int i=0; i<argc; ++i)
+			parms=g_list_append(parms,
+					g_strdup_printf("%s%s", strstr(argv[i], "://") ? "" : "file://",
+							argv[i]));
+		return g_app_info_launch ((GAppInfo *)pInfo,
+		                   parms, NULL, NULL);
+	}
+	else
 #else
-    (void) argv;
-    (void) argc;
+	(void) argv;
+	(void) argc;
 #endif
-    return g_app_info_launch((GAppInfo *) pInfo,
-    nullptr,
-    nullptr, nullptr);
+	return g_app_info_launch ((GAppInfo *)pInfo,
+                   NULL, NULL, NULL);
+}
+static int
+cmpstringp(const void *p1, const void *p2)
+{
+    return g_utf8_collate(* (char * const *) p1, * (char * const *) p2);
 }
 
-static void init() {
+static void init()
+{
 #ifdef CONFIG_I18N
-    setlocale(LC_ALL, "");
+	setlocale (LC_ALL, "");
 #endif
 
+#ifdef ENABLE_NLS
     bindtextdomain(PACKAGE, LOCDIR);
     textdomain(PACKAGE);
+#endif
 
-    meta_lookup_data = g_hash_table_new(g_str_hash, g_str_equal);
-
-    for (unsigned i = 0; i < ACOUNT(spec::menuinfo); ++i) {
-        tListMeta& what = spec::menuinfo[i];
-        if(no_sub_cats && what.parent_sec)
-            continue;
-        // enforce non-const since we are not destroying that data ever, no key_destroy_func set!
-        g_hash_table_insert(meta_lookup_data, (gpointer) what.key, &what);
-    }
-}
-
-static void help(LPCSTR home, LPCSTR dirs, FILE* out, int xit) {
-    g_fprintf(out,
-            "USAGE: icewm-menu-fdo OPTIONS\n"
-            "OPTIONS:\n"
-            "--seps  \tPrint separators before and after contents\n"
-            "--sep-after\tPrint separator only after contents\n"
-            "--no-sep-others\tNo separation of the 'Others' menu point\n"
-            "--no-sub-cats\tNo additional subcategories, just one level of menues\n"
-            "*.desktop\tAny .desktop file to launch the application command from there\n"
-            "This program also listens to "
-                    "environment variables defined by the\nXDG Base Directory Specification:\n"
-                    "XDG_DATA_HOME=%s\n"
-                    "XDG_DATA_DIRS=%s\n", home, dirs);
-    exit(xit);
-}
-
-void split_folders(const char* path_string, tCharVec& where) {
-    for (gchar** p = g_strsplit(path_string, ":", -1); *p; ++p) {
-        where.add(*p);
-    }
-}
-
-void process_apps(const tCharVec& where) {
-    for (const gchar* const * p = where.data; p < where.data + where.size;
-            ++p) {
-        proc_dir_rec(*p, 0, insert_app_info, "applications", "desktop");
+    for(tListMeta *p=menuinfo; p < menuinfo+ACOUNT(menuinfo); ++p)
+    {
+#ifdef ENABLE_NLS
+    	p->title = gettext(p->title);
+#endif
+    	*(p->store) = g_tree_new((GCompareFunc) g_utf8_collate);
     }
-}
 
-/**
- * @return True if all categories received description data
- */
-void load_folder_descriptions(const tCharVec& where) {
-    for (const gchar* const * p = where.data; p < where.data + where.size;
-            ++p) {
-        proc_dir_rec(*p, 0, pickup_folder_info, "desktop-directories",
-                "directory");
-    }
+    qsort(menuinfo, ACOUNT(menuinfo)-1, sizeof(menuinfo[0]), cmpstringp);
 }
 
-#ifdef DEBUG_xxx
-void dbgPrint(const gchar *msg)
+int main(int argc, const char **argv)
 {
-    tlog("%s", msg);
-}
-#endif
+	ApplicationName = my_basename(argv[0]);
 
-int main(int argc, LPCSTR *argv) {
-    ApplicationName = my_basename(argv[0]);
+	init();
 
-#if !GLIB_CHECK_VERSION(2,36,0)
-    g_type_init();
-#endif
+	const char * usershare=getenv("XDG_DATA_HOME"),
+			*sysshare=getenv("XDG_DATA_DIRS");
 
-#ifdef DEBUG_xxx
-    // XXX: if enabled, one probably also need to enable debug facilities in its code, like
-    // what --debug option does
-    g_set_printerr_handler(dbgPrint);
-    g_set_print_handler(dbgPrint);
+	if(!usershare || !*usershare)
+		usershare=g_strjoin(NULL, getenv("HOME"), "/.local/share", NULL);
+
+	if(!sysshare || !*sysshare)
+		sysshare="/usr/local/share:/usr/share";
+
+	if(argc>1)
+	{
+		if (is_version_switch(argv[1]))
+			print_version_exit(VERSION);
+
+		if(strstr(argv[1], ".desktop") && launch(argv[1], argv+2, argc-2))
+			return EXIT_SUCCESS;
+
+		g_fprintf(stderr, "This program doesn't use command line options. It only listens to\n"
+			"environment variables defined by XDG Base Directory Specification.\n"
+			"XDG_DATA_HOME=%s\n"
+				"XDG_DATA_DIRS=%s\n"
+			,usershare, sysshare);
+		return EXIT_FAILURE;
+	}
+	gchar **ppDirs = g_strsplit (sysshare, ":", -1);
+#ifdef FREEASAP
+	g_strfreev(ppDirs);
 #endif
+	for (const gchar * const * p = ppDirs; *p; ++p)
+	{
+		gchar *pmdir = g_strjoin(0, *p, "/applications", NULL);
+		proc_dir(pmdir);
+		opt_g_free(pmdir);
+	}
+	// user's stuff might replace the system links
+	gchar *usershare_full = g_strjoin(NULL, usershare, "/applications", NULL);
+	proc_dir(usershare_full);
+	opt_g_free(usershare_full);
 
-    LPCSTR usershare = getenv("XDG_DATA_HOME");
-    if (!usershare || !*usershare)
-        usershare = g_strjoin(nullptr, getenv("HOME"), "/.local/share", NULL);
-
-    // system dirs, either from environment or from static locations
-    LPCSTR sysshare = getenv("XDG_DATA_DIRS");
-    if (!sysshare || !*sysshare)
-        sysshare = "/usr/local/share:/usr/share";
-
-    if (argc == 2 && checkSuffix(argv[1], "desktop")
-            && launch(argv[1], argv + 2, argc - 2)) {
-        return EXIT_SUCCESS;
-    }
+	dump_menu();
 
-    for (LPCSTR *pArg = argv + 1; pArg < argv + argc; ++pArg) {
-        if (is_version_switch(*pArg))
-            print_version_exit(VERSION);
-        if (is_copying_switch(*pArg))
-            print_copying_exit();
-        if (is_help_switch(*pArg))
-            help(usershare, sysshare, stdout, EXIT_SUCCESS);
-        if (is_long_switch(*pArg, "seps")) {
-            add_sep_before = add_sep_after = true;
-            continue;
-        }
-        if (is_long_switch(*pArg, "sep-before")) {
-            add_sep_before = true;
-            continue;
-        }
-        if (is_long_switch(*pArg, "sep-after")) {
-            add_sep_after = true;
-            continue;
-        }
-        if (is_long_switch(*pArg, "no-sep-others")) {
-            no_sep_others = true;
-            continue;
-        }
-        if (is_long_switch(*pArg, "no-sub-cats")) {
-            no_sub_cats = true;
-            continue;
-        }
-        // unknown option?
-        help(usershare, sysshare, stderr, EXIT_FAILURE);
-    }
-
-    init();
-    split_folders(sysshare, sys_folders);
-    split_folders(usershare, home_folders);
-
-    load_folder_descriptions(sys_folders);
-    load_folder_descriptions(home_folders);
-
-    process_apps(sys_folders);
-    process_apps(home_folders);
-
-    root.print();
-
-    return EXIT_SUCCESS;
+	return EXIT_SUCCESS;
 }
-
-// vim: set sw=4 ts=4 et:
diff -Naur icewm-20211011/src/icesm.cc icewm-20211011.edited4/src/icesm.cc
--- icewm-20211011/src/icesm.cc	2021-04-14 19:35:37.000000000 -0400
+++ icewm-20211011.edited4/src/icesm.cc	2021-04-19 16:39:35.000000000 -0400
@@ -769,8 +769,9 @@
     xapp.runScript("shutdown");
     xapp.runIcewmtray(true);
     xapp.runWM(true);
-    xapp.runIcewmbg(true);
-    xapp.runIcesound(true);
+// Absolute Linux does not use icewmbg or icesound
+//    xapp.runIcewmbg(true);
+//    xapp.runIcesound(true);
 
     return status;
 }
diff -Naur icewm-20211011/src/wmabout.cc icewm-20211011.edited4/src/wmabout.cc
--- icewm-20211011/src/wmabout.cc	2021-04-14 19:35:37.000000000 -0400
+++ icewm-20211011.edited4/src/wmabout.cc	2021-04-19 22:03:13.000000000 -0400
@@ -26,9 +26,10 @@
 {
     const char version[] = "IceWM " VERSION " (" HOSTOS "/" HOSTCPU ")";
     mstring copyright = mstring("Copyright ")
-                      + _("(C)") + " 1997-2012 Marko Macek, "
-                      + _("(C)") + " 2001 Mathias Hasselmann";
-
+                      + _("(C)") + " 1997-2012 Marko Macek, " 
+                      + _("(C)") + " 2001 Mathias Hasselmann" 
+					  + " \nEdited for Absolute Linux by Paul Sherman";
+	
     Ladder* ladder = new Ladder();
     *ladder += label(version);
     *ladder += label(copyright);
diff -Naur icewm-20211011/src/wmaction.h icewm-20211011.edited4/src/wmaction.h
--- icewm-20211011/src/wmaction.h	2021-04-14 19:35:37.000000000 -0400
+++ icewm-20211011.edited4/src/wmaction.h	2022-07-24 19:54:55.287620245 -0400
@@ -105,6 +105,16 @@
     actionLayerAboveAll      = 241,
 
     actionAboutClose         = 243,
+	
+	actionRefreshMenu		 = 300,
+	actionSetBackground		 = 310,
+	actionSetGamma		     = 311,
+	actionScreenLock	     = 312,
+	actionGTKTheme		     = 313,
+	actionSetDeskIcons		 = 314,
+	action_tLogin			 = 320,
+	action_gLogin			 = 321,
+	action_aLogin			 = 322,
 };
 
 bool canShutdown(RebootShutdown reboot);
diff -Naur icewm-20211011/src/wmapp.cc icewm-20211011.edited4/src/wmapp.cc
--- icewm-20211011/src/wmapp.cc	2021-04-14 19:35:37.000000000 -0400
+++ icewm-20211011.edited4/src/wmapp.cc	2022-07-24 20:01:08.692654774 -0400
@@ -38,6 +38,7 @@
 #include <X11/Xproto.h>
 #include "ywordexp.h"
 #include "intl.h"
+#include <stdlib.h>
 
 char const *ApplicationName("IceWM");
 RebootShutdown rebootOrShutdown = Logout;
@@ -364,33 +365,6 @@
 void LogoutMenu::updatePopup() {
     if (itemCount())
         return;
-
-    if (showLogoutMenu) {
-        setShared(true); /// !!! get rid of this (refcount objects)
-        if (showLogoutSubMenu) {
-            addItem(_("_Logout"), -2, null, actionLogout);
-            addItem(_("_Cancel logout"), -2, null, actionCancelLogout)->setEnabled(false);
-            addSeparator();
-
-            int const oldItemCount = itemCount();
-            if (canLock())
-                addItem(_("Lock _Workstation"), -2, null, actionLock, "lock");
-            if (canShutdown(Reboot))
-                addItem(_("Re_boot"), -2, null, actionReboot, "reboot");
-            if (canShutdown(Shutdown))
-                addItem(_("Shut_down"), -2, null, actionShutdown, "shutdown");
-            if (couldRunCommand(suspendCommand))
-                addItem(_("_Sleep mode"), -2, null, actionSuspend, "suspend");
-
-            if (itemCount() != oldItemCount)
-                addSeparator();
-
-            addItem(_("Restart _Icewm"), -2, null, actionRestart, "restart");
-
-            addItem(_("Restart _Xterm"), -2, null, actionRestartXterm, "xterm");
-
-        }
-    }
 }
 
 void LayerMenu::updatePopup() {
@@ -768,6 +742,24 @@
         runCommand(runDlgCommand);
     } else if (action == actionExit) {
         exit(0);
+    } else if (action == action_tLogin) {
+        system("/usr/local/bin/set_login_type 3&");
+    } else if (action == action_gLogin) {
+        system("/usr/local/bin/set_login_type 4&");
+    } else if (action == action_aLogin) {
+        system("/usr/local/bin/autologin_set&");
+    } else if (action == actionRefreshMenu) {
+        system("/usr/local/bin/refreshmenu&");
+    } else if (action == actionSetDeskIcons) {
+        system("/usr/local/bin/idesktool&");
+    } else if (action == actionSetBackground) {
+        system("/usr/local/bin/setBackground.py&");
+    } else if (action == actionSetGamma) {
+        system("/usr/local/bin/absgamma.py&");
+    } else if (action == actionScreenLock) {
+        system("/usr/local/bin/xlock_chooser&");
+    } else if (action == actionGTKTheme) {
+        system("/usr/local/bin/setgtktheme.py&");
     } else if (action == actionFocusClickToFocus) {
         setFocusMode(FocusClick);
     } else if (action == actionFocusMouseSloppy) {
@@ -1662,17 +1654,7 @@
 
 void YWMApp::doLogout(RebootShutdown reboot) {
     rebootOrShutdown = reboot;
-    if (!confirmLogout)
-        logout();
-    else {
-        if (fLogoutMsgBox) {
-            fLogoutMsgBox->unmanage();
-        }
-        fLogoutMsgBox = new YMsgBox(YMsgBox::mbBoth,
-                            _("Confirm Logout"),
-                            _("Logout will close all active applications.\n"
-                              "Proceed?"), this, "logout");
-    }
+	logout();
 }
 
 void YWMApp::logout() {
diff -Naur icewm-20211011/src/wmdialog.cc icewm-20211011.edited4/src/wmdialog.cc
--- icewm-20211011/src/wmdialog.cc	2021-04-14 19:35:37.000000000 -0400
+++ icewm-20211011.edited4/src/wmdialog.cc	2021-04-19 20:44:50.000000000 -0400
@@ -13,6 +13,7 @@
 #include "wmmgr.h"
 #include "ypointer.h"
 #include "intl.h"
+#include <stdlib.h>
 
 #define HORZ 10
 #define MIDH 10
@@ -66,7 +67,7 @@
 
     lockButton = addButton(_("Loc_k Workstation"), w, h);
     // TRANSLATORS: This means "energy saving mode" or "suspended system". Not "interrupt". Not "hibernate".
-    suspendButton = addButton(_("_Sleep mode"), w, h);
+    taskmanButton = addButton(_("Task Manager"), w, h);
     cancelButton = addButton(_("_Cancel"), w, h);
     logoutButton = addButton(_("_Logout..."), w, h);
     rebootButton = addButton(_("Re_boot"), w, h);
@@ -81,8 +82,8 @@
         shutdownButton->setEnabled(false);
     if (!canLock())
         lockButton->setEnabled(false);
-    if (!couldRunCommand(suspendCommand))
-        suspendButton->setEnabled(false);
+    
+	taskmanButton->setEnabled(true);
 
     setSize(HORZ + w + MIDH + w + MIDH + w + HORZ,
             VERT + h + MIDV + h + MIDV + h + VERT);
@@ -94,7 +95,7 @@
                 dy + (dh - height()) / 2);
 
     lockButton->setGeometry(YRect(HORZ, VERT, w, h));
-    suspendButton->setGeometry(YRect(HORZ + w + MIDH, VERT, w, h));
+    taskmanButton->setGeometry(YRect(HORZ + w + MIDH, VERT, w, h));
     cancelButton->setGeometry(YRect(HORZ + w + MIDH + w + MIDH, VERT, w, h));
     logoutButton->setGeometry(YRect(HORZ, VERT + h + MIDV, w, h));
     rebootButton->setGeometry(YRect(HORZ + w + MIDH, VERT + h + MIDV, w, h));
@@ -110,7 +111,7 @@
 
 CtrlAltDelete::~CtrlAltDelete() {
     delete lockButton; lockButton = nullptr;
-    delete suspendButton; suspendButton = nullptr;
+    delete taskmanButton; taskmanButton = nullptr;
     delete cancelButton; cancelButton = nullptr;
     delete logoutButton; logoutButton = nullptr;
     delete rebootButton; rebootButton = nullptr;
@@ -153,8 +154,8 @@
         manager->doWMAction(ICEWM_ACTION_SHUTDOWN);
     } else if (action == *rebootButton) {
         manager->doWMAction(ICEWM_ACTION_REBOOT);
-    } else if (action == *suspendButton) {
-        manager->doWMAction(ICEWM_ACTION_SUSPEND);
+    } else if (action == *taskmanButton) {
+        system("/usr/bin/qps&");
     } else if (action == *aboutButton) {
         manager->doWMAction(ICEWM_ACTION_ABOUT);
     } else if (action == *windowListButton) {
diff -Naur icewm-20211011/src/wmdialog.h icewm-20211011.edited4/src/wmdialog.h
--- icewm-20211011/src/wmdialog.h	2021-04-14 19:35:37.000000000 -0400
+++ icewm-20211011.edited4/src/wmdialog.h	2021-04-19 20:45:29.000000000 -0400
@@ -22,7 +22,7 @@
     void deactivate();
 private:
     YActionButton *lockButton;
-    YActionButton *suspendButton;
+    YActionButton *taskmanButton;
     YActionButton *logoutButton;
     YActionButton *restartButton;
     YActionButton *cancelButton;
diff -Naur icewm-20211011/src/wmprog.cc icewm-20211011.edited4/src/wmprog.cc
--- icewm-20211011/src/wmprog.cc	2021-04-14 19:35:37.000000000 -0400
+++ icewm-20211011.edited4/src/wmprog.cc	2022-07-24 23:25:17.571787428 -0400
@@ -337,6 +337,12 @@
     }
 }
 
+LoginMenu::LoginMenu() {
+	addItem(("Text Based"), -2, null, action_tLogin);
+	addItem(("Graphic"), -2, null, action_gLogin);
+	addItem(("AutoLogin"), -2, null, action_aLogin);
+}
+
 HelpMenu::HelpMenu(
     IApp *app,
     YSMListener *smActionListener,
@@ -417,39 +423,37 @@
         settings->addItem(_("_About"), -2, actionAbout, nullptr, "about");
     }
 
-    if (showHelp) {
-        HelpMenu* help = new HelpMenu(app, smActionListener, wmActionListener);
-        settings->addSubmenu(_("_Help"), -2, help, "help");
-    }
-
-    if (showFocusModeMenu) {
-        FocusMenu *focus = new FocusMenu();
-        settings->addSubmenu(_("_Focus"), -2, focus, "focus");
-    }
-
-    if (showSettingsMenu) {
-        PrefsMenu *prefs = new PrefsMenu();
-        settings->addSubmenu(_("_Preferences"), -2, prefs, "pref");
-    }
-
+	settings->addItem(_("Restart _Icewm"), -2, null, actionRestart, "restart");	
+	settings->addItem(_("Refresh Menu"), -2, actionRefreshMenu, 0, "refresh");
+	settings->addSeparator();
     if (showThemesMenu) {
         YMenu *themes = new ThemesMenu(app, smActionListener, wmActionListener);
-        settings->addSubmenu(_("_Themes"), -2, themes, "themes");
+        settings->addSubmenu(_("Icewm Themes"), -2, themes, "list");
     }
-
+	settings->addItem(("GTK Theme"), -2, actionGTKTheme, 0, "themes");
+	settings->addSeparator();
+	
+	settings->addItem(("Desktop Icons"), -2, actionSetDeskIcons, 0, "desktop-tool");
+	settings->addItem(("Desktop Background"), -2, actionSetBackground, 0, "wallpaper");
+	settings->addItem(("Monitor Gamma"), -2, actionSetGamma, 0, "absgamma");
+	settings->addItem(("Set Lock Screen"), -2, actionScreenLock, 0, "lockscreen");
+	
+	settings->addSeparator();
+	
+	LoginMenu *login_type = new LoginMenu();
+	settings->addSubmenu(("Login Type"), -2, login_type, "list");
     if (settings->itemCount()) {
         addSubmenu(_("Se_ttings"), -2, settings, "settings");
     } else {
         delete settings;
-    }
+    }		
+	
+	addSeparator();
+	
+	addItem(_("Logout"), -2, null, actionLogout, "logout");
+	addItem(_("Reboot"), -2, null, actionReboot, "reboot");
+	addItem(_("Shut_down"), -2, null, actionShutdown, "shutdown");
 
-    if (showLogoutMenu) {
-        addSeparator();
-        if (showLogoutSubMenu)
-            addItem(_("_Logout..."), -2, actionLogout, logoutMenu, "logout");
-        else
-            addItem(_("_Logout..."), -2, null, actionLogout, "logout");
-    }
 }
 
 // vim: set sw=4 ts=4 et:
diff -Naur icewm-20211011/src/wmprog.h icewm-20211011.edited4/src/wmprog.h
--- icewm-20211011/src/wmprog.h	2021-04-14 19:35:37.000000000 -0400
+++ icewm-20211011.edited4/src/wmprog.h	2021-04-19 21:11:19.000000000 -0400
@@ -136,6 +136,11 @@
     FocusMenu();
 };
 
+class LoginMenu: public YMenu {
+public:
+    LoginMenu();
+};
+
 class HelpMenu: public ObjectMenu {
 public:
     HelpMenu(IApp *app,
diff -Naur icewm-20211011/src/wmtaskbar.cc icewm-20211011.edited4/src/wmtaskbar.cc
--- icewm-20211011/src/wmtaskbar.cc	2021-04-14 19:35:37.000000000 -0400
+++ icewm-20211011.edited4/src/wmtaskbar.cc	2021-04-19 20:11:46.000000000 -0400
@@ -329,7 +329,7 @@
         fApplications = new ObjectButton(this, new LazyRootMenu);
         fApplications->setActionListener(this);
         fApplications->setImage(taskbarStartImage);
-        fApplications->setToolTip(_("Favorite Applications"));
+        fApplications->setToolTip(_("Start Menu\n\nPress:\nCtrl-Alt-Del\nfor the Task Menu"));
         fApplications->setTitle("TaskBarMenu");
     } else
         fApplications = nullptr;
diff -Naur icewm-20211011/src/yprefs.h icewm-20211011.edited4/src/yprefs.h
--- icewm-20211011/src/yprefs.h	2021-04-14 19:35:37.000000000 -0400
+++ icewm-20211011.edited4/src/yprefs.h	2021-04-19 19:32:40.000000000 -0400
@@ -5,7 +5,7 @@
 
 XIV(bool, dontRotateMenuPointer,                true)
 XIV(bool, fontPreferFreetype,                   true)
-XIV(bool, menuMouseTracking,                    false)
+XIV(bool, menuMouseTracking,                    true)
 XIV(bool, replayMenuCancelClick,                false)
 XIV(bool, showPopupsAbovePointer,               false)
 XIV(bool, showEllipsis,                         true)
@@ -31,10 +31,9 @@
 XIV(bool, grabRootWindow,                       true)
 
 XSV(const char *, iconPath,
-                                                "/usr/local/share/icons:"
-                                                "/usr/local/share/pixmaps:"
-                                                "/usr/share/icons:"
                                                 "/usr/share/pixmaps:"
+                                                "/usr/share/icewm/icons:"
+												"/usr/share/icons/hicolor:"
                                                 )
 XSV(const char *, iconThemes,                   "*:-HighContrast")
 XSV(const char *, themeName,                    CONFIG_DEFAULT_THEME)
@@ -57,7 +56,7 @@
 
 XSV(const char *, clrToolTip,                   "rgb:E0/E0/00")
 XSV(const char *, clrToolTipText,               "rgb:00/00/00")
-XFV(const char *, toolTipFontName,              FONT(120), "sans-serif:size=12")
+XFV(const char *, toolTipFontName,              FONT(120), "sans-serif:size=11")
 
 #endif
 
