macOS Input Monitor
A comprehensive native Node.js addon for monitoring trackpad gestures, mouse events, and keyboard input on macOS. Perfect for Electron applications that need to capture global input events.
Features
- 🎯 Trackpad Gestures: Swipe, pinch, rotate with finger count detection
- 🖱️ Mouse Events: Click, move, drag, scroll with button detection
- ⌨️ Keyboard Events: Key press/release, modifier keys, repeat detection
- 🔒 Separate Event Emitters: Individual callbacks for different event types
- 🚀 High Performance: Native C++/Objective-C implementation
- 📱 Electron Ready: Easy integration with Electron applications
- 🎛️ Configurable: Enable/disable specific event types
- 🔐 Security: Proper accessibility permission handling
Requirements
- macOS 10.15 or later
- Node.js 12.0.0 or later
- Accessibility permissions granted
Installation
npm install macos-input-monitor
Quick Start
const { inputMonitor } = require('macos-input-monitor');
if (!inputMonitor.checkAccess()) {
inputMonitor.requestAccess();
}
inputMonitor.on('gesture', (data) => {
console.log(`Gesture: ${data.type} ${data.direction}`);
});
inputMonitor.on('mousedown', (data) => {
console.log(`Mouse down: ${data.button} at (${data.x}, ${data.y})`);
});
inputMonitor.on('keydown', (data) => {
console.log(`Key pressed: ${data.key}`);
});
inputMonitor.start();
process.on('SIGINT', () => {
inputMonitor.stop();
process.exit(0);
});
API Reference
Main Functions
start(options?)
Start monitoring input events.
inputMonitor.start({
enableGestures: true,
enableMouse: true,
enableKeyboard: true
});
stop()
Stop monitoring input events.
checkAccess()
Check if accessibility permissions are granted.
requestAccess()
Request accessibility permissions (shows system dialog).
Events
Gesture Events
inputMonitor.on('gesture', (data) => {
});
Mouse Events
inputMonitor.on('mousedown', (data) => {
});
inputMonitor.on('mouseup', (data) => {
});
inputMonitor.on('mousemove', (data) => {
});
inputMonitor.on('scroll', (data) => {
});
Keyboard Events
inputMonitor.on('keydown', (data) => {
});
inputMonitor.on('keyup', (data) => {
});
inputMonitor.on('modifier', (data) => {
});
Class Usage
const { MacOSInputMonitor } = require('macos-input-monitor');
const monitor = new MacOSInputMonitor();
monitor.on('gesture', handleGesture);
monitor.start();
Electron Integration
const { app, BrowserWindow } = require('electron');
const { inputMonitor } = require('macos-input-monitor');
app.whenReady().then(() => {
if (!inputMonitor.checkAccess()) {
inputMonitor.requestAccess();
return;
}
inputMonitor.on('gesture', (data) => {
if (data.type === 'swipe' && data.direction === 'left') {
BrowserWindow.getFocusedWindow()?.webContents.goBack();
}
});
inputMonitor.start({ enableGestures: true });
});
app.on('before-quit', () => {
inputMonitor.stop();
});
Error Handling
try {
inputMonitor.start();
} catch (error) {
if (error.message.includes('Accessibility permissions')) {
console.log('Please grant accessibility permissions');
inputMonitor.requestAccess();
} else if (error.message.includes('already active')) {
console.log('Monitoring is already running');
}
}
Building from Source
npm install
npm run build
npm test
Troubleshooting
Accessibility Permissions
- Go to System Preferences > Security & Privacy > Privacy
- Select Accessibility from the left sidebar
- Click the lock icon and enter your password
- Add your application to the list or check the existing entry
Common Issues
- "Failed to load native addon": Run
npm run build
to compile the native module
- "Accessibility permissions not granted": Follow the permissions setup above
- "This package only works on macOS": This package is macOS-specific
Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests for new functionality
- Submit a pull request
License
MIT License - see LICENSE file for details.
Changelog
1.0.0
- Initial release
- Trackpad gesture support (swipe, pinch, rotate)
- Mouse event monitoring (click, move, scroll)
- Keyboard event capture
- Separate event emitters for different input types
- TypeScript definitions included