diff --git a/cache.go b/cache.go index e22b026..4de8f29 100644 --- a/cache.go +++ b/cache.go @@ -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 diff --git a/gtk-helpers.go b/gtk-helpers.go index 898259b..216d922 100644 --- a/gtk-helpers.go +++ b/gtk-helpers.go @@ -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 diff --git a/gtk-message.go b/gtk-message.go index dbbf91d..bd0cbcd 100644 --- a/gtk-message.go +++ b/gtk-message.go @@ -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 } diff --git a/main.go b/main.go index 46adfd6..bf6a729 100644 --- a/main.go +++ b/main.go @@ -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)