From c9f3daafb1f889326f42328d0b5dd2c06c5e0460 Mon Sep 17 00:00:00 2001 From: debuggerx Date: Fri, 14 Apr 2023 19:19:03 +0800 Subject: [PATCH] Init commit. --- .gitignore | 46 ++++++ .metadata | 30 ++++ README.md | 16 ++ analysis_options.yaml | 29 ++++ assets/doubt.gif | Bin 0 -> 10019 bytes assets/no.gif | Bin 0 -> 27125 bytes assets/ok.gif | Bin 0 -> 29667 bytes lib/main.dart | 222 +++++++++++++++++++++++++++ linux/.gitignore | 1 + linux/CMakeLists.txt | 138 +++++++++++++++++ linux/flutter/CMakeLists.txt | 88 +++++++++++ linux/flutter/generated_plugin_registrant.cc | 27 ++++ linux/flutter/generated_plugin_registrant.h | 15 ++ linux/flutter/generated_plugins.cmake | 28 ++++ linux/main.cc | 6 + linux/my_application.cc | 104 +++++++++++++ linux/my_application.h | 18 +++ pubspec.yaml | 98 ++++++++++++ 18 files changed, 866 insertions(+) create mode 100644 .gitignore create mode 100644 .metadata create mode 100644 README.md create mode 100644 analysis_options.yaml create mode 100644 assets/doubt.gif create mode 100644 assets/no.gif create mode 100644 assets/ok.gif create mode 100644 lib/main.dart create mode 100644 linux/.gitignore create mode 100644 linux/CMakeLists.txt create mode 100644 linux/flutter/CMakeLists.txt create mode 100644 linux/flutter/generated_plugin_registrant.cc create mode 100644 linux/flutter/generated_plugin_registrant.h create mode 100644 linux/flutter/generated_plugins.cmake create mode 100644 linux/main.cc create mode 100644 linux/my_application.cc create mode 100644 linux/my_application.h create mode 100644 pubspec.yaml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1837e33 --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ +.metedata + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release +pubspec.lock diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..8bac171 --- /dev/null +++ b/.metadata @@ -0,0 +1,30 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled. + +version: + revision: 4b12645012342076800eb701bcdfe18f87da21cf + channel: stable + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 4b12645012342076800eb701bcdfe18f87da21cf + base_revision: 4b12645012342076800eb701bcdfe18f87da21cf + - platform: linux + create_revision: 4b12645012342076800eb701bcdfe18f87da21cf + base_revision: 4b12645012342076800eb701bcdfe18f87da21cf + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/README.md b/README.md new file mode 100644 index 0000000..b6d4e79 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# dde_qrcode_detector + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..61b6c4d --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,29 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/assets/doubt.gif b/assets/doubt.gif new file mode 100644 index 0000000000000000000000000000000000000000..672e2de68cd7f5614cadfe9d7673103704df16c5 GIT binary patch literal 10019 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 createState() => _MyHomePageState(); +} + +enum Status { + standBy, + scan, + found, + notFound, +} + +class _MyHomePageState extends State { + Offset currentWindowPos = Offset.zero; + Status status = Status.standBy; + List codes = []; + + @override + void initState() { + HardwareKeyboard.instance.addHandler((event) { + if (event.logicalKey == LogicalKeyboardKey.escape) { + exit(0); + } + return false; + }); + WindowManager.instance.getPosition().then((pos) { + currentWindowPos = pos; + }); + WindowManager.instance.focus(); + WindowManager.instance.grabKeyboard(); + Future.delayed(const Duration(seconds: 1), () { + setState(() { + status = Status.scan; + }); + compute(scan, null).then((codes) { + setState(() { + codes = codes; + status = codes.isEmpty ? Status.notFound : Status.found; + }); + }); + }); + super.initState(); + } + + static Future> scan(dynamic _) async { + var imagePath = '/tmp/${DateTime.now().toIso8601String()}.png'; + Process.runSync('scrot', [imagePath]); + return ZBar.scan(imagePath); + } + + @override + Widget build(BuildContext context) { + late Rect rect; + if (pos != null) { + rect = Rect.fromPoints( + Offset(pos!.bottomLeft.x, pos!.bottomLeft.y), + Offset(pos!.topRight.x, pos!.topRight.y), + ); + rect = rect.translate(-currentWindowPos.dx, -currentWindowPos.dy); + } + return GestureDetector( + onTap: () { + if ([Status.found, Status.notFound].contains(status)) { + exit(0); + } + }, + child: Scaffold( + backgroundColor: status == Status.standBy + ? Colors.transparent + : Colors.black12.withOpacity( + status == Status.scan ? 0.4 : 0.2, + ), + body: Stack( + children: [ + if (status == Status.scan) + Center( + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(24), + color: Colors.grey.shade700.withOpacity(0.9), + ), + child: RepaintBoundary( + child: Image.asset( + 'assets/doubt.gif', + width: 200, + height: 200, + ), + ), + ), + ), + if (status == Status.found) + Positioned( + left: rect.left - rect.width / 2, + top: rect.top - rect.height / 2, + child: Container( + width: rect.width * 2, + height: rect.height * 2, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + max(rect.width, rect.height), + ), + color: Colors.black38.withOpacity(.6), + ), + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Text( + '二维码内容:', + style: TextStyle( + fontSize: 28, + color: Colors.white, + ), + ), + AutoSizeText( + content?.text ?? '', + style: const TextStyle( + fontSize: 28, + color: Colors.white, + ), + minFontSize: 16, + maxFontSize: 46, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + FilledButton( + onPressed: () { + Clipboard.setData( + ClipboardData(text: content?.text), + ); + }, + child: const Text( + '复制', + style: TextStyle(fontSize: 28), + ), + ), + FilledButton( + onPressed: () async { + var url = content?.text ?? ''; + if (await canLaunchUrlString(url)) { + launchUrlString(url).then((value) { + exit(0); + }); + } + }, + child: const Text( + '打开', + style: TextStyle(fontSize: 28), + ), + ), + ], + ), + ], + ), + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/linux/.gitignore b/linux/.gitignore new file mode 100644 index 0000000..d3896c9 --- /dev/null +++ b/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt new file mode 100644 index 0000000..b6b39b1 --- /dev/null +++ b/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.10) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "dde_qrcode_detector") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.debuggerx.dde_qrcode_detector") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Define the application target. To change its name, change BINARY_NAME above, +# not the value here, or `flutter run` will no longer work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/linux/flutter/CMakeLists.txt b/linux/flutter/CMakeLists.txt new file mode 100644 index 0000000..d5bd016 --- /dev/null +++ b/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..e379152 --- /dev/null +++ b/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,27 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) flutter_acrylic_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterAcrylicPlugin"); + flutter_acrylic_plugin_register_with_registrar(flutter_acrylic_registrar); + g_autoptr(FlPluginRegistrar) screen_retriever_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverPlugin"); + screen_retriever_plugin_register_with_registrar(screen_retriever_registrar); + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); + g_autoptr(FlPluginRegistrar) window_manager_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "WindowManagerPlugin"); + window_manager_plugin_register_with_registrar(window_manager_registrar); +} diff --git a/linux/flutter/generated_plugin_registrant.h b/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..e0f0a47 --- /dev/null +++ b/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000..c5fb1d8 --- /dev/null +++ b/linux/flutter/generated_plugins.cmake @@ -0,0 +1,28 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + flutter_acrylic + screen_retriever + url_launcher_linux + window_manager +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST + zbar_scan_plugin +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/linux/main.cc b/linux/main.cc new file mode 100644 index 0000000..e7c5c54 --- /dev/null +++ b/linux/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/linux/my_application.cc b/linux/my_application.cc new file mode 100644 index 0000000..4ca9459 --- /dev/null +++ b/linux/my_application.cc @@ -0,0 +1,104 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#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) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(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 setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "dde_qrcode_detector"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "dde_qrcode_detector"); + } + + gtk_window_set_default_size(window, 0, 0); + // gtk_widget_show(GTK_WIDGET(window)); + + 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_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_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out 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; +} + +// Implements GObject::dispose. +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", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/linux/my_application.h b/linux/my_application.h new file mode 100644 index 0000000..72271d5 --- /dev/null +++ b/linux/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..4736d07 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,98 @@ +name: dde_qrcode_detector +description: A new Flutter project. +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: '>=2.19.6 <3.0.0' + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.2 + window_manager: ^0.3.2 + flutter_acrylic: ^1.1.2 + image: ^3.3.0 + auto_size_text: ^3.0.0 + url_launcher: ^6.1.10 + zbar_scan_plugin: + git: + url: https://github.com/debuggerx01/zbar_scan_plugin.git + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^2.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + assets: + - assets/ + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages