diff --git a/icons/icns/make_iconsets.py b/icons/icns/make_iconsets.py old mode 100644 new mode 100755 index 36cb55e263..9bcbff0c0d --- a/icons/icns/make_iconsets.py +++ b/icons/icns/make_iconsets.py @@ -8,6 +8,7 @@ import os import shutil import subprocess import sys +import tempfile d, j, a = (getattr(os.path, x) for x in ('dirname', 'join', 'abspath')) base = d(a(__file__)) @@ -18,30 +19,45 @@ sources = {'calibre':j(imgsrc, 'calibre.svg'), 'ebook-edit':j(imgsrc, 'tweak.svg if sys.argv[-1] == 'only-logo': sources = {'calibre':sources['calibre']} -for name, src in sources.items(): - iconset = name + '.iconset' - if os.path.exists(iconset): - shutil.rmtree(iconset) - os.mkdir(iconset) - os.chdir(iconset) - try: - for sz in (16, 32, 128, 256, 512, 1024): - iname = f'icon_{sz}x{sz}.png' - iname2x = f'icon_{sz // 2}x{sz // 2}@2x.png' - if src.endswith('.svg'): - subprocess.check_call(['rsvg-convert', src, '-w', str(sz), '-h', str(sz), '-o', iname]) - else: - # We have a 512x512 png image - if sz == 512: - shutil.copy2(src, iname) + +def render_svg(src, sz, dest): + subprocess.check_call(['rsvg-convert', src, '-w', str(sz), '-h', str(sz), '-o', dest]) + + +with tempfile.TemporaryDirectory() as tdir: + + def render_frame(sz: int): + f = os.path.join(tdir, f'frame-{sz}.png') + if not os.path.exists(f): + render_svg(j(imgsrc, 'frame.svg'), sz, f) + return f + + def render_framed(sz: int, iname: str, shrink_factor: float = 0.76): + frame = render_frame(sz) + icon = os.path.join(tdir, f'icon-{sz}.png') + render_svg(src, int(shrink_factor * sz), icon) + subprocess.check_call(f'convert {frame} {icon} -gravity center -compose over -composite {iname}'.split()) + + for name, src in sources.items(): + iconset = name + '.iconset' + if os.path.exists(iconset): + shutil.rmtree(iconset) + os.mkdir(iconset) + os.chdir(iconset) + try: + for sz in (16, 32, 128, 256, 512, 1024): + iname = f'icon_{sz}x{sz}.png' + iname2x = f'icon_{sz // 2}x{sz // 2}@2x.png' + if sz < 128: + render_svg(src, sz, iname) else: - subprocess.check_call(['convert', src, '-resize', f'{sz}x{sz}', iname]) - if sz > 16: - shutil.copy2(iname, iname2x) - if sz > 512: - os.remove(iname) - for name in (iname, iname2x): - if os.path.exists(name): - subprocess.check_call(['optipng', '-o7', '-strip', 'all', name]) - finally: - os.chdir('..') + render_framed(sz, iname) + if sz > 16: + shutil.copy2(iname, iname2x) + if sz > 512: + os.remove(iname) + for name in (iname, iname2x): + if os.path.exists(name): + subprocess.check_call(['optipng', '-o7', '-strip', 'all', name]) + finally: + os.chdir('..') diff --git a/imgsrc/frame.svg b/imgsrc/frame.svg new file mode 100644 index 0000000000..f627160d6b --- /dev/null +++ b/imgsrc/frame.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 1b21848c01..1cf737aec0 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -127,7 +127,8 @@ def init_qt(args): # Ancient broken VNC servers cannot handle icons of size greater than 256 # https://www.mobileread.com/forums/showthread.php?t=278447 ic = 'lt.png' if is_x11 else 'library.png' - app.setWindowIcon(QIcon(I(ic, allow_user_override=False))) + if not ismacos: + app.setWindowIcon(QIcon(I(ic, allow_user_override=False))) return app, opts, args diff --git a/src/calibre/gui2/tweak_book/main.py b/src/calibre/gui2/tweak_book/main.py index 5b1d368eca..9ffda0a789 100644 --- a/src/calibre/gui2/tweak_book/main.py +++ b/src/calibre/gui2/tweak_book/main.py @@ -8,7 +8,7 @@ import time from qt.core import QIcon -from calibre.constants import EDITOR_APP_UID, islinux +from calibre.constants import EDITOR_APP_UID, islinux, ismacos from calibre.ebooks.oeb.polish.check.css import shutdown as shutdown_css_check_pool from calibre.gui2 import Application, decouple, set_gui_prefs, setup_gui_option_parser from calibre.ptempfile import reset_base_dir @@ -60,7 +60,8 @@ def _run(args, notify=None): from calibre.utils.webengine import setup_default_profile setup_default_profile() app.load_builtin_fonts() - app.setWindowIcon(QIcon.ic('tweak.png')) + if not ismacos: + app.setWindowIcon(QIcon.ic('tweak.png')) main = Main(opts, notify=notify) main.set_exception_handler() main.show() diff --git a/src/calibre/gui2/tweak_book/ui.py b/src/calibre/gui2/tweak_book/ui.py index b95eb494be..a5d7fa397d 100644 --- a/src/calibre/gui2/tweak_book/ui.py +++ b/src/calibre/gui2/tweak_book/ui.py @@ -10,6 +10,7 @@ from itertools import product from qt.core import ( QAction, + QApplication, QDockWidget, QEvent, QHBoxLayout, @@ -285,7 +286,8 @@ class Main(MainWindow): traceback.print_exc() self.setWindowTitle(self.APP_NAME) self.boss = Boss(self, notify=notify) - self.setWindowIcon(QIcon.ic('tweak.png')) + if not ismacos: + self.setWindowIcon(QApplication.instance().windowIcon()) self.opts = opts self.path_to_ebook = None self.container = None diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index 2e19fbcafe..7a73525d88 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -125,7 +125,8 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ def __init__(self, opts, parent=None, gui_debug=None): MainWindow.__init__(self, opts, parent=parent, disable_automatic_gc=True) self.setVisible(False) - self.setWindowIcon(QApplication.instance().windowIcon()) + if not ismacos: + self.setWindowIcon(QApplication.instance().windowIcon()) self.extra_files_watcher = ExtraFilesWatcher(self) self.jobs_pointer = Pointer(self) self.proceed_requested.connect(self.do_proceed, diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index 8aeb853242..555d3e99c8 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -9,7 +9,7 @@ from contextlib import closing from qt.core import QIcon, QObject, Qt, QTimer, pyqtSignal -from calibre.constants import VIEWER_APP_UID, islinux +from calibre.constants import VIEWER_APP_UID, islinux, ismacos from calibre.gui2 import Application, error_dialog, setup_gui_option_parser from calibre.gui2.listener import send_message_in_process from calibre.gui2.viewer.config import get_session_pref, vprefs @@ -149,7 +149,8 @@ def run_gui(app, opts, args, internal_book_data, listener=None): acc = EventAccumulator(app) app.file_event_hook = acc app.load_builtin_fonts() - app.setWindowIcon(QIcon.ic('viewer.png')) + if not ismacos: + app.setWindowIcon(QIcon.ic('viewer.png')) migrate_previous_viewer_prefs() main = EbookViewer( open_at=opts.open_at, continue_reading=opts.continue_reading, force_reload=opts.force_reload,