Features: - Custom layouts now saved to ~/.local/share/gridsnap/layouts.json - Layouts automatically loaded on extension initialization - Layouts persist across Cinnamon restarts and extension reloads - Only custom layouts saved to file (default layouts remain in code) - Added GLib and Gio imports for file operations - Error handling for file read/write operations Technical implementation: - _loadLayouts(): Merges default layouts with saved custom layouts on startup - _saveLayouts(): Extracts and saves only custom-* layouts to JSON file - Automatically creates storage directory if it doesn't exist - Called when user saves a layout in the graphical editor Fixes TODO item #1 - Custom Layout Persistence Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
128 lines
4.4 KiB
Markdown
128 lines
4.4 KiB
Markdown
# GridSnap TODO List
|
|
|
|
## Critical Issues
|
|
|
|
### 1. Custom Layout Persistence ✅ COMPLETED
|
|
**Priority: High**
|
|
- [x] Custom layouts are only stored in memory
|
|
- [x] Layouts are lost when extension reloads or Cinnamon restarts
|
|
- [x] Need to implement file-based storage
|
|
- [x] Location: `~/.local/share/gridsnap/layouts.json`
|
|
- [x] Save layouts when created in graphical editor
|
|
- [x] Load layouts on extension initialization
|
|
|
|
### 2. Remove Last Zone Implementation (extension.js:236-274)
|
|
**Priority: Medium**
|
|
- [ ] `_removeLastZone()` destroys and recreates entire editor interface
|
|
- [ ] Causes visual flicker
|
|
- [ ] Inefficient approach
|
|
- [ ] Could leave dangling event listeners
|
|
- [ ] Refactor to only remove the last zone widget without recreating everything
|
|
|
|
## Functionality Improvements
|
|
|
|
### 3. Multi-Monitor Support
|
|
**Priority: High**
|
|
- [ ] Currently only works on primary monitor (extension.js:61)
|
|
- [ ] Need per-monitor zone configurations
|
|
- [ ] Detect which monitor window is on when snapping
|
|
- [ ] Allow zone editor to work on any monitor
|
|
- [ ] Store zone layouts per monitor
|
|
|
|
### 4. High-DPI Display Support
|
|
**Priority: Medium**
|
|
- [ ] Coordinates from `get_coords()` may not respect window scaling
|
|
- [ ] Test on high-DPI displays
|
|
- [ ] Verify zone calculations work correctly with display scaling
|
|
- [ ] May need to use `get_resource_scale()` or similar
|
|
|
|
### 5. Edit Existing Custom Layouts
|
|
**Priority: Medium**
|
|
- [ ] Currently can only create new layouts in editor
|
|
- [ ] Add ability to select and edit existing custom layouts
|
|
- [ ] Add UI to choose which layout to edit
|
|
- [ ] Pre-populate editor with existing zones when editing
|
|
|
|
## Code Quality & Robustness
|
|
|
|
### 6. Comprehensive Error Handling
|
|
**Priority: Medium**
|
|
- [ ] Add validation of zone sizes during window snapping
|
|
- [ ] Add checks for `window.move_resize_frame()` success
|
|
- [ ] Validate monitor dimensions before calculations
|
|
- [ ] Handle edge cases (window too small, zone too small, etc.)
|
|
- [ ] Add user notifications for errors instead of silent failures
|
|
|
|
### 7. Event Leak Prevention
|
|
**Priority: Low**
|
|
- [ ] Zone preview widgets might not be properly destroyed if motion events stop unexpectedly
|
|
- [ ] Audit all signal connections and ensure disconnect in cleanup
|
|
- [ ] Add defensive cleanup in edge cases
|
|
- [ ] Review overlay widget lifecycle
|
|
|
|
### 8. Zone Overlap Detection
|
|
**Priority: Low**
|
|
- [ ] Warn user if zones overlap in graphical editor
|
|
- [ ] Provide visual feedback for overlapping zones
|
|
- [ ] Optionally prevent overlaps or auto-adjust
|
|
|
|
## Features from README (Planned)
|
|
|
|
### 9. Zone Layout Import/Export
|
|
**Priority: Low**
|
|
- [ ] Allow exporting custom layouts to JSON files
|
|
- [ ] Import layouts from JSON files
|
|
- [ ] Share layouts between systems
|
|
- [ ] Backup/restore functionality
|
|
|
|
### 10. More Pre-configured Layouts
|
|
**Priority: Low**
|
|
- [ ] Add more default layout options
|
|
- [ ] Common patterns: ultrawide monitor layouts, vertical splits
|
|
- [ ] 1/3 - 2/3 layouts
|
|
- [ ] Picture-in-picture style layouts
|
|
|
|
### 11. Animation Effects
|
|
**Priority: Low**
|
|
- [ ] Add smooth transitions when snapping windows
|
|
- [ ] Animate zone overlay appearance/disappearance
|
|
- [ ] Visual feedback when window snaps to zone
|
|
|
|
### 12. Settings Panel
|
|
**Priority: Medium**
|
|
- [ ] Add Cinnamon settings panel for the extension
|
|
- [ ] Allow customization of keybindings
|
|
- [ ] Configure animation speeds
|
|
- [ ] Toggle features on/off
|
|
- [ ] Manage saved layouts (delete, rename, reorder)
|
|
|
|
## Documentation
|
|
|
|
### 13. Update Metadata
|
|
**Priority: Low**
|
|
- [ ] Add "url" property to metadata.json (currently shows warning)
|
|
- [ ] Update author name from "Your Name" to "Keith Smith"
|
|
- [ ] Add project URL/repository link
|
|
|
|
## Testing
|
|
|
|
### 14. Test Coverage
|
|
**Priority: Low**
|
|
- [ ] Test on different Cinnamon versions (5.0, 5.2, 5.4, 5.6, 6.0)
|
|
- [ ] Test with different window types (maximized, minimized, dialog boxes)
|
|
- [ ] Test edge cases (dragging between monitors, rapid key presses)
|
|
- [ ] Test with different keyboard layouts
|
|
- [ ] Verify memory leaks don't occur with repeated enable/disable
|
|
|
|
---
|
|
|
|
## Recently Fixed ✅
|
|
|
|
- [x] Keybinding closure bug (all zones mapped to zone 9)
|
|
- [x] Keybinding conflicts with panel app launcher (changed to Super+Ctrl+1-9)
|
|
- [x] Shift-drag detection (implemented modifier polling)
|
|
- [x] Window object reference (use global.display.focus_window)
|
|
- [x] Window API compatibility (property checks vs get_maximized())
|
|
- [x] Signal handler parameters (grab-op-begin/end)
|
|
- [x] Laptop keyboard support (removed numpad dependency)
|