From 502d94151ed9dcfeeb691a92a4c413be5783ae2d Mon Sep 17 00:00:00 2001 From: Robert Günzler Date: Thu, 13 Aug 2026 17:21:46 +0200 Subject: initial commit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Robert Günzler --- .editorconfig | 22 ++ Makefile | 17 ++ build-aux/flatpak.mk | 29 +++ build-aux/im.gzr.MunchMate.Devel.json | 45 ++++ .../icons/scalable/apps/im.gzr.MunchMate.Devel.svg | 276 +++++++++++++++++++++ data/im.gzr.MunchMate.desktop | 8 + data/im.gzr.MunchMate.gresource.xml | 7 + data/im.gzr.MunchMate.gschema.xml | 4 + data/im.gzr.MunchMate.metainfo.xml | 14 ++ data/im.gzr.MunchMate.service.in | 3 + data/meson.build | 54 ++++ data/style.css | 9 + data/ui/meson.build | 3 + data/ui/mm-window.blp | 17 ++ meson.build | 41 +++ src/config.vapi | 7 + src/main.vala | 8 + src/meson.build | 42 ++++ src/mm-application.vala | 50 ++++ src/mm-window.vala | 12 + 20 files changed, 668 insertions(+) create mode 100644 .editorconfig create mode 100644 Makefile create mode 100644 build-aux/flatpak.mk create mode 100644 build-aux/im.gzr.MunchMate.Devel.json create mode 100644 data/icons/scalable/apps/im.gzr.MunchMate.Devel.svg create mode 100644 data/im.gzr.MunchMate.desktop create mode 100644 data/im.gzr.MunchMate.gresource.xml create mode 100644 data/im.gzr.MunchMate.gschema.xml create mode 100644 data/im.gzr.MunchMate.metainfo.xml create mode 100644 data/im.gzr.MunchMate.service.in create mode 100644 data/meson.build create mode 100644 data/style.css create mode 100644 data/ui/meson.build create mode 100644 data/ui/mm-window.blp create mode 100644 meson.build create mode 100644 src/config.vapi create mode 100644 src/main.vala create mode 100644 src/meson.build create mode 100644 src/mm-application.vala create mode 100644 src/mm-window.vala diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..edeca31 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,22 @@ +root = true + +[meson.build] +indent_style = space +indent_size = 2 + +[*.vala] +indent_style = tab +indent_size = 4 +trim_trailing_whitespace = true + +[*.blp] +indent_style = space +indent_size = 2 + +[*.css] +indent_style = space +indent_size = 2 + +[*.json] +indent_style = space +indent_size = 2 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e256067 --- /dev/null +++ b/Makefile @@ -0,0 +1,17 @@ +APP_ID := im.gzr.MunchMate.Devel + +build: + @meson setup --reconfigure --buildtype=debug build + @meson compile -C build + +clean: + @rm -rf ./build/ + +run: + @env \ + G_MESSAGES_DEBUG=$(APP_ID) \ + ./build/src/munchmate + +.PHONY: build clean run + +include build-aux/flatpak.mk diff --git a/build-aux/flatpak.mk b/build-aux/flatpak.mk new file mode 100644 index 0000000..3379968 --- /dev/null +++ b/build-aux/flatpak.mk @@ -0,0 +1,29 @@ +APP_ID ?= + +flatpak-build: + @flatpak remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo + @flatpak-builder \ + --user \ + --force-clean \ + --disable-rofiles-fuse \ + --install-deps-from=flathub \ + --install \ + --repo=./build/flatpak/repo \ + --state-dir=./build/.flatpak-builder \ + ./build/flatpak \ + ./build-aux/$(APP_ID).json + +flatpak-uninstall: + @flatpak uninstall --delete-data --verbose \ + $(APP_ID) + +flatpak-clean: + @rm -rf ./build/flatpak/ + @rm -rf ./build/.flatpak-builder/ + +flatpak-run: ARGS ?= +flatpak-run: + @flatpak run --devel --verbose \ + $(APP_ID) $(ARGS) + +.PHONY: flatpak-build flatpak-uninstall flatpak-clean flatpak-run diff --git a/build-aux/im.gzr.MunchMate.Devel.json b/build-aux/im.gzr.MunchMate.Devel.json new file mode 100644 index 0000000..e1c9e18 --- /dev/null +++ b/build-aux/im.gzr.MunchMate.Devel.json @@ -0,0 +1,45 @@ +{ + "id": "im.gzr.MunchMate.Devel", + "runtime": "org.gnome.Platform", + "runtime-version": "50", + "sdk": "org.gnome.Sdk", + "command": "munchmate", + "finish-args": [ + "--share=ipc", + "--socket=fallback-x11", + "--socket=wayland", + "--device=dri", + "--env=G_MESSAGES_DEBUG=im.gzr.MunchMate.Devel" + ], + "build-options" : { + "cflags" : "-O2 -g", + "env" : {} + }, + "cleanup" : [ + "/include", + "/lib/pkgconfig", + "/share/pkgconfig", + "/share/aclocal", + "/man", + "/share/man", + "/share/gtk-doc", + "*.la", + "*.a", + "/lib/girepository-1.0", + "/share/doc", + "/share/gir-1.0" + ], + "modules" : [ + { + "name" : "munchmate", + "buildsystem" : "meson", + "builddir" : true, + "sources" : [ + { + "type" : "dir", + "path" : ".." + } + ] + } + ] +} diff --git a/data/icons/scalable/apps/im.gzr.MunchMate.Devel.svg b/data/icons/scalable/apps/im.gzr.MunchMate.Devel.svg new file mode 100644 index 0000000..4e02aed --- /dev/null +++ b/data/icons/scalable/apps/im.gzr.MunchMate.Devel.svg @@ -0,0 +1,276 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/im.gzr.MunchMate.desktop b/data/im.gzr.MunchMate.desktop new file mode 100644 index 0000000..095a0f8 --- /dev/null +++ b/data/im.gzr.MunchMate.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=MunchMate +TryExec=munchmate +Exec=munchmate %U +Icon=im.gzr.MunchMate +Terminal=false +Type=Application +StartupNotify=false diff --git a/data/im.gzr.MunchMate.gresource.xml b/data/im.gzr.MunchMate.gresource.xml new file mode 100644 index 0000000..49c3f7c --- /dev/null +++ b/data/im.gzr.MunchMate.gresource.xml @@ -0,0 +1,7 @@ + + + + ui/mm-window.ui + style.css + + diff --git a/data/im.gzr.MunchMate.gschema.xml b/data/im.gzr.MunchMate.gschema.xml new file mode 100644 index 0000000..5eb38f2 --- /dev/null +++ b/data/im.gzr.MunchMate.gschema.xml @@ -0,0 +1,4 @@ + + + + diff --git a/data/im.gzr.MunchMate.metainfo.xml b/data/im.gzr.MunchMate.metainfo.xml new file mode 100644 index 0000000..7d1a654 --- /dev/null +++ b/data/im.gzr.MunchMate.metainfo.xml @@ -0,0 +1,14 @@ + + + im.gzr.MunchMate + CC0-1.0 + GPL-3.0+ + MunchMate + robertgzr + im.gzr.MunchMate.desktop + + touch + keyboard + pointing + + diff --git a/data/im.gzr.MunchMate.service.in b/data/im.gzr.MunchMate.service.in new file mode 100644 index 0000000..08b3766 --- /dev/null +++ b/data/im.gzr.MunchMate.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=im.gzr.MunchMate +Exec=@bindir@/munchmate --gapplication-service diff --git a/data/meson.build b/data/meson.build new file mode 100644 index 0000000..dea46c4 --- /dev/null +++ b/data/meson.build @@ -0,0 +1,54 @@ +subdir('ui') + +resource_files = files('im.gzr.MunchMate.gresource.xml') +resources = gnome.compile_resources( + 'im.gzr.MunchMate', + resource_files, + source_dir: meson.current_build_dir(), + dependencies: custom_target( + 'blueprints', + input: blueprints, + output: '.', + command: [ find_program('blueprint-compiler'), 'batch-compile', '@OUTPUT@', '@CURRENT_SOURCE_DIR@', '@INPUT@' ], + ), + c_name: 'resources', +) + +install_subdir('icons/', + install_dir: join_paths(get_option('datadir'), 'icons/hicolor')) + +desktop_file = files('im.gzr.MunchMate.desktop') +install_data( + desktop_file, + install_dir: join_paths(get_option('datadir'), 'applications'), +) + +metainfo_file = files('im.gzr.MunchMate.metainfo.xml') +install_data( + metainfo_file, + install_dir: join_paths(get_option('datadir'), 'metainfo'), +) + +# Validating app data +appstreamcli = find_program('appstreamcli', required: false) +if appstreamcli.found() + test( + 'validate-appdata', appstreamcli, + args: [ 'validate', '--no-net', '--explain', metainfo_file ], + ) +endif + +schema_file = files('im.gzr.MunchMate.gschema.xml') +install_data( + schema_file, + install_dir: join_paths(get_option('datadir'), 'glib-2.0', 'schemas') +) + +configure_file( + input: 'im.gzr.MunchMate.service.in', + output: 'im.gzr.MunchMate.service', + configuration: configuration_data({ + 'bindir': join_paths(get_option('prefix'), get_option('bindir')), + }), + install_dir: join_paths(get_option('datadir'), 'dbus-1', 'services') +) diff --git a/data/style.css b/data/style.css new file mode 100644 index 0000000..55c4483 --- /dev/null +++ b/data/style.css @@ -0,0 +1,9 @@ +/* +window { +} + +@media (prefers-color-scheme: dark) { + window { + } +} +*/ diff --git a/data/ui/meson.build b/data/ui/meson.build new file mode 100644 index 0000000..a492bb7 --- /dev/null +++ b/data/ui/meson.build @@ -0,0 +1,3 @@ +blueprints = files( + 'mm-window.blp', +) diff --git a/data/ui/mm-window.blp b/data/ui/mm-window.blp new file mode 100644 index 0000000..f1b4147 --- /dev/null +++ b/data/ui/mm-window.blp @@ -0,0 +1,17 @@ +using Gtk 4.0; +using Adw 1; + +template $MunchMateWindow : Adw.ApplicationWindow { + title: "Example"; + default-width: 400; + default-height: 350; + + Adw.ToolbarView { + [top] + Adw.HeaderBar {} + + Adw.StatusPage { + title: "Let's go"; + } + } +} diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..859892e --- /dev/null +++ b/meson.build @@ -0,0 +1,41 @@ +project( + 'munchmate', + ['vala', 'c'], + license: 'GPL-3.0+', + version: '0.0+dev', +) + +app_id = 'im.gzr.MunchMate' +if get_option('buildtype') == 'debug' + app_id += '.Devel' +endif + +config = configuration_data({ + 'APP_ID': '"@0@"'.format(app_id), + 'VERSION': '"@0@"'.format(meson.project_version()), + 'BUILD_TYPE': '"@0@"'.format(get_option('buildtype')), +}) +configure_file(output: 'config.h', configuration: config) +config_h_dir = include_directories('.') + +add_project_arguments( + ['-w'], + language: 'c' +) + +glib_dep = dependency('glib-2.0') +gio_dep = dependency('gio-2.0', version: '>=2.40') +gtk_dep = dependency('gtk4') +adw_dep = dependency('libadwaita-1') +dex_dep = dependency('libdex-1') + +gnome = import('gnome') + +gnome.post_install( + glib_compile_schemas: true, + gtk_update_icon_cache: true, + update_desktop_database: true, +) + +subdir('data') +subdir('src') diff --git a/src/config.vapi b/src/config.vapi new file mode 100644 index 0000000..bd04675 --- /dev/null +++ b/src/config.vapi @@ -0,0 +1,7 @@ +[CCode (cprefix = "", lower_case_cprefix = "", cheader_filename = "config.h")] +namespace Config { + public const string VERSION; + public const string APP_ID; + public const string BUILD_TYPE; +} + diff --git a/src/main.vala b/src/main.vala new file mode 100644 index 0000000..865765f --- /dev/null +++ b/src/main.vala @@ -0,0 +1,8 @@ + +static int main(string[] args) { + Dex.init(); + Dex.ThreadPoolScheduler.get_default(); + + var app = new MunchMate.Application(); + return app.run(args); +} diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 0000000..9ded894 --- /dev/null +++ b/src/meson.build @@ -0,0 +1,42 @@ +mm_vapi_sources = files( + 'config.vapi', +) + +mm_vala_sources = files( + 'mm-application.vala', + 'mm-window.vala', + 'main.vala', +) + +mm_sources = [ + mm_vapi_sources, + mm_vala_sources, + resources, +] + +mm_deps = [ + glib_dep, + gio_dep, + gtk_dep, + adw_dep, + dex_dep, +] + +mm_vala_args = [ + '--vapidir', meson.current_source_dir(), + '--gresources', resource_files, +] + +mm_c_args = [ + '-DG_LOG_DOMAIN="@0@"'.format(app_id), +] + +executable( + meson.project_name(), + mm_sources, + include_directories: config_h_dir, + dependencies: mm_deps, + vala_args: mm_vala_args, + c_args: mm_c_args, + install: true, +) diff --git a/src/mm-application.vala b/src/mm-application.vala new file mode 100644 index 0000000..193f16b --- /dev/null +++ b/src/mm-application.vala @@ -0,0 +1,50 @@ +namespace MunchMate { + public class Application : Adw.Application { + private Window win; + + private static bool print_version = false; + + private const GLib.OptionEntry[] options = { + { "version", 'V', OptionFlags.NONE, OptionArg.NONE, ref print_version, "Display version number", null }, + { null } // terminator + }; + + private const GLib.ActionEntry[] action_entries = { + { "quit", on_quit_activate }, + }; + + public override int handle_local_options(VariantDict _) { + if (print_version) { + print("%s version %s\n", Config.APP_ID, Config.VERSION); + return 0; + } + return -1; + } + + public override void activate() { + win = new Window(this); + win.present(); + } + + public override void startup() { + base.startup(); + + set_accels_for_action("app.quit", { "q" }); + } + + public Application() { + // why doesnt service binding work in flatpak + Object(application_id: Config.APP_ID, flags: ApplicationFlags.NON_UNIQUE); + + set_resource_base_path("/im/gzr/munchmate/"); + + add_main_option_entries(options); + + add_action_entries(action_entries, this); + } + + void on_quit_activate() { + quit(); + } + } +} diff --git a/src/mm-window.vala b/src/mm-window.vala new file mode 100644 index 0000000..f8b9761 --- /dev/null +++ b/src/mm-window.vala @@ -0,0 +1,12 @@ +namespace MunchMate { + [GtkTemplate (ui = "/im/gzr/munchmate/mm-window.ui")] + public class Window : Adw.ApplicationWindow { + public Window(Gtk.Application app) { + Object(application: app); + + if (Config.BUILD_TYPE == "debug") { + add_css_class("devel"); + } + } + } +} -- cgit 1.4.1