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许可证。

使用说明

  1. 首先确保安装了所有必要的依赖
  2. 导入github.com/gopherlibs/appindicator/appindicator
  3. 创建应用指示器实例并设置图标
  4. 创建GTK菜单并添加菜单项
  5. 将菜单绑定到指示器
  6. 启动GTK主循环

这个库与Go的gtk3绑定(gotk3)兼容,可以很好地配合使用。


更多关于golang实现Linux应用指示器功能的插件库AppIndicator Go的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于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()
}

注意事项

  1. 应用指示器需要运行在GTK主循环中
  2. 图标可以是系统主题中的图标名或自定义图标的绝对路径
  3. 在Ubuntu等使用GNOME的系统中,可能需要安装额外的扩展来支持应用指示器
  4. 对于更复杂的需求,可能需要结合其他GTK功能一起使用

这个库提供了简单易用的接口来创建Linux系统托盘应用,非常适合需要后台运行并提供快速访问功能的应用程序。

回到顶部