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.


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!


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

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.


Itu nomor ruang kerja, bukan nama. Untuk mendapatkan nama Anda harus mencari nomor di properti _NET_DESKTOP_NAMES.
— Gilles 'SO- stop being evil'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.