web-dev-qa-db-ja.com

再起動後、デュアルモニターセットアップ(Unity)でデスクトップアイコンの位置を保持するにはどうすればよいですか?

Ubuntu 14.04でUnityを実行しているデュアルモニターセットアップがあります

マシンを起動するたびに、システムは右側のディスプレイ(VGAを介して接続)上のデスクトップアイコンの位置を忘れているように見えます。アイコンはすべて画面の右側にうまく配置されていますが、起動すると、すべてのアイコンがランチャーの下の左上近くに集まって、いくつかが互いに重なり合っています:

enter image description here

これを修正して、起動するたびにデスクトップアイコンが同じ場所に表示されるようにするにはどうすればよいですか?左側のディスプレイ(HDMIで接続)のアイコンは常に正常で、常に同じ位置にあります。

3
Andy

原因

ほとんどの場合、問題はバグの結果です(ビデオドライバーに関連)。 2番目の画面は何とか記憶されておらず、起動(ログイン)プロセスのかなり後の段階で「事実上」再接続されていると思います。

回避策

多くの場合、それがバグであっても、回避策が見つからないという意味ではありません。もし私達:

  • ログアウト時の現在のアイコン位置のスナップショットを作成できます
  • アイコンの位置を復元 after 再起動後に2番目の画面が正しく表示される(ログイン)

事実上、バグは回避されます。

デスクトップ上のアイコンの位置の読み方

次のコマンドにより、アイコンのデスクトップ上の位置を取得できます。

gvfs-info -a 'metadata::nautilus-icon-position' '<file>'

これはデスクトップ上のアイコンの座標を出力します。これをファイルに保存できます。デスクトップをこのようにしてスナップショットを作成する場合、[////] コンピューターをシャットダウンした後、次のコマンドでアイコンの位置を後で復元できます。

gvfs-set-attribute -t string '<file>' 'metadata::nautilus-icon-position' '500,500'

(例えば)

このようなスナップショットを作成し、アイコンのレイアウトを復元するスクリプト(引数に応じて)は次のようになります。

#!/usr/bin/env python3
import subprocess
import os
import sys

# --- set your localized desktop name below:
dt_name = "Bureaublad"
# ---


# used strings & definitions
val = " 'metadata::nautilus-icon-position' "
search = "gvfs-info -a"+val
set_val = "gvfs-set-attribute -t string "
home = os.environ["HOME"]
dt_dir = home+"/"+dt_name
datafile = home+"/.desktop_items.txt"

arg = sys.argv[1]

get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")

def snapshot():
    try:
        os.remove(datafile)
    except FileNotFoundError:
        pass
    dt_items = os.listdir(dt_dir)
    dt_data = []
    for f in [f for f in dt_items if all([not f.startswith("."), not f.endswith("~")])]:
        f = '"'+f+'"' if f.count(" ") > 0 else f
        file = dt_dir+"/"+f
        cmd = search+file
        try:
            loc = [int(n) for n in get(cmd).split()[-1].split(",")]
            # loc[0] = loc[0] - screen_pos[0]; loc[1] = loc[1] - screen_pos[1]
            loc = (",").join([str(n) for n in loc])
            open(datafile, "a+").write(file+"|||"+loc+"\n")
        except:
            pass
    subprocess.Popen(["/bin/bash", "-c", "notify-send 'A snapshot was taken'"])

def restore():
    items = [l.strip().split("|||") for l in open(datafile).readlines()]
    for item in items:
        try:
            xy = [int(n) for n in item[1].split(",")]
            move_to = (",").join(str(n) for n in [xy[0], xy[1]])
            command = set_val+item[0]+val+move_to
            subprocess.Popen(["/bin/bash", "-c", command])
        except:
            pass
    subprocess.Popen(["/bin/bash", "-c", "notify-send 'Click on the desktop and press F5'"])

if arg == "snapshot":
    snapshot()
Elif arg == "restore":
    restore()

使用するには:

  • スクリプトを空のファイルにコピーし、restore_desktop.pyとして保存します
  • スクリプトのヘッドセクションの次の行:

    # --- set your localized desktop name below:
    dt_name = "Desktop"
    # ---
    

    デスクトップフォルダのローカライズされた名前を設定します(オランダ語で「Bureaublad」)

  • 現在のアイコンレイアウトの snapshot を取得するには、次のコマンドを実行します。

    python3 /path/to/restore_desktop.py snapshot
    
  • 以前に撮影したスナップショットを復元するには:

    python3 /path/to/restore_desktop.py restore
    

    次に、デスクトップをクリックして押します F5 デスクトップを更新します。

ただし、この状況でスクリプトを使用するには、いくつかの追加が必要です。

  • デスクトップを refreshed コマンドラインから実際に apply アイコンの復元する必要があります。これは、nautilusを再起動するか、または F5 正面にデスクトップがあります。起動時に使用するので、最初のオプションは最もエレガントなオプションかもしれません。

  • 最後のアイコンレイアウトがスナップショットに確実に記録されるように、現在のユーザーとしてログアウトでスナップショットを作成する必要があります。これまでのところ、私はそれを行う方法を見つけることができませんでした。ただし、いつものように、回避策があります。コマンドを含める場合

    gnome-session-quit --poweroff
    

    このスクリプトでは、(正しい引数を使用して)単純にスクリプトを呼び出して、シャットダウンプロシージャ and を含めてスナップショットを取得できます。

  • 次に、復元されたスナップショットが applied であることを確認するために、スクリプトにnautilusの再起動を含めることができます。

ソリューション

最終的なスクリプトは次のようになります。

#!/usr/bin/env python3
import subprocess
import os
import sys
import time

# --- set your localized desktop name below:
dt_name = "Desktop"
# ---


# used strings & definitions
val = " 'metadata::nautilus-icon-position' "
search = "gvfs-info -a"+val
set_val = "gvfs-set-attribute -t string "
home = os.environ["HOME"]
dt_dir = home+"/"+dt_name
datafile = home+"/.desktop_items.txt"

arg = sys.argv[1]

get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")

def snapshot():
    # remove the previous snapshot
    try:
        os.remove(datafile)
    except FileNotFoundError:
        pass
    # list the items on the desktop, look up their positions
    dt_items = os.listdir(dt_dir)
    dt_data = []
    for f in [f for f in dt_items if all([not f.startswith("."), not f.endswith("~")])]:
        f = '"'+f+'"' if f.count(" ") > 0 else f
        file = dt_dir+"/"+f
        cmd = search+file
        try:
            loc = [int(n) for n in get(cmd).split()[-1].split(",")]
            loc = (",").join([str(n) for n in loc])
            open(datafile, "a+").write(file+"|||"+loc+"\n")
        except:
            pass
    # notify that a snapshot was taken
    subprocess.call(["/bin/bash", "-c", "notify-send 'A snapshot was taken'"])
    # send the command to shutdown
    subprocess.Popen(["gnome-session-quit", "--power-off"])

def restore():
    # wait for 20 seconds for the desktop to be fully loaded and the screen to be found
    time.sleep(20)
    # read the snapshot file
    items = [l.strip().split("|||") for l in open(datafile).readlines()]
    for item in items:
        try:
            # place the icon(s) acoording to the remembered position(s)
            xy = [int(n) for n in item[1].split(",")]
            move_to = (",").join(str(n) for n in [xy[0], xy[1]])
            command = set_val+item[0]+val+move_to
            subprocess.Popen(["/bin/bash", "-c", command])
        except:
            pass
    # restart nautilus
    subprocess.call(["killall", "nautilus"])
    subprocess.Popen(["nautilus"])
    # send notification
    subprocess.Popen(["/bin/bash", "-c", "notify-send 'Icon positions were restored'"])

if arg == "snapshot":
    snapshot()
Elif arg == "restore":
    restore()

使い方

  1. スクリプトを空のファイルにコピーし、restore_icons.pyとして保存します
  2. スクリプトのheadセクションで、Desktopフォルダーの適切な(ローカライズされた)名前を設定します。

    # --- set your localized desktop name below:
    dt_name = "Desktop"
    # ---
    
  3. 次のコマンドを実行して、スクリプトをテスト実行します。

    python3 /path/to/restore_icons.py snapshot
    

    現在のレイアウトのスナップショットが作成されます。 shut down メニューがデスクトップに表示されますが、 outside デスクトップのメニューをクリックしてキャンセルします。

    <image_1>

    次に、デスクトップ上のアイコン(位置)を意図的に台無しにします。
    最後に、別の引数を使用してスクリプトを再度実行します。

     python3 /path/to/restore_icons.py restore
    

    20秒間待機するが含まれる理由を参照)スクリプトで)、デスクトップアイコンはスナップショットを作成する前の状態に復元されます。

  4. すべてが正常に機能する場合は、ショートカットキーを追加します。[システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット]を選択します。 「+」をクリックして、コマンドを追加します。

    python3 /path/to/restore_icons.py snapshot
    

    これは、コンピューターをシャットダウンするために使用する必要があるショートカットです。

  5. restore コマンドをスタートアップアプリケーションに追加します:ダッシュ>スタートアップアプリケーション>追加。コマンドを追加します。

    python3 /path/to/restore_icons.py restore
    

    これで、起動(ログイン)から20秒後、アイコンはシャットダウンしたままの状態になります。

注意

20秒の休憩は、復元コマンドを実行する前に2番目のモニターが検出されて再接続されることを確認することです。

5
Jacob Vlijm

このスクリプトはLinux Mint 18.3 Cinnamonでも動作しますが、次の小さな変更を行ったときに:

交換:

nautilus-icon-position-> nemo-icon-position gnome-session-quit-> cinnamon-session-quit "killall"、 "nautilus"-> "killall"、 "nemo-desktop" subprocess.Popen(["nautilus" ])-> subprocess.POpen(["nemo-desktop"])

すばらしいスクリプトをありがとう

シナモン

1

この問題を解決するために、saveおよびloadデスクトップアイコン設定を使用してiconicを作成しました。さらに、次のことを行います。

  • 3つのモニターのいずれかにアイコンを移動できます
  • グリッドサイズを定義して、デスクトップ全体にアイコンを均等に均等に配置します
  • 複数の解像度のモニターが使用されている場合に発生する「ロストアイコンシンドローム」に悩まされない
  • アイコンをアルファベット順に並べ替え、「リンク先」プレフィックスを無視してアルファベット順に並べ替え、変更された日付の昇順または降順に並べ替えます
  • モニターに応じて異なるグリッドサイズ(列x行)を許可、EGは2Kモニターよりも4Kモニターの方が多い
  • インスタントTestボタンで、モニターの左、上、右、または下の領域の列x行の変更または予約スペースの変更をすばやく実験できます
  • Testボタンは、定義されたx秒間続きます。テスト前にすべてのウィンドウをクリアし、テスト後にそれらを復元します
  • 簡単に変更できるBashスクリプト

スクリプトは github で取得できます。

メイン画面は次のとおりです。

iconic main menu.png

iconicgithub ページにアクセスして、他のすべての画面、説明、およびスクリプトのコピーを確認します。

0