1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2025-12-05 21:15:38 -05:00

colorpicker: hide magnfier on monitor leave

This commit is contained in:
bbedward
2025-12-04 09:12:21 -05:00
parent e1acaaa27c
commit a41487eb8f
2 changed files with 47 additions and 3 deletions

View File

@@ -41,6 +41,7 @@ type LayerSurface struct {
wlPool *client.ShmPool wlPool *client.ShmPool
wlBuffer *client.Buffer wlBuffer *client.Buffer
configured bool configured bool
hidden bool
} }
type Picker struct { type Picker struct {
@@ -503,7 +504,13 @@ func (p *Picker) captureForSurface(ls *LayerSurface) {
} }
func (p *Picker) redrawSurface(ls *LayerSurface) { func (p *Picker) redrawSurface(ls *LayerSurface) {
renderBuf := ls.state.Redraw() var renderBuf *ShmBuffer
if ls.hidden {
// When hidden, just show the screenshot without overlay
renderBuf = ls.state.RedrawScreenOnly()
} else {
renderBuf = ls.state.Redraw()
}
if renderBuf == nil { if renderBuf == nil {
return return
} }
@@ -571,6 +578,15 @@ func (p *Picker) redrawSurface(ls *LayerSurface) {
ls.state.SwapBuffers() ls.state.SwapBuffers()
} }
func (p *Picker) hideSurface(ls *LayerSurface) {
if ls == nil || ls.wlSurface == nil || ls.hidden {
return
}
ls.hidden = true
// Redraw without the crosshair overlay
p.redrawSurface(ls)
}
func (p *Picker) setupInput() { func (p *Picker) setupInput() {
if p.seat == nil { if p.seat == nil {
return return
@@ -610,13 +626,22 @@ func (p *Picker) setupPointerHandlers() {
if p.activeSurface == nil { if p.activeSurface == nil {
return return
} }
// If surface was hidden, mark it as visible again
if p.activeSurface.hidden {
p.activeSurface.hidden = false
}
p.activeSurface.state.OnPointerMotion(e.SurfaceX, e.SurfaceY) p.activeSurface.state.OnPointerMotion(e.SurfaceX, e.SurfaceY)
p.redrawSurface(p.activeSurface) p.redrawSurface(p.activeSurface)
}) })
p.pointer.SetLeaveHandler(func(e client.PointerLeaveEvent) { p.pointer.SetLeaveHandler(func(e client.PointerLeaveEvent) {
if p.activeSurface != nil && p.activeSurface.wlSurface.ID() == e.Surface.ID() { for _, ls := range p.surfaces {
p.activeSurface = nil if ls.wlSurface.ID() == e.Surface.ID() {
p.hideSurface(ls)
break
}
} }
}) })

View File

@@ -274,6 +274,25 @@ func (s *SurfaceState) Redraw() *ShmBuffer {
return dst return dst
} }
// RedrawScreenOnly renders just the screenshot without any overlay (magnifier, preview).
// Used for when pointer leaves the surface.
func (s *SurfaceState) RedrawScreenOnly() *ShmBuffer {
s.mu.Lock()
defer s.mu.Unlock()
if !s.readyForDisplay || s.screenBuf == nil {
return nil
}
dst := s.renderBufs[s.front]
if dst == nil {
return nil
}
copy(dst.data, s.screenBuf.data)
return dst
}
func (s *SurfaceState) PickColor() (Color, bool) { func (s *SurfaceState) PickColor() (Color, bool) {
s.mu.Lock() s.mu.Lock()
defer s.mu.Unlock() defer s.mu.Unlock()