Closes #451 ## What changed Replaces the default Flutter blue logo with the project's rainbow-rings `icon.svg` on all supported platforms. **Android** — all five mipmap densities regenerated (`mdpi` 48px through `xxxhdpi` 192px). **Linux** — `linux/sharedinbox.png` (512×512) added, installed next to the binary via `CMakeLists.txt`, and set as the GTK window icon via `gtk_window_set_icon_from_file` in `my_application.cc`. **Tooling** — `icon.png` (1024×1024 source raster) committed; `flutter_launcher_icons` added as dev dep with a `flutter_icons` config block; `task generate-icons` added to `Taskfile.yml` for future regeneration; `librsvg` added to `flake.nix` so `rsvg-convert` is available inside `nix develop`. ## How verified Icons were generated with Inkscape from `icon.svg` and visually confirmed (rainbow-rings design appears correctly at all sizes). The `playstore/icon.png` was already correct and unchanged. Co-authored-by: Thomas SharedInbox <sharedinbox@thomas-guettler.de> Reviewed-on: https://codeberg.org/guettli/sharedinbox/pulls/459
82 lines
2.7 KiB
C++
82 lines
2.7 KiB
C++
#include "my_application.h"
|
||
|
||
#include <flutter_linux/flutter_linux.h>
|
||
#ifdef GDK_WINDOWING_X11
|
||
#include <gdk/gdkx.h>
|
||
#endif
|
||
|
||
#include "flutter/generated_plugin_registrant.h"
|
||
|
||
struct _MyApplication {
|
||
GtkApplication parent_instance;
|
||
char** dart_entrypoint_arguments;
|
||
};
|
||
|
||
G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)
|
||
|
||
static void my_application_activate(GApplication* application) {
|
||
MyApplication* self = MY_APPLICATION(application);
|
||
GtkWindow* window =
|
||
GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
|
||
|
||
gtk_window_set_default_size(window, 1280, 800);
|
||
gtk_widget_set_size_request(GTK_WIDGET(window), 400, 300);
|
||
|
||
g_autoptr(FlDartProject) project = fl_dart_project_new();
|
||
fl_dart_project_set_dart_entrypoint_arguments(
|
||
project, self->dart_entrypoint_arguments);
|
||
|
||
FlView* view = fl_view_new(project);
|
||
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));
|
||
|
||
fl_register_plugins(FL_PLUGIN_REGISTRY(view));
|
||
|
||
gtk_window_set_icon_from_file(window, "sharedinbox.png", nullptr);
|
||
|
||
// Show AFTER adding FlView so GTK's first layout pass allocates the full
|
||
// window content area (1280×800) to FlView, not the default 1×1.
|
||
gtk_widget_show_all(GTK_WIDGET(window));
|
||
|
||
gtk_widget_grab_focus(GTK_WIDGET(view));
|
||
}
|
||
|
||
static gboolean my_application_local_command_line(GApplication* application,
|
||
gchar*** arguments,
|
||
int* exit_status) {
|
||
MyApplication* self = MY_APPLICATION(application);
|
||
// Strip the first argument as it is the binary name.
|
||
self->dart_entrypoint_arguments = g_strdupv(*arguments + 1);
|
||
|
||
g_autoptr(GError) error = nullptr;
|
||
if (!g_application_register(application, nullptr, &error)) {
|
||
g_warning("Failed to register: %s", error->message);
|
||
*exit_status = 1;
|
||
return TRUE;
|
||
}
|
||
|
||
g_application_activate(application);
|
||
*exit_status = 0;
|
||
return TRUE;
|
||
}
|
||
|
||
static void my_application_dispose(GObject* object) {
|
||
MyApplication* self = MY_APPLICATION(object);
|
||
g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev);
|
||
G_OBJECT_CLASS(my_application_parent_class)->dispose(object);
|
||
}
|
||
|
||
static void my_application_class_init(MyApplicationClass* klass) {
|
||
G_APPLICATION_CLASS(klass)->activate = my_application_activate;
|
||
G_APPLICATION_CLASS(klass)->local_command_line =
|
||
my_application_local_command_line;
|
||
G_OBJECT_CLASS(klass)->dispose = my_application_dispose;
|
||
}
|
||
|
||
static void my_application_init(MyApplication* self) {}
|
||
|
||
MyApplication* my_application_new() {
|
||
return MY_APPLICATION(g_object_new(my_application_get_type(),
|
||
"application-id", "de.sharedinbox.app",
|
||
"flags", G_APPLICATION_NON_UNIQUE, nullptr));
|
||
}
|