Как мне найти название текущего рабочего пространства?

11

Есть ли способ для bash-скрипта найти имя текущего рабочего пространства (виртуальный рабочий стол)?

Это кажется действительно полезным для таких вещей, как настройка поведения в моем файле .bashrc на основе рабочего стола, на котором была создана оболочка.

Донгар
источник
Какой у тебя менеджер окон?
Якоб Влейм
Я использую рабочий стол Cinnamon, установленный в Ubuntu. Я думал, что сказал, но когда я отредактировал вопрос, я, должно быть, вытащил слишком много.
ДонГар
1
Под Cinnamon это дает последнее слово в имени рабочего стола. Это достаточно хорошо для моего случая использования. рабочий стол =wmctrl -d | grep '*' | sed 's/.* //g'
DonGar

Ответы:

13

Вы можете сделать это с помощью wmctrl -dсписка всех рабочих пространств. *Представляет текущее рабочее пространство:

~$ wmctrl -d
0  * DG: 3840x1080  VP: 0,0  WA: 0,25 3840x1055  1
1  - DG: 3840x1080  VP: N/A  WA: 0,25 3840x1055  2
2  - DG: 3840x1080  VP: N/A  WA: 0,25 3840x1055  3
3  - DG: 3840x1080  VP: N/A  WA: 0,25 3840x1055  4

Итак, чтобы получить только текущий, grep для *:

~$ wmctrl -d | grep -w '*'
0  * DG: 3840x1080  VP: 0,0  WA: 0,25 3840x1055  1

Надеюсь это поможет!

Терренс
источник
Если OP использует Unity, есть только одно рабочее пространство :), также в выходных данныхwmctrl -d
Jacob Vlijm
@JacobVlijm Тогда OP, вероятно, не стал бы беспокоиться об этом, если бы было только одно рабочее пространство. :)
Terrance
Конечно, он будет, но тогда они называются окнами просмотра, и не могут быть напрямую извлечены из wmctrl -d.
Якоб Влейм
@JacobVlijm Хорошо, один яркий свет - то, что Unity больше не будет по умолчанию и исчезла после выпуска 18.04. : D
Терренс
Мне на самом деле это нравится, и это, вероятно, будет раздвоено.
Джейкоб Влейм
11

Окна просмотра в Unity

Если вы используете Unity , текущий видовой экран не может быть получен непосредственно из

wmctrl -d

поскольку Unity имеет видовые окна, которые не обнаруживаются напрямую wmctrl -d. Вывод покажет только одно рабочее пространство:

0  * DG: 5040x2100  VP: 1680,1050  WA: 59,24 1621x1026  N/A
  • где мое разрешение составляет 1680 х 1050 (от xrandr)
  • охватывающее рабочее пространство (все области просмотра) 5040x2100. Это 3x2 окна просмотра: 5040/1680 = 3 и 2100/1050 = 2.
  • Я в настоящее время на (viewport-) позиции 1680,1050(х, у)

Сценарий ниже вычисляет текущий видовой экран из этой информации:

#!/usr/bin/env python3
import subprocess

def get_res():
    # get resolution
    xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    pos = xr.index("current")
    return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]

def current():
    # get the resolution (viewport size)
    res = get_res()
    # read wmctrl -d
    vp_data = subprocess.check_output(
        ["wmctrl", "-d"]
        ).decode("utf-8").split()
    # get the size of the spanning workspace (all viewports)
    dt = [int(n) for n in vp_data[3].split("x")]
    # calculate the number of columns
    cols = int(dt[0]/res[0])
    # calculate the number of rows
    rows = int(dt[1]/res[1])
    # get the current position in the spanning workspace
    curr_vpdata = [int(n) for n in vp_data[5].split(",")]
    # current column (readable format)
    curr_col = int(curr_vpdata[0]/res[0])
    # current row (readable format)
    curr_row = int(curr_vpdata[1]/res[1])
    # calculate the current viewport
    return curr_col+curr_row*cols+1

print(current())

Использовать:

  1. устанавливать wmctrl

    sudo apt install wmctrl
    
  2. Запустите его по команде

    python3 /path/to/get_viewport.py
    

    Он выведет 1, 2, 3 или любой другой текущий видовой экран. Он автоматически подсчитывает строки / столбцы, которые может содержать ваша конфигурация окна просмотра.

объяснение

введите описание изображения здесь

Сценарий

  • получает размер одного видового экрана (разрешения) xrandr, включая возможные дополнительные мониторы.
  • получает текущую позицию в рабочей области
  • рассчитывает количество столбцов / строк в настройках вашего окна просмотра
  • Исходя из этого, он рассчитывает текущий видовой экран
Якоб Влейм
источник
1
Независимо от того, как я отношусь к Unity, этот скрипт работает очень хорошо! Красиво сделано! +1
Терренс
3

По крайней мере, в оболочке Gnome, но, вероятно, и в других WM, вы можете напрямую спросить Xserver (если в Wayland, не знаю).

[romano:~/tmp] % desktop=$(xprop -root -notype  _NET_CURRENT_DESKTOP | perl -pe 's/.*?= (\d+)/$1/') 
[romano:~/tmp] % echo $desktop
1

В основном, команда xpropвернется

 [romano:~/tmp] % xprop -root -notype  _NET_CURRENT_DESKTOP
 _NET_CURRENT_DESKTOP = 1

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

Rmano
источник
Это номер рабочего пространства, а не имя. Чтобы получить имя, вы должны посмотреть номер в собственности _NET_DESKTOP_NAMES.
Жиль "ТАК - перестань быть злым"