Ubuntu 18.04:在显示器旋转时更改停靠位置

Ubuntu 18.04:在显示器旋转时更改停靠位置

在我当前的配置中,屏幕左侧有一个 Dock(显示应用程序图标)。我想知道是否可以在显示器旋转 90 度时将 Dock 移到顶部(以避免缩小屏幕宽度)。另外,当我回到水平显示器方向时,我希望 Dock 回到原来的位置。有人能帮我做到这一点吗?

环境

我正在运行 Ubuntu 18.04 并使用默认的 gnome 桌面环境。我的电脑是一台二合一笔记本电脑,可以根据设备方向自动旋转屏幕。

当前尝试

我研究了可以实现这一点的 gnome 扩展,但是Dash 到 Dock没有这样的选择。

答案1

我们必须根据您的计算机是否配备加速度计来改变方法。如果您的计算机配备加速度计(通常是二合一笔记本电脑或平板电脑),则可以通过检测屏幕方向变化完全自动化。否则,创建一个 bash 脚本来同时更改方向和停靠位置将为您提供足够的便利。

带有加速度计的笔记本电脑

我编写了一个在启动时运行的 python3 代码。该脚本会监听屏幕旋转变化并相应地更改停靠位置。

  1. 下载Dash 到 Dockgnome 扩展。就我而言,不需要启用它,但可能需要启用它。
  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 中将文件保存在 root 拥有的目录中,则需要运行sudo chmod +x <filename>
  2. 打开“启动应用程序”并添加一个新条目以指向刚刚创建的 python 文件。

名称:<any>
命令:<path to the file>
注释:<any>

  1. 重启你的电脑。

没有加速度计的计算机

此方法会创建一个 bash 脚本,当您想要更改显示方向时需要执行该脚本。

  1. 下载Dash 到 Dockgnome 扩展。就我而言,不需要启用它,但可能需要启用它。

  2. 使用您最喜欢的文本编辑器,创建一个名为“drotate”(代表 dash rotate)的 bash 文件,输入以下代码,然后保存。

#!/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 中将文件保存在 root 拥有的目录中,则需要运行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

相关内容