diff --git a/SUMMARY.md b/SUMMARY.md index 77be2ce..d2852b6 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -20,4 +20,5 @@ * [插件的加载和注册](wen-jian-guan-li-qi-kuo-zhan-shi-xian/cha-jian-de-jia-zai-he-zhu-ce.md) * [插件的回调](wen-jian-guan-li-qi-kuo-zhan-shi-xian/cha-jian-de-hui-diao.md) * [怎样扩展](wen-jian-guan-li-qi-kuo-zhan-shi-xian/zen-yang-xie-peony-cha-jian.md) +* [正文之后](zheng-wen-zhi-hou.md) diff --git a/wen-jian-guan-li-qi-kuo-zhan-shi-xian/cha-jian-de-jia-zai-he-zhu-ce.md b/wen-jian-guan-li-qi-kuo-zhan-shi-xian/cha-jian-de-jia-zai-he-zhu-ce.md index 9ce9788..faa8de6 100644 --- a/wen-jian-guan-li-qi-kuo-zhan-shi-xian/cha-jian-de-jia-zai-he-zhu-ce.md +++ b/wen-jian-guan-li-qi-kuo-zhan-shi-xian/cha-jian-de-jia-zai-he-zhu-ce.md @@ -264,5 +264,73 @@ peony_module_add_type (GType type) 用于管理加载好的模块的,这样插件的加载就已经完成了,我们进入注册环节。(以上代码在libpeony-private/peony-module\*中,接下来的代码在libpeony-private/peony-extensions\*中) +```c +void +peony_extension_register (gchar *filename, GObject *module) +{ + gboolean ext_state = TRUE; // new extensions are enabled by default. + gboolean ext_python = FALSE; + gchar *ext_filename; + + ext_filename = g_strndup (filename, strlen(filename) - 3); + ext_state = peony_extension_get_state (ext_filename); + + if (g_str_has_suffix (filename, ".py")) { + ext_python = TRUE; + } + + Extension *ext = extension_new (ext_filename, ext_state, ext_python, module); + peony_extensions = g_list_append (peony_extensions, ext); +} +``` + +peony\_extensions同样是一个用于管理插件的全局的GList指针,我们可以看到插件的名字就是so或者py文件的basename,我们看extension\_new: + +```c +static Extension * +extension_new (gchar *filename, gboolean state, gboolean python, GObject *module) +{ + Extension *ext; + GKeyFile *extension_file; + gchar *extension_filename; + + ext = g_new0 (Extension, 1); + ext->filename = filename; + ext->name = NULL; + ext->description = NULL; + ext->author = NULL; + ext->copyright = NULL; + ext->version = NULL; + ext->website = NULL; + ext->state = state; + ext->module = module; + + extension_file = g_key_file_new (); + extension_filename = g_strdup_printf(PEONY_DATADIR "/extensions/%s.peony-extension", filename); + if (g_key_file_load_from_file (extension_file, extension_filename, G_KEY_FILE_NONE, NULL)) + { + ext->name = g_key_file_get_locale_string (extension_file, PEONY_EXTENSION_GROUP, "Name", NULL, NULL); + ext->description = g_key_file_get_locale_string (extension_file, PEONY_EXTENSION_GROUP, "Description", NULL, NULL); + ext->icon = g_key_file_get_string (extension_file, PEONY_EXTENSION_GROUP, "Icon", NULL); + ext->author = g_key_file_get_string_list (extension_file, PEONY_EXTENSION_GROUP, "Author", NULL, NULL); + ext->copyright = g_key_file_get_string (extension_file, PEONY_EXTENSION_GROUP, "Copyright", NULL); + ext->version = g_key_file_get_string (extension_file, PEONY_EXTENSION_GROUP, "Version", NULL); + ext->website = g_key_file_get_string (extension_file, PEONY_EXTENSION_GROUP, "Website", NULL); + } + g_key_file_free (extension_file); + g_free (extension_filename); + + if (python) + { + ext->name = g_strconcat("Python: ", filename, NULL); + ext->description = "Python-peony extension"; + } + + return ext; +} +``` + +其实最关键的只有filename和module,其它的可以没有,这个.peony-extension文件只是一个配置文件,能够使得文件管理器管理插件时显示的信息更全面而已,到这里注册流程也结束了。简单的来说,extension是一层module的封装,只是便于module插件的管理罢了。 +我们可以看出,整个加载和注册流程走完,我们的插件都没有被用到,这就说明插件不是一加载就触发的,我们下面需要寻找插件的触发是在何处。 diff --git a/wen-jian-guan-li-qi-kuo-zhan-shi-xian/zen-yang-xie-peony-cha-jian.md b/wen-jian-guan-li-qi-kuo-zhan-shi-xian/zen-yang-xie-peony-cha-jian.md index 7fbdc47..42ef017 100644 --- a/wen-jian-guan-li-qi-kuo-zhan-shi-xian/zen-yang-xie-peony-cha-jian.md +++ b/wen-jian-guan-li-qi-kuo-zhan-shi-xian/zen-yang-xie-peony-cha-jian.md @@ -2,7 +2,13 @@ ## 基于现有架构 -以上述菜单插件为例,我们首先需要实现PeonyModule的3个方法(list\_pytypes不用),然后 +以上述菜单插件为例,我们需要实现PeonyModule的定义3个方法(list\_pytypes不用),同时我们也需要实现菜单扩展PeonyMenuProvider的get\_file\_items接口。 我们可以参考现有的peony-extensions源码,这并不是很难的流程,关键在于获取回调的数据后我们该怎么做。 +## 从架构上扩展 + +我们既然已经知道插件的加载注册以及回调的原理,完全可以自己定义一个新的插件接口。 + +举一个例子而言,我们完全可以在打开文件的时候增加一个插件回调的接口,然后编写一个对应的插件安装到系统中,每次打开文件的时候就能够获取文件的信息,并且做一些处理。和一般插件一样如果我们不再需要这个功能,删掉对应的so库或者在插件管理选项中禁用就可以了。 + diff --git a/zheng-wen-zhi-hou.md b/zheng-wen-zhi-hou.md new file mode 100644 index 0000000..4ef36d4 --- /dev/null +++ b/zheng-wen-zhi-hou.md @@ -0,0 +1,14 @@ +# 正文之后 + +一下的内容仅代表个人的观点,大家可以略过。 + +### 文件管理器的本质就是一个桌面应用 + +文件管理器有很多,远不止peony一个,也不是所有文件管理器都和peony承担的工作一样的,比如nautilus,它就不需要承担拉起桌面的工作。文件管理器的本职工作就是提供一个与文件的ui交互界面而已,我认为只要做好这一点,就是一个好项目了,其它的只是可选项,对于可选项,我们可以分解成独立的问题再考虑。 + +之前向nautilus提交issue的时候,我了解到了他们的设计理念,文件管理器永远不会处理gvfs/gio做不到的事情。如果抛开后台服务,还有session等等,它本身就只是一个图形代理而已,所有对文件的操作还是回到了gio上。我们不应该在文件管理器中去做文件系统架构层面的工作,所以我们首要考虑的问题就能够简化成怎么提供一个稳定可靠的gio图形操作端。哪怕我们抛弃了gio,选择了kio或者自己研发一个vfs系统,我们也应该遵循这个理念。 + + + + +