GNOME-Shell-Extensions开发经验(一)Hello,world!
最近想自己写个gnome-shell扩展找到了下面两个教程
GNOME 3.0 and 3.1 Shell Extensions
More GNOME Shell Customization
这是两篇2011年的 gnome3.0 和 3.1 的教程,相信很多开发 gnome-shell 扩展的朋友也看见过这两篇教程吧,我现在用的是3.18,我想差不了太多的,毕竟都是 gnome 3,我便照着这两个教程开发,没想到这就是我开发 gnome-shell 扩展噩梦的开始。。。。。
为什么我的扩展就运行不起来呢,只好又在 github 上看了好多扩展的代码,终于发现了
main( ) 函数不再是程序入口了!!!
main( ) 函数不再是程序入口了!!!
main( ) 函数不再是程序入口了!!!
于是只能按照模板提供的方式开发扩展,上面的教程的代码根本运行不起来,求我心理阴影面积。。。
好了,吐槽完了开始正式讲讲 gnome 现在开发的基本结构,其实变化也没用太大只是把以前的 main( ) 拆成了三个函数分别是 init( ),enable( ),disable( ),上面两篇教程还是很值得学习的,只要会 JavaScript 和 GObject 五分钟就能学会开发 gnome-shell 扩展
另外我的/usr/share/gnome-shell/
里为什么死活找不到./js/ui
这个文件夹呀,连./js
都没有。。。。如果你也找不到请移步这里,找各个组件的名字属性什么的就全靠它了
首先创建一个 gnome-shell-extension 模板,输入如下命令
# gnome-shell-extension-tool -c
就会在$HOME/.local/share/gnome-shell/extensions
下创建一个模板扩展,里面有三个文件
- extension.js 这是 gnome-shell 扩展最核心的代码,init( ),enable( ),disable( ) 三个函数就在这里面
- stylesheet.css 这时扩展中所使用的 css 样式
- metadata.json 这是扩展的元信息
先上 extension.js 的代码
const St = imports.gi.St;
const Main = imports.ui.main;
const Tweener = imports.ui.tweener;let text, button;function _hideHello() {Main.uiGroup.remove_actor(text);text = null;
}function _showHello() {if (!text) {text = new St.Label({ style_class: 'helloworld-label', text: "Hello, world!" });Main.uiGroup.add_actor(text);}text.opacity = 255;let monitor = Main.layoutManager.primaryMonitor;text.set_position(monitor.x + Math.floor(monitor.width / 2 - text.width / 2),monitor.y + Math.floor(monitor.height / 2 - text.height / 2));Tweener.addTween(text,{ opacity: 0,time: 2,transition: 'easeOutQuad',onComplete: _hideHello });
}function init() {button = new St.Bin({ style_class: 'panel-button',reactive: true,can_focus: true,x_fill: true,y_fill: false,track_hover: true });let icon = new St.Icon({ icon_name: 'system-run-symbolic',style_class: 'system-status-icon' });button.set_child(icon);button.connect('button-press-event', _showHello);
}function enable() {Main.panel._rightBox.insert_child_at_index(button, 0);
}function disable() {Main.panel._rightBox.remove_child(button);
}
扩展运行如图,每点一次右上角的齿轮图标就会闪现一下 Hello,world!
分析上面的代码,可以看出整个扩展结构其实比一个main( ) 函数变得更清晰了,enable( ) 函数负责构造,init( ) 函数负责初始化,disable( ) 函数负责构析,而看了官方代码后发现,这并不是正确编写扩展的姿势,正确姿势应该是用 lang.class 实现,修改后的代码如下
const Lang = imports.lang;
const St = imports.gi.St;
const Main = imports.ui.main;
const Atk = imports.gi.Atk;
const PanelMenu = imports.ui.panelMenu;
const Tweener = imports.ui.tweener;const extensionName = "hello,world!";const extension = new Lang.Class({Name : extensionName,Extends : PanelMenu.Button,_init : function() {this.parent(null,extensionName);this.actor.accessible_role = Atk.Role.TOGGLE_BUTTON;this._text = null;this._icon = new St.Icon({ icon_name: 'system-run-symbolic',style_class: 'system-status-icon' });this.actor.add_child(this._icon);this.actor.connect('button-press-event', Lang.bind(this, this._showHello));},_hideHello : function () {Main.uiGroup.remove_actor(this._text);this._text = null;},_showHello : function () {if (!this._text) {this._text = new St.Label({ style_class: 'helloworld-label', text: "Hello, world!" });Main.uiGroup.add_actor(this._text);}this._text.opacity = 255;let monitor = Main.layoutManager.primaryMonitor;this._text.set_position(monitor.x + Math.floor(monitor.width / 2 - this._text.width / 2),monitor.y + Math.floor(monitor.height / 2 - this._text.height / 2));Tweener.addTween(this._text,{ opacity: 0,time: 2,transition: 'easeOutQuad',onComplete: this._hideHello });}
});let instance;function init() {}function enable() {instance = new extension();Main.panel.addToStatusArea(extensionName, instance);
}function disable() {instance = null;
}
写完了就要开始调试扩展了,坑又来了,gnome 提供了一个 javascript 的解释器 gjs 但是 gnome 提供的东西不能调试自家的扩展,运行扩展会出现这样的错误
(gjs:7179): Gjs-WARNING **: JS ERROR: Error: Requiring St, version none: Typelib file for namespace 'St' (any version) not found
@/home/oxalics/.local/share/gnome-shell/extensions/hello_world@Oxalics/extension.js:3
# export UI_TYPELIB_PATH=/usr/lib/gnome-shell
也不好使,数据只在 gnome 的进程中有效
于是只有Alt+F2
输入 lg 可以进入 lookingGlass 里调试,如图
可以看见 lookGlass 的界面还是很不错的。。。。可是
错误信息竟然不显示行号
错误信息竟然不显示行号
错误信息竟然不显示行号
多么反人类的设计啊,于是我有找到种调试方法,见这里。。。可是
GNOME 不崩溃没有错误信息
GNOME 不崩溃没有错误信息
GNOME 不崩溃没有错误信息
我现在很好奇 gnome 的工程师是怎么调试程序的。。。。我的经验就是不停地 try catch 不停的用 Gio 往终端输出信息,这样勉强能定位错误。
经过大概三天的折腾,在几乎官方资料为零(过期资料还不如零呢~~~),终于开发扩展走上正轨了,我把我踩过的雷都写在这里,这些资料足够让你顺利开始开发 gnome-shell 扩展了,也希望后人少走些弯路吧
GNOME-Shell-Extensions开发经验(一)Hello,world!相关推荐
- GNOME Shell Extensions开发介绍
前两天看到这篇介绍gnome shell extensions 开发的文章,来自blog.fpmurphy.com 很不错,特转来留着.有兴趣的人看看吧. GNOME Shell Extensions ...
- 非命令行linux安装zip,如何在Ubuntu 18.04 Bionic Beaver Linux上使用命令行从ZIP文件安装Gnome Shell Extensions...
目的 目的是在Ubuntu 18.04 Bionic Beaver Linux上使用命令行从ZIP文件安装Gnome Shell Extensions.使用命令行从ZIP文件安装Gnome Shell ...
- linux 网卡天启与关闭,在Gnome Shell中切换到黑暗模式(Dark Mode)的方法
Gnome Shell具有内置的黑暗主题,允许用户更改桌面,文件管理器和所有与Gnome相关的窗口和应用程序的外观,使其看起来更加适合夜间使用并且易于使用,这个主题不需要安装,已经在Gnome的几个版 ...
- linux扩展两个桌面,经验分享:九大GNOME Shell扩展助您定制桌面Linux
原标题:经验分享:九大GNOME Shell扩展助您定制桌面Linux 每位用户在首次设置新计算机时,都会进行有针对性的自定义--包括切换桌面环境.安装终端shell.选择自己喜欢的浏览器或者更改壁纸 ...
- Ubuntu11.10 GNOME Shell指南
Ubuntu 11.10终于提供了一种安全方便的方式去安装和使用"GNOME Shell"--GNOME的新桌面交互接口.这意味着不像之前的版本那样,现在它不需要任何额外的插件,或 ...
- 程序自动启动_如何在Gnome Shell上自动启动程序
登录Gnome Shell时自动打开应用程序是提前设置工作区的好方法.在Gnome Shell上自动启动程序的最简单方法是使用Tweaks应用程序. 在本指南中,我们将介绍如何安装Gnome Twea ...
- linux隐藏软件程序,如何使用GNOME Shell隐藏的屏幕录像工具
你可能想录制自己的桌面与其他人分享,在gnome-shell里面你找不到品目录像软件,也许你会想到安装一个,其实gnome-shell有一个内置的隐藏的屏幕录像软件,它作为GNOME Shell桌面的 ...
- linux gnome启动命令,如何在Gnome Shell上自动启动程序
登录Gnome Shell时自动打开应用程序是提前设置工作区的好方法.在Gnome Shell上自动启动程序的最简单方法是使用Tweaks应用程序. 在本指南中,我们将介绍如何安装Gnome Twea ...
- linux 如何关闭屏幕录像,如何使用GNOME Shell隐藏的屏幕录像工具
如何使用GNOME Shell隐藏的屏幕录像工具 Mark Do 2018年6月10日 暂无评论 阅读 2,738 次 你可能想录制自己的桌面与其他人分享,在gnome-shell里面你找不到品目录像 ...
- GNOME Shell加速演进:BoxPointer, AppMenu和Magnifier
最近GNOME Shell加快了演进的步伐,不仅增加了新的功能,同时在界面上也渐渐地显露出了未来的模样.我很有信心GNOME开发者能在四个月后给我们一个稳定的.全功能.焕然一新的GNOME 3,因为从 ...
最新文章
- 手把手教你搭建 Git 服务器
- int[]到string[]的转换方法 Array.ConvertAll
- java.math.BigDecimal的用法-商业计算
- C指针原理(40)-递归(1)
- c++实现多态的方法 虚表
- InceptionV2----Batch Normalization层
- tl494c封装区别_TL494参数,功能介绍,TL494应用电路图,封装,管脚及TL494 PDF中文资料手册...
- python像素处理_用python处理图片实现图像中的像素访问
- jredis和letucce_深入理解Redis(一)——高级键管理与数据结构
- Chrome默认开启flash
- python是否安装numpy_python 怎么查看安装numpy的版本
- 英汉汉英词典,牛津高级词典,电子词典,离线英汉,汉英词典的使用方法
- 1小时就会的测试用例【直播推流/拉流】
- 同义替换:哈工大同义词词林扩展版
- 数据流被提前关闭- connectionClosedException:premature end of chunk coded message body:closing chunk expected
- 决策树--CART算法
- 谷歌统计Google Analytics使用入门
- 美通社企业新闻汇总 | 2019.1.3
- 初探TweenMax 动画
- 手把手教你抄写URP——3——自发光材质
热门文章
- tas5707php,TAS5707PHPR 立体声数字音频功率放大器
- 云服务器网站不显示图片,解决帝国cms图片显示不出来的问题
- 【组合逻辑电路】——通用译码器
- linux驱动程序启动失败,打开程序提示加载驱动失败?三种故障原因及解决方法...
- 惠普541笔记本更换内存条_惠普541笔记本如何样啊?有什么缺点和优点?, 真心不会...
- c++中文件打开失败
- 基础的风光摄影技术控制
- java 刽子手游戏_刽子手游戏(Hangman Judge)
- 在线制作安卓手机主题
- 未来发展人工智能的意义是什么?