diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..9e6febf --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,16 @@ +{ + "configurations": [ + { + "name": "Linux", + "includePath": [ + "${workspaceFolder}/**" + ], + "defines": [], + "compilerPath": "/usr/bin/clang", + "cStandard": "c17", + "cppStandard": "c++14", + "intelliSenseMode": "linux-clang-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/src/motif_test.c b/src/motif_test.c new file mode 100644 index 0000000..a93fd67 --- /dev/null +++ b/src/motif_test.c @@ -0,0 +1,204 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PAD 8 + +void button_callback(Widget widget, XtPointer client_data, XtPointer call_data) { + puts("Button clicked!"); +} + +void quit_callback(Widget widget, XtPointer client_data, XtPointer call_data) { + exit(0); +} + +void dialog_callback(Widget widget, XtPointer client_data, XtPointer call_data) { + 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, + XmNmessageString, msg, + NULL); + XmStringFree(msg); + XtManageChild(dialog); +} + +int main(int argc, char *argv[]) { + XtAppContext app; + Widget toplevel, mainwin, menubar, form; + + toplevel = XtVaAppInitialize(&app, "MotifDemo", NULL, 0, &argc, argv, NULL, NULL); + + /* 获取 Display 指针并打印 */ + Display *dpy = XtDisplay(toplevel); + if (dpy) { + printf("Connected to X server: %s\n", DisplayString(dpy)); + } else { + fprintf(stderr, "Failed to get Display* from toplevel widget.\n"); + } + + mainwin = XtVaCreateManagedWidget("mainwin", + xmMainWindowWidgetClass, toplevel, + NULL); + + /* 菜单栏 */ + menubar = XmCreateMenuBar(mainwin, "menubar", NULL, 0); + Widget fileMenu = XmCreatePulldownMenu(menubar, "fileMenu", NULL, 0); + XtVaCreateManagedWidget("File", + xmCascadeButtonWidgetClass, menubar, + XmNsubMenuId, fileMenu, + NULL); + Widget quitBtn = XtVaCreateManagedWidget("Quit", + xmPushButtonWidgetClass, fileMenu, + NULL); + XtAddCallback(quitBtn, XmNactivateCallback, quit_callback, NULL); + XtManageChild(menubar); + + /* Form 用于布局 */ + form = XtVaCreateWidget("form", + xmFormWidgetClass, mainwin, + NULL); + + /* 标签 */ + Widget label = XtVaCreateManagedWidget("This is a label", + xmLabelWidgetClass, form, + XmNtopAttachment, XmATTACH_FORM, + XmNtopOffset, PAD, + XmNleftAttachment, XmATTACH_FORM, + XmNleftOffset, PAD, + XmNrightAttachment, XmATTACH_FORM, + XmNrightOffset, PAD, + NULL); + + /* 按钮 */ + Widget button = XtVaCreateManagedWidget("Click Me", + xmPushButtonWidgetClass, form, + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, label, + XmNtopOffset, PAD, + XmNleftAttachment, XmATTACH_FORM, + XmNleftOffset, PAD, + XmNrightAttachment, XmATTACH_FORM, + XmNrightOffset, PAD, + NULL); + XtAddCallback(button, XmNactivateCallback, button_callback, NULL); + + /* 打开二级对话框的按钮 */ + Widget dialogBtn = XtVaCreateManagedWidget("Show Dialog", + xmPushButtonWidgetClass, form, + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, button, + XmNtopOffset, PAD, + XmNleftAttachment, XmATTACH_FORM, + XmNleftOffset, PAD, + XmNrightAttachment, XmATTACH_FORM, + XmNrightOffset, PAD, + NULL); + XtAddCallback(dialogBtn, XmNactivateCallback, dialog_callback, form); + + /* 文本框 */ + Widget text = XtVaCreateManagedWidget("text", + xmTextWidgetClass, form, + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, dialogBtn, + XmNtopOffset, PAD, + XmNleftAttachment, XmATTACH_FORM, + XmNleftOffset, PAD, + XmNrightAttachment, XmATTACH_FORM, + XmNrightOffset, PAD, + XmNcolumns, 20, + NULL); + + /* Toggle 按钮(复选框) */ + Widget toggle = XtVaCreateManagedWidget("Check me", + xmToggleButtonWidgetClass, form, + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, text, + XmNtopOffset, PAD, + XmNleftAttachment, XmATTACH_FORM, + XmNleftOffset, PAD, + XmNrightAttachment, XmATTACH_FORM, + XmNrightOffset, PAD, + NULL); + + /* RadioBox(单选按钮组) */ + Widget radioBox = XmCreateRadioBox(form, "radioBox", NULL, 0); + XtVaSetValues(radioBox, + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, toggle, + XmNtopOffset, PAD, + XmNleftAttachment, XmATTACH_FORM, + XmNleftOffset, PAD, + XmNrightAttachment, XmATTACH_FORM, + XmNrightOffset, PAD, + NULL); + XtManageChild(radioBox); + XtVaCreateManagedWidget("Option 1", xmToggleButtonWidgetClass, radioBox, NULL); + XtVaCreateManagedWidget("Option 2", xmToggleButtonWidgetClass, radioBox, NULL); + + /* 带滚动条的列表 */ + Widget swList = XtVaCreateManagedWidget("swList", + xmScrolledWindowWidgetClass, form, + XmNscrollingPolicy, XmAUTOMATIC, + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, radioBox, + XmNtopOffset, PAD, + XmNleftAttachment, XmATTACH_FORM, + XmNleftOffset, PAD, + XmNrightAttachment, XmATTACH_FORM, + XmNrightOffset, PAD, + NULL); + + Widget list = XmCreateList(swList, "list", NULL, 0); + XtVaSetValues(list, XmNvisibleItemCount, 5, NULL); + XmString items[6]; + items[0] = XmStringCreateLocalized("Item A"); + items[1] = XmStringCreateLocalized("Item B"); + items[2] = XmStringCreateLocalized("Item C"); + items[3] = XmStringCreateLocalized("Item D"); + items[4] = XmStringCreateLocalized("Item E"); + items[5] = XmStringCreateLocalized("Item F"); + XmListAddItems(list, items, 6, 1); + for (int i = 0; i < 6; ++i) XmStringFree(items[i]); + XtManageChild(list); + + /* 滑块 (模拟进度条) */ + Widget scale = XtVaCreateManagedWidget("scale", + xmScaleWidgetClass, form, + XmNorientation, XmHORIZONTAL, + XmNminimum, 0, + XmNmaximum, 100, + XmNvalue, 30, + XmNshowValue, True, + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, swList, + XmNtopOffset, PAD, + XmNleftAttachment, XmATTACH_FORM, + XmNleftOffset, PAD, + XmNrightAttachment, XmATTACH_FORM, + XmNrightOffset, PAD, + NULL); + + XtManageChild(form); + XmMainWindowSetAreas(mainwin, menubar, NULL, NULL, NULL, form); + + XtRealizeWidget(toplevel); + XtAppMainLoop(app); + return 0; +}