2010-08-24 22 views
6

(xem chỉnh sửa)Làm cách nào để ngăn Gnome hiển thị hai cửa sổ khi thực hiện alt-tab? (C++ qt app)

Tôi đang phát triển ứng dụng QT/C++ dưới gnome.

Ứng dụng cửa sổ chính và cửa sổ con QListBox.

Cả hai cửa sổ này đều hiển thị dưới dạng các cửa sổ chính riêng biệt khi tôi bỏ tab giữa ứng dụng.

Tôi làm cách nào để chỉ hiển thị một cửa sổ khi tôi (hoặc sau này người dùng) sử dụng tab alt?

Tôi đoán hành vi này xảy ra vì một cửa sổ chính không cắt cửa sổ phụ - cửa sổ con mở rộng ranh giới của cửa sổ chính. Gnome cũng có hành vi tab alt xấu đối với một số ứng dụng khác, hiển thị hộp thoại phương thức riêng biệt với cửa sổ chính. Nhưng trong trường hợp ứng dụng của tôi, điều này thực sự gây phiền nhiễu.

Tôi nghĩ tôi có thể tạo một cửa sổ trong suốt khổng lồ bao gồm cả hai cửa sổ hiện có. Nhưng nó sẽ là đẹp hơn để tìm một giải pháp "sạch".

(. Đoán hợp lý nhất thực sự là nó có một cái gì đó để làm với lá cờ window Tôi đã thử mọi sự kết hợp hợp lý của cờ tôi có thể nghĩ về Các loại cửa sổ được mô tả here.)

Edit: Các ứng dụng có QWidget làm cửa sổ chính của nó (Không phải QMainWindow), QListView được chứa trong đối tượng QWidget và được tạo bằng cách chuyển một điểm đến cửa sổ chính. được tạo kiểu với Qt :: Tool | Qt :: FramelessWindowHint.

Edit2: Các Qt :: X11BypassWindowManagerHint phong cách không làm việc để loại bỏ các cửa sổ trong danh sách alt-tab. Vấn đề là nó cũng làm cho cửa sổ "không được quản lý" để nó bao gồm các cửa sổ khác. Tôi có thể manaully ẩn bất cứ khi nào tôi mất tập trung - giải thưởng ngay bây giờ cho một giải pháp tốt hơn.

+1

Tôi đoán nó có liên quan gì đó với cờ cửa sổ ... ví dụ, nếu bạn đặt nó thành cửa sổ công cụ, nó sẽ lấy cả hai? Ví dụ: khi tôi sử dụng văn phòng mở, gnome không duyệt qua các cửa sổ công cụ nổi của nó, nhưng chỉ có các cửa sổ chính. –

+0

Tôi giả định QListBox có con trỏ cửa sổ cha mẹ được đặt thành QMainWindow? Bất kỳ cơ hội nào tại một bộ xương của mã yêu cầu tối thiểu để tạo ra vấn đề này? – sleepynate

Trả lời

3

Khi tạo cửa sổ cho cửa sổ QListBox đặt cờ cửa sổ Qt::Tool trong hàm khởi tạo của nó hoặc sau đó là gọi hàm setWindowFlags. Dưới đây là một số đoạn mã (Tôi bỏ qua các tiêu đề):

 
int main(int argc, char** argv) 
{ 
    QApplication app(argc, argv); 
    QMainWindow mw; 
    mw.show(); 
    QWidget toolWindow(&mw, Qt::Window|Qt::Tool); 
    QHBoxLayout layout(&toolWindow); 
    toolWindow.setLayout(&layout); 
    QListView lv(&toolWindow); 
    layout.addWidget(&lv); 
    toolWindow.show(); 

    return app.exec(); 
}

Tôi đã thử nghiệm này trên hộp sid Debian của tôi (Gnome 2.30, metacity 2.30.1) với người sử dụng vừa tạo: image proof on answer to question #3553428.

Nếu đây không phải là thứ bạn muốn, hãy đặt tên cho phần mềm hoạt động chính xác hoặc bạn có thể tự kiểm tra. Để thực hiện điều này, hãy chạy xprop trong cửa sổ đầu cuối và nhấp vào cửa sổ bạn quan tâm. Đầu ra sẽ chứa các cờ cửa sổ. Người bạn quan tâm là _NET_WM_WINDOW_TYPE(ATOM). Đối với các cửa sổ công cụ (ví dụ: không được liệt kê trong alt-tab) cờ này là:

_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_UTILITY, _NET_WM_WINDOW_TYPE_NORMAL 

Nếu cửa sổ với những lá cờ không phải là một cửa sổ hộp công cụ sau đó cái gì là sai với người quản lý cửa sổ của bạn hoặc cá nhân bạn đã thiết lập hành vi như vậy .

+0

Vâng, bạn đã có câu trả lời duy nhất - vấn đề là, bạn đã sai. Tôi sẽ dừng lại. Có lẽ giải thưởng nếu bạn chỉnh sửa để phản ánh các bình luận trong câu hỏi của tôi ... –

+0

Vâng, tôi nghĩ giải pháp cũng giống như trong các chỉnh sửa của tôi - bạn cần sử dụng kiểu Qt :: X11BypassWindowManagerHint với tất cả các vấn đề của nó. Nhưng hey, nếu bạn đã đi mà nhiều rắc rối, bạn đang gần hơn bất cứ ai khác ... –

+0

Nhưng tràn frickin stack có thể đã ăn tiền thưởng vì tôi không thể nhìn thấy chúng xuất hiện. SO xấu. Nơi này không phải là thứ mà nó từng là ... –

1

Bạn có thể thử bằng tay bằng công cụ wmctrl. Với "-r -b SOMETHING", bạn có thể sửa đổi đối số NET_WM cho nó. Hãy thử những điều này trong [1].

Nếu tính năng này hoạt động, bạn có thể thêm chúng vào bằng Xlib-Calls (Nếu bạn biết X11 Window Number từ Qt.Tôi chắc chắn điều đó là có thể).

[1] http://standards.freedesktop.org/wm-spec/1.3/ar01s05.html 
Các vấn đề liên quan