答案1
原因
最有可能的是,这个问题是由错误(与视频驱动程序有关)引起的。我猜想第二个屏幕不知为何没有被记住,而是在启动(登录)过程的较晚阶段“虚拟”地重新连接。
解决方法
通常,即使它是一个错误,也并不意味着我们无法找到解决方法。如果我们:
- 可以在退出时对当前图标位置进行某种快照
- 恢复图标位置后重启后第二个屏幕正确显示(登录)
该错误已被有效解决。
如何读取桌面上的图标位置
您可以使用以下命令获取图标在桌面上的位置:
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”)
采取快照当前图标布局,运行命令:
python3 /path/to/restore_desktop.py snapshot
要恢复之前拍摄的快照:
python3 /path/to/restore_desktop.py restore
然后点击桌面并按F5刷新桌面。
然而,在我们的案例中使用该脚本需要进行一些补充
桌面仍然需要刷新从命令行实际上申请图标的恢复。这可以通过重新启动 来完成
nautilus
,或者F5在桌面在前面的情况下按下 来完成。由于我们在启动时使用它,因此第一个选项可能是最优雅的。我们需要在退出时拍摄快照作为当前用户确保最后一个图标布局被记录到快照中。到目前为止,我找不到这样做的方法。但是,和往常一样,有一个解决方法。如果我们包含命令
gnome-session-quit --poweroff
在我们的脚本中,我们可以简单地调用脚本(使用正确的参数)来包含关机程序和拍摄快照。
- 然后确保恢复的快照应用我们可以在脚本中包含 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()
如何使用
- 将脚本复制到一个空文件中,另存为
restore_icons.py
在脚本的头部部分,设置
Desktop
文件夹的适当(本地化)名称:# --- set your localized desktop name below: dt_name = "Desktop" # ---
通过运行以下命令来测试运行脚本:
python3 /path/to/restore_icons.py snapshot
将拍摄当前布局的快照。关闭菜单出现在桌面上,但可以通过单击来取消外部桌面上的菜单。
然后故意弄乱桌面上的图标(位置)。
最后,使用另一个参数再次运行脚本:python3 /path/to/restore_icons.py restore
等待 20 秒(看笔记在底部查看为什么将其包含在脚本中)并且您的桌面图标将恢复到拍摄快照之前的状态。
如果一切正常,请添加快捷键:选择:系统设置 > “键盘” > “快捷键” > “自定义快捷键”。单击“+”并添加命令:
python3 /path/to/restore_icons.py snapshot
这是您需要使用的快捷方式,用于关闭计算机。
添加恢复命令到启动应用程序:Dash > 启动应用程序 > 添加。添加命令:
python3 /path/to/restore_icons.py restore
现在启动(登录) 20 秒后,您的图标将与关机时完全一样。
笔记
20 秒的中断是为了确保在运行恢复命令之前找到并重新连接第二台显示器。
答案2
当我做了以下小改动时,该脚本也可以在 Linux Mint 18.3 Cinnamon 上运行:
代替:
nautilus 图标位置 -> nemo 图标位置 gnome-session-quit ->cinnamon-session-quit “killall”,“nautilus” ->“killall”,“nemo-desktop” subprocess.Popen([“nautilus”]) -> subprocess.POpen([“nemo-desktop”])
非常感谢这个出色的剧本
肉桂
答案3
我写这篇文章是iconic
为了解决这个问题节省和加载桌面图标设置。此外,它还将:
- 让你将图标移动到三个显示器中的任意一个
- 定义网格大小,以便根据你的喜好将图标均匀分布在桌面上
- 不会因使用多种分辨率的显示器而出现“丢失图标综合症”
- 按字母顺序对图标进行排序,按字母顺序排列(忽略“链接到”前缀),按修改日期升序或降序排序
- 根据显示器允许不同的网格大小(列 x 行),例如 4K 显示器比 2K 显示器更多
- 立即的测试用于快速试验列 x 行变化或显示器左侧、顶部、右侧或底部区域的保留空间变化的按钮
- 测试按钮将持续您定义的x秒,测试前清除所有窗口并在测试后恢复它们
- 易于修改的 Bash 脚本
您可以获取脚本github。
这是主屏幕:
访问github页面标志性的查看所有其他屏幕、说明和脚本的副本。