Skip to content

Commit

Permalink
Updates zheng-wen-zhi-hou.md
Browse files Browse the repository at this point in the history
Auto commit by GitBook Editor
  • Loading branch information
Yue-Lan committed Jun 11, 2019
1 parent 03c0da1 commit 9a14cb6
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 1 deletion.
1 change: 1 addition & 0 deletions SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Original file line number Diff line number Diff line change
Expand Up @@ -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插件的管理罢了。
我们可以看出,整个加载和注册流程走完,我们的插件都没有被用到,这就说明插件不是一加载就触发的,我们下面需要寻找插件的触发是在何处。
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,13 @@

## 基于现有架构

以上述菜单插件为例,我们首先需要实现PeonyModule的3个方法(list\_pytypes不用),然后
以上述菜单插件为例,我们需要实现PeonyModule的定义3个方法(list\_pytypes不用),同时我们也需要实现菜单扩展PeonyMenuProvider的get\_file\_items接口。

我们可以参考现有的peony-extensions源码,这并不是很难的流程,关键在于获取回调的数据后我们该怎么做。

## 从架构上扩展

我们既然已经知道插件的加载注册以及回调的原理,完全可以自己定义一个新的插件接口。

举一个例子而言,我们完全可以在打开文件的时候增加一个插件回调的接口,然后编写一个对应的插件安装到系统中,每次打开文件的时候就能够获取文件的信息,并且做一些处理。和一般插件一样如果我们不再需要这个功能,删掉对应的so库或者在插件管理选项中禁用就可以了。

14 changes: 14 additions & 0 deletions zheng-wen-zhi-hou.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# 正文之后

一下的内容仅代表个人的观点,大家可以略过。

### 文件管理器的本质就是一个桌面应用

文件管理器有很多,远不止peony一个,也不是所有文件管理器都和peony承担的工作一样的,比如nautilus,它就不需要承担拉起桌面的工作。文件管理器的本职工作就是提供一个与文件的ui交互界面而已,我认为只要做好这一点,就是一个好项目了,其它的只是可选项,对于可选项,我们可以分解成独立的问题再考虑。

之前向nautilus提交issue的时候,我了解到了他们的设计理念,文件管理器永远不会处理gvfs/gio做不到的事情。如果抛开后台服务,还有session等等,它本身就只是一个图形代理而已,所有对文件的操作还是回到了gio上。我们不应该在文件管理器中去做文件系统架构层面的工作,所以我们首要考虑的问题就能够简化成怎么提供一个稳定可靠的gio图形操作端。哪怕我们抛弃了gio,选择了kio或者自己研发一个vfs系统,我们也应该遵循这个理念。





0 comments on commit 9a14cb6

Please sign in to comment.