Files
GridSnap/TODO.md
Keith Smith ee2f4792ac Refactor _removeLastZone to avoid recreating entire editor
Simplified the _removeLastZone() function to be more efficient:

Before:
- Removed last zone from array
- Destroyed and recreated entire editor interface (_cancelEditor + startEditor)
- Recreated all remaining zones from scratch
- Caused visual flicker and was inefficient
- Could leave dangling event listeners

After:
- Remove last zone from zones array
- Remove and destroy only the last zone actor
- No need to update zone numbers (removing last zone doesn't affect other numbers)
- No editor recreation needed

Benefits:
- No visual flicker
- Much more efficient (O(1) instead of O(n))
- Cleaner code (15 lines vs 50+ lines)
- No risk of dangling event listeners from recreation
- Better user experience

Fixes TODO item #2.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-15 21:34:36 -07:00

160 lines
5.9 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 ✅ COMPLETED
**Priority: Medium**
- [x] `_removeLastZone()` destroys and recreates entire editor interface
- [x] Causes visual flicker
- [x] Inefficient approach
- [x] Could leave dangling event listeners
- [x] 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
### 15. Show Zone Dimensions in Editor ✅ COMPLETED
**Priority: Medium**
- [x] Display zone dimensions while drawing in graphical editor
- [x] Show width and height in pixels and/or percentage
- [x] Update dimensions in real-time as zone is resized
- [x] Display position coordinates (x, y)
- [x] Show dimensions near cursor or inside zone preview
### 16. Move/Reposition Zones in Editor ✅ COMPLETED
**Priority: Medium**
- [x] Allow clicking and dragging existing zones to move them
- [x] Visual feedback when zone is selected for moving (yellow highlight)
- [x] Prevent moving zones outside monitor bounds
- [x] Update zone coordinates as zone is moved
- [x] Maintain zone size while moving (only change position)
- [ ] Snap to grid or guides (future enhancement)
### 17. Resize Zones in Editor ✅ COMPLETED
**Priority: High**
- [x] Detect mouse near edges and corners of zones (10px threshold)
- [x] Allow dragging edges to resize zones horizontally or vertically
- [x] Allow dragging corners to resize zones diagonally
- [x] Visual feedback when zone is being resized (cyan highlight)
- [x] Show dimension label during resize with real-time updates
- [x] Enforce minimum zone size (20x20 pixels)
- [x] Constrain resize to monitor bounds
- [x] Update zone data structure in real-time during resize
- [x] Support all 8 resize handles (N, S, E, W, NE, NW, SE, SW)
## 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 ✅ COMPLETED
**Priority: Medium**
- [x] Add Cinnamon settings panel for the extension
- [x] Toggle features on/off (shift-drag, keyboard snap)
- [x] Manage saved layouts (view, delete, export)
- [x] Customize zone appearance (colors, border width, opacity)
- [x] Configure zone number visibility
- [x] Enable/disable snap notifications
- [ ] Allow customization of keybindings (future enhancement)
- [ ] Configure animation speeds (when animations added)
## Documentation
### 13. Update Metadata ✅ COMPLETED
**Priority: Low**
- [x] Add "url" property to metadata.json
- [x] Update author name to "Keith Smith"
- [x] 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)