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
}
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) {
pa, _ := ensureCache()
// 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)
mmm := mm.Members
mmmm, ok := mmm.Load(id)
im := gtk.NewImage()
if ok {
pres := mmmm.(stanza.Presence)
var vu VCardUpdate
pres.Get(&vu)
if vu.Photo != "" {
im := getAvatar(u.From, vu.Photo)
getAvatar(u.From, vu.Photo, im)
im.SetPixelSize(80)
im.AddCSSClass("author_img")
profile_box.Prepend(im)
} else {
im := createIdenticon(u.From, false)
createIdenticon(u.From, false, im)
im.SetPixelSize(80)
im.AddCSSClass("author_img")
profile_box.Prepend(im)
}
} else {
im := createIdenticon(u.From, false)
createIdenticon(u.From, false, im)
im.SetPixelSize(80)
im.AddCSSClass("author_img")
profile_box.Prepend(im)
@@ -457,18 +459,19 @@ func switchToTab(jid string, w *gtk.Window) {
userbox.Append(medal)
if loadedConfig.ShowAvatarsInMemberList {
default_av := createIdenticon(u.From, false)
default_av := gtk.NewImage()
createIdenticon(u.From, false, default_av)
userbox.Prepend(default_av)
var vcu VCardUpdate
ok = u.Get(&vcu)
if ok {
photo := vcu.Photo
go func() {
new_im := getAvatar(u.From, photo)
glib.IdleAdd(func() {
new_im := gtk.NewImage()
userbox.Remove(default_av)
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)
muc_presence := typed_tab.muc_presence
muci := gtk.NewImage()
createIdenticon(jid, true, muci)
if muc_presence != nil {
vc := &VCardUpdate{}
ok = muc_presence.Get(vc)
if ok {
muci := getAvatar(jid, vc.Photo)
getAvatar(jid, vc.Photo, muci)
muci.SetPixelSize(80)
gen.Prepend(muci)
}
@@ -683,9 +689,11 @@ func showErrorDialog(err error, w *gtk.Window) {
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 {
return gtk.NewImageFromPaintable(clientAssetsLoad("DefaultAvatar"))
// return gtk.NewImageFromPaintable(clientAssetsLoad("DefaultAvatar"))
i.SetFromPaintable(clientAssetsLoad("DefaultAvatar"))
return
}
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()
p := loader.Pixbuf()
gt := gdk.NewTextureForPixbuf(p)
/*
i := gtk.NewImageFromPaintable(gt)
i.AddCSSClass(loadedConfig.CVD.String() + "_CVD")
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
+33 -26
View File
@@ -7,7 +7,7 @@ import (
"encoding/base64"
"fmt"
"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/google/uuid"
"github.com/jasonlovesdoggo/gopen"
@@ -290,28 +290,22 @@ func generateMessageWidget(p stanza.Packet, blocked bool) (gtk.Widgetter, bool)
if !ok {
can_generate = false
}
im := gtk.NewImage()
if can_generate {
pres := mmmm.(stanza.Presence)
var vu VCardUpdate
pres.Get(&vu)
im := createIdenticon(m.From, false)
createIdenticon(m.From, false, im)
im.SetPixelSize(40)
im.AddCSSClass("author_img")
authorBox.Append(im)
if vu.Photo != "" {
go func() {
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)
})
}()
go getAvatar(m.From, vu.Photo, im)
}
} else {
im := createIdenticon(m.From, false)
createIdenticon(m.From, false, im)
im.SetPixelSize(40)
im.AddCSSClass("author_img")
authorBox.Append(im)
@@ -323,7 +317,8 @@ func generateMessageWidget(p stanza.Packet, blocked bool) (gtk.Widgetter, bool)
authorBox.Append(al)
if m.Thread != "" {
im := createIdenticon(m.Thread, true)
im := gtk.NewImage()
createIdenticon(m.Thread, true, im)
im.SetPixelSize(10)
authorBox.Append(im)
}
@@ -437,33 +432,39 @@ func getVAdjustment(scrolledWindow *gtk.ScrolledWindow) *gtk.Adjustment {
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
p, err := ensureCache()
if err != nil {
return createIdenticon(j, false)
createIdenticon(j, false, i)
return
}
if hash == "" {
return createIdenticon(j, false)
createIdenticon(j, false, i)
return
}
_, ok := invalidImages.Load(hash)
if ok {
return createIdenticon(j, false)
createIdenticon(j, false, i)
return
}
hash = filepath.Join(p, hash)
_, err = os.ReadFile(hash)
if err == nil {
i, err := newImageFromPath(hash)
/*
i, err = newImageFromPath(hash)
if err != nil {
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{
@@ -488,13 +489,15 @@ func getAvatar(j, hash string) *gtk.Image { // TODO: This function probably shou
result := <-mychan
card, ok := result.Payload.(*VCard)
if !ok {
return createIdenticon(j, false)
createIdenticon(j, false, i)
return
}
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")) {
invalidImages.Store(oghash, true)
return createIdenticon(j, false)
createIdenticon(j, false, i)
return
}
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)
}
i, err := newImageFromPath(hash)
err = setImageFromPath(hash, i)
if err != nil {
panic(err)
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")
return i
// return i
}
+30 -7
View File
@@ -550,13 +550,10 @@ func main() {
})
box.Append(b)
go func() {
new_im := getAvatar(jid, jid) // TODO: Use PEP avatar and do not use JID as hash
glib.IdleAdd(func() {
new_im.SetPixelSize(40)
box.Prepend(new_im)
})
}()
im := gtk.NewImage()
im.SetPixelSize(40)
go getAvatar(jid, jid, im)
box.Prepend(im)
box.AddController(gesture1)
menu.Append(box)
@@ -602,7 +599,15 @@ func main() {
box.SetVisible(false)
})
im := gtk.NewImage()
im.SetPixelSize(40)
box.Append(im)
box.Append(b)
go getAvatar(jid, jid, im)
/*
go func() {
new_im := getAvatar(jid, jid) // TODO: Use PEP avatar and do not use JID as hash
glib.IdleAdd(func() {
@@ -610,6 +615,7 @@ func main() {
box.Prepend(new_im)
})
}()
*/
box.AddController(gesture1)
menu.Append(box)
@@ -690,7 +696,15 @@ func main() {
removeTab(jid, &window.Window)
box.SetVisible(false)
})
im := gtk.NewImage()
im.SetPixelSize(40)
box.Append(b)
box.Prepend(im)
go getAvatar(jid, jid, im)
/*
go func() {
new_im := getAvatar(jid, jid)
glib.IdleAdd(func() {
@@ -698,6 +712,7 @@ func main() {
box.Prepend(new_im)
})
}()
*/
box.AddController(gesture1)
box.AddController(gesture2)
@@ -990,6 +1005,11 @@ func activate(app *gtk.Application) {
createTab(t, true, n)
box := gtk.NewBox(gtk.OrientationHorizontal, 10)
im := gtk.NewImage()
im.SetPixelSize(40)
go getAvatar(t, t, im)
/*
go func() {
new_im := getAvatar(t, t)
glib.IdleAdd(func() {
@@ -997,7 +1017,10 @@ func activate(app *gtk.Application) {
box.Prepend(new_im)
})
}()
*/
b := gtk.NewLabel(n)
box.Append(im)
box.Append(b)
gesture1 := gtk.NewGestureClick()
gesture1.SetButton(1)