Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.





Deel:
Meldingen
Alles wissen

Lazarus Pascal - Big Sur - TrayIcon color fix


 Hans
(@hans)
Noble Member Admin
Deelgenomen: 8 jaar geleden
Berichten: 1774
Topic starter  

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.


BeantwoordenCiteren
Onderwerp trefwoorden
 Hans
(@hans)
Noble Member Admin
Deelgenomen: 8 jaar geleden
Berichten: 1774
Topic starter  

Al dit in een generieke functie:

B.B.: deze functie gebruikt ExtCtrls (voor TTrayIcon) en CocoaGDIObjects (voor TCocoaBitmap) 

procedure FixTrayIconColors(aTrayIcon: TTrayIcon);
{$IFDEF DARWIN}
var
  image: NSImage;
{$ENDIF}
begin
  {$IFDEF DARWIN}
    if Assigned(aTrayIcon.Icon) then
      begin
        image := TCocoaBitmap(aTrayIcon.icon.Handle).image;
        image.setTemplate(true);
        aTrayIcon.InternalUpdate;
      end;
  {$ENDIF}
end;         

BeantwoordenCiteren

Bevalt je wat je hier ziet, en wil je graag helpen? 

Uiteraard is de beste manier van helpen, door anderen hier te helpen met hun vragen. Maar je kunt ons ook op andere manieren helpen:

- Shop bijvoorbeeld bij Amazon, het kost je niks extra, maar het kan zijn dat wij een kleine commissie ontvangen,
- stuur me een koffie via PayPal ($5, $10, $20, or zelf kiezen),
- je kunt ook een Patreon worden,
- of BitCoin (BTC), of BitCoinCash (BCH) doneren.

Deel: