modeless dialog

This commit is contained in:
2025-08-30 20:30:50 +08:00
parent 5697ae8e8c
commit 48e02a6735

View File

@@ -19,6 +19,8 @@
#define PAD 8 #define PAD 8
Widget active_dialog = NULL;
void button_callback(Widget widget, XtPointer client_data, XtPointer call_data) void button_callback(Widget widget, XtPointer client_data, XtPointer call_data)
{ {
puts("Button clicked!"); puts("Button clicked!");
@@ -29,19 +31,36 @@ void quit_callback(Widget widget, XtPointer client_data, XtPointer call_data)
exit(0); exit(0);
} }
void dialog_callback(Widget widget, XtPointer client_data, XtPointer call_data) void open_dialog(Widget parent, const char *message)
{ {
Widget parent = (Widget)client_data; if (active_dialog && XtIsManaged(active_dialog))
XmString msg = XmStringCreateLocalized("Hello from a secondary dialog!"); {
Widget dialog = XmCreateMessageDialog(parent, "dialog", NULL, 0); XtDestroyWidget(active_dialog);
XtVaSetValues(dialog, active_dialog = NULL;
XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL, }
XmString msg = XmStringCreateLocalized((char *)message);
active_dialog = XmCreateMessageDialog(parent, "dialog", NULL, 0);
XtVaSetValues(active_dialog,
XmNdialogStyle, XmDIALOG_MODELESS, /* 非模态 */
XmNmessageString, msg, XmNmessageString, msg,
NULL); NULL);
XmStringFree(msg); XmStringFree(msg);
XtManageChild(dialog);
XtManageChild(active_dialog);
} }
void btn1_cb(Widget w, XtPointer client_data, XtPointer call_data)
{
open_dialog((Widget)client_data, "This is Dialog 1");
}
void btn2_cb(Widget w, XtPointer client_data, XtPointer call_data)
{
open_dialog((Widget)client_data, "This is Dialog 2");
}
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
XtAppContext app; XtAppContext app;
@@ -107,7 +126,7 @@ int main(int argc, char *argv[])
XtAddCallback(button, XmNactivateCallback, button_callback, NULL); XtAddCallback(button, XmNactivateCallback, button_callback, NULL);
/* 打开二级对话框的按钮 */ /* 打开二级对话框的按钮 */
Widget dialogBtn = XtVaCreateManagedWidget("Show Dialog", Widget dialogBtn1 = XtVaCreateManagedWidget("Show Dialog1",
xmPushButtonWidgetClass, form, xmPushButtonWidgetClass, form,
XmNtopAttachment, XmATTACH_WIDGET, XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, button, XmNtopWidget, button,
@@ -117,13 +136,25 @@ int main(int argc, char *argv[])
XmNrightAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM,
XmNrightOffset, PAD, XmNrightOffset, PAD,
NULL); NULL);
XtAddCallback(dialogBtn, XmNactivateCallback, dialog_callback, form); XtAddCallback(dialogBtn1, XmNactivateCallback, btn1_cb, form);
Widget dialogBtn2 = XtVaCreateManagedWidget("Show Dialog2",
xmPushButtonWidgetClass, form,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, dialogBtn1,
XmNtopOffset, PAD,
XmNleftAttachment, XmATTACH_FORM,
XmNleftOffset, PAD,
XmNrightAttachment, XmATTACH_FORM,
XmNrightOffset, PAD,
NULL);
XtAddCallback(dialogBtn2, XmNactivateCallback, btn2_cb, form);
/* 文本框 */ /* 文本框 */
Widget text = XtVaCreateManagedWidget("text", Widget text = XtVaCreateManagedWidget("text",
xmTextWidgetClass, form, xmTextWidgetClass, form,
XmNtopAttachment, XmATTACH_WIDGET, XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, dialogBtn, XmNtopWidget, dialogBtn2,
XmNtopOffset, PAD, XmNtopOffset, PAD,
XmNleftAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM,
XmNleftOffset, PAD, XmNleftOffset, PAD,
@@ -221,7 +252,7 @@ int main(int argc, char *argv[])
{ {
/* 空闲时可以执行后台逻辑 */ /* 空闲时可以执行后台逻辑 */
printf("Idle...\n"); printf("Idle...\n");
usleep(500000); /* 0.5秒 */ usleep(50000); /* 0.05秒 */
} }
} }