???: Add linux?
This commit is contained in:
parent
0a7f5ded2e
commit
8b090246e7
21
flake.nix
21
flake.nix
@ -33,8 +33,29 @@
|
||||
flutterPackages.beta pinnedJDK android.platform-tools flutterPackages.dart-beta # Flutter
|
||||
gitlint jq # Code hygiene
|
||||
ripgrep # General utilities
|
||||
|
||||
# Flutter dependencies for linux desktop
|
||||
atk
|
||||
cairo
|
||||
clang
|
||||
cmake
|
||||
epoxy
|
||||
gdk-pixbuf
|
||||
glib
|
||||
gtk3
|
||||
harfbuzz
|
||||
ninja
|
||||
pango
|
||||
pcre
|
||||
pkg-config
|
||||
xorg.libX11
|
||||
xorg.xorgproto
|
||||
];
|
||||
|
||||
# Make Flutter build on desktop
|
||||
CPATH = "${pkgs.xorg.libX11.dev}/include:${pkgs.xorg.xorgproto}/include";
|
||||
LD_LIBRARY_PATH = with pkgs; lib.makeLibraryPath [ atk cairo epoxy gdk-pixbuf glib gtk3 harfbuzz pango ];
|
||||
|
||||
ANDROID_HOME = "${android.androidsdk}/libexec/android-sdk";
|
||||
JAVA_HOME = pinnedJDK;
|
||||
ANDROID_AVD_HOME = (toString ./.) + "/.android/avd";
|
||||
|
@ -15,7 +15,7 @@ migration:
|
||||
- platform: root
|
||||
create_revision: 13a2fb10b838971ce211230f8ffdd094c14af02c
|
||||
base_revision: 13a2fb10b838971ce211230f8ffdd094c14af02c
|
||||
- platform: android
|
||||
- platform: linux
|
||||
create_revision: 13a2fb10b838971ce211230f8ffdd094c14af02c
|
||||
base_revision: 13a2fb10b838971ce211230f8ffdd094c14af02c
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
import "dart:async";
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import "package:moxdns/moxdns.dart";
|
||||
import "package:moxplatform/moxplatform.dart";
|
||||
import "package:moxplatform_platform_interface/src/service.dart";
|
||||
import "package:moxplatform/types.dart";
|
||||
@ -42,6 +43,8 @@ Future<void> entrypoint() async {
|
||||
Timer.periodic(const Duration(seconds: 2), (_) {
|
||||
srv.sendEvent(TestEvent());
|
||||
});
|
||||
|
||||
final result = await MoxdnsPlugin.srvQuery("_xmpps-client._tcp.disroot.org", false);
|
||||
}
|
||||
|
||||
class MyApp extends StatelessWidget {
|
||||
|
1
src/moxplatform/example/linux/.gitignore
vendored
Normal file
1
src/moxplatform/example/linux/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
flutter/ephemeral
|
138
src/moxplatform/example/linux/CMakeLists.txt
Normal file
138
src/moxplatform/example/linux/CMakeLists.txt
Normal file
@ -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 "example")
|
||||
# The unique GTK application identifier for this application. See:
|
||||
# https://wiki.gnome.org/HowDoI/ChooseApplicationID
|
||||
set(APPLICATION_ID "me.polynom.example")
|
||||
|
||||
# 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 "$<$<NOT:$<CONFIG:Debug>>:-O3>")
|
||||
target_compile_definitions(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>: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()
|
88
src/moxplatform/example/linux/flutter/CMakeLists.txt
Normal file
88
src/moxplatform/example/linux/flutter/CMakeLists.txt
Normal file
@ -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}
|
||||
)
|
@ -0,0 +1,24 @@
|
||||
#
|
||||
# Generated file, do not edit.
|
||||
#
|
||||
|
||||
list(APPEND FLUTTER_PLUGIN_LIST
|
||||
moxdns_linux
|
||||
)
|
||||
|
||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||
)
|
||||
|
||||
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 $<TARGET_FILE:${plugin}_plugin>)
|
||||
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)
|
6
src/moxplatform/example/linux/main.cc
Normal file
6
src/moxplatform/example/linux/main.cc
Normal file
@ -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);
|
||||
}
|
104
src/moxplatform/example/linux/my_application.cc
Normal file
104
src/moxplatform/example/linux/my_application.cc
Normal file
@ -0,0 +1,104 @@
|
||||
#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)
|
||||
|
||||
// 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, "example");
|
||||
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, "example");
|
||||
}
|
||||
|
||||
gtk_window_set_default_size(window, 1280, 720);
|
||||
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));
|
||||
}
|
18
src/moxplatform/example/linux/my_application.h
Normal file
18
src/moxplatform/example/linux/my_application.h
Normal file
@ -0,0 +1,18 @@
|
||||
#ifndef FLUTTER_MY_APPLICATION_H_
|
||||
#define FLUTTER_MY_APPLICATION_H_
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
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_
|
@ -42,6 +42,10 @@ dev_dependencies:
|
||||
moxplatform:
|
||||
path: ../
|
||||
|
||||
moxdns:
|
||||
hosted: https://pub.polynom.me
|
||||
version: 0.1.1
|
||||
|
||||
# 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
|
||||
|
@ -1,6 +1,6 @@
|
||||
name: moxplatform
|
||||
description: Moxxy platform-specific code
|
||||
version: 0.1.5
|
||||
version: 0.1.6
|
||||
publish_to: https://pub.polynom.me
|
||||
|
||||
environment:
|
||||
@ -21,12 +21,12 @@ dependencies:
|
||||
|
||||
moxplatform_android:
|
||||
hosted: https://pub.polynom.me
|
||||
version: 0.1.5
|
||||
version: 0.1.6
|
||||
#path: ../moxplatform_android
|
||||
moxplatform_platform_interface:
|
||||
#path: ../moxplatform_platform_interface
|
||||
hosted: https://pub.polynom.me
|
||||
version: 0.1.5
|
||||
version: 0.1.6
|
||||
|
||||
moxlib:
|
||||
hosted: https://pub.polynom.me
|
||||
|
30
src/moxplatform_generic/.gitignore
vendored
Normal file
30
src/moxplatform_generic/.gitignore
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
# 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
|
||||
# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock.
|
||||
/pubspec.lock
|
||||
**/doc/api/
|
||||
.dart_tool/
|
||||
.packages
|
||||
build/
|
10
src/moxplatform_generic/.metadata
Normal file
10
src/moxplatform_generic/.metadata
Normal file
@ -0,0 +1,10 @@
|
||||
# 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 and should not be manually edited.
|
||||
|
||||
version:
|
||||
revision: 13a2fb10b838971ce211230f8ffdd094c14af02c
|
||||
channel: beta
|
||||
|
||||
project_type: package
|
3
src/moxplatform_generic/CHANGELOG.md
Normal file
3
src/moxplatform_generic/CHANGELOG.md
Normal file
@ -0,0 +1,3 @@
|
||||
## 0.0.1
|
||||
|
||||
* TODO: Describe initial release.
|
1
src/moxplatform_generic/LICENSE
Normal file
1
src/moxplatform_generic/LICENSE
Normal file
@ -0,0 +1 @@
|
||||
TODO: Add your license here.
|
39
src/moxplatform_generic/README.md
Normal file
39
src/moxplatform_generic/README.md
Normal file
@ -0,0 +1,39 @@
|
||||
<!--
|
||||
This README describes the package. If you publish this package to pub.dev,
|
||||
this README's contents appear on the landing page for your package.
|
||||
|
||||
For information about how to write a good package README, see the guide for
|
||||
[writing package pages](https://dart.dev/guides/libraries/writing-package-pages).
|
||||
|
||||
For general information about developing packages, see the Dart guide for
|
||||
[creating packages](https://dart.dev/guides/libraries/create-library-packages)
|
||||
and the Flutter guide for
|
||||
[developing packages and plugins](https://flutter.dev/developing-packages).
|
||||
-->
|
||||
|
||||
TODO: Put a short description of the package here that helps potential users
|
||||
know whether this package might be useful for them.
|
||||
|
||||
## Features
|
||||
|
||||
TODO: List what your package can do. Maybe include images, gifs, or videos.
|
||||
|
||||
## Getting started
|
||||
|
||||
TODO: List prerequisites and provide or point to information on how to
|
||||
start using the package.
|
||||
|
||||
## Usage
|
||||
|
||||
TODO: Include short and useful examples for package users. Add longer examples
|
||||
to `/example` folder.
|
||||
|
||||
```dart
|
||||
const like = 'sample';
|
||||
```
|
||||
|
||||
## Additional information
|
||||
|
||||
TODO: Tell users more about the package: where to find more information, how to
|
||||
contribute to the package, how to file issues, what response they can expect
|
||||
from the package authors, and more.
|
4
src/moxplatform_generic/analysis_options.yaml
Normal file
4
src/moxplatform_generic/analysis_options.yaml
Normal file
@ -0,0 +1,4 @@
|
||||
include: package:flutter_lints/flutter.yaml
|
||||
|
||||
# Additional information about this file can be found at
|
||||
# https://dart.dev/guides/language/analysis-options
|
105
src/moxplatform_generic/lib/isolate_generic.dart
Normal file
105
src/moxplatform_generic/lib/isolate_generic.dart
Normal file
@ -0,0 +1,105 @@
|
||||
import "dart:convert";
|
||||
import "dart:ui";
|
||||
import "dart:isolate";
|
||||
|
||||
import "package:moxplatform_generic/service_generic.dart";
|
||||
|
||||
import "package:flutter/widgets.dart";
|
||||
import "package:logging/logging.dart";
|
||||
import "package:get_it/get_it.dart";
|
||||
import "package:moxplatform/types.dart";
|
||||
import "package:moxlib/awaitabledatasender.dart";
|
||||
import "package:moxplatform_platform_interface/src/isolate.dart";
|
||||
import "package:moxplatform_platform_interface/src/service.dart";
|
||||
|
||||
class BackgroundServiceDataSender extends AwaitableDataSender<BackgroundCommand, BackgroundEvent> {
|
||||
final SendPort _port;
|
||||
BackgroundServiceDataSender(this._port) : super();
|
||||
|
||||
@override
|
||||
Future<void> sendDataImpl(DataWrapper data) async {
|
||||
_port.send(jsonEncode(data.toJson()));
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> genericEntrypoint(List<dynamic> parameters) async {
|
||||
print("genericEntrypoint: Called on new Isolate");
|
||||
//WidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
SendPort port = parameters[0];
|
||||
final int entrypointHandle = parameters[1];
|
||||
final entrypointCallbackHandle = CallbackHandle.fromRawHandle(entrypointHandle);
|
||||
final entrypoint = PluginUtilities.getCallbackFromHandle(entrypointCallbackHandle);
|
||||
final int handleUIEventHandle = parameters[2];
|
||||
final handleUIEventCallbackHandle = CallbackHandle.fromRawHandle(handleUIEventHandle);
|
||||
final handleUIEvent = PluginUtilities.getCallbackFromHandle(handleUIEventCallbackHandle);
|
||||
|
||||
final srv = GenericBackgroundService(port);
|
||||
GetIt.I.registerSingleton<BackgroundService>(srv);
|
||||
srv.init(
|
||||
entrypoint! as Future<void> Function(),
|
||||
handleUIEvent! as Future<void> Function(Map<String, dynamic>? data)
|
||||
);
|
||||
}
|
||||
|
||||
class GenericIsolateHandler extends IsolateHandler {
|
||||
final Logger _log;
|
||||
ReceivePort? _isolateReceivePort;
|
||||
SendPort? _isolateSendPort;
|
||||
Isolate? _isolate;
|
||||
BackgroundServiceDataSender? _dataSender;
|
||||
|
||||
GenericIsolateHandler()
|
||||
: _log = Logger("GenericIsolateHandler"),
|
||||
super();
|
||||
|
||||
@override
|
||||
Future<void> attach(Future<void> Function(Map<String, dynamic>? data) handleIsolateEvent) async {
|
||||
if (_isolateReceivePort != null) {
|
||||
_isolateReceivePort!.listen((data) async {
|
||||
if (data is SendPort) {
|
||||
_isolateSendPort = data;
|
||||
_dataSender = BackgroundServiceDataSender(data);
|
||||
return;
|
||||
}
|
||||
|
||||
await handleIsolateEvent(jsonDecode(data as String));
|
||||
});
|
||||
} else {
|
||||
_log.severe("attach: _isolate is null");
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> start(
|
||||
Future<void> Function() entrypoint,
|
||||
Future<void> Function(Map<String, dynamic>? data) handleUIEvent,
|
||||
Future<void> Function(Map<String, dynamic>? data) handleIsolateEvent
|
||||
) async {
|
||||
_log.finest("Called start");
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
_isolateReceivePort = ReceivePort();
|
||||
_dataSender = BackgroundServiceDataSender(_isolateReceivePort!.sendPort);
|
||||
_isolate = await Isolate.spawn<List<dynamic>>(
|
||||
genericEntrypoint,
|
||||
[
|
||||
_isolateReceivePort!.sendPort,
|
||||
PluginUtilities.getCallbackHandle(entrypoint)!.toRawHandle(),
|
||||
PluginUtilities.getCallbackHandle(handleUIEvent)!.toRawHandle()
|
||||
]
|
||||
);
|
||||
|
||||
attach(handleIsolateEvent);
|
||||
|
||||
_log.finest("Service successfully started");
|
||||
}
|
||||
|
||||
@override
|
||||
Future<bool> isRunning() async {
|
||||
return _isolate != null;
|
||||
}
|
||||
|
||||
@override
|
||||
BackgroundServiceDataSender getDataSender() => _dataSender!;
|
||||
}
|
2
src/moxplatform_generic/lib/moxplatform_generic.dart
Normal file
2
src/moxplatform_generic/lib/moxplatform_generic.dart
Normal file
@ -0,0 +1,2 @@
|
||||
export "package:moxplatform_generic/isolate_generic.dart";
|
||||
export "package:moxplatform_generic/service_generic.dart";
|
58
src/moxplatform_generic/lib/service_generic.dart
Normal file
58
src/moxplatform_generic/lib/service_generic.dart
Normal file
@ -0,0 +1,58 @@
|
||||
import "dart:convert";
|
||||
import "dart:ui";
|
||||
import "dart:isolate";
|
||||
|
||||
import "package:moxplatform_platform_interface/src/service.dart";
|
||||
import "package:moxplatform/types.dart";
|
||||
import "package:moxlib/awaitabledatasender.dart";
|
||||
import "package:flutter/material.dart";
|
||||
import "package:logging/logging.dart";
|
||||
import "package:uuid/uuid.dart";
|
||||
|
||||
class GenericBackgroundService extends BackgroundService {
|
||||
final Logger _log;
|
||||
final SendPort _sender;
|
||||
late final ReceivePort _receiver;
|
||||
|
||||
GenericBackgroundService(this._sender)
|
||||
: _log = Logger("GenericBackgroundService"),
|
||||
super();
|
||||
|
||||
@override
|
||||
void setNotification(String title, String body) {}
|
||||
|
||||
@override
|
||||
void sendEvent(BackgroundEvent event, { String? id }) {
|
||||
final data = DataWrapper(
|
||||
id ?? const Uuid().v4(),
|
||||
event
|
||||
);
|
||||
// NOTE: *S*erver to *F*oreground
|
||||
_log.fine("S2F: ${data.toJson().toString()}");
|
||||
_sender.send(jsonEncode(data.toJson()));
|
||||
}
|
||||
|
||||
@override
|
||||
void init(
|
||||
Future<void> Function() entrypoint,
|
||||
Future<void> Function(Map<String, dynamic>? data) handleEvent
|
||||
) {
|
||||
//WidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
// Ensure that all native plugins are registered against this Isolate, so that
|
||||
// we can use path_provider, notifications, ...
|
||||
DartPluginRegistrant.ensureInitialized();
|
||||
|
||||
_receiver = ReceivePort();
|
||||
_sender.send(_receiver.sendPort);
|
||||
|
||||
// Register the event handler
|
||||
_receiver.listen((data) {
|
||||
final arg = jsonDecode(data as String);
|
||||
handleEvent(arg);
|
||||
});
|
||||
|
||||
_log.finest("Running...");
|
||||
entrypoint();
|
||||
}
|
||||
}
|
34
src/moxplatform_generic/pubspec.yaml
Normal file
34
src/moxplatform_generic/pubspec.yaml
Normal file
@ -0,0 +1,34 @@
|
||||
name: moxplatform_generic
|
||||
description: Generic implementations of moxplatform
|
||||
version: 0.1.5
|
||||
homepage: https://codeberg.org/moxxy/moxplatform
|
||||
|
||||
environment:
|
||||
sdk: ">=2.17.0-266.1.beta <3.0.0"
|
||||
flutter: ">=1.17.0"
|
||||
|
||||
dependencies:
|
||||
flutter:
|
||||
sdk: flutter
|
||||
|
||||
moxplatform:
|
||||
path: ../moxplatform
|
||||
#hosted: https://pub.polynom.me
|
||||
#version: 0.1.4
|
||||
moxplatform_platform_interface:
|
||||
path: ../moxplatform_platform_interface
|
||||
#hosted: https://pub.polynom.me
|
||||
#version: 0.1.4
|
||||
|
||||
moxlib:
|
||||
hosted: https://pub.polynom.me
|
||||
version: 0.1.3
|
||||
|
||||
logging: 1.0.2
|
||||
get_it: 7.2.0
|
||||
uuid: 3.0.5
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
flutter_lints: ^2.0.0
|
30
src/moxplatform_linux/.gitignore
vendored
Normal file
30
src/moxplatform_linux/.gitignore
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
# 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
|
||||
# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock.
|
||||
/pubspec.lock
|
||||
**/doc/api/
|
||||
.dart_tool/
|
||||
.packages
|
||||
build/
|
10
src/moxplatform_linux/.metadata
Normal file
10
src/moxplatform_linux/.metadata
Normal file
@ -0,0 +1,10 @@
|
||||
# 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 and should not be manually edited.
|
||||
|
||||
version:
|
||||
revision: 13a2fb10b838971ce211230f8ffdd094c14af02c
|
||||
channel: beta
|
||||
|
||||
project_type: package
|
3
src/moxplatform_linux/CHANGELOG.md
Normal file
3
src/moxplatform_linux/CHANGELOG.md
Normal file
@ -0,0 +1,3 @@
|
||||
## 0.0.1
|
||||
|
||||
* TODO: Describe initial release.
|
1
src/moxplatform_linux/LICENSE
Normal file
1
src/moxplatform_linux/LICENSE
Normal file
@ -0,0 +1 @@
|
||||
TODO: Add your license here.
|
4
src/moxplatform_linux/analysis_options.yaml
Normal file
4
src/moxplatform_linux/analysis_options.yaml
Normal file
@ -0,0 +1,4 @@
|
||||
include: package:flutter_lints/flutter.yaml
|
||||
|
||||
# Additional information about this file can be found at
|
||||
# https://dart.dev/guides/language/analysis-options
|
13
src/moxplatform_linux/lib/moxplatform_linux.dart
Normal file
13
src/moxplatform_linux/lib/moxplatform_linux.dart
Normal file
@ -0,0 +1,13 @@
|
||||
import "package:moxplatform_generic/isolate_generic.dart";
|
||||
|
||||
import "package:moxplatform_platform_interface/moxplatform_platform_interface.dart";
|
||||
|
||||
class MoxplatformLinuxPlugin extends MoxplatformInterface {
|
||||
static void registerWith() {
|
||||
print("MoxplatformLinuxPlugin: Registering implementation");
|
||||
MoxplatformInterface.handler = GenericIsolateHandler();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<String> getPlatformName() async => "Linux";
|
||||
}
|
32
src/moxplatform_linux/pubspec.yaml
Normal file
32
src/moxplatform_linux/pubspec.yaml
Normal file
@ -0,0 +1,32 @@
|
||||
name: moxplatform_linux
|
||||
description: Linux-specific implementation of moxplatform
|
||||
version: 0.1.5
|
||||
homepage: https://codeberg.org/moxxy/moxplatform
|
||||
|
||||
environment:
|
||||
sdk: ">=2.17.0-266.1.beta <3.0.0"
|
||||
flutter: ">=1.17.0"
|
||||
|
||||
dependencies:
|
||||
flutter:
|
||||
sdk: flutter
|
||||
|
||||
moxplatform:
|
||||
path: ../moxplatform
|
||||
#hosted: https://pub.polynom.me
|
||||
#version: 0.1.4
|
||||
moxplatform_generic:
|
||||
path: ../moxplatform_generic
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
flutter_lints: ^2.0.0
|
||||
|
||||
flutter:
|
||||
plugin:
|
||||
implements: moxplatform
|
||||
platforms:
|
||||
linux:
|
||||
dartPluginClass: MoxplatformLinuxPlugin
|
||||
|
Reference in New Issue
Block a user