homer drops his donut, doh, homer spills his soda, doh, homer hits the doorway, doh, homer ruins his whole day, doh!

This commit is contained in:
2026-08-06 13:33:55 +01:00
parent 74f5761e06
commit 37266ab8d4
4 changed files with 94 additions and 42 deletions
+10
View File
@@ -71,6 +71,16 @@ func newImageFromPath(path string) (*gtk.Image, error) {
return gtk.NewImageFromPaintable(tex), nil return gtk.NewImageFromPaintable(tex), nil
} }
func setImageFromPath(path string, i *gtk.Image) (error) {
tex, err := getTexture(path)
if err != nil {
return err
}
i.SetFromPaintable(tex)
return nil
}
func newPictureFromWeb(url string) (*gtk.Picture, error) { func newPictureFromWeb(url string) (*gtk.Picture, error) {
pa, _ := ensureCache() pa, _ := ensureCache()
// step 1: get a sha256 sum of the URL // step 1: get a sha256 sum of the URL
+21 -9
View File
@@ -208,24 +208,26 @@ func showUserWindow(u stanza.Presence, custom_nick string) {
mm := mo.(mucUnit) mm := mo.(mucUnit)
mmm := mm.Members mmm := mm.Members
mmmm, ok := mmm.Load(id) mmmm, ok := mmm.Load(id)
im := gtk.NewImage()
if ok { if ok {
pres := mmmm.(stanza.Presence) pres := mmmm.(stanza.Presence)
var vu VCardUpdate var vu VCardUpdate
pres.Get(&vu) pres.Get(&vu)
if vu.Photo != "" { if vu.Photo != "" {
im := getAvatar(u.From, vu.Photo) getAvatar(u.From, vu.Photo, im)
im.SetPixelSize(80) im.SetPixelSize(80)
im.AddCSSClass("author_img") im.AddCSSClass("author_img")
profile_box.Prepend(im) profile_box.Prepend(im)
} else { } else {
im := createIdenticon(u.From, false) createIdenticon(u.From, false, im)
im.SetPixelSize(80) im.SetPixelSize(80)
im.AddCSSClass("author_img") im.AddCSSClass("author_img")
profile_box.Prepend(im) profile_box.Prepend(im)
} }
} else { } else {
im := createIdenticon(u.From, false) createIdenticon(u.From, false, im)
im.SetPixelSize(80) im.SetPixelSize(80)
im.AddCSSClass("author_img") im.AddCSSClass("author_img")
profile_box.Prepend(im) profile_box.Prepend(im)
@@ -457,18 +459,19 @@ func switchToTab(jid string, w *gtk.Window) {
userbox.Append(medal) userbox.Append(medal)
if loadedConfig.ShowAvatarsInMemberList { if loadedConfig.ShowAvatarsInMemberList {
default_av := createIdenticon(u.From, false) default_av := gtk.NewImage()
createIdenticon(u.From, false, default_av)
userbox.Prepend(default_av) userbox.Prepend(default_av)
var vcu VCardUpdate var vcu VCardUpdate
ok = u.Get(&vcu) ok = u.Get(&vcu)
if ok { if ok {
photo := vcu.Photo photo := vcu.Photo
go func() { go func() {
new_im := getAvatar(u.From, photo)
glib.IdleAdd(func() { glib.IdleAdd(func() {
new_im := gtk.NewImage()
userbox.Remove(default_av) userbox.Remove(default_av)
userbox.Prepend(new_im) userbox.Prepend(new_im)
go getAvatar(u.From, photo, new_im)
}) })
}() }()
@@ -642,11 +645,14 @@ func switchToTab(jid string, w *gtk.Window) {
gen.Prepend(headerBox) gen.Prepend(headerBox)
muc_presence := typed_tab.muc_presence muc_presence := typed_tab.muc_presence
muci := gtk.NewImage()
createIdenticon(jid, true, muci)
if muc_presence != nil { if muc_presence != nil {
vc := &VCardUpdate{} vc := &VCardUpdate{}
ok = muc_presence.Get(vc) ok = muc_presence.Get(vc)
if ok { if ok {
muci := getAvatar(jid, vc.Photo) getAvatar(jid, vc.Photo, muci)
muci.SetPixelSize(80) muci.SetPixelSize(80)
gen.Prepend(muci) gen.Prepend(muci)
} }
@@ -683,9 +689,11 @@ func showErrorDialog(err error, w *gtk.Window) {
err_win.Present() err_win.Present()
} }
func createIdenticon(word string, always_create bool) *gtk.Image { // This function generates an identicon func createIdenticon(word string, always_create bool, i *gtk.Image) { // This function generates an identicon
if !loadedConfig.Identicons && !always_create { if !loadedConfig.Identicons && !always_create {
return gtk.NewImageFromPaintable(clientAssetsLoad("DefaultAvatar")) // return gtk.NewImageFromPaintable(clientAssetsLoad("DefaultAvatar"))
i.SetFromPaintable(clientAssetsLoad("DefaultAvatar"))
return
} }
identicon.SetBackgroundColorFunction(func([]byte, color.Color) color.Color { identicon.SetBackgroundColorFunction(func([]byte, color.Color) color.Color {
@@ -707,10 +715,14 @@ func createIdenticon(word string, always_create bool) *gtk.Image { // This funct
loader.Close() loader.Close()
p := loader.Pixbuf() p := loader.Pixbuf()
gt := gdk.NewTextureForPixbuf(p) gt := gdk.NewTextureForPixbuf(p)
/*
i := gtk.NewImageFromPaintable(gt) i := gtk.NewImageFromPaintable(gt)
i.AddCSSClass(loadedConfig.CVD.String() + "_CVD") i.AddCSSClass(loadedConfig.CVD.String() + "_CVD")
return i return i
*/
i.SetFromPaintable(gt)
i.AddCSSClass(loadedConfig.CVD.String() + "_CVD")
} }
func jidBuilder(en *gtk.Entry) { // This function spawns a window that allows the user to interactively build a JID func jidBuilder(en *gtk.Entry) { // This function spawns a window that allows the user to interactively build a JID
+33 -26
View File
@@ -7,7 +7,7 @@ import (
"encoding/base64" "encoding/base64"
"fmt" "fmt"
"github.com/diamondburned/gotk4/pkg/gdk/v4" "github.com/diamondburned/gotk4/pkg/gdk/v4"
"github.com/diamondburned/gotk4/pkg/glib/v2" _ "github.com/diamondburned/gotk4/pkg/glib/v2"
"github.com/diamondburned/gotk4/pkg/gtk/v4" "github.com/diamondburned/gotk4/pkg/gtk/v4"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/jasonlovesdoggo/gopen" "github.com/jasonlovesdoggo/gopen"
@@ -290,28 +290,22 @@ func generateMessageWidget(p stanza.Packet, blocked bool) (gtk.Widgetter, bool)
if !ok { if !ok {
can_generate = false can_generate = false
} }
im := gtk.NewImage()
if can_generate { if can_generate {
pres := mmmm.(stanza.Presence) pres := mmmm.(stanza.Presence)
var vu VCardUpdate var vu VCardUpdate
pres.Get(&vu) pres.Get(&vu)
im := createIdenticon(m.From, false) createIdenticon(m.From, false, im)
im.SetPixelSize(40) im.SetPixelSize(40)
im.AddCSSClass("author_img") im.AddCSSClass("author_img")
authorBox.Append(im) authorBox.Append(im)
if vu.Photo != "" { if vu.Photo != "" {
go func() { go getAvatar(m.From, vu.Photo, im)
new_im := getAvatar(m.From, vu.Photo)
glib.IdleAdd(func() {
new_im.SetPixelSize(40)
new_im.AddCSSClass("author_img")
authorBox.Remove(im)
authorBox.Prepend(new_im)
})
}()
} }
} else { } else {
im := createIdenticon(m.From, false) createIdenticon(m.From, false, im)
im.SetPixelSize(40) im.SetPixelSize(40)
im.AddCSSClass("author_img") im.AddCSSClass("author_img")
authorBox.Append(im) authorBox.Append(im)
@@ -323,7 +317,8 @@ func generateMessageWidget(p stanza.Packet, blocked bool) (gtk.Widgetter, bool)
authorBox.Append(al) authorBox.Append(al)
if m.Thread != "" { if m.Thread != "" {
im := createIdenticon(m.Thread, true) im := gtk.NewImage()
createIdenticon(m.Thread, true, im)
im.SetPixelSize(10) im.SetPixelSize(10)
authorBox.Append(im) authorBox.Append(im)
} }
@@ -437,33 +432,39 @@ func getVAdjustment(scrolledWindow *gtk.ScrolledWindow) *gtk.Adjustment {
return val return val
} }
func getAvatar(j, hash string) *gtk.Image { // TODO: This function probably shouldn't be here, and should probably be in xmpp-helpers or somewhere similar. func getAvatar(j, hash string, i *gtk.Image) { // TODO: This function probably shouldn't be here, and should probably be in xmpp-helpers or somewhere similar.
oghash := hash oghash := hash
p, err := ensureCache() p, err := ensureCache()
if err != nil { if err != nil {
return createIdenticon(j, false) createIdenticon(j, false, i)
return
} }
if hash == "" { if hash == "" {
return createIdenticon(j, false) createIdenticon(j, false, i)
return
} }
_, ok := invalidImages.Load(hash) _, ok := invalidImages.Load(hash)
if ok { if ok {
return createIdenticon(j, false) createIdenticon(j, false, i)
return
} }
hash = filepath.Join(p, hash) hash = filepath.Join(p, hash)
_, err = os.ReadFile(hash) _, err = os.ReadFile(hash)
if err == nil { if err == nil {
i, err := newImageFromPath(hash) /*
i, err = newImageFromPath(hash)
if err != nil { if err != nil {
invalidImages.Store(oghash, true) invalidImages.Store(oghash, true)
return createIdenticon(j, false) createIdenticon(j, false, i)
} }
// i.AddCSSClass(loadedConfig.CVD.String() + "_CVD") */
return i
setImageFromPath(hash, i)
return
} }
iqResp, err := stanza.NewIQ(stanza.Attrs{ iqResp, err := stanza.NewIQ(stanza.Attrs{
@@ -488,13 +489,15 @@ func getAvatar(j, hash string) *gtk.Image { // TODO: This function probably shou
result := <-mychan result := <-mychan
card, ok := result.Payload.(*VCard) card, ok := result.Payload.(*VCard)
if !ok { if !ok {
return createIdenticon(j, false) createIdenticon(j, false, i)
return
} }
base64_data := card.Photo.Binval base64_data := card.Photo.Binval
if card.Photo.Binval == "" || ((card.Photo.Type == "image/svg+xml" || card.Photo.Type == "image/webp") && (runtime.GOOS == "windows" || runtime.GOOS == "netbsd")) { if card.Photo.Binval == "" || ((card.Photo.Type == "image/svg+xml" || card.Photo.Type == "image/webp") && (runtime.GOOS == "windows" || runtime.GOOS == "netbsd")) {
invalidImages.Store(oghash, true) invalidImages.Store(oghash, true)
return createIdenticon(j, false) createIdenticon(j, false, i)
return
} }
data, err := base64.StdEncoding.DecodeString(base64_data) data, err := base64.StdEncoding.DecodeString(base64_data)
@@ -507,11 +510,15 @@ func getAvatar(j, hash string) *gtk.Image { // TODO: This function probably shou
panic(err) panic(err)
} }
i, err := newImageFromPath(hash) err = setImageFromPath(hash, i)
if err != nil { if err != nil {
panic(err)
invalidImages.Store(oghash, true) invalidImages.Store(oghash, true)
return createIdenticon(j, false) createIdenticon(j, false, i)
} }
fmt.Println("Everything is OK. There should be an avatar!")
i.AddCSSClass(loadedConfig.CVD.String() + "_CVD") i.AddCSSClass(loadedConfig.CVD.String() + "_CVD")
return i // return i
} }
+30 -7
View File
@@ -550,13 +550,10 @@ func main() {
}) })
box.Append(b) box.Append(b)
go func() { im := gtk.NewImage()
new_im := getAvatar(jid, jid) // TODO: Use PEP avatar and do not use JID as hash im.SetPixelSize(40)
glib.IdleAdd(func() { go getAvatar(jid, jid, im)
new_im.SetPixelSize(40) box.Prepend(im)
box.Prepend(new_im)
})
}()
box.AddController(gesture1) box.AddController(gesture1)
menu.Append(box) menu.Append(box)
@@ -602,7 +599,15 @@ func main() {
box.SetVisible(false) box.SetVisible(false)
}) })
im := gtk.NewImage()
im.SetPixelSize(40)
box.Append(im)
box.Append(b) box.Append(b)
go getAvatar(jid, jid, im)
/*
go func() { go func() {
new_im := getAvatar(jid, jid) // TODO: Use PEP avatar and do not use JID as hash new_im := getAvatar(jid, jid) // TODO: Use PEP avatar and do not use JID as hash
glib.IdleAdd(func() { glib.IdleAdd(func() {
@@ -610,6 +615,7 @@ func main() {
box.Prepend(new_im) box.Prepend(new_im)
}) })
}() }()
*/
box.AddController(gesture1) box.AddController(gesture1)
menu.Append(box) menu.Append(box)
@@ -690,7 +696,15 @@ func main() {
removeTab(jid, &window.Window) removeTab(jid, &window.Window)
box.SetVisible(false) box.SetVisible(false)
}) })
im := gtk.NewImage()
im.SetPixelSize(40)
box.Append(b) box.Append(b)
box.Prepend(im)
go getAvatar(jid, jid, im)
/*
go func() { go func() {
new_im := getAvatar(jid, jid) new_im := getAvatar(jid, jid)
glib.IdleAdd(func() { glib.IdleAdd(func() {
@@ -698,6 +712,7 @@ func main() {
box.Prepend(new_im) box.Prepend(new_im)
}) })
}() }()
*/
box.AddController(gesture1) box.AddController(gesture1)
box.AddController(gesture2) box.AddController(gesture2)
@@ -990,6 +1005,11 @@ func activate(app *gtk.Application) {
createTab(t, true, n) createTab(t, true, n)
box := gtk.NewBox(gtk.OrientationHorizontal, 10) box := gtk.NewBox(gtk.OrientationHorizontal, 10)
im := gtk.NewImage()
im.SetPixelSize(40)
go getAvatar(t, t, im)
/*
go func() { go func() {
new_im := getAvatar(t, t) new_im := getAvatar(t, t)
glib.IdleAdd(func() { glib.IdleAdd(func() {
@@ -997,7 +1017,10 @@ func activate(app *gtk.Application) {
box.Prepend(new_im) box.Prepend(new_im)
}) })
}() }()
*/
b := gtk.NewLabel(n) b := gtk.NewLabel(n)
box.Append(im)
box.Append(b) box.Append(b)
gesture1 := gtk.NewGestureClick() gesture1 := gtk.NewGestureClick()
gesture1.SetButton(1) gesture1.SetButton(1)