Files
AudiOhm/frontend/linux/runner/main.cpp
T
root 85dad89d5b feat: Modernisation UI/UX et configuration Flutter multi-plateforme
Phase 1 - Corrections Critiques:
- Fixed memory leaks dans music_provider.dart (stream subscriptions)
- Fixed race conditions dans search_provider.dart (stale results)
- Fixed token refresh errors dans api_service.dart
- Improved error handling avec messages utilisateur
- Changed API URL to HTTPS by default

Phase 2 - Améliorations UX Desktop:
- Ajouté cursor pointers sur tous les éléments cliquables
- Implémenté hover states avec effets néon glow (200ms transitions)
- Créé skeleton loading states avec shimmer animation
- Ajouté widgets: ClickableWrapper, ErrorDisplay, SkeletonLoading
- Enhanced visual feedback pour desktop users

Phase 3 - Configuration Flutter:
- Configuré Android (Gradle 8.1.0, Kotlin 1.9.0, minSdk 21, targetSdk 34)
- Créé launcher icons cyberpunk néon (5 densités)
- Configuré Windows desktop (structure complète)
- Activé Linux desktop support
- Ajouté package équatable pour entités de domaine
- Corrigé imports (colors.dart, auth_provider.dart)
- Fixed Dio API compatibility (RequestOptions)

Documentation:
- STYLE_GUIDE.md: Guide complet (100+ pages)
- DESIGN_IMPLEMENTATION_GUIDE.md: Implémentation Flutter
- BUILD_STATUS.md: Status builds + troubleshooting
- QUICKSTART_BUILDS.md: Guide rapide
- BUILD_INDEX.md: Index documentation
- PHASE_1_CORRECTIONS.md: Corrections Phase 1
- PHASE_2_UX_IMPROVEMENTS.md: Améliorations Phase 2
- PR_REVIEW_SUMMARY.md: Revue code complète
- CODE_ANALYSIS_AND_PRIORITIES.md: Analyse code

Scripts & Builds:
- BUILD_ALL.sh: Script automatisé builds multi-plateforme
- builds/: Structure avec README par plateforme
- design-system/: Système de design complet

Backend:
- Ajouté streaming HTTP Range pour audio progressif
- Enhanced YouTube service avec métadonnées complètes
- Improved error handling et validation

Generated with [Claude Code](https://claude.com/claude-code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-01-19 07:44:40 +00:00

90 lines
3.0 KiB
C++

#include <my_flutter_app.h>
#include <flutter_linux/flutter_linux.h>
#ifdef GDK_WINDOWING_X11
#include <gdk/gdkx.h>
#endif
#include "flutter/generated_plugin_registrant.h"
struct _MyFlutterApp {
GtkApplication parent_instance;
char** dart_entrypoint_arguments;
};
G_DEFINE_TYPE(MyFlutterApp, my_flutter_app, GTK_TYPE_APPLICATION)
// Implements GApplication::activate.
static void my_flutter_app_activate(GApplication* application) {
MyFlutterApp* self = MY_FLUTTER_APP(application);
GtkWindow* window =
GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
// Use a header bar when running in GNOME as this is the common style used
// by applications and is the layout most users expect.
gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(gtk_header_bar_new()),
TRUE);
gtk_window_set_titlebar(window, GTK_HEADER_BAR(gtk_header_bar_new()));
gtk_window_set_default_size(window, 1280, 720);
gtk_widget_show(GTK_WIDGET(window));
g_autoptr(FlutterDartProject) project = flutter_dart_project_new();
flutter_dart_project_set_dart_entrypoint_arguments(
project, self->dart_entrypoint_arguments);
FlView* view = fl_view_new(project);
gtk_widget_show(GTK_WIDGET(view));
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));
fl_register_plugins(FL_PLUGIN_REGISTRY(view));
gtk_widget_grab_focus(GTK_WIDGET(view));
}
// Implements GApplication::local_command_line.
static gboolean my_flutter_app_local_command_line(GApplication* application,
gchar*** arguments,
int* exit_status) {
MyFlutterApp* self = MY_FLUTTER_APP(application);
// Strip out the first argument as it is the binary name.
self->dart_entrypoint_arguments = *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;
}
// Implements GObject::dispose.
static void my_flutter_app_dispose(GObject* object) {
G_OBJECT_CLASS(my_flutter_app_parent_class)->dispose(object);
}
static void my_flutter_app_class_init(MyFlutterAppClass* klass) {
G_APPLICATION_CLASS(klass)->activate = my_flutter_app_activate;
G_APPLICATION_CLASS(klass)->local_command_line =
my_flutter_app_local_command_line;
G_OBJECT_CLASS(klass)->dispose = my_flutter_app_dispose;
}
static void my_flutter_app_init(MyFlutterApp* self) {}
MyFlutterApp* my_flutter_app_new() {
return MY_FLUTTER_APP(g_object_new(my_flutter_app_get_type(),
"application-id", APPLICATION_ID,
"flags", G_APPLICATION_NON_UNIQUE,
nullptr));
}
int main(int argc, char** argv) {
g_autoptr(MyFlutterApp) app = my_flutter_app_new();
return g_application_run(G_APPLICATION(app), argc, argv);
}