golang实现Linux应用指示器功能的插件库AppIndicator Go的使用
Golang实现Linux应用指示器功能的插件库AppIndicator Go的使用
AppIndicator Go是Go语言对libayatana-appindicator3 C库的绑定,允许应用程序将菜单导出到Unity菜单栏中。
功能特点
- 基于KSNI,可在KDE中工作
- 如果上述环境不可用,会回退到通用系统托盘支持
- 支持的环境包括:
- Unity
- GNOME Shell(需安装扩展)
- Budgie Desktop(需安装小程序)
- MATE(需安装小程序)
- Xfce(需安装插件)
依赖安装
在基于Debian的系统上安装依赖:
sudo apt install libayatana-appindicator3-dev libgtk-3-dev
当然还需要安装Go和cgo支持。
构建方法
可以使用项目提供的build.sh
脚本来构建示例:
./build.sh -v examples/simple/main.go
示例代码
下面是一个完整的示例代码,展示如何使用AppIndicator Go创建系统托盘图标和菜单:
package main
import (
"github.com/gotk3/gotk3/gtk"
"github.com/gopherlibs/appindicator/appindicator"
)
func main() {
// 初始化GTK
gtk.Init(nil)
// 创建应用指示器
indicator := appindicator.New("example", "indicator-messages", appindicator.CategoryApplicationStatus)
// 设置图标
indicator.SetIcon("indicator-messages")
indicator.SetStatus(appindicator.StatusActive)
// 创建菜单
menu, err := gtk.MenuNew()
if err != nil {
panic(err)
}
// 添加菜单项
item1, err := gtk.MenuItemNewWithLabel("选项1")
if err != nil {
panic(err)
}
item1.Connect("activate", func() {
println("选项1被点击")
})
menu.Append(item1)
// 添加分隔符
separator, err := gtk.SeparatorMenuItemNew()
if err != nil {
panic(err)
}
menu.Append(separator)
// 添加退出选项
quitItem, err := gtk.MenuItemNewWithLabel("退出")
if err != nil {
panic(err)
}
quitItem.Connect("activate", func() {
gtk.MainQuit()
})
menu.Append(quitItem)
// 显示所有菜单项
menu.ShowAll()
// 设置菜单
indicator.SetMenu(menu)
// 启动GTK主循环
gtk.Main()
}
项目历史
AppIndicator Go是Dawid Dziurla的go-appindicator项目的一个分支,原项目已被弃用和归档。本项目在原项目的基础上继续开发,遵循相同的MIT许可证。
使用说明
- 首先确保安装了所有必要的依赖
- 导入
github.com/gopherlibs/appindicator/appindicator
包 - 创建应用指示器实例并设置图标
- 创建GTK菜单并添加菜单项
- 将菜单绑定到指示器
- 启动GTK主循环
这个库与Go的gtk3绑定(gotk3)兼容,可以很好地配合使用。
更多关于golang实现Linux应用指示器功能的插件库AppIndicator Go的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang实现Linux应用指示器功能的插件库AppIndicator Go的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用AppIndicator Go实现Linux应用指示器功能
AppIndicator Go是一个Golang库,用于在Linux系统上创建应用指示器(Application Indicators),这些指示器通常出现在桌面环境的系统托盘区域(如Ubuntu的顶部面板)。
安装
首先需要安装依赖项:
sudo apt-get install libappindicator3-dev
然后获取Go库:
go get github.com/getlantern/appindicator
基本使用示例
下面是一个简单的示例,展示如何创建一个带有菜单的应用指示器:
package main
import (
"github.com/getlantern/appindicator"
"github.com/gotk3/gotk3/glib"
"github.com/gotk3/gotk3/gtk"
)
func main() {
// 初始化GTK
gtk.Init(nil)
// 创建应用指示器
indicator := appindicator.New("my-app-indicator", "my-icon-name", appindicator.CategoryApplicationStatus)
// 设置图标(可以使用绝对路径或主题中的图标名)
indicator.SetIcon("/usr/share/icons/hicolor/48x48/apps/myapp.png")
// 或者使用主题中的图标
// indicator.SetIcon("system-run")
// 创建菜单
menu, _ := gtk.MenuNew()
// 添加菜单项
item1, _ := gtk.MenuItemNewWithLabel("选项1")
item1.Connect("activate", func() {
println("选项1被点击")
})
menu.Append(item1)
item2, _ := gtk.MenuItemNewWithLabel("选项2")
item2.Connect("activate", func() {
println("选项2被点击")
})
menu.Append(item2)
// 分隔线
separator, _ := gtk.SeparatorMenuItemNew()
menu.Append(separator)
// 退出项
quitItem, _ := gtk.MenuItemNewWithLabel("退出")
quitItem.Connect("activate", func() {
gtk.MainQuit()
})
menu.Append(quitItem)
// 显示所有菜单项
menu.ShowAll()
// 将菜单附加到指示器
indicator.SetMenu(menu)
// 设置指示器状态为活跃
indicator.SetStatus(appindicator.StatusActive)
// 启动GTK主循环
gtk.Main()
}
高级功能
动态更新图标
// 可以动态更改图标
indicator.SetIcon("another-icon-name")
设置工具提示
indicator.SetTitle("我的应用程序")
indicator.SetLabel("状态: 运行中", "general")
处理点击事件
indicator.Connect("scroll-event", func(direction uint, delta float64) {
println("滚动事件:", direction, delta)
})
动画图标
可以通过定时更换图标实现简单的动画效果:
go func() {
icons := []string{"icon1", "icon2", "icon3"}
for {
for _, icon := range icons {
glib.IdleAdd(func() {
indicator.SetIcon(icon)
})
time.Sleep(500 * time.Millisecond)
}
}
}()
完整示例:系统监控指示器
下面是一个更完整的示例,显示CPU使用率:
package main
import (
"fmt"
"io/ioutil"
"strconv"
"strings"
"time"
"github.com/getlantern/appindicator"
"github.com/gotk3/gotk3/gtk"
)
func getCPUSample() (idle, total uint64) {
contents, err := ioutil.ReadFile("/proc/stat")
if err != nil {
return
}
lines := strings.Split(string(contents), "\n")
for _, line := range lines {
fields := strings.Fields(line)
if fields[0] == "cpu" {
numFields := len(fields)
for i := 1; i < numFields; i++ {
val, err := strconv.ParseUint(fields[i], 10, 64)
if err != nil {
fmt.Println("Error:", i, fields[i], err)
}
total += val
if i == 4 { // idle是第5个字段(从1开始)
idle = val
}
}
return
}
}
return
}
func updateCPUUsage(indicator *appindicator.Indicator) {
var idle1, total1 uint64
idle1, total1 = getCPUSample()
time.Sleep(3 * time.Second)
idle2, total2 := getCPUSample()
idleTicks := float64(idle2 - idle1)
totalTicks := float64(total2 - total1)
cpuUsage := 100 * (totalTicks - idleTicks) / totalTicks
indicator.SetLabel(fmt.Sprintf("CPU: %.1f%%", cpuUsage), "")
}
func main() {
gtk.Init(nil)
indicator := appindicator.New("cpu-monitor", "utilities-system-monitor", appindicator.CategoryApplicationStatus)
indicator.SetStatus(appindicator.StatusActive)
menu, _ := gtk.MenuNew()
quitItem, _ := gtk.MenuItemNewWithLabel("退出")
quitItem.Connect("activate", gtk.MainQuit)
menu.Append(quitItem)
menu.ShowAll()
indicator.SetMenu(menu)
// 定期更新CPU使用率
go func() {
for {
updateCPUUsage(indicator)
}
}()
gtk.Main()
}
注意事项
- 应用指示器需要运行在GTK主循环中
- 图标可以是系统主题中的图标名或自定义图标的绝对路径
- 在Ubuntu等使用GNOME的系统中,可能需要安装额外的扩展来支持应用指示器
- 对于更复杂的需求,可能需要结合其他GTK功能一起使用
这个库提供了简单易用的接口来创建Linux系统托盘应用,非常适合需要后台运行并提供快速访问功能的应用程序。