วิธีการกำหนดตัวจัดการหน้าต่างที่กำลังทำงานอยู่


179

มีวิธีใดบ้าง (เช่นคำสั่งหรือตัวแปรสภาวะแวดล้อม) เพื่อพิจารณาว่าตัวจัดการหน้าต่างคืออะไรที่ทำงานอยู่ในเซสชันปัจจุบันหรือไม่?

คำตอบ:


145

หากคุณwmctrlติดตั้งแล้วบรรทัดแรกของเอาต์พุตจากคำสั่ง

    wmctrl -m

จะแสดงชื่อผู้จัดการหน้าต่าง หากคุณยังไม่ได้wmctrlติดตั้งให้ใช้คำสั่งต่อไปนี้เพื่อติดตั้ง:

    sudo apt-get install wmctrl

หมายเหตุman wmctrl(นั่นคือmanหน้าสำหรับwmctrl) กล่าวในส่วน:

-m แสดงข้อมูลเกี่ยวกับเครื่องมือจัดการหน้าต่าง ...

บน Ubuntu 11.10 ของฉัน / Linux 3.0.0-14 ทั่วไป # 23 อูบุนตู x86_64 / Metacity 2.34.1 ระบบบรรทัดแรกของผลลัพธ์จากwmctrl -mถูก: Name: Metacity
ในขณะที่echo $DESKTOP_SESSIONแสดงให้เห็นubuntu-2dและแสดงให้เห็นว่าecho $XDG_CURRENT_DESKTOPUnity

บน Ubuntu 15.10 ที่เพิ่งติดตั้งUbuntu desktopซอฟต์แวร์ใหม่บนแล็ปท็อปเก่าบรรทัดแรกของผลลัพธ์wmctrl -mคือ: Name: Compiz
ในขณะที่DESKTOP_SESSIONและXDG_CURRENT_DESKTOPค่าต่าง ๆubuntuและUnity


4
น่าเสียดายที่นี่ใช้ไม่ได้กับ ssh แม้ว่าจะเปิดใช้งาน X11 แล้วก็ตาม
Sridhar Sarnobat

1
@ Sridhar-Sarnobat บน Ubuntu 15.04 การรันssh -Y {host} 'wmctrl -m'จะส่งคืนค่าบางค่า (เช่น "ชื่อ: Compiz" และหลาย N / A) แต่มันสมเหตุสมผลที่sshจะมีข้อมูล จำกัด เกี่ยวกับตัวจัดการหน้าต่าง
ไมเคิล

ในเดเบียนทำงานอบเชยนี้ไม่ทำงาน เอาต์พุตของ wmctrl -m คือชื่อ: Mutter (Muffin) ในขณะที่ $ XDG_CURRENT_DESKTOP = X-Cinnamon
Floyd

บน Xubuntu Wily ให้รัน Window Maker 0.95.6 - wmctrl รายงาน N / A สำหรับรายการทั้งหมด GDMSESSION ถูกตั้งค่าเป็น wmaker-common แต่ XDG_CURRENT_DESKTOP ไม่ได้ตั้งค่าเลย
พ.ค.

@Mei คุณมี Window Maker ที่ทำงานบนระบบอื่นที่คุณสามารถเปรียบเทียบได้หรือไม่ อีกทั้งทำ wmctrl -d(แสดงรายการเดสก์ท็อปทั้งหมดที่จัดการโดยตัวจัดการหน้าต่าง) หรือ wmctrl -l(แสดงรายการหน้าต่างที่จัดการโดยตัวจัดการหน้าต่าง) ทำงานได้ดีบน Xubuntu Wily กับ Window Maker หรือไม่
James Waldby - jwpat7

101

บนระบบลินุกซ์ผมทดสอบตัวแปรสภาพแวดล้อมXDG_CURRENT_DESKTOPและGDMSESSIONและได้ผลดังต่อไปนี้

คุณสามารถใช้บรรทัดนี้เพื่อรับเอาต์พุต:

printf 'Desktop: %s\nSession: %s\n' "$XDG_CURRENT_DESKTOP" "$GDMSESSION"

Ubuntu 18.04 (Ubuntu)

  • XDG_CURRENT_DESKTOP=ubuntu:GNOME
  • GDMSESSION=ubuntu

Ubuntu 18.04 (Ubuntu บน Wayland)

  • XDG_CURRENT_DESKTOP=ubuntu:GNOME
  • GDMSESSION=ubuntu-wayland

Ubuntu 16.04


ความสามัคคี (7)

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

Ubuntu 14.04


ความสามัคคีทำงานกับ Mir

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

หมายเหตุ MIR_SERVER_NAME ถูกตั้งค่าด้วย

  • MIR_SERVER_NAME=session-$NUMBER

ความสามัคคีทำงานโดยไม่มีเมียร์

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

XFCE

  • XDG_CURRENT_DESKTOP=XFCE
  • GDMSESSION=xfce

Ubuntu 12.04


KDE

  • XDG_CURRENT_DESKTOP=
  • GDMSESSION=kde-plasma

Unity 3d

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

Unity 2d

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu-2d

คำพังเพย

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome-shell

Gnome Classic

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome-classic

Gnome Classic (ไม่มีผลกระทบ)

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome-fallback

การกระจายแบบอิง Ubuntu อื่น ๆ


มิ้นท์ 13 (อบเชย)

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=cinnamon

มิ้นต์ 16 (รุ่น KDE)

  • XDG_CURRENT_DESKTOP=KDE
  • GDMSESSION=default

มิ้นต์ 17 (อบเชย)

  • XDG_CURRENT_DESKTOP=X-Cinnamon
  • GDMSESSION=default

Lubuntu 12.04

  • XDG_CURRENT_DESKTOP=LXDE
  • GDMSESSION=Lubuntu

Wasta 14.04 / 18.04

  • XDG_CURRENT_DESKTOP=X-Cinnamon
  • GDMSESSION=cinnamon

Wasta 14.04 โดยใช้เดสก์ท็อป Gnome

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome

Ubuntu Mate 18.04

  • XDG_CURRENT_DESKTOP=MATE
  • GDMSESSION=mate

Xubuntu 18.04

  • XDG_CURRENT_DESKTOP=XFCE
  • GDMSESSION=xubuntu

4
มิ้นท์ 13 (อบเชย): XDG_CURRENT_DESKTOP = GNOME, GDMSESSION = ซินนามอน
rik-Shaw

1
Lubuntu 12.04: XDG_CURRENT_DESKTOP = LXDE, GDMSESSION = Lubuntu
rik-Shaw

แล้ว $ DESKTOP_SESSION ล่ะ ในฐานะที่เป็นโซลูชั่นการสำรองข้อมูล :)
Savvas Radevic

1
ถ้าฉันไม่ใช้ GDM ล่ะ?
Robert Siemer

6
และยิ่งไปกว่านั้นมันไม่ตอบตัวจัดการหน้าต่างที่ฉันใช้!
Robert Siemer

42

ในประเภทอาคารenvเพื่อดูตัวแปรสภาพแวดล้อมทั้งหมด บางส่วนของพวกเขาคือ:

XDG_CURRENT_DESKTOP - บอกให้คุณทราบถึงสภาพแวดล้อมของเดสก์ท็อปที่คุณใช้

GDMSESSION - บอกสิ่งที่คุณเลือกจากตัวเลือก lightdm greeter เพื่อเข้าสู่ระบบ

หากต้องการใช้งานให้ไปที่เทอร์มินัลแล้วพิมพ์:

echo $XDG_CURRENT_DESKTOP

(จะแสดงผลตัวอย่างเช่น 'unity' หากคุณใช้ Unity)

หรือ

echo $GDMSESSION  

(จะแสดงผลตัวอย่างเช่น 'ubuntu' หากคุณเลือก ubuntu ในการเข้าสู่ระบบหรือ 'ubuntu-2d' หากคุณเลือกไว้ในการเข้าสู่ระบบ)

คุณมีคนอื่น ๆ ถ้าคุณดูผลลัพธ์ของenvเช่นDESKTOP_SESSIONและCOMPIZ_CONFIG_PROFILE ให้ละเอียดยิ่งขึ้น

เนื่องจากสิ่งที่คุณกำลังมองหาคือชื่อของตัวจัดการหน้าต่างที่ใช้งานวิธีเดียวที่ฉันเห็นวิธีรับคือโดยดูในรายการกระบวนการ การทำเช่นนี้มีคำสั่งที่เรียกว่าpgrep( Wikipedia ) ฉันทำต่อไปนี้เพื่อรับชื่อเนื่องจากพารามิเตอร์ -l เพิ่ม ID กระบวนการ:

pgrep -l compiz |cut -d " " -f2ตั้งแต่กระบวนการกำลังทำงานโดยผู้ใช้เดียวกันไม่จำเป็นต้องนำหน้าส่วน sudo จากนั้นคุณสามารถใช้สิ่งนี้เพื่อสร้างสคริปต์ที่ดำเนินการตาม Window Manager

ที่จะมองหาประเภทอื่น ๆ เพียงแค่เปลี่ยนคำcompizไปยังอีกเช่นmutter, kwinฯลฯ ..


2
สิ่งเหล่านั้นบอกชื่อเซสชันและสภาพแวดล้อมเดสก์ท็อปให้ฉันทราบ ตัวอย่างที่เขียนว่า "GNOME" ซึ่งเป็นสภาพแวดล้อมเดสก์ท็อปที่สามารถใช้ Metacity, Mutter, Compiz หรือตัวจัดการหน้าต่างอื่น ๆ มันบอกว่า "gnome-classic" ซึ่งเป็นชื่อเซสชันไม่มีตัวจัดการหน้าต่างที่มีชื่อนั้น
ไม่เปิดเผยตัว

1
ไปแล้ว พบคำสั่งที่สามารถช่วยในรายการกระบวนการ pgrep อย่างน้อยก็มันจะแสดงชื่อของตัวจัดการหน้าต่างหากพบ พยายามตรวจสอบว่าฉันสามารถเพิ่มทั้งหมดเข้าด้วยกันได้ไหม คำถามของคุณดีมากเนื่องจาก Ubuntu 11.10 สร้างความสับสนเล็กน้อยโดยใช้ Compiz (หรือ Mutter ถ้าเมื่อ Gnome 3.x) ดังนั้นจะเป็นการดีที่จะชี้ให้เห็น Window Manager จริงที่ใช้ใน Unity
Luis Alvarado

$XDG_CURRENT_DESKTOPเป็นสภาพแวดล้อมเดสก์ทอปปัจจุบันไม่ใช่ตัวจัดการหน้าต่าง
เคนชาร์ป

24

ฉันพบว่าpstreeช่วยได้มาก

การติดตั้ง

sudo apt-get install pstree

เอาท์พุต

นี่คือสิ่งที่ฉันได้รับ

 ├─lightdm─┬─Xorg───2*[{Xorg}]
 │         ├─lightdm─┬─gnome-session─┬─bluetooth-apple───2*[{bluetooth-apple}]
 │         │         │               ├─compiz─┬─sh───gtk-window-deco───2*[{gtk-window-deco}]
 │         │         │               │        └─5*[{compiz}]
 │         │         │               ├─deja-dup-monito───2*[{deja-dup-monito}]
 │         │         │               ├─gnome-fallback-───2*[{gnome-fallback-}]
 │         │         │               ├─gnome-screensav───2*[{gnome-screensav}]
 │         │         │               ├─gnome-settings-───2*[{gnome-settings-}]
 │         │         │               ├─nautilus───2*[{nautilus}]
 │         │         │               ├─nm-applet───2*[{nm-applet}]
 │         │         │               ├─polkit-gnome-au───2*[{polkit-gnome-au}]
 │         │         │               ├─ssh-agent
 │         │         │               ├─telepathy-indic───2*[{telepathy-indic}]
 │         │         │               ├─update-notifier───2*[{update-notifier}]
 │         │         │               ├─vino-server───2*[{vino-server}]
 │         │         │               ├─zeitgeist-datah───{zeitgeist-datah}
 │         │         │               └─3*[{gnome-session}]
 │         │         └─{lightdm}
 │         └─2*[{lightdm}]

1
สิ่งนี้ทำให้ฉันอยู่ที่นั่นด้วยระบบ buildroot ที่กำหนดเองของฉัน
jc__

11
xprop -id $(xprop -root -notype | awk '$1=="_NET_SUPPORTING_WM_CHECK:"{print $5}') -notype -f _NET_WM_NAME 8t 

1
คุณอธิบายได้ไหมว่ามันทำงานอย่างไร นอกจากนี้ฉันคิดว่าคุณหายไป)ในตอนท้าย
Louis Matthijssen

@LouisMatthijssen 1. xprop -root -notypeแสดงคุณสมบัติทั้งหมดของหน้าต่างรูต (และละเว้นประเภทสำหรับการแยกวิเคราะห์ได้ง่ายขึ้น) เอาต์พุตจะถูกส่งไปยังawkผ่านไพพ์ 2. awkคำสั่ง$1=="_NET[blah]CK:"{print $5}'เปรียบเทียบคอลัมน์แรกของแต่ละแถวของอินพุตที่ได้รับผ่านไปป์กับสตริงที่กำหนดและหากพบการจับคู่จะรันโค้ดในวงเล็บซึ่งพิมพ์คอลัมน์ที่ห้าจากแถวนี้ - เกิดขึ้นโดยบังเอิญ ฉันเดิมพัน) เพื่อเป็น ID ของอะตอม "_NET_SUPPORTING_WM_CHECK" 3. ID นี้จะถูกใช้อีกครั้งเพื่อรับคุณสมบัติของตัวจัดการ Windows ด้วยxprop -id
cprn

4

ฉันได้ทำการทดสอบกับ KDE ด้วยและข้อสรุปของฉันคือ:

a) วิธีกราฟิกกับ HardInfo: คำตอบอยู่ใน "ระบบปฏิบัติการ"> "สภาพแวดล้อมของเดสก์ท็อป" แต่ถ้าไม่ใช่คุณสามารถดูที่ "ตัวแปรสภาพแวดล้อม" HardInfo พร้อมกับ distros ที่ทดสอบแล้วทั้งหมดยกเว้นอันที่มี KDE แต่สามารถติดตั้งได้ง่ายและรวดเร็ว (เพียง 2 แพ็คเกจใน Linux Mint 13)

ข) ps -A | egrep -i "gnome|kde|mate|cinnamon|lx|xfce|jwm"บรรทัดคำสั่งด้วยคำสั่งนี้: รายการที่ปรากฏในบรรทัดเพิ่มเติมควรเป็นคำตอบ (หากมีการวาดรายการที่มี "เซสชั่น" ควรเป็นทางออก)


XFCE ยังมีgnome-...กระบวนการหลายขั้นตอน (และ kde hit ด้วยkdevtmpfs)
Xen2050

2

ข้างต้นไม่ได้ผลสำหรับฉันฉันแค่อยากจะรู้ว่าฉันใช้ Gnome เป็นเซสชันเดสก์ท็อปปัจจุบันของฉันหรือไม่

นี่คือสิ่งที่ทำงานได้เปิดเทอร์มินัล

lsb_release -a

(เพื่อตรวจสอบว่าฉันได้ติดตั้งรสชาติหรือรุ่นใดบนเครื่อง UBUNTU ของฉัน)

ls /usr/bin/*session

(เปิดใช้เซสชันเดสก์ท็อป / สภาพแวดล้อมเดสก์ท็อปที่ใช้งานอยู่)

gnome-shell --version 

(เพื่อดูว่ามีการติดตั้ง gnome รุ่นใด)


1
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e.wordpress.com)


windowManagerName () {
    window=$(xprop -root -notype)
    identifier=$(echo "${window}" | awk '$1=="_NET_SUPPORTING_WM_CHECK:"{print $5}')
    attributes=$(xprop -id "${identifier}" -notype -f _NET_WM_NAME 8t)

    echo "${attributes}" |
        grep "_NET_WM_NAME = " |
        cut --delimiter=' ' --fields=3 |
        cut --delimiter='"' --fields=2
}


windowManagerName

หรือในหนึ่งบรรทัด:

id = $ (xprop -root -notype | awk '$ 1 == "_ NET_SUPPORTING_WM_CHECK:" {พิมพ์ $ 5}'); xprop -id "$ {id}" -notype -f _NET_WM_NAME 8t | grep "_NET_WM_NAME =" | ตัด --delimiter = '' - ฟิลด์ = 3 | cut --delimiter = '"' - ฟิลด์ = 2


0

สิ่งนี้สามารถจัดทำได้ด้วย dbus และ Accounts (ทั้งสองค่าเริ่มต้นใน Ubuntu)

$ qdbus --system org.freedesktop.Accounts \                                                                
> /org/freedesktop/Accounts/User1000 \                                                                                     
> org.freedesktop.Accounts.User.XSession                                                                                   
ubuntu

น่าสังเกตว่าฉันได้ทดสอบสิ่งนี้ด้วยการเข้าสู่ระบบผ่าน lightdm (นั่นคือหน้าจอเข้าสู่ระบบแบบกราฟิก) มันตรวจจับเดสก์ท็อปแบบคลาสสิคเช่น blackbox และตรวจจับ Unity อย่างชัดเจน ฉันสงสัยว่านี่เป็นค่าของสิ่งที่ผู้ใช้เลือกบนหน้าจอการเข้าสู่ระบบเป็นเซสชันนั่นเป็นเหตุผลว่าทำไมการใช้กระบวนการตรวจสอบกระบวนการจึงง่ายขึ้นเล็กน้อย


0

ต้นฉบับ

สคริปต์ต่อไปนี้ส่งผลให้เป็นคำตอบที่ดีที่สุดในการที่คล้ายกันคำถามที่ผมโพสต์มากกว่าที่ unix.se มันใช้งานได้ดีกับ Unity และ LXDE

if [ "$XDG_CURRENT_DESKTOP" = '' ]
then
  desktop=$(echo "$XDG_DATA_DIRS" | sed 's/.*\(xfce\|kde\|gnome\).*/\1/')
else
  desktop=$XDG_CURRENT_DESKTOP
fi

desktop=${desktop,,}  # convert to lower case
echo "$desktop"

0

inxiคุณสามารถใช้เครื่องมือที่เรียกว่า สามารถรับได้จากที่เก็บ Ubuntu โดย:

sudo apt install inxi

หรือจาก GitHub: https://github.com/smxi/inxi

เพียงรันคำสั่งดังนี้:

inxi -Sx
System:    Host: blackhole Kernel: 5.1.15-050115-lowlatency x86_64 bits: 64 compiler: gcc v: 8.3.0
           Desktop: i3 4.16.1-178-g31c0f1b8 Distro: Ubuntu 19.04 (Disco Dingo)

หมายเหตุDesktop: i3ส่วนหนึ่ง i3ในกรณีของฉันจัดการหน้าต่างที่ผมใช้เป็น

ตัวเลือก-Sแสดงข้อมูลระบบและxเพิ่มข้อมูลเกี่ยวกับตัวจัดการหน้าต่าง


-3

ฉันสามารถนึกถึงการตรวจสอบผู้จัดการหน้าต่างที่รู้จักในกระบวนการทำงาน เคยมีคีย์ใน gconf ที่ตั้งค่าเป็นตัวจัดการหน้าต่างที่ต้องการ แต่เลิกใช้แล้วตั้งแต่ Gnome 2.12

ดังนั้นหากนี่คือจุดประสงค์ในการเขียนโปรแกรมฉันขอแนะนำให้คุณศึกษาตัวจัดการหน้าต่าง linux ทั้งหมด ความนิยมคือ:

  • gnome-เปลือก *
  • Compiz
  • Metacity
  • พูดพึมพำ
  • ปลาฉนาก

คุณจะต้องเรียกใช้การตรวจสอบสำหรับแต่ละคำสั่งpgrep -l $WINDOW_MANAGERโดยที่$WINDOW_MANAGERเป็นชื่อของตัวจัดการหน้าต่างที่คุณต้องการตรวจสอบ pgrepการตรวจสอบคำสั่งสำหรับกระบวนการทำงาน

ฉันไม่แน่ใจ 100% ว่า Gnome Shell เป็นตัวจัดการหน้าต่างหรือไม่ ส่วนที่เหลือของผู้จัดการหน้าต่างที่ฉันได้รับจากรายการใน/usr/bin/gnome-wmสคริปต์ อันที่จริงสคริปต์นี้ควรจะใช้งานได้ (ตั้งแต่มีอยู่ในการติดตั้งใหม่ทั้งหมด) แต่ในกรณีของฉันพยายามเรียกใช้compizซึ่งไม่ใช่ตัวจัดการหน้าต่างเริ่มต้นของฉัน (ไม่ใช่ในเซสชัน Gnome ของฉัน)

แก้ไข:

ความเห็นของ @Anarci ก็ดูเหมือนจะแม่นยำยิ่งขึ้น gnome-shellในกรณีของฉันมันไม่แสดง


1
ดูเหมือนว่า pgrep รองรับ regex เพื่อให้สามารถใช้รูปแบบที่มีทางเลือก pgrep -l "compiz|metacity|mutter|kwin|sawfish|fluxbox|openbox|xmonad"
ไม่ระบุชื่อ

1
ไม่เพียงพอ: จะเกิดอะไรขึ้นถ้าผู้ใช้กำลังเรียกใช้งานเซสชัน X หลาย ๆ ครั้งกับผู้จัดการที่แตกต่างกัน อย่างน้อยคุณควรตรวจสอบว่าตัวจัดการหน้าต่างทำงานบนจอแสดงผลที่คุณสนใจ (คุณสามารถทำได้โดยตรวจสอบ$DISPLAYสภาพแวดล้อมของหน้าต่าง)
Gilles

Ubuntu 18.04 LTS Desktop: Unity: Unity7: ubuntu Session: unity
user2584621
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.