デスクトップ環境構築 - 共通事項 - メニュー - MenuMaker - トラブルシュート - ラスト1件は消える

 クラウディア
1. 概要
2. 解析
3. わたしの解決策

1. 概要

 これは、前項より、更に不思議だったのです。  「Atril」をインストールして、「MenuMaker」を実行しても、「Atril」が、メニューに取り込まれないのです。  「-v -v」オプションで見ると

> mmaker -f --no-legacy --no-debian FluxBox -v -v

・・・	略	・・・

parsing mate-network-scheme.desktop...REJECTED : NoDisplay is True
parsing atril.desktop...ok
parsing caja-autorun-software.desktop...REJECTED : NoDisplay is True

 32 apps found
  skipping legacy
  skipping Debian
* merging... 7 coincidings detected
* generating

・・・	略	・・・

 と、きちんと検索出来ているのに・・・。

2. 解析

 実は、「--no-legacy」「--no-debian」のどちらかをはずすと、取り込まれたりするのです。  デバッグして分かりましたが、実は前項の

parsing mate-network-scheme.desktop...REJECTED : NoDisplay is True
parsing atril.desktop...ok
parsing caja-autorun-software.desktop...REJECTED : NoDisplay is True

 32 apps found
  skipping legacy
  skipping Debian
* merging... 7 coincidings detected
 の部分にヒントがあったのです。  「atril.desktop」が「ok」で、「caja-autorun-software.deskto」が「REJECTED」です。  リストの最後に、「atril」が、おるわけです。

/usr/local/share/menumaker/Prophet/__init__.py
 の

def merge(entries):
    """Removes repeating entries from the list using fuzzy matching technique"""
    # NOTE : this is the deliberate violation of the immutability principle
    # __matched attribute is set for the entries that have been successfully matched before
    # Such entries should be skipped
    # It is thought that this approach is faster than keeping them in separate
    # list
    msg("* merging...", newline=False)
    result = []
    esz = len(entries)
    for i in range(0, esz - 1):
        e = entries[i]
        if hasattr(e, "__matched"):
            continue
        matching = [e]  # List containing matching entries
        for j in range(i + 1, esz):
 たぶん、287行目に問題があって、配列の1番最後を処理していないんじゃないかな。  「--no-legacy」「--no-debian」のどちらかをはずせば、「atril」が欠け落ちることはなくなるわけです。  その代わりに、別の誰かが、メニューに取り込まれないんじゃないかな。  ためしに、

for i in range(0, esz):
 と書いて、試してたら、うまくいきました。  おそらく、その下の処理で、配列をはみ出てしまって、こけることを懸念しているのでしょうが・・・。  「Python」のことは、よう知らんので、なんとも言えませんが。  不具合じゃ、ないのか知らん。

3. わたしの解決策

 ひとつは、

/usr/local/share/applications/atril.desktop
 と中身が全く同じものをコピーして、別の名前をつけてやるのです。  そうすれば、「atril」が2つリストされるので、1つは生き残るわけです。  まぁ、この方法は、新たに同じ現象の「.desktop」ファイルが出てきたら、また同じことをしなければならないわけで、あまりお勧めできません。  もうひとつの方法として、どうも、前ページでふれたように、マージ処理に問題があるので・・・。  前ページと同様、マージ処理をスキップするオプションをつけて、マージ処理させないようにするっちゅうことです。
ハイスピードプラン