Как сохранить положение значков на рабочем столе после перезагрузки на настройке с двумя мониторами (Unity)?
У меня есть установка с двумя мониторами под управлением Unity на Ubuntu 14.04
Всякий раз, когда я загружаю машину, система, кажется, забывает положения значков на рабочем столе на правом дисплее (подключен через 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" на голландском языке)
Чтобы сделать снимок текущего макета значка, выполните команду:
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
Это будет ярлык, который вам нужно использовать, чтобы выключить компьютер.
Добавьте команду восстановления в Startup Applications: Dash > Startup Applications > Add. Добавьте команду:
python3 /path/to/restore_icons.py restore
Теперь через 20 секунд после запуска (входа в систему) ваши значки будут точно такими же, как вы оставили их выключенными.
Заметка
20-секундный перерыв должен убедиться, что второй монитор найден и повторно подключен до запуска команды восстановления.
Я написал iconic
чтобы решить эту проблему, позволив вам сохранить и загрузить настройки значка на рабочем столе. Дополнительно это будет:
- Позволяет перемещать значки на любой из трех мониторов
- Определите размер сетки, чтобы иконки равномерно распределялись по рабочему столу так близко или далеко друг от друга, как вы предпочитаете
- Не страдать от "синдрома потерянного значка", возникающего при использовании мониторов с несколькими разрешениями
- Сортировка значков по алфавиту, по алфавиту с префиксом "Ссылка на" игнорируется, сортировка по дате изменения по возрастанию или по дате убывания
- Разрешить различный размер сетки (столбцы x строки) в зависимости от монитора, например больше на мониторе 4K, чем на мониторе 2K
- Кнопка мгновенного тестирования для быстрого экспериментирования с изменениями строк столбца x или зарезервированного пространства для левой, верхней, правой или нижней областей монитора
- Кнопка тестирования будет действовать в течение заданных вами секунд x, очистить все окна перед тестом и восстановить их после теста
- Скрипт Bash для простых модификаций
Вы можете получить скрипт на github.
Вот главный экран:
Посетите страницу GitHub для иконических, чтобы увидеть все другие экраны, объяснения и копию сценария.
Скрипт работает и на 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"])
Большое спасибо за этот отличный сценарий
корица