IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Ubuntu 托盘程序 开发 -> 正文阅读

[系统运维]Ubuntu 托盘程序 开发

开发环境搭建

  • Ubuntu 14 Desktop
    • Lib GTK3
    • Lib Appindicator3

GTK3开发环境安装:

sudo apt-get install libgtk-3-dev make gcc pkg-config

托盘图标开发包安装:

sudo apt-get install -y libappindicator3-dev

GTK Hello World!

首先我们来尝试一下由GTK程序的Hello World,创建一个标题为"Window" 的GTK窗口

#include <gtk/gtk.h>

int main (int argc, char *argv[]){
    GtkWidget *window;
    gtk_init (&argc, &argv);
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (window), "Window");
    g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
    gtk_widget_show (window);
    gtk_main ();
    return 0;
}

程序编译

sudo gcc `pkg-config --cflags gtk+-3.0` hello.c -o hello `pkg-config --libs gtk+-3.0`

普通用户编译可能会造成 (.text+0x18):对‘main’未定义的引用 错误

在这里插入图片描述
到这里我们已经证明了我们的开发环境已经可用。

托盘程序

我们需要创建一个如下的状态栏图标程序:

在这里插入图片描述

托盘程序使用GTK和appindicator3 API实现,使用GTK创建UI主程序和提供菜单,使用libappindicator创建状态栏的图标。

main.c 示例代码如下:

#include <stdio.h>
#include <gtk/gtk.h>
#include <libappindicator/app-indicator.h>
#include <string.h>

#define APPINDICATOR_ID "MyFirstTrayApp"
#define ICON "/tmp/tmp.MV7CyDttpW/cmake-build-debug/icon.ico"


/**
 * 创建菜单
 * @return 菜单
 */
GtkMenuShell *create_menu();

int main() {
    AppIndicator *indicator      = NULL;
    GtkMenuShell *indicator_menu = NULL;

    // 1. 初始化GTK
    if (gtk_init_check(0, NULL) == FALSE) {
        return -1;
    }
    //  2. app-indicator 创建应用程序状态栏的图标
    //  注意:图标文件名必须是绝对路径否则会出现无法显示问题。
    indicator = app_indicator_new(APPINDICATOR_ID, ICON,
                                  APP_INDICATOR_CATEGORY_APPLICATION_STATUS);
    app_indicator_set_status(indicator, APP_INDICATOR_STATUS_ACTIVE);
    // 设置图标
    app_indicator_set_icon(indicator, ICON);
    // 3. 初始化菜单项
    indicator_menu = create_menu();
    // 4. 关联到状态栏
    app_indicator_set_menu(indicator, GTK_MENU (indicator_menu));
    // 5. 启动GTK程序,并阻塞进程。
    gtk_main();
    return 0;
}

/**
 * 按钮回调函数
 */
void hello_cb(GtkMenuItem *item, gpointer data) {
    printf(">> Hello world!\n");
}

GtkMenuShell *create_menu() {
    GtkWidget    *hello_item;
    GtkWidget    *quit_item;
    GtkMenuShell *indicator_menu;

    indicator_menu = (GtkMenuShell *) gtk_menu_new();

    hello_item = gtk_check_menu_item_new_with_label("你好!");
    // 菜单项定义
    gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(hello_item), FALSE);
    // 表示可交互
    gtk_widget_set_sensitive(hello_item, TRUE);
    // 设置点击事件回调函数
    g_signal_connect(hello_item, "activate", G_CALLBACK(hello_cb), NULL);


    quit_item = gtk_check_menu_item_new_with_label("退出");
    gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(quit_item), FALSE);
    gtk_widget_set_sensitive(quit_item, TRUE);
    g_signal_connect(quit_item, "activate", G_CALLBACK(gtk_main_quit), NULL);

    // 显示菜单项目,并添加到菜单中。
    gtk_widget_show(hello_item);
    gtk_widget_show(quit_item);
    gtk_menu_shell_append(indicator_menu, hello_item);
    gtk_menu_shell_append(indicator_menu, quit_item);

    return indicator_menu;
}

注意:图标文件名必须要是绝对路径,否则图标无法显示!

  1. 初始GTK。
  2. 使用Appindicator3 API 创建并初始化Appindicator。
  3. 使用GTK创建菜单,并把菜单关联到Appindicator,菜单包含两个功能,控制台打印字符串、退出程序。
  4. 启动程序。

编译程序

sudo gcc `pkg-config --cflags gtk+-3.0 appindicator3-0.1` main.c -o main `pkg-config --libs gtk+-3.0 appindicator3-0.1`

运行程序

在这里插入图片描述

CMake进行项目管理

CMake可以非常方便的对C/C++工程进行管理,减少编译连接对开发者的负担,使用上面程序作为工程文件,创建一个CMake项目。

首先,安装CMake:

sudo apt-get install cmake
  1. 创建目录UbuntuTray
  2. 把刚才创建的main.cicon.ico文件复制到目录中。
  3. 创建CMakeLists.txt

如下所示:

在这里插入图片描述

CMakeLists.txt内容:

cmake_minimum_required(VERSION 2.8)
project(UbuntuTray C)

set(CMAKE_C_STANDARD 99)

add_executable(main main.c)

如果是一个普通程序,那么上面内容表示生成编译生成一个名为main的可执行程序。

由于我们的程序使用到了gtk+-3.0appindicator3两个库,编译时使用需要指明头文件位置,连接时需要指明需要连接的动态库。

之前gcc编译命令中,我们使用pkg-config程序来查找这2个库的头文件(pkg-config --cflags参数)和动态库(pkg-config --libs参数)。

在CMake中我们需要使用下面语法来进行查找和使用

完整的CMakeLists.txt内容:

cmake_minimum_required(VERSION 2.8)
project(UbuntuTray C)

set(CMAKE_C_STANDARD 99)

# pkg-config --cflags gtk+-3.0 appindicator3-0.1
# pkg-config --libs   gtk+-3.0 appindicator3-0.1
find_package(PkgConfig REQUIRED)
pkg_check_modules(GTK3 REQUIRED gtk+-3.0)
pkg_check_modules(AppI3 REQUIRED appindicator3-0.1)

# 添加头文件目录
include_directories(${GTK3_INCLUDE_DIRS} ${AppI3_INCLUDE_DIRS})
# 添加链接库目录
link_directories(${GTK3_LINK_LIBRARIES} ${AppI3_LINK_LIBRARIES})

add_executable(main main.c)
# 可执行程序链接库
target_link_libraries(main ${GTK3_LIBRARIES} ${AppI3_LIBRARIES})
  • 首先使用find_package(PkgConfig REQUIRED)引入pkg-config,请确保已经在系统中安装pkg-config
  • 使用pkg_check_modules(变量名 REQUIRED 包名称) 查找相关的模块,如果模块存在那么会以变量名 作为前缀设置一些列的变量,如:头文件路径 _INCLUDE_DIRS、依赖包_LIBRARIES
  • 接下来添加使用之前设置变量来添加头文件和链接库的目录。
  • 最后为可执行程序链接冬天库。

创建用于构建的目录,并运行cmake构建Makefile等相关文件

mkdir build
cd build/
cmake ..

运行后会在build目录生成构建相关的文件

在这里插入图片描述

可以看到已经生成了Makefile,我们接下来我们使用make命令编译程序即可:

make

可以看到我们的main可执行程序已经编译完成

在这里插入图片描述

运行程序可以看到与我们之前使用gcc命令编译的程序一样效果。

参考文献

[1]. ubuntu . ApplicationIndicators . https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators
[2]. gtk . gtk3 . https://docs.gtk.org/gtk3/
[3]. 博客园 . 用cmake构建gtk程序 . ChrisZZ . 2019.06 . https://www.cnblogs.com/zjutzz/p/10959211.html
[4]. 空心菜 . cmake使用pkg-config配置工程依赖 . 2021.03 . https://kxcblog.com/post/dev/cmake-pkg-config/
[5]. github . Serge Zaitsev . zserge/tray . https://github.com/zserge/tray
[6]. github getlantern . getlantern/systray . https://github.com/getlantern/systray

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 18:00:11  更:2022-03-12 18:00:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 1:33:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码