Compare commits

...

2 Commits

Author SHA1 Message Date
8aa8dc9570 Add support for AttrIcon 2024-08-10 21:07:31 -04:00
a60a729ad9 Update X backend 2024-08-10 20:47:36 -04:00
2 changed files with 76 additions and 17 deletions

View File

@ -27,12 +27,15 @@ type box struct {
focusQueued *bool focusQueued *bool
attrColor attrHierarchy[tomo.AttrColor] attrColor attrHierarchy[tomo.AttrColor]
attrIcon attrHierarchy[tomo.AttrIcon]
attrTexture attrHierarchy[tomo.AttrTexture] attrTexture attrHierarchy[tomo.AttrTexture]
attrTextureMode attrHierarchy[tomo.AttrTextureMode] attrTextureMode attrHierarchy[tomo.AttrTextureMode]
attrBorder attrHierarchy[tomo.AttrBorder] attrBorder attrHierarchy[tomo.AttrBorder]
attrMinimumSize attrHierarchy[tomo.AttrMinimumSize] attrMinimumSize attrHierarchy[tomo.AttrMinimumSize]
attrPadding attrHierarchy[tomo.AttrPadding] attrPadding attrHierarchy[tomo.AttrPadding]
icon canvas.Texture
dndData data.Data dndData data.Data
dndAccept []data.Mime dndAccept []data.Mime
focusable bool focusable bool
@ -192,6 +195,11 @@ func (this *box) setAttr (attr tomo.Attr, user bool) {
this.invalidateDraw() this.invalidateDraw()
} }
case tomo.AttrIcon:
if this.attrIcon.Set(attr, user) {
this.handleIconChange()
}
case tomo.AttrTexture: case tomo.AttrTexture:
if this.attrTexture.Set(attr, user) { if this.attrTexture.Set(attr, user) {
this.invalidateDraw() this.invalidateDraw()
@ -227,6 +235,11 @@ func (this *box) unsetAttr (kind tomo.AttrKind, user bool) {
this.invalidateDraw() this.invalidateDraw()
} }
case tomo.AttrKindIcon:
if this.attrIcon.Unset(user) {
this.handleIconChange()
}
case tomo.AttrKindTexture: case tomo.AttrKindTexture:
if this.attrTexture.Unset(user) { if this.attrTexture.Unset(user) {
this.invalidateDraw() this.invalidateDraw()
@ -423,6 +436,18 @@ func (this *box) Draw (can canvas.Canvas) {
// centered texture // centered texture
if textureMode == tomo.TextureModeCenter && texture != nil { if textureMode == tomo.TextureModeCenter && texture != nil {
this.centeredTexture(can, texture)
}
// centered icon
if this.icon != nil {
this.centeredTexture(can, this.icon)
}
}
func (this *box) centeredTexture (can canvas.Canvas, texture canvas.Texture) {
pen := can.Pen()
bounds := this.Bounds()
textureBounds := texture.Bounds() textureBounds := texture.Bounds()
textureOrigin := textureOrigin :=
bounds.Min. bounds.Min.
@ -437,7 +462,6 @@ func (this *box) Draw (can canvas.Canvas) {
pen.Texture(texture) pen.Texture(texture)
pen.Rectangle(textureBounds.Sub(textureBounds.Min).Add(textureOrigin)) pen.Rectangle(textureBounds.Sub(textureBounds.Min).Add(textureOrigin))
} }
}
func (this *box) drawBorders (can canvas.Canvas) { func (this *box) drawBorders (can canvas.Canvas) {
if can == nil { return } if can == nil { return }
@ -576,6 +600,15 @@ func (this *box) handleBorderChange (previousBorderSum tomo.Inset, different boo
} }
} }
func (this *box) handleIconChange () {
this.icon = nil
hierarchy := this.getHierarchy()
if hierarchy == nil { return }
icon := this.attrIcon.Value()
if icon.Icon == tomo.IconUnknown { return }
this.icon = hierarchy.getIconSet().Icon(icon.Icon, icon.Size)
}
func (this *box) invalidateStyle () { func (this *box) invalidateStyle () {
hierarchy := this.getHierarchy() hierarchy := this.getHierarchy()
if hierarchy == nil { return } if hierarchy == nil { return }

View File

@ -4,7 +4,9 @@ import "image"
import "errors" import "errors"
import "git.tebibyte.media/tomo/tomo" import "git.tebibyte.media/tomo/tomo"
import "git.tebibyte.media/tomo/xgbkb" import "git.tebibyte.media/tomo/xgbkb"
import "git.tebibyte.media/tomo/tomo/data"
import "git.tebibyte.media/tomo/tomo/canvas" import "git.tebibyte.media/tomo/tomo/canvas"
import "git.tebibyte.media/tomo/backend/style"
import "git.tebibyte.media/tomo/backend/x/canvas" import "git.tebibyte.media/tomo/backend/x/canvas"
import "git.tebibyte.media/tomo/backend/internal/system" import "git.tebibyte.media/tomo/backend/internal/system"
@ -18,6 +20,9 @@ type Backend struct {
x *xgbutil.XUtil x *xgbutil.XUtil
system *system.System system *system.System
style *style.Style
iconSet style.IconSet
doChannel chan func() doChannel chan func()
windows map[xproto.Window] *window windows map[xproto.Window] *window
open bool open bool
@ -126,12 +131,33 @@ func (this *Backend) NewCanvas (bounds image.Rectangle) canvas.CanvasCloser {
return xcanvas.NewCanvas(this.x, bounds) return xcanvas.NewCanvas(this.x, bounds)
} }
func (this *Backend) SetStyle (style *tomo.Style) { func (this *Backend) ColorRGBA (id tomo.Color) (r, g, b, a uint32) {
if col, ok := this.style.Colors[id]; ok {
return col.RGBA()
}
return 0xFFFF, 0, 0xFFFF, 0xFFFF // punish bad styles
}
func (this *Backend) IconTexture (id tomo.Icon, size tomo.IconSize) canvas.Texture {
return this.iconSet.Icon(id, size)
}
func (this *Backend) MimeIconTexture (mime data.Mime, size tomo.IconSize) canvas.Texture {
return this.iconSet.MimeIcon(mime, size)
}
func (this *Backend) SetStyle (style *style.Style) {
this.style = style
this.system.SetStyle(style) this.system.SetStyle(style)
} }
func (this *Backend) SetIconSet (icons tomo.IconSet) { func (this *Backend) SetIconSet (iconSet style.IconSet) {
this.system.SetIconSet(icons) this.iconSet = iconSet
this.system.SetIconSet(iconSet)
}
func (this *Backend) SetFaceSet (faceSet style.FaceSet) {
this.system.SetFaceSet(faceSet)
} }
func (this *Backend) assert () { func (this *Backend) assert () {