1: /*
     2:  ============================================================================
     3:  xoblite™ -> an advanced "extended shell" for Microsoft® Windows® 11
     4:  Copyright © 2002-2026 Karl Henrik Henriksson [qwilk/@xoblite]
     5:  Copyright © 2001-2004 The Blackbox for Windows Development Team
     6:  http://xoblite.net/ + https://github.com/xoblite/
     7:  ============================================================================
     8: 
     9:   Blackbox for Windows is free software, released under the
    10:   GNU General Public License (GPL version 2 or later), with an extension
    11:   that allows linking of proprietary modules under a controlled interface.
    12:   What this means is that plugins etc. are allowed to be released
    13:   under any license the author wishes. Please note, however, that the
    14:   original Blackbox gradient math code used in Blackbox for Windows
    15:   is available under the BSD license.
    16: 
    17:   http://www.fsf.org/licenses/gpl.html
    18:   http://www.fsf.org/licenses/gpl-faq.html#LinkingOverControlledInterface
    19:   http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5
    20: 
    21:   This program is distributed in the hope that it will be useful,
    22:   but WITHOUT ANY WARRANTY; without even the implied warranty of
    23:   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    24:   GNU General Public License for more details.
    25: 
    26:   For additional license information, please read the included license.html.
    27: 
    28:  ============================================================================
    29: */
    30: 
    31: #include "..\API\BBApi.h" 
    32: #include "..\Menu\MenuCommon.h" 
    33: #include "DesktopMenu.h" 
    34: #include "..\Menu\MenuItem.h" 
    35: #include "..\Menu\FolderItem.h" 
    36: #include "..\Settings\ConfigMenu.h" 
    37: #include "..\Hotkeys\Hotkeys.h" 
    38: #include "..\Settings\Settings.h" 
    39: 
    40: extern MenuCommon *pMenuCommon;
    41: extern Desktop* pDesktop;
    42: extern Settings *pSettings;
    43: 
    44: #define GROUP_DESKTOP_CLOCK 1 
    45: 
    46: //===========================================================================
    47: 
    48: DesktopMenu::DesktopMenu(char* pszTitle) : FolderItem(NULL, pszTitle, NULL)
    49: {
    50: }
    51: 
    52: DesktopMenu::~DesktopMenu()
    53: {
    54:     m_pParent->RemoveChild(m_pSubMenu);
    55:     if (m_pSubMenu) delete m_pSubMenu;
    56:     m_pSubMenu = NULL;
    57: }
    58: 
    59: //===========================================================================
    60: 
    61: bool DesktopMenu::Active(bool bActivate)
    62: {
    63:     if (bActivate && !m_bActive) UpdateFolder();
    64:     return FolderItem::Active(bActivate);
    65: }
    66: 
    67: void DesktopMenu::Attached(Menu* pMenu)
    68: {
    69:     m_pParent = pMenu;
    70:     m_pSubMenu = new Menu(pMenuCommon->hInst);
    71:     m_pParent->AddChild(m_pSubMenu);
    72:     m_pSubMenu->SetParent(m_pParent);
    73: }
    74: 
    75: //===========================================================================
    76: 
    77: void DesktopMenu::UpdateFolder()
    78: {
    79:     m_pSubMenu->DeleteMenuItems();
    80:     pMenuCommon->AddHeaderItem(m_pSubMenu, m_pszTitleANSI);
    81: 
    82:     char temp[MAX_LINE_LENGTH];
    83: 
    84:     //====================
    85: 
    86:     Menu* desktopWidgetPlacementsSubMenu = MakeMenu("Placement");
    87: 
    88:     if (pSettings->desktopClockPlacement.placement == PLACEMENT_MANUAL)
    89:     {
    90:         sprintf_s(temp, sizeofArray(temp), "Clock: <%s>", pSettings->desktopClockPlacement.rcString);
    91:         pMenuCommon->CreateMenuItem(desktopWidgetPlacementsSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Clock Placement", pSettings->desktopClockPlacement.rcString, temp, false);
    92:     }
    93:     else if (pSettings->desktopClockPlacement.placement == PLACEMENT_DEFAULT) pMenuCommon->CreateMenuItem(desktopWidgetPlacementsSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Clock Placement", "Default", "Clock: <Default>", false);
    94:     else pMenuCommon->CreateMenuItem(desktopWidgetPlacementsSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Clock Placement", "Manual x0 y0", "Clock: <Manual x0 y0>", false);
    95: 
    96:     if (pSettings->desktopWeekdayPlacement.placement == PLACEMENT_MANUAL)
    97:     {
    98:         sprintf_s(temp, sizeofArray(temp), "Weekday: <%s>", pSettings->desktopWeekdayPlacement.rcString);
    99:         pMenuCommon->CreateMenuItem(desktopWidgetPlacementsSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Weekday Placement", pSettings->desktopWeekdayPlacement.rcString, temp, false);
   100:     }
   101:     else pMenuCommon->CreateMenuItem(desktopWidgetPlacementsSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Weekday Placement", "Manual x0 y0", "Weekday: <Manual x0 y0>", false);
   102: 
   103:     if (pSettings->desktopDatePlacement.placement == PLACEMENT_MANUAL)
   104:     {
   105:         sprintf_s(temp, sizeofArray(temp), "Date: <%s>", pSettings->desktopDatePlacement.rcString);
   106:         pMenuCommon->CreateMenuItem(desktopWidgetPlacementsSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Date Placement", pSettings->desktopDatePlacement.rcString, temp, false);
   107:     }
   108:     else pMenuCommon->CreateMenuItem(desktopWidgetPlacementsSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Date Placement", "Manual x0 y0", "Date: <Manual x0 y0>", false);
   109: 
   110:     if (pSettings->desktopGreetingPlacement.placement == PLACEMENT_MANUAL)
   111:     {
   112:         sprintf_s(temp, sizeofArray(temp), "Greeting: <%s>", pSettings->desktopGreetingPlacement.rcString);
   113:         pMenuCommon->CreateMenuItem(desktopWidgetPlacementsSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Greeting Placement", pSettings->desktopGreetingPlacement.rcString, temp, false);
   114:     }
   115:     else pMenuCommon->CreateMenuItem(desktopWidgetPlacementsSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Greeting Placement", "Manual x0 y0", "Greeting: <Manual x0 y0>", false);
   116: 
   117:     MakeSubmenu(m_pSubMenu, desktopWidgetPlacementsSubMenu, "Placement");
   118: 
   119:     //====================
   120: 
   121:     Menu* desktopTransparencySubMenu = MakeMenu("Transparency");
   122: 
   123:     sprintf_s(temp, sizeofArray(temp), "\"@xoblite Desktop Clock Transparency\" %d 1 255", pSettings->desktopClockTransparencyAlpha);
   124:     pMenuCommon->CreateMenuItem(desktopTransparencySubMenu, MENUITEM_EDITINT, temp, NULL, "Clock:", false);
   125:     sprintf_s(temp, sizeofArray(temp), "\"@xoblite Desktop Weekday Transparency\" %d 1 255", pSettings->desktopWeekdayTransparencyAlpha);
   126:     pMenuCommon->CreateMenuItem(desktopTransparencySubMenu, MENUITEM_EDITINT, temp, NULL, "Weekday:", false);
   127:     sprintf_s(temp, sizeofArray(temp), "\"@xoblite Desktop Date Transparency\" %d 1 255", pSettings->desktopDateTransparencyAlpha);
   128:     pMenuCommon->CreateMenuItem(desktopTransparencySubMenu, MENUITEM_EDITINT, temp, NULL, "Date:", false);
   129:     sprintf_s(temp, sizeofArray(temp), "\"@xoblite Desktop Greeting Transparency\" %d 1 255", pSettings->desktopGreetingTransparencyAlpha);
   130:     pMenuCommon->CreateMenuItem(desktopTransparencySubMenu, MENUITEM_EDITINT, temp, NULL, "Greeting:", false);
   131: 
   132:     MakeSubmenu(m_pSubMenu, desktopTransparencySubMenu, "Transparency");
   133: 
   134:     //====================
   135: 
   136:     Menu* desktopWidgetOrderSubMenu = MakeMenu("Order");
   137: 
   138:     Menu* desktopWidgetOrderClockSubMenu = MakeMenu("Clock");
   139:     Menu* desktopWidgetOrderClockWeekdaySubMenu = MakeMenu("Weekday");
   140:     pMenuCommon->CreateMenuItem(desktopWidgetOrderClockWeekdaySubMenu, MENUITEM_BOOLEAN, "@xoblite Desktop Widgets Order xxxx", NULL, "... Date Greeting", false);
   141:     pMenuCommon->CreateMenuItem(desktopWidgetOrderClockWeekdaySubMenu, MENUITEM_BOOLEAN, "@xoblite Desktop Widgets Order xxxx", NULL, "... Greeting Date", false);
   142:     MakeSubmenu(desktopWidgetOrderClockSubMenu, desktopWidgetOrderClockWeekdaySubMenu, "Weekday");
   143:     Menu* desktopWidgetOrderClockDateSubMenu = MakeMenu("Date");
   144:     pMenuCommon->CreateMenuItem(desktopWidgetOrderClockDateSubMenu, MENUITEM_BOOLEAN, "@xoblite Desktop Widgets Order xxxx", NULL, "... Weekday Greeting", false);
   145:     pMenuCommon->CreateMenuItem(desktopWidgetOrderClockDateSubMenu, MENUITEM_BOOLEAN, "@xoblite Desktop Widgets Order xxxx", NULL, "... Greeting Weekday", false);
   146:     MakeSubmenu(desktopWidgetOrderClockSubMenu, desktopWidgetOrderClockDateSubMenu, "Date");
   147:     Menu* desktopWidgetOrderClockGreetingSubMenu = MakeMenu("Greeting");
   148:     pMenuCommon->CreateMenuItem(desktopWidgetOrderClockGreetingSubMenu, MENUITEM_BOOLEAN, "@xoblite Desktop Widgets Order xxxx", NULL, "... Date Weekday", false);
   149:     pMenuCommon->CreateMenuItem(desktopWidgetOrderClockGreetingSubMenu, MENUITEM_BOOLEAN, "@xoblite Desktop Widgets Order xxxx", NULL, "... Weekday Date", false);
   150:     MakeSubmenu(desktopWidgetOrderClockSubMenu, desktopWidgetOrderClockGreetingSubMenu, "Greeting");
   151:     MakeSubmenu(desktopWidgetOrderSubMenu, desktopWidgetOrderClockSubMenu, "Clock");
   152: 
   153:     Menu* desktopWidgetOrderWeekdaySubMenu = MakeMenu("Weekday");
   154:     MakeSubmenu(desktopWidgetOrderSubMenu, desktopWidgetOrderWeekdaySubMenu, "Weekday");
   155: 
   156:     Menu* desktopWidgetOrderDateSubMenu = MakeMenu("Date");
   157:     MakeSubmenu(desktopWidgetOrderSubMenu, desktopWidgetOrderDateSubMenu, "Date");
   158: 
   159:     Menu* desktopWidgetOrderGreetingSubMenu = MakeMenu("Greeting");
   160:     MakeSubmenu(desktopWidgetOrderSubMenu, desktopWidgetOrderGreetingSubMenu, "Greeting");
   161: 
   162:     MakeSubmenu(m_pSubMenu, desktopWidgetOrderSubMenu, "Order");
   163: 
   164:     //====================
   165: 
   166:     Menu* desktopFontSubMenu = MakeMenu("Font");
   167: 
   168:     char fontAsString[128];
   169: 
   170:     sprintf_s(fontAsString, sizeofArray(fontAsString), "%s/%u/", pSettings->desktopClockFont, pSettings->desktopClockFontHeight);
   171:     if (pSettings->desktopClockFontWeight == FW_BOLD) strcat_s(fontAsString, "Bold");
   172:     else strcat_s(fontAsString, "Normal");
   173:     sprintf_s(temp, sizeofArray(temp), "Clock: <%s>", fontAsString);
   174:     pMenuCommon->CreateMenuItem(desktopFontSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Clock Font", fontAsString, temp, false);
   175: 
   176:     sprintf_s(fontAsString, sizeofArray(fontAsString), "%s/%u/", pSettings->desktopWeekdayFont, pSettings->desktopWeekdayFontHeight);
   177:     if (pSettings->desktopWeekdayFontWeight == FW_BOLD) strcat_s(fontAsString, "Bold");
   178:     else strcat_s(fontAsString, "Normal");
   179:     sprintf_s(temp, sizeofArray(temp), "Weekday: <%s>", fontAsString);
   180:     pMenuCommon->CreateMenuItem(desktopFontSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Weekday Font", fontAsString, temp, false);
   181: 
   182:     sprintf_s(fontAsString, sizeofArray(fontAsString), "%s/%u/", pSettings->desktopDateFont, pSettings->desktopDateFontHeight);
   183:     if (pSettings->desktopDateFontWeight == FW_BOLD) strcat_s(fontAsString, "Bold");
   184:     else strcat_s(fontAsString, "Normal");
   185:     sprintf_s(temp, sizeofArray(temp), "Date: <%s>", fontAsString);
   186:     pMenuCommon->CreateMenuItem(desktopFontSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Date Font", fontAsString, temp, false);
   187: 
   188:     sprintf_s(fontAsString, sizeofArray(fontAsString), "%s/%u/", pSettings->desktopGreetingFont, pSettings->desktopGreetingFontHeight);
   189:     if (pSettings->desktopGreetingFontWeight == FW_BOLD) strcat_s(fontAsString, "Bold");
   190:     else strcat_s(fontAsString, "Normal");
   191:     sprintf_s(temp, sizeofArray(temp), "Greeting: <%s>", fontAsString);
   192:     pMenuCommon->CreateMenuItem(desktopFontSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Greeting Font", fontAsString, temp, false);
   193: 
   194:     MakeSubmenu(m_pSubMenu, desktopFontSubMenu, "Font");
   195: 
   196:     //====================
   197: 
   198:     Menu* desktopColorSubMenu = MakeMenu("Color");
   199: 
   200:     char tempColor[10];
   201:     sprintf_s(tempColor, sizeofArray(tempColor), "#%02x%02x%02x", GetRValue(pSettings->desktopClockColor), GetGValue(pSettings->desktopClockColor), GetBValue(pSettings->desktopClockColor));
   202:     sprintf_s(temp, sizeofArray(temp), "Clock: <%s>", tempColor);
   203:     pMenuCommon->CreateMenuItem(desktopColorSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Clock Color", tempColor, temp, false);
   204:     sprintf_s(tempColor, sizeofArray(tempColor), "#%02x%02x%02x", GetRValue(pSettings->desktopWeekdayColor), GetGValue(pSettings->desktopWeekdayColor), GetBValue(pSettings->desktopWeekdayColor));
   205:     sprintf_s(temp, sizeofArray(temp), "Weekday: <%s>", tempColor);
   206:     pMenuCommon->CreateMenuItem(desktopColorSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Weekday Color", tempColor, temp, false);
   207:     sprintf_s(tempColor, sizeofArray(tempColor), "#%02x%02x%02x", GetRValue(pSettings->desktopDateColor), GetGValue(pSettings->desktopDateColor), GetBValue(pSettings->desktopDateColor));
   208:     sprintf_s(temp, sizeofArray(temp), "Date: <%s>", tempColor);
   209:     pMenuCommon->CreateMenuItem(desktopColorSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Date Color", tempColor, temp, false);
   210:     sprintf_s(tempColor, sizeofArray(tempColor), "#%02x%02x%02x", GetRValue(pSettings->desktopGreetingColor), GetGValue(pSettings->desktopGreetingColor), GetBValue(pSettings->desktopGreetingColor));
   211:     sprintf_s(temp, sizeofArray(temp), "Greeting: <%s>", tempColor);
   212:     pMenuCommon->CreateMenuItem(desktopColorSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Greeting Color", tempColor, temp, false);
   213: 
   214:     MakeSubmenu(m_pSubMenu, desktopColorSubMenu, "Color");
   215: 
   216:     //====================
   217: 
   218:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   219: 
   220:     Menu* desktopClockSubMenu = MakeMenu("Clock type");
   221: 
   222:     MenuItem* groupItem;
   223:     groupItem = pMenuCommon->CreateMenuItem(desktopClockSubMenu, MENUITEM_BOOLEAN, "@xoblite Desktop Clock Regular", NULL, "Regular", !_stricmp(pSettings->desktopClockType, "Regular"));
   224:     groupItem->AddToSelectionGroup(GROUP_DESKTOP_CLOCK);
   225:     groupItem = pMenuCommon->CreateMenuItem(desktopClockSubMenu, MENUITEM_BOOLEAN, "@xoblite Desktop Clock Text", NULL, "Text", !_stricmp(pSettings->desktopClockType, "Text"));
   226:     groupItem->AddToSelectionGroup(GROUP_DESKTOP_CLOCK);
   227:     groupItem = pMenuCommon->CreateMenuItem(desktopClockSubMenu, MENUITEM_BOOLEAN, "@xoblite Desktop Clock Binary", NULL, "Binary", !_stricmp(pSettings->desktopClockType, "Binary"));
   228:     groupItem->AddToSelectionGroup(GROUP_DESKTOP_CLOCK);
   229: 
   230:     MakeSubmenu(m_pSubMenu, desktopClockSubMenu, "Clock type");
   231: 
   232:     //====================
   233: 
   234:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   235: 
   236:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_BOOLEAN, "@xoblite Desktop Toggle Clock", NULL, "Hide clock", pSettings->desktopClockHidden);
   237:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_BOOLEAN, "@xoblite Desktop Toggle Weekday", NULL, "Hide weekday", pSettings->desktopWeekdayHidden);
   238:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_BOOLEAN, "@xoblite Desktop Toggle Date", NULL, "Hide date", pSettings->desktopDateHidden);
   239:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_BOOLEAN, "@xoblite Desktop Toggle Greeting", NULL, "Hide greeting", pSettings->desktopGreetingHidden);
   240: 
   241:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   242: 
   243:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_BOOLEAN, "@xoblite Desktop Toggle Indicator", NULL, "Hide indicator", pSettings->desktopWorkspaceIndicatorHidden);
   244:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_BOOLEAN, "@xoblite Desktop Toggle Border", NULL, "Hide border", pSettings->desktopBorderHidden);
   245: 
   246:     pMenuCommon->CreateMenuItem(m_pSubMenu, MENUITEM_SEPARATOR, NULL, NULL, NULL, false);
   247: 
   248:     //====================
   249: 
   250:     Menu* desktopClickOverridesSubMenu = MakeMenu("Mouse click overrides");
   251: 
   252:     sprintf_s(temp, sizeofArray(temp), "R: <%s>", pSettings->desktopRClickOverride);
   253:     pMenuCommon->CreateMenuItem(desktopClickOverridesSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Click R", pSettings->desktopRClickOverride, temp, false);
   254:     sprintf_s(temp, sizeofArray(temp), "M: <%s>", pSettings->desktopMClickOverride);
   255:     pMenuCommon->CreateMenuItem(desktopClickOverridesSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Click M", pSettings->desktopMClickOverride, temp, false);
   256:     sprintf_s(temp, sizeofArray(temp), "X1: <%s>", pSettings->desktopX1ClickOverride);
   257:     pMenuCommon->CreateMenuItem(desktopClickOverridesSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Click X1", pSettings->desktopX1ClickOverride, temp, false);
   258:     sprintf_s(temp, sizeofArray(temp), "X2: <%s>", pSettings->desktopX2ClickOverride);
   259:     pMenuCommon->CreateMenuItem(desktopClickOverridesSubMenu, MENUITEM_EDITSTRING, "@xoblite Desktop Click X2", pSettings->desktopX2ClickOverride, temp, false);
   260: 
   261:     MakeSubmenu(m_pSubMenu, desktopClickOverridesSubMenu, "Mouse click overrides");
   262: 
   263:     //====================
   264: 
   265:     pMenuCommon->AddFooterItem(m_pSubMenu, "");
   266: 
   267:     m_pSubMenu->Invalidate();
   268:     m_pSubMenu->Validate();
   269: }
   270: 
   271: //===========================================================================
   272: