概述

Nautilus是Gnome环境下的文件管理器。

Nautilus支持extension,可以安装一些extension来扩展nautilus的功能。

一般在网上看到的nautilus extension都是javascript或是python开发的。但是由于个人更熟悉C/C++。这里找到了一个C的示例程序。

C语言Nautilus Extensions Example

上面的链接是github repo,以防万一,下面是打包的代码: 打包的代码

构建及安装

代码里只有一个源文件,源文件只有一百多行,编译为一个.so。 安装只需要把相应的.so复制到指定的extensions目录,即/usr/lib/nautilus/extensions-2.0/。

使能

要想使能这个extension,需要重启nautilus.

killall nautilus; nautilus

加载路径

/usr/lib/x86_64-linux-gnu/nautilus/extensions-3.0

系统里有好多其他组件的extensions加载路径,可以用命令find /usr -name "extensions*" -type d查看。

编译依赖

使用makefile的话,可以用

pkg-config --cflags libnautilus-extension查看包含头文件的路径。 可以用 pkg-config --libs libnautilus-extension查看链接的动态链接库。

cmake的话可以用:

find_package(PkgConfig REQUIRED)
pkg_check_modules(libnautilus-extension REQUIRED libnautilus-extension IMPORTED_TARGET)
add_library(xxxx SHARED src/nautilus_extension.cpp)
target_include_directories(xxxx
        PRIVATE ${GTKMM3_INCLUDE_DIRS}
        )
target_link_libraries(xxxx
        ${GTKMM3_LIBRARIES}
        PkgConfig::libnautilus-extension
        )

代码解析

这个extension以.so方式存在,nautilus启动时会加载这个so,并在启动和结束时调用两个主要的函数,即:

void nautilus_module_initialize (GTypeModule  *module);
void nautilus_module_shutdown (void);

这两个函数需要我们来实现。

在nautilus_module_initialize函数的实现中,我们需要向glib的类型系统注册一个glib的type(这里可以理解为用C语言实现的一个具备反射能力的class,对应java或C++中的类)。这个type就是我们这个extension的具体实现。

nautilus_module_initialize/shutdown有点类似于linux内核的module_init/exit,只是一个模块机制,并没有涉及具体功能。具体功能的提供需要我们实现另一个函数:

void nautilus_module_list_types (const GType **types, int *num_types);

nautilus_module_list_types向这个模块查询,你实现了哪些个extension,可以在出台中放置多个。