Rust桌面应用开发库freedesktop-desktop-entry的使用:解析和生成FreeDesktop规范的.desktop文件

Rust桌面应用开发库freedesktop-desktop-entry的使用:解析和生成FreeDesktop规范的.desktop文件

freedesktop-desktop-entry是一个用于高效解析FreeDesktop Desktop Entry文件的Rust库。

基本用法示例

以下是内容中提供的示例代码:

use freedesktop_desktop_entry::{default_paths, get_languages_from_env, Iter, PathSource};

fn main() {
    // 获取系统环境语言设置
    let locales = get_languages_from_env();

    // 遍历默认路径下的所有.desktop文件
    let entries = Iter::new(default_paths())
        .entries(Some(&locales))
        .collect::<Vec<_>>();
    
    // 打印每个条目信息
    for entry in entries {
        let path_src = PathSource::guess_from(&entry.path);

        println!("{:?}: {}\n---\n{}", path_src, entry.path.display(), entry);
    }
}

完整示例Demo

下面是一个更完整的示例,展示如何解析和生成.desktop文件:

use freedesktop_desktop_entry::{DesktopEntry, DesktopEntryWriter};
use std::path::Path;

fn main() {
    // 解析现有的.desktop文件
    let path = Path::new("/usr/share/applications/firefox.desktop");
    if let Ok(entry) = DesktopEntry::parse_file(path) {
        println!("应用名称: {}", entry.name().unwrap_or("未知"));
        println!("执行命令: {}", entry.exec().unwrap_or("未指定"));
        println!("图标: {}", entry.icon().unwrap_or("默认"));
    }

    // 创建一个新的.desktop文件
    let mut new_entry = DesktopEntry::new("application");
    new_entry.set_name("My Rust App");
    new_entry.set_exec("/usr/bin/my_rust_app");
    new_entry.set_icon("my-app-icon");
    new_entry.set_comment("A simple Rust application");
    new_entry.set_categories("Utility;Development");

    // 写入到文件
    let writer = DesktopEntryWriter::new(&new_entry);
    if let Err(e) = writer.write_to_file(Path::new("my_rust_app.desktop")) {
        eprintln!("写入.desktop文件失败: {}", e);
    }
}

许可证

该库使用Mozilla Public License 2.0 (MPL-2.0)许可证。这个许可证要求保留版权和许可证声明,并使得任何有意提交包含在工作中的贡献都以相同的许可证授权。


1 回复

freedesktop-desktop-entry库使用指南:解析和生成.desktop文件

简介

freedesktop-desktop-entry是一个Rust库,用于处理FreeDesktop规范的.desktop文件。这些文件是Linux桌面环境中常见的快捷方式/启动器文件,用于定义应用程序的元数据和启动方式。

安装

在Cargo.toml中添加依赖:

[dependencies]
freedesktop-desktop-entry = "0.4"

基本用法

解析.desktop文件

use freedesktop_desktop_entry::{DesktopEntry, default_paths};
use std::path::Path;

fn main() {
    let path = Path::new("/usr/share/applications/firefox.desktop");
    match DesktopEntry::try_from(&path) {
        Ok(entry) => {
            println!("Name: {}", entry.name().unwrap_or_default());
            println!("Exec: {}", entry.exec().unwrap_or_default());
            println!("Icon: {}", entry.icon().unwrap_or_default());
        }
        Err(e) => eprintln!("Error parsing desktop file: {}", e),
    }
}

生成.desktop文件

use freedesktop_desktop_entry::{DesktopEntry, DesktopType};
use std::path::PathBuf;

fn main() -> std::io::Result<()> {
    let mut entry = DesktopEntry::new("MyApp");
    entry.set_type(DesktopType::Application);
    entry.set_name("My Awesome Application");
    entry.set_exec("myapp %F");
    entry.set_icon("myapp-icon");
    entry.set_comment("A great application written in Rust");
    entry.set_categories(vec!["Utility", "Development"]);
    
    let path = PathBuf::from("myapp.desktop");
    entry.write_to(&path)?;
    
    Ok(())
}

高级功能

查找应用程序

use freedesktop_desktop_entry::{DesktopEntry, default_paths};

fn find_application(name: &str) -> Option<DesktopEntry> {
    for path in default_paths() {
        if let Ok(entries) = path.read_dir() {
            for entry in entries.flatten() {
                if let Ok(desktop_entry) = DesktopEntry::try_from(&entry.path()) {
                    if desktop_entry.name() == Some(name) {
                        return Some(desktop_entry);
                    }
                }
            }
        }
    }
    None
}

验证.desktop文件

use freedesktop_desktop_entry::{DesktopEntry, ValidationLevel};

fn validate_desktop_file(path: &str) {
    let entry = DesktopEntry::try_from(path).unwrap();
    let result = entry.validate(ValidationLevel::Strict);
    
    if result.is_valid() {
        println!("Desktop file is valid!");
    } else {
        println!("Validation errors:");
        for error in result.errors() {
            println!("- {}", error);
        }
    }
}

常见字段

.desktop文件支持许多标准字段,以下是常用的一些:

  • Type: Application, Link或Directory
  • Name: 应用程序名称
  • GenericName: 通用名称
  • Comment: 描述
  • Icon: 图标名称或路径
  • Exec: 执行命令
  • Categories: 应用程序类别
  • Keywords: 关键词列表
  • StartupNotify: 是否支持启动通知

注意事项

  1. .desktop文件必须符合FreeDesktop规范才能被桌面环境正确识别
  2. 生成的.desktop文件通常需要安装到/usr/share/applications/~/.local/share/applications/才能生效
  3. 对于GUI应用程序,通常需要设置Terminal=false

这个库简化了在Rust中处理.desktop文件的过程,使得创建和解析Linux桌面应用程序的启动器变得更加容易。

完整示例

下面是一个完整的示例,展示如何创建一个.desktop文件并验证它:

use freedesktop_desktop_entry::{DesktopEntry, DesktopType, ValidationLevel};
use std::path::PathBuf;

fn main() -> std::io::Result<()> {
    // 创建一个新的桌面条目
    let mut entry = DesktopEntry::new("SampleApp");
    
    // 设置基本属性
    entry.set_type(DesktopType::Application);
    entry.set_name("Sample Application");
    entry.set_generic_name("Sample App");
    entry.set_comment("This is a sample desktop entry");
    entry.set_exec("sample-app %F");
    entry.set_icon("sample-app-icon");
    entry.set_categories(vec!["Utility", "Development"]);
    entry.set_keywords(vec!["sample", "test"]);
    entry.set_startup_notify(true);
    entry.set_terminal(false);
    
    // 指定输出路径
    let path = PathBuf::from("sample-app.desktop");
    
    // 写入文件
    entry.write_to(&path)?;
    println!("Desktop file created at: {:?}", path);
    
    // 验证文件
    let validation_result = entry.validate(ValidationLevel::Strict);
    if validation_result.is_valid() {
        println!("Desktop file is valid!");
    } else {
        println!("Validation errors:");
        for error in validation_result.errors() {
            println!("- {}", error);
        }
    }
    
    Ok(())
}

这个完整示例展示了:

  1. 创建一个新的桌面条目
  2. 设置所有常见字段
  3. 将条目写入文件
  4. 验证生成的文件是否符合规范

您可以根据需要修改字段值,创建适合您应用程序的.desktop文件。

回到顶部