diff --git a/assets/group.png b/assets/group.png new file mode 100644 index 0000000..7fb4e1f Binary files /dev/null and b/assets/group.png differ diff --git a/assets/lambda-disabled.png b/assets/lambda-disabled.png new file mode 100644 index 0000000..de6d036 Binary files /dev/null and b/assets/lambda-disabled.png differ diff --git a/assets/vcard.png b/assets/vcard.png new file mode 100644 index 0000000..c68dc81 Binary files /dev/null and b/assets/vcard.png differ diff --git a/go.mod b/go.mod index e48a11f..c2c40fb 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.25.5 require ( github.com/BurntSushi/toml v1.6.0 github.com/diamondburned/gotk4/pkg v0.3.1 + github.com/gen2brain/beeep v0.11.2 github.com/google/uuid v1.1.1 github.com/jacoblockett/sanitizefilename v1.0.1 github.com/jasonlovesdoggo/gopen v0.0.0-20250130105607-39c98c645030 @@ -15,11 +16,21 @@ require ( ) require ( + git.sr.ht/~jackmordaunt/go-toast v1.1.2 // indirect github.com/KarpelesLab/weak v0.1.1 // indirect + github.com/esiqveland/notify v0.13.3 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect + github.com/jackmordaunt/icns/v3 v3.0.1 // indirect github.com/kr/text v0.1.0 // indirect + github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect + github.com/sergeymakinen/go-bmp v1.0.0 // indirect + github.com/sergeymakinen/go-ico v1.0.0-beta.0 // indirect + github.com/tadvi/systray v0.0.0-20190226123456-11a2b8fa57af // indirect go4.org/unsafe/assume-no-moving-gc v0.0.0-20231121144256-b99613f794b6 // indirect golang.org/x/net v0.29.0 // indirect golang.org/x/sync v0.8.0 // indirect + golang.org/x/sys v0.30.0 // indirect golang.org/x/text v0.18.0 // indirect golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 // indirect mellium.im/reader v0.1.0 // indirect diff --git a/go.sum b/go.sum index ab080ae..8f16728 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +git.sr.ht/~jackmordaunt/go-toast v1.1.2 h1:/yrfI55LRt1M7H1vkaw+NaH1+L1CDxrqDltwm5euVuE= +git.sr.ht/~jackmordaunt/go-toast v1.1.2/go.mod h1:jA4OqHKTQ4AFBdwrSnwnskUIIS3HYzlJSgdzCKqfavo= github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/KarpelesLab/weak v0.1.1 h1:fNnlPo3aypS9tBzoEQluY13XyUfd/eWaSE/vMvo9s4g= @@ -10,18 +12,27 @@ github.com/chromedp/cdproto v0.0.0-20190926234355-1b4886c6fad6/go.mod h1:0YChpVz github.com/chromedp/chromedp v0.3.1-0.20190619195644-fd957a4d2901/go.mod h1:mJdvfrVn594N9tfiPecUidF6W5jPRKHymqHfzbobPsM= github.com/chromedp/chromedp v0.4.0/go.mod h1:DC3QUn4mJ24dwjcaGQLoZrhm4X/uPHZ6spDbS2uFhm4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/diamondburned/gotk4/pkg v0.3.1 h1:uhkXSUPUsCyz3yujdvl7DSN8jiLS2BgNTQE95hk6ygg= github.com/diamondburned/gotk4/pkg v0.3.1/go.mod h1:DqeOW+MxSZFg9OO+esk4JgQk0TiUJJUBfMltKhG+ub4= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/esiqveland/notify v0.13.3 h1:QCMw6o1n+6rl+oLUfg8P1IIDSFsDEb2WlXvVvIJbI/o= +github.com/esiqveland/notify v0.13.3/go.mod h1:hesw/IRYTO0x99u1JPweAl4+5mwXJibQVUcP0Iu5ORE= github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gen2brain/beeep v0.11.2 h1:+KfiKQBbQCuhfJFPANZuJ+oxsSKAYNe88hIpJuyKWDA= +github.com/gen2brain/beeep v0.11.2/go.mod h1:jQVvuwnLuwOcdctHn/uyh8horSBNJ8uGb9Cn2W4tvoc= github.com/go-interpreter/wagon v0.5.1-0.20190713202023-55a163980b6c/go.mod h1:5+b/MBYkclRZngKF5s6qrgWxSLgE9F5dFdO1hAueZLc= github.com/go-interpreter/wagon v0.6.0/go.mod h1:5+b/MBYkclRZngKF5s6qrgWxSLgE9F5dFdO1hAueZLc= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -33,6 +44,8 @@ github.com/google/pprof v0.0.0-20190908185732-236ed259b199/go.mod h1:zfwlbNMJ+OI github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/jackmordaunt/icns/v3 v3.0.1 h1:xxot6aNuGrU+lNgxz5I5H0qSeCjNKp8uTXB1j8D4S3o= +github.com/jackmordaunt/icns/v3 v3.0.1/go.mod h1:5sHL59nqTd2ynTnowxB/MDQFhKNqkK8X687uKNygaSQ= github.com/jacoblockett/sanitizefilename v1.0.1 h1:HhPMoPp05U5aKjhht+d7lsqhyF4trKSBme0FE6S/1C4= github.com/jacoblockett/sanitizefilename v1.0.1/go.mod h1:/cQHSz2fHeR1iDKpHTSW/MIyONa+Uqj0eszbvPuIxNs= github.com/jasonlovesdoggo/gopen v0.0.0-20250130105607-39c98c645030 h1:NFCJG3BerP/5ZLXwu08x9xDs+9p7AYFMeo5IXjGANxw= @@ -58,21 +71,36 @@ github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sergeymakinen/go-bmp v1.0.0 h1:SdGTzp9WvCV0A1V0mBeaS7kQAwNLdVJbmHlqNWq0R+M= +github.com/sergeymakinen/go-bmp v1.0.0/go.mod h1:/mxlAQZRLxSvJFNIEGGLBE/m40f3ZnUifpgVDlcUIEY= +github.com/sergeymakinen/go-ico v1.0.0-beta.0 h1:m5qKH7uPKLdrygMWxbamVn+tl2HfiA3K6MFJw4GfZvQ= +github.com/sergeymakinen/go-ico v1.0.0-beta.0/go.mod h1:wQ47mTczswBO5F0NoDt7O0IXgnV4Xy3ojrroMQzyhUk= github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tadvi/systray v0.0.0-20190226123456-11a2b8fa57af h1:6yITBqGTE2lEeTPG04SN9W+iWHCRyHqlVYILiSXziwk= +github.com/tadvi/systray v0.0.0-20190226123456-11a2b8fa57af/go.mod h1:4F09kP5F+am0jAwlQLddpoMDM+iewkxxt6nxUQ5nq5o= github.com/twitchyliquid64/golang-asm v0.0.0-20190126203739-365674df15fc/go.mod h1:NoCfSFWosfqMqmmD7hApkirIK9ozpHjxRnRxs1l413A= go.coder.com/go-tools v0.0.0-20190317003359-0c6a35b74a16/go.mod h1:iKV5yK9t+J5nG9O3uF6KYdPEz3dyfMyB15MN1rbQ8Qw= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= @@ -108,6 +136,9 @@ golang.org/x/sys v0.0.0-20190618155005-516e3c20635f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190927073244-c990c680b611/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= @@ -127,6 +158,9 @@ gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKW gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gosrc.io/xmpp v0.5.1 h1:Rgrm5s2rt+npGggJH3HakQxQXR8ZZz3+QRzakRQqaq4= gosrc.io/xmpp v0.5.1/go.mod h1:L3NFMqYOxyLz3JGmgFyWf7r9htE91zVGiK40oW4RwdY= gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= diff --git a/gtk-helpers.go b/gtk-helpers.go index ff3ae8d..8f50834 100644 --- a/gtk-helpers.go +++ b/gtk-helpers.go @@ -50,6 +50,7 @@ func switchToTab(jid string, w *gtk.Window) { scroller.SetChild(typed_tab.msgs) if typed_tab.isMuc { + m, ok := mucmembers.Load(jid) if !ok { return @@ -61,7 +62,9 @@ func switchToTab(jid string, w *gtk.Window) { mm := ma.Members gen := gtk.NewBox(gtk.OrientationVertical, 0) + i := 0 mm.Range(func(k, v any) bool { + i++ userbox := gtk.NewBox(gtk.OrientationHorizontal, 0) u := v.(stanza.Presence) @@ -76,36 +79,13 @@ func switchToTab(jid string, w *gtk.Window) { nick_label := gtk.NewLabel(JidMustParse(u.From).Resource) nick_label.SetEllipsize(pango.EllipsizeEnd) - /* - affil_label := gtk.NewLabel("") - switch mu.MucUserItem.Affiliation { - case "owner": - affil_label.SetText("O") - case "admin": - affil_label.SetText("A") - case "member": - affil_label.SetText("M") - case "none": - affil_label.SetText("-") - } - */ - nick_label.AddCSSClass(mu.MucUserItem.Role) if mu.MucUserItem.Role == "visitor" { nick_label.SetOpacity(0.5) } - /* - affil_label.SetHAlign(gtk.AlignEnd) - affil_label.SetHExpand(true) - - - affil_label.AddCSSClass(mu.MucUserItem.Affiliation) - */ - userbox.SetTooltipText(fmt.Sprintf("%s\n%s\n%s\nRight-click for more information", u.From, mu.MucUserItem.Role, mu.MucUserItem.Affiliation)) userbox.Append(nick_label) - // userbox.Append(affil_label) var hats Hats ok := u.Get(&hats) @@ -113,8 +93,6 @@ func switchToTab(jid string, w *gtk.Window) { for _, hat := range hats.Hats { tag := gtk.NewImageFromPaintable(clientAssets["tag"]) tag.SetTooltipText(hat.Title) - // tag.SetHAlign(gtk.AlignEnd) - // tag.SetHExpand(true) userbox.Prepend(tag) } } @@ -274,6 +252,11 @@ func switchToTab(jid string, w *gtk.Window) { return true }) + headerBox := gtk.NewBox(gtk.OrientationHorizontal, 0) + headerBox.Append(gtk.NewImageFromPaintable(clientAssets["group"])) + headerBox.Append(gtk.NewLabel(fmt.Sprintf("%d participant(s)", i))) + gen.Prepend(headerBox) + memberList.SetChild(gen) } else { memberList.SetChild(gtk.NewLabel(jid)) diff --git a/gtk-message.go b/gtk-message.go index bb446b1..fc263a4 100644 --- a/gtk-message.go +++ b/gtk-message.go @@ -65,10 +65,11 @@ func generateMessageWidget(p stanza.Packet) gtk.Widgetter { if m.Error.Type != "" { error_box := gtk.NewBox(gtk.OrientationHorizontal, 0) cancel_img := gtk.NewImageFromPaintable(clientAssets["cancel"]) - error_label := gtk.NewLabel(m.Error.Text) + error_label := gtk.NewLabel(m.Error.Text+ ": ") error_box.Append(cancel_img) error_box.Append(error_label) + error_box.Append(gtk.NewLabel(m.Error.Reason)) return error_box } @@ -148,6 +149,7 @@ func generateMessageWidget(p stanza.Packet) gtk.Widgetter { al := gtk.NewLabel(jid.MustParse(m.From).Resourcepart()) al.AddCSSClass("author") + al.SetSelectable(true) if m.Type == stanza.MessageTypeGroupchat { mo, _ := mucmembers.Load(jid.MustParse(m.From).Bare().String()) @@ -215,6 +217,15 @@ func generateMessageWidget(p stanza.Packet) gtk.Widgetter { authorBox.Append(mbtn) } + if m.Subject != "" { + subjectlabel := gtk.NewLabel(m.Subject) + subjectlabel.SetWrap(true) + subjectlabel.SetSelectable(true) + subjectlabel.SetHAlign(gtk.AlignFill) + subjectlabel.AddCSSClass("subject") + mainBox.Append(subjectlabel) + } + return mainBox } diff --git a/main.go b/main.go index 2aaf01d..35a2d34 100644 --- a/main.go +++ b/main.go @@ -11,6 +11,7 @@ import ( "github.com/diamondburned/gotk4/pkg/gio/v2" "github.com/diamondburned/gotk4/pkg/glib/v2" "github.com/diamondburned/gotk4/pkg/gtk/v4" + "github.com/gen2brain/beeep" "path/filepath" "github.com/BurntSushi/toml" @@ -29,7 +30,7 @@ import ( var loadedConfig lambdaConfig -var empty_dialog *gtk.Label +var empty_dialog *gtk.Image // var msgs *gtk.ListBox var content *gtk.Widgetter @@ -89,6 +90,15 @@ var cancelB64 string = base64.StdEncoding.EncodeToString(cancelBytes) var tagBytes []byte var tagB64 string = base64.StdEncoding.EncodeToString(tagBytes) + +//go:embed assets/lambda-disabled.png +var logoDisabledBytes []byte +var logoDisabledB64 string = base64.StdEncoding.EncodeToString(logoDisabledBytes) + +//go:embed assets/group.png +var groupBytes []byte +var groupB64 string = base64.StdEncoding.EncodeToString(groupBytes) + var clientAssets map[string]gdk.Paintabler = make(map[string]gdk.Paintabler) var lockedJIDs map[string]bool = make(map[string]bool) @@ -165,6 +175,23 @@ func init() { loader.Close() clientAssets["outcast"] = gdk.NewTextureForPixbuf(loader.Pixbuf()) + + + loader = gdkpixbuf.NewPixbufLoader() + + disabledLogoData, _ := base64.StdEncoding.DecodeString(logoDisabledB64) + loader.Write(disabledLogoData) + loader.Close() + + clientAssets["disabled_logo"] = gdk.NewTextureForPixbuf(loader.Pixbuf()) + + loader = gdkpixbuf.NewPixbufLoader() + + groupData, _ := base64.StdEncoding.DecodeString(groupB64) + loader.Write(groupData) + loader.Close() + + clientAssets["group"] = gdk.NewTextureForPixbuf(loader.Pixbuf()) } func main() { @@ -307,7 +334,8 @@ func main() { return } - if presence.Error != *new(stanza.Err) { + if presence.Error.Reason != "" { + beeep.Notify(fmt.Sprintf("%s : %s", presence.From, presence.Error.Reason), presence.Error.Text, cancelBytes) return } @@ -468,6 +496,7 @@ func activate(app *gtk.Application) { fileMenu := gio.NewMenu() fileMenu.Append("Join MUC", "app.join") fileMenu.Append("Start DM", "app.dm") + fileMenu.Append("Destroy MUC", "app.destroymuc") helpMenu := gio.NewMenu() helpMenu.Append("About", "app.about") @@ -478,6 +507,28 @@ func activate(app *gtk.Application) { a.SetVisible(true) }) + destroymucAction := gio.NewSimpleAction("destroymuc", nil) + destroymucAction.ConnectActivate(func(p *glib.Variant) { + cur, ok := tabs.Load(current) + if ok { + cur := cur.(*chatTab) + if cur.isMuc { + client.SendRaw(fmt.Sprintf(` + + + + User requested + + + + `, clientroot.Session.BindJid, current, JidMustParse(clientroot.Session.BindJid).Bare())) + } + } + }) + joinAction := gio.NewSimpleAction("join", nil) joinAction.ConnectActivate(func(p *glib.Variant) { box := gtk.NewBox(gtk.OrientationVertical, 0) @@ -540,6 +591,7 @@ func activate(app *gtk.Application) { app.AddAction(joinAction) app.AddAction(aboutAction) + app.AddAction(destroymucAction) the_menu.AppendSubmenu("File", fileMenu) the_menu.AppendSubmenu("Help", helpMenu) @@ -552,7 +604,8 @@ func activate(app *gtk.Application) { window.Window.SetDefaultSize(500, 500) menu = gtk.NewBox(gtk.OrientationVertical, 0) - empty_dialog = gtk.NewLabel("You are not focused on any chats.") + empty_dialog = gtk.NewImageFromPaintable(clientAssets["disabled_logo"]) + empty_dialog.SetPixelSize(100) empty_dialog.SetVExpand(true) scroller = gtk.NewScrolledWindow() diff --git a/style.css b/style.css index c0c4475..39db015 100644 --- a/style.css +++ b/style.css @@ -39,3 +39,7 @@ color: black; font-family: monospace; } + +.subject { + color: lime; +}