123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- // ignore_for_file: avoid_web_libraries_in_flutter
- import 'dart:convert';
- import 'dart:js_interop';
- import 'dart:typed_data';
- import 'dart:js';
- import 'dart:html';
- import 'dart:async';
- import 'package:flutter/foundation.dart';
- import 'package:flutter_hbb/models/state_model.dart';
- import 'package:flutter_hbb/web/bridge.dart';
- import 'package:flutter_hbb/common.dart';
- final List<StreamSubscription<MouseEvent>> mouseListeners = [];
- final List<StreamSubscription<KeyboardEvent>> keyListeners = [];
- typedef HandleEvent = Future<void> Function(Map<String, dynamic> evt);
- class PlatformFFI {
- final _eventHandlers = <String, Map<String, HandleEvent>>{};
- final RustdeskImpl _ffiBind = RustdeskImpl();
- static String getByName(String name, [String arg = '']) {
- return context.callMethod('getByName', [name, arg]);
- }
- static void setByName(String name, [String value = '']) {
- context.callMethod('setByName', [name, value]);
- }
- PlatformFFI._() {
- window.document.addEventListener(
- 'visibilitychange',
- (event) => {
- stateGlobal.isWebVisible =
- window.document.visibilityState == 'visible'
- });
- }
- static final PlatformFFI instance = PlatformFFI._();
- static get localeName => window.navigator.language;
- RustdeskImpl get ffiBind => _ffiBind;
- static Future<String> getVersion() async {
- throw UnimplementedError();
- }
- bool registerEventHandler(
- String eventName, String handlerName, HandleEvent handler) {
- debugPrint('registerEventHandler $eventName $handlerName');
- var handlers = _eventHandlers[eventName];
- if (handlers == null) {
- _eventHandlers[eventName] = {handlerName: handler};
- return true;
- } else {
- if (handlers.containsKey(handlerName)) {
- return false;
- } else {
- handlers[handlerName] = handler;
- return true;
- }
- }
- }
- void unregisterEventHandler(String eventName, String handlerName) {
- debugPrint('unregisterEventHandler $eventName $handlerName');
- var handlers = _eventHandlers[eventName];
- if (handlers != null) {
- handlers.remove(handlerName);
- }
- }
- Future<bool> tryHandle(Map<String, dynamic> evt) async {
- final name = evt['name'];
- if (name != null) {
- final handlers = _eventHandlers[name];
- if (handlers != null) {
- if (handlers.isNotEmpty) {
- for (var handler in handlers.values) {
- await handler(evt);
- }
- return true;
- }
- }
- }
- return false;
- }
- String translate(String name, String locale) =>
- _ffiBind.translate(name: name, locale: locale);
- Uint8List? getRgba(SessionID sessionId, int display, int bufSize) {
- throw UnimplementedError();
- }
- int getRgbaSize(SessionID sessionId, int display) =>
- _ffiBind.sessionGetRgbaSize(sessionId: sessionId, display: display);
- void nextRgba(SessionID sessionId, int display) =>
- _ffiBind.sessionNextRgba(sessionId: sessionId, display: display);
- void registerPixelbufferTexture(SessionID sessionId, int display, int ptr) =>
- _ffiBind.sessionRegisterPixelbufferTexture(
- sessionId: sessionId, display: display, ptr: ptr);
- void registerGpuTexture(SessionID sessionId, int display, int ptr) =>
- _ffiBind.sessionRegisterGpuTexture(
- sessionId: sessionId, display: display, ptr: ptr);
- Future<void> init(String appType) async {
- Completer completer = Completer();
- context["onInitFinished"] = () {
- completer.complete();
- };
- context.callMethod('init');
- version = getByName('version');
- window.onContextMenu.listen((event) {
- event.preventDefault();
- });
- context['onRegisteredEvent'] = (String message) {
- try {
- Map<String, dynamic> event = json.decode(message);
- tryHandle(event);
- } catch (e) {
- print('json.decode fail(): $e');
- }
- };
- return completer.future;
- }
- void setEventCallback(void Function(Map<String, dynamic>) fun) {
- context["onGlobalEvent"] = (String message) {
- try {
- Map<String, dynamic> event = json.decode(message);
- fun(event);
- } catch (e) {
- print('json.decode fail(): $e');
- }
- };
- }
- void setRgbaCallback(void Function(int, Uint8List) fun) {
- context["onRgba"] = (int display, Uint8List? rgba) {
- if (rgba != null) {
- fun(display, rgba);
- }
- };
- }
- void startDesktopWebListener() {
- mouseListeners.add(
- window.document.onContextMenu.listen((evt) => evt.preventDefault()));
- }
- void stopDesktopWebListener() {
- for (var ml in mouseListeners) {
- ml.cancel();
- }
- mouseListeners.clear();
- for (var kl in keyListeners) {
- kl.cancel();
- }
- keyListeners.clear();
- }
- void setMethodCallHandler(FMethod callback) {}
- invokeMethod(String method, [dynamic arguments]) async {
- return true;
- }
- // just for compilation
- void syncAndroidServiceAppDirConfigPath() {}
- void setFullscreenCallback(void Function(bool) fun) {
- context["onFullscreenChanged"] = (bool v) {
- fun(v);
- };
- }
- }
|