Можно ли переключаться между рабочими пространствами в Unity (14.04+)?
Я настроил свои сочетания клавиш так, чтобы Alt + left уводил меня в рабочее пространство влево, а Alt + right уводил меня в рабочее пространство справа, но я бы предпочел один набор клавиш для циклического переключения. В идеале что-то вроде
workspace 1 + Alt + tab ---> worskspace 2
workspace 2 + Alt + tab ---> worskspace 3
workspace 3 + Alt + tab ---> worskspace 4
workspace 4 + Alt + tab ---> worskspace 1
Проблема в последней строке. Я не вижу способа вернуться из рабочего пространства 4 обратно в рабочее пространство 1. Как перейти вправо по модулю 4?
2 ответа
Перейдите через ваши окна просмотра
С помощью небольшого сценария очень хорошо можно просматривать рабочие пространства (на самом деле области просмотра):
вперед:
(Если достигнут последний видовой экран, скрипт переместится на первый)
... илиназад:
(Если достигнут первый видовой экран, скрипт перемещается на последний)
Сценарий
#!/usr/bin/env python3
import subprocess
import sys
move = sys.argv[1]
# get the needed info from wmctrl -d
wsdata = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
# retrieve total size of workspace
ws = [int(n) for n in wsdata[3].split("x")]
# panel/launcher height/width
pans = [int(n) for n in wsdata[7].split(",")]
# work area
wa = [int(n) for n in wsdata[8].split("x")]
# x/y resolution
res_h = pans[0]+wa[0]; res_v = pans[1]+wa[1]
# current position in the spanning workspace
VP = [int(n) for n in wsdata[5].split(",")]
def last_h():
# test if we are on the last viewport horizontally
return VP[0]+res_h == ws[0]
def first_h():
# test if we are on the first viewport horizontally
return VP[0] == 0
def last_v():
# test if we are on the last viewport vertically
return VP[1]+res_v == ws[1]
def first_v():
# test if we are on the first viewport vertically
return VP[1] == 0
if move == "next":
if last_h() == False:
command = str(VP[0]+res_h)+","+str(VP[1])
elif last_v() == True:
command = "0,0"
else:
command = "0,"+str(VP[1]+res_v)
if move == "prev":
if first_h() == False:
command = str(VP[0]-res_h)+","+str(VP[1])
elif first_v() == True:
command = str(ws[0]-res_h)+","+str(ws[1]-res_v)
else:
command = str(ws[0]-res_h)+","+str(VP[1]-res_v)
subprocess.Popen(["wmctrl", "-o", command])
Как пользоваться
sudo apt-get install wmctrl
Скопируйте скрипт в пустой файл, сохраните его как
through_viewports.py
Добавьте две команды для двух разных сочетаний клавиш:
python3 /path/to/through_viewports.py next
перейти к следующему окну просмотра и:
python3 /path/to/through_viewports.py prev
перейти к предыдущему окну просмотра
Откройте Системные настройки> Клавиатура> Сочетания клавиш> Пользовательские сочетания клавиш. Нажмите на
+
и добавьте обе команды в ярлыки, которые вам нравятся.
Вот и все. Сценарий определяет, как настроены ваши видовые окна, и просматривает их.
Как это работает, концепция
В Unity области просмотра расположены в одной большой матрице, которая вместе составляет единую рабочую область, из которой существует рабочий стол Unity.
Используя команду:
wmctrl -d
на выходе мы можем прочитать всю информацию, которая нам нужна, чтобы узнать, где мы находимся в настоящее время в матрице.
0 * DG: 5120x2400 VP: 0,0 WA: 65,24 1215x776 N/A
5120x2400
общий размер всех видовых экранов (матрица)0,0
X / Y позиция текущего видового экрана в матрице (вверху слева, в пикселях)- от
WA: 65,24 1215x776
мы можем получить разрешение экрана (65,24
ширина / высота панели запуска / панели,1215x776
это оставшаяся область)
Как только мы получим правильную информацию, скрипт рассчитывает целевую позицию в матрице и устанавливает ее с помощью команды:
wmctrl -o x,y
В 12.04 я решил эту проблему, отредактировав ключ с помощью gconf-editor, но в 16.04 этого ключа не было, поэтому вот что сработало для меня:
sudo apt-get install compizconfig-settings-manager
который устанавливает утилиту расширенных настроек графического интерфейса, затем
ccsm
который запускает его. А затем я перешел к Desktop Wall > Переключение видового экрана> Allow Wrap-Around и установил флажок.