Showing preview only (9,619K chars total). Download the full file or copy to clipboard to get everything.
Repository: rustdesk/rustdesk
Branch: master
Commit: 7004acae46b6
Files: 778
Total size: 9.0 MB
Directory structure:
gitextract_if2u_xfk/
├── .cargo/
│ └── config.toml
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yaml
│ │ └── config.yml
│ ├── dependabot.yml
│ ├── patches/
│ │ └── flutter_3.24.4_dropdown_menu_enableFilter.diff
│ └── workflows/
│ ├── bridge.yml
│ ├── ci.yml
│ ├── clear-cache.yml
│ ├── fdroid.yml
│ ├── flutter-build.yml
│ ├── flutter-ci.yml
│ ├── flutter-nightly.yml
│ ├── flutter-tag.yml
│ ├── playground.yml
│ ├── third-party-RustDeskTempTopMostWindow.yml
│ └── winget.yml
├── .gitignore
├── .gitmodules
├── CLAUDE.md
├── Cargo.toml
├── Dockerfile
├── LICENCE
├── README.md
├── appimage/
│ ├── AppImageBuilder-aarch64.yml
│ └── AppImageBuilder-x86_64.yml
├── build.py
├── build.rs
├── docs/
│ ├── CODE_OF_CONDUCT-DE.md
│ ├── CODE_OF_CONDUCT-JP.md
│ ├── CODE_OF_CONDUCT-KR.md
│ ├── CODE_OF_CONDUCT-NL.md
│ ├── CODE_OF_CONDUCT-NO.md
│ ├── CODE_OF_CONDUCT-PL.md
│ ├── CODE_OF_CONDUCT-RO.md
│ ├── CODE_OF_CONDUCT-RU.md
│ ├── CODE_OF_CONDUCT-TR.md
│ ├── CODE_OF_CONDUCT-ZH.md
│ ├── CODE_OF_CONDUCT.md
│ ├── CONTRIBUTING-DE.md
│ ├── CONTRIBUTING-ID.md
│ ├── CONTRIBUTING-IT.md
│ ├── CONTRIBUTING-JP.md
│ ├── CONTRIBUTING-KR.md
│ ├── CONTRIBUTING-NL.md
│ ├── CONTRIBUTING-NO.md
│ ├── CONTRIBUTING-PL.md
│ ├── CONTRIBUTING-RO.md
│ ├── CONTRIBUTING-RU.md
│ ├── CONTRIBUTING-TR.md
│ ├── CONTRIBUTING-ZH.md
│ ├── CONTRIBUTING.md
│ ├── README-AR.md
│ ├── README-CS.md
│ ├── README-DA.md
│ ├── README-DE.md
│ ├── README-EO.md
│ ├── README-ES.md
│ ├── README-FA.md
│ ├── README-FI.md
│ ├── README-FR.md
│ ├── README-GR.md
│ ├── README-HU.md
│ ├── README-ID.md
│ ├── README-IT.md
│ ├── README-JP.md
│ ├── README-KR.md
│ ├── README-ML.md
│ ├── README-NL.md
│ ├── README-NO.md
│ ├── README-PL.md
│ ├── README-PTBR.md
│ ├── README-RO.md
│ ├── README-RU.md
│ ├── README-TR.md
│ ├── README-UA.md
│ ├── README-VN.md
│ ├── README-ZH.md
│ ├── SECURITY-DE.md
│ ├── SECURITY-IT.md
│ ├── SECURITY-JP.md
│ ├── SECURITY-KR.md
│ ├── SECURITY-NL.md
│ ├── SECURITY-NO.md
│ ├── SECURITY-PL.md
│ ├── SECURITY-RO.md
│ ├── SECURITY-TR.md
│ └── SECURITY.md
├── entrypoint.sh
├── examples/
│ └── ipc.rs
├── fastlane/
│ └── metadata/
│ └── android/
│ ├── en-US/
│ │ ├── full_description.txt
│ │ └── short_description.txt
│ ├── fr-FR/
│ │ ├── full_description.txt
│ │ └── short_description.txt
│ ├── nl-NL/
│ │ ├── full_description.txt
│ │ └── short_description.txt
│ └── zh-CN/
│ ├── full_description.txt
│ └── short_description.txt
├── flatpak/
│ ├── com.rustdesk.RustDesk.metainfo.xml
│ └── rustdesk.json
├── flutter/
│ ├── .gitattributes
│ ├── .gitignore
│ ├── .metadata
│ ├── README.md
│ ├── analysis_options.yaml
│ ├── android/
│ │ ├── .gitignore
│ │ ├── app/
│ │ │ ├── build.gradle
│ │ │ ├── proguard-rules
│ │ │ └── src/
│ │ │ ├── debug/
│ │ │ │ └── AndroidManifest.xml
│ │ │ ├── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── kotlin/
│ │ │ │ │ ├── com/
│ │ │ │ │ │ └── carriez/
│ │ │ │ │ │ └── flutter_hbb/
│ │ │ │ │ │ ├── AudioRecordHandle.kt
│ │ │ │ │ │ ├── BootReceiver.kt
│ │ │ │ │ │ ├── FloatingWindowService.kt
│ │ │ │ │ │ ├── InputService.kt
│ │ │ │ │ │ ├── KeyboardKeyEventMapper.kt
│ │ │ │ │ │ ├── MainActivity.kt
│ │ │ │ │ │ ├── MainApplication.kt
│ │ │ │ │ │ ├── MainService.kt
│ │ │ │ │ │ ├── PermissionRequestTransparentActivity.kt
│ │ │ │ │ │ ├── RdClipboardManager.kt
│ │ │ │ │ │ ├── VolumeController.kt
│ │ │ │ │ │ └── common.kt
│ │ │ │ │ └── ffi.kt
│ │ │ │ └── res/
│ │ │ │ ├── drawable/
│ │ │ │ │ ├── check_blue.xml
│ │ │ │ │ ├── close_red.xml
│ │ │ │ │ ├── floating_window.xml
│ │ │ │ │ └── launch_background.xml
│ │ │ │ ├── drawable-v21/
│ │ │ │ │ └── launch_background.xml
│ │ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ │ ├── ic_launcher.xml
│ │ │ │ │ └── ic_launcher_round.xml
│ │ │ │ ├── values/
│ │ │ │ │ ├── colors.xml
│ │ │ │ │ ├── ic_launcher_background.xml
│ │ │ │ │ ├── strings.xml
│ │ │ │ │ └── styles.xml
│ │ │ │ ├── values-night/
│ │ │ │ │ └── styles.xml
│ │ │ │ └── xml/
│ │ │ │ └── accessibility_service_config.xml
│ │ │ └── profile/
│ │ │ └── AndroidManifest.xml
│ │ ├── build.gradle
│ │ ├── gradle/
│ │ │ └── wrapper/
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ └── settings.gradle
│ ├── build_android.sh
│ ├── build_android_deps.sh
│ ├── build_fdroid.sh
│ ├── build_ios.sh
│ ├── ios/
│ │ ├── .gitignore
│ │ ├── Flutter/
│ │ │ ├── AppFrameworkInfo.plist
│ │ │ ├── Debug.xcconfig
│ │ │ └── Release.xcconfig
│ │ ├── Podfile
│ │ ├── Runner/
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets/
│ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── LaunchImage.imageset/
│ │ │ │ ├── Contents.json
│ │ │ │ └── README.md
│ │ │ ├── Base.lproj/
│ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ └── Main.storyboard
│ │ │ ├── GoogleService-Info.plist
│ │ │ ├── Info.plist
│ │ │ ├── Runner-Bridging-Header.h
│ │ │ └── Runner.entitlements
│ │ ├── Runner.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace/
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcshareddata/
│ │ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ │ └── WorkspaceSettings.xcsettings
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ └── Runner.xcscheme
│ │ ├── Runner.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── WorkspaceSettings.xcsettings
│ │ └── exportOptions.plist
│ ├── ios_arm64.sh
│ ├── ios_x64.sh
│ ├── lib/
│ │ ├── common/
│ │ │ ├── formatter/
│ │ │ │ └── id_formatter.dart
│ │ │ ├── hbbs/
│ │ │ │ └── hbbs.dart
│ │ │ ├── shared_state.dart
│ │ │ └── widgets/
│ │ │ ├── address_book.dart
│ │ │ ├── animated_rotation_widget.dart
│ │ │ ├── audio_input.dart
│ │ │ ├── autocomplete.dart
│ │ │ ├── chat_page.dart
│ │ │ ├── connection_page_title.dart
│ │ │ ├── custom_password.dart
│ │ │ ├── custom_scale_base.dart
│ │ │ ├── dialog.dart
│ │ │ ├── gestures.dart
│ │ │ ├── login.dart
│ │ │ ├── my_group.dart
│ │ │ ├── overlay.dart
│ │ │ ├── peer_card.dart
│ │ │ ├── peer_tab_page.dart
│ │ │ ├── peers_view.dart
│ │ │ ├── remote_input.dart
│ │ │ ├── setting_widgets.dart
│ │ │ └── toolbar.dart
│ │ ├── common.dart
│ │ ├── consts.dart
│ │ ├── desktop/
│ │ │ ├── pages/
│ │ │ │ ├── connection_page.dart
│ │ │ │ ├── desktop_home_page.dart
│ │ │ │ ├── desktop_setting_page.dart
│ │ │ │ ├── desktop_tab_page.dart
│ │ │ │ ├── file_manager_page.dart
│ │ │ │ ├── file_manager_tab_page.dart
│ │ │ │ ├── install_page.dart
│ │ │ │ ├── port_forward_page.dart
│ │ │ │ ├── port_forward_tab_page.dart
│ │ │ │ ├── remote_page.dart
│ │ │ │ ├── remote_tab_page.dart
│ │ │ │ ├── server_page.dart
│ │ │ │ ├── terminal_connection_manager.dart
│ │ │ │ ├── terminal_page.dart
│ │ │ │ ├── terminal_tab_page.dart
│ │ │ │ ├── view_camera_page.dart
│ │ │ │ └── view_camera_tab_page.dart
│ │ │ ├── screen/
│ │ │ │ ├── desktop_file_transfer_screen.dart
│ │ │ │ ├── desktop_port_forward_screen.dart
│ │ │ │ ├── desktop_remote_screen.dart
│ │ │ │ ├── desktop_terminal_screen.dart
│ │ │ │ └── desktop_view_camera_screen.dart
│ │ │ └── widgets/
│ │ │ ├── button.dart
│ │ │ ├── dragable_divider.dart
│ │ │ ├── kb_layout_type_chooser.dart
│ │ │ ├── list_search_action_listener.dart
│ │ │ ├── material_mod_popup_menu.dart
│ │ │ ├── menu_button.dart
│ │ │ ├── popup_menu.dart
│ │ │ ├── refresh_wrapper.dart
│ │ │ ├── remote_toolbar.dart
│ │ │ ├── tabbar_widget.dart
│ │ │ ├── titlebar_widget.dart
│ │ │ └── update_progress.dart
│ │ ├── main.dart
│ │ ├── mobile/
│ │ │ ├── pages/
│ │ │ │ ├── connection_page.dart
│ │ │ │ ├── file_manager_page.dart
│ │ │ │ ├── home_page.dart
│ │ │ │ ├── remote_page.dart
│ │ │ │ ├── scan_page.dart
│ │ │ │ ├── server_page.dart
│ │ │ │ ├── settings_page.dart
│ │ │ │ ├── terminal_page.dart
│ │ │ │ └── view_camera_page.dart
│ │ │ └── widgets/
│ │ │ ├── custom_scale_widget.dart
│ │ │ ├── dialog.dart
│ │ │ ├── floating_mouse.dart
│ │ │ ├── floating_mouse_widgets.dart
│ │ │ └── gesture_help.dart
│ │ ├── models/
│ │ │ ├── ab_model.dart
│ │ │ ├── chat_model.dart
│ │ │ ├── cm_file_model.dart
│ │ │ ├── desktop_render_texture.dart
│ │ │ ├── file_model.dart
│ │ │ ├── group_model.dart
│ │ │ ├── input_model.dart
│ │ │ ├── model.dart
│ │ │ ├── native_model.dart
│ │ │ ├── peer_model.dart
│ │ │ ├── peer_tab_model.dart
│ │ │ ├── platform_model.dart
│ │ │ ├── printer_model.dart
│ │ │ ├── relative_mouse_model.dart
│ │ │ ├── server_model.dart
│ │ │ ├── state_model.dart
│ │ │ ├── terminal_model.dart
│ │ │ ├── user_model.dart
│ │ │ └── web_model.dart
│ │ ├── native/
│ │ │ ├── common.dart
│ │ │ ├── custom_cursor.dart
│ │ │ └── win32.dart
│ │ ├── plugin/
│ │ │ ├── common.dart
│ │ │ ├── event.dart
│ │ │ ├── handlers.dart
│ │ │ ├── manager.dart
│ │ │ ├── model.dart
│ │ │ ├── ui_manager.dart
│ │ │ ├── utils/
│ │ │ │ └── dialogs.dart
│ │ │ └── widgets/
│ │ │ ├── desc_ui.dart
│ │ │ └── desktop_settings.dart
│ │ ├── utils/
│ │ │ ├── event_loop.dart
│ │ │ ├── http_service.dart
│ │ │ ├── image.dart
│ │ │ ├── multi_window_manager.dart
│ │ │ ├── platform_channel.dart
│ │ │ ├── relative_mouse_accumulator.dart
│ │ │ └── scale.dart
│ │ └── web/
│ │ ├── bridge.dart
│ │ ├── common.dart
│ │ ├── custom_cursor.dart
│ │ ├── dummy.dart
│ │ ├── plugin/
│ │ │ └── handlers.dart
│ │ ├── settings_page.dart
│ │ ├── texture_rgba_renderer.dart
│ │ ├── web_unique.dart
│ │ └── win32.dart
│ ├── linux/
│ │ ├── .gitignore
│ │ ├── CMakeLists.txt
│ │ ├── bump_mouse.cc
│ │ ├── bump_mouse.h
│ │ ├── bump_mouse_x11.cc
│ │ ├── bump_mouse_x11.h
│ │ ├── flutter/
│ │ │ └── CMakeLists.txt
│ │ ├── main.cc
│ │ ├── my_application.cc
│ │ ├── my_application.h
│ │ ├── wayland_shortcuts_inhibit.cc
│ │ └── wayland_shortcuts_inhibit.h
│ ├── macos/
│ │ ├── .gitignore
│ │ ├── Flutter/
│ │ │ ├── Flutter-Debug.xcconfig
│ │ │ └── Flutter-Release.xcconfig
│ │ ├── Podfile
│ │ ├── Runner/
│ │ │ ├── AppDelegate.swift
│ │ │ ├── AppIcon.icns
│ │ │ ├── Base.lproj/
│ │ │ │ └── MainMenu.xib
│ │ │ ├── Configs/
│ │ │ │ ├── AppInfo.xcconfig
│ │ │ │ ├── Debug.xcconfig
│ │ │ │ ├── Release.xcconfig
│ │ │ │ └── Warnings.xcconfig
│ │ │ ├── DebugProfile.entitlements
│ │ │ ├── Info.plist
│ │ │ ├── MainFlutterWindow.swift
│ │ │ └── Release.entitlements
│ │ ├── Runner.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace/
│ │ │ │ └── xcshareddata/
│ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ └── Runner.xcscheme
│ │ └── Runner.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ ├── ndk_arm.sh
│ ├── ndk_arm64.sh
│ ├── ndk_x64.sh
│ ├── ndk_x86.sh
│ ├── pubspec.yaml
│ ├── run.sh
│ ├── test/
│ │ └── cm_test.dart
│ └── windows/
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── flutter/
│ │ └── CMakeLists.txt
│ └── runner/
│ ├── CMakeLists.txt
│ ├── Runner.rc
│ ├── flutter_window.cpp
│ ├── flutter_window.h
│ ├── main.cpp
│ ├── resource.h
│ ├── runner.exe.manifest
│ ├── utils.cpp
│ ├── utils.h
│ ├── win32_desktop.cpp
│ ├── win32_desktop.h
│ ├── win32_window.cpp
│ └── win32_window.h
├── libs/
│ ├── clipboard/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── build.rs
│ │ └── src/
│ │ ├── cliprdr.h
│ │ ├── context_send.rs
│ │ ├── lib.rs
│ │ ├── platform/
│ │ │ ├── mod.rs
│ │ │ ├── unix/
│ │ │ │ ├── filetype.rs
│ │ │ │ ├── fuse/
│ │ │ │ │ ├── cs.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── local_file.rs
│ │ │ │ ├── macos/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── item_data_provider.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── paste_observer.rs
│ │ │ │ │ ├── paste_task.rs
│ │ │ │ │ └── pasteboard_context.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── serv_files.rs
│ │ │ └── windows.rs
│ │ └── windows/
│ │ └── wf_cliprdr.c
│ ├── enigo/
│ │ ├── .gitattributes
│ │ ├── .github/
│ │ │ └── ISSUE_TEMPLATE/
│ │ │ ├── bug_report.md
│ │ │ ├── feature_request.md
│ │ │ └── question.md
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── Cargo.toml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── appveyor.yml
│ │ ├── build.rs
│ │ ├── examples/
│ │ │ ├── dsl.rs
│ │ │ ├── key.rs
│ │ │ ├── keyboard.rs
│ │ │ ├── mouse.rs
│ │ │ └── timer.rs
│ │ ├── rustfmt.toml
│ │ └── src/
│ │ ├── dsl.rs
│ │ ├── lib.rs
│ │ ├── linux/
│ │ │ ├── mod.rs
│ │ │ ├── nix_impl.rs
│ │ │ └── xdo.rs
│ │ ├── macos/
│ │ │ ├── keycodes.rs
│ │ │ ├── macos_impl.rs
│ │ │ └── mod.rs
│ │ └── win/
│ │ ├── keycodes.rs
│ │ ├── mod.rs
│ │ └── win_impl.rs
│ ├── libxdo-sys-stub/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── lib.rs
│ ├── portable/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── generate.py
│ │ ├── requirements.txt
│ │ └── src/
│ │ ├── bin_reader.rs
│ │ ├── main.rs
│ │ └── ui.rs
│ ├── remote_printer/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── lib.rs
│ │ └── setup/
│ │ ├── driver.rs
│ │ ├── mod.rs
│ │ ├── port.rs
│ │ ├── printer.rs
│ │ └── setup.rs
│ ├── scrap/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── build.rs
│ │ ├── examples/
│ │ │ ├── benchmark.rs
│ │ │ ├── capture_mag.rs
│ │ │ ├── ffplay.rs
│ │ │ ├── list.rs
│ │ │ ├── record-screen.rs
│ │ │ └── screenshot.rs
│ │ └── src/
│ │ ├── android/
│ │ │ ├── ffi.rs
│ │ │ └── mod.rs
│ │ ├── bindings/
│ │ │ ├── aom_ffi.h
│ │ │ ├── vpx_ffi.h
│ │ │ └── yuv_ffi.h
│ │ ├── common/
│ │ │ ├── android.rs
│ │ │ ├── aom.rs
│ │ │ ├── camera.rs
│ │ │ ├── codec.rs
│ │ │ ├── convert.rs
│ │ │ ├── dxgi.rs
│ │ │ ├── hwcodec.rs
│ │ │ ├── linux.rs
│ │ │ ├── mediacodec.rs
│ │ │ ├── mod.rs
│ │ │ ├── quartz.rs
│ │ │ ├── record.rs
│ │ │ ├── vpx.rs
│ │ │ ├── vpxcodec.rs
│ │ │ ├── vram.rs
│ │ │ ├── wayland.rs
│ │ │ └── x11.rs
│ │ ├── dxgi/
│ │ │ ├── gdi.rs
│ │ │ ├── mag.rs
│ │ │ └── mod.rs
│ │ ├── lib.rs
│ │ ├── quartz/
│ │ │ ├── capturer.rs
│ │ │ ├── config.rs
│ │ │ ├── display.rs
│ │ │ ├── ffi.rs
│ │ │ ├── frame.rs
│ │ │ └── mod.rs
│ │ ├── wayland/
│ │ │ ├── README.md
│ │ │ ├── capturable.rs
│ │ │ ├── display.rs
│ │ │ ├── pipewire.rs
│ │ │ ├── remote_desktop_portal.rs
│ │ │ ├── request_portal.rs
│ │ │ └── screencast_portal.rs
│ │ ├── wayland.rs
│ │ └── x11/
│ │ ├── capturer.rs
│ │ ├── display.rs
│ │ ├── ffi.rs
│ │ ├── iter.rs
│ │ ├── mod.rs
│ │ └── server.rs
│ └── virtual_display/
│ ├── Cargo.toml
│ ├── README.md
│ ├── dylib/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── build.rs
│ │ ├── examples/
│ │ │ └── idd_controller.rs
│ │ └── src/
│ │ ├── lib.rs
│ │ └── win10/
│ │ ├── IddController.c
│ │ ├── IddController.h
│ │ ├── Public.h
│ │ ├── idd.rs
│ │ └── mod.rs
│ ├── examples/
│ │ └── virtual_display_1.rs
│ └── src/
│ └── lib.rs
├── res/
│ ├── DEBIAN/
│ │ ├── postinst
│ │ ├── postrm
│ │ ├── preinst
│ │ └── prerm
│ ├── PKGBUILD
│ ├── ab.py
│ ├── audits.py
│ ├── bump.sh
│ ├── device-groups.py
│ ├── devices.py
│ ├── fdroid/
│ │ └── patches/
│ │ ├── 0000-flutter-android-x86.patch
│ │ └── 0001-x86-no-debuggable.patch
│ ├── gen_icon.sh
│ ├── inline-sciter.py
│ ├── job.py
│ ├── lang.py
│ ├── manifest.xml
│ ├── msi/
│ │ ├── .gitignore
│ │ ├── CustomActions/
│ │ │ ├── Common.h
│ │ │ ├── CustomActions.cpp
│ │ │ ├── CustomActions.def
│ │ │ ├── CustomActions.vcxproj
│ │ │ ├── DeviceUtils.cpp
│ │ │ ├── FirewallRules.cpp
│ │ │ ├── ReadConfig.cpp
│ │ │ ├── RemotePrinter.cpp
│ │ │ ├── ServiceUtils.cpp
│ │ │ ├── dllmain.cpp
│ │ │ ├── framework.h
│ │ │ ├── packages.config
│ │ │ ├── pch.cpp
│ │ │ └── pch.h
│ │ ├── Package/
│ │ │ ├── Components/
│ │ │ │ ├── Folders.wxs
│ │ │ │ ├── Regs.wxs
│ │ │ │ └── RustDesk.wxs
│ │ │ ├── Fragments/
│ │ │ │ ├── AddRemoveProperties.wxs
│ │ │ │ ├── CustomActions.wxs
│ │ │ │ ├── ShortcutProperties.wxs
│ │ │ │ └── Upgrades.wxs
│ │ │ ├── Includes.wxi
│ │ │ ├── Language/
│ │ │ │ ├── Package.en-us.wxl
│ │ │ │ └── WixExt_en-us.wxl
│ │ │ ├── License.rtf
│ │ │ ├── Package.wixproj
│ │ │ ├── Package.wxs
│ │ │ └── UI/
│ │ │ ├── AnotherApp.wxs
│ │ │ ├── MyInstallDirDlg.wxs
│ │ │ └── MyInstallDlg.wxs
│ │ ├── README.md
│ │ ├── msi.sln
│ │ └── preprocess.py
│ ├── osx-dist.sh
│ ├── pacman_install
│ ├── pam.d/
│ │ ├── rustdesk.debian
│ │ └── rustdesk.suse
│ ├── rpm-flutter-suse.spec
│ ├── rpm-flutter.spec
│ ├── rpm-suse.spec
│ ├── rpm.spec
│ ├── rustdesk-link.desktop
│ ├── rustdesk.desktop
│ ├── rustdesk.service
│ ├── startwm.sh
│ ├── strategies.py
│ ├── user-groups.py
│ ├── users.py
│ ├── vcpkg/
│ │ ├── aom/
│ │ │ ├── aom-avx2.diff
│ │ │ ├── aom-install.diff
│ │ │ ├── aom-uninitialized-pointer.diff
│ │ │ ├── portfile.cmake
│ │ │ └── vcpkg.json
│ │ ├── ffmpeg/
│ │ │ ├── 0001-create-lib-libraries.patch
│ │ │ ├── 0002-fix-msvc-link.patch
│ │ │ ├── 0003-fix-windowsinclude.patch
│ │ │ ├── 0004-dependencies.patch
│ │ │ ├── 0005-fix-nasm.patch
│ │ │ ├── 0007-fix-lib-naming.patch
│ │ │ ├── 0013-define-WINVER.patch
│ │ │ ├── 0020-fix-aarch64-libswscale.patch
│ │ │ ├── 0024-fix-osx-host-c11.patch
│ │ │ ├── 0040-ffmpeg-add-av_stream_get_first_dts-for-chromium.patch
│ │ │ ├── 0041-add-const-for-opengl-definition.patch
│ │ │ ├── 0042-fix-arm64-linux.patch
│ │ │ ├── 0043-fix-miss-head.patch
│ │ │ ├── build.sh.in
│ │ │ ├── patch/
│ │ │ │ ├── 0001-avcodec-amfenc-add-query_timeout-option-for-h264-hev.patch
│ │ │ │ ├── 0002-libavcodec-amfenc-reconfig-when-bitrate-change.patch
│ │ │ │ ├── 0004-videotoolbox-changing-bitrate.patch
│ │ │ │ ├── 0005-mediacodec-changing-bitrate.patch
│ │ │ │ ├── 0006-dlopen-libva.patch
│ │ │ │ ├── 0007-fix-linux-configure.patch
│ │ │ │ ├── 0008-remove-amf-loop-query.patch
│ │ │ │ ├── 0009-fix-nvenc-reconfigure-blur.patch
│ │ │ │ ├── 0010.disable-loading-DLLs-from-app-dir.patch
│ │ │ │ ├── 0011-android-mediacodec-encode-align-64.patch
│ │ │ │ └── 0012-fix-macos-big-sur-CVBufferCopyAttachments.patch
│ │ │ ├── portfile.cmake
│ │ │ ├── vcpkg-cmake-wrapper.cmake
│ │ │ └── vcpkg.json
│ │ ├── libvpx/
│ │ │ ├── 0003-add-uwp-v142-and-v143-support.patch
│ │ │ ├── 0004-remove-library-suffixes.patch
│ │ │ ├── portfile.cmake
│ │ │ ├── unofficial-libvpx-config.cmake.in
│ │ │ ├── vcpkg.json
│ │ │ └── vpx.pc.in
│ │ ├── libyuv/
│ │ │ ├── fix-cmakelists.patch
│ │ │ ├── libyuv-config.cmake
│ │ │ ├── portfile.cmake
│ │ │ ├── usage
│ │ │ ├── usage-msvc
│ │ │ └── vcpkg.json
│ │ ├── mfx-dispatch/
│ │ │ ├── 0003-upgrade-cmake-3.14.patch
│ │ │ ├── fix-pkgconf.patch
│ │ │ ├── fix-unresolved-symbol.patch
│ │ │ ├── portfile.cmake
│ │ │ └── vcpkg.json
│ │ └── opus/
│ │ ├── fix-pkgconfig-version.patch
│ │ ├── portfile.cmake
│ │ └── vcpkg.json
│ └── xorg.conf
├── src/
│ ├── auth_2fa.rs
│ ├── cli.rs
│ ├── client/
│ │ ├── file_trait.rs
│ │ ├── helper.rs
│ │ ├── io_loop.rs
│ │ └── screenshot.rs
│ ├── client.rs
│ ├── clipboard.rs
│ ├── clipboard_file.rs
│ ├── common.rs
│ ├── core_main.rs
│ ├── custom_server.rs
│ ├── flutter.rs
│ ├── flutter_ffi.rs
│ ├── hbbs_http/
│ │ ├── account.rs
│ │ ├── downloader.rs
│ │ ├── http_client.rs
│ │ ├── record_upload.rs
│ │ └── sync.rs
│ ├── hbbs_http.rs
│ ├── ipc.rs
│ ├── kcp_stream.rs
│ ├── keyboard.rs
│ ├── lan.rs
│ ├── lang/
│ │ ├── README.md
│ │ ├── ar.rs
│ │ ├── be.rs
│ │ ├── bg.rs
│ │ ├── ca.rs
│ │ ├── cn.rs
│ │ ├── cs.rs
│ │ ├── da.rs
│ │ ├── de.rs
│ │ ├── el.rs
│ │ ├── en.rs
│ │ ├── eo.rs
│ │ ├── es.rs
│ │ ├── et.rs
│ │ ├── eu.rs
│ │ ├── fa.rs
│ │ ├── fi.rs
│ │ ├── fr.rs
│ │ ├── ge.rs
│ │ ├── he.rs
│ │ ├── hr.rs
│ │ ├── hu.rs
│ │ ├── id.rs
│ │ ├── it.rs
│ │ ├── ja.rs
│ │ ├── ko.rs
│ │ ├── kz.rs
│ │ ├── lt.rs
│ │ ├── lv.rs
│ │ ├── nb.rs
│ │ ├── nl.rs
│ │ ├── pl.rs
│ │ ├── pt_PT.rs
│ │ ├── ptbr.rs
│ │ ├── ro.rs
│ │ ├── ru.rs
│ │ ├── sc.rs
│ │ ├── sk.rs
│ │ ├── sl.rs
│ │ ├── sq.rs
│ │ ├── sr.rs
│ │ ├── sv.rs
│ │ ├── ta.rs
│ │ ├── template.rs
│ │ ├── th.rs
│ │ ├── tr.rs
│ │ ├── tw.rs
│ │ ├── uk.rs
│ │ └── vi.rs
│ ├── lang.rs
│ ├── lib.rs
│ ├── main.rs
│ ├── naming.rs
│ ├── platform/
│ │ ├── delegate.rs
│ │ ├── gtk_sudo.rs
│ │ ├── linux.rs
│ │ ├── linux_desktop_manager.rs
│ │ ├── macos.mm
│ │ ├── macos.rs
│ │ ├── mod.rs
│ │ ├── privileges_scripts/
│ │ │ ├── agent.plist
│ │ │ ├── daemon.plist
│ │ │ ├── install.scpt
│ │ │ ├── uninstall.scpt
│ │ │ └── update.scpt
│ │ ├── win_device.rs
│ │ ├── windows.cc
│ │ ├── windows.rs
│ │ └── windows_delete_test_cert.cc
│ ├── plugin/
│ │ ├── callback_ext.rs
│ │ ├── callback_msg.rs
│ │ ├── config.rs
│ │ ├── desc.rs
│ │ ├── errno.rs
│ │ ├── ipc.rs
│ │ ├── manager.rs
│ │ ├── mod.rs
│ │ ├── native.rs
│ │ ├── native_handlers/
│ │ │ ├── macros.rs
│ │ │ ├── mod.rs
│ │ │ ├── session.rs
│ │ │ └── ui.rs
│ │ ├── plog.rs
│ │ └── plugins.rs
│ ├── port_forward.rs
│ ├── privacy_mode/
│ │ ├── macos.rs
│ │ ├── win_exclude_from_capture.rs
│ │ ├── win_input.rs
│ │ ├── win_mag.rs
│ │ ├── win_topmost_window.rs
│ │ └── win_virtual_display.rs
│ ├── privacy_mode.rs
│ ├── rendezvous_mediator.rs
│ ├── server/
│ │ ├── audio_service.rs
│ │ ├── clipboard_service.rs
│ │ ├── connection.rs
│ │ ├── dbus.rs
│ │ ├── display_service.rs
│ │ ├── input_service.rs
│ │ ├── portable_service.rs
│ │ ├── printer_service.rs
│ │ ├── rdp_input.rs
│ │ ├── service.rs
│ │ ├── terminal_helper.rs
│ │ ├── terminal_service.rs
│ │ ├── uinput.rs
│ │ ├── video_qos.rs
│ │ ├── video_service.rs
│ │ └── wayland.rs
│ ├── server.rs
│ ├── service.rs
│ ├── tray.rs
│ ├── ui/
│ │ ├── ab.tis
│ │ ├── chatbox.html
│ │ ├── cm.css
│ │ ├── cm.html
│ │ ├── cm.rs
│ │ ├── cm.tis
│ │ ├── common.css
│ │ ├── common.tis
│ │ ├── file_transfer.css
│ │ ├── file_transfer.tis
│ │ ├── grid.tis
│ │ ├── header.css
│ │ ├── header.tis
│ │ ├── index.css
│ │ ├── index.html
│ │ ├── index.tis
│ │ ├── install.html
│ │ ├── install.tis
│ │ ├── msgbox.tis
│ │ ├── port_forward.tis
│ │ ├── printer.tis
│ │ ├── remote.css
│ │ ├── remote.html
│ │ ├── remote.rs
│ │ └── remote.tis
│ ├── ui.rs
│ ├── ui_cm_interface.rs
│ ├── ui_interface.rs
│ ├── ui_session_interface.rs
│ ├── updater.rs
│ ├── virtual_display_manager.rs
│ └── whiteboard/
│ ├── client.rs
│ ├── linux.rs
│ ├── macos.rs
│ ├── mod.rs
│ ├── server.rs
│ ├── win_linux.rs
│ └── windows.rs
└── vcpkg.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .cargo/config.toml
================================================
[target.x86_64-pc-windows-msvc]
rustflags = ["-Ctarget-feature=+crt-static"]
[target.i686-pc-windows-msvc]
rustflags = ["-C", "target-feature=+crt-static", "-C", "link-args=/NODEFAULTLIB:MSVCRT"]
[target.'cfg(target_os="macos")']
rustflags = [
"-C", "link-args=-sectcreate __CGPreLoginApp __cgpreloginapp /dev/null",
]
#[target.'cfg(target_os="linux")']
# glibc-static required, this may fix https://github.com/rustdesk/rustdesk/issues/9103, but I do not want this big change
# this is unlikely to help also, because the other so files still use libc dynamically
#rustflags = [
# "-C", "link-args=-Wl,-Bstatic -lc -Wl,-Bdynamic"
#]
[net]
git-fetch-with-cli = true
================================================
FILE: .gitattributes
================================================
* text=auto
================================================
FILE: .github/FUNDING.yml
================================================
github: [rustdesk]
ko_fi: rustdesk
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yaml
================================================
name: 🐞 Bug report
description: Thanks for taking the time to fill out this bug report! Please fill the form in **English**
labels: ["bug"]
body:
- type: textarea
id: desc
attributes:
label: Bug Description
description: A clear and concise description of what the bug is (if it's a keyboard issue, provide the keyboard mode you're using. e.g. legacy, map, translate)
validations:
required: true
- type: textarea
id: reproduce
attributes:
label: How to Reproduce
description: What steps can we take to reproduce this behavior?
validations:
required: true
- type: textarea
id: expected
attributes:
label: Expected Behavior
description: A clear and concise description of what you expected to happen
validations:
required: true
- type: input
id: os
attributes:
label: Operating system(s) on local (controlling) side and remote (controlled) side
description: What operating system(s) do you see this bug on? local (controlling) side -> remote (controlled) side.
placeholder: |
Windows 10 -> osx
validations:
required: true
- type: input
id: version
attributes:
label: RustDesk Version(s) on local (controlling) side and remote (controlled) side
description: What RustDesk version(s) do you see this bug on? local (controlling) side -> remote (controlled) side.
placeholder: |
1.1.9 -> 1.1.8
validations:
required: true
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: Please add screenshots to help explain your problem, if applicable, please upload video.
validations:
required: true
- type: textarea
id: context
attributes:
label: Additional Context
description: Add any additonal context about the problem here
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Feature Request
url: https://github.com/rustdesk/rustdesk/discussions/categories/feature-request
about: Discuss ideas for new features or enhancements, it will be converted to GitHub issue when we commit to building those changes or are helping a community member contribute their own changes
- name: Ask a question
url: https://github.com/rustdesk/rustdesk/discussions/category_choices
about: Ask questions and discuss with other community members.
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: "gitsubmodule"
directory: "/"
target-branch: "master"
schedule:
interval: "daily"
commit-message:
prefix: "Git submodule"
labels:
- "dependencies"
================================================
FILE: .github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff
================================================
diff --git a/packages/flutter/lib/src/material/dropdown_menu.dart b/packages/flutter/lib/src/material/dropdown_menu.dart
index 7e634cd2aa..c1e9acc295 100644
--- a/packages/flutter/lib/src/material/dropdown_menu.dart
+++ b/packages/flutter/lib/src/material/dropdown_menu.dart
@@ -475,7 +475,7 @@ class _DropdownMenuState<T> extends State<DropdownMenu<T>> {
final GlobalKey _leadingKey = GlobalKey();
late List<GlobalKey> buttonItemKeys;
final MenuController _controller = MenuController();
- late bool _enableFilter;
+ bool _enableFilter = false;
late List<DropdownMenuEntry<T>> filteredEntries;
List<Widget>? _initialMenu;
int? currentHighlight;
@@ -524,6 +524,11 @@ class _DropdownMenuState<T> extends State<DropdownMenu<T>> {
}
_localTextEditingController = widget.controller ?? TextEditingController();
}
+ if (oldWidget.enableFilter != widget.enableFilter) {
+ if (!widget.enableFilter) {
+ _enableFilter = false;
+ }
+ }
if (oldWidget.enableSearch != widget.enableSearch) {
if (!widget.enableSearch) {
currentHighlight = null;
@@ -663,6 +668,7 @@ class _DropdownMenuState<T> extends State<DropdownMenu<T>> {
);
currentHighlight = widget.enableSearch ? i : null;
widget.onSelected?.call(entry.value);
+ _enableFilter = false;
}
: null,
requestFocusOnHover: false,
@@ -735,6 +741,8 @@ class _DropdownMenuState<T> extends State<DropdownMenu<T>> {
if (_enableFilter) {
filteredEntries = widget.filterCallback?.call(filteredEntries, _localTextEditingController!.text)
?? filter(widget.dropdownMenuEntries, _localTextEditingController!);
+ } else {
+ filteredEntries = widget.dropdownMenuEntries;
}
if (widget.enableSearch) {
================================================
FILE: .github/workflows/bridge.yml
================================================
# This yaml shares the build bridge steps with ci and nightly.
name: Build flutter-rust-bridge
# 2023-11-23 18:00:00+00:00
on:
workflow_call:
env:
CARGO_EXPAND_VERSION: "1.0.95"
FLUTTER_VERSION: "3.22.3"
FLUTTER_RUST_BRIDGE_VERSION: "1.80.1"
RUST_VERSION: "1.75" # https://github.com/rustdesk/rustdesk/discussions/7503
jobs:
generate_bridge:
runs-on: ${{ matrix.job.os }}
strategy:
fail-fast: false
matrix:
job:
- {
target: x86_64-unknown-linux-gnu,
os: ubuntu-22.04,
extra-build-args: "",
}
steps:
- name: Checkout source code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Install prerequisites
run: |
sudo apt-get install ca-certificates -y
sudo apt-get update -y
sudo apt-get install -y \
clang \
cmake \
curl \
gcc \
git \
g++ \
libclang-dev \
libgtk-3-dev \
llvm-dev \
nasm \
ninja-build \
pkg-config \
wget
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ env.RUST_VERSION }}
targets: ${{ matrix.job.target }}
components: "rustfmt"
- uses: Swatinem/rust-cache@v2
with:
prefix-key: bridge-${{ matrix.job.os }}
- name: Cache Bridge
id: cache-bridge
uses: actions/cache@v3
with:
path: /tmp/flutter_rust_bridge
key: vcpkg-${{ matrix.job.arch }}
- name: Install flutter
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: ${{ env.FLUTTER_VERSION }}
cache: true
- name: Install flutter rust bridge deps
shell: bash
run: |
cargo install cargo-expand --version ${{ env.CARGO_EXPAND_VERSION }} --locked
cargo install flutter_rust_bridge_codegen --version ${{ env.FLUTTER_RUST_BRIDGE_VERSION }} --features "uuid" --locked
pushd flutter && sed -i -e 's/extended_text: 14.0.0/extended_text: 13.0.0/g' pubspec.yaml && flutter pub get && popd
- name: Run flutter rust bridge
run: |
~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart --c-output ./flutter/macos/Runner/bridge_generated.h
cp ./flutter/macos/Runner/bridge_generated.h ./flutter/ios/Runner/bridge_generated.h
- name: Upload Artifact
uses: actions/upload-artifact@master
with:
name: bridge-artifact
path: |
./src/bridge_generated.rs
./src/bridge_generated.io.rs
./flutter/lib/generated_bridge.dart
./flutter/lib/generated_bridge.freezed.dart
./flutter/macos/Runner/bridge_generated.h
./flutter/ios/Runner/bridge_generated.h
================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
env:
# MIN_SUPPORTED_RUST_VERSION: "1.46.0"
# CICD_INTERMEDIATES_DIR: "_cicd-intermediates"
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
# for multiarch gcc compatibility
VCPKG_COMMIT_ID: "120deac3062162151622ca4860575a33844ba10b"
on:
workflow_dispatch:
pull_request:
paths-ignore:
- "docs/**"
- "README.md"
push:
branches:
- master
paths-ignore:
- ".github/**"
- "docs/**"
- "README.md"
- "res/**"
- "appimage/**"
- "flatpak/**"
jobs:
# ensure_cargo_fmt:
# name: Ensure 'cargo fmt' has been run
# runs-on: ubuntu-20.04
# steps:
# - uses: actions-rs/toolchain@v1
# with:
# toolchain: stable
# default: true
# profile: minimal
# components: rustfmt
# - uses: actions/checkout@v3
# - run: cargo fmt -- --check
# min_version:
# name: Minimum supported rust version
# runs-on: ubuntu-20.04
# steps:
# - name: Checkout source code
# uses: actions/checkout@v3
# with:
# submodules: recursive
# - name: Install rust toolchain (v${{ env.MIN_SUPPORTED_RUST_VERSION }})
# uses: actions-rs/toolchain@v1
# with:
# toolchain: ${{ env.MIN_SUPPORTED_RUST_VERSION }}
# default: true
# profile: minimal # minimal component installation (ie, no documentation)
# components: clippy
# - name: Run clippy (on minimum supported rust version to prevent warnings we can't fix)
# uses: actions-rs/cargo@v1
# with:
# command: clippy
# args: --locked --all-targets --all-features -- --allow clippy::unknown_clippy_lints
# - name: Run tests
# uses: actions-rs/cargo@v1
# with:
# command: test
# args: --locked
build:
name: ${{ matrix.job.target }} (${{ matrix.job.os }})
runs-on: ${{ matrix.job.os }}
strategy:
fail-fast: false
matrix:
job:
# - { target: aarch64-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true }
# - { target: arm-unknown-linux-gnueabihf , os: ubuntu-20.04, use-cross: true }
# - { target: arm-unknown-linux-musleabihf, os: ubuntu-20.04, use-cross: true }
# - { target: i686-pc-windows-msvc , os: windows-2022 }
# - { target: i686-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true }
# - { target: i686-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
# - { target: x86_64-apple-darwin , os: macos-10.15 }
# - { target: x86_64-pc-windows-gnu , os: windows-2022 }
# - { target: x86_64-pc-windows-msvc , os: windows-2022 }
- { target: x86_64-unknown-linux-gnu , os: ubuntu-24.04 }
# - { target: x86_64-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
steps:
- name: Free Disk Space (Ubuntu)
if: runner.os == 'Linux'
# jlumbroso/free-disk-space@main is used in .github\workflows\flutter-build.yml
# But pinning to a specific version to avoid unexpected issues is preferred.
uses: jlumbroso/free-disk-space@v1.3.1
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: false
docker-images: true
swap-storage: false
- name: Export GitHub Actions cache environment variables
uses: actions/github-script@v6
with:
script: |
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
- name: Checkout source code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Install prerequisites
shell: bash
run: |
case ${{ matrix.job.target }} in
x86_64-unknown-linux-gnu)
sudo apt-get -y update
sudo apt-get install -y \
clang \
cmake \
curl \
gcc \
git \
g++ \
libpam0g-dev \
libasound2-dev \
libunwind-dev \
libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev \
libgtk-3-dev \
libpulse-dev \
libva-dev \
libvdpau-dev \
libxcb-randr0-dev \
libxcb-shape0-dev \
libxcb-xfixes0-dev \
libxdo-dev \
libxfixes-dev \
nasm \
wget
;;
# arm-unknown-linux-*) sudo apt-get -y update ; sudo apt-get -y install gcc-arm-linux-gnueabihf ;;
# aarch64-unknown-linux-gnu) sudo apt-get -y update ; sudo apt-get -y install gcc-aarch64-linux-gnu ;;
esac
- name: Setup vcpkg with Github Actions binary cache
uses: lukka/run-vcpkg@v11
with:
vcpkgDirectory: /opt/artifacts/vcpkg
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
- name: Install vcpkg dependencies
run: |
$VCPKG_ROOT/vcpkg install --x-install-root="$VCPKG_ROOT/installed"
shell: bash
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@v1
with:
toolchain: stable
targets: ${{ matrix.job.target }}
components: ''
- name: Show version information (Rust, cargo, GCC)
shell: bash
run: |
gcc --version || true
rustup -V
rustup toolchain list
rustup default
cargo -V
rustc -V
- uses: Swatinem/rust-cache@v2
- name: Build
uses: actions-rs/cargo@v1
with:
use-cross: ${{ matrix.job.use-cross }}
command: build
args: --locked --target=${{ matrix.job.target }}
- name: clean
shell: bash
run: |
cargo clean
# - name: Strip debug information from executable
# id: strip
# shell: bash
# run: |
# # Figure out suffix of binary
# EXE_suffix=""
# case ${{ matrix.job.target }} in
# *-pc-windows-*) EXE_suffix=".exe" ;;
# esac;
# # Figure out what strip tool to use if any
# STRIP="strip"
# case ${{ matrix.job.target }} in
# arm-unknown-linux-*) STRIP="arm-linux-gnueabihf-strip" ;;
# aarch64-unknown-linux-gnu) STRIP="aarch64-linux-gnu-strip" ;;
# *-pc-windows-msvc) STRIP="" ;;
# esac;
# # Setup paths
# BIN_DIR="${{ env.CICD_INTERMEDIATES_DIR }}/stripped-release-bin/"
# mkdir -p "${BIN_DIR}"
# BIN_NAME="${{ env.PROJECT_NAME }}${EXE_suffix}"
# BIN_PATH="${BIN_DIR}/${BIN_NAME}"
# # Copy the release build binary to the result location
# cp "target/${{ matrix.job.target }}/release/${BIN_NAME}" "${BIN_DIR}"
# # Also strip if possible
# if [ -n "${STRIP}" ]; then
# "${STRIP}" "${BIN_PATH}"
# fi
# # Let subsequent steps know where to find the (stripped) bin
# echo ::set-output name=BIN_PATH::${BIN_PATH}
# echo ::set-output name=BIN_NAME::${BIN_NAME}
- name: Set testing options
id: test-options
shell: bash
run: |
# test only library unit tests and binary for arm-type targets
unset CARGO_TEST_OPTIONS
case ${{ matrix.job.target }} in
arm-* | aarch64-*)
CARGO_TEST_OPTIONS="--lib --bin ${PROJECT_NAME}"
;;
*)
CARGO_TEST_OPTIONS="--workspace --no-fail-fast -- --skip test_get_cursor_pos --skip test_get_key_state"
;;
esac;
#deprecated echo ::set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS}
echo "CARGO_TEST_OPTIONS=${CARGO_TEST_OPTIONS}" >> $GITHUB_ENV
echo "CARGO_TEST_OPTIONS=${CARGO_TEST_OPTIONS}" >> $GITHUB_OUTPUT
- name: Run tests
uses: actions-rs/cargo@v1
with:
use-cross: ${{ matrix.job.use-cross }}
command: test
args: --locked --target=${{ matrix.job.target }} ${{ steps.test-options.outputs.CARGO_TEST_OPTIONS}}
================================================
FILE: .github/workflows/clear-cache.yml
================================================
name: Clear cache
on:
workflow_dispatch:
permissions:
actions: write
jobs:
clear-cache:
runs-on: ubuntu-latest
steps:
- name: Clear cache
uses: actions/github-script@v7
with:
script: |
console.log("About to clear")
const caches = await github.rest.actions.getActionsCacheList({
owner: context.repo.owner,
repo: context.repo.repo,
})
for (const cache of caches.data.actions_caches) {
console.log(cache)
github.rest.actions.deleteActionsCacheById({
owner: context.repo.owner,
repo: context.repo.repo,
cache_id: cache.id,
})
}
console.log("Clear completed")
- name: Purge cache # Above seems not clear thouroughly, so add this to double clear
uses: MyAlbum/purge-cache@v2
with:
accessed: true # Purge caches by their last accessed time (default)
created: false # Purge caches by their created time (default)
max-age: 1 # in seconds
================================================
FILE: .github/workflows/fdroid.yml
================================================
name: Fdroid version file generation
on:
workflow_dispatch:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
- '[0-9]+.[0-9]+.[0-9]+'
- 'v[0-9]+.[0-9]+.[0-9]+-[0-9]+'
- '[0-9]+.[0-9]+.[0-9]+-[0-9]+'
jobs:
# https://gitlab.com/fdroid/fdroiddata/-/blob/master/metadata/com.carriez.flutter_hbb.yml
# Finds latest release and transforms F-Droid version code from version as follows:
# X.Y.Z-A => X * 1e6 + Y * 1e4 + Z * 1e2 + A
update-fdroid-version-file:
name: Publish RustDesk version file for F-Droid updater
runs-on: ubuntu-latest
steps:
- name: Generate RustDesk version file
run: |
if [ "${GITHUB_REF_TYPE}" = "tag" ]; then
UPSTREAM_VERNAME="${GITHUB_REF##refs/tags/}"
UPSTREAM_VERNAME="${UPSTREAM_VERNAME##v}"
else
UPSTREAM_VERNAME="$(curl https://api.github.com/repos/rustdesk/rustdesk/releases/latest | jq -r .tag_name | sed 's/^v//')"
fi
UPSTREAM_VERCODE="$(echo "$UPSTREAM_VERNAME" | tr '.' ' ' | tr '-' ' ' | while read -r MAJOR MINOR PATCH REV; do [ -z "$MAJOR" ] && MAJOR=0; [ -z "$MINOR" ] && MINOR=0; [ -z "$PATCH" ] && PATCH=0; [ -z "$REV" ] && REV=0; echo "$(( 1000000 * $MAJOR + 10000 * $MINOR + 100 * $PATCH + $REV ))"; done)"
echo "versionName=$UPSTREAM_VERNAME" > rustdesk-version.txt
echo "versionCode=$UPSTREAM_VERCODE" >> rustdesk-version.txt
shell: bash
- name: Publish RustDesk version file
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: "fdroid-version"
files: |
./rustdesk-version.txt
================================================
FILE: .github/workflows/flutter-build.yml
================================================
name: Build the flutter version of the RustDesk
on:
workflow_call:
inputs:
upload-artifact:
type: boolean
default: true
upload-tag:
type: string
default: "nightly"
# NOTE: F-Droid builder script 'flutter/build_fdroid.sh' reads environment
# variables from this workflow!
#
# It does NOT read build steps, however, so please fix 'flutter/build_fdroid.sh
# whenever you add changes to Android CI build action ('build-rustdesk-android')
# in this file!
env:
SCITER_RUST_VERSION: "1.75" # https://github.com/rustdesk/rustdesk/discussions/7503, also 1.78 has ABI change which causes our sciter version not working, https://blog.rust-lang.org/2024/03/30/i128-layout-update.html
RUST_VERSION: "1.75" # sciter failed on m1 with 1.78 because of https://blog.rust-lang.org/2024/03/30/i128-layout-update.html
MAC_RUST_VERSION: "1.81" # 1.81 is requred for macos, because of https://github.com/yury/cidre requires 1.81
CARGO_NDK_VERSION: "3.1.2"
SCITER_ARMV7_CMAKE_VERSION: "3.29.7"
SCITER_NASM_DEBVERSION: "2.15.05-1"
LLVM_VERSION: "15.0.6"
FLUTTER_VERSION: "3.24.5"
ANDROID_FLUTTER_VERSION: "3.24.5"
# for arm64 linux because official Dart SDK does not work
FLUTTER_ELINUX_VERSION: "3.16.9"
TAG_NAME: "${{ inputs.upload-tag }}"
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
# vcpkg version: 2025.08.27
# If we change the `VCPKG COMMIT_ID`, please remember:
# 1. Call `$VCPKG_ROOT/vcpkg x-update-baseline` to update the baseline in `vcpkg.json`.
# Or we may face build issue like
# https://github.com/rustdesk/rustdesk/actions/runs/14414119794/job/40427970174
# 2. Update the `VCPKG_COMMIT_ID` in `ci.yml` and `playground.yml`.
VCPKG_COMMIT_ID: "120deac3062162151622ca4860575a33844ba10b"
ARMV7_VCPKG_COMMIT_ID: "6f29f12e82a8293156836ad81cc9bf5af41fe836" # 2025.01.13, got "/opt/artifacts/vcpkg/vcpkg: No such file or directory" with latest version
VERSION: "1.4.6"
NDK_VERSION: "r28c"
#signing keys env variable checks
ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}"
MACOS_P12_BASE64: "${{ secrets.MACOS_P12_BASE64 }}"
UPLOAD_ARTIFACT: "${{ inputs.upload-artifact }}"
SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}-2"
jobs:
generate-bridge:
uses: ./.github/workflows/bridge.yml
build-RustDeskTempTopMostWindow:
uses: ./.github/workflows/third-party-RustDeskTempTopMostWindow.yml
with:
upload-artifact: ${{ inputs.upload-artifact }}
target: windows-2022
configuration: Release
platform: x64
target_version: Windows10
strategy:
fail-fast: false
build-for-windows-flutter:
name: ${{ matrix.job.target }}
needs: [build-RustDeskTempTopMostWindow, generate-bridge]
runs-on: ${{ matrix.job.os }}
strategy:
fail-fast: false
matrix:
job:
# - { target: i686-pc-windows-msvc , os: windows-2022 }
# - { target: x86_64-pc-windows-gnu , os: windows-2022 }
- {
target: x86_64-pc-windows-msvc,
os: windows-2022,
arch: x86_64,
vcpkg-triplet: x64-windows-static,
}
# - { target: aarch64-pc-windows-msvc, os: windows-2022, arch: aarch64 }
steps:
- name: Export GitHub Actions cache environment variables
uses: actions/github-script@v6
with:
script: |
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
- name: Checkout source code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Restore bridge files
uses: actions/download-artifact@master
with:
name: bridge-artifact
path: ./
- name: Install LLVM and Clang
uses: KyleMayes/install-llvm-action@v1
with:
version: ${{ env.LLVM_VERSION }}
- name: Install flutter
uses: subosito/flutter-action@v2.12.0 #https://github.com/subosito/flutter-action/issues/277
with:
channel: "stable"
flutter-version: ${{ env.FLUTTER_VERSION }}
# https://github.com/flutter/flutter/issues/155685
- name: Replace engine with rustdesk custom flutter engine
run: |
flutter doctor -v
flutter precache --windows
Invoke-WebRequest -Uri https://github.com/rustdesk/engine/releases/download/main/windows-x64-release.zip -OutFile windows-x64-release.zip
Expand-Archive -Path windows-x64-release.zip -DestinationPath windows-x64-release
mv -Force windows-x64-release/* C:/hostedtoolcache/windows/flutter/stable-${{ env.FLUTTER_VERSION }}-x64/bin/cache/artifacts/engine/windows-x64-release/
- name: Patch flutter
shell: bash
run: |
cp .github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff $(dirname $(dirname $(which flutter)))
cd $(dirname $(dirname $(which flutter)))
[[ "3.24.5" == ${{env.FLUTTER_VERSION}} ]] && git apply flutter_3.24.4_dropdown_menu_enableFilter.diff
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ env.SCITER_RUST_VERSION }}
targets: ${{ matrix.job.target }}
components: "rustfmt"
- uses: Swatinem/rust-cache@v2
with:
prefix-key: ${{ matrix.job.os }}
- name: Setup vcpkg with Github Actions binary cache
uses: lukka/run-vcpkg@v11
with:
vcpkgDirectory: C:\vcpkg
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
doNotCache: false
- name: Install vcpkg dependencies
env:
VCPKG_DEFAULT_HOST_TRIPLET: ${{ matrix.job.vcpkg-triplet }}
run: |
if ! $VCPKG_ROOT/vcpkg \
install \
--triplet ${{ matrix.job.vcpkg-triplet }} \
--x-install-root="$VCPKG_ROOT/installed"; then
find "${VCPKG_ROOT}/" -name "*.log" | while read -r _1; do
echo "$_1:"
echo "======"
cat "$_1"
echo "======"
echo ""
done
exit 1
fi
head -n 100 "${VCPKG_ROOT}/buildtrees/ffmpeg/build-${{ matrix.job.vcpkg-triplet }}-rel-out.log" || true
shell: bash
- name: Build rustdesk
run: |
# Windows: build RustDesk
python3 .\build.py --portable --hwcodec --flutter --vram --skip-portable-pack
mv ./flutter/build/windows/x64/runner/Release ./rustdesk
# Download usbmmidd_v2.zip and extract it to ./rustdesk
Invoke-WebRequest -Uri https://github.com/rustdesk-org/rdev/releases/download/usbmmidd_v2/usbmmidd_v2.zip -OutFile usbmmidd_v2.zip
Expand-Archive usbmmidd_v2.zip -DestinationPath .
Remove-Item -Path usbmmidd_v2\Win32 -Recurse
Remove-Item -Path "usbmmidd_v2\deviceinstaller64.exe", "usbmmidd_v2\deviceinstaller.exe", "usbmmidd_v2\usbmmidd.bat"
mv -Force .\usbmmidd_v2 ./rustdesk
# Download printer driver files and extract them to ./rustdesk
try {
Invoke-WebRequest -Uri https://github.com/rustdesk/hbb_common/releases/download/driver/rustdesk_printer_driver_v4-1.4.zip -OutFile rustdesk_printer_driver_v4-1.4.zip
Invoke-WebRequest -Uri https://github.com/rustdesk/hbb_common/releases/download/driver/printer_driver_adapter.zip -OutFile printer_driver_adapter.zip
Invoke-WebRequest -Uri https://github.com/rustdesk/hbb_common/releases/download/driver/sha256sums -OutFile sha256sums
# Check and move the files
$checksum_driver = (Select-String -Path .\sha256sums -Pattern '^([a-fA-F0-9]{64}) \*rustdesk_printer_driver_v4-1.4\.zip$').Matches.Groups[1].Value
$downloadsum_driver = Get-FileHash -Path rustdesk_printer_driver_v4-1.4.zip -Algorithm SHA256
$checksum_adapter = (Select-String -Path .\sha256sums -Pattern '^([a-fA-F0-9]{64}) \*printer_driver_adapter\.zip$').Matches.Groups[1].Value
$downloadsum_adapter = Get-FileHash -Path printer_driver_adapter.zip -Algorithm SHA256
if ($checksum_driver -eq $downloadsum_driver.Hash -and $checksum_adapter -eq $downloadsum_adapter.Hash) {
Write-Output "rustdesk_printer_driver_v4-1.4, checksums match, extract the file."
Expand-Archive rustdesk_printer_driver_v4-1.4.zip -DestinationPath .
mkdir ./rustdesk/drivers
mv -Force .\rustdesk_printer_driver_v4-1.4 ./rustdesk/drivers/RustDeskPrinterDriver
Expand-Archive printer_driver_adapter.zip -DestinationPath .
mv -Force .\printer_driver_adapter.dll ./rustdesk
} elseif ($checksum_driver -ne $downloadsum_driver.Hash) {
Write-Output "rustdesk_printer_driver_v4-1.4, checksums do not match, ignore the file."
} else {
Write-Output "printer_driver_adapter.dll, checksums do not match, ignore the file."
}
} catch {
Write-Host "Ingore the printer driver error."
}
- name: find Runner.res
# Windows: find Runner.res (compiled from ./flutter/windows/runner/Runner.rc), copy to ./Runner.res
# Runner.rc does not contain actual version, but Runner.res does
continue-on-error: true
shell: bash
run: |
runner_res=$(find . -name "Runner.res");
if [ "$runner_res" == "" ]; then
echo "Runner.res: not found";
else
echo "Runner.res: $runner_res";
cp $runner_res ./libs/portable/Runner.res;
echo "list ./libs/portable/Runner.res";
ls -l ./libs/portable/Runner.res;
fi
- name: Download RustDeskTempTopMostWindow artifacts
uses: actions/download-artifact@master
if: ${{ inputs.upload-artifact }}
with:
name: topmostwindow-artifacts
path: "./rustdesk"
- name: Upload unsigned
if: env.UPLOAD_ARTIFACT == 'true'
uses: actions/upload-artifact@master
with:
name: rustdesk-unsigned-windows-${{ matrix.job.arch }}
path: rustdesk
- name: Sign rustdesk files
if: env.UPLOAD_ARTIFACT == 'true' && env.SIGN_BASE_URL != '-2'
shell: bash
run: |
pip3 install requests argparse
BASE_URL=${{ env.SIGN_BASE_URL }} SECRET_KEY=${{ secrets.SIGN_SECRET_KEY }} python3 res/job.py sign_files ./rustdesk/
- name: Build self-extracted executable
shell: bash
if: env.UPLOAD_ARTIFACT == 'true'
run: |
sed -i '/dpiAware/d' res/manifest.xml
pushd ./libs/portable
pip3 install -r requirements.txt
python3 ./generate.py -f ../../rustdesk/ -o . -e ../../rustdesk/rustdesk.exe
popd
mkdir -p ./SignOutput
mv ./target/release/rustdesk-portable-packer.exe ./SignOutput/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.exe
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v2
- name: Build msi
if: env.UPLOAD_ARTIFACT == 'true'
run: |
pushd ./res/msi
python preprocess.py --arp -d ../../rustdesk
nuget restore msi.sln
msbuild msi.sln -p:Configuration=Release -p:Platform=x64 /p:TargetVersion=Windows10
mv ./Package/bin/x64/Release/en-us/Package.msi ../../SignOutput/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.msi
sha256sum ../../SignOutput/rustdesk-*.msi
- name: Sign rustdesk self-extracted file
if: env.UPLOAD_ARTIFACT == 'true' && env.SIGN_BASE_URL != '-2'
shell: bash
run: |
BASE_URL=${{ env.SIGN_BASE_URL }} SECRET_KEY=${{ secrets.SIGN_SECRET_KEY }} python3 res/job.py sign_files ./SignOutput
- name: Publish Release
uses: softprops/action-gh-release@v1
if: env.UPLOAD_ARTIFACT == 'true'
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
./SignOutput/rustdesk-*.msi
./SignOutput/rustdesk-*.exe
# The fallback for the flutter version, we use Sciter for 32bit Windows.
build-for-windows-sciter:
name: ${{ matrix.job.target }} (${{ matrix.job.os }})
runs-on: ${{ matrix.job.os }}
# Temporarily disable this action due to additional test is needed.
# if: false
strategy:
fail-fast: false
matrix:
job:
# - { target: i686-pc-windows-msvc , os: windows-2022 }
# - { target: x86_64-pc-windows-gnu , os: windows-2022 }
- {
target: i686-pc-windows-msvc,
os: windows-2022,
arch: x86,
vcpkg-triplet: x86-windows-static,
}
# - { target: aarch64-pc-windows-msvc, os: windows-2022 }
steps:
- name: Export GitHub Actions cache environment variables
uses: actions/github-script@v6
with:
script: |
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
- name: Checkout source code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Install LLVM and Clang
uses: rustdesk-org/install-llvm-action-32bit@master
with:
version: ${{ env.LLVM_VERSION }}
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@v1
with:
toolchain: nightly-2023-10-13-${{ matrix.job.target }} # must use nightly here, because of abi_thiscall feature required
targets: ${{ matrix.job.target }}
components: "rustfmt"
- uses: Swatinem/rust-cache@v2
with:
prefix-key: ${{ matrix.job.os }}-sciter
- name: Setup vcpkg with Github Actions binary cache
uses: lukka/run-vcpkg@v11
with:
vcpkgDirectory: C:\vcpkg
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
doNotCache: false
- name: Install vcpkg dependencies
env:
VCPKG_DEFAULT_HOST_TRIPLET: ${{ matrix.job.vcpkg-triplet }}
run: |
if ! $VCPKG_ROOT/vcpkg \
install \
--triplet ${{ matrix.job.vcpkg-triplet }} \
--x-install-root="$VCPKG_ROOT/installed"; then
find "${VCPKG_ROOT}/" -name "*.log" | while read -r _1; do
echo "$_1:"
echo "======"
cat "$_1"
echo "======"
echo ""
done
exit 1
fi
head -n 100 "${VCPKG_ROOT}/buildtrees/ffmpeg/build-${{ matrix.job.vcpkg-triplet }}-rel-out.log" || true
shell: bash
- name: Build rustdesk
id: build
shell: bash
run: |
python3 res/inline-sciter.py
# Patch sciter x86
sed -i 's/branch = "dyn"/branch = "dyn_x86"/g' ./Cargo.toml
cargo build --features inline,vram,hwcodec --release --bins
mkdir -p ./Release
mv ./target/release/rustdesk.exe ./Release/rustdesk.exe
curl -LJ -o ./Release/sciter.dll https://github.com/c-smile/sciter-sdk/raw/master/bin.win/x32/sciter.dll
echo "output_folder=./Release" >> $GITHUB_OUTPUT
curl -LJ -o ./usbmmidd_v2.zip https://github.com/rustdesk-org/rdev/releases/download/usbmmidd_v2/usbmmidd_v2.zip
unzip usbmmidd_v2.zip
# Do not remove x64 files, because the user may run the 32bit version on a 64bit system.
# Do not remove ./usbmmidd_v2/deviceinstaller64.exe, as x86 exe cannot install and uninstall drivers when running on x64,
# we need the x64 exe to install and uninstall the driver.
rm -rf ./usbmmidd_v2/deviceinstaller.exe ./usbmmidd_v2/usbmmidd.bat
mv ./usbmmidd_v2 ./Release || true
- name: find Runner.res
# Windows: find Runner.res (compiled from ./flutter/windows/runner/Runner.rc), copy to ./Runner.res
# Runner.rc does not contain actual version, but Runner.res does
continue-on-error: true
shell: bash
run: |
runner_res=$(find . -name "Runner.res");
if [ "$runner_res" == "" ]; then
echo "Runner.res: not found";
else
echo "Runner.res: $runner_res";
cp $runner_res ./libs/portable/Runner.res;
echo "list ./libs/portable/Runner.res";
ls -l ./libs/portable/Runner.res;
fi
- name: Upload unsigned
if: env.UPLOAD_ARTIFACT == 'true'
uses: actions/upload-artifact@master
with:
name: rustdesk-unsigned-windows-${{ matrix.job.arch }}
path: Release
- name: Sign rustdesk files
if: env.UPLOAD_ARTIFACT == 'true' && env.SIGN_BASE_URL != '-2'
shell: bash
run: |
pip3 install requests argparse
BASE_URL=${{ env.SIGN_BASE_URL }} SECRET_KEY=${{ secrets.SIGN_SECRET_KEY }} python3 res/job.py sign_files ./Release/
- name: Build self-extracted executable
shell: bash
run: |
sed -i '/dpiAware/d' res/manifest.xml
pushd ./libs/portable
pip3 install -r requirements.txt
python3 ./generate.py -f ../../Release/ -o . -e ../../Release/rustdesk.exe
popd
mkdir -p ./SignOutput
mv ./target/release/rustdesk-portable-packer.exe ./SignOutput/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.exe
- name: Sign rustdesk self-extracted file
if: env.UPLOAD_ARTIFACT == 'true' && env.SIGN_BASE_URL != '-2'
shell: bash
run: |
BASE_URL=${{ env.SIGN_BASE_URL }} SECRET_KEY=${{ secrets.SIGN_SECRET_KEY }} python3 res/job.py sign_files ./SignOutput/
- name: Publish Release
uses: softprops/action-gh-release@v1
if: env.UPLOAD_ARTIFACT == 'true'
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
./SignOutput/rustdesk-*.exe
build-rustdesk-ios:
if: ${{ inputs.upload-artifact }}
name: build rustdesk ios ipa
runs-on: ${{ matrix.job.os }}
needs: [generate-bridge]
strategy:
fail-fast: false
matrix:
job:
- {
arch: aarch64,
target: aarch64-apple-ios,
os: macos-latest,
vcpkg-triplet: arm64-ios,
}
steps:
- name: Export GitHub Actions cache environment variables
uses: actions/github-script@v6
with:
script: |
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
- name: Install dependencies
run: |
brew install nasm yasm
- name: Checkout source code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Install flutter
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: ${{ env.FLUTTER_VERSION }}
- name: Patch flutter
run: |
cd $(dirname $(dirname $(which flutter)))
[[ "3.24.5" == ${{env.FLUTTER_VERSION}} ]] && git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff
- name: Setup vcpkg with Github Actions binary cache
uses: lukka/run-vcpkg@v11
with:
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
doNotCache: false
- name: Install vcpkg dependencies
run: |
if ! $VCPKG_ROOT/vcpkg \
install \
--triplet ${{ matrix.job.vcpkg-triplet }} \
--x-install-root="$VCPKG_ROOT/installed"; then
find "${VCPKG_ROOT}/" -name "*.log" | while read -r _1; do
echo "$_1:"
echo "======"
cat "$_1"
echo "======"
echo ""
done
exit 1
fi
head -n 100 "${VCPKG_ROOT}/buildtrees/ffmpeg/build-${{ matrix.job.vcpkg-triplet }}-rel-out.log" || true
shell: bash
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ env.RUST_VERSION }}
targets: ${{ matrix.job.target }}
components: "rustfmt"
- uses: Swatinem/rust-cache@v2
with:
prefix-key: rustdesk-lib-cache-ios
key: ${{ matrix.job.target }}
- name: Restore bridge files
uses: actions/download-artifact@master
with:
name: bridge-artifact
path: ./
- name: Build rustdesk lib
run: |
rustup target add ${{ matrix.job.target }}
cargo build --features flutter,hwcodec --release --target aarch64-apple-ios --lib
- name: Upload liblibrustdesk.a Artifacts
uses: actions/upload-artifact@master
with:
name: liblibrustdesk.a
path: target/aarch64-apple-ios/release/liblibrustdesk.a
- name: Build rustdesk
shell: bash
run: |
pushd flutter
# flutter build ipa --release --obfuscate --split-debug-info=./split-debug-info --no-codesign
# for easy debugging
flutter build ipa --release --no-codesign
# - name: Upload Artifacts
# # if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true'
# uses: actions/upload-artifact@master
# with:
# name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk
# path: flutter/build/ios/ipa/*.ipa
# - name: Publish ipa package
# # if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true'
# uses: softprops/action-gh-release@v1
# with:
# prerelease: true
# tag_name: ${{ env.TAG_NAME }}
# files: |
# flutter/build/ios/ipa/*.ipa
build-for-macOS:
name: ${{ matrix.job.target }}
runs-on: ${{ matrix.job.os }}
needs: [generate-bridge]
strategy:
fail-fast: false
matrix:
job:
- {
target: x86_64-apple-darwin,
os: macos-15-intel, #macos-latest or macos-14 use M1 now, https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#:~:text=14%20GB-,macos%2Dlatest%20or%20macos%2D14,-The%20macos%2Dlatestlabel
extra-build-args: "",
arch: x86_64,
vcpkg-triplet: x64-osx,
}
- {
target: aarch64-apple-darwin,
os: macos-14,
# extra-build-args: "--disable-flutter-texture-render", # disable this for mac, because we see a lot of users reporting flickering both on arm and x64, and we can not confirm if texture rendering has better performance if htere is no vram, https://github.com/rustdesk/rustdesk/issues/6296
extra-build-args: "--screencapturekit",
arch: aarch64,
vcpkg-triplet: arm64-osx,
}
steps:
- name: Export GitHub Actions cache environment variables
uses: actions/github-script@v6
with:
script: |
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
- name: Checkout source code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Import the codesign cert
if: env.MACOS_P12_BASE64 != null
uses: apple-actions/import-codesign-certs@v1
with:
p12-file-base64: ${{ secrets.MACOS_P12_BASE64 }}
p12-password: ${{ secrets.MACOS_P12_PASSWORD }}
keychain: rustdesk
- name: Check sign and import sign key
if: env.MACOS_P12_BASE64 != null
run: |
security default-keychain -s rustdesk.keychain
security find-identity -v
- name: Import notarize key
if: env.MACOS_P12_BASE64 != null
uses: timheuer/base64-to-file@v1.2
with:
# https://gregoryszorc.com/docs/apple-codesign/stable/apple_codesign_rcodesign.html#notarizing-and-stapling
fileName: rustdesk.json
fileDir: ${{ github.workspace }}
encodedString: ${{ secrets.MACOS_NOTARIZE_JSON }}
- name: Install rcodesign tool
if: env.MACOS_P12_BASE64 != null
shell: bash
run: |
pushd /tmp
wget https://github.com/indygreg/apple-platform-rs/releases/download/apple-codesign%2F0.22.0/apple-codesign-0.22.0-macos-universal.tar.gz
tar -zxvf apple-codesign-0.22.0-macos-universal.tar.gz
mv apple-codesign-0.22.0-macos-universal/rcodesign /usr/local/bin
popd
- name: Install build runtime
run: |
brew install llvm create-dmg
# pkg-config is handled in a separate step, because it may be already installed by `macos-latest`(14.7.1) runner
if command -v pkg-config &>/dev/null; then
echo "pkg-config is already installed"
else
brew install pkg-config
fi
- name: Install NASM
run: |
# Install NASM 2.16.x from official release.
# Do NOT use `brew install nasm` which installs NASM 3.x.
# NASM 3.x is a complete rewrite with incompatible CLI options and removed features.
# aom and other multimedia libraries require NASM 2.x for x86/x86_64 assembly.
wget https://www.nasm.us/pub/nasm/releasebuilds/2.16.03/macosx/nasm-2.16.03-macosx.zip
unzip nasm-2.16.03-macosx.zip
sudo cp nasm-2.16.03/nasm /usr/local/bin/nasm
nasm --version
- name: Install flutter
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: ${{ env.FLUTTER_VERSION }}
- name: Patch flutter
run: |
cd $(dirname $(dirname $(which flutter)))
[[ "3.24.5" == ${{env.FLUTTER_VERSION}} ]] && git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff
- name: Workaround for flutter issue
shell: bash
run: |
cd "$(dirname "$(which flutter)")"
# https://github.com/flutter/flutter/issues/133533
sed -i -e 's/_setFramesEnabledState(false);/\/\/_setFramesEnabledState(false);/g' ../packages/flutter/lib/src/scheduler/binding.dart
grep -n '_setFramesEnabledState(false);' ../packages/flutter/lib/src/scheduler/binding.dart
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ env.MAC_RUST_VERSION }}
targets: ${{ matrix.job.target }}
components: "rustfmt"
- uses: Swatinem/rust-cache@v2
with:
prefix-key: ${{ matrix.job.os }}
- name: Restore bridge files
uses: actions/download-artifact@master
with:
name: bridge-artifact
path: ./
- name: Setup vcpkg with Github Actions binary cache
uses: lukka/run-vcpkg@v11
with:
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
doNotCache: false
- name: Install vcpkg dependencies
run: |
if ! $VCPKG_ROOT/vcpkg \
install \
--x-install-root="$VCPKG_ROOT/installed"; then
find "${VCPKG_ROOT}/" -name "*.log" | while read -r _1; do
echo "$_1:"
echo "======"
cat "$_1"
echo "======"
echo ""
done
exit 1
fi
head -n 100 "${VCPKG_ROOT}/buildtrees/ffmpeg/build-${{ matrix.job.vcpkg-triplet }}-rel-out.log" || true
- name: Show version information (Rust, cargo, Clang)
shell: bash
run: |
clang --version || true
rustup -V
rustup toolchain list
rustup default
cargo -V
rustc -V
- name: Build rustdesk
run: |
if [ "${{ matrix.job.target }}" = "aarch64-apple-darwin" ]; then
MIN_MACOS_VERSION="12.3"
sed -i -e "s/MACOSX_DEPLOYMENT_TARGET\=[0-9]*.[0-9]*/MACOSX_DEPLOYMENT_TARGET=${MIN_MACOS_VERSION}/" build.py
sed -i -e "s/platform :osx, '.*'/platform :osx, '${MIN_MACOS_VERSION}'/" flutter/macos/Podfile
sed -i -e "s/osx_minimum_system_version = \"[0-9]*.[0-9]*\"/osx_minimum_system_version = \"${MIN_MACOS_VERSION}\"/" Cargo.toml
sed -i -e "s/MACOSX_DEPLOYMENT_TARGET = [0-9]*.[0-9]*;/MACOSX_DEPLOYMENT_TARGET = ${MIN_MACOS_VERSION};/" flutter/macos/Runner.xcodeproj/project.pbxproj
fi
./build.py --flutter --hwcodec --unix-file-copy-paste ${{ matrix.job.extra-build-args }}
- name: create unsigned dmg
if: env.UPLOAD_ARTIFACT == 'true'
run: |
CREATE_DMG="$(command -v create-dmg)"
CREATE_DMG="$(readlink -f "$CREATE_DMG")"
sed -i -e 's/MAXIMUM_UNMOUNTING_ATTEMPTS=3/MAXIMUM_UNMOUNTING_ATTEMPTS=7/' "$CREATE_DMG"
create-dmg --icon "RustDesk.app" 200 190 --hide-extension "RustDesk.app" --window-size 800 400 --app-drop-link 600 185 rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.dmg ./flutter/build/macos/Build/Products/Release/RustDesk.app
- name: Upload unsigned macOS app
if: env.UPLOAD_ARTIFACT == 'true'
uses: actions/upload-artifact@master
with:
name: rustdesk-unsigned-macos-${{ matrix.job.arch }}
path: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.dmg # can not upload the directory directly or tar.gz, which destroy the link structure, causing the codesign failed
- name: Codesign app and create signed dmg
if: env.MACOS_P12_BASE64 != null && env.UPLOAD_ARTIFACT == 'true'
run: |
# Patch create-dmg to give more attempts to unmount image
CREATE_DMG="$(command -v create-dmg)"
CREATE_DMG="$(readlink -f "$CREATE_DMG")"
sed -i -e 's/MAXIMUM_UNMOUNTING_ATTEMPTS=3/MAXIMUM_UNMOUNTING_ATTEMPTS=7/' "$CREATE_DMG"
# Unlock keychain
security default-keychain -s rustdesk.keychain
security unlock-keychain -p ${{ secrets.MACOS_P12_PASSWORD }} rustdesk.keychain
# start sign the rustdesk.app and dmg
rm -rf *.dmg || true
codesign --force --options runtime -s ${{ secrets.MACOS_CODESIGN_IDENTITY }} --deep --strict ./flutter/build/macos/Build/Products/Release/RustDesk.app -vvv
create-dmg --icon "RustDesk.app" 200 190 --hide-extension "RustDesk.app" --window-size 800 400 --app-drop-link 600 185 rustdesk-${{ env.VERSION }}.dmg ./flutter/build/macos/Build/Products/Release/RustDesk.app
codesign --force --options runtime -s ${{ secrets.MACOS_CODESIGN_IDENTITY }} --deep --strict rustdesk-${{ env.VERSION }}.dmg -vvv
# notarize the rustdesk-${{ env.VERSION }}.dmg
rcodesign notary-submit --api-key-path ${{ github.workspace }}/rustdesk.json --staple rustdesk-${{ env.VERSION }}.dmg
- name: Rename rustdesk
if: env.UPLOAD_ARTIFACT == 'true'
run: |
for name in rustdesk*??.dmg; do
mv "$name" "${name%%.dmg}-${{ matrix.job.arch }}.dmg"
done
- name: Publish DMG package
if: env.UPLOAD_ARTIFACT == 'true'
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
rustdesk*-${{ matrix.job.arch }}.dmg
publish_unsigned:
needs:
- build-for-macOS
- build-for-windows-flutter
- build-for-windows-sciter
runs-on: ubuntu-latest
if: ${{ inputs.upload-artifact }}
steps:
- name: Download artifacts
uses: actions/download-artifact@master
with:
name: rustdesk-unsigned-macos-x86_64
path: ./
- name: Download Artifacts
uses: actions/download-artifact@master
with:
name: rustdesk-unsigned-macos-aarch64
path: ./
- name: Download Artifacts
uses: actions/download-artifact@master
with:
name: rustdesk-unsigned-windows-x86_64
path: ./windows-x86_64/
- name: Download Artifacts
uses: actions/download-artifact@master
with:
name: rustdesk-unsigned-windows-x86
path: ./windows-x86/
- name: Combine unsigned app
run: |
tar czf rustdesk-${{ env.VERSION }}-unsigned.tar.gz *.dmg windows-x86_64 windows-x86
- name: Publish unsigned app
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: rustdesk-${{ env.VERSION }}-unsigned.tar.gz
build-rustdesk-android:
needs: [generate-bridge]
name: build rustdesk android apk ${{ matrix.job.target }}
runs-on: ${{ matrix.job.os }}
strategy:
fail-fast: false
matrix:
job:
- {
arch: aarch64,
target: aarch64-linux-android,
os: ubuntu-24.04,
reltype: release,
suffix: "",
}
- {
arch: armv7,
target: armv7-linux-androideabi,
os: ubuntu-24.04,
reltype: release,
suffix: "",
}
- {
arch: x86_64,
target: x86_64-linux-android,
os: ubuntu-24.04,
reltype: release,
suffix: "",
}
steps:
- name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: false
dotnet: true
haskell: true
large-packages: false
docker-images: true
swap-storage: false
- name: Export GitHub Actions cache environment variables
uses: actions/github-script@v6
with:
script: |
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
clang \
cmake \
curl \
gcc-multilib \
git \
g++ \
g++-multilib \
libayatana-appindicator3-dev \
libasound2-dev \
libc6-dev \
libclang-dev \
libunwind-dev \
libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev \
libgtk-3-dev \
libpam0g-dev \
libpulse-dev \
libva-dev \
libxcb-randr0-dev \
libxcb-shape0-dev \
libxcb-xfixes0-dev \
libxdo-dev \
libxfixes-dev \
llvm-dev \
nasm \
ninja-build \
openjdk-17-jdk-headless \
pkg-config \
tree \
wget
- name: Checkout source code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Install flutter
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: ${{ env.ANDROID_FLUTTER_VERSION }}
- name: Patch flutter
run: |
cd $(dirname $(dirname $(which flutter)))
[[ "3.24.5" == ${{env.ANDROID_FLUTTER_VERSION}} ]] && git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff
- uses: nttld/setup-ndk@v1
id: setup-ndk
with:
ndk-version: ${{ env.NDK_VERSION }}
add-to-path: true
- name: Setup vcpkg with Github Actions binary cache
uses: lukka/run-vcpkg@v11
with:
vcpkgDirectory: /opt/artifacts/vcpkg
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
doNotCache: false
- name: Install vcpkg dependencies
run: |
case ${{ matrix.job.target }} in
aarch64-linux-android)
ANDROID_TARGET=arm64-v8a
;;
armv7-linux-androideabi)
ANDROID_TARGET=armeabi-v7a
;;
x86_64-linux-android)
ANDROID_TARGET=x86_64
;;
i686-linux-android)
ANDROID_TARGET=x86
;;
esac
if ! ./flutter/build_android_deps.sh "${ANDROID_TARGET}"; then
find "${VCPKG_ROOT}/" -name "*.log" | while read -r _1; do
echo "$_1:"
echo "======"
cat "$_1"
echo "======"
echo ""
done
exit 1
fi
shell: bash
- name: Restore bridge files
uses: actions/download-artifact@master
with:
name: bridge-artifact
path: ./
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ env.RUST_VERSION }}
components: "rustfmt"
- uses: Swatinem/rust-cache@v2
with:
prefix-key: rustdesk-lib-cache-android # TODO: drop '-android' part after caches are invalidated
key: ${{ matrix.job.target }}
- name: Build rustdesk lib
env:
ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}
ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }}
run: |
rustup target add ${{ matrix.job.target }}
cargo install cargo-ndk --version ${{ env.CARGO_NDK_VERSION }} --locked
case ${{ matrix.job.target }} in
aarch64-linux-android)
./flutter/ndk_arm64.sh
mkdir -p ./flutter/android/app/src/main/jniLibs/arm64-v8a
cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/librustdesk.so
;;
armv7-linux-androideabi)
./flutter/ndk_arm.sh
mkdir -p ./flutter/android/app/src/main/jniLibs/armeabi-v7a
cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/librustdesk.so
;;
x86_64-linux-android)
./flutter/ndk_x64.sh
mkdir -p ./flutter/android/app/src/main/jniLibs/x86_64
cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86_64/librustdesk.so
;;
i686-linux-android)
./flutter/ndk_x86.sh
mkdir -p ./flutter/android/app/src/main/jniLibs/x86
cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86/librustdesk.so
;;
esac
- name: Upload Rustdesk library to Artifacts
uses: actions/upload-artifact@master
with:
name: librustdesk.so.${{ matrix.job.target }}
path: ./target/${{ matrix.job.target }}/release/liblibrustdesk.so
- name: Build rustdesk
shell: bash
env:
JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
run: |
export PATH=/usr/lib/jvm/java-17-openjdk-amd64/bin:$PATH
# Increase Gradle JVM memory for CI builds
sed -i "s/org.gradle.jvmargs=-Xmx1024M/org.gradle.jvmargs=-Xmx2g/g" ./flutter/android/gradle.properties
# temporary use debug sign config
sed -i "s/signingConfigs.release/signingConfigs.debug/g" ./flutter/android/app/build.gradle
case ${{ matrix.job.target }} in
aarch64-linux-android)
mkdir -p ./flutter/android/app/src/main/jniLibs/arm64-v8a
cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/
cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/librustdesk.so
# build flutter
pushd flutter
flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-arm64 --split-per-abi
mv build/app/outputs/flutter-apk/app-arm64-v8a-${{ matrix.job.reltype }}.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk
;;
armv7-linux-androideabi)
mkdir -p ./flutter/android/app/src/main/jniLibs/armeabi-v7a
cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/
cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/librustdesk.so
# build flutter
pushd flutter
flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-arm --split-per-abi
mv build/app/outputs/flutter-apk/app-armeabi-v7a-${{ matrix.job.reltype }}.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk
;;
x86_64-linux-android)
mkdir -p ./flutter/android/app/src/main/jniLibs/x86_64
cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/x86_64/
cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86_64/librustdesk.so
# build flutter
pushd flutter
flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-x64 --split-per-abi
mv build/app/outputs/flutter-apk/app-x86_64-${{ matrix.job.reltype }}.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk
;;
i686-linux-android)
mkdir -p ./flutter/android/app/src/main/jniLibs/x86
cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/x86/
cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86/librustdesk.so
# build flutter
pushd flutter
flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-x86 --split-per-abi
mv build/app/outputs/flutter-apk/app-x86-${{ matrix.job.reltype }}.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk
;;
esac
popd
mkdir -p signed-apk; pushd signed-apk
mv ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk .
# https://github.com/r0adkll/sign-android-release/issues/84#issuecomment-1889636075
- name: Setup sign tool version variable
shell: bash
run: |
BUILD_TOOL_VERSION=$(ls /usr/local/lib/android/sdk/build-tools/ | tail -n 1)
echo "ANDROID_SIGN_TOOL_VERSION=$BUILD_TOOL_VERSION" >> $GITHUB_ENV
echo Last build tool version is: $BUILD_TOOL_VERSION
- uses: r0adkll/sign-android-release@v1
name: Sign app APK
if: env.ANDROID_SIGNING_KEY != null
id: sign-rustdesk
with:
releaseDirectory: ./signed-apk
signingKeyBase64: ${{ secrets.ANDROID_SIGNING_KEY }}
alias: ${{ secrets.ANDROID_ALIAS }}
keyStorePassword: ${{ secrets.ANDROID_KEY_STORE_PASSWORD }}
keyPassword: ${{ secrets.ANDROID_KEY_PASSWORD }}
env:
# env.ANDROID_SIGN_TOOL_VERSION is set by Step "Setup sign tool version variable"
BUILD_TOOLS_VERSION: ${{ env.ANDROID_SIGN_TOOL_VERSION }}
- name: Upload Artifacts
if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true'
uses: actions/upload-artifact@master
with:
name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk
path: ${{steps.sign-rustdesk.outputs.signedReleaseFile}}
- name: Publish signed apk package
if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true'
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
${{steps.sign-rustdesk.outputs.signedReleaseFile}}
- name: Publish unsigned apk package
if: env.ANDROID_SIGNING_KEY == null && env.UPLOAD_ARTIFACT == 'true'
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
signed-apk/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk
build-rustdesk-android-universal:
needs: [build-rustdesk-android]
name: build rustdesk android universal apk
if: ${{ inputs.upload-artifact }}
runs-on: ubuntu-24.04
env:
reltype: release
x86_target: "" # can be ",android-x86"
suffix: ""
steps:
- name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: false
dotnet: true
haskell: true
large-packages: false
docker-images: true
swap-storage: false
- name: Export GitHub Actions cache environment variables
uses: actions/github-script@v6
with:
script: |
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
clang \
cmake \
curl \
gcc-multilib \
git \
g++ \
g++-multilib \
libayatana-appindicator3-dev \
libasound2-dev \
libc6-dev \
libclang-dev \
libunwind-dev \
libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev \
libgtk-3-dev \
libpam0g-dev \
libpulse-dev \
libva-dev \
libxcb-randr0-dev \
libxcb-shape0-dev \
libxcb-xfixes0-dev \
libxdo-dev \
libxfixes-dev \
llvm-dev \
nasm \
ninja-build \
openjdk-17-jdk-headless \
pkg-config \
tree \
wget
- name: Checkout source code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Install flutter
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: ${{ env.ANDROID_FLUTTER_VERSION }}
- name: Patch flutter
run: |
cd $(dirname $(dirname $(which flutter)))
[[ "3.24.5" == ${{env.ANDROID_FLUTTER_VERSION}} ]] && git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff
- name: Restore bridge files
uses: actions/download-artifact@master
with:
name: bridge-artifact
path: ./
- name: Download Rustdesk library from Artifacts
uses: actions/download-artifact@master
with:
name: librustdesk.so.aarch64-linux-android
path: ./flutter/android/app/src/main/jniLibs/arm64-v8a
- name: Download Rustdesk library from Artifacts
uses: actions/download-artifact@master
with:
name: librustdesk.so.armv7-linux-androideabi
path: ./flutter/android/app/src/main/jniLibs/armeabi-v7a
- name: Download Rustdesk library from Artifacts
uses: actions/download-artifact@master
with:
name: librustdesk.so.x86_64-linux-android
path: ./flutter/android/app/src/main/jniLibs/x86_64
- name: Download Rustdesk library from Artifacts
if: ${{ env.reltype == 'debug' }}
uses: actions/download-artifact@master
with:
name: librustdesk.so.i686-linux-android
path: ./flutter/android/app/src/main/jniLibs/x86
- name: Build rustdesk
shell: bash
env:
JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
run: |
export PATH=/usr/lib/jvm/java-17-openjdk-amd64/bin:$PATH
# Increase Gradle JVM memory for CI builds
sed -i "s/org.gradle.jvmargs=-Xmx1024M/org.gradle.jvmargs=-Xmx2g/g" ./flutter/android/gradle.properties
# temporary use debug sign config
sed -i "s/signingConfigs.release/signingConfigs.debug/g" ./flutter/android/app/build.gradle
mv ./flutter/android/app/src/main/jniLibs/arm64-v8a/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/librustdesk.so
cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/
mv ./flutter/android/app/src/main/jniLibs/armeabi-v7a/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/librustdesk.so
cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/
mv ./flutter/android/app/src/main/jniLibs/x86_64/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86_64/librustdesk.so
cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/x86_64/
if [ "${{ env.reltype }}" = "debug" ]; then
mv ./flutter/android/app/src/main/jniLibs/x86/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86/librustdesk.so
cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/x86/
fi
# build flutter
pushd flutter
flutter build apk "--${{ env.reltype }}" --target-platform android-arm64,android-arm,android-x64${{ env.x86_target }}
popd
mkdir -p signed-apk
mv ./flutter/build/app/outputs/flutter-apk/app-${{ env.reltype }}.apk signed-apk/rustdesk-${{ env.VERSION }}-universal${{ env.suffix }}.apk
# https://github.com/r0adkll/sign-android-release/issues/84#issuecomment-1889636075
- name: Setup sign tool version variable
shell: bash
run: |
BUILD_TOOL_VERSION=$(ls /usr/local/lib/android/sdk/build-tools/ | tail -n 1)
echo "ANDROID_SIGN_TOOL_VERSION=$BUILD_TOOL_VERSION" >> $GITHUB_ENV
echo Last build tool version is: $BUILD_TOOL_VERSION
- uses: r0adkll/sign-android-release@v1
name: Sign app APK
if: env.ANDROID_SIGNING_KEY != null
id: sign-rustdesk
with:
releaseDirectory: ./signed-apk
signingKeyBase64: ${{ secrets.ANDROID_SIGNING_KEY }}
alias: ${{ secrets.ANDROID_ALIAS }}
keyStorePassword: ${{ secrets.ANDROID_KEY_STORE_PASSWORD }}
keyPassword: ${{ secrets.ANDROID_KEY_PASSWORD }}
env:
# env.ANDROID_SIGN_TOOL_VERSION is set by Step "Setup sign tool version variable"
BUILD_TOOLS_VERSION: ${{ env.ANDROID_SIGN_TOOL_VERSION }}
- name: Upload Artifacts
if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true'
uses: actions/upload-artifact@master
with:
name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk
path: ${{steps.sign-rustdesk.outputs.signedReleaseFile}}
- name: Publish signed apk package
if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true'
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
${{steps.sign-rustdesk.outputs.signedReleaseFile}}
- name: Publish unsigned apk package
if: env.ANDROID_SIGNING_KEY == null && env.UPLOAD_ARTIFACT == 'true'
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
signed-apk/rustdesk-${{ env.VERSION }}-universal${{ env.suffix }}.apk
build-rustdesk-linux:
needs: [generate-bridge]
name: build rustdesk linux ${{ matrix.job.target }}
runs-on: ${{ matrix.job.on }}
strategy:
fail-fast: false
matrix:
# use a high level qemu-user-static
job:
- {
arch: x86_64,
target: x86_64-unknown-linux-gnu,
distro: ubuntu18.04,
on: ubuntu-22.04,
deb_arch: amd64,
vcpkg-triplet: x64-linux,
}
- {
arch: aarch64,
target: aarch64-unknown-linux-gnu,
distro: ubuntu18.04,
on: ubuntu-22.04-arm,
deb_arch: arm64,
vcpkg-triplet: arm64-linux,
}
steps:
- name: Export GitHub Actions cache environment variables
uses: actions/github-script@v6
with:
script: |
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
- name: Maximize build space
run: |
sudo rm -rf /opt/ghc
sudo rm -rf /usr/local/lib/android
sudo rm -rf /usr/share/dotnet
sudo apt-get update -y
sudo apt-get install -y nasm
if [[ "${{ matrix.job.arch }}" == "x86_64" ]]; then
sudo apt-get install -y qemu-user-static
fi
- name: Checkout source code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Set Swap Space
if: ${{ matrix.job.arch == 'x86_64' }}
uses: pierotofy/set-swap-space@master
with:
swap-size-gb: 12
- name: Free Space
run: |
df -h
free -m
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@v1
if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true'
with:
toolchain: ${{ env.RUST_VERSION }}
targets: ${{ matrix.job.target }}
components: "rustfmt"
- name: Save Rust toolchain version
run: |
RUST_TOOLCHAIN_VERSION=$(cargo --version | awk '{print $2}')
echo "RUST_TOOLCHAIN_VERSION=$RUST_TOOLCHAIN_VERSION" >> $GITHUB_ENV
- name: Disable rust bridge build
run: |
# only build cdylib
sed -i "s/\[\"cdylib\", \"staticlib\", \"rlib\"\]/\[\"cdylib\"\]/g" Cargo.toml
- name: Restore bridge files
if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true'
uses: actions/download-artifact@master
with:
name: bridge-artifact
path: ./
- name: Setup vcpkg with Github Actions binary cache
if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true'
uses: lukka/run-vcpkg@v11
with:
vcpkgDirectory: /opt/artifacts/vcpkg
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
doNotCache: false
- name: Install vcpkg dependencies
if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true'
run: |
sudo apt install -y libva-dev && apt show libva-dev
if ! $VCPKG_ROOT/vcpkg \
install \
--triplet ${{ matrix.job.vcpkg-triplet }} \
--x-install-root="$VCPKG_ROOT/installed"; then
find "${VCPKG_ROOT}/" -name "*.log" | while read -r _1; do
echo "$_1:"
echo "======"
cat "$_1"
echo "======"
echo ""
done
exit 1
fi
head -n 100 "${VCPKG_ROOT}/buildtrees/ffmpeg/build-${{ matrix.job.vcpkg-triplet }}-rel-out.log" || true
shell: bash
- name: Restore bridge files
if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true'
uses: actions/download-artifact@master
with:
name: bridge-artifact
path: ./
- uses: rustdesk-org/run-on-arch-action@amd64-support
name: Build rustdesk
id: vcpkg
if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true'
with:
arch: ${{ matrix.job.arch }}
distro: ${{ matrix.job.distro }}
githubToken: ${{ github.token }}
setup: |
ls -l "${PWD}"
ls -l /opt/artifacts/vcpkg/installed
dockerRunArgs: |
--volume "${PWD}:/workspace"
--volume "/opt/artifacts:/opt/artifacts"
shell: /bin/bash
install: |
apt-get update -y
echo -e "installing deps"
apt-get install -y \
build-essential \
clang \
cmake \
curl \
gcc \
git \
g++ \
libayatana-appindicator3-dev \
libasound2-dev \
libclang-10-dev \
libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev \
libgtk-3-dev \
libpam0g-dev \
libpulse-dev \
libva-dev \
libxcb-randr0-dev \
libxcb-shape0-dev \
libxcb-xfixes0-dev \
libxdo-dev \
libxfixes-dev \
llvm-10-dev \
nasm \
ninja-build \
pkg-config \
tree \
python3 \
rpm \
unzip \
wget \
xz-utils \
libssl-dev
# we have libopus compiled by us.
apt-get remove -y libopus-dev || true
# output devs
ls -l ./
tree -L 3 /opt/artifacts/vcpkg/installed
run: |
# disable git safe.directory
git config --global --add safe.directory "*"
# rust
pushd /opt
# do not use rustup, because memory overflow in qemu
wget -O rust.tar.gz https://static.rust-lang.org/dist/rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }}.tar.gz
tar -zxvf rust.tar.gz > /dev/null && rm rust.tar.gz
cd rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }} && ./install.sh
rm -rf rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }}
# edit config
mkdir -p ~/.cargo/
echo """
[source.crates-io]
registry = 'https://github.com/rust-lang/crates.io-index'
""" > ~/.cargo/config
cat ~/.cargo/config
# start build
pushd /workspace
export VCPKG_ROOT=/opt/artifacts/vcpkg
if [[ "${{ matrix.job.arch }}" == "aarch64" ]]; then
export JOBS="--jobs 3"
else
export JOBS=""
fi
echo $JOBS
cargo build --lib $JOBS --features hwcodec,flutter,unix-file-copy-paste --release
rm -rf target/release/deps target/release/build
rm -rf ~/.cargo
# Setup Flutter
# disable git safe.directory
git config --global --add safe.directory "*"
pushd /workspace
case ${{ matrix.job.arch }} in
aarch64)
export PATH=/opt/flutter-elinux/bin:$PATH
sed -i "s/flutter build linux --release/flutter-elinux build linux --verbose/g" ./build.py
sed -i "s/x64\/release/arm64\/release/g" ./build.py
;;
x86_64)
export PATH=/opt/flutter/bin:$PATH
;;
esac
popd
pushd /opt
wget https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${{ env.FLUTTER_VERSION }}-stable.tar.xz
tar xf flutter_linux_${{ env.FLUTTER_VERSION }}-stable.tar.xz
case ${{ matrix.job.arch }} in
aarch64)
# clone repo and reset to flutter ${{ env.FLUTTER_VERSION }}
git clone https://github.com/sony/flutter-elinux.git || true
pushd flutter-elinux
git fetch
git reset --hard ${{ env.FLUTTER_VERSION }}
bin/flutter-elinux doctor -v
bin/flutter-elinux precache --linux
popd
cp -R flutter/bin/cache/artifacts/engine/linux-x64/shader_lib flutter-elinux/flutter/bin/cache/artifacts/engine/linux-arm64
rm -rf flutter
;;
x86_64)
flutter doctor -v
;;
esac
if [[ "3.24.5" == ${{ env.FLUTTER_VERSION }} ]]; then
case ${{ matrix.job.arch }} in
aarch64)
pushd /opt/flutter-elinux/flutter
;;
x86_64)
pushd /opt/flutter
;;
esac
git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff
popd
fi
# build flutter
pushd /workspace
export CARGO_INCREMENTAL=0
export DEB_ARCH=${{ matrix.job.deb_arch }}
python3 ./build.py --flutter --skip-cargo
for name in rustdesk*??.deb; do
mv "$name" "${name%%.deb}-${{ matrix.job.arch }}.deb"
done
# rpm package
echo -e "start packaging fedora package"
pushd /workspace
case ${{ matrix.job.arch }} in
aarch64)
sed -i "s/linux\/x64/linux\/arm64/g" ./res/rpm-flutter.spec
;;
esac
HBB=`pwd` rpmbuild ./res/rpm-flutter.spec -bb
pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }}
for name in rustdesk*??.rpm; do
mv "$name" /workspace/"${name%%.rpm}.rpm"
done
# rpm suse package
echo -e "start packaging suse package"
pushd /workspace
case ${{ matrix.job.arch }} in
aarch64)
sed -i "s/linux\/x64/linux\/arm64/g" ./res/rpm-flutter-suse.spec
;;
esac
HBB=`pwd` rpmbuild ./res/rpm-flutter-suse.spec -bb
pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }}
for name in rustdesk*??.rpm; do
mv "$name" /workspace/"${name%%.rpm}-suse.rpm"
done
- name: Publish debian/rpm package
if: env.UPLOAD_ARTIFACT == 'true'
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
rustdesk-*.deb
rustdesk-*.rpm
- name: Upload deb
uses: actions/upload-artifact@master
if: env.UPLOAD_ARTIFACT == 'true'
with:
name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb
path: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb
# only x86_64 for arch since we can not find newest arm64 docker image to build
# old arch image does not make sense for arch since it is "arch" which always update to date
# and failed to makepkg arm64 on x86_64
- name: Patch archlinux PKGBUILD
if: matrix.job.arch == 'x86_64' && env.UPLOAD_ARTIFACT == 'true'
run: |
sed -i "s/x86_64/${{ matrix.job.arch }}/g" res/PKGBUILD
if [[ "${{ matrix.job.arch }}" == "aarch64" ]]; then
sed -i "s/x86_64/aarch64/g" ./res/PKGBUILD
fi
- name: Build archlinux package
if: matrix.job.arch == 'x86_64' && env.UPLOAD_ARTIFACT == 'true'
uses: rustdesk-org/arch-makepkg-action@master
with:
packages:
scripts: |
cd res && HBB=`pwd`/.. FLUTTER=1 makepkg -f
- name: Publish archlinux package
if: matrix.job.arch == 'x86_64' && env.UPLOAD_ARTIFACT == 'true'
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
res/rustdesk-${{ env.VERSION }}*.zst
build-rustdesk-linux-sciter:
if: ${{ inputs.upload-artifact }}
runs-on: ${{ matrix.job.on }}
name: build-rustdesk-linux-sciter ${{ matrix.job.target }}
strategy:
fail-fast: false
matrix:
# use a high level qemu-user-static
job:
- {
arch: x86_64,
target: x86_64-unknown-linux-gnu,
on: ubuntu-22.04,
distro: ubuntu18.04,
deb_arch: amd64,
sciter_arch: x64,
vcpkg-triplet: x64-linux,
extra_features: ",hwcodec,unix-file-copy-paste",
}
- {
arch: armv7,
target: armv7-unknown-linux-gnueabihf,
on: ubuntu-22.04-arm,
distro: ubuntu18.04-rustdesk,
deb_arch: armhf,
sciter_arch: arm32,
vcpkg-triplet: arm-linux,
extra_features: ",unix-file-copy-paste",
}
steps:
- name: Export GitHub Actions cache environment variables
uses: actions/github-script@v6
with:
script: |
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
- name: Checkout source code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Modify vcpkg.json for armv7
if: matrix.job.vcpkg-triplet == 'arm-linux'
run: |
# Replace the baseline in vcpkg.json with ARMV7_VCPKG_COMMIT_ID for armv7 builds
sed -i 's/"baseline": ".*"/"baseline": "${{ env.ARMV7_VCPKG_COMMIT_ID }}"/' vcpkg.json
echo "Modified vcpkg.json for armv7 build:"
grep -A 2 -B 2 '"baseline"' vcpkg.json
- name: Free Space
run: |
df -h
free -m
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ env.SCITER_RUST_VERSION }}
targets: ${{ matrix.job.target }}
components: "rustfmt"
- name: Save Rust toolchain version
run: |
RUST_TOOLCHAIN_VERSION=$(cargo --version | awk '{print $2}')
echo "RUST_TOOLCHAIN_VERSION=$RUST_TOOLCHAIN_VERSION" >> $GITHUB_ENV
- uses: rustdesk-org/run-on-arch-action@amd64-support
name: Build rustdesk sciter binary for ${{ matrix.job.arch }}
id: vcpkg
with:
arch: ${{ matrix.job.arch }}
distro: ${{ matrix.job.distro }}
githubToken: ${{ github.token }}
setup: |
ls -l "${PWD}"
dockerRunArgs: |
--volume "${PWD}:/workspace"
shell: /bin/bash
install: |
apt-get update
apt-get install -y \
build-essential \
clang \
curl \
gcc \
git \
g++ \
libayatana-appindicator3-dev \
libasound2-dev \
libclang-dev \
libdbus-1-dev \
libglib2.0-dev \
libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev \
libgtk-3-dev \
liblzma-dev \
libpam0g-dev \
libpulse-dev \
libva-dev \
libxcb-randr0-dev \
libxcb-shape0-dev \
libxcb-xfixes0-dev \
libxdo-dev \
libxfixes-dev \
ninja-build \
pkg-config \
python3 \
python3.7 \
rpm \
unzip \
wget \
xz-utils \
zip \
libssl-dev
# arm-linux needs CMake and vcokg built from source as there
# are no prebuilts available from Kitware and Microsoft
if [ "${{ matrix.job.vcpkg-triplet }}" = "arm-linux" ]; then
# install gcc/g++ 8 for vcpkg and OpenSSL headers for CMake
apt-get install -y gcc-8 g++-8
# bootstrap CMake amd add it to PATH
git clone --depth 1 https://github.com/kitware/cmake -b "v${{ env.SCITER_ARMV7_CMAKE_VERSION }}" /tmp/cmake
pushd /tmp/cmake
./bootstrap --generator='Unix Makefiles' "--prefix=/opt/cmake-${{ env.SCITER_ARMV7_CMAKE_VERSION }}-linux-armhf"
make -j1 install
popd
rm -rf /tmp/cmake
export PATH="/opt/cmake-${{ env.SCITER_ARMV7_CMAKE_VERSION }}-linux-armhf/bin:$PATH"
fi
# bootstrap vcpkg and set VCPKG_ROOT
export VCPKG_ROOT=/opt/artifacts/vcpkg
mkdir -p /opt/artifacts
pushd /opt/artifacts
rm -rf vcpkg
git clone https://github.com/microsoft/vcpkg
pushd vcpkg
# build vcpkg helper executable with gcc-8 for arm-linux but use prebuilt one on x64-linux
if [ "${{ matrix.job.vcpkg-triplet }}" = "arm-linux" ]; then
git reset --hard ${{ env.ARMV7_VCPKG_COMMIT_ID }}
CC=/usr/bin/gcc-8 CXX=/usr/bin/g++-8 sh bootstrap-vcpkg.sh -disableMetrics
else
git reset --hard ${{ env.VCPKG_COMMIT_ID }}
sh bootstrap-vcpkg.sh -disableMetrics
fi
popd
popd
# rust
pushd /opt
# do not use rustup, because memory overflow in qemu
wget --output-document rust.tar.gz https://static.rust-lang.org/dist/rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }}.tar.gz
tar -zxvf rust.tar.gz > /dev/null && rm rust.tar.gz
pushd rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }}
./install.sh
popd
rm -rf rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }}
popd
# install newer nasm for aom
wget --output-document nasm.deb "http://ftp.us.debian.org/debian/pool/main/n/nasm/nasm_${{ env.SCITER_NASM_DEBVERSION }}_${{ matrix.job.deb_arch }}.deb"
dpkg -i nasm.deb
rm -f nasm.deb
run: |
# disable git safe.directory
git config --global --add safe.directory "*"
# set python3.7 as default python3
update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1
# add built CMake to PATH and set VCPKG_FORCE_SYSTEM_BINARIES Afor arm-linux
if [ "${{ matrix.job.vcpkg-triplet }}" = "arm-linux" ]; then
export PATH="/opt/cmake-${{ env.SCITER_ARMV7_CMAKE_VERSION }}-linux-armhf/bin:$PATH"
export VCPKG_FORCE_SYSTEM_BINARIES=1
fi
# edit cargo config
mkdir -p ~/.cargo/
echo """
[source.crates-io]
registry = 'https://github.com/rust-lang/crates.io-index'
""" > ~/.cargo/config
cat ~/.cargo/config
# install dependencies from vcpkg
export VCPKG_ROOT=/opt/artifacts/vcpkg
# remove this when support higher version
export USE_AOM_391=1
if ! $VCPKG_ROOT/vcpkg install --triplet ${{ matrix.job.vcpkg-triplet }} --x-install-root="$VCPKG_ROOT/installed"; then
find "${VCPKG_ROOT}/" -name "*.log" | while read -r _1; do
echo "$_1:"
echo "======"
cat "$_1"
echo "======"
echo ""
done
exit 1
fi
head -n 100 "${VCPKG_ROOT}/buildtrees/ffmpeg/build-${{ matrix.job.vcpkg-triplet }}-rel-out.log" || true
# build rustdesk
python3 ./res/inline-sciter.py
export CARGO_INCREMENTAL=0
cargo build --features inline${{ matrix.job.extra_features }} --release --bins --jobs 1
# make debian package
mkdir -p ./Release
mv ./target/release/rustdesk ./Release/rustdesk
wget -O ./Release/libsciter-gtk.so https://github.com/c-smile/sciter-sdk/raw/master/bin.lnx/${{ matrix.job.sciter_arch }}/libsciter-gtk.so
export DEB_ARCH=${{ matrix.job.deb_arch }}
./build.py --package ./Release
- name: Rename rustdesk
shell: bash
run: |
for name in rustdesk*??.deb; do
# use cp to duplicate deb files to fit other packages.
cp "$name" "${name%%.deb}-${{ matrix.job.arch }}-sciter.deb"
done
- name: Publish debian package
if: env.UPLOAD_ARTIFACT == 'true'
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.deb
- name: Upload deb
uses: actions/upload-artifact@master
if: env.UPLOAD_ARTIFACT == 'true'
with:
name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.deb
path: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.deb
build-appimage:
name: Build appimage ${{ matrix.job.target }}
needs: [build-rustdesk-linux]
runs-on: ubuntu-22.04
if: ${{ inputs.upload-artifact }}
strategy:
fail-fast: false
matrix:
job:
- { target: x86_64-unknown-linux-gnu, arch: x86_64 }
- { target: aarch64-unknown-linux-gnu, arch: aarch64 }
steps:
- name: Checkout source code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Download Binary
uses: actions/download-artifact@master
with:
name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb
path: .
- name: Rename Binary
run: |
mv rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb appimage/rustdesk.deb
- name: Build appimage package
shell: bash
run: |
# install libarchive-tools for bsdtar command used in AppImageBuilder.yml
sudo apt-get update -y
# https://github.com/AppImage/AppImageKit/wiki/FUSE
sudo apt-get install -y libarchive-tools libfuse2
# set-up appimage-builder
# https://github.com/AppImage/AppImageKit/issues/1395
sudo pip3 install git+https://github.com/rustdesk-org/appimage-builder.git
# run appimage-builder
pushd appimage
sudo appimage-builder --skip-tests --recipe ./AppImageBuilder-${{ matrix.job.arch }}.yml
- name: Publish appimage package
if: env.UPLOAD_ARTIFACT == 'true'
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
./appimage/rustdesk-${{ env.VERSION }}-*.AppImage
build-flatpak:
name: Build flatpak ${{ matrix.job.target }}${{ matrix.job.suffix }}
needs:
- build-rustdesk-linux
- build-rustdesk-linux-sciter
runs-on: ${{ matrix.job.on }}
if: ${{ inputs.upload-artifact }}
strategy:
fail-fast: false
matrix:
job:
- {
target: x86_64-unknown-linux-gnu,
# https://github.com/ostreedev/ostree/commit/4bac96a8c817beda37448f9b8c662162bb619981
distro: ubuntu22.04,
on: ubuntu-22.04,
arch: x86_64,
suffix: "",
}
- {
target: x86_64-unknown-linux-gnu,
distro: ubuntu22.04,
on: ubuntu-22.04,
arch: x86_64,
suffix: "-sciter",
}
- {
target: aarch64-unknown-linux-gnu,
# try out newer flatpak since error of "error: Nothing matches org.freedesktop.Platform in remote flathub"
distro: ubuntu22.04,
on: ubuntu-22.04-arm,
arch: aarch64,
suffix: "",
}
steps:
- name: Checkout source code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Download Binary
uses: actions/download-artifact@master
with:
name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.deb
path: .
- name: Rename Binary
run: |
mv rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.deb flatpak/rustdesk.deb
- uses: rustdesk-org/run-on-arch-action@amd64-support
name: Build rustdesk flatpak package for ${{ matrix.job.arch }}
id: flatpak
with:
arch: ${{ matrix.job.arch }}
distro: ${{ matrix.job.distro }}
githubToken: ${{ github.token }}
setup: |
ls -l "${PWD}"
dockerRunArgs: |
--volume "${PWD}:/workspace"
shell: /bin/bash
install: |
apt-get update -y
apt-get install -y git flatpak flatpak-builder
run: |
# disable git safe.directory
git config --global --add safe.directory "*"
pushd /workspace
# flatpak deps
flatpak --user remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
# package
pushd flatpak
git clone https://github.com/flathub/shared-modules.git --depth=1
flatpak-builder --user --install-deps-from=flathub -y --force-clean --repo=repo ./build ./rustdesk.json
flatpak build-bundle ./repo rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.flatpak com.rustdesk.RustDesk
- name: Publish flatpak package
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
flatpak/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.flatpak
build-rustdesk-web:
if: False
name: build-rustdesk-web
runs-on: ubuntu-22.04
permissions:
contents: read
strategy:
fail-fast: false
env:
RELEASE_NAME: web-basic
steps:
- name: Checkout source code
uses: actions/checkout@v4
with:
submodules: recursive
- name: Prepare env
run: |
sudo apt-get update -y
sudo apt-get install -y wget npm
- name: Install flutter
uses: subosito/flutter-action@v2.12.0 #https://github.com/subosito/flutter-action/issues/277
with:
channel: "stable"
flutter-version: ${{ env.FLUTTER_VERSION }}
- name: Patch flutter
shell: bash
run: |
cd $(dirname $(dirname $(which flutter)))
[[ "3.24.5" == ${{env.FLUTTER_VERSION}} ]] && git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff
# https://rustdesk.com/docs/en/dev/build/web/
- name: Build web
shell: bash
run: |
pushd flutter/web/js
npm install yarn -g
npm install typescript -g
npm install protoc -g
# Install protoc first, see: https://google.github.io/proto-lens/installing-protoc.html
npm install ts-proto
# Only works with vite <= 2.8, see: https://github.com/vitejs/vite/blob/main/docs/guide/build.md#chunking-strategy
npm install vite@2.8
yarn install && yarn build
popd
pushd flutter/web
wget https://github.com/rustdesk/doc.rustdesk.com/releases/download/console/web_deps.tar.gz
tar xzf web_deps.tar.gz
popd
pushd flutter
flutter build web --release
cd build
cp ../web/README.md web
# TODO: Remove the following line when the web is almost complete.
echo -e "\n\nThis build is for preview and not full functionality." >> web/README.md
dir_name="rustdesk-${{ env.VERSION }}-${{ env.RELEASE_NAME }}"
mv web "${dir_name}" && tar czf "${dir_name}".tar.gz "${dir_name}"
sha256sum "${dir_name}".tar.gz
popd
- name: Publish web
if: env.UPLOAD_ARTIFACT == 'true'
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
flutter/build/rustdesk-${{ env.VERSION }}-${{ env.RELEASE_NAME }}.tar.gz
================================================
FILE: .github/workflows/flutter-ci.yml
================================================
name: Full Flutter CI
on:
workflow_dispatch:
pull_request:
paths-ignore:
- "docs/**"
- "README.md"
push:
branches:
- master
paths-ignore:
- ".github/**"
- "docs/**"
- "README.md"
- "res/**"
- "appimage/**"
- "flatpak/**"
jobs:
run-ci:
uses: ./.github/workflows/flutter-build.yml
with:
upload-artifact: false
================================================
FILE: .github/workflows/flutter-nightly.yml
================================================
name: Flutter Nightly Build
on:
schedule:
# schedule build every night
- cron: "0 0 * * *"
workflow_dispatch:
jobs:
run-flutter-nightly-build:
uses: ./.github/workflows/flutter-build.yml
secrets: inherit
with:
upload-artifact: true
upload-tag: "nightly"
================================================
FILE: .github/workflows/flutter-tag.yml
================================================
name: Flutter Tag Build
on:
workflow_dispatch:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
- '[0-9]+.[0-9]+.[0-9]+'
- 'v[0-9]+.[0-9]+.[0-9]+-[0-9]+'
- '[0-9]+.[0-9]+.[0-9]+-[0-9]+'
jobs:
run-flutter-tag-build:
uses: ./.github/workflows/flutter-build.yml
secrets: inherit
with:
upload-artifact: true
upload-tag: ${{ github.ref_name }}
================================================
FILE: .github/workflows/playground.yml
================================================
name: playground
on:
#schedule:
# schedule build every night
# - cron: "0/6 * * * *"
workflow_dispatch:
env:
RUST_VERSION: "1.75" # https://github.com/rustdesk/rustdesk/discussions/7503
CARGO_NDK_VERSION: "3.1.2"
LLVM_VERSION: "15.0.6"
FLUTTER_VERSION: "3.22.2"
FLUTTER_RUST_BRIDGE_VERSION: "1.80.1"
# for arm64 linux because official Dart SDK does not work
FLUTTER_ELINUX_VERSION: "3.16.9"
TAG_NAME: "nightly"
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
VCPKG_COMMIT_ID: "120deac3062162151622ca4860575a33844ba10b"
VERSION: "1.4.6"
NDK_VERSION: "r26d"
#signing keys env variable checks
ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}"
MACOS_P12_BASE64: "${{ secrets.MACOS_P12_BASE64 }}"
# To make a custom build with your own servers set the below secret values
RS_PUB_KEY: "${{ secrets.RS_PUB_KEY }}"
RENDEZVOUS_SERVER: "${{ secrets.RENDEZVOUS_SERVER }}"
API_SERVER: "${{ secrets.API_SERVER }}"
UPLOAD_ARTIFACT: "${{ inputs.upload-artifact }}"
SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}"
jobs:
build-for-macOS:
name: ${{ matrix.job.target }}
runs-on: ${{ matrix.job.os }}
strategy:
fail-fast: false
matrix:
job:
- {
target: x86_64-apple-darwin,
os: macos-13, #macos-latest or macos-14 use M1 now, https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#:~:text=14%20GB-,macos%2Dlatest%20or%20macos%2D14,-The%20macos%2Dlatestlabel
extra-build-args: "",
arch: x86_64,
flutter: "3.13.9",
ref: "f6509e3fd6917aa976bad2fc684182601ebf2434",
bridge: "1.80.1",
date: "20231219"
}
- {
target: x86_64-apple-darwin,
os: macos-13, #macos-latest or macos-14 use M1 now, https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#:~:text=14%20GB-,macos%2Dlatest%20or%20macos%2D14,-The%20macos%2Dlatestlabel
extra-build-args: "",
arch: x86_64,
flutter: "3.10.6",
ref: "f6509e3fd6917aa976bad2fc684182601ebf2434",
bridge: "1.80.1",
date: "20231219"
}
- {
target: x86_64-apple-darwin,
os: macos-13, #macos-latest or macos-14 use M1 now, https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#:~:text=14%20GB-,macos%2Dlatest%20or%20macos%2D14,-The%20macos%2Dlatestlabel
extra-build-args: "",
arch: x86_64,
flutter: "3.10.6",
ref: "85ddfc0739f052cab0029c46b899b959ee94eeb8",
bridge: "1.80.1",
date: "20231119"
}
- {
target: x86_64-apple-darwin,
os: macos-13, #macos-latest or macos-14 use M1 now, https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#:~:text=14%20GB-,macos%2Dlatest%20or%20macos%2D14,-The%20macos%2Dlatestlabel
extra-build-args: "",
arch: x86_64,
flutter: "3.13.9",
ref: "85ddfc0739f052cab0029c46b899b959ee94eeb8",
bridge: "1.80.1",
date: "20231119"
}
steps:
- name: Export GitHub Actions cache environment variables
uses: actions/github-script@v6
with:
script: |
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
- name: Checkout source code
uses: actions/checkout@v3
with:
ref: ${{ matrix.job.ref }}
submodules: recursive
- name: Import the codesign cert
if: env.MACOS_P12_BASE64 != null
uses: apple-actions/import-codesign-certs@v1
with:
p12-file-base64: ${{ secrets.MACOS_P12_BASE64 }}
p12-password: ${{ secrets.MACOS_P12_PASSWORD }}
keychain: rustdesk
- name: Check sign and import sign key
if: env.MACOS_P12_BASE64 != null
run: |
security default-keychain -s rustdesk.keychain
security find-identity -v
- name: Import notarize key
if: env.MACOS_P12_BASE64 != null
uses: timheuer/base64-to-file@v1.2
with:
# https://gregoryszorc.com/docs/apple-codesign/stable/apple_codesign_rcodesign.html#notarizing-and-stapling
fileName: rustdesk.json
fileDir: ${{ github.workspace }}
encodedString: ${{ secrets.MACOS_NOTARIZE_JSON }}
- name: Install rcodesign tool
if: env.MACOS_P12_BASE64 != null
shell: bash
run: |
pushd /tmp
wget https://github.com/indygreg/apple-platform-rs/releases/download/apple-codesign%2F0.22.0/apple-codesign-0.22.0-macos-universal.tar.gz
tar -zxvf apple-codesign-0.22.0-macos-universal.tar.gz
mv apple-codesign-0.22.0-macos-universal/rcodesign /usr/local/bin
popd
- name: Install build runtime
run: |
brew install llvm create-dmg nasm pkg-config
- name: Install flutter
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: ${{ matrix.job.flutter }}
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ env.RUST_VERSION }}
targets: ${{ matrix.job.target }}
components: "rustfmt"
- uses: Swatinem/rust-cache@v2
with:
prefix-key: ${{ matrix.job.os }}
- name: Install flutter rust bridge deps
shell: bash
run: |
sed -i '' 's/3.1.0/2.17.0/g' flutter/pubspec.yaml;
cargo install flutter_rust_bridge_codegen --version ${{ matrix.job.bridge }} --features "uuid" --locked
# below works for mac to make buildable on 3.13.9
# pushd flutter/lib; find . -name "*.dart" | xargs -I{} sed -i '' 's/textScaler: TextScaler.linear(\(.*\)),/textScaleFactor: \1,/g' {}; popd;
pushd flutter && flutter pub get && popd
~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart --c-output ./flutter/macos/Runner/bridge_generated.h
- name: Setup vcpkg with Github Actions binary cache
uses: lukka/run-vcpkg@v11
with:
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
- name: Install vcpkg dependencies
run: |
$VCPKG_ROOT/vcpkg install --x-install-root="$VCPKG_ROOT/installed"
- name: Restore from cache and install vcpkg
uses: lukka/run-vcpkg@v7
if: false
with:
setupOnly: true
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
- name: Install vcpkg dependencies
if: false
run: |
$VCPKG_ROOT/vcpkg install libvpx libyuv opus aom
- name: Show version information (Rust, cargo, Clang)
shell: bash
run: |
clang --version || true
rustup -V
rustup toolchain list
rustup default
cargo -V
rustc -V
- name: Build rustdesk
run: |
./build.py --flutter ${{ matrix.job.extra-build-args }}
- name: create unsigned dmg
run: |
CREATE_DMG="$(command -v create-dmg)"
CREATE_DMG="$(readlink -f "$CREATE_DMG")"
sed -i -e 's/MAXIMUM_UNMOUNTING_ATTEMPTS=3/MAXIMUM_UNMOUNTING_ATTEMPTS=7/' "$CREATE_DMG"
create-dmg --icon "RustDesk.app" 200 190 --hide-extension "RustDesk.app" --window-size 800 400 --app-drop-link 600 185 rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.dmg ./flutter/build/macos/Build/Products/Release/RustDesk.app
- name: Codesign app and create signed dmg
if: env.MACOS_P12_BASE64 != null
run: |
# Patch create-dmg to give more attempts to unmount image
CREATE_DMG="$(command -v create-dmg)"
CREATE_DMG="$(readlink -f "$CREATE_DMG")"
sed -i -e 's/MAXIMUM_UNMOUNTING_ATTEMPTS=3/MAXIMUM_UNMOUNTING_ATTEMPTS=7/' "$CREATE_DMG"
# Unlock keychain
security default-keychain -s rustdesk.keychain
security unlock-keychain -p ${{ secrets.MACOS_P12_PASSWORD }} rustdesk.keychain
# start sign the rustdesk.app and dmg
rm -rf *.dmg || true
codesign --force --options runtime -s ${{ secrets.MACOS_CODESIGN_IDENTITY }} --deep --strict ./flutter/build/macos/Build/Products/Release/RustDesk.app -vvv
create-dmg --icon "RustDesk.app" 200 190 --hide-extension "RustDesk.app" --window-size 800 400 --app-drop-link 600 185 rustdesk-${{ env.VERSION }}.dmg ./flutter/build/macos/Build/Products/Release/RustDesk.app
codesign --force --options runtime -s ${{ secrets.MACOS_CODESIGN_IDENTITY }} --deep --strict rustdesk-${{ env.VERSION }}.dmg -vvv
# notarize the rustdesk-${{ env.VERSION }}.dmg
rcodesign notary-submit --api-key-path ${{ github.workspace }}/rustdesk.json --staple rustdesk-${{ env.VERSION }}.dmg
- name: Rename rustdesk
run: |
for name in rustdesk*??.dmg; do
mv "$name" "${name%%.dmg}-${{ matrix.job.arch }}-flutter${{ matrix.job.flutter }}-flutter${{ matrix.job.date }}.dmg"
done
- name: Publish DMG package
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
rustdesk*-${{ matrix.job.arch }}*.dmg
build-rustdesk-android:
if: false
name: build rustdesk android apk ${{ matrix.job.target }}
runs-on: ${{ matrix.job.os }}
strategy:
fail-fast: false
matrix:
job:
- {
arch: aarch64,
target: aarch64-linux-android,
os: ubuntu-22.04,
openssl-arch: android-arm64,
ref: master, # latest
}
steps:
- name: Checkout source code
uses: actions/checkout@v3
with:
ref: ${{ matrix.job.ref }}
submodules: recursive
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
clang \
cmake \
curl \
gcc-multilib \
git \
g++ \
g++-multilib \
libayatana-appindicator3-dev\
libasound2-dev \
libc6-dev \
libclang-dev \
libunwind-dev \
libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev \
libgtk-3-dev \
libpam0g-dev \
libpulse-dev \
libva-dev \
libvdpau-dev \
libxcb-randr0-dev \
libxcb-shape0-dev \
libxcb-xfixes0-dev \
libxdo-dev \
libxfixes-dev \
llvm-dev \
nasm \
yasm \
ninja-build \
openjdk-11-jdk-headless \
pkg-config \
tree \
wget
- name: Install flutter
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: ${{ env.FLUTTER_VERSION }}
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ env.RUST_VERSION }}
components: "rustfmt"
- name: Install flutter rust bridge deps
run: |
git config --global core.longpaths true
cargo install flutter_rust_bridge_codegen --version ${{ env.FLUTTER_RUST_BRIDGE_VERSION }} --features "uuid" --locked
sed -i 's/uni_links_desktop/#uni_links_desktop/g' flutter/pubspec.yaml
pushd flutter/lib; find . | grep dart | xargs sed -i 's/textScaler: TextScaler.linear(\(.*\)),/textScaleFactor: \1,/g'; popd;
pushd flutter ; flutter pub get ; popd
~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart
- uses: nttld/setup-ndk@v1
id: setup-ndk
with:
ndk-version: ${{ env.NDK_VERSION }}
add-to-path: true
- name: Setup vcpkg with Github Actions binary cache
uses: lukka/run-vcpkg@v11
with:
vcpkgDirectory: /opt/artifacts/vcpkg
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }}
- name: Install vcpkg dependencies
run: |
case ${{ matrix.job.target }} in
aarch64-linux-android)
./flutter/build_android_deps.sh arm64-v8a
;;
armv7-linux-androideabi)
./flutter/build_android_deps.sh armeabi-v7a
;;
esac
shell: bash
- name: Clone deps
shell: bash
run: |
pushd /opt
git clone https://github.com/rustdesk-org/rustdesk_thirdparty_lib.git --depth=1
ls -ls /opt/artifacts/vcpkg/installed/arm64-android/lib/
# cp -rf /opt/rustdesk_thirdparty_lib/vcpkg/* /opt/artifacts/vcpkg/
ls -ls /opt/artifacts/vcpkg/installed/arm64-android/lib/
- name: Build rustdesk lib
env:
ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}
ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }}
run: |
rustup target add ${{ matrix.job.target }}
cargo install cargo-ndk --version ${{ env.CARGO_NDK_VERSION }} --locked
case ${{ matrix.job.target }} in
aarch64-linux-android)
./flutter/ndk_arm64.sh
mkdir -p ./flutter/android/app/src/main/jniLibs/arm64-v8a
cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/librustdesk.so
;;
armv7-linux-androideabi)
./flutter/ndk_arm.sh
mkdir -p ./flutter/android/app/src/main/jniLibs/armeabi-v7a
cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/librustdesk.so
;;
esac
- name: Build rustdesk
shell: bash
env:
JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
run: |
export PATH=/usr/lib/jvm/java-11-openjdk-amd64/bin:$PATH
# temporary use debug sign config
sed -i "s/signingConfigs.release/signingConfigs.debug/g" ./flutter/android/app/build.gradle
case ${{ matrix.job.target }} in
aarch64-linux-android)
mkdir -p ./flutter/android/app/src/main/jniLibs/arm64-v8a
cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/
cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/librustdesk.so
# build flutter
pushd flutter
flutter build apk --release --target-platform android-arm64 --split-per-abi
mv build/app/outputs/flutter-apk/app-arm64-v8a-release.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk
;;
armv7-linux-androideabi)
mkdir -p ./flutter/android/app/src/main/jniLibs/armeabi-v7a
cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/
cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/librustdesk.so
# build flutter
pushd flutter
flutter build apk --release --target-platform android-arm --split-per-abi
mv build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk
;;
esac
popd
mkdir -p signed-apk; pushd signed-apk
mv ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk ./rustdesk-test-${{ matrix.job.ref }}-${{ matrix.job.ndk }}.apk
- uses: r0adkll/sign-android-release@v1
name: Sign app APK
if: env.ANDROID_SIGNING_KEY != null
id: sign-rustdesk
with:
releaseDirectory: ./signed-apk
signingKeyBase64: ${{ secrets.ANDROID_SIGNING_KEY }}
alias: ${{ secrets.ANDROID_ALIAS }}
keyStorePassword: ${{ secrets.ANDROID_KEY_STORE_PASSWORD }}
keyPassword: ${{ secrets.ANDROID_KEY_PASSWORD }}
env:
# override default build-tools version (29.0.3) -- optional
BUILD_TOOLS_VERSION: "30.0.2"
- name: Publish signed apk package
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ env.TAG_NAME }}
files: |
${{steps.sign-rustdesk.outputs.signedReleaseFile}}
================================================
FILE: .github/workflows/third-party-RustDeskTempTopMostWindow.yml
================================================
name: build RustDeskTempTopMostWindow
on:
workflow_call:
inputs:
upload-artifact:
type: boolean
default: true
target:
description: 'Target'
required: true
type: string
default: 'windows-2022'
configuration:
description: 'Configuration'
required: true
type: string
default: 'Release'
platform:
description: 'Platform'
required: true
type: string
default: 'x64'
target_version:
description: 'TargetVersion'
required: true
type: string
default: 'Windows10'
env:
project_path: WindowInjection/WindowInjection.vcxproj
jobs:
build-RustDeskTempTopMostWindow:
runs-on: ${{ inputs.target }}
strategy:
fail-fast: false
env:
build_output_dir: RustDeskTempTopMostWindow/WindowInjection/${{ inputs.platform }}/${{ inputs.configuration }}
steps:
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v2
- name: Download the source code
run: |
git clone https://github.com/rustdesk-org/RustDeskTempTopMostWindow RustDeskTempTopMostWindow
# Build. commit 53b548a5398624f7149a382000397993542ad796 is tag v0.3
- name: Build the project
run: |
cd RustDeskTempTopMostWindow && git checkout 53b548a5398624f7149a382000397993542ad796
msbuild ${{ env.project_path }} -p:Configuration=${{ inputs.configuration }} -p:Platform=${{ inputs.platform }} /p:TargetVersion=${{ inputs.target_version }}
- name: Archive build artifacts
uses: actions/upload-artifact@master
if: ${{ inputs.upload-artifact }}
with:
name: topmostwindow-artifacts
path: |
./${{ env.build_output_dir }}/WindowInjection.dll
================================================
FILE: .github/workflows/winget.yml
================================================
name: Publish to WinGet
on:
release:
types: [released]
workflow_dispatch:
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: vedantmgoyal9/winget-releaser@main
with:
identifier: RustDesk.RustDesk
version: "1.4.6"
release-tag: "1.4.6"
token: ${{ secrets.WINGET_TOKEN }}
================================================
FILE: .gitignore
================================================
/build
/target
.vscode
.idea
.DS_Store
.env
libsciter-gtk.so
src/ui/inline.rs
extractor
__pycache__
src/version.rs
*dmg
*exe
*tgz
cert.pfx
*.bak
*png
*svg
*jpg
sciter.dll
**pdb
src/bridge_generated.rs
src/bridge_generated.io.rs
*deb
rustdesk
*.cache
# appimage
appimage/AppDir
appimage/*.AppImage
appimage/appimage-build
appimage/*.xz
# flutter
flutter/linux/build/**
flutter/linux/cmake-build-debug/**
# flatpak
flatpak/.flatpak-builder/**
flatpak/ccache/**
flatpak/.flatpak-builder/build/**
flatpak/.flatpak-builder/shared-modules/**
flatpak/.flatpak-builder/shared-modules/*.tar.xz
flatpak/.flatpak-builder/debian-binary
flatpak/build/**
flatpak/repo/**
flatpak/*.flatpak
# bridge file
lib/generated_bridge.dart
# vscode devcontainer
.gitconfig
.vscode-server/
.ssh
.devcontainer/.*
# build cache in examples
examples/**/target/
# ===
vcpkg_installed
flutter/lib/generated_plugin_registrant.dart
libsciter.dylib
flutter/web/
================================================
FILE: .gitmodules
================================================
[submodule "libs/hbb_common"]
path = libs/hbb_common
url = https://github.com/rustdesk/hbb_common
================================================
FILE: CLAUDE.md
================================================
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Development Commands
### Build Commands
- `cargo run` - Build and run the desktop application (requires libsciter library)
- `python3 build.py --flutter` - Build Flutter version (desktop)
- `python3 build.py --flutter --release` - Build Flutter version in release mode
- `python3 build.py --hwcodec` - Build with hardware codec support
- `python3 build.py --vram` - Build with VRAM feature (Windows only)
- `cargo build --release` - Build Rust binary in release mode
- `cargo build --features hwcodec` - Build with specific features
### Flutter Mobile Commands
- `cd flutter && flutter build android` - Build Android APK
- `cd flutter && flutter build ios` - Build iOS app
- `cd flutter && flutter run` - Run Flutter app in development mode
- `cd flutter && flutter test` - Run Flutter tests
### Testing
- `cargo test` - Run Rust tests
- `cd flutter && flutter test` - Run Flutter tests
### Platform-Specific Build Scripts
- `flutter/build_android.sh` - Android build script
- `flutter/build_ios.sh` - iOS build script
- `flutter/build_fdroid.sh` - F-Droid build script
## Project Architecture
### Directory Structure
- **`src/`** - Main Rust application code
- `src/ui/` - Legacy Sciter UI (deprecated, use Flutter instead)
- `src/server/` - Audio/clipboard/input/video services and network connections
- `src/client.rs` - Peer connection handling
- `src/platform/` - Platform-specific code
- **`flutter/`** - Flutter UI code for desktop and mobile
- **`libs/`** - Core libraries
- `libs/hbb_common/` - Video codec, config, network wrapper, protobuf, file transfer utilities
- `libs/scrap/` - Screen capture functionality
- `libs/enigo/` - Platform-specific keyboard/mouse control
- `libs/clipboard/` - Cross-platform clipboard implementation
### Key Components
- **Remote Desktop Protocol**: Custom protocol implemented in `src/rendezvous_mediator.rs` for communicating with rustdesk-server
- **Screen Capture**: Platform-specific screen capture in `libs/scrap/`
- **Input Handling**: Cross-platform input simulation in `libs/enigo/`
- **Audio/Video Services**: Real-time audio/video streaming in `src/server/`
- **File Transfer**: Secure file transfer implementation in `libs/hbb_common/`
### UI Architecture
- **Legacy UI**: Sciter-based (deprecated) - files in `src/ui/`
- **Modern UI**: Flutter-based - files in `flutter/`
- Desktop: `flutter/lib/desktop/`
- Mobile: `flutter/lib/mobile/`
- Shared: `flutter/lib/common/` and `flutter/lib/models/`
## Important Build Notes
### Dependencies
- Requires vcpkg for C++ dependencies: `libvpx`, `libyuv`, `opus`, `aom`
- Set `VCPKG_ROOT` environment variable
- Download appropriate Sciter library for legacy UI support
### Ignore Patterns
When working with files, ignore these directories:
- `target/` - Rust build artifacts
- `flutter/build/` - Flutter build output
- `flutter/.dart_tool/` - Flutter tooling files
### Cross-Platform Considerations
- Windows builds require additional DLLs and virtual display drivers
- macOS builds need proper signing and notarization for distribution
- Linux builds support multiple package formats (deb, rpm, AppImage)
- Mobile builds require platform-specific toolchains (Android SDK, Xcode)
### Feature Flags
- `hwcodec` - Hardware video encoding/decoding
- `vram` - VRAM optimization (Windows only)
- `flutter` - Enable Flutter UI
- `unix-file-copy-paste` - Unix file clipboard support
- `screencapturekit` - macOS ScreenCaptureKit (macOS only)
### Config
All configurations or options are under `libs/hbb_common/src/config.rs` file, 4 types:
- Settings
- Local
- Display
- Built-in
================================================
FILE: Cargo.toml
================================================
[package]
name = "rustdesk"
version = "1.4.6"
authors = ["rustdesk <info@rustdesk.com>"]
edition = "2021"
build= "build.rs"
description = "RustDesk Remote Desktop"
default-run = "rustdesk"
rust-version = "1.75"
[lib]
name = "librustdesk"
crate-type = ["cdylib", "staticlib", "rlib"]
[[bin]]
name = "naming"
path = "src/naming.rs"
[[bin]]
name = "service"
path = "src/service.rs"
[features]
inline = []
cli = []
use_samplerate = ["samplerate"]
use_rubato = ["rubato"]
use_dasp = ["dasp"]
flutter = ["flutter_rust_bridge"]
default = ["use_dasp"]
hwcodec = ["scrap/hwcodec"]
vram = ["scrap/vram"]
mediacodec = ["scrap/mediacodec"]
plugin_framework = []
linux-pkg-config = ["magnum-opus/linux-pkg-config", "scrap/linux-pkg-config"]
unix-file-copy-paste = [
"dep:x11-clipboard",
"dep:x11rb",
"dep:percent-encoding",
"dep:once_cell",
"clipboard/unix-file-copy-paste",
]
screencapturekit = ["cpal/screencapturekit"]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
async-trait = "0.1"
scrap = { path = "libs/scrap", features = ["wayland"] }
hbb_common = { path = "libs/hbb_common" }
serde_derive = "1.0"
serde = "1.0"
serde_json = "1.0"
serde_repr = "0.1"
cfg-if = "1.0"
lazy_static = "1.4"
sha2 = "0.10"
repng = "0.2"
parity-tokio-ipc = { git = "https://github.com/rustdesk-org/parity-tokio-ipc" }
magnum-opus = { git = "https://github.com/rustdesk-org/magnum-opus" }
dasp = { version = "0.11", features = ["signal", "interpolate-linear", "interpolate"], optional = true }
rubato = { version = "0.12", optional = true }
samplerate = { version = "0.2", optional = true }
uuid = { version = "1.3", features = ["v4"] }
clap = "4.2"
rpassword = "7.2"
num_cpus = "1.15"
bytes = { version = "1.4", features = ["serde"] }
default-net = "0.14"
wol-rs = "1.0"
flutter_rust_bridge = { version = "=1.80", features = ["uuid"], optional = true}
errno = "0.3"
rdev = { git = "https://github.com/rustdesk-org/rdev" }
url = { version = "2.3", features = ["serde"] }
crossbeam-queue = "0.3"
hex = "0.4"
chrono = "0.4"
cidr-utils = "0.5"
fon = "0.6"
zip = "0.6"
shutdown_hooks = "0.1"
totp-rs = { version = "5.4", default-features = false, features = ["gen_secret", "otpauth"] }
stunclient = "0.4"
kcp-sys= { git = "https://github.com/rustdesk-org/kcp-sys"}
reqwest = { version = "0.12", features = ["blocking", "socks", "json", "native-tls", "rustls-tls", "rustls-tls-native-roots", "gzip"], default-features=false }
[target.'cfg(not(target_os = "linux"))'.dependencies]
# https://github.com/rustdesk/rustdesk/discussions/10197, not use cpal on linux
cpal = { git = "https://github.com/rustdesk-org/cpal", branch = "osx-screencapturekit" }
ringbuf = "0.3"
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
mac_address = "1.1"
sciter-rs = { git = "https://github.com/rustdesk-org/rust-sciter", branch = "dyn" }
sys-locale = "0.3"
enigo = { path = "libs/enigo", features = [ "with_serde" ] }
clipboard = { path = "libs/clipboard" }
ctrlc = "3.2"
# arboard = { version = "3.4", features = ["wayland-data-control"] }
arboard = { git = "https://github.com/rustdesk-org/arboard", features = ["wayland-data-control"] }
clipboard-master = { git = "https://github.com/rustdesk-org/clipboard-master" }
portable-pty = { git = "https://github.com/rustdesk-org/wezterm", branch = "rustdesk/pty_based_0.8.1", package = "portable-pty" }
system_shutdown = "4.0"
qrcode-generator = "4.1"
[target.'cfg(target_os = "windows")'.dependencies]
winapi = { version = "0.3", features = [
"winuser",
"wincrypt",
"shellscalingapi",
"pdh",
"synchapi",
"memoryapi",
"shellapi",
"devguid",
"setupapi",
"cguid",
"cfgmgr32",
"ioapiset",
"winspool",
] }
windows = { version = "0.61", features = [
"Win32",
"Win32_Foundation",
"Win32_Security",
"Win32_Security_Authorization",
"Win32_Storage_FileSystem",
"Win32_System",
"Win32_System_Diagnostics",
"Win32_System_Diagnostics_ToolHelp",
"Win32_System_Environment",
"Win32_System_IO",
"Win32_System_Memory",
"Win32_System_Pipes",
"Win32_System_Threading",
"Win32_UI_Shell",
] }
winreg = "0.11"
windows-service = "0.6"
virtual_display = { path = "libs/virtual_display" }
remote_printer = { path = "libs/remote_printer" }
impersonate_system = { git = "https://github.com/rustdesk-org/impersonate-system" }
shared_memory = "0.12"
tauri-winrt-notification = "0.1"
runas = "1.2"
[target.'cfg(target_os = "macos")'.dependencies]
objc = "0.2"
cocoa = "0.24"
dispatch = "0.2"
core-foundation = "0.9"
core-graphics = "0.22"
include_dir = "0.7"
fruitbasket = "0.10"
objc_id = "0.1"
# If we use piet "0.7" here, we must also update core-graphics to "0.24".
piet = "0.6"
piet-coregraphics = "0.6"
foreign-types = "0.3"
[target.'cfg(any(target_os = "macos", target_os = "linux", target_os = "windows"))'.dependencies]
tray-icon = { git = "https://github.com/tauri-apps/tray-icon", version = "0.21.3" }
tao = { git = "https://github.com/rustdesk-org/tao", branch = "dev" }
image = "0.24"
[target.'cfg(any(target_os = "macos", target_os = "linux"))'.dependencies]
keepawake = { git = "https://github.com/rustdesk-org/keepawake-rs" }
[target.'cfg(any(target_os = "windows", target_os = "linux"))'.dependencies]
wallpaper = { git = "https://github.com/rustdesk-org/wallpaper.rs" }
tiny-skia = "0.11"
softbuffer = "0.4"
fontdb = "0.23"
bytemuck = "1.23"
ttf-parser = "0.25"
[target.'cfg(target_os = "linux")'.dependencies]
libxdo-sys = "0.11"
psimple = { package = "libpulse-simple-binding", version = "2.27" }
pulse = { package = "libpulse-binding", version = "2.27" }
rust-pulsectl = { git = "https://github.com/rustdesk-org/pulsectl" }
async-process = "1.7"
evdev = { git="https://github.com/rustdesk-org/evdev" }
dbus = "0.9"
dbus-crossroads = "0.5"
pam = { git="https://github.com/rustdesk-org/pam" }
x11-clipboard = {git="https://github.com/clslaid/x11-clipboard", branch = "feat/store-batch", optional = true}
x11rb = {version = "0.12", features = ["all-extensions"], optional = true}
percent-encoding = {version = "2.3", optional = true}
once_cell = {version = "1.18", optional = true}
nix = { version = "0.29", features = ["term", "process"]}
gtk = "0.18"
termios = "0.3"
terminfo = "0.8"
winit = "0.30"
[target.'cfg(any(target_os = "linux", target_os = "android"))'.dependencies]
openssl = { version = "0.10", features = ["vendored"] }
[target.'cfg(target_os = "android")'.dependencies]
android_logger = "0.13"
jni = "0.21"
android-wakelock = { git = "https://github.com/rustdesk-org/android-wakelock" }
[workspace]
members = ["libs/scrap", "libs/hbb_common", "libs/enigo", "libs/clipboard", "libs/virtual_display", "libs/virtual_display/dylib", "libs/portable", "libs/remote_printer"]
exclude = ["vdi/host", "examples/custom_plugin"]
# Patch libxdo-sys to use a stub implementation that doesn't require libxdo
# This allows building and running on systems without libxdo installed (e.g., Wayland-only)
[patch.crates-io]
libxdo-sys = { path = "libs/libxdo-sys-stub" }
[package.metadata.winres]
LegalCopyright = "Copyright © 2025 Purslane Ltd. All rights reserved."
ProductName = "RustDesk"
FileDescription = "RustDesk Remote Desktop"
OriginalFilename = "rustdesk.exe"
[target.'cfg(target_os="windows")'.build-dependencies]
winres = "0.1"
winapi = { version = "0.3", features = [ "winnt", "pdh", "synchapi" ] }
[build-dependencies]
cc = "1.0"
hbb_common = { path = "libs/hbb_common" }
os-version = "0.2"
[dev-dependencies]
hound = "3.5"
docopt = "1.1"
[package.metadata.bundle]
name = "RustDesk"
identifier = "com.carriez.rustdesk"
icon = ["res/32x32.png", "res/128x128.png", "res/128x128@2x.png"]
osx_minimum_system_version = "10.14"
#https://github.com/johnthagen/min-sized-rust
[profile.release]
lto = true
codegen-units = 1
panic = 'abort'
strip = true
#opt-level = 'z' # only have smaller size after strip
rpath = true
================================================
FILE: Dockerfile
================================================
FROM debian:bullseye-slim
WORKDIR /
ARG DEBIAN_FRONTEND=noninteractive
ENV VCPKG_FORCE_SYSTEM_BINARIES=1
RUN apt update -y && \
apt install --yes --no-install-recommends \
g++ \
gcc \
git \
curl \
nasm \
yasm \
libgtk-3-dev \
clang \
libxcb-randr0-dev \
libxdo-dev \
libxfixes-dev \
libxcb-shape0-dev \
libxcb-xfixes0-dev \
libasound2-dev \
libpam0g-dev \
libpulse-dev \
make \
wget \
libssl-dev \
unzip \
zip \
sudo \
libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev \
ca-certificates \
ninja-build && \
rm -rf /var/lib/apt/lists/*
RUN wget https://github.com/Kitware/CMake/releases/download/v3.30.6/cmake-3.30.6.tar.gz --no-check-certificate && \
tar xzf cmake-3.30.6.tar.gz && \
cd cmake-3.30.6 && \
./configure --prefix=/usr/local && \
make && \
make install
RUN git clone --branch 2023.04.15 --depth=1 https://github.com/microsoft/vcpkg && \
/vcpkg/bootstrap-vcpkg.sh -disableMetrics && \
/vcpkg/vcpkg --disable-metrics install libvpx libyuv opus aom
RUN groupadd -r user && \
useradd -r -g user user --home /home/user && \
mkdir -p /home/user/rustdesk && \
chown -R user: /home/user && \
echo "user ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/user
WORKDIR /home/user
RUN curl -LO https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so
USER user
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs > rustup.sh && \
chmod +x rustup.sh && \
./rustup.sh -y
USER root
ENV HOME=/home/user
COPY ./entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
================================================
FILE: LICENCE
================================================
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.
================================================
FILE: README.md
================================================
<p align="center">
<img src="res/logo-header.svg" alt="RustDesk - Your remote desktop"><br>
<a href="#raw-steps-to-build">Build</a> •
<a href="#how-to-build-with-docker">Docker</a> •
<a href="#file-structure">Structure</a> •
<a href="#snapshot">Snapshot</a><br>
[<a href="docs/README-UA.md">Українська</a>] | [<a href="docs/README-CS.md">česky</a>] | [<a href="docs/README-ZH.md">中文</a>] | [<a href="docs/README-HU.md">Magyar</a>] | [<a href="docs/README-ES.md">Español</a>] | [<a href="docs/README-FA.md">فارسی</a>] | [<a href="docs/README-FR.md">Français</a>] | [<a href="docs/README-DE.md">Deutsch</a>] | [<a href="docs/README-PL.md">Polski</a>] | [<a href="docs/README-ID.md">Indonesian</a>] | [<a href="docs/README-FI.md">Suomi</a>] | [<a href="docs/README-ML.md">മലയാളം</a>] | [<a href="docs/README-JP.md">日本語</a>] | [<a href="docs/README-NL.md">Nederlands</a>] | [<a href="docs/README-IT.md">Italiano</a>] | [<a href="docs/README-RU.md">Русский</a>] | [<a href="docs/README-PTBR.md">Português (Brasil)</a>] | [<a href="docs/README-EO.md">Esperanto</a>] | [<a href="docs/README-KR.md">한국어</a>] | [<a href="docs/README-AR.md">العربي</a>] | [<a href="docs/README-VN.md">Tiếng Việt</a>] | [<a href="docs/README-DA.md">Dansk</a>] | [<a href="docs/README-GR.md">Ελληνικά</a>] | [<a href="docs/README-TR.md">Türkçe</a>] | [<a href="docs/README-NO.md">Norsk</a>] | [<a href="docs/README-RO.md">Română</a>]<br>
<b>We need your help to translate this README, <a href="https://github.com/rustdesk/rustdesk/tree/master/src/lang">RustDesk UI</a> and <a href="https://github.com/rustdesk/doc.rustdesk.com">RustDesk Doc</a> to your native language</b>
</p>
> [!Caution]
> **Misuse Disclaimer:** <br>
> The developers of RustDesk do not condone or support any unethical or illegal use of this software. Misuse, such as unauthorized access, control or invasion of privacy, is strictly against our guidelines. The authors are not responsible for any misuse of the application.
Chat with us: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk)
[](https://rustdesk.com/pricing.html)
Yet another remote desktop solution, written in Rust. Works out of the box with no configuration required. You have full control of your data, with no concerns about security. You can use our rendezvous/relay server, [set up your own](https://rustdesk.com/server), or [write your own rendezvous/relay server](https://github.com/rustdesk/rustdesk-server-demo).

RustDesk welcomes contribution from everyone. See [CONTRIBUTING.md](docs/CONTRIBUTING.md) for help getting started.
[**FAQ**](https://github.com/rustdesk/rustdesk/wiki/FAQ)
[**BINARY DOWNLOAD**](https://github.com/rustdesk/rustdesk/releases)
[**NIGHTLY BUILD**](https://github.com/rustdesk/rustdesk/releases/tag/nightly)
[<img src="https://f-droid.org/badge/get-it-on.png"
alt="Get it on F-Droid"
height="80">](https://f-droid.org/en/packages/com.carriez.flutter_hbb)
[<img src="https://flathub.org/api/badge?svg&locale=en"
alt="Get it on Flathub"
height="80">](https://flathub.org/apps/com.rustdesk.RustDesk)
## Dependencies
Desktop versions use Flutter or Sciter (deprecated) for GUI, this tutorial is for Sciter only, since it is easier and more friendly to start. Check out our [CI](https://github.com/rustdesk/rustdesk/blob/master/.github/workflows/flutter-build.yml) for building Flutter version.
Please download Sciter dynamic library yourself.
[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) |
[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) |
[macOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib)
## Raw Steps to build
- Prepare your Rust development env and C++ build env
- Install [vcpkg](https://github.com/microsoft/vcpkg), and set `VCPKG_ROOT` env variable correctly
- Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static
- Linux/macOS: vcpkg install libvpx libyuv opus aom
- run `cargo run`
## [Build](https://rustdesk.com/docs/en/dev/build/)
## How to Build on Linux
### Ubuntu 18 (Debian 10)
```sh
sudo apt install -y zip g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev \
libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake make \
libclang-dev ninja-build libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libpam0g-dev
```
### openSUSE Tumbleweed
```sh
sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel pam-devel
```
### Fedora 28 (CentOS 8)
```sh
sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel gstreamer1-devel gstreamer1-plugins-base-devel pam-devel
```
### Arch (Manjaro)
```sh
sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire
```
### Install vcpkg
```sh
git clone https://github.com/microsoft/vcpkg
cd vcpkg
git checkout 2023.04.15
cd ..
vcpkg/bootstrap-vcpkg.sh
export VCPKG_ROOT=$HOME/vcpkg
vcpkg/vcpkg install libvpx libyuv opus aom
```
### Fix libvpx (For Fedora)
```sh
cd vcpkg/buildtrees/libvpx/src
cd *
./configure
sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile
sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile
make
cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/
cd
```
### Build
```sh
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
git clone --recurse-submodules https://github.com/rustdesk/rustdesk
cd rustdesk
mkdir -p target/debug
wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so
mv libsciter-gtk.so target/debug
VCPKG_ROOT=$HOME/vcpkg cargo run
```
## How to build with Docker
Begin by cloning the repository and building the Docker container:
```sh
git clone https://github.com/rustdesk/rustdesk
cd rustdesk
git submodule update --init --recursive
docker build -t "rustdesk-builder" .
```
Then, each time you need to build the application, run the following command:
```sh
docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder
```
Note that the first build may take longer before dependencies are cached, subsequent builds will be faster. Additionally, if you need to specify different arguments to the build command, you may do so at the end of the command in the `<OPTIONAL-ARGS>` position. For instance, if you wanted to build an optimized release version, you would run the command above followed by `--release`. The resulting executable will be available in the target folder on your system, and can be run with:
```sh
target/debug/rustdesk
```
Or, if you're running a release executable:
```sh
target/release/rustdesk
```
Please ensure that you run these commands from the root of the RustDesk repository, or the application may not find the required resources. Also note that other cargo subcommands such as `install` or `run` are not currently supported via this method as they would install or run the program inside the container instead of the host.
## File Structure
- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: video codec, config, tcp/udp wrapper, protobuf, fs functions for file transfer, and some other utility functions
- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: screen capture
- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: platform specific keyboard/mouse control
- **[libs/clipboard](https://github.com/rustdesk/rustdesk/tree/master/libs/clipboard)**: file copy and paste implementation for Windows, Linux, macOS.
- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: obsolete Sciter UI (deprecated)
- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: audio/clipboard/input/video services, and network connections
- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: start a peer connection
- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: Communicate with [rustdesk-server](https://github.com/rustdesk/rustdesk-server), wait for remote direct (TCP hole punching) or relayed connection
- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: platform specific code
- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: Flutter code for desktop and mobile
- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/v1/js)**: JavaScript for Flutter web client
## Screenshots




================================================
FILE: appimage/AppImageBuilder-aarch64.yml
================================================
# appimage-builder recipe see https://appimage-builder.readthedocs.io for details
version: 1
script:
- rm -rf ./AppDir || true
- bsdtar -zxvf rustdesk.deb
- tar -xvf ./data.tar.xz
- mkdir ./AppDir
- mv ./usr ./AppDir/usr
# 32x32 icon
- for i in {32,64,128}; do mkdir -p ./AppDir/usr/share/icons/hicolor/$i\x$i/apps/; cp ../res/$i\x$i.png ./AppDir/usr/share/icons/hicolor/$i\x$i/apps/rustdesk.png; done
- mkdir -p ./AppDir/usr/share/icons/hicolor/scalable/apps/; cp ../res/scalable.svg ./AppDir/usr/share/icons/hicolor/scalable/apps/rustdesk.svg
# desktop file
# - sed -i "s/Icon=\/usr\/share\/rustdesk\/files\/rustdesk.png/Icon=rustdesk/g" ./AppDir/usr/share/applications/rustdesk.desktop
- rm -rf ./AppDir/usr/share/applications
AppDir:
path: ./AppDir
app_info:
id: rustdesk
name: rustdesk
icon: rustdesk
version: 1.4.6
exec: usr/share/rustdesk/rustdesk
exec_args: $@
apt:
arch:
- arm64
allow_unauthenticated: true
sources:
- sourceline: deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ focal main restricted universe multiverse
key_url: 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3b4fe6acc0b21f32'
- sourceline: deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ focal-updates main restricted universe multiverse
key_url: 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3b4fe6acc0b21f32'
- sourceline: deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ focal-backports main restricted
universe multiverse
key_url: 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3b4fe6acc0b21f32'
- sourceline: deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ focal-security main restricted
universe multiverse
key_url: 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3b4fe6acc0b21f32'
include:
- libc6:arm64
- libgtk-3-0
- libxcb-randr0
- libxdo3
- libxfixes3
- libxcb-shape0
- libxcb-xfixes0
- libasound2
- libsystemd0
- curl
- libva2
- libva-drm2
- libva-x11-2
- libgstreamer-plugins-base1.0-0
- gstreamer1.0-pipewire
- libwayland-client0
- libwayland-cursor0
- libwayland-egl1
- libpulse0
- packagekit-gtk3-module
- libcanberra-gtk3-module
- libpam0g
- libdrm2
exclude:
- humanity-icon-theme
- hicolor-icon-theme
- adwaita-icon-theme
- ubuntu-mono
files:
include: []
exclude:
- usr/share/man
- usr/share/doc/*/README.*
- usr/share/doc/*/changelog.*
- usr/share/doc/*/NEWS.*
- usr/share/doc/*/TODO.*
runtime:
env:
GIO_MODULE_DIR: /lib64/gio/modules:/usr/lib/aarch64-linux-gnu/gio/modules:$APPDIR/usr/lib/aarch64-linux-gnu/gio/modules
GDK_BACKEND: x11
APPDIR_LIBRARY_PATH: /lib64:/usr/lib/aarch64-linux-gnu:$APPDIR/lib/aarch64-linux-gnu:$APPDIR/lib/aarch64-linux-gnu/security:$APPDIR/lib/systemd:$APPDIR/usr/lib/aarch64-linux-gnu:$APPDIR/usr/lib/aarch64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders:$APPDIR/usr/lib/aarch64-linux-gnu/gstreamer-1.0:$APPDIR/usr/lib/aarch64-linux-gnu/gtk-3.0/3.0.0/immodules:$APPDIR/usr/lib/aarch64-linux-gnu/gtk-3.0/3.0.0/printbackends:$APPDIR/usr/lib/aarch64-linux-gnu/krb5/plugins/preauth:$APPDIR/usr/lib/aarch64-linux-gnu/libcanberra-0.30:$APPDIR/usr/lib/aarch64-linux-gnu/pulseaudio:$APPDIR/usr/lib/aarch64-linux-gnu/sasl2:$APPDIR/usr/lib/aarch64-linux-gnu/vdpau:$APPDIR/usr/share/rustdesk/lib:$APPDIR/lib/aarch64
GST_PLUGIN_PATH: /lib64/gstreamer-1.0:/usr/lib/aarch64-linux-gnu/gstreamer-1.0:$APPDIR/usr/lib/aarch64-linux-gnu/gstreamer-1.0
GST_PLUGIN_SYSTEM_PATH: /lib64/gstreamer-1.0:/usr/lib/aarch64-linux-gnu/gstreamer-1.0:$APPDIR/usr/lib/aarch64-linux-gnu/gstreamer-1.0
test:
fedora-30:
image: appimagecrafters/tests-env:fedora-30
command: ./AppRun
debian-stable:
image: appimagecrafters/tests-env:debian-stable
command: ./AppRun
archlinux-latest:
image: appimagecrafters/tests-env:archlinux-latest
command: ./AppRun
centos-7:
image: appimagecrafters/tests-env:centos-7
command: ./AppRun
ubuntu-xenial:
image: appimagecrafters/tests-env:ubuntu-xenial
command: ./AppRun
AppImage:
arch: aarch64
update-information: guess
comp: gzip
================================================
FILE: appimage/AppImageBuilder-x86_64.yml
================================================
# appimage-builder recipe see https://appimage-builder.readthedocs.io for details
version: 1
script:
- rm -rf ./AppDir || true
- bsdtar -zxvf rustdesk.deb
- tar -xvf ./data.tar.xz
- mkdir ./AppDir
- mv ./usr ./AppDir/usr
# 32x32 icon
- for i in {32,64,128}; do mkdir -p ./AppDir/usr/share/icons/hicolor/$i\x$i/apps/; cp ../res/$i\x$i.png ./AppDir/usr/share/icons/hicolor/$i\x$i/apps/rustdesk.png; done
- mkdir -p ./AppDir/usr/share/icons/hicolor/scalable/apps/; cp ../res/scalable.svg ./AppDir/usr/share/icons/hicolor/scalable/apps/rustdesk.svg
# desktop file
# - sed -i "s/Icon=\/usr\/share\/rustdesk\/files\/rustdesk.png/Icon=rustdesk/g" ./AppDir/usr/share/applications/rustdesk.desktop
- rm -rf ./AppDir/usr/share/applications
AppDir:
path: ./AppDir
app_info:
id: rustdesk
name: rustdesk
icon: rustdesk
version: 1.4.6
exec: usr/share/rustdesk/rustdesk
exec_args: $@
apt:
arch:
- amd64
allow_unauthenticated: true
sources:
- sourceline: deb http://archive.ubuntu.com/ubuntu/ focal main restricted
- sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-updates main restricted
- sourceline: deb http://archive.ubuntu.com/ubuntu/ focal universe
- sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-updates universe
- sourceline: deb http://archive.ubuntu.com/ubuntu/ focal multiverse
- sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-updates multiverse
- sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-backports main restricted
universe multiverse
- sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-security main restricted
universe multiverse
include:
# https://github.com/rustdesk/rustdesk/issues/9103
# Because of APPDIR_LIBRARY_PATH, this libc6 is not used, use LD_PRELOAD: $APPDIR/usr/lib/x86_64-linux-gnu/libc.so.6 may help, If you have time, please have a try.
# We modify APPDIR_LIBRARY_PATH to use system lib first because gst crashed if not doing so, but you can try to change it.
- libc6:amd64
- libgtk-3-0
- libxcb-randr0
- libxdo3
- libxfixes3
- libxcb-shape0
- libxcb-xfixes0
- libasound2
- libsystemd0
- curl
- libva2
- libva-drm2
- libva-x11-2
- libgstreamer-plugins-base1.0-0
- gstreamer1.0-pipewire
- libwayland-client0
- libwayland-cursor0
- libwayland-egl1
- libpulse0
- packagekit-gtk3-module
- libcanberra-gtk3-module
- libpam0g
- libdrm2
exclude:
- humanity-icon-theme
- hicolor-icon-theme
- adwaita-icon-theme
- ubuntu-mono
files:
include: []
exclude:
- usr/share/man
- usr/share/doc/*/README.*
- usr/share/doc/*/changelog.*
- usr/share/doc/*/NEWS.*
- usr/share/doc/*/TODO.*
runtime:
env:
GIO_MODULE_DIR: /lib64/gio/modules:/usr/lib/x86_64-linux-gnu/gio/modules:$APPDIR/usr/lib/x86_64-linux-gnu/gio/modules
GDK_BACKEND: x11
APPDIR_LIBRARY_PATH: /lib64:/usr/lib/x86_64-linux-gnu:$APPDIR/lib/x86_64-linux-gnu:$APPDIR/lib/x86_64-linux-gnu/security:$APPDIR/lib/systemd:$APPDIR/usr/lib/x86_64-linux-gnu:$APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders:$APPDIR/usr/lib/x86_64-linux-gnu/gstreamer-1.0:$APPDIR/usr/lib/x86_64-linux-gnu/gtk-3.0/3.0.0/immodules:$APPDIR/usr/lib/x86_64-linux-gnu/gtk-3.0/3.0.0/printbackends:$APPDIR/usr/lib/x86_64-linux-gnu/krb5/plugins/preauth:$APPDIR/usr/lib/x86_64-linux-gnu/libcanberra-0.30:$APPDIR/usr/lib/x86_64-linux-gnu/pulseaudio:$APPDIR/usr/lib/x86_64-linux-gnu/sasl2:$APPDIR/usr/lib/x86_64-linux-gnu/vdpau:$APPDIR/usr/share/rustdesk/lib:$APPDIR/lib/x86_64
GST_PLUGIN_PATH: /lib64/gstreamer-1.0:/usr/lib/x86_64-linux-gnu/gstreamer-1.0:$APPDIR/usr/lib/x86_64-linux-gnu/gstreamer-1.0
GST_PLUGIN_SYSTEM_PATH: /lib64/gstreamer-1.0:/usr/lib/x86_64-linux-gnu/gstreamer-1.0:$APPDIR/usr/lib/x86_64-linux-gnu/gstreamer-1.0
test:
fedora-30:
image: appimagecrafters/tests-env:fedora-30
command: ./AppRun
debian-stable:
image: appimagecrafters/tests-env:debian-stable
command: ./AppRun
archlinux-latest:
image: appimagecrafters/tests-env:archlinux-latest
command: ./AppRun
centos-7:
image: appimagecrafters/tests-env:centos-7
command: ./AppRun
ubuntu-xenial:
image: appimagecrafters/tests-env:ubuntu-xenial
command: ./AppRun
AppImage:
arch: x86_64
update-information: guess
comp: gzip
================================================
FILE: build.py
================================================
#!/usr/bin/env python3
import os
import pathlib
import platform
import zipfile
import urllib.request
import shutil
import hashlib
import argparse
import sys
from pathlib import Path
windows = platform.platform().startswith('Windows')
osx = platform.platform().startswith(
'Darwin') or platform.platform().startswith("macOS")
hbb_name = 'rustdesk' + ('.exe' if windows else '')
exe_path = 'target/release/' + hbb_name
if windows:
flutter_build_dir = 'build/windows/x64/runner/Release/'
elif osx:
flutter_build_dir = 'build/macos/Build/Products/Release/'
else:
flutter_build_dir = 'build/linux/x64/release/bundle/'
flutter_build_dir_2 = f'flutter/{flutter_build_dir}'
skip_cargo = False
def get_deb_arch() -> str:
custom_arch = os.environ.get("DEB_ARCH")
if custom_arch is None:
return "amd64"
return custom_arch
def get_deb_extra_depends() -> str:
custom_arch = os.environ.get("DEB_ARCH")
if custom_arch == "armhf": # for arm32v7 libsciter-gtk.so
return ", libatomic1"
return ""
def system2(cmd):
exit_code = os.system(cmd)
if exit_code != 0:
sys.stderr.write(f"Error occurred when executing: `{cmd}`. Exiting.\n")
sys.exit(-1)
def get_version():
with open("Cargo.toml", encoding="utf-8") as fh:
for line in fh:
if line.startswith("version"):
return line.replace("version", "").replace("=", "").replace('"', '').strip()
return ''
def parse_rc_features(feature):
available_features = {}
apply_features = {}
if not feature:
feature = []
def platform_check(platforms):
if windows:
return 'windows' in platforms
elif osx:
return 'osx' in platforms
else:
return 'linux' in platforms
def get_all_features():
features = []
for (feat, feat_info) in available_features.items():
if platform_check(feat_info['platform']):
features.append(feat)
return features
if isinstance(feature, str) and feature.upper() == 'ALL':
return get_all_features()
elif isinstance(feature, list):
if windows:
# download third party is deprecated, we use github ci instead.
# feature.append('PrivacyMode')
pass
for feat in feature:
if isinstance(feat, str) and feat.upper() == 'ALL':
return get_all_features()
if feat in available_features:
if platform_check(available_features[feat]['platform']):
apply_features[feat] = available_features[feat]
else:
print(f'Unrecognized feature {feat}')
return apply_features
else:
raise Exception(f'Unsupported features param {feature}')
def make_parser():
parser = argparse.ArgumentParser(description='Build script.')
parser.add_argument(
'-f',
'--feature',
dest='feature',
metavar='N',
type=str,
nargs='+',
default='',
help='Integrate features, windows only.'
'Available: [Not used for now]. Special value is "ALL" and empty "". Default is empty.')
parser.add_argument('--flutter', action='store_true',
help='Build flutter package', default=False)
parser.add_argument(
'--hwcodec',
action='store_true',
help='Enable feature hwcodec' + (
'' if windows or osx else ', need libva-dev.')
)
parser.add_argument(
'--vram',
action='store_true',
help='Enable feature vram, only available on windows now.'
)
parser.add_argument(
'--portable',
action='store_true',
help='Build windows portable'
)
parser.add_argument(
'--unix-file-copy-paste',
action='store_true',
help='Build with unix file copy paste feature'
)
parser.add_argument(
'--skip-cargo',
action='store_true',
help='Skip cargo build process, only flutter version + Linux supported currently'
)
if windows:
parser.add_argument(
'--skip-portable-pack',
action='store_true',
help='Skip packing, only flutter version + Windows supported'
)
parser.add_argument(
"--package",
type=str
)
if osx:
parser.add_argument(
'--screencapturekit',
action='store_true',
help='Enable feature screencapturekit'
)
return parser
# Generate build script for docker
#
# it assumes all build dependencies are installed in environments
# Note: do not use it in bare metal, or may break build environments
def generate_build_script_for_docker():
with open("/tmp/build.sh", "w") as f:
f.write('''
#!/bin/bash
# environment
export CPATH="$(clang -v 2>&1 | grep "Selected GCC installation: " | cut -d' ' -f4-)/include"
# flutter
pushd /opt
wget https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.0.5-stable.tar.xz
tar -xvf flutter_linux_3.0.5-stable.tar.xz
export PATH=`pwd`/flutter/bin:$PATH
popd
# flutter_rust_bridge
dart pub global activate ffigen --version 5.0.1
pushd /tmp && git clone https://github.com/SoLongAndThanksForAllThePizza/flutter_rust_bridge --depth=1 && popd
pushd /tmp/flutter_rust_bridge/frb_codegen && cargo install --path . && popd
pushd flutter && flutter pub get && popd
~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart
# install vcpkg
pushd /opt
export VCPKG_ROOT=`pwd`/vcpkg
git clone https://github.com/microsoft/vcpkg
vcpkg/bootstrap-vcpkg.sh
popd
$VCPKG_ROOT/vcpkg install --x-install-root="$VCPKG_ROOT/installed"
# build rustdesk
./build.py --flutter --hwcodec
''')
system2("chmod +x /tmp/build.sh")
system2("bash /tmp/build.sh")
# Downloading third party resources is deprecated.
# We can use this function in an offline build environment.
# Even in an online environment, we recommend building third-party resources yourself.
def download_extract_features(features, res_dir):
import re
proxy = ''
def req(url):
if not proxy:
re
gitextract_if2u_xfk/ ├── .cargo/ │ └── config.toml ├── .gitattributes ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yaml │ │ └── config.yml │ ├── dependabot.yml │ ├── patches/ │ │ └── flutter_3.24.4_dropdown_menu_enableFilter.diff │ └── workflows/ │ ├── bridge.yml │ ├── ci.yml │ ├── clear-cache.yml │ ├── fdroid.yml │ ├── flutter-build.yml │ ├── flutter-ci.yml │ ├── flutter-nightly.yml │ ├── flutter-tag.yml │ ├── playground.yml │ ├── third-party-RustDeskTempTopMostWindow.yml │ └── winget.yml ├── .gitignore ├── .gitmodules ├── CLAUDE.md ├── Cargo.toml ├── Dockerfile ├── LICENCE ├── README.md ├── appimage/ │ ├── AppImageBuilder-aarch64.yml │ └── AppImageBuilder-x86_64.yml ├── build.py ├── build.rs ├── docs/ │ ├── CODE_OF_CONDUCT-DE.md │ ├── CODE_OF_CONDUCT-JP.md │ ├── CODE_OF_CONDUCT-KR.md │ ├── CODE_OF_CONDUCT-NL.md │ ├── CODE_OF_CONDUCT-NO.md │ ├── CODE_OF_CONDUCT-PL.md │ ├── CODE_OF_CONDUCT-RO.md │ ├── CODE_OF_CONDUCT-RU.md │ ├── CODE_OF_CONDUCT-TR.md │ ├── CODE_OF_CONDUCT-ZH.md │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING-DE.md │ ├── CONTRIBUTING-ID.md │ ├── CONTRIBUTING-IT.md │ ├── CONTRIBUTING-JP.md │ ├── CONTRIBUTING-KR.md │ ├── CONTRIBUTING-NL.md │ ├── CONTRIBUTING-NO.md │ ├── CONTRIBUTING-PL.md │ ├── CONTRIBUTING-RO.md │ ├── CONTRIBUTING-RU.md │ ├── CONTRIBUTING-TR.md │ ├── CONTRIBUTING-ZH.md │ ├── CONTRIBUTING.md │ ├── README-AR.md │ ├── README-CS.md │ ├── README-DA.md │ ├── README-DE.md │ ├── README-EO.md │ ├── README-ES.md │ ├── README-FA.md │ ├── README-FI.md │ ├── README-FR.md │ ├── README-GR.md │ ├── README-HU.md │ ├── README-ID.md │ ├── README-IT.md │ ├── README-JP.md │ ├── README-KR.md │ ├── README-ML.md │ ├── README-NL.md │ ├── README-NO.md │ ├── README-PL.md │ ├── README-PTBR.md │ ├── README-RO.md │ ├── README-RU.md │ ├── README-TR.md │ ├── README-UA.md │ ├── README-VN.md │ ├── README-ZH.md │ ├── SECURITY-DE.md │ ├── SECURITY-IT.md │ ├── SECURITY-JP.md │ ├── SECURITY-KR.md │ ├── SECURITY-NL.md │ ├── SECURITY-NO.md │ ├── SECURITY-PL.md │ ├── SECURITY-RO.md │ ├── SECURITY-TR.md │ └── SECURITY.md ├── entrypoint.sh ├── examples/ │ └── ipc.rs ├── fastlane/ │ └── metadata/ │ └── android/ │ ├── en-US/ │ │ ├── full_description.txt │ │ └── short_description.txt │ ├── fr-FR/ │ │ ├── full_description.txt │ │ └── short_description.txt │ ├── nl-NL/ │ │ ├── full_description.txt │ │ └── short_description.txt │ └── zh-CN/ │ ├── full_description.txt │ └── short_description.txt ├── flatpak/ │ ├── com.rustdesk.RustDesk.metainfo.xml │ └── rustdesk.json ├── flutter/ │ ├── .gitattributes │ ├── .gitignore │ ├── .metadata │ ├── README.md │ ├── analysis_options.yaml │ ├── android/ │ │ ├── .gitignore │ │ ├── app/ │ │ │ ├── build.gradle │ │ │ ├── proguard-rules │ │ │ └── src/ │ │ │ ├── debug/ │ │ │ │ └── AndroidManifest.xml │ │ │ ├── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ ├── kotlin/ │ │ │ │ │ ├── com/ │ │ │ │ │ │ └── carriez/ │ │ │ │ │ │ └── flutter_hbb/ │ │ │ │ │ │ ├── AudioRecordHandle.kt │ │ │ │ │ │ ├── BootReceiver.kt │ │ │ │ │ │ ├── FloatingWindowService.kt │ │ │ │ │ │ ├── InputService.kt │ │ │ │ │ │ ├── KeyboardKeyEventMapper.kt │ │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ │ ├── MainApplication.kt │ │ │ │ │ │ ├── MainService.kt │ │ │ │ │ │ ├── PermissionRequestTransparentActivity.kt │ │ │ │ │ │ ├── RdClipboardManager.kt │ │ │ │ │ │ ├── VolumeController.kt │ │ │ │ │ │ └── common.kt │ │ │ │ │ └── ffi.kt │ │ │ │ └── res/ │ │ │ │ ├── drawable/ │ │ │ │ │ ├── check_blue.xml │ │ │ │ │ ├── close_red.xml │ │ │ │ │ ├── floating_window.xml │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── drawable-v21/ │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── mipmap-anydpi-v26/ │ │ │ │ │ ├── ic_launcher.xml │ │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── values/ │ │ │ │ │ ├── colors.xml │ │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ │ ├── strings.xml │ │ │ │ │ └── styles.xml │ │ │ │ ├── values-night/ │ │ │ │ │ └── styles.xml │ │ │ │ └── xml/ │ │ │ │ └── accessibility_service_config.xml │ │ │ └── profile/ │ │ │ └── AndroidManifest.xml │ │ ├── build.gradle │ │ ├── gradle/ │ │ │ └── wrapper/ │ │ │ └── gradle-wrapper.properties │ │ ├── gradle.properties │ │ └── settings.gradle │ ├── build_android.sh │ ├── build_android_deps.sh │ ├── build_fdroid.sh │ ├── build_ios.sh │ ├── ios/ │ │ ├── .gitignore │ │ ├── Flutter/ │ │ │ ├── AppFrameworkInfo.plist │ │ │ ├── Debug.xcconfig │ │ │ └── Release.xcconfig │ │ ├── Podfile │ │ ├── Runner/ │ │ │ ├── AppDelegate.swift │ │ │ ├── Assets.xcassets/ │ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── LaunchImage.imageset/ │ │ │ │ ├── Contents.json │ │ │ │ └── README.md │ │ │ ├── Base.lproj/ │ │ │ │ ├── LaunchScreen.storyboard │ │ │ │ └── Main.storyboard │ │ │ ├── GoogleService-Info.plist │ │ │ ├── Info.plist │ │ │ ├── Runner-Bridging-Header.h │ │ │ └── Runner.entitlements │ │ ├── Runner.xcodeproj/ │ │ │ ├── project.pbxproj │ │ │ ├── project.xcworkspace/ │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ └── xcshareddata/ │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ └── WorkspaceSettings.xcsettings │ │ │ └── xcshareddata/ │ │ │ └── xcschemes/ │ │ │ └── Runner.xcscheme │ │ ├── Runner.xcworkspace/ │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata/ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ │ └── exportOptions.plist │ ├── ios_arm64.sh │ ├── ios_x64.sh │ ├── lib/ │ │ ├── common/ │ │ │ ├── formatter/ │ │ │ │ └── id_formatter.dart │ │ │ ├── hbbs/ │ │ │ │ └── hbbs.dart │ │ │ ├── shared_state.dart │ │ │ └── widgets/ │ │ │ ├── address_book.dart │ │ │ ├── animated_rotation_widget.dart │ │ │ ├── audio_input.dart │ │ │ ├── autocomplete.dart │ │ │ ├── chat_page.dart │ │ │ ├── connection_page_title.dart │ │ │ ├── custom_password.dart │ │ │ ├── custom_scale_base.dart │ │ │ ├── dialog.dart │ │ │ ├── gestures.dart │ │ │ ├── login.dart │ │ │ ├── my_group.dart │ │ │ ├── overlay.dart │ │ │ ├── peer_card.dart │ │ │ ├── peer_tab_page.dart │ │ │ ├── peers_view.dart │ │ │ ├── remote_input.dart │ │ │ ├── setting_widgets.dart │ │ │ └── toolbar.dart │ │ ├── common.dart │ │ ├── consts.dart │ │ ├── desktop/ │ │ │ ├── pages/ │ │ │ │ ├── connection_page.dart │ │ │ │ ├── desktop_home_page.dart │ │ │ │ ├── desktop_setting_page.dart │ │ │ │ ├── desktop_tab_page.dart │ │ │ │ ├── file_manager_page.dart │ │ │ │ ├── file_manager_tab_page.dart │ │ │ │ ├── install_page.dart │ │ │ │ ├── port_forward_page.dart │ │ │ │ ├── port_forward_tab_page.dart │ │ │ │ ├── remote_page.dart │ │ │ │ ├── remote_tab_page.dart │ │ │ │ ├── server_page.dart │ │ │ │ ├── terminal_connection_manager.dart │ │ │ │ ├── terminal_page.dart │ │ │ │ ├── terminal_tab_page.dart │ │ │ │ ├── view_camera_page.dart │ │ │ │ └── view_camera_tab_page.dart │ │ │ ├── screen/ │ │ │ │ ├── desktop_file_transfer_screen.dart │ │ │ │ ├── desktop_port_forward_screen.dart │ │ │ │ ├── desktop_remote_screen.dart │ │ │ │ ├── desktop_terminal_screen.dart │ │ │ │ └── desktop_view_camera_screen.dart │ │ │ └── widgets/ │ │ │ ├── button.dart │ │ │ ├── dragable_divider.dart │ │ │ ├── kb_layout_type_chooser.dart │ │ │ ├── list_search_action_listener.dart │ │ │ ├── material_mod_popup_menu.dart │ │ │ ├── menu_button.dart │ │ │ ├── popup_menu.dart │ │ │ ├── refresh_wrapper.dart │ │ │ ├── remote_toolbar.dart │ │ │ ├── tabbar_widget.dart │ │ │ ├── titlebar_widget.dart │ │ │ └── update_progress.dart │ │ ├── main.dart │ │ ├── mobile/ │ │ │ ├── pages/ │ │ │ │ ├── connection_page.dart │ │ │ │ ├── file_manager_page.dart │ │ │ │ ├── home_page.dart │ │ │ │ ├── remote_page.dart │ │ │ │ ├── scan_page.dart │ │ │ │ ├── server_page.dart │ │ │ │ ├── settings_page.dart │ │ │ │ ├── terminal_page.dart │ │ │ │ └── view_camera_page.dart │ │ │ └── widgets/ │ │ │ ├── custom_scale_widget.dart │ │ │ ├── dialog.dart │ │ │ ├── floating_mouse.dart │ │ │ ├── floating_mouse_widgets.dart │ │ │ └── gesture_help.dart │ │ ├── models/ │ │ │ ├── ab_model.dart │ │ │ ├── chat_model.dart │ │ │ ├── cm_file_model.dart │ │ │ ├── desktop_render_texture.dart │ │ │ ├── file_model.dart │ │ │ ├── group_model.dart │ │ │ ├── input_model.dart │ │ │ ├── model.dart │ │ │ ├── native_model.dart │ │ │ ├── peer_model.dart │ │ │ ├── peer_tab_model.dart │ │ │ ├── platform_model.dart │ │ │ ├── printer_model.dart │ │ │ ├── relative_mouse_model.dart │ │ │ ├── server_model.dart │ │ │ ├── state_model.dart │ │ │ ├── terminal_model.dart │ │ │ ├── user_model.dart │ │ │ └── web_model.dart │ │ ├── native/ │ │ │ ├── common.dart │ │ │ ├── custom_cursor.dart │ │ │ └── win32.dart │ │ ├── plugin/ │ │ │ ├── common.dart │ │ │ ├── event.dart │ │ │ ├── handlers.dart │ │ │ ├── manager.dart │ │ │ ├── model.dart │ │ │ ├── ui_manager.dart │ │ │ ├── utils/ │ │ │ │ └── dialogs.dart │ │ │ └── widgets/ │ │ │ ├── desc_ui.dart │ │ │ └── desktop_settings.dart │ │ ├── utils/ │ │ │ ├── event_loop.dart │ │ │ ├── http_service.dart │ │ │ ├── image.dart │ │ │ ├── multi_window_manager.dart │ │ │ ├── platform_channel.dart │ │ │ ├── relative_mouse_accumulator.dart │ │ │ └── scale.dart │ │ └── web/ │ │ ├── bridge.dart │ │ ├── common.dart │ │ ├── custom_cursor.dart │ │ ├── dummy.dart │ │ ├── plugin/ │ │ │ └── handlers.dart │ │ ├── settings_page.dart │ │ ├── texture_rgba_renderer.dart │ │ ├── web_unique.dart │ │ └── win32.dart │ ├── linux/ │ │ ├── .gitignore │ │ ├── CMakeLists.txt │ │ ├── bump_mouse.cc │ │ ├── bump_mouse.h │ │ ├── bump_mouse_x11.cc │ │ ├── bump_mouse_x11.h │ │ ├── flutter/ │ │ │ └── CMakeLists.txt │ │ ├── main.cc │ │ ├── my_application.cc │ │ ├── my_application.h │ │ ├── wayland_shortcuts_inhibit.cc │ │ └── wayland_shortcuts_inhibit.h │ ├── macos/ │ │ ├── .gitignore │ │ ├── Flutter/ │ │ │ ├── Flutter-Debug.xcconfig │ │ │ └── Flutter-Release.xcconfig │ │ ├── Podfile │ │ ├── Runner/ │ │ │ ├── AppDelegate.swift │ │ │ ├── AppIcon.icns │ │ │ ├── Base.lproj/ │ │ │ │ └── MainMenu.xib │ │ │ ├── Configs/ │ │ │ │ ├── AppInfo.xcconfig │ │ │ │ ├── Debug.xcconfig │ │ │ │ ├── Release.xcconfig │ │ │ │ └── Warnings.xcconfig │ │ │ ├── DebugProfile.entitlements │ │ │ ├── Info.plist │ │ │ ├── MainFlutterWindow.swift │ │ │ └── Release.entitlements │ │ ├── Runner.xcodeproj/ │ │ │ ├── project.pbxproj │ │ │ ├── project.xcworkspace/ │ │ │ │ └── xcshareddata/ │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ └── xcshareddata/ │ │ │ └── xcschemes/ │ │ │ └── Runner.xcscheme │ │ └── Runner.xcworkspace/ │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata/ │ │ └── IDEWorkspaceChecks.plist │ ├── ndk_arm.sh │ ├── ndk_arm64.sh │ ├── ndk_x64.sh │ ├── ndk_x86.sh │ ├── pubspec.yaml │ ├── run.sh │ ├── test/ │ │ └── cm_test.dart │ └── windows/ │ ├── .gitignore │ ├── CMakeLists.txt │ ├── flutter/ │ │ └── CMakeLists.txt │ └── runner/ │ ├── CMakeLists.txt │ ├── Runner.rc │ ├── flutter_window.cpp │ ├── flutter_window.h │ ├── main.cpp │ ├── resource.h │ ├── runner.exe.manifest │ ├── utils.cpp │ ├── utils.h │ ├── win32_desktop.cpp │ ├── win32_desktop.h │ ├── win32_window.cpp │ └── win32_window.h ├── libs/ │ ├── clipboard/ │ │ ├── Cargo.toml │ │ ├── README.md │ │ ├── build.rs │ │ └── src/ │ │ ├── cliprdr.h │ │ ├── context_send.rs │ │ ├── lib.rs │ │ ├── platform/ │ │ │ ├── mod.rs │ │ │ ├── unix/ │ │ │ │ ├── filetype.rs │ │ │ │ ├── fuse/ │ │ │ │ │ ├── cs.rs │ │ │ │ │ └── mod.rs │ │ │ │ ├── local_file.rs │ │ │ │ ├── macos/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── item_data_provider.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── paste_observer.rs │ │ │ │ │ ├── paste_task.rs │ │ │ │ │ └── pasteboard_context.rs │ │ │ │ ├── mod.rs │ │ │ │ └── serv_files.rs │ │ │ └── windows.rs │ │ └── windows/ │ │ └── wf_cliprdr.c │ ├── enigo/ │ │ ├── .gitattributes │ │ ├── .github/ │ │ │ └── ISSUE_TEMPLATE/ │ │ │ ├── bug_report.md │ │ │ ├── feature_request.md │ │ │ └── question.md │ │ ├── .gitignore │ │ ├── .travis.yml │ │ ├── Cargo.toml │ │ ├── LICENSE │ │ ├── README.md │ │ ├── appveyor.yml │ │ ├── build.rs │ │ ├── examples/ │ │ │ ├── dsl.rs │ │ │ ├── key.rs │ │ │ ├── keyboard.rs │ │ │ ├── mouse.rs │ │ │ └── timer.rs │ │ ├── rustfmt.toml │ │ └── src/ │ │ ├── dsl.rs │ │ ├── lib.rs │ │ ├── linux/ │ │ │ ├── mod.rs │ │ │ ├── nix_impl.rs │ │ │ └── xdo.rs │ │ ├── macos/ │ │ │ ├── keycodes.rs │ │ │ ├── macos_impl.rs │ │ │ └── mod.rs │ │ └── win/ │ │ ├── keycodes.rs │ │ ├── mod.rs │ │ └── win_impl.rs │ ├── libxdo-sys-stub/ │ │ ├── Cargo.toml │ │ └── src/ │ │ └── lib.rs │ ├── portable/ │ │ ├── .gitignore │ │ ├── Cargo.toml │ │ ├── build.rs │ │ ├── generate.py │ │ ├── requirements.txt │ │ └── src/ │ │ ├── bin_reader.rs │ │ ├── main.rs │ │ └── ui.rs │ ├── remote_printer/ │ │ ├── Cargo.toml │ │ └── src/ │ │ ├── lib.rs │ │ └── setup/ │ │ ├── driver.rs │ │ ├── mod.rs │ │ ├── port.rs │ │ ├── printer.rs │ │ └── setup.rs │ ├── scrap/ │ │ ├── .gitignore │ │ ├── Cargo.toml │ │ ├── README.md │ │ ├── build.rs │ │ ├── examples/ │ │ │ ├── benchmark.rs │ │ │ ├── capture_mag.rs │ │ │ ├── ffplay.rs │ │ │ ├── list.rs │ │ │ ├── record-screen.rs │ │ │ └── screenshot.rs │ │ └── src/ │ │ ├── android/ │ │ │ ├── ffi.rs │ │ │ └── mod.rs │ │ ├── bindings/ │ │ │ ├── aom_ffi.h │ │ │ ├── vpx_ffi.h │ │ │ └── yuv_ffi.h │ │ ├── common/ │ │ │ ├── android.rs │ │ │ ├── aom.rs │ │ │ ├── camera.rs │ │ │ ├── codec.rs │ │ │ ├── convert.rs │ │ │ ├── dxgi.rs │ │ │ ├── hwcodec.rs │ │ │ ├── linux.rs │ │ │ ├── mediacodec.rs │ │ │ ├── mod.rs │ │ │ ├── quartz.rs │ │ │ ├── record.rs │ │ │ ├── vpx.rs │ │ │ ├── vpxcodec.rs │ │ │ ├── vram.rs │ │ │ ├── wayland.rs │ │ │ └── x11.rs │ │ ├── dxgi/ │ │ │ ├── gdi.rs │ │ │ ├── mag.rs │ │ │ └── mod.rs │ │ ├── lib.rs │ │ ├── quartz/ │ │ │ ├── capturer.rs │ │ │ ├── config.rs │ │ │ ├── display.rs │ │ │ ├── ffi.rs │ │ │ ├── frame.rs │ │ │ └── mod.rs │ │ ├── wayland/ │ │ │ ├── README.md │ │ │ ├── capturable.rs │ │ │ ├── display.rs │ │ │ ├── pipewire.rs │ │ │ ├── remote_desktop_portal.rs │ │ │ ├── request_portal.rs │ │ │ └── screencast_portal.rs │ │ ├── wayland.rs │ │ └── x11/ │ │ ├── capturer.rs │ │ ├── display.rs │ │ ├── ffi.rs │ │ ├── iter.rs │ │ ├── mod.rs │ │ └── server.rs │ └── virtual_display/ │ ├── Cargo.toml │ ├── README.md │ ├── dylib/ │ │ ├── Cargo.toml │ │ ├── README.md │ │ ├── build.rs │ │ ├── examples/ │ │ │ └── idd_controller.rs │ │ └── src/ │ │ ├── lib.rs │ │ └── win10/ │ │ ├── IddController.c │ │ ├── IddController.h │ │ ├── Public.h │ │ ├── idd.rs │ │ └── mod.rs │ ├── examples/ │ │ └── virtual_display_1.rs │ └── src/ │ └── lib.rs ├── res/ │ ├── DEBIAN/ │ │ ├── postinst │ │ ├── postrm │ │ ├── preinst │ │ └── prerm │ ├── PKGBUILD │ ├── ab.py │ ├── audits.py │ ├── bump.sh │ ├── device-groups.py │ ├── devices.py │ ├── fdroid/ │ │ └── patches/ │ │ ├── 0000-flutter-android-x86.patch │ │ └── 0001-x86-no-debuggable.patch │ ├── gen_icon.sh │ ├── inline-sciter.py │ ├── job.py │ ├── lang.py │ ├── manifest.xml │ ├── msi/ │ │ ├── .gitignore │ │ ├── CustomActions/ │ │ │ ├── Common.h │ │ │ ├── CustomActions.cpp │ │ │ ├── CustomActions.def │ │ │ ├── CustomActions.vcxproj │ │ │ ├── DeviceUtils.cpp │ │ │ ├── FirewallRules.cpp │ │ │ ├── ReadConfig.cpp │ │ │ ├── RemotePrinter.cpp │ │ │ ├── ServiceUtils.cpp │ │ │ ├── dllmain.cpp │ │ │ ├── framework.h │ │ │ ├── packages.config │ │ │ ├── pch.cpp │ │ │ └── pch.h │ │ ├── Package/ │ │ │ ├── Components/ │ │ │ │ ├── Folders.wxs │ │ │ │ ├── Regs.wxs │ │ │ │ └── RustDesk.wxs │ │ │ ├── Fragments/ │ │ │ │ ├── AddRemoveProperties.wxs │ │ │ │ ├── CustomActions.wxs │ │ │ │ ├── ShortcutProperties.wxs │ │ │ │ └── Upgrades.wxs │ │ │ ├── Includes.wxi │ │ │ ├── Language/ │ │ │ │ ├── Package.en-us.wxl │ │ │ │ └── WixExt_en-us.wxl │ │ │ ├── License.rtf │ │ │ ├── Package.wixproj │ │ │ ├── Package.wxs │ │ │ └── UI/ │ │ │ ├── AnotherApp.wxs │ │ │ ├── MyInstallDirDlg.wxs │ │ │ └── MyInstallDlg.wxs │ │ ├── README.md │ │ ├── msi.sln │ │ └── preprocess.py │ ├── osx-dist.sh │ ├── pacman_install │ ├── pam.d/ │ │ ├── rustdesk.debian │ │ └── rustdesk.suse │ ├── rpm-flutter-suse.spec │ ├── rpm-flutter.spec │ ├── rpm-suse.spec │ ├── rpm.spec │ ├── rustdesk-link.desktop │ ├── rustdesk.desktop │ ├── rustdesk.service │ ├── startwm.sh │ ├── strategies.py │ ├── user-groups.py │ ├── users.py │ ├── vcpkg/ │ │ ├── aom/ │ │ │ ├── aom-avx2.diff │ │ │ ├── aom-install.diff │ │ │ ├── aom-uninitialized-pointer.diff │ │ │ ├── portfile.cmake │ │ │ └── vcpkg.json │ │ ├── ffmpeg/ │ │ │ ├── 0001-create-lib-libraries.patch │ │ │ ├── 0002-fix-msvc-link.patch │ │ │ ├── 0003-fix-windowsinclude.patch │ │ │ ├── 0004-dependencies.patch │ │ │ ├── 0005-fix-nasm.patch │ │ │ ├── 0007-fix-lib-naming.patch │ │ │ ├── 0013-define-WINVER.patch │ │ │ ├── 0020-fix-aarch64-libswscale.patch │ │ │ ├── 0024-fix-osx-host-c11.patch │ │ │ ├── 0040-ffmpeg-add-av_stream_get_first_dts-for-chromium.patch │ │ │ ├── 0041-add-const-for-opengl-definition.patch │ │ │ ├── 0042-fix-arm64-linux.patch │ │ │ ├── 0043-fix-miss-head.patch │ │ │ ├── build.sh.in │ │ │ ├── patch/ │ │ │ │ ├── 0001-avcodec-amfenc-add-query_timeout-option-for-h264-hev.patch │ │ │ │ ├── 0002-libavcodec-amfenc-reconfig-when-bitrate-change.patch │ │ │ │ ├── 0004-videotoolbox-changing-bitrate.patch │ │ │ │ ├── 0005-mediacodec-changing-bitrate.patch │ │ │ │ ├── 0006-dlopen-libva.patch │ │ │ │ ├── 0007-fix-linux-configure.patch │ │ │ │ ├── 0008-remove-amf-loop-query.patch │ │ │ │ ├── 0009-fix-nvenc-reconfigure-blur.patch │ │ │ │ ├── 0010.disable-loading-DLLs-from-app-dir.patch │ │ │ │ ├── 0011-android-mediacodec-encode-align-64.patch │ │ │ │ └── 0012-fix-macos-big-sur-CVBufferCopyAttachments.patch │ │ │ ├── portfile.cmake │ │ │ ├── vcpkg-cmake-wrapper.cmake │ │ │ └── vcpkg.json │ │ ├── libvpx/ │ │ │ ├── 0003-add-uwp-v142-and-v143-support.patch │ │ │ ├── 0004-remove-library-suffixes.patch │ │ │ ├── portfile.cmake │ │ │ ├── unofficial-libvpx-config.cmake.in │ │ │ ├── vcpkg.json │ │ │ └── vpx.pc.in │ │ ├── libyuv/ │ │ │ ├── fix-cmakelists.patch │ │ │ ├── libyuv-config.cmake │ │ │ ├── portfile.cmake │ │ │ ├── usage │ │ │ ├── usage-msvc │ │ │ └── vcpkg.json │ │ ├── mfx-dispatch/ │ │ │ ├── 0003-upgrade-cmake-3.14.patch │ │ │ ├── fix-pkgconf.patch │ │ │ ├── fix-unresolved-symbol.patch │ │ │ ├── portfile.cmake │ │ │ └── vcpkg.json │ │ └── opus/ │ │ ├── fix-pkgconfig-version.patch │ │ ├── portfile.cmake │ │ └── vcpkg.json │ └── xorg.conf ├── src/ │ ├── auth_2fa.rs │ ├── cli.rs │ ├── client/ │ │ ├── file_trait.rs │ │ ├── helper.rs │ │ ├── io_loop.rs │ │ └── screenshot.rs │ ├── client.rs │ ├── clipboard.rs │ ├── clipboard_file.rs │ ├── common.rs │ ├── core_main.rs │ ├── custom_server.rs │ ├── flutter.rs │ ├── flutter_ffi.rs │ ├── hbbs_http/ │ │ ├── account.rs │ │ ├── downloader.rs │ │ ├── http_client.rs │ │ ├── record_upload.rs │ │ └── sync.rs │ ├── hbbs_http.rs │ ├── ipc.rs │ ├── kcp_stream.rs │ ├── keyboard.rs │ ├── lan.rs │ ├── lang/ │ │ ├── README.md │ │ ├── ar.rs │ │ ├── be.rs │ │ ├── bg.rs │ │ ├── ca.rs │ │ ├── cn.rs │ │ ├── cs.rs │ │ ├── da.rs │ │ ├── de.rs │ │ ├── el.rs │ │ ├── en.rs │ │ ├── eo.rs │ │ ├── es.rs │ │ ├── et.rs │ │ ├── eu.rs │ │ ├── fa.rs │ │ ├── fi.rs │ │ ├── fr.rs │ │ ├── ge.rs │ │ ├── he.rs │ │ ├── hr.rs │ │ ├── hu.rs │ │ ├── id.rs │ │ ├── it.rs │ │ ├── ja.rs │ │ ├── ko.rs │ │ ├── kz.rs │ │ ├── lt.rs │ │ ├── lv.rs │ │ ├── nb.rs │ │ ├── nl.rs │ │ ├── pl.rs │ │ ├── pt_PT.rs │ │ ├── ptbr.rs │ │ ├── ro.rs │ │ ├── ru.rs │ │ ├── sc.rs │ │ ├── sk.rs │ │ ├── sl.rs │ │ ├── sq.rs │ │ ├── sr.rs │ │ ├── sv.rs │ │ ├── ta.rs │ │ ├── template.rs │ │ ├── th.rs │ │ ├── tr.rs │ │ ├── tw.rs │ │ ├── uk.rs │ │ └── vi.rs │ ├── lang.rs │ ├── lib.rs │ ├── main.rs │ ├── naming.rs │ ├── platform/ │ │ ├── delegate.rs │ │ ├── gtk_sudo.rs │ │ ├── linux.rs │ │ ├── linux_desktop_manager.rs │ │ ├── macos.mm │ │ ├── macos.rs │ │ ├── mod.rs │ │ ├── privileges_scripts/ │ │ │ ├── agent.plist │ │ │ ├── daemon.plist │ │ │ ├── install.scpt │ │ │ ├── uninstall.scpt │ │ │ └── update.scpt │ │ ├── win_device.rs │ │ ├── windows.cc │ │ ├── windows.rs │ │ └── windows_delete_test_cert.cc │ ├── plugin/ │ │ ├── callback_ext.rs │ │ ├── callback_msg.rs │ │ ├── config.rs │ │ ├── desc.rs │ │ ├── errno.rs │ │ ├── ipc.rs │ │ ├── manager.rs │ │ ├── mod.rs │ │ ├── native.rs │ │ ├── native_handlers/ │ │ │ ├── macros.rs │ │ │ ├── mod.rs │ │ │ ├── session.rs │ │ │ └── ui.rs │ │ ├── plog.rs │ │ └── plugins.rs │ ├── port_forward.rs │ ├── privacy_mode/ │ │ ├── macos.rs │ │ ├── win_exclude_from_capture.rs │ │ ├── win_input.rs │ │ ├── win_mag.rs │ │ ├── win_topmost_window.rs │ │ └── win_virtual_display.rs │ ├── privacy_mode.rs │ ├── rendezvous_mediator.rs │ ├── server/ │ │ ├── audio_service.rs │ │ ├── clipboard_service.rs │ │ ├── connection.rs │ │ ├── dbus.rs │ │ ├── display_service.rs │ │ ├── input_service.rs │ │ ├── portable_service.rs │ │ ├── printer_service.rs │ │ ├── rdp_input.rs │ │ ├── service.rs │ │ ├── terminal_helper.rs │ │ ├── terminal_service.rs │ │ ├── uinput.rs │ │ ├── video_qos.rs │ │ ├── video_service.rs │ │ └── wayland.rs │ ├── server.rs │ ├── service.rs │ ├── tray.rs │ ├── ui/ │ │ ├── ab.tis │ │ ├── chatbox.html │ │ ├── cm.css │ │ ├── cm.html │ │ ├── cm.rs │ │ ├── cm.tis │ │ ├── common.css │ │ ├── common.tis │ │ ├── file_transfer.css │ │ ├── file_transfer.tis │ │ ├── grid.tis │ │ ├── header.css │ │ ├── header.tis │ │ ├── index.css │ │ ├── index.html │ │ ├── index.tis │ │ ├── install.html │ │ ├── install.tis │ │ ├── msgbox.tis │ │ ├── port_forward.tis │ │ ├── printer.tis │ │ ├── remote.css │ │ ├── remote.html │ │ ├── remote.rs │ │ └── remote.tis │ ├── ui.rs │ ├── ui_cm_interface.rs │ ├── ui_interface.rs │ ├── ui_session_interface.rs │ ├── updater.rs │ ├── virtual_display_manager.rs │ └── whiteboard/ │ ├── client.rs │ ├── linux.rs │ ├── macos.rs │ ├── mod.rs │ ├── server.rs │ ├── win_linux.rs │ └── windows.rs └── vcpkg.json
Showing preview only (814K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (9797 symbols across 346 files)
FILE: build.py
function get_deb_arch (line 29) | def get_deb_arch() -> str:
function get_deb_extra_depends (line 35) | def get_deb_extra_depends() -> str:
function system2 (line 41) | def system2(cmd):
function get_version (line 48) | def get_version():
function parse_rc_features (line 56) | def parse_rc_features(feature):
function make_parser (line 97) | def make_parser():
function generate_build_script_for_docker (line 160) | def generate_build_script_for_docker():
function download_extract_features (line 195) | def download_extract_features(features, res_dir):
function external_resources (line 252) | def external_resources(flutter, args, res_dir):
function get_features (line 274) | def get_features(args):
function generate_control_file (line 291) | def generate_control_file(version):
function ffi_bindgen_function_refactor (line 312) | def ffi_bindgen_function_refactor():
function build_flutter_deb (line 318) | def build_flutter_deb(version, features):
function build_deb_from_folder (line 367) | def build_deb_from_folder(version, binary_folder):
function build_flutter_dmg (line 404) | def build_flutter_dmg(version, features):
function build_flutter_arch_manjaro (line 423) | def build_flutter_arch_manjaro(version, features):
function build_flutter_windows (line 434) | def build_flutter_windows(version, features, skip_portable_pack):
function main (line 465) | def main():
function md5_file (line 634) | def md5_file(fn):
function md5_file_folder (line 638) | def md5_file_folder(base_dir):
FILE: build.rs
function build_windows (line 2) | fn build_windows() {
function build_mac (line 12) | fn build_mac() {
function build_manifest (line 26) | fn build_manifest() {
function install_android_deps (line 46) | fn install_android_deps() {
function main (line 80) | fn main() {
FILE: examples/ipc.rs
constant USAGE (line 8) | const USAGE: &'static str = "
type Args (line 23) | struct Args {
function main (line 30) | async fn main() {
function ipc_server (line 60) | async fn ipc_server(postfix: &str) {
function ipc_client (line 73) | async fn ipc_client(postfix: &str) {
FILE: flutter/lib/common.dart
function isSingleViewApp (line 90) | bool isSingleViewApp()
type F (line 97) | typedef F = String Function(String);
type FMethod (line 98) | typedef FMethod = String Function(String, dynamic);
type StreamEventHandler (line 100) | typedef StreamEventHandler = Future<void> Function(Map<String, dynamic>);
type SessionID (line 101) | typedef SessionID = UuidValue;
type DesktopType (line 105) | enum DesktopType {
function isDoubleEqual (line 115) | bool isDoubleEqual(double a, double b)
class IconFont (line 119) | class IconFont {
class ColorThemeExtension (line 144) | class ColorThemeExtension extends ThemeExtension<ColorThemeExtension> {
method copyWith (line 200) | ThemeExtension<ColorThemeExtension> copyWith({
method lerp (line 229) | ThemeExtension<ColorThemeExtension> lerp(
class MyTheme (line 250) | class MyTheme {
method switchTheme (line 275) | SwitchThemeData switchTheme()
method radioTheme (line 280) | RadioThemeData radioTheme()
method tooltipTheme (line 311) | TooltipThemeData tooltipTheme()
method dialogTitlePadding (line 321) | EdgeInsets dialogTitlePadding({bool content = true})
method dialogContentPadding (line 328) | EdgeInsets dialogContentPadding({bool actions = true})
method dialogActionsPadding (line 336) | EdgeInsets dialogActionsPadding()
method getThemeModePreference (line 581) | ThemeMode getThemeModePreference()
method changeDarkMode (line 585) | Future<void> changeDarkMode(ThemeMode mode)
method currentThemeMode (line 601) | ThemeMode currentThemeMode()
method color (line 615) | ColorThemeExtension color(BuildContext context)
method tabbar (line 619) | TabbarTheme tabbar(BuildContext context)
method themeModeFromString (line 623) | ThemeMode themeModeFromString(String v)
function toShortString (line 636) | String toShortString()
function formatDurationToTime (line 695) | String formatDurationToTime(Duration duration)
function closeConnection (line 704) | closeConnection({String? id})
function windowOnTop (line 724) | Future<void> windowOnTop(int? id)
type DialogBuilder (line 745) | typedef DialogBuilder = CustomAlertDialog Function(
class Dialog (line 748) | class Dialog<T> {
method complete (line 754) | void complete(T? res)
class OverlayKeyState (line 767) | class OverlayKeyState {
class OverlayDialogManager (line 777) | class OverlayDialogManager {
method setOverlayState (line 799) | void setOverlayState(OverlayKeyState overlayKeyState)
method dismissAll (line 803) | void dismissAll()
method dismissByTag (line 811) | void dismissByTag(String tag)
method show (line 817) | Future<T?> show<T>(DialogBuilder builder,
method close (line 842) | close([res])
method showLoading (line 882) | String showLoading(String text,
method cancel (line 892) | cancel()
method resetMobileActionsOverlay (line 931) | void resetMobileActionsOverlay({FFI? ffi})
method showMobileActionsOverlay (line 937) | void showMobileActionsOverlay({FFI? ffi})
method hideMobileActionsOverlay (line 951) | void hideMobileActionsOverlay({store = true})
method toggleMobileActionsOverlay (line 960) | void toggleMobileActionsOverlay({FFI? ffi})
method existing (line 968) | bool existing(String tag)
function makeMobileActionsOverlayEntry (line 973) | makeMobileActionsOverlayEntry(VoidCallback? onHide, {FFI? ffi})
function makeMobileActions (line 974) | makeMobileActions(BuildContext context, double s)
function computeOverlayPosition (line 979) | computeOverlayPosition()
function showToast (line 1014) | void showToast(String text,
class CustomAlertDialog (line 1052) | class CustomAlertDialog extends StatelessWidget {
method build (line 1075) | Widget build(BuildContext context)
function createDialogContent (line 1125) | Widget createDialogContent(String text)
function msgBox (line 1169) | void msgBox(SessionID sessionId, String type, String title, String text,
function submit (line 1179) | submit()
function cancel (line 1191) | cancel()
function jumplink (line 1195) | jumplink()
function _msgboxColor (line 1263) | Color? _msgboxColor(String type)
function msgboxIcon (line 1276) | Widget msgboxIcon(String type)
function msgboxContent (line 1302) | Widget msgboxContent(String type, String title, String text)
function translateText (line 1303) | String translateText(String text)
function msgBoxCommon (line 1342) | void msgBoxCommon(OverlayDialogManager dialogManager, String title,
function str2color (line 1356) | Color str2color(String str, [alpha = 0xFF])
function str2color2 (line 1365) | Color str2color2(String str, {List<int> existing = const []})
function readableFileSize (line 1408) | String readableFileSize(double size)
class AccessibilityListener (line 1424) | class AccessibilityListener extends StatelessWidget {
method build (line 1431) | Widget build(BuildContext context)
class AndroidPermissionManager (line 1466) | class AndroidPermissionManager {
method isWaitingFile (line 1471) | bool isWaitingFile()
method check (line 1478) | Future<bool> check(String type)
method startAction (line 1486) | void startAction(String action)
method request (line 1492) | Future<bool> request(String type)
method complete (line 1519) | complete(String type, bool res)
function getRadio (line 1529) | RadioListTile<T> getRadio<T>(
function ffi (line 1545) | FFI ffi(String? tag)
function initGlobalFFI (line 1554) | Future<void> initGlobalFFI()
function translate (line 1562) | String translate(String name)
function option2bool (line 1572) | bool option2bool(String option, String value)
function bool2option (line 1588) | String bool2option(String option, bool b)
function mainSetBoolOption (line 1605) | mainSetBoolOption(String key, bool value)
function mainGetBoolOption (line 1610) | Future<bool> mainGetBoolOption(String key)
function mainGetBoolOptionSync (line 1614) | bool mainGetBoolOptionSync(String key)
function mainSetLocalBoolOption (line 1618) | mainSetLocalBoolOption(String key, bool value)
function mainGetLocalBoolOptionSync (line 1623) | bool mainGetLocalBoolOptionSync(String key)
function mainGetPeerBoolOptionSync (line 1627) | bool mainGetPeerBoolOptionSync(String id, String key)
function matchPeer (line 1635) | Future<bool> matchPeer(
function getPlatformImage (line 1658) | Widget getPlatformImage(String platform, {double size = 50})
class LastWindowPosition (line 1673) | class LastWindowPosition {
method equals (line 1684) | bool equals(LastWindowPosition other)
method toJson (line 1693) | Map<String, dynamic> toJson()
method toString (line 1705) | String toString()
method loadFromString (line 1709) | LastWindowPosition? loadFromString(String content)
type WindowKey (line 1732) | typedef WindowKey = ({WindowType type, int? windowId});
function saveWindowPosition (line 1739) | Future<void> saveWindowPosition(WindowType type,
function setPreFrame (line 1751) | setPreFrame()
function _saveWindowPositionActual (line 1835) | Future<void> _saveWindowPositionActual(WindowKey key)
function _saveSessionWindowPosition (line 1854) | Future _saveSessionWindowPosition(WindowType windowType, int windowId,
function getPeerPos (line 1858) | getPeerPos(String peerId)
function _adjustRestoreMainWindowSize (line 1886) | Future<Size> _adjustRestoreMainWindowSize(double? width, double? height)
function isPointInRect (line 1918) | bool isPointInRect(Offset point, Rect rect)
function _adjustRestoreMainWindowOffset (line 1926) | Future<Offset?> _adjustRestoreMainWindowOffset(
function restoreWindowPosition (line 1981) | Future<bool> restoreWindowPosition(WindowType type,
function restorePos (line 2062) | restorePos()
function restoreFrame (line 2103) | restoreFrame()
function initUniLinks (line 2147) | Future<bool> initUniLinks()
function listenUniLinks (line 2175) | StreamSubscription? listenUniLinks({handleByFlutter = true})
type UriLinkType (line 2197) | enum UriLinkType {
function setEnvTerminalAdmin (line 2206) | setEnvTerminalAdmin()
function handleUriLink (line 2211) | bool handleUriLink({List<String>? cmdArgs, Uri? uri, String? uriString})
function urlLinkToCmdArgs (line 2346) | List<String>? urlLinkToCmdArgs(Uri uri)
function connectMainDesktop (line 2454) | connectMainDesktop(String id,
function connect (line 2501) | connect(BuildContext context, String id,
function getHttpHeaders (line 2665) | Map<String, String> getHttpHeaders()
class SimpleWrapper (line 2672) | class SimpleWrapper<T> {
class WakelockManager (line 2683) | class WakelockManager {
method enable (line 2694) | void enable(UniqueKey key, {bool isServer = false})
method disable (line 2712) | void disable(UniqueKey key)
function reloadCurrentWindow (line 2730) | void reloadCurrentWindow()
function reloadAllWindows (line 2741) | Future<void> reloadAllWindows()
function isRunningInPortableMode (line 2757) | bool isRunningInPortableMode()
function onActiveWindowChanged (line 2765) | Future<void> onActiveWindowChanged()
function periodic_immediate (line 2809) | Timer periodic_immediate(Duration duration, Future<void> Function() call...
function getWindowsTarget (line 2817) | WindowsTarget getWindowsTarget(int buildNumber)
function getWindowsTargetBuildNumber (line 2843) | int getWindowsTargetBuildNumber()
class ServerConfig (line 2857) | class ServerConfig {
method encode (line 2892) | String encode()
function dialogButton (line 2912) | Widget dialogButton(String text,
function versionCmp (line 2955) | int versionCmp(String v1, String v2)
function getWindowName (line 2959) | String getWindowName({WindowType? overrideType})
function getWindowNameWithId (line 2978) | String getWindowNameWithId(String id, {WindowType? overrideType})
function updateSystemWindowTheme (line 2982) | Future<void> updateSystemWindowTheme()
type PermissionAuthorizeType (line 3001) | enum PermissionAuthorizeType {
function osxCanRecordAudio (line 3007) | Future<PermissionAuthorizeType> osxCanRecordAudio()
function osxRequestAudio (line 3019) | Future<bool> osxRequestAudio()
function futureBuilder (line 3023) | Widget futureBuilder(
function onCopyFingerprint (line 3039) | void onCopyFingerprint(String value)
function callMainCheckSuperUserPermission (line 3048) | Future<bool> callMainCheckSuperUserPermission()
function start_service (line 3056) | Future<void> start_service(bool is_start)
function canBeBlocked (line 3065) | Future<bool> canBeBlocked()
function shouldBeBlocked (line 3089) | Future<void> shouldBeBlocked(RxBool block, WhetherUseRemoteBlock? use)
type WhetherUseRemoteBlock (line 3106) | typedef WhetherUseRemoteBlock = Future<bool> Function();
function buildRemoteBlock (line 3107) | Widget buildRemoteBlock(
function preventMouseKeyBuilder (line 3131) | Widget preventMouseKeyBuilder({required Widget child, required bool block})
function unreadMessageCountBuilder (line 3136) | Widget unreadMessageCountBuilder(RxInt? count,
function unreadTopRightBuilder (line 3155) | Widget unreadTopRightBuilder(RxInt? count, {Widget? icon})
function toCapitalized (line 3167) | String toCapitalized(String s)
function buildErrorBanner (line 3174) | Widget buildErrorBanner(BuildContext context,
function getDesktopTabLabel (line 3227) | String getDesktopTabLabel(String peerId, String alias)
function sessionRefreshVideo (line 3245) | sessionRefreshVideo(SessionID sessionId, PeerInfo pi)
function getScreenListWayland (line 3255) | Future<List<Rect>> getScreenListWayland()
function getScreenListNotWayland (line 3287) | Future<List<Rect>> getScreenListNotWayland()
function getScreenRectList (line 3309) | Future<List<Rect>> getScreenRectList()
function openMonitorInTheSameTab (line 3315) | openMonitorInTheSameTab(int i, FFI ffi, PeerInfo pi,
function openMonitorInNewTabOrWindow (line 3343) | openMonitorInNewTabOrWindow(int i, String peerId, PeerInfo pi,
function setNewConnectWindowFrame (line 3364) | setNewConnectWindowFrame(int windowId, String peerId, int preSessionCount,
function tryMoveToScreenAndSetFullscreen (line 3378) | tryMoveToScreenAndSetFullscreen(Rect? screenRect)
function parseParamScreenRect (line 3400) | parseParamScreenRect(Map<String, dynamic> params)
class _CountDownButton (line 3414) | class _CountDownButton extends StatefulWidget {
method createState (line 3428) | State<_CountDownButton> createState()
class _CountDownButtonState (line 3431) | class _CountDownButtonState extends State<_CountDownButton> {
method initState (line 3437) | void initState()
method dispose (line 3443) | void dispose()
method _startCountdownTimer (line 3448) | void _startCountdownTimer()
method build (line 3464) | Widget build(BuildContext context)
function importConfig (line 3473) | importConfig(List<TextEditingController>? controllers, List<RxString>? e...
function setServerConfig (line 3503) | Future<bool> setServerConfig(
function removeEndSlash (line 3508) | String removeEndSlash(String input)
function svgColor (line 3567) | ColorFilter? svgColor(Color? color)
class ComboBox (line 3576) | class ComboBox extends StatelessWidget {
method build (line 3594) | Widget build(BuildContext context)
function disabledTextColor (line 3649) | Color? disabledTextColor(BuildContext context, bool enabled)
function loadPowered (line 3655) | Widget loadPowered(BuildContext context)
function loadLogo (line 3680) | Widget loadLogo()
function loadIcon (line 3701) | Widget loadIcon(double size)
function getIncomingOnlyHomeSize (line 3713) | Size getIncomingOnlyHomeSize()
function getIncomingOnlySettingsSize (line 3720) | Size getIncomingOnlySettingsSize()
function isInHomePage (line 3724) | bool isInHomePage()
function _buildPresetPasswordWarning (line 3729) | Widget _buildPresetPasswordWarning()
function buildPresetPasswordWarningMobile (line 3757) | Widget buildPresetPasswordWarningMobile()
function buildPresetPasswordWarning (line 3765) | Widget buildPresetPasswordWarning()
function buildVirtualWindowFrame (line 3785) | Widget buildVirtualWindowFrame(BuildContext context, Widget child)
function boxShadow (line 3786) | boxShadow()
function setResizable (line 3837) | setResizable(bool resizable)
function isOptionFixed (line 3846) | isOptionFixed(String key)
function isChangePermanentPasswordDisabled (line 3848) | bool isChangePermanentPasswordDisabled()
function isChangeIdDisabled (line 3852) | bool isChangeIdDisabled()
function isUnlockPinDisabled (line 3855) | bool isUnlockPinDisabled()
function whitelistNotEmpty (line 3872) | bool whitelistNotEmpty()
function disableWindowMovable (line 3890) | disableWindowMovable(int? windowId)
function netWorkErrorWidget (line 3902) | Widget netWorkErrorWidget()
function earlyAssert (line 3935) | void earlyAssert()
function checkUpdate (line 3939) | void checkUpdate()
function workaroundFreezeLinuxMint (line 3959) | Widget workaroundFreezeLinuxMint()
function workaroundWindowBorder (line 3970) | Widget workaroundWindowBorder(BuildContext context, Widget child)
function getBorderWidget (line 3979) | getBorderWidget(Widget child)
function updateTextAndPreserveSelection (line 4025) | void updateTextAndPreserveSelection(
function getPrinterNames (line 4040) | List<String> getPrinterNames()
function getConnectionText (line 4066) | String getConnectionText(bool secure, bool direct, String streamType)
function decode_http_response (line 4087) | String decode_http_response(http.Response resp)
function peerTabShowNote (line 4098) | bool peerTabShowNote(PeerTabIndex peerTabIndex)
function mouseButtonsToPeer (line 4105) | String mouseButtonsToPeer(int buttons)
function buildAvatarWidget (line 4125) | Widget? buildAvatarWidget({
FILE: flutter/lib/common/formatter/id_formatter.dart
class IDTextEditingController (line 4) | class IDTextEditingController extends TextEditingController {
class IDTextInputFormatter (line 12) | class IDTextInputFormatter extends TextInputFormatter {
method formatEditUpdate (line 14) | TextEditingValue formatEditUpdate(
function formatID (line 36) | String formatID(String id)
function trimID (line 58) | String trimID(String id)
FILE: flutter/lib/common/hbbs/hbbs.dart
class HttpType (line 10) | class HttpType {
type UserStatus (line 22) | enum UserStatus { kDisabled, kNormal, kUnverified }
class UserPayload (line 26) | class UserPayload {
method toJson (line 50) | Map<String, dynamic> toJson()
method toGroupCacheJson (line 64) | Map<String, dynamic> toGroupCacheJson()
class PeerPayload (line 77) | class PeerPayload {
method toPeer (line 95) | Peer toPeer(PeerPayload p)
method _platform (line 107) | String? _platform(dynamic field)
class LoginRequest (line 133) | class LoginRequest {
method toJson (line 155) | Map<String, dynamic> toJson()
class LoginResponse (line 180) | class LoginResponse {
class RequestException (line 199) | class RequestException implements Exception {
method toString (line 205) | String toString()
type ShareRule (line 210) | enum ShareRule {
class AbProfile (line 258) | class AbProfile {
class AbTag (line 277) | class AbTag {
class DeviceGroupPayload (line 288) | class DeviceGroupPayload {
method toGroupCacheJson (line 296) | Map<String, dynamic> toGroupCacheJson()
FILE: flutter/lib/common/shared_state.dart
class PrivacyModeState (line 8) | class PrivacyModeState {
method tag (line 9) | String tag(String id)
method init (line 11) | void init(String id)
method delete (line 19) | void delete(String id)
method find (line 28) | RxString find(String id)
class BlockInputState (line 31) | class BlockInputState {
method tag (line 32) | String tag(String id)
method init (line 34) | void init(String id)
method delete (line 44) | void delete(String id)
method find (line 51) | RxBool find(String id)
class CurrentDisplayState (line 54) | class CurrentDisplayState {
method tag (line 55) | String tag(String id)
method init (line 57) | void init(String id)
method delete (line 67) | void delete(String id)
method find (line 74) | RxInt find(String id)
class ConnectionType (line 77) | class ConnectionType {
method setSecure (line 91) | void setSecure(bool v)
method setDirect (line 95) | void setDirect(bool v)
method setStreamType (line 99) | void setStreamType(String v)
method isValid (line 103) | bool isValid()
class ConnectionTypeState (line 110) | class ConnectionTypeState {
method tag (line 111) | String tag(String id)
method init (line 113) | void init(String id)
method delete (line 121) | void delete(String id)
method find (line 128) | ConnectionType find(String id)
class FingerprintState (line 132) | class FingerprintState {
method tag (line 133) | String tag(String id)
method init (line 135) | void init(String id)
method delete (line 145) | void delete(String id)
method find (line 152) | RxString find(String id)
class ShowRemoteCursorState (line 155) | class ShowRemoteCursorState {
method tag (line 156) | String tag(String id)
method init (line 158) | void init(String id)
method delete (line 168) | void delete(String id)
method find (line 175) | RxBool find(String id)
class ShowRemoteCursorLockState (line 178) | class ShowRemoteCursorLockState {
method tag (line 179) | String tag(String id)
method init (line 181) | void init(String id)
method delete (line 191) | void delete(String id)
method find (line 198) | RxBool find(String id)
class KeyboardEnabledState (line 201) | class KeyboardEnabledState {
method tag (line 202) | String tag(String id)
method init (line 204) | void init(String id)
method delete (line 215) | void delete(String id)
method find (line 222) | RxBool find(String id)
class RemoteCursorMovedState (line 225) | class RemoteCursorMovedState {
method tag (line 226) | String tag(String id)
method init (line 228) | void init(String id)
method delete (line 238) | void delete(String id)
method find (line 245) | RxBool find(String id)
class RemoteCountState (line 248) | class RemoteCountState {
method tag (line 249) | String tag()
method init (line 251) | void init()
method delete (line 261) | void delete()
method find (line 268) | RxInt find()
class PeerBoolOption (line 271) | class PeerBoolOption {
method tag (line 272) | String tag(String id, String opt)
method init (line 274) | void init(String id, String opt, bool Function() init_getter)
method delete (line 284) | void delete(String id, String opt)
method find (line 291) | RxBool find(String id, String opt)
class PeerStringOption (line 295) | class PeerStringOption {
method tag (line 296) | String tag(String id, String opt)
method init (line 298) | void init(String id, String opt, String Function() init_getter)
method delete (line 308) | void delete(String id, String opt)
method find (line 315) | RxString find(String id, String opt)
class UnreadChatCountState (line 319) | class UnreadChatCountState {
method tag (line 320) | String tag(id)
method init (line 322) | void init(String id)
method delete (line 332) | void delete(String id)
method find (line 339) | RxInt find(String id)
function initSharedStates (line 342) | initSharedStates(String id)
function removeSharedStates (line 356) | removeSharedStates(String id)
FILE: flutter/lib/common/widgets/address_book.dart
class AddressBook (line 27) | class AddressBook extends StatefulWidget {
method createState (line 32) | State<StatefulWidget> createState()
class _AddressBookState (line 37) | class _AddressBookState extends State<AddressBook> {
method build (line 41) | Widget build(BuildContext context)
method _buildAddressBookLandscape (line 75) | Widget _buildAddressBookLandscape()
method _buildAddressBookPortrait (line 112) | Widget _buildAddressBookPortrait()
method _buildAbPermission (line 144) | Widget _buildAbPermission()
method icon (line 145) | icon(IconData data, String tooltip)
method _buildAbDropdown (line 186) | Widget _buildAbDropdown()
method buildItem (line 203) | Row buildItem(String e, {bool button = false})
method _buildTagHeader (line 301) | Widget _buildTagHeader()
method _buildTags (line 318) | Widget _buildTags()
method tagBuilder (line 329) | tagBuilder(String e)
method gridView (line 343) | gridView(bool isPortrait)
method _buildPeersViews (line 358) | Widget _buildPeersViews()
method syncMenuItem (line 369) | MenuEntryBase<String> syncMenuItem()
method sortMenuItem (line 386) | MenuEntryBase<String> sortMenuItem()
method filterMenuItem (line 405) | MenuEntryBase<String> filterMenuItem()
method _showMenu (line 423) | void _showMenu(RelativeRect pos)
method addIdToCurrentAb (line 460) | void addIdToCurrentAb()
method submit (line 477) | submit()
method row (line 517) | row({required Widget label, required Widget input})
method makeChild (line 518) | makeChild(bool isPortrait)
method abAddTag (line 680) | void abAddTag()
method submit (line 686) | submit()
class AddressBookTag (line 752) | class AddressBookTag extends StatelessWidget {
method build (line 767) | Widget build(BuildContext context)
method setPosition (line 770) | void setPosition(TapDownDetails e)
method _showMenu (line 819) | void _showMenu(BuildContext context, RelativeRect pos)
function getEntry (line 890) | MenuEntryButton<String> getEntry(String title, VoidCallback proc)
FILE: flutter/lib/common/widgets/animated_rotation_widget.dart
class AnimatedRotationWidget (line 4) | class AnimatedRotationWidget extends StatefulWidget {
method createState (line 17) | State<AnimatedRotationWidget> createState()
class AnimatedRotationWidgetState (line 20) | class AnimatedRotationWidgetState extends State<AnimatedRotationWidget> {
method initState (line 24) | void initState()
method build (line 36) | Widget build(BuildContext context)
FILE: flutter/lib/common/widgets/audio_input.dart
type AudioINputSetDevice (line 7) | typedef AudioINputSetDevice = void Function(String device);
type AudioInputBuilder (line 8) | typedef AudioInputBuilder = Widget Function(
class AudioInput (line 11) | class AudioInput extends StatelessWidget {
method getDefault (line 23) | String getDefault()
method getAudioInput (line 28) | Future<String> getAudioInput(bool isCm, bool isVoiceCall)
method getValue (line 36) | Future<String> getValue(bool isCm, bool isVoiceCall)
method setDevice (line 45) | Future<void> setDevice(
method getDevicesInfo (line 55) | Future<Map<String, Object>> getDevicesInfo(
method build (line 66) | Widget build(BuildContext context)
FILE: flutter/lib/common/widgets/autocomplete.dart
class AllPeersLoader (line 8) | class AllPeersLoader {
method init (line 23) | void init(void Function(VoidCallback) setState)
method clear (line 31) | void clear()
method getAllPeers (line 38) | Future<void> getAllPeers()
method _mergeAllPeers (line 61) | void _mergeAllPeers()
class AutocompletePeerTile (line 108) | class AutocompletePeerTile extends StatefulWidget {
method createState (line 119) | AutocompletePeerTileState createState()
class AutocompletePeerTileState (line 122) | class AutocompletePeerTileState extends State<AutocompletePeerTile> {
method _frontN (line 123) | List _frontN<T>(List list, int n)
method build (line 132) | Widget build(BuildContext context)
FILE: flutter/lib/common/widgets/chat_page.dart
type ChatPageType (line 10) | enum ChatPageType {
class ChatPage (line 15) | class ChatPage extends StatelessWidget implements PageShape {
method build (line 78) | Widget build(BuildContext context)
FILE: flutter/lib/common/widgets/connection_page_title.dart
function getConnectionPageTitle (line 7) | Widget getConnectionPageTitle(BuildContext context, bool isWeb)
FILE: flutter/lib/common/widgets/custom_password.dart
class ValidationRule (line 7) | abstract class ValidationRule {
method validate (line 9) | bool validate(String value)
class UppercaseValidationRule (line 12) | class UppercaseValidationRule extends ValidationRule {
method validate (line 16) | bool validate(String value)
class LowercaseValidationRule (line 25) | class LowercaseValidationRule extends ValidationRule {
method validate (line 30) | bool validate(String value)
class DigitValidationRule (line 39) | class DigitValidationRule extends ValidationRule {
method validate (line 44) | bool validate(String value)
class SpecialCharacterValidationRule (line 49) | class SpecialCharacterValidationRule extends ValidationRule {
method validate (line 54) | bool validate(String value)
class MinCharactersValidationRule (line 59) | class MinCharactersValidationRule extends ValidationRule {
method validate (line 67) | bool validate(String value)
class PasswordStrengthIndicator (line 72) | class PasswordStrengthIndicator extends StatelessWidget {
method build (line 80) | Widget build(BuildContext context)
method _indicator (line 103) | Widget _indicator(Color color)
method _getLabel (line 110) | String _getLabel(double strength)
method _getColor (line 120) | Color _getColor(double strength)
FILE: flutter/lib/common/widgets/custom_scale_base.dart
class CustomScaleControls (line 14) | abstract class CustomScaleControls<T extends StatefulWidget> extends Sta...
method mapPosToPercent (line 29) | int mapPosToPercent(double p)
method _clampScale (line 38) | int _clampScale(int v)
method _mapPosToPercent (line 41) | int _mapPosToPercent(double p)
method _mapPercentToPos (line 56) | double _mapPercentToPos(int percent)
method _snapNormalizedPos (line 68) | double _snapNormalizedPos(double p)
method initState (line 76) | void initState()
method _applyScale (line 102) | Future<void> _applyScale(int v)
method nudgeScale (line 128) | void nudgeScale(int delta)
method dispose (line 139) | void dispose()
method onSliderChanged (line 144) | void onSliderChanged(double v)
FILE: flutter/lib/common/widgets/dialog.dart
function clientClose (line 23) | void clientClose(SessionID sessionId, FFI ffi)
class ValidationRule (line 35) | abstract class ValidationRule {
method validate (line 37) | bool validate(String value)
class LengthRangeValidationRule (line 40) | class LengthRangeValidationRule extends ValidationRule {
method validate (line 52) | bool validate(String value)
class RegexValidationRule (line 57) | class RegexValidationRule extends ValidationRule {
method validate (line 67) | bool validate(String value)
function changeIdDialog (line 72) | void changeIdDialog()
function submit (line 86) | submit()
function changeWhiteList (line 189) | void changeWhiteList({Function()? callback})
function changeDirectAccessPort (line 285) | Future<String> changeDirectAccessPort(
function changeAutoDisconnectTimeout (line 335) | Future<String> changeAutoDisconnectTimeout(String old)
class DialogTextField (line 383) | class DialogTextField extends StatelessWidget {
method build (line 419) | Widget build(BuildContext context)
class ValidationField (line 462) | abstract class ValidationField extends StatelessWidget {
method validate (line 465) | String? validate()
class Dialog2FaField (line 469) | class Dialog2FaField extends ValidationField {
method build (line 493) | Widget build(BuildContext context)
method validate (line 517) | String? validate()
class DialogEmailCodeField (line 543) | class DialogEmailCodeField extends ValidationField {
method build (line 565) | Widget build(BuildContext context)
method validate (line 586) | String? validate()
class DialogVerificationCodeField (line 607) | class DialogVerificationCodeField extends StatefulWidget {
method createState (line 639) | State<DialogVerificationCodeField> createState()
class _DialogVerificationCodeField (line 643) | class _DialogVerificationCodeField extends State<DialogVerificationCodeF...
method initState (line 651) | void initState()
method dispose (line 681) | void dispose()
method build (line 690) | Widget build(BuildContext context)
class PasswordWidget (line 703) | class PasswordWidget extends StatefulWidget {
method createState (line 724) | State<PasswordWidget> createState()
class _PasswordWidgetState (line 727) | class _PasswordWidgetState extends State<PasswordWidget> {
method initState (line 734) | void initState()
method dispose (line 754) | void dispose()
method build (line 763) | Widget build(BuildContext context)
function wrongPasswordDialog (line 789) | void wrongPasswordDialog(SessionID sessionId,
function cancel (line 793) | cancel()
function submit (line 798) | submit()
function enterPasswordDialog (line 821) | void enterPasswordDialog(
function enterUserLoginDialog (line 830) | void enterUserLoginDialog(
function enterUserLoginAndPasswordDialog (line 845) | void enterUserLoginAndPasswordDialog(
function _connectDialog (line 861) | _connectDialog(
function cancel (line 891) | cancel()
function submit (line 896) | submit()
function descWidget (line 926) | descWidget(String text)
function rememberWidget (line 946) | rememberWidget(
function osAccountWidget (line 961) | osAccountWidget()
function passwdWidget (line 1004) | passwdWidget()
function showWaitUacDialog (line 1062) | void showWaitUacDialog(
function showRequestElevationDialog (line 1081) | void showRequestElevationDialog(
function onRadioChanged (line 1089) | void onRadioChanged(String? value)
function submit (line 1208) | void submit()
function showOnBlockDialog (line 1251) | void showOnBlockDialog(
function submit (line 1263) | void submit()
function showElevationError (line 1282) | void showElevationError(SessionID sessionId, String type, String title,
function submit (line 1285) | void submit()
function showWaitAcceptDialog (line 1305) | void showWaitAcceptDialog(SessionID sessionId, String type, String title,
function onCancel (line 1309) | onCancel()
function showRestartRemoteDevice (line 1324) | void showRestartRemoteDevice(PeerInfo pi, String id, SessionID sessionId,
function showSetOSPassword (line 1355) | showSetOSPassword(
function closeWithCallback (line 1371) | closeWithCallback([dynamic])
function submit (line 1376) | submit()
function showSetOSAccount (line 1436) | showSetOSAccount(
function submit (line 1451) | submit()
function descWidget (line 1461) | descWidget(String text)
function buildNoteTextField (line 1521) | Widget buildNoteTextField({
function showAuditDialog (line 1567) | showAuditDialog(FFI ffi)
function submit (line 1571) | submit()
function allowAskForNoteAtEndOfConnection (line 1596) | bool allowAskForNoteAtEndOfConnection(FFI? ffi, bool closedByControlling)
function desktopTryShowTabAuditDialogCloseCancelled (line 1613) | Future<bool> desktopTryShowTabAuditDialogCloseCancelled(
function showConnEndAuditDialogCloseCanceled (line 1630) | Future<bool> showConnEndAuditDialogCloseCanceled(
function _showConnEndAuditDialogCloseCanceled (line 1643) | Future<bool?> _showConnEndAuditDialogCloseCanceled({
function updateAuditNoteByGuid (line 1656) | Future<void> updateAuditNoteByGuid(String auditGuid, String note)
function cancel (line 1696) | cancel()
function set (line 1700) | set()
function submit (line 1720) | submit()
function showConfirmSwitchSidesDialog (line 1813) | void showConfirmSwitchSidesDialog(
function submit (line 1816) | submit()
function customImageQualityDialog (line 1834) | customImageQualityDialog(SessionID sessionId, String id, FFI ffi)
function setCustomValues (line 1851) | setCustomValues({double? quality, double? fps})
function trackpadSpeedDialog (line 1908) | trackpadSpeedDialog(SessionID sessionId, FFI ffi)
function deleteConfirmDialog (line 1930) | void deleteConfirmDialog(Function onSubmit, String title)
function submit (line 1933) | submit()
function editAbTagDialog (line 1974) | void editAbTagDialog(
function submit (line 1982) | submit()
function editAbPeerNoteDialog (line 2027) | void editAbPeerNoteDialog(String id)
function submit (line 2033) | submit()
function renameDialog (line 2070) | void renameDialog(
function submit (line 2079) | submit()
function cancel (line 2090) | cancel()
function changeBot (line 2141) | void changeBot({Function()? callback})
function onVerify (line 2151) | onVerify()
function change2fa (line 2201) | void change2fa({Function()? callback})
function onVerify (line 2214) | onVerify()
function getOnSubmit (line 2234) | getOnSubmit()
function enter2FaDialog (line 2268) | void enter2FaDialog(
function cancel (line 2276) | cancel()
function submit (line 2281) | submit()
function showWindowsSessionsDialog (line 2334) | void showWindowsSessionsDialog(
function submit (line 2357) | submit()
function addPeersToAbDialog (line 2385) | void addPeersToAbDialog(
function addTo (line 2388) | Future<bool> addTo(String abname)
function submit (line 2428) | submit()
function cancel (line 2442) | cancel()
function setSharedAbPasswordDialog (line 2497) | void setSharedAbPasswordDialog(String abName, Peer peer)
function change (line 2506) | change(String password)
function cancel (line 2517) | cancel()
function CommonConfirmDialog (line 2589) | void CommonConfirmDialog(OverlayDialogManager dialogManager, String cont...
function submit (line 2592) | submit()
function changeUnlockPinDialog (line 2617) | void changeUnlockPinDialog(String oldPin, Function() callback)
function submit (line 2624) | submit()
function checkUnlockPinDialog (line 2677) | void checkUnlockPinDialog(String correctPin, Function() passCallback)
function submit (line 2681) | submit()
function confrimDeleteTrustedDevicesDialog (line 2715) | void confrimDeleteTrustedDevicesDialog(
function manageTrustedDeviceDialog (line 2735) | void manageTrustedDeviceDialog()
class TrustedDevice (line 2762) | class TrustedDevice {
method daysRemaining (line 2778) | String daysRemaining()
method get (line 2787) | Future<List<TrustedDevice>> get()
function trustedDevicesTable (line 2807) | Widget trustedDevicesTable(
function setSelectAll (line 2810) | setSelectAll()
FILE: flutter/lib/common/widgets/gestures.dart
type GestureState (line 6) | enum GestureState {
class CustomTouchGestureRecognizer (line 13) | class CustomTouchGestureRecognizer extends ScaleGestureRecognizer {
method _init (line 43) | void _init()
method onOneFingerStartDebounce (line 125) | void onOneFingerStartDebounce(ScaleUpdateDetails d)
method start (line 126) | start(ScaleUpdateDetails d)
method onTwoFingerStartDebounce (line 145) | void onTwoFingerStartDebounce(ScaleUpdateDetails d)
method start (line 146) | start(ScaleUpdateDetails d)
method _getDragUpdateDetails (line 165) | DragUpdateDetails _getDragUpdateDetails(ScaleUpdateDetails d)
method _getDragEndDetails (line 171) | DragEndDetails _getDragEndDetails(ScaleEndDetails d)
method rejectGesture (line 175) | void rejectGesture(int pointer)
class HoldTapMoveGestureRecognizer (line 196) | class HoldTapMoveGestureRecognizer extends GestureRecognizer {
method isPointerAllowed (line 223) | bool isPointerAllowed(PointerDownEvent event)
method addAllowedPointer (line 242) | void addAllowedPointer(PointerDownEvent event)
method _trackTap (line 264) | void _trackTap(PointerDownEvent event)
method _handleEvent (line 278) | void _handleEvent(PointerEvent event)
method acceptGesture (line 323) | void acceptGesture(int pointer)
method rejectGesture (line 326) | void rejectGesture(int pointer)
method _resolve (line 338) | void _resolve()
method _reject (line 351) | void _reject(_TapTracker tracker)
method dispose (line 365) | void dispose()
method _reset (line 370) | void _reset()
method _registerFirstTap (line 398) | void _registerFirstTap(_TapTracker tracker)
method _registerSecondTap (line 408) | void _registerSecondTap(_TapTracker tracker)
method _clearTrackers (line 423) | void _clearTrackers()
method _freezeTracker (line 428) | void _freezeTracker(_TapTracker tracker)
method _startFirstTapUpTimer (line 432) | void _startFirstTapUpTimer()
method _startSecondTapDownTimer (line 436) | void _startSecondTapDownTimer()
method _stopFirstTapUpTimer (line 440) | void _stopFirstTapUpTimer()
method _stopSecondTapDownTimer (line 447) | void _stopSecondTapDownTimer()
method _checkCancel (line 454) | void _checkCancel()
class DoubleFinerTapGestureRecognizer (line 464) | class DoubleFinerTapGestureRecognizer extends GestureRecognizer {
method isPointerAllowed (line 489) | bool isPointerAllowed(PointerDownEvent event)
method addAllowedPointer (line 507) | void addAllowedPointer(PointerDownEvent event)
method _trackTap (line 529) | void _trackTap(PointerDownEvent event)
method _handleEvent (line 543) | void _handleEvent(PointerEvent event)
method acceptGesture (line 558) | void acceptGesture(int pointer)
method rejectGesture (line 561) | void rejectGesture(int pointer)
method _reject (line 573) | void _reject(_TapTracker tracker)
method dispose (line 590) | void dispose()
method _reset (line 595) | void _reset()
method _registerTap (line 601) | void _registerTap(_TapTracker tracker)
method _clearTrackers (line 607) | void _clearTrackers()
method _freezeTracker (line 612) | void _freezeTracker(_TapTracker tracker)
method _startFirstTapDownTimer (line 616) | void _startFirstTapDownTimer()
method _stopFirstTapUpTimer (line 620) | void _stopFirstTapUpTimer()
method _timeoutCheck (line 627) | void _timeoutCheck()
method _resolve (line 637) | void _resolve()
method _checkCancel (line 650) | void _checkCancel()
class _TapTracker (line 662) | class _TapTracker {
method startTrackingPointer (line 683) | void startTrackingPointer(PointerRoute route, Matrix4? transform)
method stopTrackingPointer (line 690) | void stopTrackingPointer(PointerRoute route)
method isWithinGlobalTolerance (line 697) | bool isWithinGlobalTolerance(PointerEvent event, double tolerance)
method hasElapsedMinTime (line 702) | bool hasElapsedMinTime()
method hasSameButton (line 706) | bool hasSameButton(PointerDownEvent event)
class _CountdownZoned (line 713) | class _CountdownZoned {
method _onTimeout (line 722) | void _onTimeout()
function getMixinGestureDetector (line 727) | RawGestureDetector getMixinGestureDetector({
FILE: flutter/lib/common/widgets/login.dart
class _IconOP (line 26) | class _IconOP extends StatelessWidget {
method build (line 38) | Widget build(BuildContext context)
class ButtonOP (line 56) | class ButtonOP extends StatelessWidget {
method build (line 75) | Widget build(BuildContext context)
class ConfigOP (line 116) | class ConfigOP {
class WidgetOP (line 122) | class WidgetOP extends StatefulWidget {
method createState (line 134) | State<StatefulWidget> createState()
class _WidgetOPState (line 139) | class _WidgetOPState extends State<WidgetOP> {
method dispose (line 146) | void dispose()
method build (line 203) | Widget build(BuildContext context)
class LoginWidgetOP (line 278) | class LoginWidgetOP extends StatelessWidget {
method build (line 291) | Widget build(BuildContext context)
class LoginWidgetUserPass (line 320) | class LoginWidgetUserPass extends StatelessWidget {
method build (line 342) | Widget build(BuildContext context)
function loginDialog (line 392) | Future<bool?> loginDialog()
function onDialogCancel (line 424) | onDialogCancel()
function handleLoginResponse (line 429) | handleLoginResponse(LoginResponse resp, bool storeIfAccessToken,
function onLogin (line 482) | onLogin()
function thirdAuthWidget (line 512) | thirdAuthWidget()
function verificationCodeDialog (line 623) | Future<bool?> verificationCodeDialog(
function onVerify (line 632) | void onVerify()
function getOnSubmit (line 682) | getOnSubmit()
function logOutConfirmDialog (line 734) | void logOutConfirmDialog()
function submit (line 736) | submit()
FILE: flutter/lib/common/widgets/my_group.dart
class MyGroup (line 12) | class MyGroup extends StatefulWidget {
method createState (line 17) | State<StatefulWidget> createState()
class _MyGroupState (line 22) | class _MyGroupState extends State<MyGroup> {
method build (line 31) | Widget build(BuildContext context)
method _buildLandscape (line 60) | Widget _buildLandscape()
method _buildPortrait (line 96) | Widget _buildPortrait()
method _buildLeftHeader (line 128) | Widget _buildLeftHeader()
method _buildLeftList (line 157) | Widget _buildLeftList()
method listView (line 181) | listView(bool isPortrait)
method _buildUserItem (line 195) | Widget _buildUserItem(UserPayload user, Map<String, int> displayNameCo...
method _buildDeviceGroupItem (line 271) | Widget _buildDeviceGroupItem(DeviceGroupPayload deviceGroup)
FILE: flutter/lib/common/widgets/overlay.dart
class DraggableChatWindow (line 15) | class DraggableChatWindow extends StatelessWidget {
method build (line 30) | Widget build(BuildContext context)
method _buildMobileAppBar (line 76) | Widget _buildMobileAppBar(BuildContext context)
method _buildDesktopAppBar (line 120) | Widget _buildDesktopAppBar(BuildContext context)
class CustomAppBar (line 155) | class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
method build (line 164) | Widget build(BuildContext context)
class DraggableMobileActions (line 173) | class DraggableMobileActions extends StatelessWidget {
method build (line 194) | Widget build(BuildContext context)
class DraggableKeyPosition (line 250) | class DraggableKeyPosition {
class DraggablePositions (line 317) | class DraggablePositions {
class Draggable (line 336) | class Draggable extends StatefulWidget {
method createState (line 357) | State<StatefulWidget> createState()
class _DraggableState (line 360) | class _DraggableState extends State<Draggable> {
method onPanUpdate (line 372) | void onPanUpdate(DragUpdateDetails d)
method build (line 437) | Widget build(BuildContext context)
class IOSDraggable (line 455) | class IOSDraggable extends StatefulWidget {
method createState (line 472) | IOSDraggableState createState()
class IOSDraggableState (line 476) | class IOSDraggableState extends State<IOSDraggable> {
method initState (line 525) | void initState()
method build (line 531) | Widget build(BuildContext context)
class QualityMonitor (line 561) | class QualityMonitor extends StatelessWidget {
method _row (line 565) | Widget _row(String info, String? value, {Color? rightColor})
method build (line 585) | Widget build(BuildContext context)
class BlockableOverlayState (line 615) | class BlockableOverlayState extends OverlayKeyState {
method addMiddleBlockedListener (line 622) | void addMiddleBlockedListener(void Function(bool) cb)
method setMiddleBlocked (line 626) | void setMiddleBlocked(bool blocked)
method applyFfi (line 632) | void applyFfi(FFI ffi)
class BlockableOverlay (line 642) | class BlockableOverlay extends StatelessWidget {
method build (line 652) | Widget build(BuildContext context)
FILE: flutter/lib/common/widgets/peer_card.dart
type PopupMenuEntryBuilder (line 19) | typedef PopupMenuEntryBuilder = Future<List<mod_menu.PopupMenuEntry<Stri...
type PeerUiType (line 22) | enum PeerUiType { grid, tile, list }
class _PeerCard (line 28) | class _PeerCard extends StatefulWidget {
method createState (line 43) | _PeerCardState createState()
class _PeerCardState (line 47) | class _PeerCardState extends State<_PeerCard>
method build (line 55) | Widget build(BuildContext context)
method gestureDetector (line 61) | Widget gestureDetector({required Widget child})
method _buildPortrait (line 83) | Widget _buildPortrait()
method _buildLandscape (line 94) | Widget _buildLandscape()
method _showNote (line 130) | bool _showNote(Peer peer)
method _buildPeerTile (line 247) | Widget _buildPeerTile(
method _buildPeerCard (line 281) | Widget _buildPeerCard(
method _frontN (line 414) | List _frontN<T>(List list, int n)
method checkBoxOrActionMorePortrait (line 422) | Widget checkBoxOrActionMorePortrait(Peer peer)
method checkBoxOrActionMoreLandscape (line 450) | Widget checkBoxOrActionMoreLandscape(Peer peer, {required bool isTile})
method _actionMore (line 476) | Widget _actionMore(Peer peer)
method _shouldBuildPasswordIcon (line 485) | bool _shouldBuildPasswordIcon(Peer peer)
method _showPeerMenu (line 493) | void _showPeerMenu(String id)
class BasePeerCard (line 506) | abstract class BasePeerCard extends StatelessWidget {
method build (line 516) | Widget build(BuildContext context)
method _buildPopupMenuEntry (line 526) | Future<List<mod_menu.PopupMenuEntry<String>>> _buildPopupMenuEntry(
method _buildMenuItems (line 539) | Future<List<MenuEntryBase<String>>> _buildMenuItems(BuildContext context)
method _connectCommonAction (line 541) | MenuEntryBase<String> _connectCommonAction(
method _connectAction (line 577) | MenuEntryBase<String> _connectAction(BuildContext context)
method _transferFileAction (line 587) | MenuEntryBase<String> _transferFileAction(BuildContext context)
method _viewCameraAction (line 596) | MenuEntryBase<String> _viewCameraAction(BuildContext context)
method _terminalAction (line 605) | MenuEntryBase<String> _terminalAction(BuildContext context)
method _terminalRunAsAdminAction (line 614) | MenuEntryBase<String> _terminalRunAsAdminAction(BuildContext context)
method _tcpTunnelingAction (line 623) | MenuEntryBase<String> _tcpTunnelingAction(BuildContext context)
method _rdpAction (line 632) | MenuEntryBase<String> _rdpAction(BuildContext context, String id)
method _wolAction (line 670) | MenuEntryBase<String> _wolAction(String id)
method _createShortCutAction (line 686) | MenuEntryBase<String> _createShortCutAction(String id)
method _openNewConnInAction (line 701) | Future<MenuEntryBase<String>> _openNewConnInAction(
method _isForceAlwaysRelay (line 730) | Future<bool> _isForceAlwaysRelay(String id)
method _forceAlwaysRelayAction (line 736) | Future<MenuEntryBase<String>> _forceAlwaysRelayAction(String id)
method _renameAction (line 756) | MenuEntryBase<String> _renameAction(String id)
method _removeAction (line 785) | MenuEntryBase<String> _removeAction(String id)
method onSubmit (line 804) | onSubmit()
method _unrememberPasswordAction (line 841) | MenuEntryBase<String> _unrememberPasswordAction(String id)
method _addFavAction (line 865) | MenuEntryBase<String> _addFavAction(String id)
method _rmFavAction (line 899) | MenuEntryBase<String> _rmFavAction(
method _addToAb (line 934) | MenuEntryBase<String> _addToAb(Peer peer)
method _getAlias (line 951) | Future<String> _getAlias(String id)
method _update (line 955) | void _update()
class RecentPeerCard (line 958) | class RecentPeerCard extends BasePeerCard {
method _buildMenuItems (line 967) | Future<List<MenuEntryBase<String>>> _buildMenuItems(
method _update (line 1020) | void _update()
class FavoritePeerCard (line 1023) | class FavoritePeerCard extends BasePeerCard {
method _buildMenuItems (line 1032) | Future<List<MenuEntryBase<String>>> _buildMenuItems(
method _update (line 1080) | void _update()
class DiscoveredPeerCard (line 1083) | class DiscoveredPeerCard extends BasePeerCard {
method _buildMenuItems (line 1092) | Future<List<MenuEntryBase<String>>> _buildMenuItems(
method _update (line 1139) | void _update()
class AddressBookPeerCard (line 1142) | class AddressBookPeerCard extends BasePeerCard {
method _buildMenuItems (line 1151) | Future<List<MenuEntryBase<String>>> _buildMenuItems(
method _update (line 1211) | void _update()
method _editTagAction (line 1215) | MenuEntryBase<String> _editTagAction(String id)
method _editNoteAction (line 1232) | MenuEntryBase<String> _editNoteAction(String id)
method _getAlias (line 1248) | Future<String> _getAlias(String id)
method _changeSharedAbPassword (line 1251) | MenuEntryBase<String> _changeSharedAbPassword()
method _existIn (line 1266) | MenuEntryBase<String> _existIn()
class MyGroupPeerCard (line 1299) | class MyGroupPeerCard extends BasePeerCard {
method _buildMenuItems (line 1308) | Future<List<MenuEntryBase<String>>> _buildMenuItems(
method _update (line 1347) | void _update()
function _rdpDialog (line 1350) | void _rdpDialog(String id)
function submit (line 1361) | submit()
function getOnline (line 1467) | Widget getOnline(double rightPadding, bool online)
function build_more (line 1477) | Widget build_more(BuildContext context, {bool invert = false})
class TagPainter (line 1503) | class TagPainter extends CustomPainter {
method paint (line 1512) | void paint(Canvas canvas, Size size)
method shouldRepaint (line 1536) | bool shouldRepaint(covariant CustomPainter oldDelegate)
function connectInPeerTab (line 1541) | void connectInPeerTab(BuildContext context, Peer peer, PeerTabIndex tab,
FILE: flutter/lib/common/widgets/peer_tab_page.dart
class PeerTabPage (line 28) | class PeerTabPage extends StatefulWidget {
method createState (line 31) | State<PeerTabPage> createState()
class _TabEntry (line 34) | class _TabEntry {
function _menuPadding (line 40) | EdgeInsets? _menuPadding()
class _PeerTabPageState (line 44) | class _PeerTabPageState extends State<PeerTabPage>
method _loadLocalOptions (line 78) | void _loadLocalOptions()
method handleTabSelection (line 91) | Future<void> handleTabSelection(int tabIndex)
method build (line 102) | Widget build(BuildContext context)
method selectionWrap (line 104) | Widget selectionWrap(Widget widget)
method _createSwitchBar (line 137) | Widget _createSwitchBar(BuildContext context)
method _createPeersView (line 188) | Widget _createPeersView()
method _createRefresh (line 211) | Widget _createRefresh(
method _createPeerViewTypeSwitch (line 237) | Widget _createPeerViewTypeSwitch(BuildContext context)
method _createMultiSelection (line 241) | Widget _createMultiSelection()
method mobileShowTabVisibilityMenu (line 262) | void mobileShowTabVisibilityMenu()
method visibleContextMenuListener (line 296) | Widget visibleContextMenuListener(Widget child)
method visibleContextMenu (line 328) | Widget visibleContextMenu(CancelFunc cancelFunc)
method createMultiSelectionBar (line 359) | Widget createMultiSelectionBar(PeerTabModel model)
method deleteSelection (line 385) | Widget deleteSelection()
method onSubmit (line 394) | onSubmit()
method addSelectionToFav (line 432) | Widget addSelectionToFav()
method addSelectionToAb (line 457) | Widget addSelectionToAb()
method editSelectionTags (line 478) | Widget editSelectionTags()
method selectionCount (line 501) | Widget selectionCount(int count)
method selectAll (line 508) | Widget selectAll(PeerTabModel model)
method closeSelection (line 523) | Widget closeSelection()
method _toggleTags (line 535) | Widget _toggleTags()
method _landscapeRightActions (line 552) | List<Widget> _landscapeRightActions(BuildContext context)
method _portraitRightActions (line 576) | List<Widget> _portraitRightActions(BuildContext context)
method dropDown (line 586) | dropDown(List<Widget> menus)
class PeerSearchBar (line 659) | class PeerSearchBar extends StatefulWidget {
method createState (line 663) | State<StatefulWidget> createState()
class _PeerSearchBarState (line 666) | class _PeerSearchBarState extends State<PeerSearchBar> {
method build (line 670) | Widget build(BuildContext context)
method _buildSearchBar (line 688) | Widget _buildSearchBar()
class PeerViewDropdown (line 769) | class PeerViewDropdown extends StatefulWidget {
method createState (line 773) | State<PeerViewDropdown> createState()
class _PeerViewDropdownState (line 776) | class _PeerViewDropdownState extends State<PeerViewDropdown> {
method build (line 778) | Widget build(BuildContext context)
class PeerSortDropdown (line 862) | class PeerSortDropdown extends StatefulWidget {
method createState (line 866) | State<PeerSortDropdown> createState()
class _PeerSortDropdownState (line 869) | class _PeerSortDropdownState extends State<PeerSortDropdown> {
method _loadLocalOptions (line 876) | void _loadLocalOptions()
method build (line 885) | Widget build(BuildContext context)
class RefreshWidget (line 939) | class RefreshWidget extends StatefulWidget {
method createState (line 947) | State<RefreshWidget> createState()
class RefreshWidgetState (line 950) | class RefreshWidgetState extends State<RefreshWidget> {
method initState (line 955) | void initState()
method build (line 967) | Widget build(BuildContext context)
function _hoverAction (line 1001) | Widget _hoverAction(
class PullDownMenuEntryImpl (line 1030) | class PullDownMenuEntryImpl extends StatelessWidget
method build (line 1036) | Widget build(BuildContext context)
FILE: flutter/lib/common/widgets/peers_view.dart
type PeerFilter (line 21) | typedef PeerFilter = bool Function(Peer peer);
type PeerCardBuilder (line 22) | typedef PeerCardBuilder = Widget Function(Peer peer);
class PeerSortType (line 24) | class PeerSortType {
class LoadEvent (line 38) | class LoadEvent {
class PeersModelName (line 46) | class PeersModelName {
class _PeersView (line 70) | class _PeersView extends StatefulWidget {
method createState (line 85) | _PeersViewState createState()
class _PeersViewState (line 89) | class _PeersViewState extends State<_PeersView>
method initState (line 115) | void initState()
method dispose (line 122) | void dispose()
method onWindowFocus (line 130) | void onWindowFocus()
method onWindowBlur (line 136) | void onWindowBlur()
method onWindowRestore (line 152) | void onWindowRestore()
method onWindowMinimize (line 162) | void onWindowMinimize()
method didChangeAppLifecycleState (line 169) | void didChangeAppLifecycleState(AppLifecycleState state)
method build (line 181) | Widget build(BuildContext context)
method _cardId (line 228) | String _cardId(String id)
method _peerId (line 229) | String _peerId(String cardId)
method _buildPeersView (line 231) | Widget _buildPeersView(Peers peers)
method buildOnePeer (line 240) | buildOnePeer(Peer peer, bool isPortrait)
method _startCheckOnlines (line 315) | void _startCheckOnlines()
method matchPeers (line 361) | Future<List<Peer>>? matchPeers(
class BasePeersView (line 413) | abstract class BasePeersView extends StatelessWidget {
method build (line 426) | Widget build(BuildContext context)
class RecentPeersView (line 453) | class RecentPeersView extends BasePeersView {
method build (line 466) | Widget build(BuildContext context)
class FavoritePeersView (line 473) | class FavoritePeersView extends BasePeersView {
method build (line 486) | Widget build(BuildContext context)
class DiscoveredPeersView (line 493) | class DiscoveredPeersView extends BasePeersView {
method build (line 506) | Widget build(BuildContext context)
class AddressBookPeersView (line 514) | class AddressBookPeersView extends BasePeersView {
method _hitTag (line 528) | bool _hitTag(List<dynamic> selectedTags, List<dynamic> idents)
class MyGroupPeerView (line 557) | class MyGroupPeerView extends BasePeersView {
method filter (line 570) | bool filter(Peer peer)
FILE: flutter/lib/common/widgets/remote_input.dart
class RawKeyFocusScope (line 16) | class RawKeyFocusScope extends StatelessWidget {
method build (line 30) | Widget build(BuildContext context)
class RawTouchGestureDetectorRegion (line 61) | class RawTouchGestureDetectorRegion extends StatefulWidget {
method createState (line 75) | State<RawTouchGestureDetectorRegion> createState()
class _RawTouchGestureDetectorRegionState (line 88) | class _RawTouchGestureDetectorRegionState
method build (line 120) | Widget build(BuildContext context)
method isNotTouchBasedDevice (line 127) | bool isNotTouchBasedDevice()
method shouldBlockMouseModeEvent (line 133) | bool shouldBlockMouseModeEvent()
class RawPointerMouseRegion (line 591) | class RawPointerMouseRegion extends StatelessWidget {
method build (line 611) | Widget build(BuildContext context)
class CameraRawPointerMouseRegion (line 639) | class CameraRawPointerMouseRegion extends StatelessWidget {
method build (line 657) | Widget build(BuildContext context)
FILE: flutter/lib/common/widgets/setting_widgets.dart
function customImageQualityWidget (line 9) | customImageQualityWidget(
function onMoreChanged (line 38) | onMoreChanged(bool? value)
function customImageQualitySetting (line 150) | customImageQualitySetting()
function ServerConfigImportExportWidgets (line 181) | List<Widget> ServerConfigImportExportWidgets(
function import (line 185) | import()
function export (line 191) | export()
function otherDefaultSettings (line 216) | List<(String, String)> otherDefaultSettings()
class TrackpadSpeedWidget (line 252) | class TrackpadSpeedWidget extends StatefulWidget {
method createState (line 260) | TrackpadSpeedWidgetState createState()
class TrackpadSpeedWidgetState (line 263) | class TrackpadSpeedWidgetState extends State<TrackpadSpeedWidget> {
method updateValue (line 270) | void updateValue(int newValue)
method initState (line 282) | void initState()
method build (line 292) | Widget build(BuildContext context)
FILE: flutter/lib/common/widgets/toolbar.dart
class TTextMenu (line 19) | class TTextMenu {
method getChild (line 30) | Widget getChild()
class TRadioMenu (line 45) | class TRadioMenu<T> {
class TToggleMenu (line 58) | class TToggleMenu {
function handleOsPasswordEditIcon (line 66) | handleOsPasswordEditIcon(
function handleOsPasswordAction (line 73) | handleOsPasswordAction(
function toolbarControls (line 90) | List<TTextMenu> toolbarControls(BuildContext context, String id, FFI ffi)
function connectWithToken (line 161) | connectWithToken(
function toolbarViewStyle (line 359) | Future<List<TRadioMenu<String>>> toolbarViewStyle(
function onChanged (line 363) | void onChanged(String? value)
function toolbarImageQuality (line 389) | Future<List<TRadioMenu<String>>> toolbarImageQuality(
function onChanged (line 393) | onChanged(String? value)
function toolbarCodec (line 426) | Future<List<TRadioMenu<String>>> toolbarCodec(
function onChanged (line 451) | onChanged(String? value)
function radio (line 458) | TRadioMenu<String> radio(String label, String value, bool enabled)
function toolbarCursor (line 481) | Future<List<TToggleMenu>> toolbarCursor(
function toolbarDisplayToggle (line 595) | Future<List<TToggleMenu>> toolbarDisplayToggle(
function toolbarPrivacyMode (line 758) | List<TToggleMenu> toolbarPrivacyMode(
function getDefaultMenu (line 764) | getDefaultMenu(Future<void> Function(SessionID sid, String opt) toggleFunc)
function toolbarKeyboardToggles (line 830) | List<TToggleMenu> toolbarKeyboardToggles(FFI ffi)
function onChanged (line 844) | onChanged(bool? value)
function onChanged (line 891) | onChanged(bool? value)
function onChanged (line 909) | onChanged(bool? value)
function showVirtualDisplayMenu (line 923) | bool showVirtualDisplayMenu(FFI ffi)
function getVirtualDisplayMenuChildren (line 936) | List<Widget> getVirtualDisplayMenuChildren(
FILE: flutter/lib/consts.dart
class AndroidChannel (line 431) | class AndroidChannel {
type WindowsTarget (line 669) | enum WindowsTarget {
FILE: flutter/lib/desktop/pages/connection_page.dart
class OnlineStatusWidget (line 24) | class OnlineStatusWidget extends StatefulWidget {
method createState (line 31) | State<OnlineStatusWidget> createState()
class _OnlineStatusWidgetState (line 35) | class _OnlineStatusWidgetState extends State<OnlineStatusWidget> {
method onUsePublicServerGuide (line 43) | void onUsePublicServerGuide()
method initState (line 53) | void initState()
method dispose (line 61) | void dispose()
method build (line 67) | Widget build(BuildContext context)
method startServiceWidget (line 69) | startServiceWidget()
method setupServerWidget (line 81) | setupServerWidget()
method basicWidget (line 112) | basicWidget()
class ConnectionPage (line 191) | class ConnectionPage extends StatefulWidget {
method createState (line 195) | State<ConnectionPage> createState()
class _ConnectionPageState (line 199) | class _ConnectionPageState extends State<ConnectionPage>
method initState (line 220) | void initState()
method dispose (line 240) | void dispose()
method onWindowEvent (line 257) | void onWindowEvent(String eventName)
method onWindowEnterFullScreen (line 271) | void onWindowEnterFullScreen()
method onWindowLeaveFullScreen (line 277) | void onWindowLeaveFullScreen()
method onWindowClose (line 285) | void onWindowClose()
method onFocusChanged (line 290) | void onFocusChanged()
method build (line 305) | Widget build(BuildContext context)
method onConnect (line 330) | void onConnect(
method _buildRemoteIDTextField (line 343) | Widget _buildRemoteIDTextField(BuildContext context)
FILE: flutter/lib/desktop/pages/desktop_home_page.dart
class DesktopHomePage (line 29) | class DesktopHomePage extends StatefulWidget {
method createState (line 33) | State<DesktopHomePage> createState()
class _DesktopHomePageState (line 38) | class _DesktopHomePageState extends State<DesktopHomePage>
method build (line 60) | Widget build(BuildContext context)
method _buildBlock (line 74) | Widget _buildBlock({required Widget child})
method buildLeftPane (line 79) | Widget buildLeftPane(BuildContext context)
method buildPopupMenu (line 258) | Widget buildPopupMenu(BuildContext context)
method buildHelpCards (line 432) | Widget buildHelpCards(String updateUrl)
method buildInstallCard (line 576) | Widget buildInstallCard(String title, String content, String btnText,
method closeCard (line 587) | void closeCard()
method initState (line 698) | void initState()
method screenToMap (line 752) | screenToMap(window_size.Screen screen)
method isChattyMethod (line 768) | bool isChattyMethod(String methodName)
method dispose (line 878) | void dispose()
method didChangeAppLifecycleState (line 887) | void didChangeAppLifecycleState(AppLifecycleState state)
method buildPluginEntry (line 894) | Widget buildPluginEntry()
function setPasswordDialog (line 910) | void setPasswordDialog({VoidCallback? notEmptyCallback})
function submit (line 927) | submit()
FILE: flutter/lib/desktop/pages/desktop_setting_page.dart
class _TabInfo (line 45) | class _TabInfo {
type SettingsTabKey (line 53) | enum SettingsTabKey {
class DesktopSettingPage (line 64) | class DesktopSettingPage extends StatefulWidget {
method createState (line 89) | State<DesktopSettingPage> createState()
method switch2page (line 92) | void switch2page(SettingsTabKey page)
class _DesktopSettingPageState (line 115) | class _DesktopSettingPageState extends State<DesktopSettingPage>
method didChangeAppLifecycleState (line 150) | void didChangeAppLifecycleState(AppLifecycleState state)
method initState (line 158) | void initState()
method dispose (line 171) | void dispose()
method _settingTabs (line 179) | List<_TabInfo> _settingTabs()
method _children (line 220) | List<Widget> _children()
method _buildBlock (line 253) | Widget _buildBlock({required List<Widget> children})
method build (line 277) | Widget build(BuildContext context)
method _header (line 308) | Widget _header(BuildContext context)
method _listView (line 347) | Widget _listView({required List<_TabInfo> tabs})
method _listItem (line 355) | Widget _listItem({required _TabInfo tab})
class _General (line 399) | class _General extends StatefulWidget {
method createState (line 403) | State<_General> createState()
class _GeneralState (line 406) | class _GeneralState extends State<_General> {
method build (line 412) | Widget build(BuildContext context)
method theme (line 429) | Widget theme()
method onChanged (line 431) | onChanged(String value)
method service (line 456) | Widget service()
method other (line 484) | Widget other()
method wallpaper (line 601) | Widget wallpaper()
method hwcodec (line 640) | Widget hwcodec()
method audio (line 660) | Widget audio(BuildContext context)
method builder (line 665) | builder(devices, currentDevice, setDevice)
method record (line 681) | Widget record(BuildContext context)
method language (line 778) | Widget language()
type _AccessMode (line 811) | enum _AccessMode {
class _Safety (line 817) | class _Safety extends StatefulWidget {
method createState (line 821) | State<_Safety> createState()
class _SafetyState (line 824) | class _SafetyState extends State<_Safety> with AutomaticKeepAliveClientM...
method build (line 831) | Widget build(BuildContext context)
method tfa (line 856) | Widget tfa()
method tmpWrapper (line 859) | tmpWrapper()
method update (line 862) | update()
method onChanged (line 867) | onChanged(bool? checked)
method updateBot (line 902) | updateBot()
method onChangedBot (line 907) | onChangedBot(bool? checked)
method changeId (line 975) | Widget changeId()
method permissions (line 984) | Widget permissions(context)
method tmpWrapper (line 987) | tmpWrapper()
method password (line 1076) | Widget password(BuildContext context)
method callback (line 1103) | callback()
method more (line 1232) | Widget more(BuildContext context)
method onChanged (line 1253) | onChanged(bool b)
method directIp (line 1279) | List<Widget> directIp(BuildContext context)
method update (line 1281) | update(bool v)
method tmpWrapper (line 1288) | tmpWrapper()
method whitelist (line 1345) | Widget whitelist()
method tmpWrapper (line 1348) | tmpWrapper()
method update (line 1350) | update()
method onChanged (line 1354) | onChanged(bool? checked)
method hide_cm (line 1397) | Widget hide_cm(bool enabled)
method onHideCmChanged (line 1403) | onHideCmChanged(bool? b)
method autoDisconnect (line 1437) | List<Widget> autoDisconnect(BuildContext context)
method update (line 1439) | update(bool v)
method unlockPin (line 1497) | Widget unlockPin()
method update (line 1500) | update()
method onChanged (line 1504) | onChanged(bool? checked)
class _Network (line 1532) | class _Network extends StatefulWidget {
method createState (line 1536) | State<_Network> createState()
class _NetworkState (line 1539) | class _NetworkState extends State<_Network> with AutomaticKeepAliveClien...
method build (line 1547) | Widget build(BuildContext context)
method network (line 1563) | Widget network(BuildContext context)
method listTile (line 1576) | Widget listTile({
method switchWidget (line 1631) | Widget switchWidget(IconData icon, String title, String tooltipMessage,
class _Display (line 1731) | class _Display extends StatefulWidget {
method createState (line 1735) | State<_Display> createState()
class _DisplayState (line 1738) | class _DisplayState extends State<_Display> {
method build (line 1740) | Widget build(BuildContext context)
method viewStyle (line 1753) | Widget viewStyle(BuildContext context)
method onChanged (line 1755) | onChanged(String value)
method scrollStyle (line 1775) | Widget scrollStyle(BuildContext context)
method onChanged (line 1777) | onChanged(String value)
method onEdgeScrollEdgeThicknessChanged (line 1785) | onEdgeScrollEdgeThicknessChanged(double value)
method imageQuality (line 1822) | Widget imageQuality(BuildContext context)
method onChanged (line 1823) | onChanged(String value)
method trackpadSpeed (line 1859) | Widget trackpadSpeed(BuildContext context)
method onDebouncer (line 1864) | void onDebouncer(int v)
method codec (line 1879) | Widget codec(BuildContext context)
method onChanged (line 1880) | onChanged(String value)
method privacyModeImpl (line 1936) | Widget privacyModeImpl(BuildContext context)
method onChanged (line 1950) | onChanged(String value)
method otherRow (line 1972) | Widget otherRow(String label, String key)
method onChanged (line 1975) | onChanged(bool b)
method other (line 1999) | Widget other(BuildContext context)
class _Account (line 2006) | class _Account extends StatefulWidget {
method createState (line 2010) | State<_Account> createState()
class _AccountState (line 2013) | class _AccountState extends State<_Account> {
method build (line 2015) | Widget build(BuildContext context)
method accountAction (line 2025) | Widget accountAction()
method useInfo (line 2037) | Widget useInfo()
method _buildUserAvatar (line 2088) | Widget? _buildUserAvatar()
class _Checkbox (line 2099) | class _Checkbox extends StatefulWidget {
method createState (line 2112) | State<_Checkbox> createState()
class _CheckboxState (line 2115) | class _CheckboxState extends State<_Checkbox> {
method build (line 2125) | Widget build(BuildContext context)
method onChanged (line 2126) | onChanged(bool b)
class _Plugin (line 2150) | class _Plugin extends StatefulWidget {
method createState (line 2154) | State<_Plugin> createState()
class _PluginState (line 2157) | class _PluginState extends State<_Plugin> {
method build (line 2159) | Widget build(BuildContext context)
method pluginCard (line 2173) | Widget pluginCard(PluginInfo plugin)
method accountAction (line 2182) | Widget accountAction()
class _Printer (line 2195) | class _Printer extends StatefulWidget {
method createState (line 2199) | State<_Printer> createState()
class __PrinterState (line 2202) | class __PrinterState extends State<_Printer> {
method build (line 2204) | Widget build(BuildContext context)
method outgoing (line 2212) | Widget outgoing(BuildContext context)
method tipOsNotSupported (line 2216) | Widget tipOsNotSupported()
method tipClientNotInstalled (line 2223) | Widget tipClientNotInstalled()
method tipPrinterNotInstalled (line 2231) | Widget tipPrinterNotInstalled()
method tipReady (line 2269) | Widget tipReady()
method incoming (line 2295) | Widget incoming(BuildContext context)
method onRadioChanged (line 2296) | onRadioChanged(String value)
class _About (line 2342) | class _About extends StatefulWidget {
method createState (line 2346) | State<_About> createState()
class _AboutState (line 2349) | class _AboutState extends State<_About> {
method build (line 2351) | Widget build(BuildContext context)
function _Card (line 2445) | Widget _Card(
function _OptionCheckBox (line 2482) | Widget _OptionCheckBox(
function getOpt (line 2495) | getOpt()
function onChanged (line 2504) | onChanged(option)
function _Radio (line 2554) | Widget _Radio<T>(BuildContext context,
class WaylandCard (line 2585) | class WaylandCard extends StatefulWidget {
method createState (line 2589) | State<WaylandCard> createState()
class _WaylandCardState (line 2592) | class _WaylandCardState extends State<WaylandCard> {
method initState (line 2612) | void initState()
method dispose (line 2630) | void dispose()
method build (line 2639) | Widget build(BuildContext context)
method _buildClearScreenSelection (line 2663) | Widget _buildClearScreenSelection(BuildContext context, String restore...
method onConfirm (line 2664) | onConfirm()
method showConfirmMsgBox (line 2676) | showConfirmMsgBox()
method _buildClearShortcutsInhibitorPermission (line 2699) | Widget _buildClearShortcutsInhibitorPermission(BuildContext context)
method onConfirm (line 2700) | onConfirm()
method showConfirmMsgBox (line 2707) | showConfirmMsgBox()
function _Button (line 2745) | Widget _Button(String label, Function() onPressed,
function _SubButton (line 2766) | Widget _SubButton(String label, Function() onPressed, [bool enabled = tr...
function _SubLabeledWidget (line 2780) | Widget _SubLabeledWidget(BuildContext context, String label, Widget child,
function _lock (line 2796) | Widget _lock(
function _LabeledTextField (line 2840) | _LabeledTextField(
class _CountDownButton (line 2885) | class _CountDownButton extends StatefulWidget {
method createState (line 2897) | State<_CountDownButton> createState()
class _CountDownButtonState (line 2900) | class _CountDownButtonState extends State<_CountDownButton> {
method dispose (line 2908) | void dispose()
method _startCountdownTimer (line 2913) | void _startCountdownTimer()
method build (line 2929) | Widget build(BuildContext context)
function changeSocks5Proxy (line 2952) | void changeSocks5Proxy()
function submit (line 2976) | submit()
function cancel (line 2981) | cancel()
FILE: flutter/lib/desktop/pages/desktop_tab_page.dart
class DesktopTabPage (line 15) | class DesktopTabPage extends StatefulWidget {
method createState (line 19) | State<DesktopTabPage> createState()
method onAddSetting (line 21) | void onAddSetting(
class _DesktopTabPageState (line 40) | class _DesktopTabPageState extends State<DesktopTabPage> {
method initState (line 69) | void initState()
method dispose (line 85) | void dispose()
method build (line 93) | Widget build(BuildContext context)
FILE: flutter/lib/desktop/pages/file_manager_page.dart
type LocationStatus (line 31) | enum LocationStatus {
type MouseFocusScope (line 43) | enum MouseFocusScope {
class FileManagerPage (line 54) | class FileManagerPage extends StatefulWidget {
method createState (line 75) | State<StatefulWidget> createState()
class _FileManagerPageState (line 82) | class _FileManagerPageState extends State<FileManagerPage>
method initState (line 96) | void initState()
method dispose (line 124) | void dispose()
method didChangeAppLifecycleState (line 139) | void didChangeAppLifecycleState(AppLifecycleState state)
method willPopScope (line 146) | Widget willPopScope(Widget child)
method build (line 161) | Widget build(BuildContext context)
method dropArea (line 186) | Widget dropArea(FileManagerView fileView)
method generateCard (line 199) | Widget generateCard(Widget child)
method statusList (line 213) | Widget statusList()
method getIcon (line 214) | Widget getIcon(JobProgress job)
method statusListView (line 234) | statusListView(List<JobProgress> jobs)
method handleDragDone (line 370) | void handleDragDone(DropDoneDetails details, bool isLocal)
class FileManagerView (line 388) | class FileManagerView extends StatefulWidget {
method createState (line 396) | State<StatefulWidget> createState()
class _FileManagerViewState (line 399) | class _FileManagerViewState extends State<FileManagerView> {
method initState (line 427) | void initState()
method dispose (line 435) | void dispose()
method build (line 445) | Widget build(BuildContext context)
method _handleColumnPorportions (line 478) | void _handleColumnPorportions()
method onLocationFocusChanged (line 499) | void onLocationFocusChanged()
method headTools (line 511) | Widget headTools()
method submit (line 743) | submit()
method cancel (line 761) | cancel()
method menu (line 975) | Widget menu({bool isLocal = false})
method _buildFileList (line 1040) | Widget _buildFileList(
method onTap (line 1104) | onTap()
method onSecondaryTap (line 1115) | onSecondaryTap()
method onSecondaryTapDown (line 1143) | onSecondaryTapDown(details)
method _jumpToEntry (line 1311) | void _jumpToEntry(bool isLocal, Entry entry,
method _onSelectedChanged (line 1333) | void _onSelectedChanged(SelectedItems selectedItems, List<Entry> entries,
method _checkDoubleClick (line 1369) | bool _checkDoubleClick(Entry entry)
method _onDrag (line 1383) | void _onDrag(double dx, RxDouble column1, RxDouble column2)
method _buildFileBrowserHeader (line 1394) | Widget _buildFileBrowserHeader(BuildContext context)
method headerItemFunc (line 1428) | Widget headerItemFunc(double? width, SortBy sortBy, String name)
method buildBread (line 1473) | Widget buildBread()
method getPathBreadCrumbItems (line 1598) | List<BreadCrumbItem> getPathBreadCrumbItems(
method buildPathLocation (line 1645) | Widget buildPathLocation()
function buildWindowsThisPC (line 1687) | Widget buildWindowsThisPC(BuildContext context, [TextStyle? textStyle])
FILE: flutter/lib/desktop/pages/file_manager_tab_page.dart
class FileManagerTabPage (line 17) | class FileManagerTabPage extends StatefulWidget {
method createState (line 23) | State<FileManagerTabPage> createState()
class _FileManagerTabPageState (line 26) | class _FileManagerTabPageState extends State<FileManagerTabPage> {
method initState (line 65) | void initState()
method build (line 111) | Widget build(BuildContext context)
method onRemoveId (line 140) | void onRemoveId(String id)
method windowId (line 146) | int windowId()
method handleWindowCloseButton (line 150) | Future<bool> handleWindowCloseButton()
FILE: flutter/lib/desktop/pages/install_page.dart
class InstallPage (line 14) | class InstallPage extends StatefulWidget {
method createState (line 18) | State<InstallPage> createState()
class _InstallPageState (line 21) | class _InstallPageState extends State<InstallPage> {
method dispose (line 37) | void dispose()
method build (line 43) | Widget build(BuildContext context)
class _InstallPageBody (line 56) | class _InstallPageBody extends StatefulWidget {
method createState (line 60) | State<_InstallPageBody> createState()
class _InstallPageBodyState (line 63) | class _InstallPageBodyState extends State<_InstallPageBody>
method initState (line 87) | void initState()
method dispose (line 93) | void dispose()
method onWindowClose (line 99) | void onWindowClose()
method Option (line 106) | InkWell Option(RxBool option, {String label = ''})
method build (line 130) | Widget build(BuildContext context)
method install (line 253) | void install()
method do_install (line 254) | do_install()
method selectInstallPath (line 267) | void selectInstallPath()
FILE: flutter/lib/desktop/pages/port_forward_page.dart
class _PortForward (line 16) | class _PortForward {
class PortForwardPage (line 27) | class PortForwardPage extends StatefulWidget {
method createState (line 50) | State<PortForwardPage> createState()
class _PortForwardPageState (line 57) | class _PortForwardPageState extends State<PortForwardPage>
method initState (line 66) | void initState()
method dispose (line 85) | void dispose()
method build (line 93) | Widget build(BuildContext context)
method text (line 153) | text(String label)
method buildTunnelDataRow (line 252) | Widget buildTunnelDataRow(BuildContext context, _PortForward pf, int i...
method text (line 253) | text(String label)
method refreshTunnelConfig (line 285) | void refreshTunnelConfig()
method text1 (line 297) | text1(String label)
method text2 (line 299) | text2(String label)
FILE: flutter/lib/desktop/pages/port_forward_tab_page.dart
class PortForwardTabPage (line 13) | class PortForwardTabPage extends StatefulWidget {
method createState (line 19) | State<PortForwardTabPage> createState()
class _PortForwardTabPageState (line 22) | class _PortForwardTabPageState extends State<PortForwardTabPage> {
method initState (line 56) | void initState()
method build (line 100) | Widget build(BuildContext context)
method onRemoveId (line 140) | void onRemoveId(String id)
method windowId (line 146) | int windowId()
FILE: flutter/lib/desktop/pages/remote_page.dart
class RemotePage (line 34) | class RemotePage extends StatefulWidget {
method createState (line 68) | State<RemotePage> createState()
class _RemotePageState (line 75) | class _RemotePageState extends State<RemotePage>
method _initStates (line 111) | void _initStates(String id)
method initState (line 119) | void initState()
method _cancelPointerLockCenterDebounceTimer (line 184) | void _cancelPointerLockCenterDebounceTimer()
method onWindowBlur (line 190) | void onWindowBlur()
method onWindowFocus (line 212) | void onWindowFocus()
method onWindowRestore (line 228) | void onWindowRestore()
method onWindowMaximize (line 242) | void onWindowMaximize()
method onWindowResize (line 250) | void onWindowResize()
method onWindowMove (line 257) | void onWindowMove()
method _updatePointerLockCenterIfNeeded (line 265) | void _updatePointerLockCenterIfNeeded()
method onWindowMinimize (line 282) | void onWindowMinimize()
method onWindowEnterFullScreen (line 292) | void onWindowEnterFullScreen()
method onWindowLeaveFullScreen (line 300) | void onWindowLeaveFullScreen()
method dispose (line 308) | Future<void> dispose()
method emptyOverlay (line 346) | Widget emptyOverlay()
method buildBody (line 355) | Widget buildBody(BuildContext context)
method remoteToolbar (line 356) | remoteToolbar(BuildContext context)
method bodyWidget (line 375) | bodyWidget()
method build (line 473) | Widget build(BuildContext context)
method enterView (line 489) | void enterView(PointerEnterEvent evt)
method leaveView (line 511) | void leaveView(PointerExitEvent evt)
method _buildRawTouchAndPointerRegion (line 534) | Widget _buildRawTouchAndPointerRegion(
method _buildRawPointerMouseRegion (line 545) | Widget _buildRawPointerMouseRegion(
method getBodyForDesktop (line 573) | Widget getBodyForDesktop(BuildContext context)
class _ViewStyleUpdater (line 639) | class _ViewStyleUpdater extends StatefulWidget {
method createState (line 652) | State<_ViewStyleUpdater> createState()
class _ViewStyleUpdaterState (line 655) | class _ViewStyleUpdaterState extends State<_ViewStyleUpdater> {
method build (line 660) | Widget build(BuildContext context)
class ImagePaint (line 693) | class ImagePaint extends StatefulWidget {
method createState (line 714) | State<StatefulWidget> createState()
class _ImagePaintState (line 717) | class _ImagePaintState extends State<ImagePaint> {
method build (line 728) | Widget build(BuildContext context)
method isViewAdaptive (line 733) | bool isViewAdaptive()
method isViewOriginal (line 734) | bool isViewOriginal()
method mouseRegion (line 736) | mouseRegion({child})
method getCursorScale (line 737) | double getCursorScale()
method _buildScrollbarNonTextureRender (line 824) | Widget _buildScrollbarNonTextureRender(
method _buildScrollAutoNonTextureRender (line 832) | Widget _buildScrollAutoNonTextureRender(
method _BuildPaintTextureRender (line 851) | Widget _BuildPaintTextureRender(
method _buildCustomCursor (line 888) | MouseCursor _buildCustomCursor(BuildContext context, double scale)
method _buildDisabledCursor (line 894) | MouseCursor _buildDisabledCursor(BuildContext context, double scale)
method _buildCrossScrollbarFromLayout (line 900) | Widget _buildCrossScrollbarFromLayout(
method _buildListener (line 983) | Widget _buildListener(Widget child)
class CursorPaint (line 992) | class CursorPaint extends StatelessWidget {
method build (line 1003) | Widget build(BuildContext context)
FILE: flutter/lib/desktop/pages/remote_tab_page.dart
class _MenuTheme (line 26) | class _MenuTheme {
class ConnectionTabPage (line 33) | class ConnectionTabPage extends StatefulWidget {
method createState (line 39) | State<ConnectionTabPage> createState()
class _ConnectionTabPageState (line 42) | class _ConnectionTabPageState extends State<ConnectionTabPage> {
method initState (line 114) | void initState()
method build (line 132) | Widget build(BuildContext context)
method _tabMenuBuilder (line 245) | Widget _tabMenuBuilder(String key, CancelFunc cancelFunc)
method onRemoveId (line 361) | void onRemoveId(String id)
method loopCloseWindow (line 368) | Future<void> loopCloseWindow()
method windowId (line 388) | int windowId()
method handleWindowCloseButton (line 392) | Future<bool> handleWindowCloseButton()
method _remoteMethodHandler (line 423) | Future<dynamic> _remoteMethodHandler(call, fromWindowId)
class _RelativeMouseModeHint (line 562) | class _RelativeMouseModeHint extends StatelessWidget {
method build (line 569) | Widget build(BuildContext context)
FILE: flutter/lib/desktop/pages/server_page.dart
class DesktopServerPage (line 25) | class DesktopServerPage extends StatefulWidget {
method createState (line 29) | State<DesktopServerPage> createState()
class _DesktopServerPageState (line 32) | class _DesktopServerPageState extends State<DesktopServerPage>
method initState (line 45) | void initState()
method dispose (line 51) | void dispose()
method onWindowClose (line 57) | void onWindowClose()
method onRemoveId (line 69) | void onRemoveId(String id)
method build (line 76) | Widget build(BuildContext context)
class ConnectionManager (line 108) | class ConnectionManager extends StatefulWidget {
method createState (line 110) | State<StatefulWidget> createState()
class ConnectionManagerState (line 113) | class ConnectionManagerState extends State<ConnectionManager>
method didChangeAppLifecycleState (line 141) | void didChangeAppLifecycleState(AppLifecycleState state)
method initState (line 152) | void initState()
method dispose (line 159) | void dispose()
method build (line 165) | Widget build(BuildContext context)
method pointerHandler (line 167) | pointerHandler(PointerEvent e)
method buildSidePage (line 268) | Widget buildSidePage()
method _buildKeyEventBlock (line 281) | Widget _buildKeyEventBlock(Widget child)
method buildTitleBar (line 285) | Widget buildTitleBar()
method buildScrollJumper (line 311) | Widget buildScrollJumper()
method handleWindowCloseButton (line 326) | Future<bool> handleWindowCloseButton()
function buildConnectionCard (line 348) | Widget buildConnectionCard(Client client)
class _AppIcon (line 373) | class _AppIcon extends StatelessWidget {
method build (line 377) | Widget build(BuildContext context)
class _CloseButton (line 385) | class _CloseButton extends StatelessWidget {
method build (line 389) | Widget build(BuildContext context)
class _CmHeader (line 404) | class _CmHeader extends StatefulWidget {
method createState (line 410) | State<_CmHeader> createState()
class _CmHeaderState (line 413) | class _CmHeaderState extends State<_CmHeader>
method initState (line 421) | void initState()
method dispose (line 435) | void dispose()
method build (line 441) | Widget build(BuildContext context)
method _buildClientAvatar (line 570) | Widget _buildClientAvatar()
method _buildInitialAvatar (line 580) | Widget _buildInitialAvatar()
class _PrivilegeBoard (line 601) | class _PrivilegeBoard extends StatefulWidget {
method createState (line 607) | State<StatefulWidget> createState()
class _PrivilegeBoardState (line 610) | class _PrivilegeBoardState extends State<_PrivilegeBoard> {
method buildPermissionIcon (line 612) | Widget buildPermissionIcon(bool enabled, IconData iconData,
method build (line 643) | Widget build(BuildContext context)
class _CmControlPanel (line 820) | class _CmControlPanel extends StatelessWidget {
method build (line 826) | Widget build(BuildContext context)
method buildButton (line 1085) | Widget buildButton(BuildContext context,
method handleDisconnect (line 1146) | void handleDisconnect()
method handleAccept (line 1150) | void handleAccept(BuildContext context)
method handleElevate (line 1155) | void handleElevate(BuildContext context)
method handleClose (line 1161) | void handleClose()
method handleSwitchBack (line 1168) | void handleSwitchBack(BuildContext context)
method handleVoiceCall (line 1172) | void handleVoiceCall(bool accept)
method closeVoiceCall (line 1176) | void closeVoiceCall()
function checkClickTime (line 1181) | void checkClickTime(int id, Function() callback)
function allowRemoteCMModification (line 1194) | bool allowRemoteCMModification()
class _FileTransferLogPage (line 1199) | class _FileTransferLogPage extends StatefulWidget {
method createState (line 1203) | State<_FileTransferLogPage> createState()
class __FileTransferLogPageState (line 1206) | class __FileTransferLogPageState extends State<_FileTransferLogPage> {
method build (line 1208) | Widget build(BuildContext context)
method generateCard (line 1212) | Widget generateCard(Widget child)
method statusList (line 1277) | Widget statusList()
method statusListView (line 1285) | statusListView(List<CmFileLog> jobs)
FILE: flutter/lib/desktop/pages/terminal_connection_manager.dart
class TerminalConnectionManager (line 6) | class TerminalConnectionManager {
method getConnection (line 14) | FFI getConnection({
method releaseConnection (line 52) | void releaseConnection(String peerId)
method hasConnection (line 74) | bool hasConnection(String peerId)
method getExistingConnection (line 80) | FFI? getExistingConnection(String peerId)
method getConnectionCount (line 85) | int getConnectionCount()
method getTerminalCount (line 88) | int getTerminalCount(String peerId)
method getServiceId (line 91) | String? getServiceId(String peerId)
method setServiceId (line 94) | void setServiceId(String peerId, String serviceId)
FILE: flutter/lib/desktop/pages/terminal_page.dart
class TerminalPage (line 11) | class TerminalPage extends StatefulWidget {
method createState (line 37) | State<TerminalPage> createState()
class _TerminalPageState (line 44) | class _TerminalPageState extends State<TerminalPage>
method initState (line 53) | void initState()
method dispose (line 117) | void dispose()
method _onTabStateChanged (line 129) | void _onTabStateChanged(DesktopTabState state)
method _requestFocusIfSelected (line 139) | void _requestFocusIfSelected()
method _calculatePadding (line 157) | EdgeInsets _calculatePadding(double heightPx)
method build (line 168) | Widget build(BuildContext context)
FILE: flutter/lib/desktop/pages/terminal_tab_page.dart
class TerminalTabPage (line 22) | class TerminalTabPage extends StatefulWidget {
method createState (line 28) | State<TerminalTabPage> createState()
class _TerminalTabPageState (line 31) | class _TerminalTabPageState extends State<TerminalTabPage> {
method _createTerminalTab (line 60) | TabInfo _createTerminalTab({
method _closeTab (line 94) | Future<void> _closeTab(String tabKey)
method _closeAllTabs (line 143) | Future<void> _closeAllTabs()
method _closeTerminalSessionIfNeeded (line 181) | Future<void> _closeTerminalSessionIfNeeded(String tabKey,
method _parseTabKey (line 229) | (String peerId, int terminalId)? _parseTabKey(String tabKey)
method _tabMenuBuilder (line 245) | Widget _tabMenuBuilder(String peerId, CancelFunc cancelFunc)
method initState (line 302) | void initState()
method dispose (line 355) | void dispose()
method _restoreSessions (line 360) | Future<void> _restoreSessions(String arguments)
method _handleKeyEvent (line 386) | bool _handleKeyEvent(KeyEvent event)
method _addNewTerminal (line 474) | void _addNewTerminal(String peerId, {int? terminalId})
method _addNewTerminalForCurrentPeer (line 499) | void _addNewTerminalForCurrentPeer({int? terminalId})
method build (line 508) | Widget build(BuildContext context)
method onRemoveId (line 543) | void onRemoveId(String id)
method windowId (line 549) | int windowId()
method _buildAddButton (line 553) | Widget _buildAddButton()
method handleWindowCloseButton (line 564) | Future<bool> handleWindowCloseButton()
FILE: flutter/lib/desktop/pages/view_camera_page.dart
class ViewCameraPage (line 32) | class ViewCameraPage extends StatefulWidget {
method createState (line 66) | State<ViewCameraPage> createState()
class _ViewCameraPageState (line 73) | class _ViewCameraPageState extends State<ViewCameraPage>
method _initStates (line 98) | void _initStates(String id)
method initState (line 101) | void initState()
method onWindowBlur (line 154) | void onWindowBlur()
method onWindowFocus (line 169) | void onWindowFocus()
method onWindowRestore (line 179) | void onWindowRestore()
method onWindowMaximize (line 191) | void onWindowMaximize()
method onWindowMinimize (line 197) | void onWindowMinimize()
method onWindowEnterFullScreen (line 203) | void onWindowEnterFullScreen()
method onWindowLeaveFullScreen (line 211) | void onWindowLeaveFullScreen()
method dispose (line 219) | Future<void> dispose()
method emptyOverlay (line 247) | Widget emptyOverlay()
method buildBody (line 256) | Widget buildBody(BuildContext context)
method remoteToolbar (line 257) | remoteToolbar(BuildContext context)
method bodyWidget (line 276) | bodyWidget()
method build (line 349) | Widget build(BuildContext context)
method enterView (line 365) | void enterView(PointerEnterEvent evt)
method leaveView (line 384) | void leaveView(PointerExitEvent evt)
method _buildRawTouchAndPointerRegion (line 404) | Widget _buildRawTouchAndPointerRegion(
method _buildRawPointerMouseRegion (line 416) | Widget _buildRawPointerMouseRegion(
method getBodyForDesktop (line 444) | Widget getBodyForDesktop(BuildContext context)
class ImagePaint (line 488) | class ImagePaint extends StatefulWidget {
method createState (line 503) | State<StatefulWidget> createState()
class _ImagePaintState (line 506) | class _ImagePaintState extends State<ImagePaint> {
method build (line 512) | Widget build(BuildContext context)
method isViewOriginal (line 517) | bool isViewOriginal()
method _buildScrollbarNonTextureRender (line 564) | Widget _buildScrollbarNonTextureRender(
method _buildScrollAutoNonTextureRender (line 572) | Widget _buildScrollAutoNonTextureRender(
method _BuildPaintTextureRender (line 580) | Widget _BuildPaintTextureRender(
method _buildCustomCursor (line 615) | MouseCursor _buildCustomCursor(BuildContext context, double scale)
method _buildDisabledCursor (line 621) | MouseCursor _buildDisabledCursor(BuildContext context, double scale)
method _buildCrossScrollbarFromLayout (line 627) | Widget _buildCrossScrollbarFromLayout(
method _buildListener (line 710) | Widget _buildListener(Widget child)
FILE: flutter/lib/desktop/pages/view_camera_tab_page.dart
class _MenuTheme (line 26) | class _MenuTheme {
class ViewCameraTabPage (line 33) | class ViewCameraTabPage extends StatefulWidget {
method createState (line 39) | State<ViewCameraTabPage> createState()
class _ViewCameraTabPageState (line 42) | class _ViewCameraTabPageState extends State<ViewCameraTabPage> {
method initState (line 114) | void initState()
method build (line 132) | Widget build(BuildContext context)
method _tabMenuBuilder (line 240) | Widget _tabMenuBuilder(String key, CancelFunc cancelFunc)
method onRemoveId (line 327) | void onRemoveId(String id)
method loopCloseWindow (line 334) | Future<void> loopCloseWindow()
method windowId (line 352) | int windowId()
method handleWindowCloseButton (line 356) | Future<bool> handleWindowCloseButton()
method _remoteMethodHandler (line 387) | Future<dynamic> _remoteMethodHandler(call, fromWindowId)
FILE: flutter/lib/desktop/screen/desktop_file_transfer_screen.dart
class DesktopFileTransferScreen (line 7) | class DesktopFileTransferScreen extends StatelessWidget {
method build (line 14) | Widget build(BuildContext context)
FILE: flutter/lib/desktop/screen/desktop_port_forward_screen.dart
class DesktopPortForwardScreen (line 7) | class DesktopPortForwardScreen extends StatelessWidget {
method build (line 14) | Widget build(BuildContext context)
FILE: flutter/lib/desktop/screen/desktop_remote_screen.dart
class DesktopRemoteScreen (line 9) | class DesktopRemoteScreen extends StatelessWidget {
method build (line 18) | Widget build(BuildContext context)
FILE: flutter/lib/desktop/screen/desktop_terminal_screen.dart
class DesktopTerminalScreen (line 7) | class DesktopTerminalScreen extends StatelessWidget {
method build (line 14) | Widget build(BuildContext context)
FILE: flutter/lib/desktop/screen/desktop_view_camera_screen.dart
class DesktopViewCameraScreen (line 9) | class DesktopViewCameraScreen extends StatelessWidget {
method build (line 18) | Widget build(BuildContext context)
FILE: flutter/lib/desktop/widgets/button.dart
class Button (line 7) | class Button extends StatefulWidget {
method createState (line 32) | State<Button> createState()
class _ButtonState (line 35) | class _ButtonState extends State<Button> {
method build (line 40) | Widget build(BuildContext context)
class FixedWidthButton (line 87) | class FixedWidthButton extends StatefulWidget {
method createState (line 114) | State<FixedWidthButton> createState()
class _FixedWidthButtonState (line 117) | class _FixedWidthButtonState extends State<FixedWidthButton> {
method build (line 122) | Widget build(BuildContext context)
FILE: flutter/lib/desktop/widgets/dragable_divider.dart
class DraggableDivider (line 3) | class DraggableDivider extends StatefulWidget {
method createState (line 21) | State<DraggableDivider> createState()
class _DraggableDividerState (line 24) | class _DraggableDividerState extends State<DraggableDivider> {
method build (line 26) | Widget build(BuildContext context)
FILE: flutter/lib/desktop/widgets/kb_layout_type_chooser.dart
type KBChosenCallback (line 9) | typedef KBChosenCallback = Future<bool> Function(String);
class _KBImage (line 25) | class _KBImage extends StatelessWidget {
method build (line 37) | Widget build(BuildContext context)
class _KBChooser (line 66) | class _KBChooser extends StatelessWidget {
method build (line 80) | Widget build(BuildContext context)
method onChanged (line 81) | onChanged(String? v)
class KBLayoutTypeChooser (line 123) | class KBLayoutTypeChooser extends StatelessWidget {
method build (line 139) | Widget build(BuildContext context)
function getLocalPlatformForKBLayoutType (line 171) | String getLocalPlatformForKBLayoutType(String peerPlatform)
function showKBLayoutTypeChooserIfNeeded (line 187) | showKBLayoutTypeChooserIfNeeded(
function showKBLayoutTypeChooser (line 203) | showKBLayoutTypeChooser(
FILE: flutter/lib/desktop/widgets/list_search_action_listener.dart
class ListSearchActionListener (line 3) | class ListSearchActionListener extends StatelessWidget {
method build (line 20) | Widget build(BuildContext context)
type ListSearchAction (line 43) | enum ListSearchAction { search, next }
class TimeoutStringBuffer (line 45) | class TimeoutStringBuffer {
method input (line 57) | ListSearchAction input(String ch)
FILE: flutter/lib/desktop/widgets/material_mod_popup_menu.dart
type PopupMenuPosition (line 35) | enum PopupMenuPosition {
class PopupMenuEntry (line 72) | abstract class PopupMenuEntry<T> extends StatefulWidget {
method represents (line 97) | bool represents(T? value)
class PopupMenuDivider (line 110) | class PopupMenuDivider extends PopupMenuEntry<Never> {
method represents (line 124) | bool represents(void value)
method createState (line 127) | State<PopupMenuDivider> createState()
class _PopupMenuDividerState (line 130) | class _PopupMenuDividerState extends State<PopupMenuDivider> {
method build (line 132) | Widget build(BuildContext context)
class _MenuItem (line 139) | class _MenuItem extends SingleChildRenderObjectWidget {
method createRenderObject (line 149) | RenderObject createRenderObject(BuildContext context)
method updateRenderObject (line 154) | void updateRenderObject(
class _RenderMenuItem (line 160) | class _RenderMenuItem extends RenderShiftedBox {
method computeDryLayout (line 166) | Size computeDryLayout(BoxConstraints constraints)
method performLayout (line 174) | void performLayout()
class PopupMenuItem (line 226) | class PopupMenuItem<T> extends PopupMenuEntry<T> {
method represents (line 302) | bool represents(T? value)
method createState (line 305) | PopupMenuItemState<T, PopupMenuItem<T>> createState()
class PopupMenuItemState (line 325) | class PopupMenuItemState<T, W extends PopupMenuItem<T>> extends State<W> {
method buildChild (line 333) | Widget? buildChild()
method handleTap (line 342) | void handleTap()
method build (line 350) | Widget build(BuildContext context)
class CheckedPopupMenuItem (line 461) | class CheckedPopupMenuItem<T> extends PopupMenuItem<T> {
method createState (line 506) | PopupMenuItemState<T, CheckedPopupMenuItem<T>> createState()
class _CheckedPopupMenuItemState (line 510) | class _CheckedPopupMenuItemState<T>
method initState (line 518) | void initState()
method handleTap (line 526) | void handleTap()
method buildChild (line 537) | Widget buildChild()
class _PopupMenu (line 549) | class _PopupMenu<T> extends StatelessWidget {
method build (line 562) | Widget build(BuildContext context)
class _PopupMenuRouteLayout (line 652) | class _PopupMenuRouteLayout extends SingleChildLayoutDelegate {
method getConstraintsForChild (line 687) | BoxConstraints getConstraintsForChild(BoxConstraints constraints)
method getPositionForChild (line 696) | Offset getPositionForChild(Size size, Size childSize)
method _closestScreen (line 741) | Rect _closestScreen(Iterable<Rect> screens, Offset point)
method _fitInsideScreen (line 752) | Offset _fitInsideScreen(Rect screen, Size childSize, Offset wantedPosi...
method shouldRelayout (line 777) | bool shouldRelayout(_PopupMenuRouteLayout oldDelegate)
class _PopupMenuRoute (line 792) | class _PopupMenuRoute<T> extends PopupRoute<T> {
method createAnimation (line 820) | Animation<double> createAnimation()
method buildPage (line 841) | Widget buildPage(BuildContext context, Animation<double> animation,
method _avoidBounds (line 885) | Set<Rect> _avoidBounds(MediaQueryData mediaQuery)
class PopupMenu (line 890) | class PopupMenu<T> extends StatelessWidget {
method _buildMenu (line 906) | Widget _buildMenu(BuildContext context)
method build (line 961) | Widget build(BuildContext context)
function showMenu (line 1042) | Future<T?> showMenu<T>({
type PopupMenuItemSelected (line 1092) | typedef PopupMenuItemSelected<T> = void Function(T value);
type PopupMenuCanceled (line 1098) | typedef PopupMenuCanceled = void Function();
type PopupMenuItemBuilder (line 1104) | typedef PopupMenuItemBuilder<T> = List<PopupMenuEntry<T>> Function(
type MenuWrapper (line 1107) | typedef MenuWrapper = Widget Function(Widget child);
class PopupMenuButton (line 1132) | class PopupMenuButton<T> extends StatefulWidget {
method createState (line 1295) | PopupMenuButtonState<T> createState()
class PopupMenuButtonState (line 1302) | class PopupMenuButtonState<T> extends State<PopupMenuButton<T>> {
method showButtonMenu (line 1311) | void showButtonMenu()
method build (line 1381) | Widget build(BuildContext context)
class _EffectiveMouseCursor (line 1418) | class _EffectiveMouseCursor extends MaterialStateMouseCursor {
method resolve (line 1425) | MouseCursor resolve(Set<MaterialState> states)
FILE: flutter/lib/desktop/widgets/menu_button.dart
class MenuButton (line 3) | class MenuButton extends StatefulWidget {
method createState (line 25) | State<MenuButton> createState()
class _MenuButtonState (line 28) | class _MenuButtonState extends State<MenuButton> {
method build (line 33) | Widget build(BuildContext context)
FILE: flutter/lib/desktop/widgets/popup_menu.dart
class PopupMenuChildrenItem (line 10) | class PopupMenuChildrenItem<T> extends mod_menu.PopupMenuEntry<T> {
method represents (line 37) | bool represents(T? value)
method createState (line 40) | MyPopupMenuItemState<T, PopupMenuChildrenItem<T>> createState()
class MyPopupMenuItemState (line 44) | class MyPopupMenuItemState<T, W extends PopupMenuChildrenItem<T>>
method handleTap (line 55) | void handleTap(T value)
method build (line 61) | Widget build(BuildContext context)
class MenuConfig (line 90) | class MenuConfig {
type DismissCallback (line 110) | typedef DismissCallback = Function();
class MenuEntryBase (line 112) | abstract class MenuEntryBase<T> {
method build (line 122) | List<mod_menu.PopupMenuEntry<T>> build(BuildContext context, MenuConfi...
class MenuEntryDivider (line 134) | class MenuEntryDivider<T> extends MenuEntryBase<T> {
method build (line 136) | List<mod_menu.PopupMenuEntry<T>> build(
class MenuEntryRadioOption (line 146) | class MenuEntryRadioOption {
type RadioOptionsGetter (line 162) | typedef RadioOptionsGetter = List<MenuEntryRadioOption> Function();
type RadioCurOptionGetter (line 163) | typedef RadioCurOptionGetter = Future<String> Function();
type RadioOptionSetter (line 164) | typedef RadioOptionSetter = Future<void> Function(
class MenuEntryRadioUtils (line 167) | class MenuEntryRadioUtils<T> {}
class MenuEntryRadios (line 169) | class MenuEntryRadios<T> extends MenuEntryBase<T> {
method _buildMenuItem (line 208) | mod_menu.PopupMenuEntry<T> _buildMenuItem(
method getTextChild (line 210) | Widget getTextChild()
method onPressed (line 258) | onPressed()
method build (line 287) | List<mod_menu.PopupMenuEntry<T>> build(
class MenuEntrySubRadios (line 293) | class MenuEntrySubRadios<T> extends MenuEntryBase<T> {
method _buildSecondMenu (line 330) | mod_menu.PopupMenuEntry<T> _buildSecondMenu(
method build (line 386) | List<mod_menu.PopupMenuEntry<T>> build(
type SwitchType (line 418) | enum SwitchType {
type SwitchGetter (line 423) | typedef SwitchGetter = Future<bool> Function();
type SwitchSetter (line 424) | typedef SwitchSetter = Future<void> Function(bool);
class MenuEntrySwitchBase (line 426) | abstract class MenuEntrySwitchBase<T> extends MenuEntryBase<T> {
method setOption (line 449) | Future<void> setOption(bool? option)
method build (line 459) | List<mod_menu.PopupMenuEntry<T>> build(
class MenuEntrySwitch (line 524) | class MenuEntrySwitch<T> extends MenuEntrySwitchBase<T> {
class MenuEntrySwitchSync (line 568) | class MenuEntrySwitchSync<T> extends MenuEntrySwitchBase<T> {
type Switch2Getter (line 608) | typedef Switch2Getter = RxBool Function();
type Switch2Setter (line 609) | typedef Switch2Setter = Future<void> Function(bool);
class MenuEntrySwitch2 (line 611) | class MenuEntrySwitch2<T> extends MenuEntrySwitchBase<T> {
class MenuEntrySubMenu (line 644) | class MenuEntrySubMenu<T> extends MenuEntryBase<T> {
method build (line 657) | List<mod_menu.PopupMenuEntry<T>> build(
class MenuEntryButton (line 692) | class MenuEntryButton<T> extends MenuEntryBase<T> {
method _buildChild (line 710) | Widget _buildChild(BuildContext context, MenuConfig conf)
method build (line 738) | List<mod_menu.PopupMenuEntry<T>> build(
class CustomPopupMenuTheme (line 750) | class CustomPopupMenuTheme {
FILE: flutter/lib/desktop/widgets/refresh_wrapper.dart
class RefreshWrapper (line 6) | class RefreshWrapper extends StatefulWidget {
method createState (line 12) | State<RefreshWrapper> createState()
method of (line 14) | RefreshWrapperState? of(BuildContext context)
class RefreshWrapperState (line 24) | class RefreshWrapperState extends State<RefreshWrapper> {
method build (line 26) | Widget build(BuildContext context)
method _rebuildElement (line 41) | void _rebuildElement(Element el)
FILE: flutter/lib/desktop/widgets/remote_toolbar.dart
class ToolbarState (line 31) | class ToolbarState {
method init (line 62) | Future<void> init(SessionID sessionId)
class _ToolbarTheme (line 115) | class _ToolbarTheme {
method borderColor (line 141) | Color borderColor(BuildContext context)
method dividerColor (line 144) | Color? dividerColor(BuildContext context)
method defaultMenuStyle (line 147) | MenuStyle defaultMenuStyle(BuildContext context)
method borderWrapper (line 163) | Widget borderWrapper(
type DismissFunc (line 178) | typedef DismissFunc = void Function();
class RemoteMenuEntry (line 180) | class RemoteMenuEntry {
method insertLock (line 181) | MenuEntryButton<String> insertLock(
method insertCtrlAltDel (line 204) | insertCtrlAltDel(
class RemoteToolbar (line 228) | class RemoteToolbar extends StatefulWidget {
method createState (line 247) | State<RemoteToolbar> createState()
class _RemoteToolbarState (line 250) | class _RemoteToolbarState extends State<RemoteToolbar> {
method _setFullscreen (line 258) | void _setFullscreen(bool v)
method _minimize (line 273) | void _minimize()
method build (line 320) | Widget build(BuildContext context)
method _buildDraggableCollapse (line 339) | Widget _buildDraggableCollapse(BuildContext context)
method _buildToolbar (line 371) | Widget _buildToolbar(BuildContext context)
method themeData (line 443) | ThemeData themeData()
class _PinMenu (line 472) | class _PinMenu extends StatelessWidget {
method build (line 477) | Widget build(BuildContext context)
class _MobileActionMenu (line 493) | class _MobileActionMenu extends StatelessWidget {
method build (line 498) | Widget build(BuildContext context)
class _MonitorMenu (line 515) | class _MonitorMenu extends StatelessWidget {
method build (line 533) | Widget build(BuildContext context)
method buildMonitorMenu (line 537) | Widget buildMonitorMenu(BuildContext context)
method buildMultiMonitorMenu (line 554) | Widget buildMultiMonitorMenu(BuildContext context)
method buildMonitorSubmenuWidget (line 558) | Widget buildMonitorSubmenuWidget(BuildContext context)
method chooseDisplayBehavior (line 569) | Widget chooseDisplayBehavior()
method buildMonitorList (line 595) | List<Widget> buildMonitorList(BuildContext context, bool isMulti)
method buildMonitorButton (line 599) | buildMonitorButton(int i)
method getMonitors (line 658) | getMonitors()
class _ControlMenu (line 746) | class _ControlMenu extends StatelessWidget {
method build (line 755) | Widget build(BuildContext context)
class ScreenAdjustor (line 776) | class ScreenAdjustor {
method isWindowCanBeAdjusted (line 883) | Future<bool> isWindowCanBeAdjusted()
class _DisplayMenu (line 918) | class _DisplayMenu extends StatefulWidget {
method createState (line 939) | State<_DisplayMenu> createState()
class _DisplayMenuState (line 942) | class _DisplayMenuState extends State<_DisplayMenu> {
method initState (line 958) | void initState()
method build (line 972) | Widget build(BuildContext context)
method menuChildrenGetter (line 975) | menuChildrenGetter(_IconSubmenuButtonState state)
method _customControlsIfCustomSelected (line 1086) | Widget _customControlsIfCustomSelected({ValueChanged<int>? onChanged})
method onChangeScrollStyle (line 1124) | onChangeScrollStyle(String? value)
method onChangeEdgeScrollEdgeThickness (line 1132) | onChangeEdgeScrollEdgeThickness(double? value)
class _CustomScaleMenuControls (line 1264) | class _CustomScaleMenuControls extends StatefulWidget {
method createState (line 1271) | State<_CustomScaleMenuControls> createState()
class _CustomScaleMenuControlsState (line 1275) | class _CustomScaleMenuControlsState
method build (line 1284) | Widget build(BuildContext context)
class _RectValueThumbShape (line 1354) | class _RectValueThumbShape extends SliderComponentShape {
method getPreferredSize (line 1376) | Size getPreferredSize(bool isEnabled, bool isDiscrete)
method paint (line 1381) | void paint(
class _ResolutionsMenu (line 1436) | class _ResolutionsMenu extends StatefulWidget {
method createState (line 1449) | State<_ResolutionsMenu> createState()
class _ResolutionsMenuState (line 1455) | class _ResolutionsMenuState extends State<_ResolutionsMenu> {
method initState (line 1472) | void initState()
method scaledRect (line 1479) | Rect? scaledRect()
method build (line 1494) | Widget build(BuildContext context)
method _getLocalResolutionWayland (line 1539) | Future<void> _getLocalResolutionWayland()
method _OriginalResolutionMenuButton (line 1628) | Widget _OriginalResolutionMenuButton(
method _FitLocalResolutionMenuButton (line 1651) | Widget _FitLocalResolutionMenuButton(
method _customResolutionMenuButton (line 1669) | Widget _customResolutionMenuButton(BuildContext context, isVirtualDisp...
method _resolutionInput (line 1695) | Widget _resolutionInput(TextEditingController controller)
method _supportedResolutionMenuButtons (line 1712) | List<Widget> _supportedResolutionMenuButtons()
method _getBestFitResolution (line 1721) | Resolution? _getBestFitResolution()
method _isRemoteResolutionFitLocal (line 1740) | bool _isRemoteResolutionFitLocal()
class _KeyboardMenu (line 1753) | class _KeyboardMenu extends StatelessWidget {
method build (line 1765) | Widget build(BuildContext context)
method toolbarToggles (line 1768) | toolbarToggles()
method onChanged (line 1834) | onChanged(String? value)
class _ChatMenu (line 2034) | class _ChatMenu extends StatefulWidget {
method createState (line 2044) | State<_ChatMenu> createState()
class _ChatMenuState (line 2047) | class _ChatMenuState extends State<_ChatMenu> {
method build (line 2052) | Widget build(BuildContext context)
class _VoiceCallMenu (line 2108) | class _VoiceCallMenu extends StatelessWidget {
method build (line 2118) | Widget build(BuildContext context)
method menuChildrenGetter (line 2119) | menuChildrenGetter(_IconSubmenuButtonState state)
method buildCallWaiting (line 2177) | Widget buildCallWaiting(BuildContext context)
class _RecordMenu (line 2188) | class _RecordMenu extends StatelessWidget {
method build (line 2192) | Widget build(BuildContext context)
class _CloseMenu (line 2214) | class _CloseMenu extends StatelessWidget {
method build (line 2221) | Widget build(BuildContext context)
class _IconMenuButton (line 2237) | class _IconMenuButton extends StatefulWidget {
method createState (line 2263) | State<_IconMenuButton> createState()
class _IconMenuButtonState (line 2266) | class _IconMenuButtonState extends State<_IconMenuButton> {
method build (line 2270) | Widget build(BuildContext context)
class _IconSubmenuButton (line 2318) | class _IconSubmenuButton extends StatefulWidget {
method createState (line 2343) | State<_IconSubmenuButton> createState()
class _IconSubmenuButtonState (line 2346) | class _IconSubmenuButtonState extends State<_IconSubmenuButton> {
method setState (line 2350) | void setState(VoidCallback fn)
method build (line 2355) | Widget build(BuildContext context)
class _SubmenuButton (line 2397) | class _SubmenuButton extends StatelessWidget {
method build (line 2409) | Widget build(BuildContext context)
class MenuButton (line 2420) | class MenuButton extends StatelessWidget {
method build (line 2434) | Widget build(BuildContext context)
class CkbMenuButton (line 2450) | class CkbMenuButton extends StatelessWidget {
method build (line 2464) | Widget build(BuildContext context)
class RdoMenuButton (line 2481) | class RdoMenuButton<T> extends StatelessWidget {
method build (line 2500) | Widget build(BuildContext context)
class _DraggableShowHide (line 2518) | class _DraggableShowHide extends StatefulWidget {
method createState (line 2542) | State<_DraggableShowHide> createState()
class _DraggableShowHideState (line 2545) | class _DraggableShowHideState extends State<_DraggableShowHide> {
method _buildDraggable (line 2575) | Widget _buildDraggable(BuildContext context)
method build (line 2614) | Widget build(BuildContext context)
method buttonWrapper (line 2622) | buttonWrapper(VoidCallback? onPressed, Widget child,
class InputModeMenu (line 2730) | class InputModeMenu {
function _menuDismissCallback (line 2737) | _menuDismissCallback(FFI ffi)
function _buildPointerTrackWidget (line 2739) | Widget _buildPointerTrackWidget(Widget child, FFI? ffi)
class EdgeThicknessControl (line 2750) | class EdgeThicknessControl extends StatelessWidget {
method build (line 2766) | Widget build(BuildContext context)
FILE: flutter/lib/desktop/widgets/tabbar_widget.dart
class TabInfo (line 29) | class TabInfo {
type DesktopTabType (line 50) | enum DesktopTabType {
class DesktopTabState (line 61) | class DesktopTabState {
function showRightMenu (line 75) | CancelFunc showRightMenu(ToastBuilder builder,
class DesktopTabController (line 95) | class DesktopTabController {
method add (line 108) | void add(TabInfo tab)
method remove (line 131) | void remove(int index)
method jumpTo (line 151) | bool jumpTo(int index, {bool callOnSelected = true})
method jumpToByKey (line 181) | bool jumpToByKey(String key, {bool callOnSelected = true})
method jumpToByKeyAndDisplay (line 185) | bool jumpToByKeyAndDisplay(String key, int display, {bool isCamera = f...
method closeBy (line 200) | void closeBy(String? key)
method clear (line 213) | void clear()
method widget (line 218) | Widget? widget(String key)
class TabThemeConf (line 223) | class TabThemeConf {
type TabBuilder (line 229) | typedef TabBuilder = Widget Function(
type TabMenuBuilder (line 231) | typedef TabMenuBuilder = Widget Function(String key);
type LabelGetter (line 232) | typedef LabelGetter = Rx<String> Function(String key);
class DesktopTab (line 237) | class DesktopTab extends StatefulWidget {
method tablabelGetter (line 281) | RxString tablabelGetter(String peerId)
method createState (line 287) | State<DesktopTab> createState()
class _DesktopTabState (line 293) | class _DesktopTabState extends State<DesktopTab>
method tablabelGetter (line 330) | RxString tablabelGetter(String peerId)
method initState (line 336) | void initState()
method dispose (line 363) | void dispose()
method _setMaximized (line 370) | void _setMaximized(bool maximize)
method onWindowFocus (line 377) | void onWindowFocus()
method onWindowBlur (line 382) | void onWindowBlur()
method onWindowMinimize (line 387) | void onWindowMinimize()
method onWindowMaximize (line 394) | void onWindowMaximize()
method onWindowUnmaximize (line 401) | void onWindowUnmaximize()
method onWindowMoved (line 421) | void onWindowMoved()
method onWindowResized (line 427) | void onWindowResized()
method onWindowClose (line 433) | void onWindowClose()
method mainWindowClose (line 434) | mainWindowClose()
method notMainWindowClose (line 435) | notMainWindowClose(WindowController windowController)
method macOSWindowClose (line 451) | macOSWindowClose(
method build (line 511) | Widget build(BuildContext context)
method _buildPageView (line 545) | Widget _buildPageView()
method isHideSingleItem (line 588) | bool isHideSingleItem()
method _buildBar (line 594) | Widget _buildBar()
class WindowActionPanel (line 701) | class WindowActionPanel extends StatefulWidget {
method createState (line 730) | State<StatefulWidget> createState()
class WindowActionPanelState (line 735) | class WindowActionPanelState extends State<WindowActionPanel> {
method showTabDowndown (line 736) | bool showTabDowndown()
method existingInvisibleTab (line 745) | List<String> existingInvisibleTab()
method build (line 753) | Widget build(BuildContext context)
method _toggleMaximize (line 824) | void _toggleMaximize()
function startDragging (line 832) | void startDragging(bool isMainWindow)
function setMovable (line 840) | void setMovable(bool isMainWindow, bool movable)
function toggleMaximize (line 850) | Future<bool> toggleMaximize(bool isMainWindow)
function closeConfirmDialog (line 871) | Future<bool> closeConfirmDialog()
function submit (line 874) | submit()
class _ListView (line 919) | class _ListView extends StatelessWidget {
method isHideSingleItem (line 949) | bool isHideSingleItem()
method build (line 969) | Widget build(BuildContext context)
class _Tab (line 1024) | class _Tab extends StatefulWidget {
method createState (line 1063) | State<_Tab> createState()
class _TabState (line 1066) | class _TabState extends State<_Tab> with RestorationMixin {
method _buildTabContent (line 1069) | Widget _buildTabContent()
method getWidgetWithBuilder (line 1103) | Widget getWidgetWithBuilder()
method build (line 1143) | Widget build(BuildContext context)
method restoreState (line 1207) | void restoreState(RestorationBucket? oldBucket, bool initialRestore)
class _CloseButton (line 1212) | class _CloseButton extends StatelessWidget {
method build (line 1225) | Widget build(BuildContext context)
class ActionIcon (line 1250) | class ActionIcon extends StatefulWidget {
method createState (line 1271) | State<ActionIcon> createState()
class _ActionIconState (line 1274) | class _ActionIconState extends State<ActionIcon> {
method build (line 1278) | Widget build(BuildContext context)
class AddButton (line 1313) | class AddButton extends StatelessWidget {
method build (line 1319) | Widget build(BuildContext context)
class _TabDropDownButton (line 1329) | class _TabDropDownButton extends StatefulWidget {
method createState (line 1338) | State<_TabDropDownButton> createState()
class _TabDropDownButtonState (line 1341) | class _TabDropDownButtonState extends State<_TabDropDownButton> {
method build (line 1345) | Widget build(BuildContext context)
function _showTabBarBottomDivider (line 1429) | bool _showTabBarBottomDivider(DesktopTabType tabType)
class TabbarTheme (line 1433) | class TabbarTheme extends ThemeExtension<TabbarTheme> {
method copyWith (line 1482) | ThemeExtension<TabbarTheme> copyWith({
method lerp (line 1511) | ThemeExtension<TabbarTheme> lerp(
method color (line 1537) | color(BuildContext context)
FILE: flutter/lib/desktop/widgets/titlebar_widget.dart
class DesktopTitleBar (line 7) | class DesktopTitleBar extends StatelessWidget {
method build (line 13) | Widget build(BuildContext context)
FILE: flutter/lib/desktop/widgets/update_progress.dart
function handleUpdate (line 12) | void handleUpdate(String releasePageUrl)
class UpdateProgress (line 59) | class UpdateProgress extends StatefulWidget {
method createState (line 70) | State<UpdateProgress> createState()
class UpdateProgressState (line 73) | class UpdateProgressState extends State<UpdateProgress> {
method initState (line 82) | void initState()
method dispose (line 99) | void dispose()
method cancelQueryTimer (line 110) | void cancelQueryTimer()
method handleDownloadNewVersion (line 115) | Future<void> handleDownloadNewVersion(Map<String, dynamic> evt)
method _onError (line 133) | void _onError(String error, {bool isExtractDmg = false})
method close (line 143) | close()
method jumplink (line 147) | jumplink()
method retry (line 152) | retry()
method _updateDownloadData (line 174) | void _updateDownloadData()
method updateMsgBox (line 229) | void updateMsgBox()
method handleExtractUpdateDmg (line 245) | Future<void> handleExtractUpdateDmg(Map<String, dynamic> evt)
method build (line 255) | Widget build(BuildContext context)
method getValue (line 256) | getValue()
FILE: flutter/lib/main.dart
function main (line 40) | Future<void> main(List<String> args)
function initEnv (line 122) | Future<void> initEnv(String appType)
function runMainApp (line 135) | void runMainApp(bool startService)
function runMobileApp (line 180) | void runMobileApp()
function runMultiWindow (line 192) | void runMultiWindow(
function runConnectionManagerScreen (line 289) | void runConnectionManagerScreen()
function showCmWindow (line 310) | showCmWindow({bool isStartup = false})
function hideCmWindow (line 337) | hideCmWindow({bool isStartup = false})
function _runApp (line 357) | void _runApp(
function runInstallPage (line 391) | void runInstallPage()
function getHiddenTitleBarWindowOptions (line 405) | WindowOptions getHiddenTitleBarWindowOptions(
class App (line 425) | class App extends StatefulWidget {
method createState (line 427) | State<App> createState()
class _AppState (line 430) | class _AppState extends State<App> with WidgetsBindingObserver {
method initState (line 432) | void initState()
method dispose (line 459) | void dispose()
method didChangeMetrics (line 465) | void didChangeMetrics()
method _updateOrientation (line 469) | void _updateOrientation()
method build (line 485) | Widget build(BuildContext context)
function _keepScaleBuilder (line 551) | Widget _keepScaleBuilder(BuildContext context, Widget? child)
function _registerEventHandler (line 560) | _registerEventHandler()
function keyListenerBuilder (line 580) | Widget keyListenerBuilder(BuildContext context, Widget? child)
FILE: flutter/lib/mobile/pages/connection_page.dart
class ConnectionPage (line 22) | class ConnectionPage extends StatefulWidget implements PageShape {
method createState (line 35) | State<ConnectionPage> createState()
class _ConnectionPageState (line 39) | class _ConnectionPageState extends State<ConnectionPage> {
method initState (line 63) | void initState()
method build (line 81) | Widget build(BuildContext context)
method onConnect (line 101) | void onConnect()
method onFocusChanged (line 106) | void onFocusChanged()
method _buildUpdateUI (line 122) | Widget _buildUpdateUI(String updateUrl)
method _buildRemoteIDTextField (line 150) | Widget _buildRemoteIDTextField()
method dispose (line 362) | void dispose()
FILE: flutter/lib/mobile/pages/file_manager_page.dart
class FileManagerPage (line 12) | class FileManagerPage extends StatefulWidget {
method createState (line 26) | State<StatefulWidget> createState()
type SelectMode (line 29) | enum SelectMode { local, remote, none }
function eq (line 32) | bool eq(bool? currentIsLocal)
function toggle (line 45) | void toggle(bool currentIsLocal)
class _FileManagerPageState (line 64) | class _FileManagerPageState extends State<FileManagerPage> {
method initState (line 77) | void initState()
method dispose (line 93) | void dispose()
method build (line 104) | Widget build(BuildContext context)
method bottomSheet (line 279) | Widget? bottomSheet()
method getActiveSelectedItems (line 400) | SelectedItems? getActiveSelectedItems()
class FileManagerView (line 424) | class FileManagerView extends StatefulWidget {
method createState (line 431) | State<StatefulWidget> createState()
class _FileManagerViewState (line 434) | class _FileManagerViewState extends State<FileManagerView> {
method initState (line 444) | void initState()
method build (line 450) | Widget build(BuildContext context)
method breadCrumbScrollToEnd (line 590) | void breadCrumbScrollToEnd()
method headTools (line 601) | Widget headTools()
method listTail (line 665) | Widget listTail()
method getPathBreadCrumbItems (line 687) | List<BreadCrumbItem> getPathBreadCrumbItems(String shortPath, bool isW...
class BottomSheetBody (line 707) | class BottomSheetBody extends StatelessWidget {
method build (line 722) | BottomSheet build(BuildContext context)
FILE: flutter/lib/mobile/pages/home_page.dart
class PageShape (line 12) | abstract class PageShape extends Widget {
class HomePage (line 18) | class HomePage extends StatefulWidget {
method createState (line 24) | HomePageState createState()
class HomePageState (line 27) | class HomePageState extends State<HomePage> {
method refreshPages (line 36) | void refreshPages()
method initState (line 43) | void initState()
method initPages (line 48) | void initPages()
method build (line 63) | Widget build(BuildContext context)
method appTitle (line 109) | Widget appTitle()
class WebHomePage (line 157) | class WebHomePage extends StatelessWidget {
method build (line 162) | Widget build(BuildContext context)
FILE: flutter/lib/mobile/pages/remote_page.dart
function _disableAndroidSoftKeyboard (line 34) | void _disableAndroidSoftKeyboard({bool? isKeyboardVisible})
class RemotePage (line 43) | class RemotePage extends StatefulWidget {
method createState (line 58) | State<RemotePage> createState()
class _RemotePageState (line 61) | class _RemotePageState extends State<RemotePage> with WidgetsBindingObse...
method initState (line 91) | void initState()
method dispose (line 127) | Future<void> dispose()
method didChangeAppLifecycleState (line 154) | void didChangeAppLifecycleState(AppLifecycleState state)
method trySyncClipboard (line 162) | void trySyncClipboard()
method emptyOverlay (line 170) | Widget emptyOverlay(Color bgColor)
method onSoftKeyboardChanged (line 179) | void onSoftKeyboardChanged(bool visible)
method _handleIOSSoftKeyboardInput (line 216) | void _handleIOSSoftKeyboardInput(String newValue)
method _handleNonIOSSoftKeyboardInput (line 266) | void _handleNonIOSSoftKeyboardInput(String newValue)
method handleSoftKeyboardInput (line 308) | void handleSoftKeyboardInput(String newValue)
method inputChar (line 316) | void inputChar(String char)
method openKeyboard (line 325) | void openKeyboard()
method _bottomWidget (line 345) | Widget _bottomWidget()
method build (line 352) | Widget build(BuildContext context)
method getRawPointerAndKeyBody (line 446) | Widget getRawPointerAndKeyBody(Widget child)
method getBottomAppBar (line 462) | Widget getBottomAppBar()
method getBodyForMobile (line 566) | Widget getBodyForMobile()
method getBodyForDesktopWithListener (line 628) | Widget getBodyForDesktopWithListener()
method _getMobileActionMenus (line 642) | List<TTextMenu> _getMobileActionMenus()
method showActions (line 677) | void showActions(String id)
method onPressVoiceCall (line 723) | onPressVoiceCall()
method onPressEndVoiceCall (line 724) | onPressEndVoiceCall()
method makeTextMenu (line 726) | makeTextMenu(String label, Widget icon, VoidCallback onPressed,
method getGestureHelp (line 790) | BottomAppBar getGestureHelp()
class KeyHelpTools (line 827) | class KeyHelpTools extends StatefulWidget {
method createState (line 838) | State<KeyHelpTools> createState()
class _KeyHelpToolsState (line 841) | class _KeyHelpToolsState extends State<KeyHelpTools> {
method wrap (line 850) | Widget wrap(String text, void Function() onPressed,
method build (line 886) | Widget build(BuildContext context)
class ImagePaint (line 1050) | class ImagePaint extends StatelessWidget {
method build (line 1055) | Widget build(BuildContext context)
class CursorPaint (line 1073) | class CursorPaint extends StatelessWidget {
method build (line 1078) | Widget build(BuildContext context)
function showOptions (line 1124) | void showOptions(
function getVirtualDisplayMenu (line 1337) | TTextMenu? getVirtualDisplayMenu(FFI ffi, String id)
function getResolutionMenu (line 1360) | TTextMenu? getResolutionMenu(FFI ffi, String id)
function sendPrompt (line 1404) | void sendPrompt(bool isMac, String key)
class FABLocation (line 1419) | class FABLocation extends FloatingActionButtonLocation {
method getOffset (line 1426) | Offset getOffset(ScaffoldPrelayoutGeometry scaffoldGeometry)
FILE: flutter/lib/mobile/pages/scan_page.dart
class ScanPage (line 14) | class ScanPage extends StatefulWidget {
method createState (line 16) | State<ScanPage> createState()
class _ScanPageState (line 19) | class _ScanPageState extends State<ScanPage> {
method reassemble (line 25) | void reassemble()
method build (line 35) | Widget build(BuildContext context)
method _buildQrView (line 49) | Widget _buildQrView(BuildContext context)
method _onQRViewCreated (line 68) | void _onQRViewCreated(QRViewController controller)
method _onPermissionSet (line 79) | void _onPermissionSet(BuildContext context, QRViewController ctrl, boo...
method _pickImage (line 85) | Future<void> _pickImage()
method _buildImagePickerButton (line 111) | Widget _buildImagePickerButton()
method _buildFlashToggleButton (line 120) | Widget _buildFlashToggleButton()
method _buildCameraSwitchButton (line 131) | Widget _buildCameraSwitchButton()
method dispose (line 143) | void dispose()
method showServerSettingFromQr (line 149) | void showServerSettingFromQr(String data)
FILE: flutter/lib/mobile/pages/server_page.dart
class ServerPage (line 18) | class ServerPage extends StatefulWidget implements PageShape {
method createState (line 34) | State<StatefulWidget> createState()
class _DropDownAction (line 37) | class _DropDownAction extends StatelessWidget {
method listTile (line 46) | listTile(String text, bool checked)
method callback (line 147) | callback()
method build (line 176) | Widget build(BuildContext context)
class _ServerPageState (line 181) | class _ServerPageState extends State<ServerPage> {
method initState (line 185) | void initState()
method dispose (line 194) | void dispose()
method build (line 200) | Widget build(BuildContext context)
function checkService (line 225) | void checkService()
class ServiceNotRunningNotification (line 235) | class ServiceNotRunningNotification extends StatelessWidget {
method build (line 239) | Widget build(BuildContext context)
class ScamWarningDialog (line 270) | class ScamWarningDialog extends StatefulWidget {
method createState (line 276) | ScamWarningDialogState createState()
class ScamWarningDialogState (line 279) | class ScamWarningDialogState extends State<ScamWarningDialog> {
method initState (line 286) | void initState()
method startCountdown (line 292) | void startCountdown()
method dispose (line 305) | void dispose()
method build (line 311) | Widget build(BuildContext context)
class ServerInfo (line 462) | class ServerInfo extends StatelessWidget {
method build (line 469) | Widget build(BuildContext context)
method copyToClipboard (line 481) | void copyToClipboard(String value)
method ConnectionStateNotification (line 486) | Widget ConnectionStateNotification()
class PermissionChecker (line 573) | class PermissionChecker extends StatefulWidget {
method createState (line 577) | State<PermissionChecker> createState()
class _PermissionCheckerState (line 580) | class _PermissionCheckerState extends State<PermissionChecker> {
method build (line 582) | Widget build(BuildContext context)
class PermissionRow (line 631) | class PermissionRow extends StatelessWidget {
method build (line 640) | Widget build(BuildContext context)
class ConnectionManager (line 652) | class ConnectionManager extends StatelessWidget {
method build (line 656) | Widget build(BuildContext context)
method _buildDisconnectButton (line 704) | Widget _buildDisconnectButton(Client client)
method _buildNewConnectionHint (line 744) | Widget _buildNewConnectionHint(ServerModel serverModel, Client client)
method _buildNewVoiceCallHint (line 761) | List<Widget> _buildNewVoiceCallHint(
class PaddingCard (line 786) | class PaddingCard extends StatelessWidget {
method build (line 795) | Widget build(BuildContext context)
class ClientInfo (line 833) | class ClientInfo extends StatelessWidget {
method build (line 838) | Widget build(BuildContext context)
method _buildAvatar (line 862) | Widget _buildAvatar(BuildContext context)
function androidChannelInit (line 877) | void androidChannelInit()
function showScamWarning (line 934) | void showScamWarning(BuildContext context, ServerModel serverModel)
FILE: flutter/lib/mobile/pages/settings_page.dart
class SettingsPage (line 24) | class SettingsPage extends StatefulWidget implements PageShape {
method createState (line 35) | State<SettingsPage> createState()
type KeepScreenOn (line 40) | enum KeepScreenOn {
function _keepScreenOnToOption (line 46) | String _keepScreenOnToOption(KeepScreenOn value)
function optionToKeepScreenOn (line 57) | KeepScreenOn optionToKeepScreenOn(String value)
class _SettingsState (line 68) | class _SettingsState extends State<SettingsPage> with WidgetsBindingObse...
method initState (line 151) | void initState()
method dispose (line 232) | void dispose()
method didChangeAppLifecycleState (line 238) | void didChangeAppLifecycleState(AppLifecycleState state)
method checkAndUpdateIgnoreBatteryStatus (line 250) | Future<bool> checkAndUpdateIgnoreBatteryStatus()
method checkAndUpdateStartOnBoot (line 261) | Future<bool> checkAndUpdateStartOnBoot()
method build (line 274) | Widget build(BuildContext context)
method update (line 299) | update()
method update (line 318) | update()
method update (line 390) | update()
method onFloatingWindowChanged (line 628) | onFloatingWindowChanged(bool toValue)
method canStartOnBoot (line 990) | Future<bool> canStartOnBoot()
function showLanguageSettings (line 1019) | void showLanguageSettings(OverlayDialogManager dialogManager)
function setLang (line 1024) | setLang(v)
function showThemeSettings (line 1057) | void showThemeSettings(OverlayDialogManager dialogManager)
function setTheme (line 1061) | setTheme(v)
function showAbout (line 1085) | void showAbout(OverlayDialogManager dialogManager)
class ScanButton (line 1109) | class ScanButton extends StatelessWidget {
method build (line 1111) | Widget build(BuildContext context)
class _DisplayPage (line 1126) | class _DisplayPage extends StatefulWidget {
method createState (line 1130) | State<_DisplayPage> createState()
class __DisplayPageState (line 1133) | class __DisplayPageState extends State<_DisplayPage> {
method build (line 1135) | Widget build(BuildContext context)
method otherRow (line 1223) | SettingsTile otherRow(String label, String key)
class _ManageTrustedDevices (line 1240) | class _ManageTrustedDevices extends StatefulWidget {
method createState (line 1244) | State<_ManageTrustedDevices> createState()
class __ManageTrustedDevicesState (line 1247) | class __ManageTrustedDevicesState extends State<_ManageTrustedDevices> {
method build (line 1252) | Widget build(BuildContext context)
class _RadioEntry (line 1285) | class _RadioEntry {
type _RadioEntryGetter (line 1291) | typedef _RadioEntryGetter = String Function();
type _RadioEntrySetter (line 1292) | typedef _RadioEntrySetter = Future<void> Function(String);
function _getPopupDialogRadioEntry (line 1294) | SettingsTile _getPopupDialogRadioEntry({
function init (line 1306) | init()
function showDialog (line 1316) | void showDialog()
FILE: flutter/lib/mobile/pages/terminal_page.dart
class TerminalPage (line 15) | class TerminalPage extends StatefulWidget {
method createState (line 32) | State<TerminalPage> createState()
class _TerminalPageState (line 35) | class _TerminalPageState extends State<TerminalPage>
method initState (line 58) | void initState()
method dispose (line 103) | void dispose()
method didChangeMetrics (line 114) | void didChangeMetrics()
method _updateKeyboardHeight (line 126) | void _updateKeyboardHeight()
method _calculatePadding (line 133) | EdgeInsets _calculatePadding(double heightPx)
method build (line 145) | Widget build(BuildContext context)
method buildBody (line 156) | Widget buildBody()
method _buildCloseButton (line 262) | Widget _buildCloseButton()
method _buildFloatingKeyboard (line 306) | Widget _buildFloatingKeyboard()
method _buildKeyButton (line 362) | Widget _buildKeyButton(String label)
method _sendKeyToTerminal (line 378) | void _sendKeyToTerminal(String key)
method _getTerminalStyle (line 430) | TerminalStyle _getTerminalStyle()
FILE: flutter/lib/mobile/pages/view_camera_page.dart
function _disableAndroidSoftKeyboard (line 30) | void _disableAndroidSoftKeyboard({bool? isKeyboardVisible})
class ViewCameraPage (line 39) | class ViewCameraPage extends StatefulWidget {
method createState (line 54) | State<ViewCameraPage> createState()
class _ViewCameraPageState (line 57) | class _ViewCameraPageState extends State<ViewCameraPage>
method initState (line 87) | void initState()
method dispose (line 122) | Future<void> dispose()
method didChangeAppLifecycleState (line 148) | void didChangeAppLifecycleState(AppLifecycleState state)
method didChangeMetrics (line 151) | void didChangeMetrics()
method emptyOverlay (line 174) | Widget emptyOverlay(Color bgColor)
method _bottomWidget (line 183) | Widget _bottomWidget()
method build (line 188) | Widget build(BuildContext context)
method getRawPointerAndKeyBody (line 280) | Widget getRawPointerAndKeyBody(Widget child)
method getBottomAppBar (line 294) | Widget getBottomAppBar()
method getBodyForMobile (line 363) | Widget getBodyForMobile()
method getBodyForDesktopWithListener (line 409) | Widget getBodyForDesktopWithListener()
method _getMobileActionMenus (line 415) | List<TTextMenu> _getMobileActionMenus()
method showActions (line 450) | void showActions(String id)
method onPressVoiceCall (line 496) | onPressVoiceCall()
method onPressEndVoiceCall (line 497) | onPressEndVoiceCall()
method makeTextMenu (line 499) | makeTextMenu(String label, Widget icon, VoidCallback onPressed,
class ImagePaint (line 563) | class ImagePaint extends StatelessWidget {
method build (line 565) | Widget build(BuildContext context)
function showOptions (line 577) | void showOptions(
class FABLocation (line 718) | class FABLocation extends FloatingActionButtonLocation {
method getOffset (line 725) | Offset getOffset(ScaffoldPrelayoutGeometry scaffoldGeometry)
FILE: flutter/lib/mobile/widgets/custom_scale_widget.dart
class MobileCustomScaleControls (line 6) | class MobileCustomScaleControls extends StatefulWidget {
method createState (line 12) | State<MobileCustomScaleControls> createState()
class _MobileCustomScaleControlsState (line 15) | class _MobileCustomScaleControlsState extends CustomScaleControls<Mobile...
method build (line 23) | Widget build(BuildContext context)
FILE: flutter/lib/mobile/widgets/dialog.dart
function _showSuccess (line 11) | void _showSuccess()
function _showError (line 15) | void _showError()
function setPermanentPasswordDialog (line 19) | void setPermanentPasswordDialog(OverlayDialogManager dialogManager)
function submit (line 26) | submit()
function setTemporaryPasswordLengthDialog (line 109) | void setTemporaryPasswordLengthDialog(
function setLength (line 117) | setLength(newValue)
function showServerSettings (line 150) | void showServerSettings(OverlayDialogManager dialogManager,
function showServerSettingsWithValue (line 162) | void showServerSettingsWithValue(
function submit (line 184) | Future<bool> submit()
function buildField (line 202) | Widget buildField(
function setPrivacyModeDialog (line 306) | void setPrivacyModeDialog(
FILE: flutter/lib/mobile/widgets/floating_mouse.dart
function _tryParseCoordinateFromEvt (line 23) | double? _tryParseCoordinateFromEvt(Map<String, dynamic>? evt, String key)
class FloatingMouse (line 30) | class FloatingMouse extends StatefulWidget {
method createState (line 38) | State<FloatingMouse> createState()
class _CanvasScrollState (line 41) | class _CanvasScrollState {
method tryCancel (line 67) | void tryCancel()
method setPressedSpeed (line 75) | void setPressedSpeed()
method setReleasedSpeed (line 81) | void setReleasedSpeed()
method setSpeed (line 85) | void setSpeed(double newSpeed)
method tryStart (line 99) | void tryStart(Rect displayRect, Offset mouseGlobalPosition)
method shouldCancelScrollTimer (line 123) | bool shouldCancelScrollTimer(Map<String, dynamic>? evt)
class _FloatingMouseState (line 192) | class _FloatingMouseState extends State<FloatingMouse> {
method _resetCollapseTimer (line 213) | void _resetCollapseTimer()
method initState (line 240) | void initState()
method _onVirtualMouseModeChanged (line 253) | void _onVirtualMouseModeChanged()
method didChangeDependencies (line 265) | void didChangeDependencies()
method _resetPosition (line 275) | void _resetPosition()
method dispose (line 290) | void dispose()
method _updateBlockedRect (line 301) | void _updateBlockedRect()
method _getMouseGlobalPosition (line 316) | Offset _getMouseGlobalPosition()
method _getPositionFromMouseRetEvt (line 326) | Offset? _getPositionFromMouseRetEvt(Map<String, dynamic>? evt)
method _isValueNearEdge (line 337) | bool _isValueNearEdge(double edge, double value)
method _isValueAtEdge (line 341) | bool _isValueAtEdge(double edge, double value)
method _isValueAtOrOutsideEdge (line 345) | bool _isValueAtOrOutsideEdge(double edge, double? value)
method _shouldAutoScrollIfCursorNearRemoteEdge (line 352) | bool _shouldAutoScrollIfCursorNearRemoteEdge(double remoteEdge,
method _onMoveUpdateDelta (line 362) | void _onMoveUpdateDelta(Offset delta)
method _onDragHandleUpdate (line 495) | void _onDragHandleUpdate(DragUpdateDetails details)
method _onBodyPointerMoveUpdate (line 498) | void _onBodyPointerMoveUpdate(PointerMoveEvent event)
method _containsPosition (line 501) | bool _containsPosition(GlobalKey key, Offset pos)
method _handlePointerDown (line 511) | void _handlePointerDown(PointerDownEvent event)
method _handlePointerMove (line 542) | void _handlePointerMove(PointerMoveEvent event)
method _tryCancelScrolling (line 571) | void _tryCancelScrolling()
method _handlePointerUp (line 582) | void _handlePointerUp(PointerUpEvent event)
method _handlePointerCancel (line 583) | void _handlePointerCancel(PointerCancelEvent event)
method build (line 586) | Widget build(BuildContext context)
method _buildMouseWithHide (line 646) | Widget _buildMouseWithHide()
class MouseBody (line 735) | class MouseBody extends StatefulWidget {
method createState (line 761) | State<MouseBody> createState()
class WidgetScale (line 764) | class WidgetScale {
method getScale (line 770) | WidgetScale getScale(bool down, double s)
class _MouseBodyState (line 781) | class _MouseBodyState extends State<MouseBody> {
method _buildScrollUpDown (line 787) | Widget _buildScrollUpDown(GlobalKey key, IconData iconData, double s)
method _buildScrollMidButton (line 799) | Widget _buildScrollMidButton(double s)
method build (line 861) | Widget build(BuildContext context)
class DottedCirclePainter (line 1070) | class DottedCirclePainter extends CustomPainter {
method paint (line 1083) | void paint(Canvas canvas, Size size)
method shouldRepaint (line 1107) | bool shouldRepaint(covariant DottedCirclePainter oldDelegate)
class BottomIndentPainter (line 1115) | class BottomIndentPainter extends CustomPainter {
method paint (line 1117) | void paint(Canvas canvas, Size size)
method shouldRepaint (line 1136) | bool shouldRepaint(covariant CustomPainter oldDelegate)
class DragAreaTopIndentPainter (line 1140) | class DragAreaTopIndentPainter extends CustomPainter {
method paint (line 1146) | void paint(Canvas canvas, Size size)
method shouldRepaint (line 1176) | bool shouldRepaint(covariant DragAreaTopIndentPainter oldDelegate)
class CursorPaint (line 1181) | class CursorPaint extends StatelessWidget {
method build (line 1186) | Widget build(BuildContext context)
FILE: flutter/lib/mobile/widgets/floating_mouse_widgets.dart
class FloatingMouseWidgets (line 34) | class FloatingMouseWidgets extends StatefulWidget {
method createState (line 42) | State<FloatingMouseWidgets> createState()
class _FloatingMouseWidgetsState (line 45) | class _FloatingMouseWidgetsState extends State<FloatingMouseWidgets> {
method initState (line 51) | void initState()
method _onVirtualMouseModeChanged (line 59) | void _onVirtualMouseModeChanged()
method dispose (line 66) | void dispose()
method build (line 74) | Widget build(BuildContext context)
class FloatingWheel (line 105) | class FloatingWheel extends StatefulWidget {
method createState (line 112) | State<FloatingWheel> createState()
class _FloatingWheelState (line 115) | class _FloatingWheelState extends State<FloatingWheel> {
method initState (line 132) | void initState()
method _resetPosition (line 139) | void _resetPosition()
method _updateBlockedRect (line 153) | void _updateBlockedRect()
method dispose (line 164) | void dispose()
method didChangeDependencies (line 173) | void didChangeDependencies()
method _buildUpDownButton (line 183) | Widget _buildUpDownButton(
method build (line 211) | Widget build(BuildContext context)
method _buildWidget (line 222) | Widget _buildWidget(BuildContext context)
method _startScrollTimer (line 341) | void _startScrollTimer(int direction)
method _stopScrollTimer (line 350) | void _stopScrollTimer()
class FloatingLeftRightButton (line 356) | class FloatingLeftRightButton extends StatefulWidget {
method createState (line 367) | State<FloatingLeftRightButton> createState()
class _FloatingLeftRightButtonState (line 371) | class _FloatingLeftRightButtonState extends State<FloatingLeftRightButto...
method initState (line 390) | void initState()
method dispose (line 400) | void dispose()
method didChangeDependencies (line 410) | void didChangeDependencies()
method _getOffsetX (line 420) | double _getOffsetX(double w)
method _getPositionKey (line 429) | String _getPositionKey(Orientation ori)
method _loadPositionFromString (line 435) | Offset? _loadPositionFromString(String s)
method _trySavePosition (line 448) | void _trySavePosition()
method _restorePosition (line 460) | void _restorePosition(Orientation ori)
method _resetPosition (line 473) | void _resetPosition(Orientation ori)
method _updateBlockedRect (line 483) | void _updateBlockedRect()
method _onMoveUpdateDelta (line 493) | void _onMoveUpdateDelta(Offset delta)
method _onBodyPointerMoveUpdate (line 517) | void _onBodyPointerMoveUpdate(PointerMoveEvent event)
method _buildButtonIcon (line 527) | Widget _buildButtonIcon()
method build (line 560) | Widget build(BuildContext context)
class _QuarterCirclePainter (line 656) | class _QuarterCirclePainter extends CustomPainter {
method paint (line 664) | void paint(Canvas canvas, Size size)
method shouldRepaint (line 677) | bool shouldRepaint(CustomPainter oldDelegate)
class VirtualJoystick (line 683) | class VirtualJoystick extends StatefulWidget {
method createState (line 694) | State<VirtualJoystick> createState()
class _VirtualJoystickState (line 697) | class _VirtualJoystickState extends State<VirtualJoystick> {
method initState (line 721) | void initState()
method dispose (line 731) | void dispose()
method didChangeDependencies (line 738) | void didChangeDependencies()
method _resetPosition (line 747) | void _resetPosition()
method _offsetToPanDelta (line 758) | Offset _offsetToPanDelta(Offset offset)
method _sendMovement (line 767) | void _sendMovement(Offset delta)
method _stopSendEventTimer (line 777) | void _stopSendEventTimer()
method build (line 785) | Widget build(BuildContext context)
method _updateOffset (line 844) | void _updateOffset(Offset localPosition)
class _JoystickPainter (line 862) | class _JoystickPainter extends CustomPainter {
method paint (line 872) | void paint(Canvas canvas, Size size)
method shouldRepaint (line 901) | bool shouldRepaint(covariant _JoystickPainter oldDelegate)
FILE: flutter/lib/mobile/widgets/gesture_help.dart
class GestureIcons (line 8) | class GestureIcons {
type OnTouchModeChange (line 37) | typedef OnTouchModeChange = void Function(bool);
class GestureHelp (line 39) | class GestureHelp extends StatefulWidget {
method createState (line 53) | State<StatefulWidget> createState()
class _GestureHelpState (line 57) | class _GestureHelpState extends State<GestureHelp> {
method _exitRelativeMouseModeIf (line 70) | void _exitRelativeMouseModeIf(bool condition)
method build (line 77) | Widget build(BuildContext context)
class GestureInfo (line 353) | class GestureInfo extends StatelessWidget {
method build (line 367) | Widget build(BuildContext context)
FILE: flutter/lib/models/ab_model.dart
function shouldSyncAb (line 19) | bool shouldSyncAb()
function shouldSortTags (line 24) | bool shouldSortTags()
function filterAbTagByIntersection (line 29) | bool filterAbTagByIntersection()
type ForcePullAb (line 38) | enum ForcePullAb {
class AbModel (line 43) | class AbModel {
method pullAb (line 111) | Future<void> pullAb(
method _pullAb (line 122) | Future<void> _pullAb(
method _getAbSettings (line 200) | Future<bool> _getAbSettings()
method _getPersonalAbGuid (line 227) | Future<bool> _getPersonalAbGuid()
method _getSharedAbProfiles (line 254) | Future<bool> _getSharedAbProfiles(List<AbProfile> profiles)
method addressBooksCanWrite (line 312) | List<String> addressBooksCanWrite()
method addIdToCurrent (line 325) | Future<String?> addIdToCurrent(String id, String alias, String password,
method addPeersTo (line 348) | Future<String?> addPeersTo(
method changeTagForPeers (line 369) | Future<bool> changeTagForPeers(List<String> ids, List<dynamic> tags)
method changeAlias (line 377) | Future<bool> changeAlias({required String id, required String alias})
method changeNote (line 385) | Future<bool> changeNote({required String id, required String note})
method changePersonalHashPassword (line 393) | Future<bool> changePersonalHashPassword(String id, String hash)
method changeSharedPassword (line 409) | Future<bool> changeSharedPassword(
method deletePeers (line 418) | Future<bool> deletePeers(List<String> ids)
method addTags (line 450) | Future<bool> addTags(List<String> tagList)
method renameTag (line 458) | Future<bool> renameTag(String oldTag, String newTag)
method setTagColor (line 472) | Future<bool> setTagColor(String tag, Color color)
method deleteTag (line 479) | Future<bool> deleteTag(String tag)
method _syncFromRecent (line 489) | Future<void> _syncFromRecent({bool push = true})
method _syncFromRecentWithoutLock (line 497) | Future<void> _syncFromRecentWithoutLock({bool push = true})
method getRecentPeers (line 498) | Future<List<Peer>> getRecentPeers()
method setShouldAsync (line 544) | void setShouldAsync(bool v)
method _serializeCache (line 567) | List<dynamic> _serializeCache()
method loadCache (line 591) | Future<void> loadCache()
method find (line 654) | Peer? find(String id)
method idContainByCurrent (line 658) | bool idContainByCurrent(String id)
method unsetSelectedTags (line 662) | void unsetSelectedTags()
method getPeerTags (line 666) | List<dynamic> getPeerTags(String id)
method getPeerNote (line 675) | String getPeerNote(String id)
method getCurrentAbTagColor (line 684) | Color getCurrentAbTagColor(String tag)
method addressBookNames (line 695) | List<String> addressBookNames()
method personalAddressBookName (line 699) | String personalAddressBookName()
method setCurrentName (line 703) | Future<void> setCurrentName(String name)
method isCurrentAbFull (line 726) | bool isCurrentAbFull(bool warn)
method _refreshTab (line 735) | void _refreshTab()
method pullNonLegacyAfterChange (line 740) | Future<void> pullNonLegacyAfterChange({String? name})
method idExistIn (line 753) | List<String> idExistIn(String id)
method allPeers (line 763) | List<Peer> allPeers()
method translatedName (line 771) | String translatedName(String name)
method _callbackPeerUpdate (line 779) | void _callbackPeerUpdate()
method addPeerUpdateListener (line 785) | void addPeerUpdateListener(String key, VoidCallback listener)
method removePeerUpdateListener (line 789) | void removePeerUpdateListener(String key)
method getdefaultSharedPassword (line 793) | String? getdefaultSharedPassword()
class BaseAb (line 818) | abstract class BaseAb {
method name (line 832) | String name()
method isPersonal (line 834) | bool isPersonal()
method isLegacy (line 839) | bool isLegacy()
method pullAb (line 843) | Future<void> pullAb({quiet = false})
method pullAbImpl (line 862) | Future<bool> pullAbImpl({quiet = false})
method addPeers (line 864) | Future<String?> addPeers(List<Map<String, dynamic>> ps)
method changeTagForPeers (line 885) | Future<bool> changeTagForPeers(List<String> ids, List<dynamic> tags)
method changeAlias (line 887) | Future<bool> changeAlias({required String id, required String alias})
method changeNote (line 889) | Future<bool> changeNote({required String id, required String note})
method changePersonalHashPassword (line 891) | Future<bool> changePersonalHashPassword(String id, String hash)
method changeSharedPassword (line 893) | Future<bool> changeSharedPassword(String id, String password)
method deletePeers (line 895) | Future<bool> deletePeers(List<String> ids)
method addTags (line 897) | Future<bool> addTags(List<String> tagList, Map<String, int> tagColorMap)
method tagContainBy (line 899) | bool tagContainBy(String tag)
method renameTag (line 903) | Future<bool> renameTag(String oldTag, String newTag)
method setTagColor (line 905) | Future<bool> setTagColor(String tag, Color color)
method deleteTag (line 907) | Future<bool> deleteTag(String tag)
method isFull (line 909) | bool isFull()
method setSharedProfile (line 911) | void setSharedProfile(AbProfile profile)
method sharedProfile (line 913) | AbProfile? sharedProfile()
method canWrite (line 915) | bool canWrite()
method fullControl (line 917) | bool fullControl()
method syncFromRecent (line 919) | Future<void> syncFromRecent(List<Peer> recents)
class LegacyAb (line 922) | class LegacyAb extends BaseAb {
method sharedProfile (line 930) | AbProfile? sharedProfile()
method setSharedProfile (line 935) | void setSharedProfile(AbProfile? profile)
method canWrite (line 938) | bool canWrite()
method fullControl (line 943) | bool fullControl()
method isFull (line 948) | bool isFull()
method name (line 953) | String name()
method pullAbImpl (line 958) | Future<bool> pullAbImpl({quiet = false})
method pushAb (line 1005) | Future<bool> pushAb(
method addPeers (line 1050) | Future<String?> addPeers(List<Map<String, dynamic>> ps)
method changeTagForPeers (line 1091) | Future<bool> changeTagForPeers(List<String> ids, List<dynamic> tags)
method changeAlias (line 1101) | Future<bool> changeAlias({required String id, required String alias})
method changeNote (line 1111) | Future<bool> changeNote({required String id, required String note})
method changeSharedPassword (line 1117) | Future<bool> changeSharedPassword(String id, String password)
method syncFromRecent (line 1123) | Future<void> syncFromRecent(List<Peer> recents)
method peerSyncEqual (line 1124) | bool peerSyncEqual(Peer a, Peer b)
method _merge (line 1156) | void _merge(Peer r, Peer p)
method changePersonalHashPassword (line 1165) | Future<bool> changePersonalHashPassword(String id, String hash)
method deletePeers (line 1181) | Future<bool> deletePeers(List<String> ids)
method addTags (line 1189) | Future<bool> addTags(
method renameTag (line 1203) | Future<bool> renameTag(String oldTag, String newTag)
method setTagColor (line 1234) | Future<bool> setTagColor(String tag, Color color)
method deleteTag (line 1242) | Future<bool> deleteTag(String tag)
method _serialize (line 1259) | Map<String, dynamic> _serialize()
class Ab (line 1310) | class Ab extends BaseAb {
method name (line 1318) | String name()
method sharedProfile (line 1327) | AbProfile? sharedProfile()
method setSharedProfile (line 1332) | void setSharedProfile(AbProfile profile)
method isFull (line 1337) | bool isFull()
method canWrite (line 1343) | bool canWrite()
method fullControl (line 1353) | bool fullControl()
method pullAbImpl (line 1362) | Future<bool> pullAbImpl({quiet = false})
method _fetchPeers (line 1382) | Future<bool> _fetchPeers(List<Peer> tmpPeers, {quiet = false})
method _fetchTags (line 1449) | Future<bool> _fetchTags(List<AbTag> tmpTags, {quiet = false})
method addPeers (line 1498) | Future<String?> addPeers(List<Map<String, dynamic>> ps)
method changeTagForPeers (line 1531) | Future<bool> changeTagForPeers(List<String> ids, List<dynamic> tags)
method changeAlias (line 1557) | Future<bool> changeAlias({required String id, required String alias})
method changeNote (line 1578) | Future<bool> changeNote({required String id, required String note})
method _setPassword (line 1598) | Future<bool> _setPassword(Object bodyContent)
method changePersonalHashPassword (line 1619) | Future<bool> changePersonalHashPassword(String id, String hash)
method changeSharedPassword (line 1626) | Future<bool> changeSharedPassword(String id, String password)
method syncFromRecent (line 1632) | Future<void> syncFromRecent(List<Peer> recents)
method trySyncOnePeer (line 1640) | Future<bool> trySyncOnePeer(Peer p, Peer r)
method deletePeers (line 1702) | Future<bool> deletePeers(List<String> ids)
method addTags (line 1726) | Future<bool> addTags(
method renameTag (line 1755) | Future<bool> renameTag(String oldTag, String newTag)
method setTagColor (line 1784) | Future<bool> setTagColor(String tag, Color color)
method deleteTag (line 1808) | Future<bool> deleteTag(String tag)
class DummyAb (line 1832) | class DummyAb extends BaseAb {
method isFull (line 1834) | bool isFull()
method addPeers (line 1839) | Future<String?> addPeers(List<Map<String, dynamic>> ps)
method addTags (line 1844) | Future<bool> addTags(
method canWrite (line 1850) | bool canWrite()
method fullControl (line 1855) | bool fullControl()
method changeAlias (line 1860) | Future<bool> changeAlias({required String id, required String alias})
method changeNote (line 1865) | Future<bool> changeNote({required String id, required String note})
method changePersonalHashPassword (line 1870) | Future<bool> changePersonalHashPassword(String id, String hash)
method changeSharedPassword (line 1875) | Future<bool> changeSharedPassword(String id, String password)
method changeTagForPeers (line 1880) | Future<bool> changeTagForPeers(List<String> ids, List tags)
method deletePeers (line 1885) | Future<bool> deletePeers(List<String> ids)
method deleteTag (line 1890) | Future<bool> deleteTag(String tag)
method name (line 1895) | String name()
method pullAbImpl (line 1900) | Future<bool> pullAbImpl({quiet = false})
method renameTag (line 1905) | Future<bool> renameTag(String oldTag, String newTag)
method setTagColor (line 1910) | Future<bool> setTagColor(String tag, Color color)
method sharedProfile (line 1915) | AbProfile? sharedProfile()
method setSharedProfile (line 1920) | void setSharedProfile(AbProfile profile)
method syncFromRecent (line 1923) | Future<void> syncFromRecent(List<Peer> recents)
function _jsonDecodeRespMap (line 1926) | Map<String, dynamic> _jsonDecodeRespMap(String body, int statusCode)
function _jsonDecodeRespList (line 1939) | List<dynamic> _jsonDecodeRespList(String body, int statusCode)
function _jsonDecodeActionResp (line 1952) | String _jsonDecodeActionResp(http.Response resp)
function _setEmptyBody (line 1979) | void _setEmptyBody(Map<String, String> headers)
FILE: flutter/lib/models/chat_model.dart
class MessageKey (line 24) | class MessageKey {
class MessageBody (line 42) | class MessageBody {
method insert (line 47) | void insert(ChatMessage cm)
method clear (line 51) | void clear()
class ChatModel (line 56) | class ChatModel with ChangeNotifier {
method setChatWindowPosition (line 76) | void setChatWindowPosition(Offset position)
method dispose (line 82) | void dispose()
method setOverlayState (line 103) | void setOverlayState(BlockableOverlayState blockableOverlayState)
method mobileUpdateUnreadSum (line 484) | void mobileUpdateUnreadSum()
method mobileClearClientUnread (line 495) | void mobileClearClientUnread(int id)
method requestChatInputFocus (line 517) | void requestChatInputFocus()
method onVoiceCallWaiting (line 525) | void onVoiceCallWaiting()
method onVoiceCallStarted (line 529) | void onVoiceCallStarted()
method onVoiceCallClosed (line 536) | void onVoiceCallClosed(String reason)
method onVoiceCallIncoming (line 545) | void onVoiceCallIncoming()
method closeVoiceCall (line 551) | void closeVoiceCall()
type VoiceCallStatus (line 556) | enum VoiceCallStatus {
FILE: flutter/lib/models/cm_file_model.dart
class CmFileModel (line 11) | class CmFileModel {
method updateCurrentClientId (line 20) | void updateCurrentClientId(int id)
method isChild (line 121) | bool isChild(String parent, String child)
type CmFileAction (line 216) | enum CmFileAction {
class CmFileLog (line 225) | class CmFileLog {
method display (line 236) | String display()
method isTransfer (line 243) | bool isTransfer()
class TransferJobSerdeData (line 249) | class TransferJobSerdeData {
class FileActionLog (line 289) | class FileActionLog {
class FileRenamenLog (line 311) | class FileRenamenLog {
FILE: flutter/lib/models/desktop_render_texture.dart
class _PixelbufferTexture (line 14) | class _PixelbufferTexture {
class _GpuTexture (line 59) | class _GpuTexture {
class _Control (line 116) | class _Control {
class TextureModel (line 142) | class TextureModel {
method getTextureId (line 178) | RxInt getTextureId(int display)
method tryCreateTexture (line 187) | tryCreateTexture(int idx)
method tryRemoveTexture (line 200) | tryRemoveTexture(int idx)
FILE: flutter/lib/models/file_model.dart
type SortBy (line 17) | enum SortBy {
class JobID (line 30) | class JobID {
method next (line 32) | int next()
type GetSessionID (line 47) | typedef GetSessionID = SessionID Function();
type GetDialogManager (line 48) | typedef GetDialogManager = OverlayDialogManager? Function();
class FileModel (line 50) | class FileModel {
method onReady (line 86) | Future<void> onReady()
method close (line 92) | Future<void> close()
method refreshAll (line 99) | Future<void> refreshAll()
method receiveFileDir (line 104) | void receiveFileDir(Map<String, dynamic> evt)
method receiveEmptyDirs (line 112) | void receiveEmptyDirs(Map<String, dynamic> evt)
method handleJobError (line 132) | void handleJobError(Map<String, dynamic> evt)
method postOverrideFileConfirm (line 144) | Future<void> postOverrideFileConfirm(Map<String, dynamic> evt)
method overrideFileConfirm (line 149) | Future<void> overrideFileConfirm(Map<String, dynamic> evt,
method showFileConfirmDialog (line 197) | Future<bool?> showFileConfirmDialog(
method cancel (line 202) | cancel()
method submit (line 203) | submit()
method onSelectedFiles (line 275) | void onSelectedFiles(dynamic obj)
method sendEmptyDirs (line 302) | void sendEmptyDirs(dynamic obj)
class DirectoryData (line 324) | class DirectoryData {
class FileController (line 330) | class FileController {
method directoryData (line 376) | DirectoryData directoryData()
method onReady (line 380) | Future<void> onReady()
method close (line 405) | Future<void> close()
method toggleShowHidden (line 419) | void toggleShowHidden({bool? showHidden})
method changeSortStyle (line 424) | void changeSortStyle(SortBy sort, {bool? isLocal, bool ascending = true})
method refresh (line 432) | Future<void> refresh()
method openDirectory (line 436) | Future<void> openDirectory(String path, {bool isBack = false})
method pushHistory (line 466) | void pushHistory()
method goToHomeDirectory (line 473) | void goToHomeDirectory()
method goBack (line 482) | void goBack()
method goToParentDirectory (line 493) | void goToParentDirectory()
method initDirAndHome (line 506) | void initDirAndHome(Map<String, dynamic> evt)
method sendFiles (line 535) | Future<void> sendFiles(
method removeAction (line 603) | Future<void> removeAction(SelectedItems items)
method showRemoveDialog (line 723) | Future<bool?> showRemoveDialog(
method cancel (line 727) | cancel()
method submit (line 728) | submit()
method sendRemoveFile (line 790) | void sendRemoveFile(String path, int fileNum, int actId)
method sendRemoveEmptyDir (line 799) | Future<void> sendRemoveEmptyDir(String path, int fileNum, int actId)
method createDirWithRemote (line 805) | Future<void> createDirWithRemote(String path, bool isRemote)
method createDir (line 813) | Future<void> createDir(String path)
method renameAction (line 817) | Future<void> renameAction(Entry item, bool isLocal)
method submit (line 828) | submit()
class JobController (line 891) | class JobController {
method getJob (line 903) | int getJob(int id)
method addTransferJob (line 908) | int addTransferJob(Entry from, bool isRemoteToLocal)
method addDeleteFileJob (line 921) | int addDeleteFileJob(Entry file, bool isRemote)
method addDeleteDirJob (line 934) | int addDeleteDirJob(Entry file, bool isRemote, int fileCount)
method tryUpdateJobProgress (line 948) | void tryUpdateJobProgress(Map<String, dynamic> evt)
method jobDone (line 966) | Future<bool> jobDone(Map<String, dynamic> evt)
method jobError (line 1011) | void jobError(Map<String, dynamic> evt)
method updateJobStatus (line 1051) | void updateJobStatus(int id,
method cancelJob (line 1073) | Future<void> cancelJob(int id)
method loadLastJob (line 1077) | Future<void> loadLastJob(Map<String, dynamic> evt)
method resumeJob (line 1140) | void resumeJob(int jobId)
method updateFolderFiles (line 1153) | void updateFolderFiles(Map<String, dynamic> evt)
method clear (line 1169) | void clear()
class JobResultListener (line 1175) | class JobResultListener<T> {
method start (line 1192) | Future<T> start()
class FileFetcher (line 1215) | class FileFetcher {
method registerReadEmptyDirsTask (line 1226) | Future<List<FileDirectory>> registerReadEmptyDirsTask(
method registerReadTask (line 1244) | Future<FileDirectory> registerReadTask(bool isLocal, String path)
method registerReadRecursiveTask (line 1261) | Future<FileDirectory> registerReadRecursiveTask(int actID)
method tryCompleteRecursiveTaskWithError (line 1321) | void tryCompleteRecursiveTaskWithError(int id, String error)
method readEmptyDirs (line 1328) | Future<List<FileDirectory>> readEmptyDirs(
method fetchDirectory (line 1350) | Future<FileDirectory> fetchDirectory(
method fetchDirectoryRecursiveToRemove (line 1368) | Future<FileDirectory> fetchDirectoryRecursiveToRemove(
class FileDirectory (line 1385) | class FileDirectory {
class Entry (line 1421) | class Entry {
method lastModified (line 1443) | DateTime lastModified()
type JobState (line 1448) | enum JobState { none, inProgress, done, error, paused }
function display (line 1451) | String display()
type JobType (line 1467) | enum JobType { none, transfer, deleteFile, deleteDir }
class JobProgress (line 1469) | class JobProgress {
method display (line 1511) | String display()
method getStatus (line 1525) | String getStatus()
class _PathStat (line 1589) | class _PathStat {
class PathUtil (line 1596) | class PathUtil {
method getOtherSidePath (line 1600) | String getOtherSidePath(String mainRootPath, String mainPath,
method join (line 1618) | String join(String path1, String path2, bool isWindows)
method split (line 1623) | List<String> split(String path, bool isWindows)
method convert (line 1628) | String convert(String path, bool isMainWindows, bool isOtherWindows)
method dirname (line 1634) | String dirname(String path, bool isWindows)
method validName (line 1639) | bool validName(String name, bool isWindows)
class DirectoryOptions (line 1647) | class DirectoryOptions {
class SelectedItems (line 1662) | class SelectedItems {
method add (line 1668) | void add(Entry e)
method remove (line 1675) | void remove(Entry e)
method clear (line 1679) | void clear()
method selectAll (line 1683) | void selectAll(List<Entry> entries)
method valid (line 1688) | bool valid(RxList<Entry> items)
function _sortList (line 1698) | List<Entry> _sortList(List<Entry> list, SortBy sortType, bool ascending)
type FileDialogType (line 1784) | enum FileDialogType { overwrite, unknown }
class _FileDialogEvent (line 1786) | class _FileDialogEvent extends BaseEvent<FileDialogType, Map<String, dyn...
method setOverrideConfirm (line 1793) | void setOverrideConfirm(bool? confirm)
method setSkip (line 1797) | void setSkip(bool skip)
method findCallback (line 1802) | EventCallback<Map<String, dynamic>>? findCallback(FileDialogType type)
class FileDialogEventLoop (line 1820) | class FileDialogEventLoop
method onPreConsume (line 1826) | Future<void> onPreConsume(
method onEventsClear (line 1836) | Future<void> onEventsClear()
method setOverrideConfirm (line 1842) | void setOverrideConfirm(bool? confirm)
method setSkip (line 1846) | void setSkip(bool skip)
FILE: flutter/lib/models/group_model.dart
class GroupModel (line 12) | class GroupModel {
method pull (line 39) | Future<void> pull({force = true, quiet = false})
method _pull (line 64) | Future<void> _pull()
method _getDeviceGroups (line 103) | Future<bool> _getDeviceGroups(
method _getUsers (line 160) | Future<bool> _getUsers(List<UserPayload> tmpUsers)
method _getPeers (line 224) | Future<bool> _getPeers(List<Peer> tmpPeers)
method _jsonDecodeResp (line 284) | Map<String, dynamic> _jsonDecodeResp(String body, int statusCode)
method _saveCache (line 297) | void _saveCache()
method loadCache (line 311) | Future<void> loadCache()
method _callbackPeerUpdate (line 354) | void _callbackPeerUpdate()
method addPeerUpdateListener (line 360) | void addPeerUpdateListener(String key, VoidCallback listener)
method removePeerUpdateListener (line 364) | void removePeerUpdateListener(String key)
method _tryHandlePullError (line 368) | void _tryHandlePullError()
FILE: flutter/lib/models/input_model.dart
type MouseButtons (line 23) | enum MouseButtons { left, right, wheel, back }
class CanvasCoords (line 29) | class CanvasCoords {
method toJson (line 40) | Map<String, dynamic> toJson()
method fromJson (line 55) | CanvasCoords fromJson(Map<String, dynamic> json)
method fromCanvasModel (line 68) | CanvasCoords fromCanvasModel(CanvasModel model)
class CursorCoords (line 81) | class CursorCoords {
method toJson (line 86) | Map<String, dynamic> toJson()
method fromJson (line 93) | CursorCoords fromJson(Map<String, dynamic> json)
method fromCursorModel (line 99) | CursorCoords fromCursorModel(CursorModel model)
class RemoteWindowCoords (line 106) | class RemoteWindowCoords {
method toJson (line 115) | Map<String, dynamic> toJson()
method rectToJson (line 124) | Map<String, dynamic> rectToJson(Rect r)
method rectFromJson (line 133) | Rect rectFromJson(Map<String, dynamic> json)
class PointerEventToRust (line 164) | class PointerEventToRust {
method toJson (line 171) | Map<String, dynamic> toJson()
class ToReleaseRawKeys (line 182) | class ToReleaseRawKeys {
class ToReleaseKeys (line 287) | class ToReleaseKeys {
class InputModel (line 329) | class InputModel {
method _getIosCapsFromCharacter (line 442) | bool _getIosCapsFromCharacter(KeyEvent e)
method _getIosCapsFromRawCharacter (line 450) | bool _getIosCapsFromRawCharacter(RawKeyEvent e)
method _getIosCapsFromCharacterImpl (line 467) | bool _getIosCapsFromCharacterImpl(String? ch, bool shiftPressed)
method _buildLockModes (line 479) | int _buildLockModes(bool iosCapsLock)
method updateTrackpadSpeed (line 527) | Future<void> updateTrackpadSpeed()
method handleKeyDownEventModifiers (line 538) | void handleKeyDownEventModifiers(KeyEvent e)
method upEvent (line 539) | KeyUpEvent upEvent(e)
method handleKeyUpEventModifiers (line 592) | void handleKeyUpEventModifiers(KeyEvent e)
method handleRawKeyEvent (line 623) | KeyEventResult handleRawKeyEvent(RawKeyEvent e)
method handleKeyEvent (line 687) | KeyEventResult handleKeyEvent(KeyEvent e)
method newKeyboardMode (line 775) | void newKeyboardMode(
method mapKeyboardModeRaw (line 786) | void mapKeyboardModeRaw(RawKeyEvent e, bool iosCapsLock)
method inputRawKey (line 822) | void inputRawKey(String name, int platformCode, int positionCode, bool...
method legacyKeyboardModeRaw (line 834) | void legacyKeyboardModeRaw(RawKeyEvent e)
method sendRawKey (line 847) | void sendRawKey(RawKeyEvent e, {bool? down, bool? press})
method legacyKeyboardMode (line 855) | void legacyKeyboardMode(KeyEvent e)
method sendKey (line 865) | void sendKey(KeyEvent e, {bool? down, bool? press})
method inputKey (line 876) | void inputKey(String name, {bool? down, bool? press})
method getMouseEventMove (line 890) | Map<String, dynamic> getMouseEventMove()
method _getMouseEvent (line 895) | Map<String, dynamic> _getMouseEvent(PointerEvent evt, String type)
method tap (line 933) | Future<void> tap(MouseButtons button)
method tapDown (line 938) | Future<void> tapDown(MouseButtons button)
method tapUp (line 942) | Future<void> tapUp(MouseButtons button)
method scroll (line 947) | Future<void> scroll(int y)
method resetModifiers (line 956) | void resetModifiers()
method modify (line 961) | Map<String, dynamic> modify(Map<String, dynamic> evt)
method sendMouse (line 970) | Future<void> sendMouse(String type, MouseButtons button)
method enterOrLeave (line 978) | void enterOrLeave(bool enter)
method moveMouse (line 1000) | Future<void> moveMouse(double x, double y)
method sendMobileRelativeMouseMove (line 1016) | Future<void> sendMobileRelativeMouseMove(double dx, double dy)
method updatePointerLockCenter (line 1038) | Future<void> updatePointerLockCenter({Offset? localCenter})
method updateImageWidgetSize (line 1046) | void updateImageWidgetSize(Size size)
method toggleRelativeMouseMode (line 1050) | void toggleRelativeMouseMode()
method setRelativeMouseMode (line 1054) | bool setRelativeMouseMode(bool enabled)
method exitRelativeMouseModeWithKeyRelease (line 1062) | void exitRelativeMouseModeWithKeyRelease()
method disposeRelativeMouseMode (line 1099) | void disposeRelativeMouseMode()
method onWindowBlur (line 1111) | void onWindowBlur()
method onWindowFocus (line 1115) | void onWindowFocus()
method onPointHoverImage (line 1119) | void onPointHoverImage(PointerHoverEvent e)
method onPointerPanZoomStart (line 1149) | void onPointerPanZoomStart(PointerPanZoomStartEvent e)
method onPointerPanZoomUpdate (line 1160) | void onPointerPanZoomUpdate(PointerPanZoomUpdateEvent e)
method _filterTrackpadDeltaAxis (line 1214) | Offset _filterTrackpadDeltaAxis(Offset delta)
method _scheduleFling (line 1232) | void _scheduleFling(double x, double y, int delay)
method waitLastFlingDone (line 1271) | void waitLastFlingDone()
method onPointerPanZoomEnd (line 1284) | void onPointerPanZoomEnd(PointerPanZoomEndEvent e)
method shouldIgnoreTouchTap (line 1321) | bool shouldIgnoreTouchTap(ui.Offset pos)
method onPointDownImage (line 1335) | void onPointDownImage(PointerDownEvent e)
method onPointUpImage (line 1372) | void onPointUpImage(PointerUpEvent e)
method onPointMoveImage (line 1394) | void onPointMoveImage(PointerMoveEvent e)
method fillRemoteCoordsAndGetCurFrame (line 1417) | Future<Rect?> fillRemoteCoordsAndGetCurFrame(
method onPointerSignalImage (line 1442) | void onPointerSignalImage(PointerSignalEvent e)
method refreshMousePos (line 1491) | void refreshMousePos()
method tryMoveEdgeOnExit (line 1496) | void tryMoveEdgeOnExit(Offset pos)
method tryGetNearestRange (line 1505) | double tryGetNearestRange(double v, double min, double max, double n)
method setNearestEdge (line 1515) | Offset setNearestEdge(double x, double y, Rect rect)
method handlePointerEvent (line 1535) | void handlePointerEvent(String kind, String type, Offset offset)
method _checkPeerControlProtected (line 1574) | bool _checkPeerControlProtected(double x, double y)
method processEventToPeer (line 1596) | Map<String, dynamic>? processEventToPeer(
method handleMouse (line 1671) | Map<String, dynamic>? handleMouse(
method handlePointerDevicePos (line 1687) | Point? handlePointerDevicePos(
method _isInCurrentWindow (line 1750) | bool _isInCurrentWindow(double x, double y)
method findRemoteCoords (line 1760) | RemoteWindowCoords? findRemoteCoords(double x, double y,
method _handlePointerDevicePos (line 1777) | Point? _handlePointerDevicePos(
method getPointInRemoteRect (line 1838) | Point<double>? getPointInRemoteRect(
method listenToMouse (line 1889) | void listenToMouse(bool yesOrNo)
method onMobileBack (line 1897) | void onMobileBack()
method onMobileHome (line 1909) | void onMobileHome()
method onMobileApps (line 1910) | Future<void> onMobileApps()
method tapHidKey (line 1918) | Future<void> tapHidKey(int usbHidUsage)
method onMobileVolumeUp (line 1924) | Future<void> onMobileVolumeUp()
method onMobileVolumeDown (line 1926) | Future<void> onMobileVolumeDown()
method onMobilePower (line 1928) | Future<void> onMobilePower()
FILE: flutter/lib/models/model.dart
type HandleMsgBox (line 55) | typedef HandleMsgBox = Function(Map<String, dynamic> evt, String id);
type ReconnectHandle (line 56) | typedef ReconnectHandle = Function(OverlayDialogManager, SessionID, bool);
class CachedPeerData (line 59) | class CachedPeerData {
method toString (line 73) | String toString()
method fromString (line 86) | CachedPeerData? fromString(String s)
class FfiModel (line 110) | class FfiModel with ChangeNotifier {
method globalDisplaysRect (line 179) | Rect? globalDisplaysRect()
method displaysRect (line 180) | Rect? displaysRect()
method _getDisplaysRect (line 181) | Rect? _getDisplaysRect(List<Display> displays, bool useDisplayScale)
method scale (line 188) | int scale(int len, double s)
method getConnectionImageText (line 275) | Widget? getConnectionImageText()
method startEventListener (line 326) | StreamEventHandler startEventListener(SessionID sessionId, String peerId)
method close (line 498) | close()
method saveAs (line 502) | saveAs()
method copyToClipboard (line 525) | copyToClipboard()
method cancel (line 530) | cancel()
method onRatioChanged (line 570) | onRatioChanged(String? value)
method onSubmit (line 575) | onSubmit()
method onCancel (line 593) | onCancel()
method updateCurDisplay (line 787) | Future<void> updateCurDisplay(SessionID sessionId,
method shouldAutoRetryOnOffline (line 954) | bool shouldAutoRetryOnOffline(
method reconnect (line 1057) | void reconnect(OverlayDialogManager dialogManager, SessionID sessionId,
method showRelayHintDialog (line 1068) | Future<void> showRelayHintDialog(
method onClose (line 1093) | onClose()
method showConnectedWaitingForImage (line 1123) | void showConnectedWaitingForImage(OverlayDialogManager dialogManager,
method onClose (line 1125) | onClose()
method showPrivacyFailedDialog (line 1149) | void showPrivacyFailedDialog(
method _queryAuditGuid (line 1193) | void _queryAuditGuid(String peerId)
method evtToDisplay (line 1547) | Display evtToDisplay(Map<String, dynamic> evt)
method setViewOnly (line 1737) | void setViewOnly(String id, bool value)
method setShowMyCursor (line 1758) | void setShowMyCursor(bool value)
class VirtualMouseMode (line 1766) | class VirtualMouseMode with ChangeNotifier {
method _shouldShow (line 1779) | bool _shouldShow()
method loadOptions (line 1805) | void loadOptions()
method toggleVirtualMouse (line 1816) | Future<void> toggleVirtualMouse()
method toggleVirtualJoystick (line 1823) | Future<void> toggleVirtualJoystick()
class ImageModel (line 1832) | class ImageModel with ChangeNotifier {
method disposeImage (line 1949) | void disposeImage()
type ScrollStyle (line 1955) | enum ScrollStyle {
class ViewStyle (line 2008) | class ViewStyle {
method defaultViewStyle (line 2022) | defaultViewStyle()
method _double2Int (line 2037) | int _double2Int(double v)
method _innerEqual (line 2045) | bool _innerEqual(ViewStyle other)
type EdgeScrollState (line 2080) | enum EdgeScrollState {
class EdgeScrollFallbackState (line 2086) | class EdgeScrollFallbackState {
method setEncroachment (line 2099) | void setEncroachment(Vector2 encroachment)
method emitTick (line 2103) | void emitTick(Duration totalElapsed)
method start (line 2122) | void start()
method stop (line 2129) | void stop()
class CanvasModel (line 2134) | class CanvasModel with ChangeNotifier {
method setScrollPercent (line 2197) | void setScrollPercent(double x, double y)
method pushScrollPositionToUI (line 2202) | void pushScrollPositionToUI(double scrollPixelX, double scrollPixelY)
method getSize (line 2226) | Size getSize()
method getAdjustY (line 2264) | double getAdjustY()
method updateScrollStyle (line 2358) | Future<void> updateScrollStyle()
method initializeEdgeScrollEdgeThickness (line 2371) | Future<void> initializeEdgeScrollEdgeThickness()
method updateEdgeScrollEdgeThickness (line 2380) | void updateEdgeScrollEdgeThickness(int newThickness)
method update (line 2385) | void update(double x, double y, double scale)
method getDisplayWidth (line 2395) | int getDisplayWidth()
method getDisplayHeight (line 2402) | int getDisplayHeight()
method activateLocalCursor (line 2412) | void activateLocalCursor()
method updateLocalCursor (line 2422) | void updateLocalCursor(double x, double y)
method moveDesktopMouse (line 2438) | void moveDesktopMouse(double x, double y)
method initializeEdgeScrollFallback (line 2469) | void initializeEdgeScrollFallback(TickerProvider tickerProvider)
method disableEdgeScroll (line 2473) | void disableEdgeScroll()
method rearmEdgeScroll (line 2478) | void rearmEdgeScroll()
method cancelEdgeScroll (line 2482) | void cancelEdgeScroll()
method getScrollInfo (line 2486) | (Vector2, Vector2) getScrollInfo()
method edgeScrollMouse (line 2498) | void edgeScrollMouse(double x, double y)
method performEdgeScroll (line 2574) | void performEdgeScroll(Vector2 delta)
method mobileFocusCanvasCursor (line 2678) | void mobileFocusCanvasCursor()
method saveMobileOffsetBeforeSoftKeyboard (line 2688) | void saveMobileOffsetBeforeSoftKeyboard()
method restoreMobileOffsetAfterSoftKeyboard (line 2694) | void restoreMobileOffsetAfterSoftKeyboard()
method _moveToCenterCursor (line 2715) | void _moveToCenterCursor()
class CursorData (line 2742) | class CursorData {
method _doubleToInt (line 2768) | int _doubleToInt(double v)
method _checkUpdateScale (line 2770) | double _checkUpdateScale(double scale)
method updateGetKey (line 2813) | String updateGetKey(double scale)
class PredefinedCursor (line 2837) | class PredefinedCursor {
class CursorModel (line 2898) | class CursorModel with ChangeNotifier {
method isConnIn2Secs (line 3005) | bool isConnIn2Secs()
method getVisibleRect (line 3021) | Rect getVisibleRect()
method getCanvasOffsetToCenterCursor (line 3032) | Offset getCanvasOffsetToCenterCursor()
method move (line 3072) | Future<bool> move(double x, double y)
method syncCursorPosition (line 3085) | Future<void> syncCursorPosition()
method isInRemoteRect (line 3089) | bool isInRemoteRect(Offset offset)
method getRemotePosInRect (line 3093) | Offset? getRemotePosInRect(Offset offset)
method _getNewPos (line 3109) | Offset _getNewPos(double x, double y, double adjust)
method _moveLocalIfInRemoteRect (line 3117) | bool _moveLocalIfInRemoteRect(double x, double y)
method _isInCurrentWindow (line 3238) | bool _isInCurrentWindow(double x, double y)
method movementInRect (line 3271) | Offset? movementInRect(double x, double y, Rect r)
method _updateCache (line 3336) | Future<bool> _updateCache(
method _updateCurData (line 3373) | bool _updateCurData()
class QualityMonitorData (line 3473) | class QualityMonitorData {
class QualityMonitorModel (line 3482) | class QualityMonitorModel with ChangeNotifier {
class RecordingModel (line 3549) | class RecordingModel with ChangeNotifier {
class ElevationModel (line 3574) | class ElevationModel with ChangeNotifier {
type ConnType (line 3589) | enum ConnType {
class FFI (line 3599) | class FFI {
method mobileReset (line 3668) | void mobileReset()
method start (line 3677) | void start(
method onEvent2UIRgba (line 3874) | void onEvent2UIRgba()
method login (line 3893) | void login(String osUsername, String osPassword, SessionID sessionId,
method send2FA (line 3903) | void send2FA(SessionID sessionId, String code, bool trustThisDevice)
method close (line 3909) | Future<void> close({bool closeSession = true})
method setMethodCallHandler (line 3942) | void setMethodCallHandler(FMethod callback)
method invokeMethod (line 3946) | Future<bool> invokeMethod(String method, [dynamic arguments])
method registerTerminalModel (line 3951) | void registerTerminalModel(int terminalId, TerminalModel model)
method unregisterTerminalModel (line 3956) | void unregisterTerminalModel(int terminalId)
method routeTerminalResponse (line 3961) | void routeTerminalResponse(Map<String, dynamic> evt)
class Display (line 3975) | class Display {
method _innerEqual (line 4001) | bool _innerEqual(Display other)
class Resolution (line 4019) | class Resolution {
method toString (line 4025) | String toString()
class Features (line 4030) | class Features {
class PeerInfo (line 4036) | class PeerInfo with ChangeNotifier {
method tryGetDisplay (line 4074) | Display? tryGetDisplay({int? display})
method tryGetDisplayIfNotAllDisplay (line 4090) | Display? tryGetDisplayIfNotAllDisplay({int? display})
method getCurDisplays (line 4105) | List<Display> getCurDisplays()
method scaleOfDisplay (line 4117) | double scaleOfDisplay(int display)
method getDisplayRect (line 4124) | Rect? getDisplayRect(int display)
function setCanvasConfig (line 4133) | Future<void> setCanvasConfig(
function getCanvasConfig (line 4152) | Future<Map<String, dynamic>?> getCanvasConfig(SessionID sessionId)
function initializeCursorAndCanvas (line 4165) | Future<void> initializeCursorAndCanvas(FFI ffi)
function clearWaitingForImage (line 4186) | clearWaitingForImage(OverlayDialogManager? dialogManager, SessionID sess...
FILE: flutter/lib/models/native_model.dart
class RgbaFrame (line 18) | final class RgbaFrame extends Struct {
type F3 (line 24) | typedef F3 = Pointer<Uint8> Function(Pointer<Utf8>, int);
type F3Dart (line 25) | typedef F3Dart = Pointer<Uint8> Function(Pointer<Utf8>, Int32);
type HandleEvent (line 26) | typedef HandleEvent = Future<void> Function(Map<String, dynamic> evt);
class PlatformFFI (line 30) | class PlatformFFI {
method getByName (line 51) | String getByName(String name, [String arg = ''])
method setByName (line 55) | void setByName(String name, [String value = ''])
method getVersion (line 57) | Future<String> getVersion()
method registerEventHandler (line 62) | bool registerEventHandler(
method unregisterEventHandler (line 79) | void unregisterEventHandler(String eventName, String handlerName)
method translate (line 87) | String translate(String name, String locale)
method getRgba (line 90) | Uint8List? getRgba(SessionID sessionId, int display, int bufSize)
method getRgbaSize (line 106) | int getRgbaSize(SessionID sessionId, int display)
method nextRgba (line 108) | void nextRgba(SessionID sessionId, int display)
method registerPixelbufferTexture (line 110) | void registerPixelbufferTexture(SessionID sessionId, int display, int ...
method registerGpuTexture (line 113) | void registerGpuTexture(SessionID sessionId, int display, int ptr)
method init (line 118) | Future<void> init(String appType)
method tryHandle (line 225) | Future<bool> tryHandle(Map<String, dynamic> evt)
method _startListenEvent (line 242) | void _startListenEvent(RustdeskImpl rustdeskImpl)
method setEventCallback (line 263) | void setEventCallback(StreamEventHandler fun)
method setRgbaCallback (line 267) | void setRgbaCallback(void Function(int, Uint8List) fun)
method startDesktopWebListener (line 269) | void startDesktopWebListener()
method stopDesktopWebListener (line 271) | void stopDesktopWebListener()
method setMethodCallHandler (line 273) | void setMethodCallHandler(FMethod callback)
method syncAndroidServiceAppDirConfigPath (line 285) | void syncAndroidServiceAppDirConfigPath()
method setFullscreenCallback (line 289) | void setFullscreenCallback(void Function(bool) fun)
FILE: flutter/lib/models/peer_model.dart
class Peer (line 8) | class Peer {
method getId (line 26) | String getId()
method toJson (line 50) | Map<String, dynamic> toJson()
method toCustomJson (line 70) | Map<String, dynamic> toCustomJson({required bool includingHash})
method toGroupCacheJson (line 85) | Map<String, dynamic> toGroupCacheJson()
method equal (line 131) | bool equal(Peer other)
type UpdateEvent (line 167) | enum UpdateEvent { online, load }
type GetInitPeers (line 169) | typedef GetInitPeers = RxList<Peer> Function();
class Peers (line 171) | class Peers extends ChangeNotifier {
metho
Condensed preview — 778 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (9,989K chars).
[
{
"path": ".cargo/config.toml",
"chars": 671,
"preview": "[target.x86_64-pc-windows-msvc]\nrustflags = [\"-Ctarget-feature=+crt-static\"]\n[target.i686-pc-windows-msvc]\nrustflags = ["
},
{
"path": ".gitattributes",
"chars": 12,
"preview": "* text=auto\n"
},
{
"path": ".github/FUNDING.yml",
"chars": 35,
"preview": "github: [rustdesk]\nko_fi: rustdesk\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yaml",
"chars": 1880,
"preview": "name: 🐞 Bug report\ndescription: Thanks for taking the time to fill out this bug report! Please fill the form in **Englis"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 521,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: Feature Request\n url: https://github.com/rustdesk/rustdesk/discu"
},
{
"path": ".github/dependabot.yml",
"chars": 228,
"preview": "version: 2\nupdates:\n - package-ecosystem: \"gitsubmodule\"\n directory: \"/\"\n target-branch: \"master\"\n schedule:\n "
},
{
"path": ".github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff",
"chars": 1840,
"preview": "diff --git a/packages/flutter/lib/src/material/dropdown_menu.dart b/packages/flutter/lib/src/material/dropdown_menu.dart"
},
{
"path": ".github/workflows/bridge.yml",
"chars": 3053,
"preview": "# This yaml shares the build bridge steps with ci and nightly.\nname: Build flutter-rust-bridge\n# 2023-11-23 18:00:00+00:"
},
{
"path": ".github/workflows/ci.yml",
"chars": 8258,
"preview": "name: CI\n\nenv:\n# MIN_SUPPORTED_RUST_VERSION: \"1.46.0\"\n# CICD_INTERMEDIATES_DIR: \"_cicd-intermediates\"\n VCPKG_BINARY"
},
{
"path": ".github/workflows/clear-cache.yml",
"chars": 1133,
"preview": "name: Clear cache\n\non:\n workflow_dispatch:\n\npermissions:\n actions: write\n\njobs:\n clear-cache:\n runs-on: ubuntu-lat"
},
{
"path": ".github/workflows/fdroid.yml",
"chars": 1661,
"preview": "name: Fdroid version file generation\n\non:\n workflow_dispatch:\n push:\n tags:\n - 'v[0-9]+.[0-9]+.[0-9]+'\n -"
},
{
"path": ".github/workflows/flutter-build.yml",
"chars": 82117,
"preview": "name: Build the flutter version of the RustDesk\n\non:\n workflow_call:\n inputs:\n upload-artifact:\n type: b"
},
{
"path": ".github/workflows/flutter-ci.yml",
"chars": 394,
"preview": "name: Full Flutter CI\n\non:\n workflow_dispatch:\n pull_request:\n paths-ignore:\n - \"docs/**\"\n - \"README.md\"\n pu"
},
{
"path": ".github/workflows/flutter-nightly.yml",
"chars": 294,
"preview": "name: Flutter Nightly Build\n\non:\n schedule:\n # schedule build every night\n - cron: \"0 0 * * *\"\n workflow_dispatc"
},
{
"path": ".github/workflows/flutter-tag.yml",
"chars": 387,
"preview": "name: Flutter Tag Build\n\non:\n workflow_dispatch:\n push:\n tags:\n - 'v[0-9]+.[0-9]+.[0-9]+'\n - '[0-9]+.[0-9"
},
{
"path": ".github/workflows/playground.yml",
"chars": 17394,
"preview": "name: playground\n\non:\n #schedule:\n # schedule build every night\n # - cron: \"0/6 * * * *\"\n workflow_dispatch:\n\nenv"
},
{
"path": ".github/workflows/third-party-RustDeskTempTopMostWindow.yml",
"chars": 1916,
"preview": "name: build RustDeskTempTopMostWindow\n\non:\n workflow_call:\n inputs:\n upload-artifact:\n type: boolean"
},
{
"path": ".github/workflows/winget.yml",
"chars": 343,
"preview": "name: Publish to WinGet\non:\n release:\n types: [released]\n workflow_dispatch:\njobs:\n publish:\n runs-on: ubuntu-l"
},
{
"path": ".gitignore",
"chars": 927,
"preview": "/build\n/target\n.vscode\n.idea\n.DS_Store\n.env\nlibsciter-gtk.so\nsrc/ui/inline.rs\nextractor\n__pycache__\nsrc/version.rs\n*dmg\n"
},
{
"path": ".gitmodules",
"chars": 100,
"preview": "[submodule \"libs/hbb_common\"]\n\tpath = libs/hbb_common\n\turl = https://github.com/rustdesk/hbb_common\n"
},
{
"path": "CLAUDE.md",
"chars": 3728,
"preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
},
{
"path": "Cargo.toml",
"chars": 7953,
"preview": "[package]\nname = \"rustdesk\"\nversion = \"1.4.6\"\nauthors = [\"rustdesk <info@rustdesk.com>\"]\nedition = \"2021\"\nbuild= \"build."
},
{
"path": "Dockerfile",
"chars": 1778,
"preview": "FROM debian:bullseye-slim\n\nWORKDIR /\nARG DEBIAN_FRONTEND=noninteractive\nENV VCPKG_FORCE_SYSTEM_BINARIES=1\nRUN apt update"
},
{
"path": "LICENCE",
"chars": 34523,
"preview": " GNU AFFERO GENERAL PUBLIC LICENSE\n Version 3, 19 November 2007\n\n Copyright (C)"
},
{
"path": "README.md",
"chars": 9832,
"preview": "<p align=\"center\">\n <img src=\"res/logo-header.svg\" alt=\"RustDesk - Your remote desktop\"><br>\n <a href=\"#raw-steps-to-b"
},
{
"path": "appimage/AppImageBuilder-aarch64.yml",
"chars": 4292,
"preview": "# appimage-builder recipe see https://appimage-builder.readthedocs.io for details\nversion: 1\nscript:\n - rm -rf ./AppDir "
},
{
"path": "appimage/AppImageBuilder-x86_64.yml",
"chars": 4461,
"preview": "# appimage-builder recipe see https://appimage-builder.readthedocs.io for details\nversion: 1\nscript:\n - rm -rf ./AppDir "
},
{
"path": "build.py",
"chars": 26949,
"preview": "#!/usr/bin/env python3\n\nimport os\nimport pathlib\nimport platform\nimport zipfile\nimport urllib.request\nimport shutil\nimpo"
},
{
"path": "build.rs",
"chars": 3064,
"preview": "#[cfg(windows)]\nfn build_windows() {\n let file = \"src/platform/windows.cc\";\n let file2 = \"src/platform/windows_del"
},
{
"path": "docs/CODE_OF_CONDUCT-DE.md",
"chars": 6400,
"preview": "\n# Verhaltenskodex (Code of Conduct) für Mitwirkende\n\n## Unsere Verpflichtung\n\nWir als Mitglieder, Mitwirkende und Führu"
},
{
"path": "docs/CODE_OF_CONDUCT-JP.md",
"chars": 2626,
"preview": "\n# コントリビューター規約 行動規範\n\n## 私たちの誓い\n\n私たちは、メンバー、貢献者、リーダーとして、年齢、体格、目に見える・見えない障害、\n民族性、性の特徴、性自認と表現、経験のレベル、教育、社会経済的地位、国籍、個人の外見、\n人種"
},
{
"path": "docs/CODE_OF_CONDUCT-KR.md",
"chars": 2913,
"preview": "\n# 기여자 계약 행동 강령\n\n## 우리의 서약\n\n회원, 기여자, 리더로서 우리는 나이, 신체 크기, 눈에\n보이거나 보이지 않는 장애, 민족, 성 특성, 성 정체성 및\n표현, 경험 수준, 교육, 사회 경제적 지위, "
},
{
"path": "docs/CODE_OF_CONDUCT-NL.md",
"chars": 5956,
"preview": "\n# Gedragscode Overeenkomst Medewerkers\n\n## Onze Belofte\n\nWij als leden, medewerkers en leiders beloven deelname aan onz"
},
{
"path": "docs/CODE_OF_CONDUCT-NO.md",
"chars": 5455,
"preview": "\n# Atferdskodeks for bidragsyterpaktern\n\n## Hva Vi Står For\n\nVi som medlemer, bidragere, og ledere står for å skape ett "
},
{
"path": "docs/CODE_OF_CONDUCT-PL.md",
"chars": 5524,
"preview": "\n# Kod postępowania Contributor Covenant Code of Conduct\n\n## Nasza przysięga\n\nWe as members, contributors, and leaders p"
},
{
"path": "docs/CODE_OF_CONDUCT-RO.md",
"chars": 5897,
"preview": "# Codul de Conduită al Contributorilor\n\n## Angajamentul Nostru\n\nNoi, ca membri, contribuitori și lideri, ne angajăm să f"
},
{
"path": "docs/CODE_OF_CONDUCT-RU.md",
"chars": 6142,
"preview": "\n# Кодекс поведения участников и вкладчиков\n\n## Наше обещание\n\nМы, как члены, вкладчики и лидеры, обязуемся сделать учас"
},
{
"path": "docs/CODE_OF_CONDUCT-TR.md",
"chars": 5375,
"preview": "# Katkıda Bulunanların Davranış Kuralları\n\n## Taahhüdümüz\n\nBiz üyeler, katkıda bulunanlar ve liderler olarak, yaş, beden"
},
{
"path": "docs/CODE_OF_CONDUCT-ZH.md",
"chars": 1964,
"preview": "\n# 贡献者公约行为准则\n\n## 我们的承诺\n\n身为社区成员、贡献者和领袖,我们承诺使社区参与者不受骚扰,无论其年龄、体型、可见或不可见的缺陷、族裔、性征、性别认同和表达、经验水平、教育程度、社会与经济地位、国籍、相貌、种族、种姓、肤色、宗"
},
{
"path": "docs/CODE_OF_CONDUCT.md",
"chars": 5499,
"preview": "\n# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make particip"
},
{
"path": "docs/CONTRIBUTING-DE.md",
"chars": 2262,
"preview": "# Beiträge zu RustDesk\n\nRustDesk begrüßt Beiträge von jedem. Hier sind die Richtlinien, wenn Sie uns\nhelfen möchten:\n\n##"
},
{
"path": "docs/CONTRIBUTING-ID.md",
"chars": 2572,
"preview": "# Berkontribusi dalam pengembangan RustDesk\n\nRustDesk mengajak semua orang untuk ikut berkontribusi. Berikut ini adalah "
},
{
"path": "docs/CONTRIBUTING-IT.md",
"chars": 2201,
"preview": "# Contribuzione a RustDesk\n\nRustDesk accoglie con favore il contributo di tutti.\nEcco le linee guida se stai pensando di"
},
{
"path": "docs/CONTRIBUTING-JP.md",
"chars": 1290,
"preview": "# RustDesk へのコントリビュート\n\nRustDesk は皆さんからのコントリビュートを歓迎します。ご協力いただける方のガイドラインは\n以下の通りです:\n\n## コントリビューション\n\nRustDesk またはその依存関係へのコント"
},
{
"path": "docs/CONTRIBUTING-KR.md",
"chars": 1199,
"preview": "# RustDesk 기여하기\n\nRustDesk는 모든 분들의 참여를 환영합니다. 저희를 도와주실 생각이 있으시다면 \n 다음 지침을 따르세요:\n\n## 기여\n\nRustDesk 또는 그 종속성에 대한 기여는 GitHub"
},
{
"path": "docs/CONTRIBUTING-NL.md",
"chars": 2218,
"preview": "# Bijdragen aan RustDesk\n\nRustDesk verwelkomt bijdragen van iedereen. Hier zijn de richtlijnen als u denkt \nons te wille"
},
{
"path": "docs/CONTRIBUTING-NO.md",
"chars": 2038,
"preview": "# Bidrag til RustDesk\n\nRustDesk er åpene for bidrag fra alle. Her er reglene for de som har lyst til å\nhjelpe oss:\n\n## B"
},
{
"path": "docs/CONTRIBUTING-PL.md",
"chars": 1949,
"preview": "# Współtworzenie RustDesk\n\nRustDesk z zadowoleniem przyjmuje wkład od każdego. Oto wytyczne, jeśli chcesz nam pomóc:\n\n##"
},
{
"path": "docs/CONTRIBUTING-RO.md",
"chars": 2225,
"preview": "# Contribuții la RustDesk\n\nRustDesk primește cu plăcere contribuții din partea tuturor. Iată ghidurile dacă te gândești "
},
{
"path": "docs/CONTRIBUTING-RU.md",
"chars": 2249,
"preview": "# Вклад в RustDesk\n\nRustDesk приветствует вклад каждого. \nНиже приведены рекомендации, если вы собираетесь помочь нам:\n\n"
},
{
"path": "docs/CONTRIBUTING-TR.md",
"chars": 2104,
"preview": "# RustDesk'a Katkı Sağlamak\n\nRustDesk, herkesten katkıyı memnuniyetle karşılar. Eğer bize yardımcı olmayı düşünüyorsanız"
},
{
"path": "docs/CONTRIBUTING-ZH.md",
"chars": 954,
"preview": "# 为RustDesk做贡献\n\nRust欢迎每一位贡献者,如果您有意向为我们做出贡献,请遵循以下指南:\n\n## 贡献方式\n\n对 RustDesk 或其依赖项的贡献需要通过 GitHub 的 Pull Request (PR) 的形式提交。每"
},
{
"path": "docs/CONTRIBUTING.md",
"chars": 1985,
"preview": "# Contributing to RustDesk\n\nRustDesk welcomes contribution from everyone. Here are the guidelines if you are\nthinking of"
},
{
"path": "docs/README-AR.md",
"chars": 7890,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Your remote desktop\"><br>\n <a href=\"#free-public"
},
{
"path": "docs/README-CS.md",
"chars": 8708,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk – vaše vzdálená plocha\"><br>\n <a href=\"#free-publi"
},
{
"path": "docs/README-DA.md",
"chars": 7714,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Your remote desktop\"><br>\n <a href=\"#gratis-offe"
},
{
"path": "docs/README-DE.md",
"chars": 10244,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Dein Remote-Desktop\"><br>\n <a href=\"#grobe-schri"
},
{
"path": "docs/README-EO.md",
"chars": 7569,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Your remote desktop\"><br>\n <a href=\"#senpagaj-pu"
},
{
"path": "docs/README-ES.md",
"chars": 10177,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Your remote desktop\"><br>\n <a href=\"#servidores-"
},
{
"path": "docs/README-FA.md",
"chars": 8516,
"preview": "<p dir=\"rtl\" align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Your remote desktop\"><br>\n <a href=\"#ت"
},
{
"path": "docs/README-FI.md",
"chars": 7615,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Etätyöpöytäsi\"><br>\n <a href=\"#free-public-serve"
},
{
"path": "docs/README-FR.md",
"chars": 8390,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Your remote desktop\"><br>\n <a href=\"#serveurs-pu"
},
{
"path": "docs/README-GR.md",
"chars": 9422,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Your remote desktop\"><br>\n <a href=\"#Δωρεάν-δημό"
},
{
"path": "docs/README-HU.md",
"chars": 8601,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Your remote desktop\"><br>\n <a href=\"#ingyenes-pu"
},
{
"path": "docs/README-ID.md",
"chars": 8672,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Your remote desktop\"><br>\n <a href=\"#free-public"
},
{
"path": "docs/README-IT.md",
"chars": 9997,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - il tuo desktop remoto\"><br>\n <a href=\"#server-pu"
},
{
"path": "docs/README-JP.md",
"chars": 8154,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - あなたのためのリモートデスクトップ\"><br>\n <a href=\"#free-public-s"
},
{
"path": "docs/README-KR.md",
"chars": 8445,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Your remote desktop\"><br>\n <a href=\"#빌드를 위한 원시 단"
},
{
"path": "docs/README-ML.md",
"chars": 7977,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Your remote desktop\"><br>\n <a href=\"#free-public"
},
{
"path": "docs/README-NL.md",
"chars": 8539,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Uw bureaublad op afstand\"><br>\n <a href=\"#free-p"
},
{
"path": "docs/README-NO.md",
"chars": 9497,
"preview": "<p align=\"center\">\n <img src=\"res/logo-header.svg\" alt=\"RustDesk - Your remote desktop\"><br>\n <a href=\"#public-servers"
},
{
"path": "docs/README-PL.md",
"chars": 8739,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Twój zdalny pulpit\"><br>\n <a href=\"#darmowe-serw"
},
{
"path": "docs/README-PTBR.md",
"chars": 8175,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Seu desktop remoto\"><br>\n <a href=\"#servidores-p"
},
{
"path": "docs/README-RO.md",
"chars": 10018,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - desktopul tău la distanță\"><br>\n <a href=\"../REA"
},
{
"path": "docs/README-RU.md",
"chars": 10493,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Ваш удаленый рабочий стол\"><br>\n <a href=\"#перви"
},
{
"path": "docs/README-TR.md",
"chars": 9787,
"preview": "\n<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Uzak masaüstü uygulamanız\"><br>\n <a href=\"#free"
},
{
"path": "docs/README-UA.md",
"chars": 9513,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Ваша віддалена стільниця\"><br>\n <a href=\"#публіч"
},
{
"path": "docs/README-VN.md",
"chars": 9043,
"preview": "\n\n<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Your remote desktop\"><br>\n <a href=\"#free-publ"
},
{
"path": "docs/README-ZH.md",
"chars": 9025,
"preview": "<p align=\"center\">\n <img src=\"../res/logo-header.svg\" alt=\"RustDesk - Your remote desktop\"><br>\n <a href=\"#免费的公共服务器\">服"
},
{
"path": "docs/SECURITY-DE.md",
"chars": 631,
"preview": "# Sicherheitsrichtlinie\n\n## Melden einer Schwachstelle\n\nWir legen großen Wert auf die Sicherheit des Projekts. Wir ermut"
},
{
"path": "docs/SECURITY-IT.md",
"chars": 608,
"preview": "# Policy sicurezza\n\n## Segnalazione di una vulnerabilità\n\nAttribuiamo grande importanza alla sicurezza del progetto. \nIn"
},
{
"path": "docs/SECURITY-JP.md",
"chars": 283,
"preview": "# セキュリティポリシー\n\n## 脆弱性の報告\n\n私たちはプロジェクトのセキュリティを非常に重視しています。私たちは、すべてのユーザーが脆弱性を発見した場合、私たちに報告することを奨励しています。\nRustDesk プロジェクトにセキュリテ"
},
{
"path": "docs/SECURITY-KR.md",
"chars": 286,
"preview": "# 보안 정책\n\n## 취약점 보고\n\n저희는 프로젝트의 보안을 매우 중요하게 생각합니다. 모든 사용자가 발견한 취약점을 저희에게 보고할 것을 권장합니다. RustDesk 프로젝트에서 보안 취약점이 발견되면 info@r"
},
{
"path": "docs/SECURITY-NL.md",
"chars": 625,
"preview": "# Veiligheidsbeleid\n\n## Een Kwetsbaarheid Melden\n\nWij hechten veel waarde aan de veiligheid van het project. We moedigen"
},
{
"path": "docs/SECURITY-NO.md",
"chars": 583,
"preview": "# Sikkerhets Rettningslinjer\n\n## Reportering av en Sårbarhet\n\nVi verdsetter pris på sikkerhet for prosjektet høyt. Og op"
},
{
"path": "docs/SECURITY-PL.md",
"chars": 597,
"preview": "# Polityka bezpieczeństwa\n\n## Zgłaszanie podatności\n\nBardzo cenimy sobie bezpieczeństwo projektu. Zachęcamy wszystkich u"
},
{
"path": "docs/SECURITY-RO.md",
"chars": 652,
"preview": "# Politica de Securitate\n\n## Raportarea unei Vulnerabilități\n\nAcordăm o mare importanță securității proiectului. Încuraj"
},
{
"path": "docs/SECURITY-TR.md",
"chars": 571,
"preview": "# Güvenlik Politikası\n\n## Bir Güvenlik Açığı Bildirme\n\nProjemiz için güvenliği çok önemsiyoruz. Kullanıcıların keşfettik"
},
{
"path": "docs/SECURITY.md",
"chars": 543,
"preview": "# Security Policy\n\n## Reporting a Vulnerability\n\nWe value security for the project very highly. We encourage all users t"
},
{
"path": "entrypoint.sh",
"chars": 648,
"preview": "#!/bin/sh\n\ncd \"$HOME\"/rustdesk || exit 1\n# shellcheck source=/dev/null\n. \"$HOME\"/.cargo/env\n\nargv=$*\n\nwhile test $# -gt "
},
{
"path": "examples/ipc.rs",
"chars": 2542,
"preview": "use docopt::Docopt;\nuse hbb_common::{\n env_logger::{init_from_env, Env, DEFAULT_FILTER_ENV},\n log, tokio,\n};\nuse l"
},
{
"path": "fastlane/metadata/android/en-US/full_description.txt",
"chars": 949,
"preview": "An open-source remote desktop application, the open source TeamViewer alternative.\nSource code: https://github.com/rustd"
},
{
"path": "fastlane/metadata/android/en-US/short_description.txt",
"chars": 70,
"preview": "An open-source remote desktop application, the TeamViewer alternative\n"
},
{
"path": "fastlane/metadata/android/fr-FR/full_description.txt",
"chars": 1111,
"preview": "Une application de bureau à distance open source, l'alternative open source à TeamViewer.\nCode source : https://github.c"
},
{
"path": "fastlane/metadata/android/fr-FR/short_description.txt",
"chars": 90,
"preview": "Une application de bureau à distance open source, l'alternative open source à TeamViewer.\n"
},
{
"path": "fastlane/metadata/android/nl-NL/full_description.txt",
"chars": 1057,
"preview": "Een open-source toepassing voor bureaublad op afstand, het open-source alternatief voor TeamViewer.\nBron code: https://g"
},
{
"path": "fastlane/metadata/android/nl-NL/short_description.txt",
"chars": 100,
"preview": "Een open-source toepassing voor bureaublad op afstand, het open-source alternatief voor TeamViewer.\n"
},
{
"path": "fastlane/metadata/android/zh-CN/full_description.txt",
"chars": 463,
"preview": "开源远程桌面应用,开源 TeamViewer 替代方案。\n源代码:https://github.com/rustdesk/rustdesk\n文档:https://rustdesk.com/docs/en/manual/mobile/\n\n为了"
},
{
"path": "fastlane/metadata/android/zh-CN/short_description.txt",
"chars": 28,
"preview": "开源远程桌面应用,开源 TeamViewer 替代方案\n"
},
{
"path": "flatpak/com.rustdesk.RustDesk.metainfo.xml",
"chars": 2645,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<component type=\"desktop-application\">\n <id>com.rustdesk.RustDesk</id>\n <develo"
},
{
"path": "flatpak/rustdesk.json",
"chars": 1886,
"preview": "{\n \"id\": \"com.rustdesk.RustDesk\",\n \"runtime\": \"org.freedesktop.Platform\",\n \"runtime-version\": \"24.08\",\n \"sdk\": \"org."
},
{
"path": "flutter/.gitattributes",
"chars": 12,
"preview": "* text=auto\n"
},
{
"path": "flutter/.gitignore",
"chars": 1002,
"preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.i"
},
{
"path": "flutter/.metadata",
"chars": 1226,
"preview": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrade"
},
{
"path": "flutter/README.md",
"chars": 557,
"preview": "# flutter_hbb\n\nA new Flutter project.\n\n## Getting Started\n\nThis project is a starting point for a Flutter application.\n\n"
},
{
"path": "flutter/analysis_options.yaml",
"chars": 137,
"preview": "include: package:lints/recommended.yaml\n\nlinter:\n rules:\n non_constant_identifier_names: false\n sort_child_proper"
},
{
"path": "flutter/android/.gitignore",
"chars": 262,
"preview": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n\n# Remembe"
},
{
"path": "flutter/android/app/build.gradle",
"chars": 4105,
"preview": "import com.google.protobuf.gradle.*\nimport groovy.json.JsonSlurper\n\nplugins {\n id \"com.google.protobuf\" version \"0.9."
},
{
"path": "flutter/android/app/proguard-rules",
"chars": 266,
"preview": "# Keep class members from protobuf generated code.\n-keepclassmembers class * extends com.google.protobuf.GeneratedMessag"
},
{
"path": "flutter/android/app/src/debug/AndroidManifest.xml",
"chars": 331,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package=\"com.carriez.flutter_hbb\">\n <!-- Flu"
},
{
"path": "flutter/android/app/src/main/AndroidManifest.xml",
"chars": 4540,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package="
},
{
"path": "flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/AudioRecordHandle.kt",
"chars": 6500,
"preview": "package com.carriez.flutter_hbb\n\nimport ffi.FFI\n\nimport android.Manifest\nimport android.content.Context\nimport android.m"
},
{
"path": "flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/BootReceiver.kt",
"chars": 1923,
"preview": "package com.carriez.flutter_hbb\n\nimport android.Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS\nimport android."
},
{
"path": "flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/FloatingWindowService.kt",
"chars": 14735,
"preview": "package com.carriez.flutter_hbb\n\nimport android.annotation.SuppressLint\nimport android.app.PendingIntent\nimport android."
},
{
"path": "flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt",
"chars": 26409,
"preview": "package com.carriez.flutter_hbb\n\n/**\n * Handle remote input and dispatch android gesture\n *\n * Inspired by [droidVNC-NG]"
},
{
"path": "flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/KeyboardKeyEventMapper.kt",
"chars": 5429,
"preview": "package hbb;\nimport android.view.KeyEvent\nimport android.view.KeyCharacterMap\nimport hbb.MessageOuterClass.KeyboardMode\n"
},
{
"path": "flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainActivity.kt",
"chars": 16789,
"preview": "package com.carriez.flutter_hbb\n\n/**\n * Handle events from flutter\n * Request MediaProjection permission\n *\n * Inspired "
},
{
"path": "flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainApplication.kt",
"chars": 362,
"preview": "package com.carriez.flutter_hbb\n\nimport android.app.Application\nimport android.util.Log\nimport ffi.FFI\n\nclass MainApplic"
},
{
"path": "flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainService.kt",
"chars": 27424,
"preview": "package com.carriez.flutter_hbb\n\nimport ffi.FFI\n\n/**\n * Capture screen,get video and audio,send to rust.\n * Dispatch not"
},
{
"path": "flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/PermissionRequestTransparentActivity.kt",
"chars": 1895,
"preview": "package com.carriez.flutter_hbb\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.media.projecti"
},
{
"path": "flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/RdClipboardManager.kt",
"chars": 7551,
"preview": "package com.carriez.flutter_hbb\n\nimport java.nio.ByteBuffer\nimport java.util.Timer\nimport java.util.TimerTask\n\nimport an"
},
{
"path": "flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/VolumeController.kt",
"chars": 2721,
"preview": "package com.carriez.flutter_hbb\n\n// Inspired by https://github.com/yosemiteyss/flutter_volume_controller/blob/main/andro"
},
{
"path": "flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/common.kt",
"chars": 4826,
"preview": "package com.carriez.flutter_hbb\n\nimport android.Manifest.permission.*\nimport android.annotation.SuppressLint\nimport andr"
},
{
"path": "flutter/android/app/src/main/kotlin/ffi.kt",
"chars": 1007,
"preview": "// ffi.kt\n\npackage ffi\n\nimport android.content.Context\nimport java.nio.ByteBuffer\n\nimport com.carriez.flutter_hbb.RdClip"
},
{
"path": "flutter/android/app/src/main/res/drawable/check_blue.xml",
"chars": 330,
"preview": "<vector android:height=\"24dp\" android:tint=\"#0071FF\"\n android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n andr"
},
{
"path": "flutter/android/app/src/main/res/drawable/close_red.xml",
"chars": 381,
"preview": "<vector android:height=\"24dp\" android:tint=\"#D74E4E\"\n android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n andr"
},
{
"path": "flutter/android/app/src/main/res/drawable/floating_window.xml",
"chars": 1398,
"preview": "<vector xmlns:aapt=\"http://schemas.android.com/aapt\" xmlns:android=\"http://schemas.android.com/apk/res/android\" android:"
},
{
"path": "flutter/android/app/src/main/res/drawable/launch_background.xml",
"chars": 434,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
},
{
"path": "flutter/android/app/src/main/res/drawable-v21/launch_background.xml",
"chars": 438,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
},
{
"path": "flutter/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
"chars": 333,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <b"
},
{
"path": "flutter/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
"chars": 333,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <b"
},
{
"path": "flutter/android/app/src/main/res/values/colors.xml",
"chars": 107,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"primary\">#FF0071FF</color>\n</resources>"
},
{
"path": "flutter/android/app/src/main/res/values/ic_launcher_background.xml",
"chars": 120,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"ic_launcher_background\">#ffffff</color>\n</resources>"
},
{
"path": "flutter/android/app/src/main/res/values/strings.xml",
"chars": 240,
"preview": "<resources>\n <string name=\"app_name\">RustDesk</string>\n <string name=\"accessibility_service_description\">Allow oth"
},
{
"path": "flutter/android/app/src/main/res/values/styles.xml",
"chars": 1455,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <!-- Theme applied to the Android Window while the process is sta"
},
{
"path": "flutter/android/app/src/main/res/values-night/styles.xml",
"chars": 993,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <!-- Theme applied to the Android Window while the process is sta"
},
{
"path": "flutter/android/app/src/main/res/xml/accessibility_service_config.xml",
"chars": 373,
"preview": "<accessibility-service xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:accessibilityEventTypes=\"t"
},
{
"path": "flutter/android/app/src/profile/AndroidManifest.xml",
"chars": 331,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package=\"com.carriez.flutter_hbb\">\n <!-- Flu"
},
{
"path": "flutter/android/build.gradle",
"chars": 360,
"preview": "allprojects {\n repositories {\n google()\n jcenter()\n maven { url 'https://jitpack.io' }\n }\n}\n\n"
},
{
"path": "flutter/android/gradle/wrapper/gradle-wrapper.properties",
"chars": 233,
"preview": "#Fri Jun 23 08:50:38 CEST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER"
},
{
"path": "flutter/android/gradle.properties",
"chars": 106,
"preview": "org.gradle.jvmargs=-Xmx1024M\nandroid.useAndroidX=true\nandroid.enableJetifier=true\norg.gradle.daemon=false\n"
},
{
"path": "flutter/android/settings.gradle",
"chars": 727,
"preview": "pluginManagement {\n def flutterSdkPath = {\n def properties = new Properties()\n file(\"local.properties\")"
},
{
"path": "flutter/build_android.sh",
"chars": 747,
"preview": "#!/usr/bin/env bash\n\nMODE=${MODE:=release}\n$ANDROID_NDK_HOME/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/"
},
{
"path": "flutter/build_android_deps.sh",
"chars": 2183,
"preview": "#!/bin/bash\n\nset -e -o pipefail\n\nANDROID_ABI=$1\n\n# Build RustDesk dependencies for Android using vcpkg.json\n# Required:\n"
},
{
"path": "flutter/build_fdroid.sh",
"chars": 14453,
"preview": "#!/bin/bash\n\n#\n# Script to build F-Droid release of RustDesk\n#\n# Copyright (C) 2024, The RustDesk Authors\n# "
},
{
"path": "flutter/build_ios.sh",
"chars": 349,
"preview": "#!/usr/bin/env bash\n# https://docs.flutter.dev/deployment/ios\n# flutter build ipa --release --obfuscate --split-debug-in"
},
{
"path": "flutter/ios/.gitignore",
"chars": 561,
"preview": "*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/DerivedDat"
},
{
"path": "flutter/ios/Flutter/AppFrameworkInfo.plist",
"chars": 774,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "flutter/ios/Flutter/Debug.xcconfig",
"chars": 107,
"preview": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
},
{
"path": "flutter/ios/Flutter/Release.xcconfig",
"chars": 109,
"preview": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
},
{
"path": "flutter/ios/Podfile",
"chars": 1412,
"preview": "# CocoaPods analytics sends network stats synchronously affecting flutter build latency.\nENV['COCOAPODS_DISABLE_STATS'] "
},
{
"path": "flutter/ios/Runner/AppDelegate.swift",
"chars": 555,
"preview": "import UIKit\nimport Flutter\n\n@main\n@objc class AppDelegate: FlutterAppDelegate {\n override func application(\n _ appl"
},
{
"path": "flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 2519,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"Icon-App-20x20@2x.png\",\n \"idiom\" : \"iphone\",\n \"scale\" : \"2x\",\n "
},
{
"path": "flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
"chars": 391,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"LaunchImage.png\",\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
"chars": 336,
"preview": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in"
},
{
"path": "flutter/ios/Runner/Base.lproj/LaunchScreen.storyboard",
"chars": 2377,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "flutter/ios/Runner/Base.lproj/Main.storyboard",
"chars": 1809,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "flutter/ios/Runner/GoogleService-Info.plist",
"chars": 1172,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "flutter/ios/Runner/Info.plist",
"chars": 2600,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "flutter/ios/Runner/Runner-Bridging-Header.h",
"chars": 68,
"preview": "#import \"GeneratedPluginRegistrant.h\"\n\n#import \"bridge_generated.h\"\n"
},
{
"path": "flutter/ios/Runner/Runner.entitlements",
"chars": 308,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "flutter/ios/Runner.xcodeproj/project.pbxproj",
"chars": 28014,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "flutter/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:\">\n </FileRef"
},
{
"path": "flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
"chars": 226,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "flutter/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
"chars": 3185,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1510\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "flutter/ios/Runner.xcworkspace/contents.xcworkspacedata",
"chars": 224,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"group:Runner.xcodepr"
},
{
"path": "flutter/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "flutter/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
"chars": 226,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "flutter/ios/exportOptions.plist",
"chars": 419,
"preview": "<?xml version=”1.0\" encoding=”UTF-8\"?>\n <!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/"
},
{
"path": "flutter/ios_arm64.sh",
"chars": 102,
"preview": "#!/usr/bin/env bash\ncargo build --features flutter,hwcodec --release --target aarch64-apple-ios --lib\n"
},
{
"path": "flutter/ios_x64.sh",
"chars": 93,
"preview": "#!/usr/bin/env bash\ncargo build --features flutter --release --target x86_64-apple-ios --lib\n"
},
{
"path": "flutter/lib/common/formatter/id_formatter.dart",
"chars": 1742,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\nclass IDTextEditingController extends T"
},
{
"path": "flutter/lib/common/hbbs/hbbs.dart",
"chars": 7551,
"preview": "import 'dart:convert';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_hbb/common.dart';\nimport 'package"
},
{
"path": "flutter/lib/common/shared_state.dart",
"chars": 9428,
"preview": "import 'package:flutter_hbb/common.dart';\nimport 'package:get/get.dart';\n\nimport '../consts.dart';\n\n// TODO: A lot of du"
},
{
"path": "flutter/lib/common/widgets/address_book.dart",
"chars": 30890,
"preview": "import 'dart:math';\n\nimport 'package:bot_toast/bot_toast.dart';\nimport 'package:dropdown_button2/dropdown_button2.dart';"
},
{
"path": "flutter/lib/common/widgets/animated_rotation_widget.dart",
"chars": 1311,
"preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass AnimatedRotationWidget extends StatefulWid"
},
{
"path": "flutter/lib/common/widgets/audio_input.dart",
"chars": 2402,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_hbb/common.dart';\nimport 'package:flutter_hbb/models/pla"
},
{
"path": "flutter/lib/common/widgets/autocomplete.dart",
"chars": 10113,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_hbb/common/formatter/id_formatter.dart';\nimport '../../."
},
{
"path": "flutter/lib/common/widgets/chat_page.dart",
"chars": 7340,
"preview": "import 'package:dash_chat_2/dash_chat_2.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_hbb/commo"
},
{
"path": "flutter/lib/common/widgets/connection_page_title.dart",
"chars": 1047,
"preview": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dar"
},
{
"path": "flutter/lib/common/widgets/custom_password.dart",
"chars": 3388,
"preview": "// https://github.com/rodrigobastosv/fancy_password_field\nimport 'package:flutter/material.dart';\nimport 'package:flutte"
},
{
"path": "flutter/lib/common/widgets/custom_scale_base.dart",
"chars": 4916,
"preview": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:de"
},
{
"path": "flutter/lib/common/widgets/dialog.dart",
"chars": 85401,
"preview": "import 'dart:async';\nimport 'dart:convert';\n\nimport 'package:bot_toast/bot_toast.dart';\nimport 'package:flutter/material"
},
{
"path": "flutter/lib/common/widgets/gestures.dart",
"chars": 23810,
"preview": "import 'dart:async';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/widgets.dart';\nimport 'package:flut"
},
{
"path": "flutter/lib/common/widgets/login.dart",
"chars": 22334,
"preview": "import 'dart:async';\nimport 'dart:convert';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_hbb/common/"
},
{
"path": "flutter/lib/common/widgets/my_group.dart",
"chars": 10668,
"preview": "import 'dart:math';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_hbb/common/hbbs/hbbs.dart';\nimport "
},
{
"path": "flutter/lib/common/widgets/overlay.dart",
"chars": 20363,
"preview": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:debounce_throttle/debounce_throttle.dart';\nimport '"
},
{
"path": "flutter/lib/common/widgets/peer_card.dart",
"chars": 51172,
"preview": "import 'package:bot_toast/bot_toast.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart"
},
{
"path": "flutter/lib/common/widgets/peer_tab_page.dart",
"chars": 34263,
"preview": "import 'dart:ui' as ui;\n\nimport 'package:bot_toast/bot_toast.dart';\nimport 'package:flutter/material.dart';\nimport 'pack"
},
{
"path": "flutter/lib/common/widgets/peers_view.dart",
"chars": 19356,
"preview": "import 'dart:async';\nimport 'dart:collection';\n\nimport 'package:dynamic_layouts/dynamic_layouts.dart';\nimport 'package:f"
},
{
"path": "flutter/lib/common/widgets/remote_input.dart",
"chars": 21828,
"preview": "import 'dart:convert';\nimport 'dart:math';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dar"
},
{
"path": "flutter/lib/common/widgets/setting_widgets.dart",
"chars": 11000,
"preview": "import 'package:debounce_throttle/debounce_throttle.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutt"
},
{
"path": "flutter/lib/common/widgets/toolbar.dart",
"chars": 35055,
"preview": "import 'dart:async';\nimport 'dart:convert';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.da"
},
{
"path": "flutter/lib/common.dart",
"chars": 129054,
"preview": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:math';\n\nimport 'package:back_button_interceptor/back_button_int"
},
{
"path": "flutter/lib/consts.dart",
"chars": 25922,
"preview": "import 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_hbb/common.dart'"
},
{
"path": "flutter/lib/desktop/pages/connection_page.dart",
"chars": 23543,
"preview": "// main window right pane\n\nimport 'dart:async';\nimport 'dart:convert';\nimport 'dart:math';\n\nimport 'package:flutter/mate"
},
{
"path": "flutter/lib/desktop/pages/desktop_home_page.dart",
"chars": 37113,
"preview": "import 'dart:async';\nimport 'dart:io';\nimport 'dart:convert';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimpo"
},
{
"path": "flutter/lib/desktop/pages/desktop_setting_page.dart",
"chars": 103079,
"preview": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\n\nimport 'package:file_picker/file_picker.dart';\nimport 'pa"
},
{
"path": "flutter/lib/desktop/pages/desktop_tab_page.dart",
"chars": 3714,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_hbb/common.dart';\nimport 'package:flutter_hbb/consts.dar"
}
]
// ... and 578 more files (download for full content)
About this extraction
This page contains the full source code of the rustdesk/rustdesk GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 778 files (9.0 MB), approximately 2.4M tokens, and a symbol index with 9797 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.