Tôi muốn chặn thông báo WM_DELETE_WINDOW
được đăng lên một số cửa sổ nhất định mà một ứng dụng tôi đang viết (AllTray), để tôi có thể hành động thay vì ứng dụng nhận được. Tôi hiện đang xem thử việc này ở cấp độ GDK via gdk_display_add_client_message_filter
nếu có thể, nhưng tôi sẽ hài lòng với giải pháp Xlib nếu có một giải pháp; nó có vẻ như để có thể, nhưng tôi dường như không hiểu cách tôi làm điều đó thành công.Chặn WM_DELETE_WINDOW trên X11?
Hiện nay, tôi có hai chương trình (viết bằng C) mà tôi đang cố gắng sử dụng để có được điều này đã tìm ra, the first one không làm gì nhưng tạo ra một cửa sổ và đăng ký mà nó biết về WM_DELETE_WINDOW
, và the second one nỗ lực để bắt thông điệp rằng, nhưng dường như thất bại trong việc làm như vậy; nó dường như không làm gì cả. Tôi có hiểu tài liệu sai về điều này không, hoặc có điều gì đó bổ sung mà tôi cần phải làm (hay tôi cần phải tránh sử dụng GDK hoàn toàn cho điều này)?
Nền là: Trước khi viết lại AllTray, cách thức hoạt động của nó dường như là cố gắng đánh chặn một lần nhấp chuột vào nút X. Đối với một số người quản lý cửa sổ, điều này làm việc đúng, đối với những người khác nó không làm việc gì cả, và đối với những người khác, người dùng phải cấu hình nó bằng tay và hướng dẫn AllTray nơi nút đóng cửa sổ. Những gì tôi đang tìm kiếm là một giải pháp không liên quan đến LD_LIBRARY_PRELOAD
và sẽ hoạt động đối với bất kỳ kết hợp trình quản lý/ứng dụng cửa sổ nào phù hợp với các tiêu chuẩn hiện tại và gửi WM_DELETE_WINDOW
ClientMessage khi đóng cửa sổ.
CẬP NHẬT: Tôi vẫn đang tìm câu trả lời. Con đường mà tôi đang thực hiện vào lúc này là cố gắng sửa chữa cửa sổ và tự quản lý nó, nhưng tôi không thể làm cho nó hoạt động được. Khi reparenting, tôi dường như không thể lấy lại nó bằng bất kỳ cách nào. Tôi có thể thiếu một cái gì đó rất cơ bản, nhưng tôi không thể hiểu làm thế nào để thực sự làm cho nó xuất hiện nó cửa sổ của riêng tôi một lần nữa, để đưa nó trở lại trên màn hình.
CẬP NHẬT 2: Được rồi, vì vậy tôi đã nhấn vào một bức tường gạch khác. Tài liệu máy chủ X nói để đặt StructureNotifyMask trên mặt nạ sự kiện của cửa sổ để nhận cả sự kiện MapNotify và ReparentNotify. Tôi cũng muốn được nhận. Suy nghĩ hiện tại của tôi là tạo ra một cửa sổ phục vụ như một người nhận sự kiện, và sau đó khi tôi nhận được sự kiện cho những điều thú vị, hãy hành động bằng cách tạo và sửa lại. Tuy nhiên, điều này đơn giản dường như không hoạt động. Các sự kiện duy nhất tôi thực sự nhận được là sự kiện PropertyNotify. Vì vậy, tuyến đường này dường như cũng không hoạt động tốt lắm.
Tôi nghĩ có thể bằng cách sửa đổi cửa sổ bên trong màn hình của riêng bạn và lọc những sự kiện bạn vượt qua? Tôi không nghĩ cách bạn đang cố gắng có thể hoạt động. – wrt
Có bất kỳ nhược điểm nào để thực hiện theo cách đó không? Đó là, có bất cứ điều gì đặc biệt mà sẽ gây ra rằng để can thiệp vào những thứ như XDND hay bất cứ điều gì? Đó có phải là một ý tưởng di động (như trong, nó sẽ không phá vỡ các ứng dụng hoặc trình quản lý cửa sổ)? Tôi dường như có thể tìm thấy rất ít thông tin về điều đó. Tôi giả sử rằng nó cũng có nghĩa là tôi sẽ phải tạo một cửa sổ "cha mẹ" mới cho mỗi cửa sổ ứng dụng khách mới, đúng không? –