Можно ли переключаться между рабочими пространствами в 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])

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

  1. Скрипту нужен wmctrl:

    sudo apt-get install wmctrl
    
  2. Скопируйте скрипт в пустой файл, сохраните его как through_viewports.py

  3. Добавьте две команды для двух разных сочетаний клавиш:

    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 и установил флажок.

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