Ubuntu 18.04: Изменение местоположения прикрепления на вращении монитора

В моей текущей конфигурации у меня есть прикрепление (который показывает значки приложения) слева от экрана. Я задавался вопросом, возможно ли переместить прикрепление в вершину, когда монитор повернут 90 градусов (так, чтобы не сужать ширину экрана). Кроме того, я хочу, чтобы прикрепление вернулось в исходном положении, когда я возвращаюсь к горизонтальной ориентации монитора. Кто-то мог помочь мне сделать это?

Среда

Я запускаю Ubuntu 18.04 и использую рабочую среду GNOME по умолчанию. Мой компьютер 2 в 1 ноутбук, который автоматически поворачивает экран на основе ориентации устройства.

Текущая попытка

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

3
задан 23 January 2019 в 13:43

1 ответ

Мы должны изменить подходы на основе того, идет ли Ваш компьютер с акселерометром или нет. Если Ваш компьютер идет с акселерометром (обычно 2 в 1 ноутбук или планшет), это может быть полностью автоматизировано путем обнаружения экранных изменений ориентации. Иначе создание сценария удара для изменения ориентации и местоположения прикрепления одновременно дало бы Вам достаточно удобства.

Ноутбук с акселерометром

Я написал python3 код, на котором работают начальная загрузка. Сценарий слушает экранные изменения вращения и меняет положение прикрепления соответственно.

  1. Загрузите Тире для Прикрепления расширения гнома. В моем случае это не должно было быть включено, но это могло бы требоваться.
  2. С Вашим любимым текстовым редактором создайте python3 файл, поместите следующий код и сохраните его. Можно выбрать любое имя или местоположение файла, пока Вы помните, где это - так, чтобы можно было обратиться к нему на Шаге 3 и 4. Я назвал это "dock_rotator.py".

#!/usr/bin/env python3
import os
import subprocess
import dbus
from dbus.mainloop.glib import DBusGMainLoop
from gi.repository import GObject as gobject


def run_command(command, shell=False):
    """ Takes a string to run a command on bash
    """
    p = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
    output = p.communicate()[0]
    return output.decode()


def enable_view_rotation_lock():
    os.environ["GIO_EXTRA_MODULES"] = "/usr/lib/x86_64-linux-gnu/gio/modules/"


def rotation_locked():
    locked = run_command("gsettings get \
        org.gnome.settings-daemon.peripherals.touchscreen \
        orientation-lock")

    return locked.strip() == "true"

def move_dash_top():
    run_command("gsettings set org.gnome.shell.extensions.dash-to-dock dock-position TOP")

def move_dash_left():
    run_command("gsettings set org.gnome.shell.extensions.dash-to-dock dock-position LEFT")


def sensor_handler(*args, **kwargs):
    if len(args) < 2:
        return

    dbus_dict = args[1]
    key = 'AccelerometerOrientation'
    if key not in dbus_dict:
        return
    orientation = dbus_dict[key]

    if not rotation_locked():
        if orientation in ["left-up", "right-up"]:
            move_dash_top()
        else:
            move_dash_left()

def main():
    enable_view_rotation_lock()
    global loop
    DBusGMainLoop(set_as_default=True)

    loop = gobject.MainLoop()
    bus = dbus.SystemBus()

    bus.add_signal_receiver(
        sensor_handler,
        path='/net/hadess/SensorProxy')

    loop.run()


if __name__ == "__main__":
    main()
  1. Сделайте исполняемый файл кода chmod +x <filename> команда. Если бы Вы сохранили свой файл в каталоге, принадлежавшем корню на Шаге 2, то необходимо работать sudo chmod +x <filename> вместо этого.
  2. Откройте "Startup Application" и добавьте, что новая запись в прямо к Python регистрирует, Вы просто создали.

Имя: <any>
Команда: <path to the file>
Комментарий: <any>

  1. Перезагрузите компьютер.

Компьютер без акселерометра

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

  1. Загрузите Тире для Прикрепления расширения гнома. В моем случае это не должно было быть включено, но это могло бы требоваться.

  2. С Вашим любимым текстовым редактором создайте файл удара, названный "drotate" (для тире, вращаются), поместите следующий код и сохраните его.

#!/bin/bash

show_help () {
    echo "drotate <rotation> [<display number>]"
    echo "<rotation> : inverted | left | normal | right "
    echo "<display number> : any number between 1 to number of displays connected"
    echo "                   defaults to 1"
}

set_gnome_orientation () {
    case "$1" in
        inverted)
            GNOME_ORIENTATION=LEFT
        ;;
        normal)
            GNOME_ORIENTATION=LEFT
        ;;
        left)
            GNOME_ORIENTATION=TOP
        ;;
        right)
            GNOME_ORIENTATION=TOP
        ;;
        *)
        echo "Invalid orientation"
        show_help
        exit 1
        ;;
        esac
}

if [ $# -eq 0 ] || [ $# -gt 2 ]; then
    show_help 
    exit 1
fi

if [ $# -eq 1 ]; then
    DISPLAY_INDEX=1 # any number between 1 to # of displays connected
else
    DISPLAY_INDEX=$2
fi

DISPLAY=$( xrandr --current | grep -F connected |\
 grep -Fv disconnected | cut -d" " -f 1 | head -${DISPLAY_INDEX} | tail -1 )

if [ -z "$DISPLAY" ]; then
    echo Could not find display $DISPLAY_INDEX
    exit 1
fi
echo $DISPLAY

ORIENTATION="$1"
GNOME_ORIENTATION=""
set_gnome_orientation $ORIENTATION

xrandr -d :0 --output ${DISPLAY} --rotate ${ORIENTATION}

export GIO_EXTRA_MODULES=/usr/lib/x86_64-linux-gnu/gio/modules/
gsettings set org.gnome.shell.extensions.dash-to-dock dock-position $GNOME_ORIENTATION
  1. Сделайте исполняемый файл кода chmod +x drotate команда. Если бы Вы сохранили свой файл в каталоге, принадлежавшем корню на Шаге 2, то необходимо работать sudo chmod +x drotate вместо этого.

  2. Открытый ~/.bash. Создайте новую строку в конце файла и вставьте следующую строку. export PATH="<path/to/the/directory/with/your/script>:$PATH. Например, если Вы сохранили свой файл в /usr/local/drotate, команда становится export PATH="/usr/local:$PATH. Заметить drotate быть опущенным.

  3. Сохраните файл.

  4. Или перезапустите свой терминал или работайте source .bashrc. Они делают то же самое. Теперь Ваш сценарий должен смочь работать.

Использование

Откройте свой терминал (Ctrl-Alt-t) и тип drotate <rotation> [<display number>].

drotate <rotation> [<display number>]
<rotation> : inverted | left | normal | right 
<display number> : any number between 1 to number of displays connected
                   defaults to 1
Примеры
  1. Поверните основной дисплей к оставленному на виду: drotate left
  2. Поверните основной дисплей назад к нормальному: drotate normal
  3. Поверните свой поддисплей к оставленному на виду: drotate left 2
3
ответ дан 1 December 2019 в 16:17

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

Похожие вопросы: