Met Big Sur, kunnen we niet meer met zekerheid bepalen welke kleur we onze Trayicons moeten geven in de systeem mebubar.
Helaas is nu de menubalk standaard transparant, en heeft de opmaak en kleur van wallpaper een grote invloed op hoe donker of hoe licht de achtergrondkleur van de balk gaat zijn. Simpel bepalen of het nu Dark of Light theme is, is niet meer genoeg.
Na lang zoeken vond ik dat de image van een Coca trayicon (NSStatusItem?) optineel op op automatisch kan worden gezxet met de setTemplate functie. Als je dit doet, dan bepaald macOS automatisch de kleur voor de Trayicon - mits je een transparante icon hebt met alleen maar zwarte pixels.
In Lazarus kunnen we dit snel doen door het volgende bestand aan te passen:
lazarus/lcl/interfaces/cocoa/cocoatrayicon.inc
Hier moeten we de image op "template"=true zetten.
In cocoatrayicon.inc heb ik de volgende regel aan de lclSetTrayIcon procedure toegevoegd om dit te bewerkstelligen:
image.setTemplate(true);
Ik heb deze regel in het (ATrayIcon.icon <> nil) blok gezet (regel 11):
procedure TCocoaStatusItemHandle.lclSetTrayIcon(ATrayIcon: TCustomTrayIcon);
var
image: NSImage;
begin
TrayIcon := ATrayIcon;
// Shows the icon
if (ATrayIcon.icon <> nil) and (ATrayIcon.icon.Handle <> 0) then
begin
image := TCocoaBitmap(ATrayIcon.icon.Handle).image;
image.setTemplate(true); // < --- added this line
if image <> nil then statusitem.setImage(image);
end;
// Show the menu
if (ATrayIcon.PopUpMenu <> nil) then
begin
ATrayIcon.PopUpMenu.HandleNeeded();
//ATrayIcon.PopUpMenu.
if Assigned(statusitem.menu) and (statusitem.menu.delegate = NSMenuDelegateProtocol(self)) then
statusitem.menu.setDelegate(nil);
statusitem.setMenu(TCocoaMenu(ATrayIcon.PopUpMenu.Handle));
TCocoaMenu(ATrayIcon.PopUpMenu.Handle).setDelegate( self);
end;
end;
Did werk geweldig goed, alleen moet je nu wel opletten met icons die meerdere kleuren gebruiken omdat het automatisch omzetten van de kleuren niet altijd even goed gaat. Alleen transparante icons met zwarte pixels werkt uitstekend.