我有两台显示器:一台是大型 2560x1600 显示器,我将其用作主显示器并在其上进行大部分工作,另一台是垂直设置的 1360x768 显示器,用作“关闭”显示器 - 用于查看日历和电子邮件、通知弹出窗口,或玩游戏时使用网络浏览器等。
我目前已将其配置为使统一启动器仅位于主显示器的左边缘。
我希望能够为每台显示器设置单独的 Unity 启动器。这样做的好处是,每台显示器上的应用程序只与该显示器上的启动器相关联,这有助于保持桌面井然有序。
不幸的是,关闭显示器时的水平空间非常宝贵 —— 我不想为了这个而使用额外的 48 像素的水平空间。
解决此问题的方法是将启动器位置设置(例如通过 Unity Tweak Tool 或类似工具)更改为底部。但是,此设置会影响启动器在两个屏幕上的位置,而我希望将启动器保持在主显示器的左边缘。
如何配置 Unity 以在不同的显示器上使用不同的启动器位置?
另一种解决方案是让关闭显示器上的 Unity 启动器自动隐藏,但我想让启动器栏在主显示器上保持静态。如果有办法根据每个显示器配置自动隐藏行为,这也是一种可接受的解决方案。
我宁愿坚持使用默认的 Unity 桌面环境,但如果有另一个可以很好地处理多台显示器的 DE,我可能会感兴趣。
答案1
根据活动屏幕自动移动启动器
一个可能的解决方案是根据当前鼠标位置自动改变启动器的位置:
- 如果它在左侧屏幕上,则将启动器移到左侧
- 如果它在右侧屏幕上,则将其移至底部
在我运行的测试中,它运行得出奇的顺畅,并且窗口能够很好地适应这种变化。
剧本
#!/usr/bin/env python3
import subprocess
import time
scr_data = subprocess.check_output(["xrandr"]).decode("utf-8")
border = int([s.split("x")[0] for s in scr_data.split() if "+0+0" in s][0])
left_scr = [l.split()[0] for l in scr_data.splitlines() if "+0+0" in l][0]
key = "com.canonical.Unity.Launcher"
item = "launcher-position"
def catch_mouse():
return int(subprocess.check_output([
"xdotool", "getmouselocation"
]).decode("utf-8").split()[0].split(":")[1])
test1 = ""
while True:
time.sleep(1)
test2 = catch_mouse() <= border
if test2 != test1:
if test2 == True:
cmd = ["gsettings", "set", key, item, "Left"]
else:
cmd = ["gsettings", "set", key, item, "Bottom"]
subprocess.Popen(cmd)
test1 = test2
如何使用
该脚本需要
xdotool
:sudo apt-get install xdotool
将脚本复制到一个空文件中,另存为
move_launcher.py
测试-通过命令运行它(从终端)
python3 /path/to/move_launcher.py
如果一切正常,请添加到启动应用程序:Dash > 启动应用程序 > 添加。添加命令:
/binh/bash -c "sleep 15 && python3 && /path/to/move_launcher.py
编辑
...或者更高级,仅在活动屏幕上的任意位置处有一个启动器。
...一个仅设置一个启动器的脚本(在左侧屏幕,左侧):
...当您在左侧屏幕上工作时。这将在右侧屏幕上为您提供全尺寸视图...
...第二个屏幕底部有一个启动器:
...如果你移动到正确的屏幕,它会在你想要的位置为你提供你需要的启动器在右侧屏幕上。
如上所述,在测试中,窗口顺利适应,没有出现错误。
剧本
#!/usr/bin/env python3
import subprocess
import time
scr_data = subprocess.check_output(["xrandr"]).decode("utf-8")
border = int([s.split("x")[0] for s in scr_data.split() if "+0+0" in s][0])
left_scr = [l.split()[0] for l in scr_data.splitlines() if "+0+0" in l][0]
right_scr = [l.split()[0] for l in scr_data.splitlines() if all([
not "+0+0" in l, l.count("+") == 2])][0]
key = "com.canonical.Unity.Launcher"
item = "launcher-position"
subprocess.call(["dconf", "write",
"/org/compiz/profiles/unity/plugins/unityshell/num-launchers", "1"])
def catch_mouse():
return int(subprocess.check_output([
"xdotool", "getmouselocation"
]).decode("utf-8").split()[0].split(":")[1])
test1 = ""
while True:
time.sleep(1)
test2 = catch_mouse() <= border
if test2 != test1:
if test2 == True:
cmd1 = ["xrandr", "--output", left_scr, "--primary"]
cmd2 = ["gsettings", "set", key, item, "Left"]
else:
cmd1 = ["xrandr", "--output", right_scr, "--primary"]
cmd2 = ["gsettings", "set", key, item, "Bottom"]
subprocess.Popen(cmd1)
subprocess.call(cmd2)
test1 = test2
使用
- 此版本的运行方式与第一个版本完全相同。
笔记
这只是两个例子。很多事情都是有可能的。
二发射器,同时在不同的位置每屏幕,目前是不可能的,直到有人创造出这个选择……
答案2
我看不到在不同的显示器上为单个启动器(例如 Unity)选择不同位置的机制。
考虑到实际空间的问题(水平空间有限),我认为将启动器放在屏幕底部并自动隐藏它是一个解决方案。
在 Ubuntu 16.04 LTS 中,您可以将启动器移至底部,但我意识到这会导致主显示器左侧没有启动器(您的另一个问题)。
那么 - 如果在两个屏幕上都有两个(隐藏的)启动器会怎么样?一个在左侧,一个在屏幕底部?
请参阅本文以了解使用备用启动器(Cairo Dock)的机制: http://www.howtogeek.com/202708/how-to-convert-the-unity-launcher-into-a-dock-style-launcher/
我已经测试过这个(14.04 LTS),并且可以确认安装 Unity Tweak Tool 和 Cairo Dock 会在两个屏幕上为您提供两个(如果您愿意,可以隐藏)启动器 - 一个(Unity Launcher)在左侧,另一个(Cairo Dock)在屏幕底部。
根据我对您需求的评估,这可以满足两者,但意味着在两个屏幕上运行两个启动器,以便您可以根据自己的需要选择使用哪个启动器。
如果您有多个显示器,Cairo-Dock 允许您利用 Xinerama 中的功能来管理 Dock/Launcher 的位置,以便它仅出现在一个显示器上的特定位置。
如果 Dock/Launcher 始终自动隐藏,我认为这不会带来显著的好处,但它可能会为您提供一些灵活性,甚至可能提供我想不到的解决方案……:)
请参阅此处了解选项:https://glx-dock.org/bg_topic.php?t=5632