Рабочие пространства 18.04 (gnome) - Как управлять (например, произвольно переупорядочивать) рабочими пространствами?
=====================================================================================================================

 Рабочие пространства Gnome очень удобны в использовании, но я считаю, что ими очень трудно управлять. Например: 

* Закрытие последнего окна в рабочей области приводит к закрытию этой рабочей области (если не сразу, то вскоре)
* Новые окна могут быть вставлены только в всегда существующую пустую рабочую область внизу.
* Перемещение рабочих пространств потребует перемещения каждого окна по отдельности, и если рабочее пространство станет пустым во время этого намеченного процесса, рабочее пространство закроется.

 Возможности, которые я, хотя и существует, но не могу найти: 

* Способность подавлять автоматическое закрытие рабочих пространств, возможно, заменить на закрытое (пустое) рабочее пространство. команда.
* Возможность вращать рабочие пространства (чтобы пустое рабочее пространство можно было разместить где угодно)
* Возможность поменять любое рабочее пространство с его нижним соседом

 Может быть, я просто не знаю об общеизвестных фактах , Или, может быть, Gnome предлагает API для программирования такого поведения. Или, может быть, это невозможно. 

 Пожалуйста, сообщите. 

---

  **Приложение. Через несколько дней после выбора ответа на этот вопрос я нашел относительно простой API для достижения поставленных целей. Эта информация предоставляется  [ниже](https://askubuntu.ru/questions/259121/rabochie-prostranstva-18-04-gnome-kak-upravljat-naprimer-proizvolno-pereuporjadochivat-rabochimi-prostranstvami)  в качестве нового ответа.**  

 В GNOME Shell по умолчанию нельзя перемещаться по всем рабочим областям с приложениями, которые они содержат. Хотя это было бы мощной функцией, я не знаю, в каких средах Linux это предусмотрено. 

  Что касается ожидаемых функций, ситуация выглядит следующим образом: 

   ***Возможность подавления автоматического закрытия рабочих пространств, возможно, для замены на закрытое (пустое). ) -workspace command.***    
 По умолчанию GNOME Shell поставляется с динамическими рабочими пространствами. Это, однако, может быть отключено, и вы можете установить количество фиксированных рабочих областей. Для этого установите (GNOME) Tweaks и выберите «Статические рабочие пространства» на вкладке «Рабочие пространства» [, как показано здесь](https://askubuntu.com/questions/1081251/multiple-workspaces-on-ubuntu-18-04-1-lts/1081253#1081253) . 

   ***Возможность вращать рабочие пространства (чтобы пустое рабочее пространство можно было разместить где угодно)***    
 Нет возможности изменить порядок рабочих пространств (и их содержимое) , к несчастью. Вы можете только перемещать приложения. Конечно, в статических рабочих пространствах пустое рабочее пространство остается пустым. 

   ***Возможность поменять любое рабочее пространство с его нижним соседом***    
 Это зависит от того, что вы имеете в виду. Если вы имеете в виду снова изменить порядок рабочих пространств, то смотрите пункт выше. Если вы имеете в виду быстрое переключение рабочих пространств, то это легко достигается с помощью сочетаний клавиш  `Ctrl  +  `Alt  +  `Вверх  /  `Вниз  или  `Super  +  `PgDn  /  `PgUp .``````` 

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

   **Несколько советов по улучшению рабочего процесса со статическими рабочими пространствами**  

 * Вы можете установить расширение GNOME Shell «Индикатор рабочего пространства», чтобы обеспечить индикатор текущего рабочего пространства, в котором вы находитесь. Расширение позволяет вам переименовывать ваши рабочие пространства, если вы хотите (например, «1 - Просмотр», а не «1»).
* Вы можете настроить горячие клавиши для быстрого переключения на определенную рабочую область или перемещения приложения, например: 

 
```
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-4 "['<Super>4']"
gsettings set org.gnome.desktop.wm.keybindings move-to-workspace-4 "['<Super><Shift>4']"

```
  Эти команды установят горячую клавишу  `Super  +  `4 , которая немедленно приводит вас к WS 4, и горячая клавиша  `Super  +  `Shift  +  `4 , которая перемещает приложение в WS 4 (так же, как это работает в диспетчере окон листов i3).`````

 

  **Примечание: отвечая на мой собственный вопрос**  - *, оставляя принятый ответ, поскольку он точно отражает статус гнома.*  

 

---

  Существует проект  [*xdotool*](https://www.semicomplete.com/projects/xdotool/) , который удобно предоставлять в виде управляемой упаковки Ubuntu 18.04. Он предлагает доступ для чтения и записи к рабочим столам, окнам и их отношениям. (Также много других функций, которые я не использовал.) 

  Используя этот пакет, было просто кодировать нужные функции. Прямой интерфейс командной строки бесполезен, но связывать их с пользовательскими ярлыками Ubuntu означало, что я, например, мог перемещать выбранные и перемещать отдельные рабочие столы вверх и вниз с помощью клавиш, наблюдая за всеми рабочими столами с помощью стандартного птичьего полета Gnomes. 

 Стандартный птичий глаз Gnome доступен через «Super + a, Super + a», а затем перемещает мышь к правой стороне экрана, после чего все рабочие столы отображаются в виде вертикального массива. 

  Чтобы избежать вмешательства в Gnome, необходимо было отключить динамические рабочие столы  *Gnome*  и использовать вместо этого параметр  *статические рабочие столы* . Использование  *статических рабочих столов*  было предложено в выбранном ответе. 

  Мой полный код  [предоставляется в виде сущности](https://gist.github.com/craigphicks/37331cc2380304a5c450d27c766060cd) . 

  В качестве примера, этот отрывок кода предназначен для обмена рабочими столами: 

 
```
swaprelative(){
    nbr=$1
    ndt=$(xdotool get_num_desktops)
    if [[ $ndt -lt 2 ]] ; then return 0 ; fi
    adt=$(xdotool get_desktop)
    bdt=$((( adt + ndt + nbr) % ndt ))
    if [[ $bdt == $adt ]] ; then return 0; fi
    if [[ $bdt -lt 0 ]] ; then
        echo "relative neighbor value $nbr is out of bounds"
        return 1;
    fi
    xdotool search '.' | while read w ; do
        if ! window_has_desktop $w ; then continue; fi
        wdt=$(xdotool get_desktop_for_window $w)
        if [[ $wdt -eq $adt ]] ; then
            xdotool set_desktop_for_window $w $bdt
        elif [[ $wdt -eq $bdt ]] ; then
            xdotool set_desktop_for_window $w $adt
        fi
    done
    xdotool set_desktop $bdt
}

```
  Следует подчеркнуть, что кодирование было настолько простым, благодаря мощности проекта `xdotool`. Этот проект не зависит от  *Gnome* , а работает параллельно с  *Gnome* , получающим доступ к тем же примитивам  *X* . Скорее всего, его можно использовать в нескольких различных оконных менеджерах, при условии, что будут предприняты меры для предотвращения взаимных помех между WM и xdotool (например, отключение динамических рабочих столов в Gnome).