Windows のメッセージ ボックスと同様の Linux 用のメッセージ ボックスが必要です。メッセージ ボックスがポップアップし、テキストが表示され、ユーザーが [OK] ボタンをクリックすると消えて、呼び出し元の関数に制御が戻るはずです。
アプリケーション ウィンドウがまだまったくない場合でも、メッセージ ボックスは機能するはずです。したがって、アプリケーション コンテキストを作成し、XmCreate*Dialog を介してダイアログを関連付け、ユーザーがダイアログの [OK] ボタンをクリックすると、アプリ コンテキストのメイン ループに終了するように指示します。
これは意図したとおりに機能しますか? これにより、プロセスで作成されたすべてのウィジェットとアプリ コンテキストが自動的に破棄されますか (いいえの場合、どのように行う必要がありますか?)
コードは次のとおりです。
static XtAppContext appContext;
static Widget topWidget;
void XmCloseMsgBox (Widget w, XtPointer clientData, XmPushButtonCallbackStruct *cbs)
{
appContext.exit_flag = 1;
}
void XmMessageBox (const char* pszMsg, bool bError)
{
Widget msgBox;
XmString xmString = XmStringCreateLocalized (const_cast<char*>(pszMsg));
Arg args [1];
topWidget = XtVaAppInitialize (&appContext, "Application Name", NULL, 0,
&gameData.app.argC, gameData.app.argV, NULL, NULL);
// setup message box text
XtSetArg (args [0], XmNmessageString, xmString);
// create and label message box
xMsgBox = bError
? XmCreateErrorDialog (topWidget, "Error", args, 1)
: XmCreateWarningDialog (topWidget, "Warning", args, 1);
// remove text resource
XmStringFree (xmString);
// remove help and cancel buttons
XtUnmanageChild (XmMessageBoxGetChild (xMsgBox, XmDIALOG_CANCEL_BUTTON));
XtUnmanageChild (XmMessageBoxGetChild (xMsgBox, XmDIALOG_HELP_BUTTON));
XtAddCallback (xMsgBox, XmNokCallback, XmCloseMsgBox, NULL);
XtRealizeWidget (topWidget);
// display message box
//XtManageChild (xMsgBox);
XtAppMainLoop (app);
}