diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 047dc2a..dc713cd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: uses: flatpak/flatpak-github-actions/flatpak-builder@v6.3 with: bundle: page.kramo.Cartridges.Devel.flatpak - manifest-path: flatpak/page.kramo.Cartridges.Devel.json + manifest-path: build-aux/flatpak/page.kramo.Cartridges.Devel.json windows: name: Windows diff --git a/.gitignore b/.gitignore index c9957df..2dbd313 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ /subprojects/blueprint-compiler +/build-aux/macos/build +/build-aux/macos/dist /.flatpak /.flatpak-builder /.vscode diff --git a/flatpak/page.kramo.Cartridges.Devel.json b/build-aux/flatpak/page.kramo.Cartridges.Devel.json similarity index 99% rename from flatpak/page.kramo.Cartridges.Devel.json rename to build-aux/flatpak/page.kramo.Cartridges.Devel.json index 1354e60..fdbcff6 100644 --- a/flatpak/page.kramo.Cartridges.Devel.json +++ b/build-aux/flatpak/page.kramo.Cartridges.Devel.json @@ -130,7 +130,7 @@ "sources" : [ { "type" : "dir", - "path" : ".." + "path" : "../.." } ] } diff --git a/build-aux/macos/cartridges.spec b/build-aux/macos/cartridges.spec new file mode 100644 index 0000000..7bb5e57 --- /dev/null +++ b/build-aux/macos/cartridges.spec @@ -0,0 +1,59 @@ +# -*- mode: python ; coding: utf-8 -*- + + +a = Analysis( + ["../../_build/cartridges/cartridges"], + pathex=[], + binaries=[], + datas=[("../../_build/data/cartridges.gresource", "Resources")], + hiddenimports=[], + hookspath=[], + hooksconfig={ + "gi": { + "module-versions": { + "Gtk": "4.0", + }, + }, + }, + runtime_hooks=[], + excludes=[], + noarchive=False, + optimize=0, +) +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + [], + exclude_binaries=True, + name="Cartridges", + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + console=False, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) +coll = COLLECT( + exe, + a.binaries, + a.datas, + strip=False, + upx=True, + upx_exclude=[], + name="Cartridges", +) +app = BUNDLE( + coll, + name="Cartridges.app", + icon="./icon.icns", + bundle_identifier="page.kramo.Cartridges", + info_plist={ + "LSApplicationCategoryType": "public.app-category.games", + }, +) diff --git a/build-aux/macos/icon.icns b/build-aux/macos/icon.icns new file mode 100644 index 0000000..8276dbd Binary files /dev/null and b/build-aux/macos/icon.icns differ diff --git a/windows/Cartridges.iss.in b/build-aux/windows/Cartridges.iss.in similarity index 95% rename from windows/Cartridges.iss.in rename to build-aux/windows/Cartridges.iss.in index d785c3a..bc2e6f1 100644 --- a/windows/Cartridges.iss.in +++ b/build-aux/windows/Cartridges.iss.in @@ -18,7 +18,7 @@ DisableProgramGroupPage=yes LicenseFile=..\..\LICENSE PrivilegesRequiredOverridesAllowed=dialog OutputBaseFilename=Cartridges Setup -SetupIconFile=..\..\windows\icon.ico +SetupIconFile=..\..\build-aux\windows\icon.ico Compression=lzma SolidCompression=yes WizardStyle=modern @@ -49,7 +49,7 @@ Source: "D:\a\_temp\msys64\ucrt64\share\icons\*"; DestDir: "{app}\share\icons"; Source: "D:\a\_temp\msys64\ucrt64\share\glib-2.0\*"; DestDir: "{app}\share\glib-2.0"; Flags: recursesubdirs ignoreversion Source: "D:\a\_temp\msys64\ucrt64\share\gtk-4.0\*"; DestDir: "{app}\share\gtk-4.0"; Flags: recursesubdirs ignoreversion -Source: "..\..\windows\icon.ico"; DestDir: "{app}"; Flags: recursesubdirs ignoreversion +Source: "..\..\build-aux\windows\icon.ico"; DestDir: "{app}"; Flags: recursesubdirs ignoreversion [Icons] Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\bin\{#MyAppExeName}"; Parameters: """{app}\bin\cartridges"""; IconFilename: "{app}\icon.ico" diff --git a/windows/icon.ico b/build-aux/windows/icon.ico similarity index 100% rename from windows/icon.ico rename to build-aux/windows/icon.ico diff --git a/windows/meson.build b/build-aux/windows/meson.build similarity index 100% rename from windows/meson.build rename to build-aux/windows/meson.build diff --git a/cartridges/cartridges.in b/cartridges/cartridges.in index 01ef166..0eac260 100755 --- a/cartridges/cartridges.in +++ b/cartridges/cartridges.in @@ -24,6 +24,7 @@ import locale import os import signal import sys +from pathlib import Path from platform import system VERSION = "@VERSION@" @@ -45,9 +46,15 @@ else: gettext.install("cartridges") if __name__ == "__main__": - from gi.repository import Gio + from gi.repository import Gio, GLib - resource = Gio.Resource.load(os.path.join(PKGDATADIR, "cartridges.gresource")) + try: + # For a macOS application bundle + resource = Gio.Resource.load( + str(Path(__file__).parent / "Resources" / "cartridges.gresource") + ) + except GLib.GError: + resource = Gio.Resource.load(os.path.join(PKGDATADIR, "cartridges.gresource")) resource._register() # pylint: disable=protected-access from cartridges import main diff --git a/cartridges/main.py b/cartridges/main.py index 7deb799..cc2f480 100644 --- a/cartridges/main.py +++ b/cartridges/main.py @@ -87,10 +87,17 @@ class CartridgesApplication(Adw.Application): self.add_main_option_entries((search, launch)) + if sys.platform == "darwin" and (settings := Gtk.Settings.get_default()): + settings.props.gtk_decoration_layout = "close,minimize,maximize:" + def do_activate(self) -> None: # pylint: disable=arguments-differ """Called on app creation""" - setup_logging() + try: + setup_logging() + except ValueError: + pass + log_system_info() # Set fallback icon-name @@ -375,7 +382,7 @@ class CartridgesApplication(Adw.Application): if action[1:2]: self.set_accels_for_action( f"app.{action[0]}" if scope == self else f"win.{action[0]}", - action[1], + tuple(s.replace("", "") for s in action[1]), ) scope.add_action(simple_action) diff --git a/cartridges/window.py b/cartridges/window.py index 8b966d1..fc1070b 100644 --- a/cartridges/window.py +++ b/cartridges/window.py @@ -18,6 +18,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later from typing import Any, Optional +from sys import platform from gi.repository import Adw, Gio, GLib, Gtk, Pango @@ -33,6 +34,7 @@ class CartridgesWindow(Adw.ApplicationWindow): overlay_split_view = Gtk.Template.Child() navigation_view = Gtk.Template.Child() + sidebar_navigation_page = Gtk.Template.Child() sidebar = Gtk.Template.Child() all_games_row_box = Gtk.Template.Child() all_games_no_label = Gtk.Template.Child() @@ -215,6 +217,9 @@ class CartridgesWindow(Adw.ApplicationWindow): def __init__(self, **kwargs: Any) -> None: super().__init__(**kwargs) + if platform == "darwin": + self.sidebar_navigation_page.set_title("") + self.details_view.set_measure_overlay(self.details_view_toolbar_view, True) self.details_view.set_clip_overlay(self.details_view_toolbar_view, False) diff --git a/data/gtk/window.blp b/data/gtk/window.blp index fcb1fbc..47b66cd 100644 --- a/data/gtk/window.blp +++ b/data/gtk/window.blp @@ -79,7 +79,7 @@ template $CartridgesWindow: Adw.ApplicationWindow { sidebar-width-fraction: .2; [sidebar] - Adw.NavigationPage { + Adw.NavigationPage sidebar_navigation_page { title: _("Cartridges"); Adw.ToolbarView { diff --git a/meson.build b/meson.build index a7acdfa..acfa563 100644 --- a/meson.build +++ b/meson.build @@ -44,7 +44,7 @@ subdir('data') subdir('cartridges') if host_machine.system() == 'windows' - subdir('windows') + subdir('build-aux/windows') else subdir('search-provider') subdir('po')