Files
GridSnap/README.md
Keith Smith 3d79b0336a Fix critical bugs and improve laptop compatibility
Major fixes:
- Fix keybinding closure bug causing all zones to map to zone 9
- Change keybindings from Super+Numpad to Super+Ctrl+1-9 for laptop compatibility
- Fix shift-drag detection by implementing continuous modifier polling during window drag
- Fix window object reference by using global.display.focus_window
- Fix window API compatibility (use property checks instead of get_maximized())
- Correct grab-op-begin/end signal handler parameters

Technical improvements:
- Add modifier polling (50ms interval) during window drag to detect Shift key press/release
- Use Mainloop.idle_add to defer window resize operations
- Remove debug logging for production use
- Improve error handling and cleanup in destroy() method

The extension now fully supports:
- Shift-drag window snapping with visual zone overlay
- Keyboard shortcuts for direct zone snapping (Super+Ctrl+1-9)
- Zone overlay toggle (Super+Z)
- Layout cycling (Super+Shift+Z)
- Graphical zone editor (Super+Shift+E)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-15 19:50:23 -07:00

158 lines
4.5 KiB
Markdown

# GridSnap for Cinnamon Desktop
A window tiling manager extension for Linux Mint's Cinnamon Desktop, inspired by Microsoft PowerToys FancyZones.
## Features
- **Multiple Zone Layouts**: Pre-configured layouts including 2x2 grid, 3 columns, and focus layouts
- **Graphical Zone Editor**: Draw custom zones visually with your mouse - no code editing required!
- **Visual Overlay**: See your zones while dragging windows (hold Shift)
- **Keyboard Shortcuts**: Quick snap to zones using hotkeys
- **Layout Cycling**: Switch between different zone layouts on the fly
## Installation
1. Copy the extension folder to your Cinnamon extensions directory:
```bash
cp -r gridsnap-cinnamon ~/.local/share/cinnamon/extensions/gridsnap@cinnamon-extension
```
2. Restart Cinnamon (Alt+F2, type 'r', press Enter) or log out and back in
3. Enable the extension:
- Open System Settings → Extensions
- Find "GridSnap"
- Toggle it on
## Usage
### Keyboard Shortcuts
- **Super + Z**: Toggle zone overlay (show/hide zones)
- **Super + Shift + Z**: Cycle through different layouts
- **Super + Shift + E**: Open graphical zone editor
- **Super + Ctrl + 1-9**: Snap focused window to zone 1-9
### Mouse Usage
1. Hold **Shift** while dragging a window to see the zone overlay
2. Drop the window over a zone to snap it there
3. Release Shift or move outside zones to cancel
### Graphical Zone Editor
Create custom layouts visually by drawing zones with your mouse:
1. Press **Super + Shift + E** to open the zone editor
2. **Click and drag** to draw rectangular zones
3. Draw as many zones as you need
4. **Ctrl + S** to save your custom layout
5. **Ctrl + C** or **Escape** to cancel
6. **Delete/Backspace** to remove the last zone
Your custom layout will be added to the layout rotation and can be accessed with Super + Shift + Z.
## Available Layouts
1. **2x2 Grid**: Four equal quadrants
2. **3 Columns**: Three equal vertical columns
3. **Focus Left**: Large left area with two smaller right zones
## Customization
### Easy Way: Use the Graphical Editor
1. Press **Super + Shift + E** to open the zone editor
2. Draw zones by clicking and dragging
3. Press **Ctrl + S** to save your custom layout
4. Your layout is immediately available in the layout rotation!
### Advanced Way: Edit the Code
To add your own layouts manually, edit the `DEFAULT_LAYOUTS` object in `extension.js`:
```javascript
const DEFAULT_LAYOUTS = {
'custom-layout': {
name: 'My Custom Layout',
zones: [
{ x: 0, y: 0, width: 0.5, height: 1 }, // Left half
{ x: 0.5, y: 0, width: 0.5, height: 1 } // Right half
]
}
};
```
Zone coordinates are relative (0.0 to 1.0):
- `x`: Horizontal position (0 = left edge, 1 = right edge)
- `y`: Vertical position (0 = top edge, 1 = bottom edge)
- `width`: Zone width as fraction of screen width
- `height`: Zone height as fraction of screen height
## Troubleshooting
### Extension won't load
- Check the Looking Glass console (Alt+F2, type 'lg', press Enter) for errors
- Ensure the UUID in metadata.json matches the folder name
### Overlay doesn't show
- Make sure no other extensions conflict with window management
- Try disabling and re-enabling the extension
### Keybindings don't work
- Check System Settings → Keyboard → Shortcuts for conflicts
- Ensure the extension is enabled
## Development
### File Structure
```
gridsnap@cinnamon-extension/
├── metadata.json # Extension metadata
├── extension.js # Main extension code
├── stylesheet.css # Visual styling
└── README.md # This file
```
### Testing Changes
After editing:
1. Reload Cinnamon: Alt+F2 → 'r' → Enter
2. Or use Looking Glass: Alt+F2 → 'lg' → Enter
### Debug Logging
Add logging in extension.js:
```javascript
global.log('GridSnap: Your message here');
```
View logs with:
```bash
tail -f ~/.cinnamon/glass.log
```
## Future Enhancements
- [x] Custom layout editor GUI
- [ ] Per-monitor zone configurations
- [ ] Save custom layouts permanently to file
- [ ] Edit existing custom layouts in the graphical editor
- [ ] Zone layout import/export
- [ ] More pre-configured layouts
- [ ] Animation effects
- [ ] Settings panel for keybinding customization
## Contributing
Feel free to fork and submit pull requests! Areas that could use help:
- Additional layout presets
- UI improvements for the overlay
- Settings GUI implementation
- Multi-monitor support improvements
## License
MIT License - Feel free to use and modify as needed.
## Credits
Inspired by Microsoft PowerToys FancyZones for Windows.