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:
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user