いろいろなメニュー定義ファイル

メニューの階層を定義するメニュー・ファイルは GNOME の「メニュー・バー」で使用されます。これらのファイルを変更することで、全ユーザ、または変更対象の applications.menu ファイルが示している場所に依存した単一のユーザ向けに独自のメニューを提供できます。

すべてのメニュー・ファイルは $XDG_CONFIG_DIRS/menus/applications.menu の中に記載されていなければなりません。もし環境変数の $XDG_CONFIG_DIRS1 がセットされていなければ、デフォルトのパスである /etc/xdg を使用します。さらに、これは一番最初に見つかった $XDG_CONFIG_HOME/menus/applications.menu ファイルの中にユーザ専用の情報が記載されている可能性も含んでいます。環境変数の $XDG_CONFIG_HOME がセットされていない場合は、デフォルトのパスである ~/.config を使用します。applications.menu が複数個ある場合は、環境変数の $XDG_CONFIG_DIRS の中で最初に見つかったフォルダが優先されます。そして一番最初に見つかったファイルを利用して、それ以外のファイルは無視されます。

パスを検索する順番がわからなくなった場合に備えて、ここで applications.menu ファイルを特定する方法を示します:

  1. menus/applications.menu ファイルを特定するために、環境変数の $XDG_CONFIG_HOME にセットされたフォルダの内容をそれぞれ調べる (もし $XDG_CONFIG_HOME がセットされていなければ、デフォルトの ~/.config/ というフォルダを使用する)
  2. menus/applications.menu ファイルを特定するために、環境変数の $XDG_CONFIG_DIRS にセットされたフォルダの内容をそれぞれ調べる (もし $XDG_CONFIG_DIRS がセットされていなければ、デフォルトの /etc/xdg/ というフォルダを使用する)
  3. 一番最初に見つかった applications.menu ファイルを使用する

例 2-1.menu ファイルの例を示します。この例におけるトップレベルのメニューは Applications という名前のメニューで、これは <Name> とう要素を使って指定されているのがわかります。Applications というメニューにはサブメニューが一つ含まれていますが、複数のサブメニューを含めることも可能です。さらに各サブメニューにも <Include> という要素を含めることが可能になっています。この <Include> 要素の目的は任意のルールを用いて、すべてのデスクトップ・エントリから実際に利用できるエントリの集合にフィルタリングすることです。

<Category> という要素はフィルタの基本ルールの一つです。これはデスクトップ・エントリCategories というキー<Category> が示す内容が含まれていたら、そのデスクトップ・エントリだけを選択し有効にするというものです。この例の場合だと、あるデスクトップ・エントリCategories というキーの中に “Utility” が含まれているが “System” は含まれていない場合にのみ、このデスクトップ・エントリAccessories というメニューに表示されるというものです。Categories キーについて詳細は「セクション 2.3 - デスクトップ・エントリのファイル」をご覧ください。

例 2-1.menu ファイルの例

<!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"
 "http://www.freedesktop.org/standards/menu-spec/1.0/menu.dtd">
<Menu>
  <Name>Applications</Name>
  <Directory>Applications.directory</Directory>

  <!-- まず .directory と .desktop ファイルが格納されているシステム規模のフォルダを読み込む -->
  <DefaultAppDirs/>
  <DefaultDirectoryDirs/>

  <!-- Accessories (アクセサリ) というサブメニュー -->
  <Menu>
    <Name>Accessories</Name>
    <Directory>Accessories.directory</Directory>
    <Include>
      <And>
        <Category>Utility</Category>
        <Not>
          <Category>System</Category>
        </Not>
      </And>
    </Include>
  </Menu> <!-- ここがサブメニューの終わり -->

  <!-- さらにたくさんのサブメニューを追加できる -->

</Menu> <!-- Applications メニューの終わり -->

表 2-1.menu ファイルで指定できる要素を示します。さらに詳細は「XDG メニューの仕様」をご覧ください。

表 2-1メニューの定義ファイルに記載する要素
要素 説明
<Menu> 定義ファイルのルート要素で、サブメニューを定義する際はこの <Menu> 要素をネストさせて定義する (どのようにネストしているかによってメニューの構成が変わる)
<Name> メニューの名前を指定する (<Menu> 要素毎にこの <Name> 要素を定義しなければならない)
<Directory>

メニューの名前やコメント、アイコンなどを記述した .directory ファイル (ディレクトリ・エントリ・ファイル) の名前を指定する (この要素が指定されていない場合は、<Name> 要素で指定した文字列をメニューにメニュー名として表示する)

デフォルトで .directory ファイルは、「XDG メニューの仕様」の中で説明されているように、$XDG_DATA_DIRS/desktop-directories/ の場所から捜し出される

<DefaultAppDirs> これは、$XDG_DATA_DIRS/applications/ の中を解析した結果から利用可能なデスクトップ・エントリ (.desktop) のすべてを取得する命令である (この命令が指定されていない場合は、その場所からはデスクトップ・エントリを捜さないという意味になる)
<DefaultDirectoryDirs> これは、$XDG_DATA_DIRS/desktop-directories/ の中を解析した結果から利用可能なディレクトリ・エントリ (.directory) のすべてを取得する命令である (この命令が指定されなかった場合、この場所からはディレクトリ・エントリを捜さないという意味になる)
<Include> 実際のメニューを生成する際に使用するフィルタリングのルールを並べて指定する (<Filename><Category><And><Or><Not>、あるいは <All> といったルールの中から適宜選択する;1個以上のルールを指定すると、ルールが論理和されるので、結果的にデスクトップ・エントリはここで指定したルールのいずれかにマッチすることになる)
<Exclude> <Include> の逆であり、この要素の中にあるデスクトップ・エントリのいずれかが実際のメニュー構成から削除される (そのため、この要素は <Include> の要素よりも後に記述すること)
<Filename> デスクトップ・エントリのファイル名 (Desktop File-Id) とこの <Filename> 要素が持つ内容が一致したら、そのデスクトップ・エントリを有効にするルール
<Category> デスクトップ・エントリに記載された Categories というキーワードとこの <Category> 要素が持つ内容が一致したら、そのデスクトップ・エントリを有効にするルール
<And> この <And> 要素の中でネストされているすべてのフィルタリングのルールによって取得したデスクトップ・エントリを有効にするルール
<Or> この <Or> 要素の中でネストされているいずれかのフィルタリングのルールによって取得したデスクトップ・エントリを有効にするルール
<Not> この <Not> 要素の中でネストされているいずれかのフィルタリングのルールよって取得したデスクトップ・エントリを有効にしないルール
<All> すべてのデスクトップ・エントリを有効にするルール
1

$XDG_CONFIG_DIRS という環境変数は「XDG ベース・ディレクトリの仕様」で定義されています。