Init with XtAppMainLoop
This commit is contained in:
16
.vscode/c_cpp_properties.json
vendored
Normal file
16
.vscode/c_cpp_properties.json
vendored
Normal file
@@ -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
|
||||||
|
}
|
||||||
204
src/motif_test.c
Normal file
204
src/motif_test.c
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
#include <Xm/Xm.h>
|
||||||
|
#include <Xm/PushB.h>
|
||||||
|
#include <Xm/Label.h>
|
||||||
|
#include <Xm/Text.h>
|
||||||
|
#include <Xm/RowColumn.h>
|
||||||
|
#include <Xm/ToggleB.h>
|
||||||
|
#include <Xm/List.h>
|
||||||
|
#include <Xm/Scale.h>
|
||||||
|
#include <Xm/Frame.h>
|
||||||
|
#include <Xm/Form.h>
|
||||||
|
#include <Xm/CascadeB.h>
|
||||||
|
#include <Xm/MainW.h>
|
||||||
|
#include <Xm/MessageB.h>
|
||||||
|
#include <Xm/Separator.h>
|
||||||
|
#include <Xm/ScrolledW.h>
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user