mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-15 14:16:07 -06:00
92 lines
No EOL
2.7 KiB
C++
92 lines
No EOL
2.7 KiB
C++
#include "Builders.h"
|
|
|
|
#ifdef PLATFORM_OSX
|
|
|
|
#include <Draw/Draw.h>
|
|
#include <plugin/png/png.h>
|
|
|
|
void GccBuilder::CocoaAppBundle()
|
|
{
|
|
if(!HasFlag("OSX") || !HasFlag("GUI"))
|
|
return;
|
|
|
|
String icns = GetFileFolder(GetFileFolder(target)) + "/Resources/icons.icns";
|
|
RealizePath(icns);
|
|
Time icns_tm = Nvl(GetFileTime(icns), Time::Low());
|
|
bool convert_icons = false;
|
|
|
|
SortedVectorMap<int, Image> imgs;
|
|
for(FindFile ff(PackageDirectory(mainpackage) + "/icon*.png"); ff; ff.Next()) {
|
|
Image m = StreamRaster::LoadFileAny(ff.GetPath());
|
|
Size sz = m.GetSize();
|
|
if(sz.cx == sz.cy) {
|
|
imgs.Add(sz.cx, m);
|
|
PutVerbose("Found icon " << ff.GetName());
|
|
if((Time)ff.GetLastWriteTime() >= icns_tm)
|
|
convert_icons = true;
|
|
}
|
|
}
|
|
if(imgs.GetCount() && convert_icons) {
|
|
String icons = AppendFileName(outdir, "icons.iconset");
|
|
RealizeDirectory(icons);
|
|
PutConsole("Exporting bundle icons to " + icons);
|
|
|
|
for(String fn : {
|
|
"icon_16x16.png",
|
|
"icon_16x16@2x.png",
|
|
"icon_32x32.png",
|
|
"icon_32x32@2x.png",
|
|
"icon_128x128.png",
|
|
"icon_128x128@2x.png",
|
|
"icon_256x256.png",
|
|
"icon_256x256@2x.png",
|
|
"icon_512x512.png",
|
|
"icon_512x512@2x.png",
|
|
}) {
|
|
int n = atoi(~fn + strlen("icon_"));
|
|
if(fn.Find("@2x") >= 0)
|
|
n *= 2;
|
|
int q = imgs.FindLowerBound(n);
|
|
Image img = q >= 0 && q < imgs.GetCount() ? imgs[q] : imgs[imgs.GetCount() - 1];
|
|
PutVerbose(String() << "Exporting " << fn << " from "
|
|
<< img.GetSize().cx << "x" << img.GetSize().cx);
|
|
PNGEncoder().SaveFile(AppendFileName(icons, fn), Rescale(img, n, n));
|
|
}
|
|
|
|
String exec = String() << "iconutil --convert icns --output \"" << icns << "\" \"" << icons << "\"";
|
|
Execute(exec);
|
|
}
|
|
|
|
if(IsNull(Info_plist)) {
|
|
Info_plist
|
|
<< "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
|
<< "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
|
|
<< "<plist version=\"1.0\">\n"
|
|
<< "<dict>\n"
|
|
<< " <key>CFBundleExecutable</key>\n"
|
|
<< " <string>" << GetFileName(target) << "</string>\n"
|
|
<< " <key>NSHighResolutionCapable</key>\n"
|
|
<< " <string>True</string>\n"
|
|
<< " <key>LSMinimumSystemVersion</key>\n"
|
|
<< " <string>10.13.0</string>\n"
|
|
;
|
|
if(imgs.GetCount())
|
|
Info_plist
|
|
<< " <key>CFBundleIconFile</key>\n"
|
|
<< " <string>icons.icns</string>\n"
|
|
;
|
|
Info_plist
|
|
<< "</dict>\n"
|
|
<< "</plist>\n"
|
|
;
|
|
}
|
|
String Info_plist_path = GetFileFolder(GetFileFolder(target)) + "/Info.plist";
|
|
if(LoadFile(Info_plist_path) != Info_plist) {
|
|
if(FileExists(Info_plist_path))
|
|
Execute("defaults delete " + Info_plist_path); // Force MacOS to reload plist
|
|
SaveFile(Info_plist_path, Info_plist);
|
|
PutConsole("Saving " << Info_plist_path);
|
|
}
|
|
}
|
|
|
|
#endif |