web-dev-qa-db-ja.com

Unityランチャーでいくつかの開いているアプリケーションが「疑問符」として表示されるのはなぜですか?

ランチャーが1つにまとめられているが、起動後に別のアイコンを作成するいくつかのプログラムに問題があります。ランチャーは、生成されたウィンドウを追跡して、整理しやすくすることはできますか?または、これはUnity自体のバグですか?

enter image description here

問題ではないかもしれませんが、この特定のプログラムはモノラルプログラムであり、生成されたアイコンがパネルとしてリストされます。

22
Andrew Redd

何が起こっていますか

このような問題は、Unityのアプリケーションマッチングフレームワークに関連しています。技術的な詳細を簡素化するために、プログラムウィンドウとアプリケーションはUbuntuにとって2つの別個のものです。 Ubuntuは、どのアプリケーションが特定のウィンドウを所有しているかを「推測」する必要があります。そして、時にはその推測が失敗し、ランチャーに疑問符が表示されます。

失敗の原因は次のとおりです。

  1. BAMF (上記のフレームワークに一致するアプリケーション)のバグ。
  2. 障害のある アプリケーションの説明 (別名「.desktop」ファイル)。
  3. アプリケーションの説明がまったくない。ウィンドウを起動する実行可能ファイルには、本質的にこのメタデータがありません。

質問(KeePass2)に示されているアプリケーションには、タイプ1の問題があります 適切なバグトラッカーに報告されています

問題の例

以下の例は技術的であり、Ubuntuランチャーで独自のアプリケーションを適切に表示したいプログラマーを対象としています。

問題3 –アプリケーションの説明なし

アプリケーションをUnityと統合するには、つまり、ダッシュで検索してランチャーに配置するには、デスクトップエントリが必要です。このようなエントリは、/usr/share/applications//usr/local/share/applications/、および$HOME/.local/share/applications/に配置されます(後者の2つは、システム全体およびユーザー専用のサードパーティソフトウェア用です)。これらは.desktop拡張子で終わり、次の基本形式に従います。

[Desktop Entry]
Type=Application
Name=My Application's Name
Icon=/file/path/of/my/icon
Exec=/file/path/of/my/executable

このエントリは、Exec実行可能ファイルを呼び出してプログラムを開始します。そのプログラムがウィンドウまたはダイアログを表示するたびに、Unityはその実行可能ファイルがこのアプリケーション記述に「属している」ことに気付き、ランチャーで指定されたNameおよびIconを使用します。

これは最低限の例です。 正式な仕様 は、多くの高度な機能をカバーしています。

問題2 –アプリケーションの説明の誤り

my_app.desktopは有効なアプリケーションディレクトリに存在すると仮定しますが、

  • /file/path/of/my/iconはファイルシステムに存在しません。
  • /file/path/of/my/iconは画像ではありません。
  • エントリは、誤った構文または無効なタグを使用しています。

上記のいずれの場合でも、Ubuntuはランチャーでアプリケーションウィンドウを適切にリストできません。

問題1 – BAMFのバグ

Ubuntu 11.10の時点で、BAMFにはアプリケーションの正しいマッチングを妨げる多数のバグがあります。一般的な(一時的な)落とし穴は次のとおりです。

  • Execパスは、通常のファイルではなく シンボリックリンク です
  • 実行可能ファイルは、メインの実行可能ファイルを起動するスクリプトです。

これらの場合、プログラマには、シンボリックリンクの抽象化を削除したり、実行可能ファイルに直接リンクするなどの回避策を使用する以外の選択肢はありません。これらのどちらも、デスクトップエントリの仕様自体には必要ありません。

23
Jjed

ウィンドウは、WM_CLASSプロパティが設定されている場合にのみ、アプリケーションに一致させることができます。 X11でこれを行うには、次を使用します。

XSetClassHint( display, window, &class_hints );

フィールド 'res_name'および 'res_class'を持つXClassHint構造体にポインターを渡す必要があります。

1
Bram