为Linux Mint Cinnamon的日历小程序增加中国农历显示以及其它部分参数优化

我最近使用Linux Mint Xfce的时间比较多,这个操作系统虽然运行效率高,占用资源少,但是感觉Xfce桌面稳定性还存在不足,经常出现莫名其妙的画面抖动及部分区域出现花屏的现象,还容易出现使用者误删面板、应用程序加入到面板发生错误的情况,虽然不太影响使用,但是使用体验还是要差一些。本月想下载Ubuntu最新版来尝尝鲜,体验一下最新的GNOME的最新技术进展。由于我是使用的10年前的Thinkpad T400,只是更换了SSD硬盘,出现了安装完最新版的Ubuntu后,发现这个操作系统太消耗资源、经常出现鼠标停顿的现象,我想主要是由GNOME桌面系统引起的,确实没办法用,只能放弃。

我之前在使用优麒麟系统、深度Deepin系统、Linux Mint Xfce系统的时候,文件管理器都更换为了Nemo,因为只有这个文件管理器用起来更顺手,而且便于切换到root模式下,而Nemo是由Linux Mint Cinnamon发行版依据Nautilus进行修改而来的。所以一直我都想试用一下拥有Nemo软件的Linux Mint Cinnamon发行版。

通过最近几天的使用,发现这个发行版特别优秀,运行效率高,在我的电脑上与Linux Mint Xfce版本的性能非常接近,查看资料发现是开发团队对底层性能做了大量优化工作,而且界面非常美观,具备高度的可定制化能力,因为界面部分引入了GNOME Shell技术,由名为CJS的javascript通过GObject Introspection技术来调用底层代码生成用户操作界面。应用程序运行显示状态正常,比如Variety选择背景图片的滚动栏就不会发生Xfce那样图片进入面板下方的情况。

当然在安装工作环境的时候还是发现了一些需要需改的地方,但是都很顺利的进行:

第一,希望系统自带的日历能够增加显示中国农历,因为Cinnamon Calendar Applet是由javascript写成的js文件,所以为我们自行修改提供了可能,要使用已有的现成功能,减少代码的修改量,就先安装Ubuntu软件库中的gir1.2-lunar-date-2.0和liblunar-date-2.0-0这两个解决农历问题的基本软件包。liblunar-date-2.0-0这个软件包是实现农历转换等基本功能的函数库,而gir1.2-lunar-date-2.0是农历库函数与其它语言之间的接口,使用GObject Introspection技术来实现的,安装完这个软件包后会生成两个文件:/usr/lib/girepository-1.0/LunaDate-2.0.typelib和/usr/share/gir-1.0/LunarDate-2.0.gir,这是GJS javascript调用底层函数的关键。由于Cinnamon桌面可能带有类似于Deepin操作系统那样的机制来避免用户修改默认的组件或者操作系统更新覆盖,我发现我做的修改第二天就消失了。因此要修改这个Applet就要将他复制并修改为自己命名的Applet,我将/usr/share/cinnamon/applets/calendar@cinnamon.org目录拷贝到我的用户目录/home/ericden/.local/share/cinnamon/applets下,修改目录名为calendar@ericden.org,将目录中的metadata.json文件的calendar@cinnamon.org修改为calendar@ericden.org,将目录中applet.js文件的calendar@cinnamon.org修改为calendar@ericden.org,如果不做这个修改就会出现Applet的配置按钮无法工作,也就无法完成如“是否显示周数”等参数的配置。完成这些步骤就可以通过“小程序”配置工具将原有的calendar@cinnamon.org Applet删除,重新安装calendar@ericden.org Applet。后面的修改后就可以看到修改后的效果,要让修改生效,要用Alt+F2,在弹出的对话框中输入“r”,重启动Cinnamon。下面是对两个主要文件applet.js和calendar.js的修改。

一)、applet.js:

1、在文件中加入语句:const LunarDate = imports.gi.LunarDate;

2、在_updateClockAndDate()函数中,将语句this._date.set_text(dateFormattedFull)做修改,目的是在标题部分显示完整的农历日期,修改为:

        let ld = new LunarDate.Date();

        let now = new Date();

        ld.set_solar_date(now.getFullYear(),(1 + now.getMonth()),now.getDate(),18);

        let out = ld.strftime("%(NIAN)年%(YUE)月%(RI)");

        this._date.set_text(dateFormattedFull + "\n" + "农历" + out);

二)、calendar.js

1、在文件的开始部分加入以下语句:

    const LunarDate = imports.gi.LunarDate;

    const jieri_str = LunarDate.DATE_MAJOR_VERSION >= 3 || LunarDate.DATE_MAJOR_VERSION == 2 && LunarDate.DATE_MINOR_VERSION >= 9 ? "%(holiday)" : "%(jieri)";

2、在_update(forceReload)函数的while循环前加入语句:let ld = new LunarDate.Date();,将循环中的语句let button = new St.Button({ label: iter.getDate().toString())修改替换为以下语句:

            ld.set_solar_date(iter.getFullYear(),(1 + iter.getMonth()),iter.getDate(),18);

            let out = ld.strftime("%(RI)");

            let first = ld.strftime("%(ri)");

            let yueNum = ld.strftime("%(yue)");

            if (first == 1) 

                out = ld.strftime("%(YUE)月");

            if (ld.strftime(jieri_str) != "") 

                out = ld.strftime(jieri_str);

            let button = new St.Button({ label: iter.getDate().toString() + "\n" + out});

修改完成后,重启Cinnamon,就实现了中国农历,当然因为增加了农历造成日历显示在部分主题中显示不完整,需要将自己使用的主题的cinnamon.css做修改,系统自带主题库中下载的CBlack等主题是放在用户目录中的,我是修改/home/ericden/.themes/CBlack/cinnamon/cinnamon.css文件,将Date applet部分的calendar-day-base的  width: 和height分别设置为3.2em和4.2em。最后的显示效果如下:

为Linux Mint Cinnamon的日历小程序增加中国农历显示以及其它部分参数优化

为Linux Mint Cinnamon的日历小程序增加中国农历显示以及其它部分参数优化 

第二个问题就是中文支持不完整,通过sudo apt-get install language-pack-gnome-zh-hans语句就能极大程度的解决中文化的问题。

第三通过系统设置中的主题设置选项,中添加并选中CBlack主题来替换原有主题,用Windows-10的图标来替换系统默认图标,更加能够照顾原有的习惯,开始图标更换为linuxmint-logo-neon,并将原有的绿色通过inkscape软件修改为白色,当然这个也可以选择Windows-10的开始图标 。

第四:安装坚果云,安装过程都不报错,但是在开始菜单上点击图标却没有任何反应,我打开nutstore-menu.desktop文件一看,结果是Exec后面列出的是一个临时目录中的文件,该目录已经消。失,所以点击没有任何反应。将那一行语句修改为:Exec=sh -c "exec ~/.nutstore/dist/bin/nutstore-pydaemon.py"后运行基本正常了,坚果云可以打开,但是只有一个空白窗口,通过修改~/.nutstore/dist/conf/nutstore.properties文件中的webui.enable=true为webui.enable=false即可解决。

上一篇:CF446D DZY Loves Games 题解


下一篇:CF1578I Interactive Rays:ICPC WF Moscow Invitational Contest I 题解