├── .github
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ └── feature_request.md
├── dependabot.yml
└── workflows
│ └── winget.yml
├── .gitignore
├── .metadata
├── LICENSE
├── README.md
├── README_zh_CN.md
├── analysis_options.yaml
├── assets
├── fonts
│ ├── IBMPlexSans-Bold.ttf
│ ├── IBMPlexSans-ExtraLight.ttf
│ ├── IBMPlexSans-Light.ttf
│ ├── IBMPlexSans-Medium.ttf
│ ├── IBMPlexSans-Regular.ttf
│ ├── IBMPlexSans-SemiBold.ttf
│ ├── IBMPlexSans-Thin.ttf
│ ├── Inter-Regular.ttf
│ ├── Inter-SemiBold.ttf
│ └── Inter-Thin.ttf
├── icons
│ ├── alt.svg
│ ├── arrow-down.svg
│ ├── arrow-left.svg
│ ├── arrow-right.svg
│ ├── arrow-up.svg
│ ├── backspace.svg
│ ├── caps-lock.svg
│ ├── caps-locked.svg
│ ├── control.svg
│ ├── delete.svg
│ ├── drag.svg
│ ├── end.svg
│ ├── enter.svg
│ ├── escape.svg
│ ├── function.svg
│ ├── home.svg
│ ├── insert.svg
│ ├── left-click.svg
│ ├── mac-meta.svg
│ ├── meta.svg
│ ├── mouse.svg
│ ├── num-lock.svg
│ ├── num-locked.svg
│ ├── page-down.svg
│ ├── page-up.svg
│ ├── pause.svg
│ ├── print-screen.svg
│ ├── right-click.svg
│ ├── scroll-lock.svg
│ ├── scroll-locked.svg
│ ├── scroll.svg
│ ├── shift.svg
│ ├── space.svg
│ └── tab.svg
├── img
│ ├── align-bottom.svg
│ ├── align-horizontally.svg
│ ├── align-left.svg
│ ├── align-right.svg
│ ├── align-top.svg
│ ├── align-vertically.svg
│ ├── arrow-right.svg
│ ├── chevron-down.svg
│ ├── clipboard-tick.svg
│ ├── clipboard.svg
│ ├── cog-wheel.svg
│ ├── cross.svg
│ ├── discord-logo.svg
│ ├── edit.svg
│ ├── error.svg
│ ├── github-logo.svg
│ ├── grab.svg
│ ├── keyboard.svg
│ ├── keycap-grid.svg
│ ├── linked.svg
│ ├── logo.svg
│ ├── mail.svg
│ ├── monitor.svg
│ ├── more.svg
│ ├── mouse.svg
│ ├── opencollective-logo.svg
│ ├── tray-off.ico
│ ├── tray-off.png
│ ├── tray-on.ico
│ ├── tray-on.png
│ └── unlinked.svg
└── logo.png
├── lib
├── app.dart
├── config
│ ├── assets.dart
│ ├── config.dart
│ ├── extensions.dart
│ ├── style.dart
│ └── theme.dart
├── domain
│ ├── services
│ │ ├── key_maps.dart
│ │ ├── raw_keyboard_mouse.dart
│ │ └── services.dart
│ └── vault
│ │ ├── json.dart
│ │ └── vault.dart
├── main.dart
├── providers
│ ├── key_event.dart
│ ├── key_event_data.dart
│ ├── key_style.dart
│ └── providers.dart
└── windows
│ ├── error
│ └── error.dart
│ ├── key_visualizer
│ ├── key_visualizer.dart
│ └── widgets
│ │ ├── animations
│ │ ├── animations.dart
│ │ ├── fade_keycap_animation.dart
│ │ ├── grow_keycap_animation.dart
│ │ ├── key_cap_animation.dart
│ │ ├── slide_keycap_animation.dart
│ │ └── wham_keycap_animation.dart
│ │ ├── keycap_group.dart
│ │ ├── keycap_wrapper.dart
│ │ ├── keycaps
│ │ ├── elevated_keycap.dart
│ │ ├── flat_keycap.dart
│ │ ├── keycap.dart
│ │ ├── keycap_content.dart
│ │ ├── keycaps.dart
│ │ ├── mechanical_keycap.dart
│ │ ├── minimal_keycap.dart
│ │ ├── plastic_keycap.dart
│ │ └── retro_keycap.dart
│ │ └── widgets.dart
│ ├── mouse_visualizer
│ ├── mouse_visualizer.dart
│ └── widgets
│ │ ├── cursor_highlight.dart
│ │ ├── cursor_highlight_wrapper.dart
│ │ ├── filled_cursor_higlight.dart
│ │ ├── focus_cursor_higlight.dart
│ │ ├── static_cursor_higlight.dart
│ │ └── widgets.dart
│ ├── settings
│ ├── settings.dart
│ ├── views
│ │ ├── about.dart
│ │ ├── appearance.dart
│ │ ├── general.dart
│ │ ├── mouse.dart
│ │ ├── style
│ │ │ ├── background.dart
│ │ │ ├── border.dart
│ │ │ ├── color.dart
│ │ │ ├── layout.dart
│ │ │ ├── style.dart
│ │ │ └── typography.dart
│ │ └── views.dart
│ └── widgets
│ │ ├── color_picker.dart
│ │ ├── color_swatches.dart
│ │ ├── cross_dropdown.dart
│ │ ├── cross_expansion_tile.dart
│ │ ├── cross_icon_button.dart
│ │ ├── cross_slider.dart
│ │ ├── cross_switch.dart
│ │ ├── cross_text_button.dart
│ │ ├── gradient_picker.dart
│ │ ├── hotkey_input.dart
│ │ ├── panel_item.dart
│ │ ├── sidebar.dart
│ │ ├── sub_panel_item.dart
│ │ └── widgets.dart
│ └── shared
│ ├── shared.dart
│ ├── spacing.dart
│ └── svg_icon.dart
├── linux
├── .gitignore
├── CMakeLists.txt
├── flutter
│ ├── CMakeLists.txt
│ ├── generated_plugin_registrant.cc
│ ├── generated_plugin_registrant.h
│ └── generated_plugins.cmake
├── main.cc
├── my_application.cc
└── my_application.h
├── macos
├── .gitignore
├── Flutter
│ ├── Flutter-Debug.xcconfig
│ ├── Flutter-Release.xcconfig
│ └── GeneratedPluginRegistrant.swift
├── Podfile
├── Podfile.lock
├── Runner.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ └── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── Runner
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ │ └── AppIcon.appiconset
│ │ │ ├── Contents.json
│ │ │ ├── app_icon_1024.png
│ │ │ ├── app_icon_128.png
│ │ │ ├── app_icon_16.png
│ │ │ ├── app_icon_256.png
│ │ │ ├── app_icon_32.png
│ │ │ ├── app_icon_512.png
│ │ │ └── app_icon_64.png
│ ├── Base.lproj
│ │ └── MainMenu.xib
│ ├── Configs
│ │ ├── AppInfo.xcconfig
│ │ ├── Debug.xcconfig
│ │ ├── Release.xcconfig
│ │ └── Warnings.xcconfig
│ ├── DebugProfile.entitlements
│ ├── Info.plist
│ ├── MainFlutterWindow.swift
│ └── Release.entitlements
└── RunnerTests
│ └── RunnerTests.swift
├── previews
├── banner.png
├── banner.svg
├── settings.svg
└── visualizer-bar.svg
├── pubspec.lock
├── pubspec.yaml
└── windows
├── .gitignore
├── CMakeLists.txt
├── flutter
├── CMakeLists.txt
├── generated_plugin_registrant.cc
├── generated_plugin_registrant.h
└── generated_plugins.cmake
└── runner
├── CMakeLists.txt
├── Runner.rc
├── flutter_window.cpp
├── flutter_window.h
├── main.cpp
├── resource.h
├── resources
└── app_icon.ico
├── runner.exe.manifest
├── utils.cpp
├── utils.h
├── win32_window.cpp
└── win32_window.h
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: [mulaRahul]
4 | patreon: # Replace with a single Patreon username
5 | open_collective: keyviz
6 | ko_fi: # Replace with a single Ko-fi username
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
13 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
14 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 |
13 | **Version**: v0.x.x
14 |
15 | **To Reproduce**
16 | Steps to reproduce the behavior:
17 | 1. Go to '...'
18 | 2. Click on '....'
19 | 3. Scroll down to '....'
20 | 4. See error
21 |
22 | **Expected behavior**
23 | A clear and concise description of what you expected to happen.
24 |
25 | **Screenshots**
26 | If applicable, add screenshots to help explain your problem.
27 |
28 | **Desktop (please complete the following information):**
29 | - Windows 10/11
30 |
31 | **Additional context**
32 | Add any other context about the problem here.
33 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Is your feature request related to a problem? Please describe.**
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 |
13 | **Describe the solution you'd like**
14 | A clear and concise description of what you want to happen.
15 |
16 | **Describe alternatives you've considered**
17 | A clear and concise description of any alternative solutions or features you've considered.
18 |
19 | **Additional context**
20 | Add any other context or screenshots about the feature request here.
21 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | updates:
3 | - package-ecosystem: "github-actions"
4 | directory: "/"
5 | schedule:
6 | interval: "daily"
7 | - package-ecosystem: "pub"
8 | directory: "/"
9 | schedule:
10 | interval: "daily"
11 |
--------------------------------------------------------------------------------
/.github/workflows/winget.yml:
--------------------------------------------------------------------------------
1 | name: Publish to Winget
2 |
3 | on:
4 | release:
5 | types: [released]
6 |
7 | jobs:
8 | publish:
9 | runs-on: ubuntu-latest
10 | steps:
11 | - uses: vedantmgoyal2009/winget-releaser@v2
12 | with:
13 | identifier: mulaRahul.Keyviz
14 | token: ${{ secrets.WINGET_TOKEN }}
15 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 | migrate_working_dir/
12 |
13 | # IntelliJ related
14 | *.iml
15 | *.ipr
16 | *.iws
17 | .idea/
18 |
19 | # The .vscode folder contains launch configuration and tasks you configure in
20 | # VS Code which you may wish to be included in version control, so this line
21 | # is commented out by default.
22 | .vscode/
23 |
24 | # Flutter/Dart/Pub related
25 | **/doc/api/
26 | **/ios/Flutter/.last_build_id
27 | .dart_tool/
28 | .flutter-plugins
29 | .flutter-plugins-dependencies
30 | .packages
31 | .pub-cache/
32 | .pub/
33 | /build/
34 |
35 | # Symbolication related
36 | app.*.symbols
37 |
38 | # Obfuscation related
39 | app.*.map.json
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled.
5 |
6 | version:
7 | revision: 796c8ef79279f9c774545b3771238c3098dbefab
8 | channel: stable
9 |
10 | project_type: app
11 |
12 | # Tracks metadata for the flutter migrate command
13 | migration:
14 | platforms:
15 | - platform: root
16 | create_revision: 796c8ef79279f9c774545b3771238c3098dbefab
17 | base_revision: 796c8ef79279f9c774545b3771238c3098dbefab
18 | - platform: android
19 | create_revision: 796c8ef79279f9c774545b3771238c3098dbefab
20 | base_revision: 796c8ef79279f9c774545b3771238c3098dbefab
21 | - platform: ios
22 | create_revision: 796c8ef79279f9c774545b3771238c3098dbefab
23 | base_revision: 796c8ef79279f9c774545b3771238c3098dbefab
24 | - platform: linux
25 | create_revision: 796c8ef79279f9c774545b3771238c3098dbefab
26 | base_revision: 796c8ef79279f9c774545b3771238c3098dbefab
27 | - platform: macos
28 | create_revision: 796c8ef79279f9c774545b3771238c3098dbefab
29 | base_revision: 796c8ef79279f9c774545b3771238c3098dbefab
30 | - platform: web
31 | create_revision: 796c8ef79279f9c774545b3771238c3098dbefab
32 | base_revision: 796c8ef79279f9c774545b3771238c3098dbefab
33 | - platform: windows
34 | create_revision: 796c8ef79279f9c774545b3771238c3098dbefab
35 | base_revision: 796c8ef79279f9c774545b3771238c3098dbefab
36 |
37 | # User provided section
38 |
39 | # List of Local paths (relative to this file) that should be
40 | # ignored by the migrate tool.
41 | #
42 | # Files that are not part of the templates will be ignored by default.
43 | unmanaged_files:
44 | - 'lib/main.dart'
45 | - 'ios/Runner.xcodeproj/project.pbxproj'
46 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | Keyviz is a free and open-source software to visualise your keystrokes and mouse actions in real time! Let your audience know what handy shortcuts/keys you're pressing during screencasts, presentations, collaborations, or whenever you need it.
4 |
5 | **English** | [简体中文](./README_zh_CN.md)
6 |
7 | # ⌨️ Keystrokes & 🖱️ Mouse Actions
8 |
9 | Now you can visualize mouse actions! Not only mouse clicks, you can also visualize mouse actions along with keystrokes like Cmd + Click, Alt + Drag, etc.
10 |
11 | 
12 |
13 | # 🎨 Stylize
14 |
15 | Don't restrain yourself to just black & white! You can customize every aspect of the visualization. The visualisation's style, size, colour (modifier and regular keys), border, icon, etc.
16 |
17 | 
18 |
19 | Powerful and easy-to-use configuration options.
20 |
21 | - Filter normal keys and only display shortcuts like Cmd + K **(Default)**
22 | - Adjust the visualisation position on the screen
23 | - Decide how much the visualisation lingers on the screen before animating out
24 | - Switch between animation presets to animate your visualisation in & out
25 |
26 |
27 |
28 | # 📥 Installation
29 |
30 | You can download the latest version of keyviz from the [Github Releases](https://github.com/mulaRahul/keyviz/releases) page. For the installer, unzip the downloaded file, run the installer and follow the familiar steps to install keyviz.
31 |
32 | Below are the platform specifics options and requirements -
33 |
34 |
35 |
36 | 🪟 Windows
37 |
38 | ### 👜 Microsoft Store
39 | You can download keyviz directly from the [microsoft store](https://apps.microsoft.com/detail/Keyviz/9phzpj643p7l?mode=direct).
40 |
41 | ### 🥄 Scoop
42 | ```bash
43 | scoop bucket add extras # first, add the bucket
44 | scoop install keyviz
45 | ```
46 |
47 | ### 📦 Winget
48 | ```bash
49 | winget install mulaRahul.Keyviz
50 | ```
51 |
52 |
53 |
54 |
55 | *.dll
missing error?
56 |
57 | If you're getting a `.dll` missing error after installing the application, you're missing the required Visual C++ redistributables. You can get the same from here [VSC++ Redist](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170).
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 | 🍎 MacOS
68 |
69 | ### 🔒 Permission
70 |
71 | Keyviz requires **Input Monitoring** and **Accessibility** permissions. Enable the same in settings -
72 |
73 | ```
74 | Settings > Privacy & Security > Input Monitoring/Accessibility
75 | ```
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 | 🐧 Linux
86 |
87 | ### ❗ v2.x.x Requirements
88 | ```bash
89 | sudo apt-get install libayatana-appindicator3-dev
90 | ```
91 | or
92 | ```bash
93 | sudo apt-get install appindicator3-0.1 libappindicator3-dev
94 | ```
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 | # 🛠️ Build Instructions
104 |
105 | You can always further develop/build the project by yourself. First of all ensure that you've setup Flutter on your system. If not follow this [guide](https://docs.flutter.dev/get-started/install).
106 |
107 | After setting up flutter, clone the repository if you have `git` installed or download the zip and unpack the same.
108 |
109 | ```bash
110 | mkdir keyviz
111 | cd keyviz
112 | git clone https://github.com/mulaRahul/keyviz.git .
113 | ```
114 |
115 | Move inside the flutter project and run the build command to create an executable -
116 |
117 | ```bash
118 | flutter build windows
119 | ```
120 |
121 |
122 |
123 | # 💖 Support
124 |
125 | As keyviz is freeware, the only way I can earn is through your generous donations. It helps free my time and work more on keyviz.
126 |
--------------------------------------------------------------------------------
/README_zh_CN.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | Keyviz,一个免费开源的实时键鼠输入可视化软件,让观众了解你在演示的过程中按下了什么快捷键
4 |
5 | **简体中文** | [English](./README.md)
6 |
7 | # ⌨️ 键盘输入 & 🖱️ 鼠标操作
8 |
9 | Keyviz也可以显示鼠标、键盘+鼠标的操作,比如 Cmd + Click 或 Alt + Drag
10 |
11 | 
12 |
13 | # 🎨 个性化
14 |
15 | 不只有黑与白,Keyviz可以高度自定义按键的显示效果,包括但不限于:预设风格、尺寸、键位图标显示切换(Shift的↑)、辅助键和常规键的颜色、边框
16 |
17 | 
18 |
19 | 强大易用的设置菜单
20 |
21 | - 隐藏常规键,留下组合键,比如只显示 Cmd + K**(默认)**
22 | - 显示位置(区域、距离主显示器边缘的距离)
23 | - 按键显示的停留时间
24 | - 按键切入切出的动画
25 |
26 |
27 |
28 | # 📥 安装
29 |
30 | 在 [Github Releases](https://github.com/mulaRahul/keyviz/releases) 下载最新版,根据操作系统安装/解压即用,或者通过下面的包管理器安装
31 |
32 |
33 | 🥄 Scoop
34 |
35 | ```bash
36 | scoop bucket add extras # first, add the bucket
37 | scoop install keyviz
38 | ```
39 |
40 |
41 |
42 |
43 | 🪟 Winget
44 |
45 | ```bash
46 | winget install mulaRahul.Keyviz
47 | ```
48 |
49 |
50 |
51 |
52 |
53 |
54 | 提示缺少*.dll
?
55 |
56 | 如果运行程序弹出了缺少`.dll`文件的错误,大概率是环境缺少了VC++运行库,你可以在[**这里**](https://learn.microsoft.com/zh-cn/cpp/windows/latest-supported-vc-redist?view=msvc-170)下载安装
57 |
58 |
59 |
60 |
61 |
62 | # 🛠️ 构建说明
63 |
64 | 在进一步开发、编译之前,请确保在系统上安装好了Flutter,可以参照[官方的安装指南](https://docs.flutter.dev/get-started/install)
65 |
66 | 安装并设置好Flutter后,克隆仓库或下载zip并解压
67 |
68 | ```bash
69 | mkdir keyviz
70 | git clone https://github.com/mulaRahul/keyviz.git .
71 | ```
72 |
73 | cd到项目文件夹内 开始编译
74 |
75 | ```bash
76 | cd keyviz
77 | # 获取依赖
78 | flutter pub get
79 | # 编译可执行文件
80 | flutter build windows
81 | ```
82 |
83 |
84 |
85 | # 💖 支持该项目
86 |
87 | Keyviz是一个免费项目,唯一的收益来源只有你们的慷慨捐赠,这将有助于我腾出更多的空余时间用于开发Keyviz
88 |
89 |
90 |
91 |
92 |
93 | 译于23/7/18,v2.0.0a发布的七天后,有些条目是作者还没改上去的,部分描述其实跟软件本体差挺多的
94 |
95 |
--------------------------------------------------------------------------------
/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | # This file configures the analyzer, which statically analyzes Dart code to
2 | # check for errors, warnings, and lints.
3 | #
4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled
5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
6 | # invoked from the command line by running `flutter analyze`.
7 |
8 | # The following line activates a set of recommended lints for Flutter apps,
9 | # packages, and plugins designed to encourage good coding practices.
10 | include: package:flutter_lints/flutter.yaml
11 |
12 | linter:
13 | # The lint rules applied to this project can be customized in the
14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml`
15 | # included above or to enable additional rules. A list of all available lints
16 | # and their documentation is published at
17 | # https://dart-lang.github.io/linter/lints/index.html.
18 | #
19 | # Instead of disabling a lint rule for the entire project in the
20 | # section below, it can also be suppressed for a single line of code
21 | # or a specific dart file by using the `// ignore: name_of_lint` and
22 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file
23 | # producing the lint.
24 | rules:
25 | # avoid_print: false # Uncomment to disable the `avoid_print` rule
26 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
27 |
28 | # Additional information about this file can be found at
29 | # https://dart.dev/guides/language/analysis-options
30 |
--------------------------------------------------------------------------------
/assets/fonts/IBMPlexSans-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mulaRahul/keyviz/0452c3c060d2b6fe5706cc85f43c44992523ab4e/assets/fonts/IBMPlexSans-Bold.ttf
--------------------------------------------------------------------------------
/assets/fonts/IBMPlexSans-ExtraLight.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mulaRahul/keyviz/0452c3c060d2b6fe5706cc85f43c44992523ab4e/assets/fonts/IBMPlexSans-ExtraLight.ttf
--------------------------------------------------------------------------------
/assets/fonts/IBMPlexSans-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mulaRahul/keyviz/0452c3c060d2b6fe5706cc85f43c44992523ab4e/assets/fonts/IBMPlexSans-Light.ttf
--------------------------------------------------------------------------------
/assets/fonts/IBMPlexSans-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mulaRahul/keyviz/0452c3c060d2b6fe5706cc85f43c44992523ab4e/assets/fonts/IBMPlexSans-Medium.ttf
--------------------------------------------------------------------------------
/assets/fonts/IBMPlexSans-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mulaRahul/keyviz/0452c3c060d2b6fe5706cc85f43c44992523ab4e/assets/fonts/IBMPlexSans-Regular.ttf
--------------------------------------------------------------------------------
/assets/fonts/IBMPlexSans-SemiBold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mulaRahul/keyviz/0452c3c060d2b6fe5706cc85f43c44992523ab4e/assets/fonts/IBMPlexSans-SemiBold.ttf
--------------------------------------------------------------------------------
/assets/fonts/IBMPlexSans-Thin.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mulaRahul/keyviz/0452c3c060d2b6fe5706cc85f43c44992523ab4e/assets/fonts/IBMPlexSans-Thin.ttf
--------------------------------------------------------------------------------
/assets/fonts/Inter-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mulaRahul/keyviz/0452c3c060d2b6fe5706cc85f43c44992523ab4e/assets/fonts/Inter-Regular.ttf
--------------------------------------------------------------------------------
/assets/fonts/Inter-SemiBold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mulaRahul/keyviz/0452c3c060d2b6fe5706cc85f43c44992523ab4e/assets/fonts/Inter-SemiBold.ttf
--------------------------------------------------------------------------------
/assets/fonts/Inter-Thin.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mulaRahul/keyviz/0452c3c060d2b6fe5706cc85f43c44992523ab4e/assets/fonts/Inter-Thin.ttf
--------------------------------------------------------------------------------
/assets/icons/alt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/arrow-down.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/arrow-left.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/arrow-right.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/arrow-up.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/backspace.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/caps-lock.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/caps-locked.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/control.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
--------------------------------------------------------------------------------
/assets/icons/delete.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/drag.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/assets/icons/end.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/enter.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/escape.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/function.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/home.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/insert.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/left-click.svg:
--------------------------------------------------------------------------------
1 |
13 |
--------------------------------------------------------------------------------
/assets/icons/mac-meta.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/icons/meta.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/mouse.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/assets/icons/num-lock.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/num-locked.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/page-down.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/page-up.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/pause.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/print-screen.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/right-click.svg:
--------------------------------------------------------------------------------
1 |
13 |
--------------------------------------------------------------------------------
/assets/icons/scroll-lock.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/scroll-locked.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/scroll.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/assets/icons/shift.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/space.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/tab.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/img/align-bottom.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/assets/img/align-horizontally.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/assets/img/align-left.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/assets/img/align-right.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/assets/img/align-top.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/assets/img/align-vertically.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/assets/img/arrow-right.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/img/chevron-down.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/img/clipboard-tick.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/assets/img/clipboard.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/assets/img/cog-wheel.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/img/cross.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/img/discord-logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/img/edit.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/assets/img/error.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/assets/img/github-logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/img/grab.svg:
--------------------------------------------------------------------------------
1 |
17 |
--------------------------------------------------------------------------------
/assets/img/keyboard.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/assets/img/linked.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/assets/img/logo.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/assets/img/mail.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/img/monitor.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/assets/img/more.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/assets/img/mouse.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/assets/img/opencollective-logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/img/tray-off.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mulaRahul/keyviz/0452c3c060d2b6fe5706cc85f43c44992523ab4e/assets/img/tray-off.ico
--------------------------------------------------------------------------------
/assets/img/tray-off.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mulaRahul/keyviz/0452c3c060d2b6fe5706cc85f43c44992523ab4e/assets/img/tray-off.png
--------------------------------------------------------------------------------
/assets/img/tray-on.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mulaRahul/keyviz/0452c3c060d2b6fe5706cc85f43c44992523ab4e/assets/img/tray-on.ico
--------------------------------------------------------------------------------
/assets/img/tray-on.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mulaRahul/keyviz/0452c3c060d2b6fe5706cc85f43c44992523ab4e/assets/img/tray-on.png
--------------------------------------------------------------------------------
/assets/img/unlinked.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mulaRahul/keyviz/0452c3c060d2b6fe5706cc85f43c44992523ab4e/assets/logo.png
--------------------------------------------------------------------------------
/lib/app.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:provider/provider.dart';
3 |
4 | import 'config/theme.dart';
5 | import 'providers/key_event.dart';
6 | import 'providers/key_style.dart';
7 | import 'windows/error/error.dart';
8 | import 'windows/settings/settings.dart';
9 | import 'windows/key_visualizer/key_visualizer.dart';
10 | import 'windows/mouse_visualizer/mouse_visualizer.dart';
11 |
12 | class KeyvizApp extends StatelessWidget {
13 | const KeyvizApp({super.key});
14 |
15 | @override
16 | Widget build(BuildContext context) {
17 | return MaterialApp(
18 | title: "Keyviz",
19 | theme: lightTheme,
20 | darkTheme: darkTheme,
21 | themeMode: ThemeMode.system,
22 | home: GestureDetector(
23 | onTap: _removePrimaryFocus,
24 | child: MultiProvider(
25 | providers: [
26 | ChangeNotifierProvider(create: (_) => KeyEventProvider()),
27 | ChangeNotifierProvider(create: (_) => KeyStyleProvider()),
28 | ],
29 | child: const Material(
30 | type: MaterialType.transparency,
31 | child: Stack(
32 | fit: StackFit.expand,
33 | children: [
34 | ErrorView(),
35 | KeyVisualizer(),
36 | SettingsWindow(),
37 | MouseVisualizer(),
38 | ],
39 | ),
40 | ),
41 | ),
42 | ),
43 | );
44 | }
45 |
46 | _removePrimaryFocus() {
47 | FocusManager.instance.primaryFocus?.unfocus();
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/lib/config/assets.dart:
--------------------------------------------------------------------------------
1 | class VuesaxIcons {
2 | VuesaxIcons._();
3 |
4 | static const _dir = "assets/img";
5 |
6 | static const cogWheel = "$_dir/cog-wheel.svg";
7 | static const edit = "$_dir/edit.svg";
8 | static const monitor = "$_dir/monitor.svg";
9 | static const more = "$_dir/more.svg";
10 | static const mouse = "$_dir/mouse.svg";
11 | static const keyboard = "$_dir/keyboard.svg";
12 | static const cross = "$_dir/cross.svg";
13 | static const chevronDown = "$_dir/chevron-down.svg";
14 | static const alignTop = "$_dir/align-top.svg";
15 | static const alignVertically = "$_dir/align-vertically.svg";
16 | static const alignBottom = "$_dir/align-bottom.svg";
17 | static const alignLeft = "$_dir/align-left.svg";
18 | static const alignHorizontally = "$_dir/align-horizontally.svg";
19 | static const alignRight = "$_dir/align-right.svg";
20 | static const linked = "$_dir/linked.svg";
21 | static const unlinked = "$_dir/unlinked.svg";
22 | static const clipboard = "$_dir/clipboard.svg";
23 | static const clipboardTick = "$_dir/clipboard-tick.svg";
24 | static const arrowRight = "$_dir/arrow-right.svg";
25 | static const mail = "$_dir/mail.svg";
26 | static const error = "$_dir/error.svg";
27 | }
28 |
29 | class KeyIcons {
30 | KeyIcons._();
31 |
32 | static const _dir = "assets/icons";
33 | // modifiers
34 | static const control = "$_dir/control.svg";
35 | static const alt = "$_dir/alt.svg";
36 | static const shift = "$_dir/shift.svg";
37 | static const meta = "$_dir/meta.svg";
38 | // normals
39 | static const backspace = "$_dir/backspace.svg";
40 | static const enter = "$_dir/enter.svg";
41 | static const space = "$_dir/space.svg";
42 | static const tab = "$_dir/tab.svg";
43 | static const contextMenu = "$_dir/context-menu.svg";
44 | static const printScreen = "$_dir/print-screen.svg";
45 | static const pause = "$_dir/pause.svg";
46 | // navigations
47 | static const escape = "$_dir/escape.svg";
48 | static const insert = "$_dir/insert.svg";
49 | static const delete = "$_dir/delete.svg";
50 | static const home = "$_dir/home.svg";
51 | static const end = "$_dir/end.svg";
52 | static const pageUp = "$_dir/page-up.svg";
53 | static const pageDown = "$_dir/page-down.svg";
54 | // arrows
55 | static const arrowUp = "$_dir/arrow-up.svg";
56 | static const arrowDown = "$_dir/arrow-down.svg";
57 | static const arrowLeft = "$_dir/arrow-left.svg";
58 | static const arrowRight = "$_dir/arrow-right.svg";
59 | // locks
60 | static const capsLock = "$_dir/caps-lock.svg";
61 | static const capsLocked = "$_dir/caps-locked.svg";
62 | static const scrollLock = "$_dir/scroll-lock.svg";
63 | static const scrollLocked = "$_dir/scroll-locked.svg";
64 | static const numLock = "$_dir/num-lock.svg";
65 | static const numLocked = "$_dir/num-locked.svg";
66 | // mouse
67 | static const leftClick = "$_dir/left-click.svg";
68 | static const rightClick = "$_dir/right-click.svg";
69 | static const drag = "$_dir/drag.svg";
70 | static const scroll = "$_dir/scroll.svg";
71 |
72 | // platform
73 | static const macMeta = "$_dir/mac-meta.svg";
74 | }
75 |
--------------------------------------------------------------------------------
/lib/config/config.dart:
--------------------------------------------------------------------------------
1 | export 'assets.dart';
2 | export 'style.dart';
3 | export 'extensions.dart';
4 |
--------------------------------------------------------------------------------
/lib/config/extensions.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:provider/provider.dart';
3 |
4 | import 'package:keyviz/providers/key_event.dart';
5 | import 'package:keyviz/providers/key_style.dart';
6 |
7 | extension Cap on String {
8 | static const _space = " ";
9 |
10 | String capitalize() {
11 | if (contains(_space)) {
12 | final words = [];
13 | for (final word in split(_space)) {
14 | words.add(_capitalize(word));
15 | }
16 | return words.join(_space);
17 | } else {
18 | return _capitalize(this);
19 | }
20 | }
21 |
22 | String _capitalize(String txt) {
23 | return "${txt[0].toUpperCase()}${txt.substring(1).toLowerCase()}";
24 | }
25 | }
26 |
27 | extension Ease on BuildContext {
28 | ThemeData get theme => Theme.of(this);
29 | bool get isDark => theme.brightness == Brightness.dark;
30 | ColorScheme get colorScheme => theme.colorScheme;
31 | TextTheme get textTheme => theme.textTheme;
32 | KeyEventProvider get keyEvent => read();
33 | KeyStyleProvider get keyStyle => read();
34 | }
35 |
36 | extension HexColor on Color {
37 | /// String is in the format "aabbcc" or "ffaabbcc" with an optional leading "#".
38 | static Color fromHex(String hexString) {
39 | final buffer = StringBuffer();
40 | if (hexString.length == 6 || hexString.length == 7) buffer.write('ff');
41 | buffer.write(hexString.replaceFirst('#', ''));
42 | return Color(int.parse(buffer.toString(), radix: 16));
43 | }
44 |
45 | /// Prefixes a hash sign if [leadingHashSign] is set to `true` (default is `true`).
46 | String toHex({bool leadingHashSign = true}) => '${leadingHashSign ? '#' : ''}'
47 | // '${alpha.toRadixString(16).padLeft(2, '0')}'
48 | '${red.toRadixString(16).padLeft(2, '0').toUpperCase()}'
49 | '${green.toRadixString(16).padLeft(2, '0').toUpperCase()}'
50 | '${blue.toRadixString(16).padLeft(2, '0').toUpperCase()}';
51 | }
52 |
53 | extension HexCode on HSVColor {
54 | /// Prefixes a hash sign if [leadingHashSign] is set to `true` (default is `true`).
55 | String toHex({bool leadingHashSign = true}) {
56 | final rgb = toColor();
57 |
58 | return '${leadingHashSign ? '#' : ''}'
59 | // '${alpha.toRadixString(16).padLeft(2, '0')}'
60 | '${rgb.red.toRadixString(16).padLeft(2, '0').toUpperCase()}'
61 | '${rgb.green.toRadixString(16).padLeft(2, '0').toUpperCase()}'
62 | '${rgb.blue.toRadixString(16).padLeft(2, '0').toUpperCase()}';
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/lib/config/style.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | // size & spacing
4 | const double defaultPadding = 16;
5 | final BorderRadius defaultBorderRadius = BorderRadius.circular(defaultPadding);
6 |
7 | // motion & duration
8 | const shortDelay = Duration(milliseconds: 200);
9 | const transitionDuration = Duration(milliseconds: 200);
10 |
--------------------------------------------------------------------------------
/lib/domain/services/raw_keyboard_mouse.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/services.dart';
2 |
3 | // key id's for fake mouse events
4 | const leftClickId = 0x00900000011;
5 | const rightClickId = 0x00900000012;
6 | const dragId = 0x00900000013;
7 | const scrollId = 0x00900000014;
8 |
9 | // an implementation of [RawKeyEventData] which is used
10 | // to fake mouse events as keyboard events
11 | class RawKeyEventDataMouse extends RawKeyEventData {
12 | const RawKeyEventDataMouse(this.id);
13 |
14 | final int id;
15 |
16 | @override
17 | KeyboardSide? getModifierSide(ModifierKey key) {
18 | return null;
19 | }
20 |
21 | @override
22 | bool isModifierPressed(ModifierKey key,
23 | {KeyboardSide side = KeyboardSide.any}) {
24 | return false;
25 | }
26 |
27 | @override
28 | String get keyLabel {
29 | switch (id) {
30 | case leftClickId:
31 | return "Left Click";
32 |
33 | case rightClickId:
34 | return "Right Click";
35 |
36 | case dragId:
37 | return "Drag";
38 |
39 | case scrollId:
40 | return "Scroll";
41 | }
42 | return '';
43 | }
44 |
45 | @override
46 | LogicalKeyboardKey get logicalKey => LogicalKeyboardKey(id);
47 |
48 | @override
49 | PhysicalKeyboardKey get physicalKey => PhysicalKeyboardKey(id);
50 |
51 | // mouse left button down/up
52 | const RawKeyEventDataMouse.leftClick() : id = leftClickId;
53 |
54 | // mouse right button down/up
55 | const RawKeyEventDataMouse.rightClick() : id = rightClickId;
56 |
57 | // mouse left/right button down and mouse moving
58 | const RawKeyEventDataMouse.drag() : id = dragId;
59 |
60 | // mouse wheel event
61 | const RawKeyEventDataMouse.scroll() : id = scrollId;
62 | }
63 |
--------------------------------------------------------------------------------
/lib/domain/services/services.dart:
--------------------------------------------------------------------------------
1 | export 'key_maps.dart';
2 | export 'raw_keyboard_mouse.dart';
3 |
--------------------------------------------------------------------------------
/lib/domain/vault/json.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 | import 'dart:convert';
3 |
4 | import 'package:flutter/foundation.dart';
5 | import 'package:path_provider/path_provider.dart';
6 |
7 | Future _file(String filePath) async {
8 | // local appdata directory
9 | final Directory appDir = await getApplicationDocumentsDirectory();
10 | // json file
11 | return File("${appDir.path}/$filePath");
12 | }
13 |
14 | // load Map from a json file
15 | Future