Ubuntu 14.04でUnityを実行しているデュアルモニターセットアップがあります
マシンを起動するたびに、システムは右側のディスプレイ(VGAを介して接続)上のデスクトップアイコンの位置を忘れているように見えます。アイコンはすべて画面の右側にうまく配置されていますが、起動すると、すべてのアイコンがランチャーの下の左上近くに集まって、いくつかが互いに重なり合っています:
これを修正して、起動するたびにデスクトップアイコンが同じ場所に表示されるようにするにはどうすればよいですか?左側のディスプレイ(HDMIで接続)のアイコンは常に正常で、常に同じ位置にあります。
ほとんどの場合、問題はバグの結果です(ビデオドライバーに関連)。 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 を含めてスナップショットを取得できます。
最終的なスクリプトは次のようになります。
#!/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()
restore_icons.py
として保存しますスクリプトのheadセクションで、Desktop
フォルダーの適切な(ローカライズされた)名前を設定します。
# --- set your localized desktop name below:
dt_name = "Desktop"
# ---
次のコマンドを実行して、スクリプトをテスト実行します。
python3 /path/to/restore_icons.py snapshot
現在のレイアウトのスナップショットが作成されます。 shut down メニューがデスクトップに表示されますが、 outside デスクトップのメニューをクリックしてキャンセルします。
次に、デスクトップ上のアイコン(位置)を意図的に台無しにします。
最後に、別の引数を使用してスクリプトを再度実行します。
python3 /path/to/restore_icons.py restore
20秒間待機する(注が含まれる理由を参照)スクリプトで)、デスクトップアイコンはスナップショットを作成する前の状態に復元されます。
すべてが正常に機能する場合は、ショートカットキーを追加します。[システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット]を選択します。 「+」をクリックして、コマンドを追加します。
python3 /path/to/restore_icons.py snapshot
これは、コンピューターをシャットダウンするために使用する必要があるショートカットです。
restore コマンドをスタートアップアプリケーションに追加します:ダッシュ>スタートアップアプリケーション>追加。コマンドを追加します。
python3 /path/to/restore_icons.py restore
これで、起動(ログイン)から20秒後、アイコンはシャットダウンしたままの状態になります。
20秒の休憩は、復元コマンドを実行する前に2番目のモニターが検出されて再接続されることを確認することです。
このスクリプトは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"])
すばらしいスクリプトをありがとう
シナモン
この問題を解決するために、saveおよびloadデスクトップアイコン設定を使用してiconic
を作成しました。さらに、次のことを行います。
スクリプトは github で取得できます。
メイン画面は次のとおりです。
iconicの github ページにアクセスして、他のすべての画面、説明、およびスクリプトのコピーを確認します。