Files
GridSnap/TODO.md
Keith Smith 5cef19690a Implement zone dimension display and zone repositioning in editor
Feature #15 - Show Zone Dimensions:
- Display real-time dimensions while drawing zones
- Show width x height in both pixels and percentages
- Display position coordinates (x, y)
- Dimension label follows cursor with 15px offset
- Label positioned to stay within monitor bounds
- Automatically cleaned up when zone drawing completes

Feature #16 - Move/Reposition Zones:
- Click on existing zones to select and move them
- Yellow highlight when zone is being moved (vs green for new zones)
- Drag zones to new positions while maintaining size
- Constrain movement to monitor bounds (can't move outside screen)
- Real-time update of zone coordinates in data structure
- Green color restored after move completes

Editor Improvements:
- Added zoneActors array to track zone widgets for moving
- Updated instruction label to mention zone moving
- Enhanced _findZoneAtPosition() helper to detect clicks on zones
- Improved _removeLastZone() to properly clean up zone actors
- Better cleanup in _cancelEditor() to prevent memory leaks
- Track moving state (isMovingZone, movingZoneIndex, moveOffsetX/Y)

UX Enhancements:
- Separate visual feedback for creating (green) vs moving (yellow) zones
- Smooth drag experience with proper offset tracking
- Dimensions update in real-time during zone creation
- Clear visual distinction between zone operations

Fixes TODO items #15 and #16

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

5.3 KiB

GridSnap TODO List

Critical Issues

1. Custom Layout Persistence COMPLETED

Priority: High

  • Custom layouts are only stored in memory
  • Layouts are lost when extension reloads or Cinnamon restarts
  • Need to implement file-based storage
  • Location: ~/.local/share/gridsnap/layouts.json
  • Save layouts when created in graphical editor
  • 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

15. Show Zone Dimensions in Editor COMPLETED

Priority: Medium

  • Display zone dimensions while drawing in graphical editor
  • Show width and height in pixels and/or percentage
  • Update dimensions in real-time as zone is resized
  • Display position coordinates (x, y)
  • Show dimensions near cursor or inside zone preview

16. Move/Reposition Zones in Editor COMPLETED

Priority: Medium

  • Allow clicking and dragging existing zones to move them
  • Visual feedback when zone is selected for moving (yellow highlight)
  • Prevent moving zones outside monitor bounds
  • Update zone coordinates as zone is moved
  • Maintain zone size while moving (only change position)
  • Snap to grid or guides (future enhancement)

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

  • Add Cinnamon settings panel for the extension
  • Toggle features on/off (shift-drag, keyboard snap)
  • Manage saved layouts (view, delete, export)
  • Customize zone appearance (colors, border width, opacity)
  • Configure zone number visibility
  • Enable/disable snap notifications
  • Allow customization of keybindings (future enhancement)
  • Configure animation speeds (when animations added)

Documentation

13. Update Metadata COMPLETED

Priority: Low

  • Add "url" property to metadata.json
  • Update author 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

  • Keybinding closure bug (all zones mapped to zone 9)
  • Keybinding conflicts with panel app launcher (changed to Super+Ctrl+1-9)
  • Shift-drag detection (implemented modifier polling)
  • Window object reference (use global.display.focus_window)
  • Window API compatibility (property checks vs get_maximized())
  • Signal handler parameters (grab-op-begin/end)
  • Laptop keyboard support (removed numpad dependency)