Merge pull request 'oh mmy god' (#5) from wacky into main
Reviewed-on: sashakoshka/tomo#5
This commit is contained in:
commit
3dc2fe390a
@ -42,6 +42,14 @@ func (sum *scrollSum) add (button xproto.Button, window *Window, state uint16) {
|
||||
|
||||
}
|
||||
|
||||
func (window *Window) handleExpose (
|
||||
connection *xgbutil.XUtil,
|
||||
event xevent.ExposeEvent,
|
||||
) {
|
||||
_ = window.compressExpose(*event.ExposeEvent)
|
||||
window.redrawChildEntirely()
|
||||
}
|
||||
|
||||
func (window *Window) handleConfigureNotify (
|
||||
connection *xgbutil.XUtil,
|
||||
event xevent.ConfigureNotifyEvent,
|
||||
@ -64,9 +72,29 @@ func (window *Window) handleConfigureNotify (
|
||||
window.metrics.height = int(configureEvent.Height)
|
||||
window.reallocateCanvas()
|
||||
window.resizeChildToFit()
|
||||
|
||||
if !window.exposeEventFollows(configureEvent) {
|
||||
window.redrawChildEntirely()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (window *Window) exposeEventFollows (event xproto.ConfigureNotifyEvent) (found bool) {
|
||||
nextEvents := xevent.Peek(window.backend.connection)
|
||||
if len(nextEvents) > 0 {
|
||||
untypedEvent := nextEvents[0]
|
||||
if untypedEvent.Err == nil {
|
||||
typedEvent, ok :=
|
||||
untypedEvent.Event.(xproto.ConfigureNotifyEvent)
|
||||
|
||||
if ok && typedEvent.Window == event.Window {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (window *Window) modifiersFromState (
|
||||
state uint16,
|
||||
) (
|
||||
@ -201,6 +229,32 @@ func (window *Window) handleMotionNotify (
|
||||
}
|
||||
}
|
||||
|
||||
func (window *Window) compressExpose (
|
||||
firstEvent xproto.ExposeEvent,
|
||||
) (
|
||||
lastEvent xproto.ExposeEvent,
|
||||
) {
|
||||
window.backend.connection.Sync()
|
||||
xevent.Read(window.backend.connection, false)
|
||||
lastEvent = firstEvent
|
||||
|
||||
for index, untypedEvent := range xevent.Peek(window.backend.connection) {
|
||||
if untypedEvent.Err != nil { continue }
|
||||
|
||||
typedEvent, ok := untypedEvent.Event.(xproto.ExposeEvent)
|
||||
if !ok { continue }
|
||||
|
||||
// FIXME: union all areas into the last event
|
||||
if firstEvent.Window == typedEvent.Window {
|
||||
lastEvent = typedEvent
|
||||
defer func (index int) {
|
||||
xevent.DequeueAt(window.backend.connection, index)
|
||||
} (index)
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (window *Window) compressConfigureNotify (
|
||||
firstEvent xproto.ConfigureNotifyEvent,
|
||||
|
@ -39,6 +39,7 @@ func (backend *Backend) NewWindow (
|
||||
backend.connection.RootWin(),
|
||||
0, 0, width, height, 0)
|
||||
err = window.xWindow.Listen (
|
||||
xproto.EventMaskExposure,
|
||||
xproto.EventMaskStructureNotify,
|
||||
xproto.EventMaskPointerMotion,
|
||||
xproto.EventMaskKeyPress,
|
||||
@ -50,7 +51,9 @@ func (backend *Backend) NewWindow (
|
||||
window.xWindow.WMGracefulClose (func (xWindow *xwindow.Window) {
|
||||
window.Close()
|
||||
})
|
||||
|
||||
|
||||
xevent.ExposeFun(window.handleExpose).
|
||||
Connect(backend.connection, window.xWindow.Id)
|
||||
xevent.ConfigureNotifyFun(window.handleConfigureNotify).
|
||||
Connect(backend.connection, window.xWindow.Id)
|
||||
xevent.KeyPressFun(window.handleKeyPress).
|
||||
@ -108,6 +111,7 @@ func (window *Window) Adopt (child tomo.Element) {
|
||||
})
|
||||
window.resizeChildToFit()
|
||||
window.childMinimumSizeChangeCallback(child.MinimumSize())
|
||||
window.redrawChildEntirely()
|
||||
}
|
||||
}
|
||||
|
||||
@ -200,12 +204,14 @@ func (window *Window) reallocateCanvas () {
|
||||
window.metrics.width,
|
||||
window.metrics.height))
|
||||
|
||||
window.xCanvas.XSurfaceSet(window.xWindow.Id)
|
||||
window.xCanvas.CreatePixmap()
|
||||
}
|
||||
|
||||
func (window *Window) redrawChildEntirely () {
|
||||
data, stride := window.child.Buffer()
|
||||
bounds := window.child.Bounds()
|
||||
window.xCanvas.For (func (x, y int) (c xgraphics.BGRA) {
|
||||
if !(image.Point { x, y }).In(bounds) { return }
|
||||
rgba := data[x + y * stride]
|
||||
c.R, c.G, c.B, c.A = rgba.R, rgba.G, rgba.B, rgba.A
|
||||
return
|
||||
@ -235,13 +241,11 @@ func (window *Window) resizeChildToFit () {
|
||||
window.child.Resize (
|
||||
window.metrics.width,
|
||||
window.metrics.height)
|
||||
window.redrawChildEntirely()
|
||||
}
|
||||
} else {
|
||||
window.child.Resize (
|
||||
window.metrics.width,
|
||||
window.metrics.height)
|
||||
window.redrawChildEntirely()
|
||||
}
|
||||
window.skipChildDrawCallback = false
|
||||
}
|
||||
@ -310,6 +314,9 @@ func (window *Window) pushRegion (region image.Rectangle) {
|
||||
image, ok := window.xCanvas.SubImage(region).(*xgraphics.Image)
|
||||
if ok {
|
||||
image.XDraw()
|
||||
window.xCanvas.XPaint(window.xWindow.Id)
|
||||
image.XExpPaint (
|
||||
window.xWindow.Id,
|
||||
image.Bounds().Min.X,
|
||||
image.Bounds().Min.Y)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user