web-dev-qa-db-ja.com

カスタムランチャーファイルがランチャーバーに2つのアイコンを作成するのはなぜですか?

ランチャーバーからpythonスクリプトを起動できるように.desktopファイルを作成しました。

pythonスクリプトを実行可能ファイルとして設定し、ダブルクリックしてファイルマネージャーから実行すると、スクリプトは正常に実行されます。ターミナルからも正常に実行されます。

デスクトップファイルは/.local/share/applications/にあり、次のようになります。

[Desktop Entry]
Version=1.0
Name=Simple Timer
Comment=Timer
Exec=python3 /home/user/app/timer.py
Icon=/home/user/app/icon/timer.png
Path=/home/user/app/timer/
Terminal=false
Type=Application
Categories=Utility;Application;

ダッシュで「タイマー」を検索すると表示されます。そこから実行できます。それを実行すると、写真のようにランチャーバーに2つの重複したアイコンが作成されます。

enter image description here

  • 最初のアイコンは約10秒間脈動し、その後消えます。このアイコンはランチャーにロックできます。このアイコンがランチャーバーにロックされている場合、アプリケーションウィンドウが閉じてから数秒間脈動します。その間、アイコンはクリックできなくなります。
  • 2番目のアイコンはランチャーにロックできず、アプリケーションウィンドウを閉じた場合にのみ非表示になります。

ファイルマネージャーからスクリプトを実行した場合。正常に動作する1つのランチャーアイコンを作成します。

/usr/share/applications/に重複する.desktopファイルがないことを確認しました。作成した.desktopファイルは/.local/share/applications/にのみ存在し、削除すると、Dashでタイマーを検索したり、ランチャーバーにロックしたりできなくなります。

脈動/クリックできない問題とダブルアイコンの問題の両方をここで修正するにはどうすればよいですか?

2
Minh Tran

ランチャーがウィンドウを「彼」として認識しない

具体的には、Tkinterウィンドウはそれらの「独自の」ウィンドウ(クラス)を認識しません。これにより、アイコンが点滅し、ウィンドウが表示されるのを待ちます。ウィンドウが表示されると、ランチャーは自身のウィンドウを認識せず、タイムアウトが経過するとランチャーからポップアップします。 「通常の」ウィンドウは常にランチャーのアイコンで表されるため、一般的なアイコン(通常、ランチャーが重複していない場合)または別のアイコン(以下を参照)が表示されます。

以下を追加するだけで修正できます。

StartupWMClass=Tk

ランチャーに(それはTkinterウィンドウなので)

違いを見て(私はランチャーに与えたfirefoxテスト用アイコン):

  1. 複数のウィンドウを開くとき、線なし。 3つの一般的なアイコンと点滅しているFirefoxアイコンが10秒ほどで消えます。

    enter image description here

  2. 次に、StartupWMClass=Tkという行を追加します。すべてのウィンドウが同じアイコンにグループ化されます。

    enter image description here

なぜあなたのケースでは一般的なアイコンがないのですか?

WM_CLASSを.desktopファイルに追加すると、問題が解決します。ただし、誤って追加のランチャーを作成した(またはUnityで自動的に作成された)と思います。 /.local/share/applications/を調べて、ランチャーを実行可能にします。アイコンが表示されます。ほとんどの場合、あなたのデュープはその名前に「統一」を持っています。

一般的に、ウィンドウのWM_CLASSを見つける方法は?

  • ターミナルを開いて入力

     xprop WM_CLASS
    
  • 続いてウィンドウをクリックします。カンマで区切られた2つの文字列が表示されます。タイトルの場合は、追加する必要があるものです。

ノート

問題ではない問題ですが、

以下の行を設定する必要はありません:

  • Version=1.0(害はありませんが、必要ありません)
  • スクリプトは実行可能であるため、python3は必要ありません(スクリプトでインタプリタを直接呼び出すことができます)
  • Path=/home/user/app/timer/(不要)
  • Terminal=false(これがデフォルトです)
2
Jacob Vlijm