Đặt nhiều giá trị cho StartupWMClass (để nhóm dưới cùng một trình khởi chạy trong Unity)


20

Đây là một ví dụ cụ thể về một vấn đề chung mà tôi chưa thể tìm ra giải pháp.

Tôi có một chương trình (Trình quản lý thiết bị ảo Android) khởi chạy 'chương trình con' (cụ thể là trình giả lập hoặc thiết bị ảo) từ bên trong (cũng có thể được khởi chạy từ nơi khác). Tôi muốn mọi trường hợp EITHER của các chương trình này được nhóm lại dưới cùng một biểu tượng Unity.

Tôi đã tạo một .desktoptệp để thử và thực hiện điều này nhưng không biết chính xác cách thực hiện. Các tập tin máy tính để bàn như sau:

#!/usr/bin/env xdg-open

[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Name=Android Virtual Device
Icon=/home/ben/.icons/android.svg
Exec=/home/ben/usr/bin/android avd
StartupWMClass=Android Virtual Device Manager

Từ những gì tôi hiểu, StartupWMClasslà những gì tôi cần thiết lập để đạt được điều này một cách chính xác. Tôi đã nhận được hai tên lớp ('Trình quản lý thiết bị ảo Android' và 'trình giả xprop WM_CLASSlập64 -arm') bằng cách sử dụng trên các cửa sổ lặp lại. Cả hai đều hoạt động riêng lẻ (biểu tượng trình khởi chạy được gắn chính xác vào chương trình cho dù nó được khởi chạy theo cách nào), nhưng tôi không thể làm cho nó hoạt động cho cả hai.

Tôi giả định rằng bằng cách nào đó tôi cần đặt hai giá trị cho StartupWMClassnhưng không thể thực hiện chính xác (hoặc biết nếu đó là một hoạt động hợp lệ). Tôi đã thử, dấu hai chấm như biến môi trường, dấu phẩy được phân tách, dấu ngoặc kép, v.v. và tôi không thể tìm thấy bất kỳ gợi ý nào trong tài liệu chính thức .

Bất kỳ đề xuất?

CHỈNH SỬA:

Một ví dụ khác, mang tính mô phạm hơn, nhưng có lẽ dễ nhận biết hơn là với Matlab. Tôi đang chạy 2013a và màn hình giật gân ban đầu hiển thị và chương trình có các WM_CLASSgiá trị hoàn toàn khác nhau . Điều này có nghĩa là, khi tôi nhấp vào trình khởi chạy cùng với StartupWMClass=com-mathworks-util-PostVMInitnó, màn hình giật gân xuất hiện một Unitybiểu tượng khác (không xác định mặc định) , trong khi phần còn lại xuất hiện được nhóm lại dưới trình khởi chạy của tôi.

Bằng cách sử dụng xprop WMCLASSvà nhấp vào màn hình giật gân đầu tiên, sau đó lặp lại với một Matlabphiên hoạt động tôi nhận được đầu ra thiết bị đầu cuối sau:

ben@ben-OptiPlex-9010:~$ xprop WM_CLASS
WM_CLASS(STRING) = "MATLAB", "MATLAB"
ben@ben-OptiPlex-9010:~$ xprop WM_CLASS
WM_CLASS(STRING) = "sun-awt-X11-XFramePeer", "com-mathworks-util-PostVMInit"

Nếu tôi có thể chỉ định một cái gì đó dọc theo dòng:

StartupWMClass=com-mathworks-util-PostVMInit&&MATLAB

Điều đó sẽ hoạt động hoàn hảo (vì cả hai hoạt động riêng biệt) nhưng tôi không biết cú pháp, nếu nó thậm chí còn tồn tại. Tôi chỉ biết không có gì tôi đã cố gắng đã làm việc cho đến nay.

Bất kỳ trợ giúp hoặc câu trả lời dứt khoát nào cũng sẽ rất tuyệt vì tôi tin rằng đây là một yếu tố cơ bản khá tốt của một máy tính để bàn hoạt động tốt.


1
Bạn có thể nhận được một số gợi ý từ Drawers ?

1
Tôi đã xem các video Drawerstrong liên kết đó và từ những gì chúng hiển thị, nó chỉ đơn giản là nhóm các liên kết, khi bạn nhấp vào bất kỳ mục phụ nào, nó vẫn được tạo bằng biểu tượng riêng trong Unitytrình khởi chạy, đó là điều tôi đang cố gắng dừng
BT

Câu trả lời:


8

Vấn đề tương tự đối với tôi với Starcraft II đã phát động trò chơi ném playonlinux. Đầu tiên có một trình khởi chạy ứng dụng:

  • (WM_CLASS(STRING) = "Blizzard Launcher.exe", "Wine") và sau đó là trò chơi:

  • (WM_CLASS(STRING) = "SC2.exe", "Wine")

Tôi đoán rằng rượu vang đang thiết lập lớp với thực thi nhị phân.

Tôi đã xem mã bamf (phương thức bamf_matcher.c, insert_desktop_file_group_into_table ()):

  • Có một bản đồ tạo liên kết giữa một tệp máy tính để bàn và một và chỉ một lớp,
  • Khóa StartupWMClass được đọc với g_key_file_get_opes () không được thiết kế để trả về danh sách các chuỗi,
  • g_key_file_get_opes_list () có thể làm điều đó nhưng các nhà phát triển bamf không thiết kế khung để có thể liên kết nhiều lớp với một tệp máy tính để bàn.

Trong trường hợp của tôi, tôi gian lận bằng cách tạo 2 tệp máy tính để bàn có cùng khóa nhưng StartupWMClass. Điều này không hoàn hảo vì tôi vẫn có 2 biểu tượng Uniy khi ở trong trình khởi chạy nhưng điều quan trọng là tôi biết tại sao :-).


Điều này có vẻ rất hứa hẹn, tôi đã hỏi một câu hỏi để thử và nhận được xác nhận từ họ, nhưng vẫn chưa có câu trả lời nào ...
BT

1
Đây không phải là một câu trả lời. Câu trả lời là "bạn không thể" bởi vì đặc tả File Desktop làm cho giá trị này thành một chuỗi chứ không phải là danh sách các chuỗi (đó là lý do tại sao bamfdaemon sử dụng get_opes () chứ không phải get_opes_list () cho giá trị đó).
dobey

1

Tôi biết câu hỏi này thực sự cũ, nhưng sau khi trải qua cùng một vấn đề, tôi nghĩ rằng cuối cùng tôi đã tạo ra một cách giải quyết cho vấn đề này và quyết định chia sẻ với bất kỳ ai gặp phải vấn đề này:

Vì chúng ta không thể đặt nhiều WMClass cho một tệp .desktop, tại sao không đặt tất cả các cửa sổ thành một WMClass duy nhất?

Chúng ta có thể làm điều gì đó như thế này (Rõ ràng, thay thế Window 1, Window 2potatoesvới các cửa sổ tên của bạn và mong muốn WMClass):

xprop -name "Window 1" -f WM_CLASS 8s -set WM_CLASS "potatoes"

xprop -name "Window 2" -f WM_CLASS 8s -set WM_CLASS "potatoes"

Và trên tệp .desktop chúng ta có thể làm điều này: StartupWMClass=potatoes

Tadam! Tất cả các cửa sổ được nhóm lại ngay bây giờ.
Nhưng này, chúng ta có đang làm điều này bằng tay mỗi khi chương trình mở ra không? Tất nhiên là không.

Chúng ta có thể đi và tạo một tập lệnh bash tự động thực hiện điều đó cứ sau nửa giây:

while true
do
    xprop -name "Window 1" -f WM_CLASS 8s -set WM_CLASS "potatoes"
    xprop -name "Window 2" -f WM_CLASS 8s -set WM_CLASS "potatoes"
    sleep 0.5
done

Và cuối cùng, đặt .sh chúng tôi đã tạo để chạy mỗi khi HĐH khởi động: Ảnh chụp màn hình

Hy vọng câu trả lời của tôi là hữu ích cho bất cứ ai duyệt câu hỏi này.

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.