From 48e02a67356b062a772417c6a5fee5bfc3753b2e Mon Sep 17 00:00:00 2001 From: lili <1307862086@qq.com> Date: Sat, 30 Aug 2025 20:30:50 +0800 Subject: [PATCH] modeless dialog --- src/motif_test.c | 53 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/src/motif_test.c b/src/motif_test.c index c771ac0..072af92 100644 --- a/src/motif_test.c +++ b/src/motif_test.c @@ -19,6 +19,8 @@ #define PAD 8 +Widget active_dialog = NULL; + void button_callback(Widget widget, XtPointer client_data, XtPointer call_data) { puts("Button clicked!"); @@ -29,19 +31,36 @@ void quit_callback(Widget widget, XtPointer client_data, XtPointer call_data) 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; - XmString msg = XmStringCreateLocalized("Hello from a secondary dialog!"); - Widget dialog = XmCreateMessageDialog(parent, "dialog", NULL, 0); - XtVaSetValues(dialog, - XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL, + if (active_dialog && XtIsManaged(active_dialog)) + { + XtDestroyWidget(active_dialog); + active_dialog = NULL; + } + + XmString msg = XmStringCreateLocalized((char *)message); + active_dialog = XmCreateMessageDialog(parent, "dialog", NULL, 0); + XtVaSetValues(active_dialog, + XmNdialogStyle, XmDIALOG_MODELESS, /* 非模态 */ XmNmessageString, msg, NULL); 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[]) { XtAppContext app; @@ -107,7 +126,7 @@ int main(int argc, char *argv[]) XtAddCallback(button, XmNactivateCallback, button_callback, NULL); /* 打开二级对话框的按钮 */ - Widget dialogBtn = XtVaCreateManagedWidget("Show Dialog", + Widget dialogBtn1 = XtVaCreateManagedWidget("Show Dialog1", xmPushButtonWidgetClass, form, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, button, @@ -117,13 +136,25 @@ int main(int argc, char *argv[]) XmNrightAttachment, XmATTACH_FORM, XmNrightOffset, PAD, 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", xmTextWidgetClass, form, XmNtopAttachment, XmATTACH_WIDGET, - XmNtopWidget, dialogBtn, + XmNtopWidget, dialogBtn2, XmNtopOffset, PAD, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, PAD, @@ -221,7 +252,7 @@ int main(int argc, char *argv[]) { /* 空闲时可以执行后台逻辑 */ printf("Idle...\n"); - usleep(500000); /* 0.5秒 */ + usleep(50000); /* 0.05秒 */ } }