1

当用户单击主题窗口(小部件)的关闭框时如何拦截,以及如何防止 Motif 窗口管理器在单击关闭框时关闭整个调用应用程序(以便我的应用程序可以关闭 Motif 应用程序上下文和windows并继续运行)?我试图通过谷歌、tuts 和 docs 找出自己,但没有骰子。需要 C++。

4

3 回答 3

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;
}

设置这样的回调将防止应用程序因关闭事件被关闭而被关闭,这是默认的事件处理程序。

于 2009-09-07T14:54:44.273 回答
1

vendorShellWidgetClass 不会为您解决问题吗?如,仅关闭主题应用程序上下文而不是窗口..

于 2012-07-30T17:21:59.753 回答
0

IIRC,在 X11 上,当您单击窗口的关闭框时,窗口管理器会向您的应用程序发送一个信号,告诉它退出。无论您使用主题还是 gtk 或 Qt 都无关紧要,因为关闭框属于 WM,而不是您的应用程序。

您需要捕获 unix 信号以防止您的应用程序关闭。

于 2009-09-07T13:30:58.540 回答