1. 程式人生 > >GNOME-Shell-Extensions開發經驗(一)Hello,world!

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!


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/[email protected]/extension.js:3

# export UI_TYPELIB_PATH=/usr/lib/gnome-shell也不好使,資料只在 gnome 的程序中有效

於是只有Alt+F2輸入 lg 可以進入 lookingGlass 裡除錯,如圖


lookGlass

可以看見 lookGlass 的介面還是很不錯的。。。。可是

錯誤資訊竟然不顯示行號
錯誤資訊竟然不顯示行號
錯誤資訊竟然不顯示行號

多麼反人類的設計啊,於是我有找到種除錯方法,見這裡。。。可是

GNOME 不崩潰沒有錯誤資訊
GNOME 不崩潰沒有錯誤資訊
GNOME 不崩潰沒有錯誤資訊

我現在很好奇 gnome 的工程師是怎麼除錯程式的。。。。我的經驗就是不停地 try catch 不停的用 Gio 往終端輸出資訊,這樣勉強能定位錯誤。

經過大概三天的折騰,在幾乎官方資料為零(過期資料還不如零呢~~~),終於開發擴充套件走上正軌了,我把我踩過的雷都寫在這裡,這些資料足夠讓你順利開始開發 gnome-shell 擴充套件了,也希望後人少走些彎路吧

相關推薦

GNOME-Shell-Extensions開發經驗Hello,world!

最近想自己寫個gnome-shell擴充套件找到了下面兩個教程 GNOME 3.0 and 3.1 Shell Extensions More GNOME Shell Customization 這是兩篇2011年的 gnome3.0 和 3.1 的教程,

關於青風藍芽NRD52832開發經驗

1.首先是按照環境的搭建,藍芽協議和外設功能用到的是keil5和nRFgo Studio(賊不好用,用來進行協議的下載)開發工具,52832用的協議是S132的藍芽協議,關於藍芽mesh的開發在nordic官網上面找到一個關於藍芽點燈的程式,開啟這個程式用的開發環境是(Emb

chrome瀏覽器外掛開發經驗

最近在進行chrome瀏覽器外掛的開發,一些小的經驗總結隨筆。 1、首先,推薦360的chrome外掛開發文件:http://open.chrome.360.cn/extension_dev/overview.html 2、從chrome18開始往後,chro

Spring BootHello World

pri tags IT pla reload art blank info 輸入 Spring Boot適合與微服務,方便快速開發,簡化配置(約定>配置)。 準備工作: SpringBoot 2.0 jdk8 IDEA或者eclipse+Spring Tool Suits

Spring Boot學習日誌Hello World

目錄 一,系統環境 JDK:1.8.0_144 maven:3.5.2 二,使用IntelliJ IDEA建立專案 1,選擇專案型別 2,編輯專案資訊 這裡packaging可以選擇jar 或者 war 3,選擇需要的war包

Spring Boot學習入門篇--Hello World

簡介:Spring Boot是一種簡化原有Spring應用繁雜配置的微框架。使開發者從繁雜的各種配置檔案中解脫出來,通過Spring Boot能夠很簡單、很快速構建一個優秀的、產品級的Spring基礎應用。執行Spring Boot和執行普通的Java類一樣簡單

Python3基礎 Hello World

對於新手一般會遇到一個問題:學習Python 2還是Python 3呢? 對於我個人而言,我是個完全的新手,沒有歷史包袱,所以我直接學習Python 3。我相信在未來幾年,Python 3會逐步取代Python 2成為主流。 Python是一門解釋型、面向物件、動態資料型別

PyQt5的例子——hello world

本文章內容屬於PyQt5學習筆記,學習資料為《PyQt5 tutorial》。 最簡單的例子:hello world #! /usr/bin/python3 # coding = utf-8 import sys from PyQt5.QtWidgets

LaTeX學習筆記Hello World

        要不要學習LaTeX,其實自己糾結了好久。         從網上各種文章看,LaTeX和Word各有特色。而且有人認為,LaTeX的功能Word幾乎都能實現,吹噓LaTeX的人其實是Word沒學好,轉投LaTeX用模板找個偷懶的藉口罷了。如果是這樣,我覺

學習 MeteoInfo二次開發教程

mat 沒有 組件 資源管理 img 教程 layer 添加 bbs 來自氣象家園:http://bbs.06climate.com/forum.php?mod=viewthread&tid=6631 按照教程,沒有太大問題,有些是對c#操作不熟悉導致。 1.添加d

netty開發教程

prot eventloop 操作 公司 大量 read readline 獲得 github Netty介紹 Netty is an asynchronous event-driven network application framework for

ios開發技巧

nss sets pos 哪裏 tro size wid navi tran iOS的一些小技巧 TableView不顯示沒內容的Cell怎麽辦? 類似這樣的,我不想讓以下那些空的顯示. 非常easy. self.tableView.tableFoote

Cardboard虛擬現實開發初步

sce hot tracking 發的 tle motion 減少 app ide Google Cardboard 虛擬現實眼鏡開發初步(一) 虛擬現實技術簡單介紹 不得不說這幾年虛擬現實技術逐漸火熱,伴隨著虛擬現實設備的價格迅速平民化,越來越

微信公眾平臺開發教程 微信公眾賬號註冊流程

身份證 logs 政府 提交 註意 bsp 訪問服務器 定義 htm 具體的操作步驟 1、註冊公眾賬號 註冊地址:http://mp.weixin.qq.com/ 1)首先需要郵箱註冊: 2)郵箱激活。郵箱將會收到激活郵件,點擊激活鏈接即可。 3)需要登記個人信息。這裏需

MySQL 開發技巧

logs 增加 .cn str wid select es2017 使用 idt 一、SQL語句分類 DDL 數據定義語言 TPL 事務處理語言 DCL 數據控制語言 DML 數據操作語言 SELECT INSERT UPDATE DELETE 二、正確使用S

開發問題在windows和linux端口占用問題

logs ets 情況 toc 端口占用 所有 註意 linu eclips 前言   今天在MyEclipse中使用tomcat發現tomcat端口8080竟然被占用了,所以就找了一下解決辦法共參考!   在網絡程序的調試過程中,經常發生一些出乎意料的事情,比如創建一

曼思數學教育開發進展

別人 有意義 提高 成功 目標 是不是 科學家 我們 事情 2017年10月18日,曼斯數學教育在取得了成功過後,現在即將入駐成都地區,曼思數學教育以小學,初中,高中數學為自己核心業務競爭力,旨在解決各個類型學生在面對數學這門學科時候的煩惱,不管是基礎薄弱的學生,對數學恐懼

vue項目開發流程

訪問 running you 命令 http nbsp div spa new vue的環境配置好之後,讓項目運行起來,一般是localhost:8080,如果是移動端,想在手機上查看效果,可以用電腦ip連接訪問 1.打開控制臺查看本機ip,輸入命令:ipconfig

webpack開發案例

sele tle 參數說明 logs css 直接 [] ima -128 案例一(基本打包) 基本前置條件 步驟一: <!DOCTYPE html> <html> <head> <meta charset="ut

Shell腳本基礎

2.6 x86 histsize bash 數據 隨著 顯示 echo 保存 前言:隨著Linux系統在企業中的應用越來越多,服務器的自動化管理也越來越變得重要,在一些復雜的Linux維護工作中,大量的重復性的輸出和交互式操作不但費時費力,而且容易出錯,所以Shell腳本,