Voor wie de post "Hoe krijg ik Retina aan de gang" heeft gelezen, zal al wel gemerkt hebben dat dit lastiger is dan gedacht. Om het te laten werken moet je een terminal commando uitvoeren en dat wordt pas actief als het programma daarna pas gestart wordt.
Hiervoor wil ik mijn Lazarus programma zichzelf laten herstarten indien nodig en daarvoor (met kleine aanpassing) vond ik de volgende oplossing in het Lazarus Forum die onder Mac OS X werkt.
Zorg ervoor dat "Process" in de Uses clausule staat.
Als eerste definieren we een procedure "Restart()" welke je op elk moment kunt aanroepen - let er wel op dat je niet in een eindeloze loop terrecht komt!
procedure Restart;
VAR aProcess : TProcess; //TProcess is crossplatform is best way
begin
aProcess := TProcess.Create(nil);
aProcess.CommandLine := '"'+Application.ExeName+'"';
aProcess.Execute;
aProcess.Free;
Application.Terminate;
end;
Specifiek voor de Retina Mac's:
Ik heb het volgende (misschien wat slordige maar wel werkende) oplossing bedacht.
In het "OnCreate()" event van de hoofd form, kijken of AppleMaginifiedMode aanstaat of niet. Indien het aanstaat: uitschakelen en herstarten.
procedure TForm1.FormCreate(Sender: TObject);
var s:AnsiString;
begin
// Retina, requires a restart to become effective.
// First we read if the AppleMagnifiedMode is set or not
RunCommand('/usr/bin/defaults',['read','com.yourcompany.yourapp','AppleMagnifiedMode'],s);
// If set, it returns "Yes" (or possibly 1 or True - no guarantees here)
s:=Uppercase(s);
if (Pos('YES',s)>0) or (Pos('TRUE',s)>0) or (s='1') or (s='') then
begin
RunCommand('/usr/bin/defaults',['write','com.yourcompany.yourapp','AppleMagnifiedMode','NO'],s);
Restart;
end;
... // etc.