Bagaimana cara mencari nama ruang kerja saat ini?

11

Apakah ada cara untuk skrip bash untuk mencari nama ruang kerja saat ini (virtual desktop)?

Ini tampaknya sangat berguna untuk hal-hal seperti menyesuaikan perilaku dalam file .bashrc saya berdasarkan pada desktop di mana shell dibuat.

DonGar
sumber
Apa manajer jendela Anda?
Jacob Vlijm
Saya menggunakan desktop Cinnamon yang diinstal pada Ubuntu. Saya pikir saya sudah mengatakannya, tetapi ketika saya mengedit pertanyaan itu, saya pasti telah menarik terlalu banyak.
DonGar
1
Di bawah Cinnamon, ini memberikan kata terakhir dalam nama desktop. Itu cukup baik untuk kasus penggunaan saya. desktop =wmctrl -d | grep '*' | sed 's/.* //g'
DonGar

Jawaban:

13

Anda dapat melakukannya dengan wmctrl -dmendaftar semua ruang kerja. The *mewakili ruang kerja saat ini:

~$ 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

Jadi, untuk mendapatkan arus saja, ambil untuk *:

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

Semoga ini membantu!

Terrance
sumber
Jika OP menggunakan Unity, hanya ada satu ruang kerja :), juga di outputwmctrl -d
Jacob Vlijm
@ JacobVlijm Maka OP mungkin tidak akan khawatir tentang ini jika hanya ada satu ruang kerja. :)
Terrance
Tentu saja dia akan, tetapi kemudian mereka disebut viewports, dan tidak secara langsung diambil dari wmctrl -d.
Jacob Vlijm
@JacobVlijm Nah, satu cahaya yang bersinar adalah bahwa Unity tidak akan lagi menjadi default dan hilang setelah rilis 18.04. : D
Terrance
Saya benar-benar menyukainya, dan mungkin akan bercabang dua.
Jacob Vlijm
11

Viewports di Unity

Jika Anda menggunakan Unity , viewport saat ini tidak dapat diambil langsung dari

wmctrl -d

karena Unity memiliki viewports, yang tidak terdeteksi secara langsung oleh wmctrl -d. Output hanya akan menampilkan satu ruang kerja:

0  * DG: 5040x2100  VP: 1680,1050  WA: 59,24 1621x1026  N/A
  • di mana resolusi saya adalah 1680 x 1050 (dari xrandr)
  • ruang kerja spanning (semua viewports) adalah 5040x2100. Itu adalah viewport 3x2: 5040/1680 = 3 dan 2100/1050 = 2.
  • Saya saat ini pada posisi 1680,1050( viewport-) (x, y)

Script di bawah ini menghitung viewport saat ini dari informasi ini:

#!/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())

Menggunakan:

  1. Install wmctrl

    sudo apt install wmctrl
    
  2. Jalankan dengan perintah

    python3 /path/to/get_viewport.py
    

    Ini akan menampilkan 1, 2, 3, atau apa pun viewport saat ini. Secara otomatis menghitung baris / kolom konfigurasi viewport Anda mungkin termasuk.

Penjelasan

masukkan deskripsi gambar di sini

Naskah

  • mendapatkan ukuran satu viewport (resolusi) dari xrandr, termasuk kemungkinan monitor tambahan.
  • mendapatkan posisi saat ini di ruang kerja spanning
  • menghitung jumlah kolom / baris dalam pengaturan viewport Anda
  • dari itu, ia menghitung viewport saat ini
Yakub Vlijm
sumber
1
Terlepas dari apa yang saya rasakan tentang Unity, skrip ini berfungsi dengan sangat baik! Bagus sekali! +1
Terrance
3

Paling tidak di shell Gnome, tapi mungkin juga di WM lain, Anda bisa menanyakan Xserver secara langsung (jika di Wayland, tidak tahu).

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

Pada dasarnya, perintah xpropakan kembali

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

dan kemudian Anda dapat memijat sedikit info untuk mendapatkan apa yang Anda butuhkan.

Rmano
sumber
Itu nomor ruang kerja, bukan nama. Untuk mendapatkan nama Anda harus mencari nomor di properti _NET_DESKTOP_NAMES.
Gilles 'SO- stop being evil'