Unityパネルと統合するためのFirefox拡張機能を作成しています

Narwhals、Narwhals、海で泳いで、彼らはとても素晴らしいです騒ぎを引き起こす! Ubuntu 11.04のリリースでは、Unityシェルが予想外にデフォルトのシェルに取って代わりました。 Ubuntu Netbook EditionでのUnityの外観は、低速にもかかわらずかなり合理的でした。たとえば、実行中のプログラムを切り替えるための垂直パネルのおかげで、小さなネットブック画面を効率的に使用できました。 Unityをデスクトップに移植する必要が生じたのはなぜですか? この質問にはすぐに回答できます。 ただし、既成の例がないこのような不完全な主観的な回答は、現時点で移行の不便さに直面しなければならないユーザーを満足させることはほとんどありません。 したがって、それは改善する方法についてであり、どのように、そしてなぜ生き残るかについてではありません。

この記事は、Linux用ソフトウェアの開発者と、Firefox用の拡張機能の開発を開始したい人を対象としています。 ユーザーは、完成した拡張機能のリンクをたどることができます。

必要なもの:
  1. 拡張リスタートレスリスタート 。 開発プロセス中に、拡張機能をテストするためにブラウザを頻繁に再起動する必要があります
  2. 手動で再パッケージすることなく、アーカイブ内のファイルを直接編集できるアーカイバ。 これは、Ubuntu File-Rollerの標準アーカイバーによって処理されます
  3. テキストエディター

実際、このような単純な拡張で十分です。 また、 Extension Developer拡張機能が役立つ場合があります。

次に、拡張機能の構造を作成する必要があります。
ユニティフォックス
 -クロム  
 ----コンテンツ
 ------ main.xul
 -chrome.manifest 
 -install.rdf


私たちの拡張機能はローカライズや設定を使用しないため、標準ディレクトリのロケールと設定は役に立ちません。

すべてはinstall.rdfファイルで始まります。 拡張機能に関する簡単な情報を記述することは一般的です:名前、説明、バージョン、作成者、拡張機能の一意の識別子、およびサポートされるアプリケーションのセット(同じ拡張機能は、たとえばSeamonkeyとFirefoxで機能します):
<?xml version = "1.0" ?>

<RDF xmlns = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em = "http://www.mozilla.org/2004/em-rdf#" >

<説明 = "urn:mozilla:install-manifest" >
<em:id > unityfox@mozilla.org </ em:id >
<em:バージョン> 0.1.3 </ em:バージョン>
<em:タイプ> 2 </ em:タイプ>

<em:targetApplication >
<説明>
<em:id > {ec8030f7-c20a-464f-9b0e-13a3a9e97384} </ em:id >
<em:minVersion > 4.0 </ em:minVersion >
<em:maxVersion > 6.0a1 </ em:maxVersion >
</説明>
</ em:targetApplication >

<em:name > unityfox </ em:name >
<em:説明> Ubuntu Unityパネルとの統合</ em:説明>
<em:作成者> Lockal </ em:作成者>
</説明>
</ RDF >


ファイル構造は説明なく明確にする必要があります。 ちょっとした説明:<em:type> 2 </ em:type>は、このファイルが例えばデザインテーマではなく拡張であることを示しています。 {ec8030f7-c20a-464f-9b0e-13a3a9e97384}-Firefoxブラウザーコード。 バージョン4.0の下限は、 js-ctypes関数を使用してUnityライブラリとメッセージを交換するためです。

install.rdfの作成が完了したら、作業コードの作成に直接進むことができます。 ウィンドウを作成するときにmain.xulファイルのJavaScriptコードを実行するには、 chrome.manifestファイルでオーバーレイプロシージャを記述する必要があります。
コンテンツunityfox chrome /コンテンツ/
オーバーレイクロム://browser/content/browser.xulクロム://unityfox/content/main.xul
これは、ブラウザーにbrowser.xulブラウザーインターフェイスと共にmain.xulファイルを読み込むように指示します。

私たちが解決しようとしている問題を止めて覚えておく価値があります。 私たちの目標は、Unityパネルにダウンロードバーとアクティブなダウンロードの数を表示することです。 幸いなことに、Unityはこのための特別なAPIを提供します 。 このAPIから関数が必要になります:gint64はsiのlongの類似体であり、gbooleanはintの類似体です。 UnityLauncherEntryへのポインターは、匿名構造体へのポインターと見なされ、voidへのポインターに大胆にキャストされます。 追加のコメントは、 main.xulコードに直接移動します。
<?xml version = "1.0"?>
<オーバーレイID = "unityfox"
xmlns = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

<script type = "text / javascript" >

// Firefox拡張機能では、xulのグローバルスコープに注意するのが習慣です
if "undefined" == typeof unityProgress {

var unityProgress = {

セットアップ 関数 {
// ctypesモジュールをロードしてシステムライブラリにアクセスします
構成部品 utilsimport "resource://gre/modules/ctypes.jsm" ;

//ライブラリlibunity.so.4をロードします
//自由がない場合にエラーを生成するための拡張機能は必要ありません
{
これlibunity = ctypes。 open "libunity.so.4" ;
} catch err { return ; }

//必要なlibunity関数を説明します
これgetEntry = this自由 declare "unity_launcher_entry_get_for_desktop_id"
ctypes。 default_abi
ctypes。 voidptr_t
ctypes。 char ptr ;


これsetProgress = this自由 declare "unity_launcher_entry_set_progress"
ctypes。 default_abi
ctypes。 void_t
ctypes。 voidptr_t
ctypes。 ダブル ;

これsetVisibilityP = this 自由 declare "unity_launcher_entry_set_progress_visible"
ctypes。 default_abi
ctypes。 void_t
ctypes。 voidptr_t
ctypes。 int ;

これsetVisibilityN = this自由 declare "unity_launcher_entry_set_count_visible"
ctypes。 default_abi
ctypes。 void_t
ctypes。 voidptr_t
ctypes。 int ;

これsetCount = this自由 declare "unity_launcher_entry_set_count"
ctypes。 default_abi
ctypes。 void_t
ctypes。 voidptr_t
ctypes。 長い ;

// libunityライブラリのすべての主要機能はUnityLauncherEntryで動作します*
これentry = this getEntry "firefox.desktop" ;

これCc =コンポーネント。 クラス ;
これCi =コンポーネント。 インターフェース ;
これIDLM = thisCinsIDownloadManager ;

//パネルは、download-managerサービスを使用して更新されます
//すべての組み込みサービスのインターフェースはhttps://developer.mozilla.orgで説明されています
これdlMgr = thisCc [ "@ mozilla.org / download-manager; 1" ]getService this .IDLM ;
これdlMgr addListener this ;
}

//更新関数は、download-managerからのすべてのイベントで呼び出されます
更新 関数 {
var total = 0 cur = 0 count = 0 ;
var dls = thisdlMgr activeDownloads ;
while dls。hasMoreElements {
var dl = dls。 getNext QueryInterface this。Ci。NsIDownload ;
//非アクティブなダウンロードと終了時間が不明なダウンロードをスキップします
if dl。state != this。IDLM。DOWNLOAD_DOWNLOADING || dl。percentComplete == - 1
続ける ;

//合計サイズ、ロード済みサイズ、ダウンロード数をカウントします
合計+ = dl。 サイズ
cur + = dl。 amountTransferred ;
カウント++;
}

if total == 0 {
//ダウンロードがない場合は、パネルのカウンターとバーを非表示にします
これsetVisibilityP this.entry 0 ;
これsetVisibilityN this.entry 0 ;
} else {
//ダウンロードの進行状況(0から1)とダウンロード数を表示します
これsetProgress この .entry cur / total ;
これsetCount this。entry count ;
これsetVisibilityP this .entry 1 ;
これsetVisibilityN この .entry 1 ;
}
}

//このオブジェクトは同時にnsIDownloadProgressListenerです。
// nsIDownloadManagerは、以下に説明する関数にメッセージを送信します
onDownloadStateChange function { this更新 }
onStateChange function { これ更新 }
onProgressChange function { this更新 }
onSecurityChange function { これ更新 }
} ;
}

//最後に、いわゆる 匿名の名前空間
関数 { this。setup ; } 適用 unityProgress ;
</ script>
</オーバーレイ>


拡張機能の準備ができました。 これで、unityfoxディレクトリのファイルをzipアーカイブにパックし、ファイル拡張子を.xpiに変更し、ブラウザーウィンドウでドラッグアンドドロップして設定できます。

完成した拡張機能と成分のリストは、 addons.mozilla.org/en/firefox/addon/unityfoxで見つけることができます。 いってらっしゃい!

この記事のテキストはCC BY-SA 3.0でライセンスされています

Source: https://habr.com/ru/post/J118678/


All Articles