2009-09-07 48 views
1

當用戶點擊一個主題窗口(widget)的關閉框時,我該如何攔截,以及如何阻止Motif窗口管理器關閉被點擊的關閉框上的整個調用應用程序(以便我的應用程序可以關閉Motif應用程序上下文和窗口並繼續運行)?我試圖用Google,tuts和docs來發現自己,但沒有骰子。需要C++。Motif:攔截關閉盒事件並阻止應用程序退出? (C++)

回答

1

這似乎是工作(在INET找到):

#include <Xm/Protocols.h> 

Boolean SetCloseCallBack (Widget shell, void (*callback) (Widget, XtPointer, XtPointer)) 
{ 
extern Atom XmInternAtom (Display *, char *, Boolean); 

if (!shell) 
    return False; 
Display* disp = XtDisplay (shell); 
if (!disp) 
    return False; 
// Retrieve Window Manager Protocol Property 
Atom prop = XmInternAtom (disp, const_cast<char*>("WM_PROTOCOLS"), False); 
if (!prop) 
    return False; 
// Retrieve Window Manager Delete Window Property 
Atom prot = XmInternAtom (disp, const_cast<char*>("WM_DELETE_WINDOW"), True); 
if (!prot) 
    return False; 
// Ensure that Shell has the Delete Window Property 
// NB: Necessary since some Window managers are not 
// Fully XWM Compilant (olwm for instance is not) 
XmAddProtocols (shell, prop, &prot, 1); 
// Now add our callback into the Protocol Callback List 
XmAddProtocolCallback (shell, prop, prot, callback, NULL); 
return True; 
} 

設置這樣的回調將阻止應用程序被關閉的關閉事件是手柄是默認的事件處理程序的結果。

0

IIRC,在X11上,當你點擊一個窗口的關閉框,窗口管理器將信號發送到您的應用程序,告訴它退出。無論您使用motif還是gtk或Qt都無關緊要,因爲關閉框屬於WM,而不是您的應用程序。

您需要捕獲unix信號以防止應用程序關閉。

+0

我問*怎麼做到這一點。我已經知道,我必須以某種方式攔截涉及的事件,並防止默認的退出處理程序被調用。 – karx11erx 2009-09-07 13:46:21

+0

我*已*告訴你如何去做。谷歌「unix信號」,你會得到答案。 – 2009-09-07 14:54:28

+0

你什麼都沒有。你的提示是毫無價值的。看到我自己給出的答覆,這是一個很好的答覆。 – karx11erx 2009-09-07 21:45:14

1

vendorShellWidgetClass不會爲您做詭計嗎?如在,關閉只是圖案的應用程序上下文,而不是窗口..