Как сохранить положение значков на рабочем столе после перезагрузки на настройке с двумя мониторами (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()

Как пользоваться

  1. Скопируйте скрипт в пустой файл, сохраните его как restore_icons.py
  2. В разделе заголовка скрипта установите соответствующее (локализованное) имя Desktop папка:

    # --- set your localized desktop name below:
    dt_name = "Desktop"
    # ---
    
  3. Протестируйте скрипт, запустив команду:

    python3 /path/to/restore_icons.py snapshot
    

    Будет сделан снимок текущего макета. Выключенное меню появляется на рабочем столе, но отмените его, щелкнув за пределами меню на рабочем столе.

    Затем сознательно возитесь с вашими иконками (позициями) на рабочем столе.
    Наконец, снова запустите скрипт с другим аргументом:

     python3 /path/to/restore_icons.py restore
    

    Подождите 20 секунд (см. Примечание внизу, почему это включено в сценарий), и значки вашего рабочего стола будут восстановлены до того состояния, которое было до того, как вы сделали снимок.

  4. Если все работает нормально, добавьте горячую клавишу: Выберите: "Системные настройки" > "Клавиатура" > "Горячие клавиши" > "Пользовательские горячие клавиши". Нажмите "+" и добавьте команду:

    python3 /path/to/restore_icons.py snapshot
    

    Это будет ярлык, который вам нужно использовать, чтобы выключить компьютер.

  5. Добавьте команду восстановления в 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"])

Большое спасибо за этот отличный сценарий

корица

Другие вопросы по тегам