在日常使用中,难免会用到GTK写的程序。GTK程序的外观可以通过oxygen-gtk来模拟KDE的样式,但是文件对话框却没办法使用KDE提供的对话框。而文件对话框中的一个比较有用的功能“最近使用的文件”列表,也是没有办法在GTK和KDE之间互通;给人造成困扰。Recently-Used Files Records Synchronizer 就是为了解决这个问题而编写的一个辅助的小程序。该程序能够在GTK和KDE之间同步“最近使用的文件”列表,使两者能更加互通。
有关“最近使用的文件”列表
一个有用的列表
“最近使用的文件 ”这个功能,对于用户,有些像cache对于CPU。cache里缓存的是最近使用的内存数据,而在“最近使用的文件”列表里,缓存的是用户最近打开和保存的文件的快捷链接。如果某个文件最近操作过,那么从这个列表里能够很方便的找到,从而避免了一层一层进入文件夹的困扰。虽然在文件对话框的侧栏中,可以保存若干的快捷书签,也可以达到快速进入某个目录的目的,但是快捷书签的数目一般不会太多(否则从这些书签中找到自己想去的位置,也是一个麻烦的问题),所能覆盖的范围一般仅限于常用文件夹;而且进入特定目录后(例如’工作’目录),还是需要继续寻找特定的文件才行。如果可以从“最近使用的文件”列表里直接定位的话,能方便许多。
什么时候这个列表起作用
好多童鞋一般不怎么用这个列表,原因之一就是这个列表不可靠。啥叫不可靠咧,有时候明明在某个KDE程序中通过菜单打开、编辑了一个文件,但是这个文件却没有出现在“最近使用的文件”列表里,从文件对话框打开时,还得再次找;似乎这个列表没有记录下什么。GTK也是同理。所以,索性不用了。
其实这种现象和该列表的实现机制有关。
桌面环境 | 操作方式 | 存储方式 |
---|---|---|
Gnome(GTK) | GLib:GtkRecentManager类 | 文件$HOME/.local/share/recently-used.xbel |
KDE | KRecentDocument类 | 在文件夹$HOME/.kde4/share/apps/RecentDocuments/下的众多desktop文件 |
在程序中,需要显式的对有关类进行操作,才能记录到“最近使用的文件”列表。而大部分程序都不会主动调用这些类的有关方法,因此起作用的范围有限。为了增强这个列表的作用,GTK和KDE都在其自身提供的文件对话框中,隐含内置了有关操作的处理。当用户用GTK或者KDE自身提供的文件对话框(不是WPS那种自定义的;包括打开、保存两种对话框)选择文件并打开时,选择的文件就会被自动记录到有关的列表中去。这时就能在列表里找到文件。而当用户通过程序自身的“最近打开文件”列表打开文件时,如果这个程序没有主动向GTK或者KDE报告文件操作,就不会被系统的“最近使用的文件”列表记录。
有关Recently-Used Files Records Synchronizer
工作原理
每次程序启动时,自动做双向同步,将某个列表中出现而在另一个列表没出现的文件,添加过去。以后每隔一段时间(默认为2秒),调用GTK和KDE的有关API去查询当前的“最近使用文件”列表;比对两者的不同,将新增的文件,同步到另一个列表中。因为GTK和KDE中可以接受的“最近使用文件”列表的长度不同,因此两者不能保证完全一致;但可以保证,最近新增的某个记录,一定会反映到另一个列表中。
使用场景示例
写这个程序也是受一些日常使用中遇见的场景的启发。下面抛砖引玉的展示一个例子,权当说明这个程序为啥有一定用处。
例子:截图并上传
现在想截一张图,上传到iKDE.org上。截图使用的工具是Deepin-Screenshot,是基于PyGTK的程序,在保存图片时,用的是GTK的对话框。将图片保存到/tmp/下(也可以是某个更深层次的目录:例如/A/B/C/D/E/f.png,我的一些文档用的图片,一般都保存在类似这么深的文件夹下)。
然后利用Chrome浏览器上传。Chrome可以识别KDE,用的是KDialog来选择文件。这时利用’recentdocuments:/’(感谢@csslayer的劳动)来快速找到刚才我们截图保存的那张图片。
类似的场景还有:
- 利用Firefox下载了一个PDF文件,在Okular中打开时,可以直接从’recentdocuments:/’中找;
- 利用Chrome下载保存了一个图片(通过KDialog),然后在GIMP里打开时,直接从“最近使用的文件”列表中,按照“修改时间”降序排序,在很靠上的位置就可以找到刚才的文件;
- 利用WPS打开、编辑、保存了一个文件(通过KDialog打开/保存的),在Firefox中,给XX邮箱上传附件时(通过GTK文件选择对话框),直接通过“最近使用的文件”来选择文件。
ONE FEEDBACK