Phát hiện cửa sổ hiện đang hoạt động


52

Công cụ dòng lệnh linux wmctrlcho phép bạn liệt kê tất cả các cửa sổ hoặc tất cả các máy tính để bàn, trong số những thứ khác. Trong chế độ liệt kê máy tính để bàn, máy tính để bàn hiện tại được đánh dấu bằng dấu hoa thị.

Tôi cần một công cụ có thể tìm ra tiêu đề của cửa sổ hiện đang hoạt động. Thật không may, wmctrlkhông có người trợ giúp thực hiện việc này - mặc dù nó biết cửa sổ nào hiện đang hoạt động (xem :ACTIVE:điểm đánh dấu).

Có công cụ dòng lệnh nào khác có thể cung cấp cho tôi id cửa sổ và / hoặc tiêu đề cửa sổ của cửa sổ hiện tại không?

Câu trả lời:


56

Cài đặt xdotool, sau đó chạy

xdotool getwindowfocus getwindowname

Nó sẽ đưa ra ví dụ cho trang web hiện tại được mở trong Firefox:

linux - Detecting currently active window - Super User - Mozilla Firefox

Công cụ đắc lực! Ngoài việc có được cửa sổ hoạt động hiện tại, nó còn có rất nhiều chức năng hữu ích khác.
Searene

So với câu trả lời của Jim Paris, điều này có nhược điểm là phải phụ thuộc vào cài đặt, nhưng dường như nó chạy nhanh hơn, đặc biệt nếu xdotool đã có trong bộ đệm đĩa.
mc0e

1
Nếu bạn muốn thao tác với cửa sổ hiện tại wmctrl, bạn có thể làm : wmctrl -i -r `xdotool getwindowfocus` -e 0,10,10,-1,-1, trong đó thông báo -icho wmctrl mong đợi id cửa sổ thay vì tiêu đề cửa sổ.
fiedl

34

Điều này là trực tiếp hơn và chỉ sử dụng xpropcut:

xprop -id $(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2) _NET_WM_NAME

Các lệnh này chỉ là trích xuất các thuộc tính từ cửa sổ gốc và cửa sổ ứng dụng, nhưng theo yêu cầu của Lorenzo von Matterhorn:

  • Đầu tiên,

    xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW
    

    Trích xuất thuộc _NET_ACTIVE_WINDOWtính từ gốc, cung cấp cho bạn XID của cửa sổ hoạt động. Các 32x '\t$0'kể xpropđể định dạng đầu ra theo một cách mà cutcó thể dễ dàng phân tích sau đó.

  • Sau đó, chỉ trích xuất XID từ đầu ra với cut -f 2

  • Sau đó, chuyển XID thành tham số cho

    xprop -id XID _NET_WM_NAME
    

Mà in tên của cửa sổ đó.


1
xin chào, bạn có thể giải thích các đối số và một chút cú pháp không? nó có thể hữu ích cho QA và độc giả tương lai.
Lorenzo Von Matterhorn

9

Có, nhưng không có câu trả lời hoặc giải pháp ngắn.

$ wmctrl -lp | grep $(xprop -root | grep _NET_ACTIVE_WINDOW | head -1 | \
    awk '{print $5}' | sed 's/,//' | sed 's/^0x/0x0/')

kết quả:

0x03800004  0 16459  xxxxxxxxxx /bin/bash

Đang sử dụng:

$ for x in $(seq 1 10); do sleep 5; wmctrl -lp | grep $(xprop -root | \
    grep _NET_ACTIVE_WINDOW | head -1 | awk '{print $5}' | sed 's/,//' | \
    sed 's/^0x/0x0/'); done

0x03800004  0 16459  xxxxxxxxxx /bin/bash
0x020000a4  0 13524  xxxxxxxxxx linux - Detecting currently active window - Super User - Mozilla Firefox (Build 20120129142219)

1
Đây có vẻ là một giải pháp tốt, không biết về tiện ích xprop. Trong khi đó, tôi đã vá wmctrl để cung cấp tùy chọn như vậy và gửi cho tác giả. Thật không may, tôi chưa nhận được phản hồi.
Dave Vogt

1
+1 cho tính hiệu quả và "đơn giản" trên mã
Lorenzo Von Matterhorn

5

Đây là những gì làm việc cho tôi:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME

Cung cấp:

WM_NAME(STRING) = "~"

Vì vậy, có lẽ bạn sẽ làm một chút xấu xí để có được tên của chính nó:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | sed -e 's/.*"\(.*\)".*/\1/'

Cung cấp:

~

Đó là tên cửa sổ hiện đang tập trung của tôi, tất cả của chính nó.

Hoặc, tránh sed với một chút ít xấu xí:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | awk -F '"' '{print $2}'


1
Hoặc kể từ khi cắt đã được giới thiệu, bạn có thể sử dụng lại:xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | cut -d '"' -f 2
mc0e

3

Tương đối ngắn và xử lý tên cửa sổ chứa dấu ngoặc kép chính xác:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | 
sed -nr 's/.*= "(.*)"$/\1/p'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.