# Home > **Relevant source files** > * [README.md](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/README.md) > * [src/io/github/samera2022/mouse_macros/UpdateInfo.java](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/src/io/github/samera2022/mouse_macros/UpdateInfo.java) ## Overview MouseMacros is a Java desktop application for recording and replaying mouse and keyboard input events. The application uses JNativeHook for global event capture and `java.awt.Robot` for input simulation. The codebase is located at [https://github.com/Samera2022/MouseMacros](https://github.com/Samera2022/MouseMacros). This wiki documents the application's architecture, component interactions, configuration system, and implementation details. For installation instructions, see [Getting Started](Getting-Started). For architectural details, see [Architecture Overview](Architecture-Overview). **Sources:** [README.md L1-L6](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/README.md#L1-L6) ## Core Functionality The application provides four primary operations: | Operation | Default Hotkey | Implementation | | --- | --- | --- | | **Record** | F2 | `MacroManager.startRecording()` captures mouse movements, button clicks (left/right/middle), scroll wheel events, and keyboard inputs via `GlobalMouseListener` | | **Stop Recording** | F3 | `MacroManager.stopRecording()` terminates event capture | | **Save/Load** | UI buttons | `MacroManager.saveToFile()` and `loadFromFile()` persist macros as CSV-formatted `.mmc` files | | **Playback** | F4 | `MacroManager.play()` executes recorded actions using `java.awt.Robot` | | **Abort** | F5 | `MacroManager.abort()` emergency stop for runaway macros | **System Requirements:** * Java Runtime Environment (JRE) 1.8+ * Configuration storage: `%USERPROFILE%/AppData/MouseMacros/` (Windows), `~/Library/Application Support/MouseMacros` (macOS), `~/.local/share/MouseMacros` (Linux) **Sources:** [README.md L25-L48](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/README.md#L25-L48), [src/io/github/samera2022/mouse_macros/manager/MacroManager.java L1-L300](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/src/io/github/samera2022/mouse_macros/manager/MacroManager.java#L1-L300) ## Key Features | Feature | Description | | --- | --- | | **Comprehensive Recording** | Captures all mouse buttons (left/right/middle), scroll wheel movements, and keyboard inputs | | **Global Hotkeys** | Customizable hotkeys for Start/Stop Recording, Play Macro, and Abort (emergency stop) | | **Multi-Language Support** | Built-in localization for English (US) and Simplified Chinese, with extensible architecture | | **Theme Engine** | Light and Dark modes with optional automatic synchronization with OS system settings | | **Persistence** | Macros saved as `.mmc` files in human-readable CSV format, allowing manual editing | | **Smart Memory** | Caches window sizes, last-used directories, and custom configurations across sessions | **Sources:** [README.md L23-L34](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/README.md#L23-L34) ## Application Entry Point The `MouseMacro` class contains the `main()` method and performs bootstrap operations: ```mermaid flowchart TD Main["MouseMacro.main"] GetConfigDir["ConfigManager.CONFIG_DIR"] LibsDir["new File(CONFIG_DIR, libs/)"] CreateDir["libsDir.mkdirs()"] SetProperty["System.setProperty(jnativehook.lib.path)"] InvokeLater["SwingUtilities.invokeLater()"] ShowFrame["MainFrame.MAIN_FRAME.setVisible(true)"] Main --> GetConfigDir GetConfigDir --> LibsDir LibsDir --> CreateDir CreateDir --> SetProperty SetProperty --> InvokeLater InvokeLater --> ShowFrame ``` **Bootstrap Sequence** The initialization sequence: 1. **Native Library Path Configuration**: Creates `CONFIG_DIR/libs/` directory and sets `jnativehook.lib.path` system property to this location for JNativeHook DLL/SO files 2. **EDT Thread Initialization**: Uses `SwingUtilities.invokeLater()` to initialize `MainFrame.MAIN_FRAME` on the Event Dispatch Thread **Sources:** [src/io/github/samera2022/mouse_macros/MouseMacro.java L1-L16](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/src/io/github/samera2022/mouse_macros/MouseMacro.java#L1-L16) ## System Architecture The codebase follows a layered architecture with separation between input capture, business logic, persistence, and UI: ```mermaid flowchart TD MouseMacro["MouseMacro.java
(main entry)"] ConfigManager["ConfigManager.java
(config.cfg)"] CacheManager["CacheManager.java
(cache.json)"] MacroManager["MacroManager.java
(record/playback)"] GlobalMouseListener["GlobalMouseListener.java
(JNativeHook events)"] MouseAction["MouseAction.java
(event data model)"] Config["Config.java"] Cache["Cache.java"] MainFrame["MainFrame.java"] SettingsDialog["SettingsDialog.java"] MacroSettingsDialog["MacroSettingsDialog.java"] ExitDialog["ExitDialog.java"] FileUtil["FileUtil.java"] ComponentUtil["ComponentUtil.java"] ScreenUtil["ScreenUtil.java"] Localizer["Localizer.java"] MouseMacro --> MainFrame MouseMacro --> ConfigManager MainFrame --> MacroManager MainFrame --> GlobalMouseListener GlobalMouseListener --> MacroManager MacroManager --> MouseAction MacroManager --> FileUtil ConfigManager --> Config ConfigManager --> FileUtil CacheManager --> Cache CacheManager --> FileUtil MainFrame --> ComponentUtil MainFrame --> Localizer subgraph util/ ["util/"] FileUtil ComponentUtil ScreenUtil Localizer end subgraph ui/ ["ui/"] MainFrame SettingsDialog MacroSettingsDialog ExitDialog MainFrame --> SettingsDialog MainFrame --> MacroSettingsDialog end subgraph data/ ["data/"] MouseAction Config Cache end subgraph listener/ ["listener/"] GlobalMouseListener end subgraph manager/ ["manager/"] ConfigManager CacheManager MacroManager end subgraph src/io/github/samera2022/mouse_macros/ ["src/io/github/samera2022/mouse_macros/"] MouseMacro end ``` **Package Structure** | Package | Purpose | Key Classes | | --- | --- | --- | | `manager/` | State and configuration management | `MacroManager`, `ConfigManager`, `CacheManager` | | `listener/` | Global input event capture | `GlobalMouseListener` | | `data/` | Data models | `MouseAction`, `Config`, `Cache` | | `ui/` | Swing UI components | `MainFrame`, `SettingsDialog`, `MacroSettingsDialog` | | `util/` | Cross-cutting utilities | `FileUtil`, `ComponentUtil`, `ScreenUtil`, `Localizer` | | `constants/` | Static configuration | `ColorConsts`, `KeyConsts` | **Sources:** [src/io/github/samera2022/mouse_macros/MouseMacro.java L1-L16](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/src/io/github/samera2022/mouse_macros/MouseMacro.java#L1-L16), [src/io/github/samera2022/mouse_macros/manager/MacroManager.java L1-L50](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/src/io/github/samera2022/mouse_macros/manager/MacroManager.java#L1-L50), [src/io/github/samera2022/mouse_macros/listener/GlobalMouseListener.java L1-L50](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/src/io/github/samera2022/mouse_macros/listener/GlobalMouseListener.java#L1-L50) ## Recording and Playback Flow The recording and playback system uses the following execution flow: ```mermaid sequenceDiagram participant User participant MainFrame participant GlobalMouseListener participant JNativeHook participant MacroManager participant MouseAction participant Robot participant FileSystem note over User,FileSystem: Recording Phase User->>MainFrame: Press F2 MainFrame->>MacroManager: startRecording() MacroManager->>MacroManager: recording = true User->>JNativeHook: actions.clear() JNativeHook->>GlobalMouseListener: Mouse/keyboard event GlobalMouseListener->>MacroManager: nativeMousePressed() MacroManager->>MouseAction: nativeMouseMoved() MacroManager->>MacroManager: nativeKeyPressed() User->>MainFrame: recordAction() MainFrame->>MacroManager: new MouseAction(x,y,type,button,delay) MacroManager->>MacroManager: actions.add(mouseAction) note over User,FileSystem: Save Phase User->>MainFrame: Press F3 MainFrame->>MacroManager: stopRecording() MacroManager->>FileSystem: recording = false note over User,FileSystem: Playback Phase User->>MainFrame: Click "Save Macro" MainFrame->>MacroManager: saveToFile() MacroManager->>FileSystem: Write CSV to .mmc file FileSystem->>MacroManager: Click "Load Macro" User->>MainFrame: loadFromFile() MainFrame->>MacroManager: Read CSV from .mmc file loop [For each action] MacroManager->>MouseAction: List MouseAction->>Robot: Press F4 MouseAction->>MouseAction: play() end ``` **Event Flow Mapping** | Phase | User Action | Code Path | Result | | --- | --- | --- | --- | | **Record Start** | F2 hotkey | `MainFrame` → `MacroManager.startRecording()` | Sets `recording = true`, clears `actions` list | | **Event Capture** | Mouse/keyboard input | `JNativeHook` → `GlobalMouseListener.nativeXXX()` → `MacroManager.recordAction()` | Creates `MouseAction` objects, adds to `actions` list | | **Record Stop** | F3 hotkey | `MainFrame` → `MacroManager.stopRecording()` | Sets `recording = false` | | **Save** | Save button | `MainFrame` → `MacroManager.saveToFile()` | Writes `actions` to CSV `.mmc` file | | **Load** | Load button | `MainFrame` → `MacroManager.loadFromFile()` | Reads CSV file, populates `actions` list | | **Playback** | F4 hotkey | `MainFrame` → `MacroManager.play()` → `MouseAction.execute()` | Iterates `actions`, calls `Robot` methods | **Sources:** [src/io/github/samera2022/mouse_macros/manager/MacroManager.java L1-L300](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/src/io/github/samera2022/mouse_macros/manager/MacroManager.java#L1-L300), [src/io/github/samera2022/mouse_macros/listener/GlobalMouseListener.java L1-L200](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/src/io/github/samera2022/mouse_macros/listener/GlobalMouseListener.java#L1-L200), [src/io/github/samera2022/mouse_macros/data/MouseAction.java L1-L150](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/src/io/github/samera2022/mouse_macros/data/MouseAction.java#L1-L150) ## Data Persistence The application uses multiple persistence mechanisms: | File | Manager Class | Purpose | Format | Location | | --- | --- | --- | --- | --- | | `config.cfg` | `ConfigManager` | User preferences (language, theme, hotkeys, storage paths) | JSON | `ConfigManager.CONFIG_DIR` | | `cache.json` | `CacheManager` | Session state (window sizes, recent directories, exit behavior) | JSON | `ConfigManager.CONFIG_DIR` | | `*.mmc` | `MacroManager` | Recorded macro data | CSV (8 fields) | User-specified | | `lang/*.json` | `Localizer` | Translation strings | JSON | Classpath resources | **File Location Resolution:** * Windows: `%LOCALAPPDATA%/MouseMacros/` * macOS: `~/Library/Application Support/MouseMacros/` * Linux: `~/.local/share/MouseMacros/` Implemented in `FileUtil.getLocalStoragePath()`. ### Configuration Settings The `Config` class (managed by `ConfigManager`) stores the following fields: | Field | Type | Default | Description | | --- | --- | --- | --- | | `followSystemSettings` | boolean | true | Sync language/theme with OS | | `lang` | String | OS locale | Language code (`en_us`, `zh_cn`, `ja_jp`, etc.) | | `enableDarkMode` | boolean | false | Dark theme toggle | | `enableDefaultStorage` | boolean | false | Use `defaultMmcStoragePath` for all file operations | | `defaultMmcStoragePath` | String | User documents | Default directory for `.mmc` files | | `enableQuickMode` | boolean | false | Ignore delays during playback | | `enableCustomMacroSettings` | boolean | false | Enable `repeatTime` and `repeatDelay` | | `repeatTime` | int | 1 | Playback iteration count | | `repeatDelay` | double | 0.0 | Delay between iterations (seconds) | | `allowLongStr` | boolean | false | Tooltip display mode | | `readjustFrameMode` | String | "MIXED" | Window resizing strategy (`MIXED`, `STANDARDIZED`, `MEMORIZED`) | | `keyMap` | Map | F2-F5 | Hotkey bindings (record, stop, play, abort) | **Sources:** [README.md L62-L90](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/README.md#L62-L90), [src/io/github/samera2022/mouse_macros/manager/ConfigManager.java L1-L200](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/src/io/github/samera2022/mouse_macros/manager/ConfigManager.java#L1-L200), [src/io/github/samera2022/mouse_macros/data/Config.java L1-L100](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/src/io/github/samera2022/mouse_macros/data/Config.java#L1-L100) ## Technology Stack | Component | Technology | Location in Code | | --- | --- | --- | | **Language** | Java 1.8+ | Entire codebase | | **UI Framework** | Swing | `ui/` package | | **Global Hooks** | JNativeHook | Native library in `CONFIG_DIR/libs/`, interfaced via `GlobalMouseListener` | | **Input Simulation** | `java.awt.Robot` | `MouseAction.execute()` | | **Configuration Format** | JSON | Parsed in `ConfigManager` and `CacheManager` using `com.google.gson` | | **Macro Format** | CSV | Parsed in `MacroManager.loadFromFile()` | | **Localization** | JSON | Loaded by `Localizer` from `src/lang/*.json` | | **System Tray** | `java.awt.SystemTray` | `MainFrame` system tray integration | **External Dependencies:** * `jnativehook-2.1.0.jar` - Global keyboard/mouse event capture * `gson-2.8.x.jar` - JSON serialization/deserialization **Sources:** [README.md L10-L12](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/README.md#L10-L12), [src/io/github/samera2022/mouse_macros/MouseMacro.java L1-L16](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/src/io/github/samera2022/mouse_macros/MouseMacro.java#L1-L16), [src/io/github/samera2022/mouse_macros/manager/ConfigManager.java L1-L50](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/src/io/github/samera2022/mouse_macros/manager/ConfigManager.java#L1-L50) ## Basic Usage **Typical Workflow:** 1. Launch `MouseMacros.jar` (Java 1.8+) or `MouseMacros.exe` (bundled JRE) 2. Press **F2** → `MainFrame` calls `MacroManager.startRecording()` 3. Perform mouse/keyboard actions → `GlobalMouseListener` captures events 4. Press **F3** → `MainFrame` calls `MacroManager.stopRecording()` 5. Click **Save Macro** → `MacroManager.saveToFile()` writes CSV to `.mmc` file 6. Click **Load Macro** → `MacroManager.loadFromFile()` reads `.mmc` file 7. Press **F4** → `MacroManager.play()` executes actions via `Robot` For installation details, see [Getting Started](Getting-Started). For configuration options, see [Configuration System](Configuration-and-Persistence). **Sources:** [README.md L38-L62](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/README.md#L38-L62) ## Documentation Structure | Section | Coverage | | --- | --- | | **[Getting Started](Getting-Started)** | Installation, JRE requirements, first-time setup | | **[Architecture Overview](Architecture-Overview)** | Component design, data flow, package structure | | **[Macro Recording and Playback](Macro-Recording-and-Playback)** | `MacroManager`, `GlobalMouseListener`, `MouseAction`, `.mmc` format | | **[Configuration and Persistence](Configuration-and-Persistence)** | `ConfigManager`, `CacheManager`, `config.cfg`, `cache.json` | | **[Internationalization and Localization](Internationalization-and-Localization)** | `Localizer`, language files, supported locales | | **[User Interface Components](User-Interface-Components)** | `MainFrame`, dialogs, theming system, `ComponentUtil` | | **[Utility Classes](System-Integration-Utilities)** | `FileUtil`, `ScreenUtil`, `SystemUtil`, logging | | **[Constants and Resources](Custom-UI-Components)** | `ColorConsts`, `KeyConsts`, static resources | | **[Version History](Version-History-and-Updates)** | `UpdateInfo` enum, release notes, changelog | **Sources:** [README.md L1-L106](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/README.md#L1-L106) ## License MouseMacros is licensed under the **GNU General Public License v3.0** (GPL-3.0). This is a copyleft license that requires derivative works to also be open source under compatible terms. For complete license text, see [License and Legal](#11). **Sources:** [LICENSE L1-L675](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/LICENSE#L1-L675), [README.md L93-L94](https://github.com/Samera2022/MouseMacros/blob/1eb6620b/README.md#L93-L94)