⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000003.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 4 页
字号:
此程式主要大纲为:产生一个新的性质,将这性质悬挂在根视窗(root&nbsp;window)下,由&nbsp;<BR>text&nbsp;widget&nbsp;中读取资料後,将这资料存放到悬挂在根视窗的性质中。程式一开始&nbsp;<BR>执行&nbsp;X&nbsp;视窗应用程式的初始化工作,以产生一个&nbsp;toplevel&nbsp;widget,接著分别呼叫&nbsp;<BR>XtDisplay&nbsp;及&nbsp;DefaultRootWindow&nbsp;以取得应用程式和&nbsp;X&nbsp;伺服器的连线及根视窗的&nbsp;<BR>视窗识别码,这两个都是呼叫性质操作函式时要用到的参数;再来则是抓取命令列的&nbsp;<BR>第二个参数作为性质的名字,指定&nbsp;False&nbsp;给&nbsp;only_if_exists&nbsp;後,呼叫&nbsp;XInternAtom&nbsp;<BR>以产生一个新的性质,其转换出来的原子叫做&nbsp;myproperty。toplevel&nbsp;widget&nbsp;有两个&nbsp;<BR>孩子及两个孙子,分别是&nbsp;rc&nbsp;、&nbsp;quit_btn&nbsp;、&nbsp;data_field&nbsp;及&nbsp;put_data,其中&nbsp;<BR>data_field&nbsp;及&nbsp;put_data&nbsp;都是&nbsp;rc&nbsp;的孩子。&nbsp;put_data&nbsp;widget&nbsp;有一个事件处理程序&nbsp;<BR>&nbsp;(event&nbsp;handler)&nbsp;叫做&nbsp;PutData,其主要工作是当&nbsp;put_data&nbsp;widget&nbsp;被压下时,呼叫&nbsp;<BR>XmTextGetString&nbsp;函式将&nbsp;text&nbsp;widget&nbsp;中的资料存放到一个缓冲区後,再呼叫&nbsp;<BR>XChangeProperty&nbsp;函式将缓冲区内的资料存放到根视窗的性质中。&nbsp;quit_btn&nbsp;widget&nbsp;<BR>有一个回叫程序&nbsp;(callback&nbsp;procedure)&nbsp;叫做&nbsp;delete_prop,其主要工作是呼叫&nbsp;XDeleteProperty&nbsp;<BR>函式删除该性质的定义,之後呼叫&nbsp;XtCloseDispaly&nbsp;函式把应用程式和&nbsp;X&nbsp;伺服器的连线&nbsp;<BR>结束掉。&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>【&nbsp;get_from_prop.c&nbsp;】&nbsp;<BR>&nbsp;<BR>此程式的主要大纲为:在事件回圈(event&nbsp;loop)中侦收&nbsp;PropertyNotify&nbsp;事件,当&nbsp;<BR>PropertyNotify&nbsp;事件发生时,判断其发生事件的视窗是否为根视窗及性质名字的&nbsp;<BR>原子是否为应用程式所感兴趣的原子;如果是,则呼叫&nbsp;GetData&nbsp;程序将性质内的资&nbsp;<BR>料读取出来,显示在&nbsp;text&nbsp;widget&nbsp;上;如果其中一个条件不符,则呼叫&nbsp;XtDispatchEvent&nbsp;<BR>函式将事件丢往它该去的视窗上。程式一开始执行&nbsp;X&nbsp;视窗应用程式的初始化工作,以&nbsp;<BR>产生一个&nbsp;toplevel&nbsp;widget,接著分别呼叫&nbsp;XtDisplay&nbsp;及&nbsp;DefaultRootWindow&nbsp;<BR>以取得应用程式和&nbsp;X&nbsp;伺服器的连线及根视窗的视窗识别码,这两个都是呼叫性质操作&nbsp;<BR>函式时会用到的参数;再来则是抓取命令列的第二个参数作为性质的名字,指定&nbsp;True&nbsp;给&nbsp;<BR>only_if_exists&nbsp;後,呼叫&nbsp;XInternAtom&nbsp;找出其相对应的原子,如果此性质不存在,则&nbsp;<BR>传回&nbsp;None。&nbsp;toplevel&nbsp;widget&nbsp;有两个孩子及一个孙子,分别是&nbsp;rc&nbsp;、&nbsp;quit_bnt&nbsp;及&nbsp;<BR>data_field,其中&nbsp;data_field&nbsp;为&nbsp;rc&nbsp;的孩子。因为性质是悬挂在根视窗下,而根视窗&nbsp;<BR>并不是一个&nbsp;widget,所以无法使用&nbsp;XtMainLoop&nbsp;及&nbsp;XtAddEventHandler&nbsp;的函式呼叫来&nbsp;<BR>对&nbsp;PropertyNotify&nbsp;事件做出反应,因此应用程式改采&nbsp;Xlib&nbsp;的风格来选择事件及设计&nbsp;<BR>事件回圈。GetData&nbsp;程序中呼叫了&nbsp;XGetWindowProperty&nbsp;函式,从根视窗的性质中去读&nbsp;<BR>取资料,其参数&nbsp;offset&nbsp;及&nbsp;length&nbsp;分别为&nbsp;0&nbsp;及&nbsp;8192,这是一般性质所能存放资料的&nbsp;<BR>最大空间;参数&nbsp;delete&nbsp;之值为&nbsp;False,表示应用程式在读取完性质内的资料後,不去&nbsp;<BR>删除该性质的定义;应用程式所期望的性质资料型态为&nbsp;XA_STRING&nbsp;,这是&nbsp;X&nbsp;视窗预先&nbsp;<BR>定义(predefined)的性质资料型态的原子,而此函式後面的五个参数皆为结果回传值,&nbsp;<BR>执行完此函式後,应用程式判断其是否执行成功及性质内的真正资料型态是否和应用程式&nbsp;<BR>所期望资料型态的一致,如果两项条件皆符合,接著便呼叫&nbsp;XmTextSetString&nbsp;函式将回传回来的&nbsp;<BR>资料显示於&nbsp;text&nbsp;widget&nbsp;中,最後呼叫&nbsp;XFree&nbsp;函式把&nbsp;X&nbsp;视窗系统为应用程式配置的&nbsp;<BR>缓冲空间(ret_property)释放掉。&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>程式执行画面说明&nbsp;<BR>&nbsp;<BR>图一:在背景下分别执行&nbsp;put_to_prop&nbsp;及&nbsp;get_from_prop&nbsp;两支程式,性质的名字为&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;「behavior」(put_to_prop&nbsp;behavior&amp;;sleep&nbsp;5;get_from_prop&nbsp;behavior&amp;),&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;待视窗出现後在&nbsp;put_to_prop&nbsp;的&nbsp;text&nbsp;widget&nbsp;中键入资料,此时尚未压下&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PutData&nbsp;widget,所以&nbsp;put_to_prop&nbsp;的&nbsp;text&nbsp;widget&nbsp;中的资料还未存放到&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;根视窗的&nbsp;behavior&nbsp;性质中。&nbsp;<BR>图二:压下在&nbsp;put_to_prop&nbsp;中的&nbsp;PutData&nbsp;widget,此时&nbsp;put_to_prop&nbsp;的&nbsp;text&nbsp;widget&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;中的资料被存放到悬挂在根视窗的&nbsp;behavior&nbsp;性质内,同此时刻&nbsp;get_from_prop&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;侦收到&nbsp;ProertyNotify&nbsp;事件,接著就到根视窗的&nbsp;behavior&nbsp;性质中去读取资料,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;并将资料显示於&nbsp;get_from_prop&nbsp;的&nbsp;text&nbsp;widget&nbsp;中。&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>/*&nbsp;<BR>&nbsp;*&nbsp;&nbsp;Program:&nbsp;put_to_prop.c&nbsp;<BR>&nbsp;*&nbsp;<BR>&nbsp;*&nbsp;&nbsp;Purpose:&nbsp;Retrieve&nbsp;data&nbsp;from&nbsp;text&nbsp;widget,&nbsp;then&nbsp;put&nbsp;it&nbsp;into&nbsp;<BR>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;specified&nbsp;property&nbsp;which&nbsp;is&nbsp;hanged&nbsp;on&nbsp;root&nbsp;window.&nbsp;<BR>&nbsp;*&nbsp;<BR>&nbsp;*&nbsp;&nbsp;Author&nbsp;:&nbsp;Chung-Chia&nbsp;Chen&nbsp;<BR>&nbsp;*&nbsp;<BR>&nbsp;*&nbsp;&nbsp;Date&nbsp;&nbsp;&nbsp;:&nbsp;Dec.&nbsp;14,&nbsp;1994&nbsp;<BR>&nbsp;*/&nbsp;<BR>&nbsp;<BR>#include&nbsp;&lt;X11/StringDefs.h&gt;&nbsp;<BR>#include&nbsp;&lt;X11/Intrinsic.h&gt;&nbsp;<BR>#include&nbsp;&lt;X11/Xatom.h&gt;&nbsp;<BR>#include&nbsp;&lt;Xm/Xm.h&gt;&nbsp;<BR>#include&nbsp;&lt;Xm/RowColumn.h&gt;&nbsp;<BR>#include&nbsp;&lt;Xm/PushB.h&gt;&nbsp;<BR>#include&nbsp;&lt;Xm/Text.h&gt;&nbsp;<BR>#include&nbsp;&lt;stdio.h&gt;&nbsp;<BR>#include&nbsp;&lt;stdlib.h&gt;&nbsp;<BR>&nbsp;<BR>#define&nbsp;ROWS&nbsp;10&nbsp;<BR>#define&nbsp;COLS&nbsp;40&nbsp;<BR>&nbsp;<BR>static&nbsp;void&nbsp;PutData(Widget,&nbsp;Widget*,&nbsp;XEvent*);&nbsp;<BR>static&nbsp;void&nbsp;DeleteProp(Widget,&nbsp;caddr_t,&nbsp;XmAnyCallbackStruct*);&nbsp;<BR>&nbsp;<BR>static&nbsp;Display&nbsp;&nbsp;&nbsp;*mydisplay;&nbsp;<BR>static&nbsp;Window&nbsp;&nbsp;&nbsp;&nbsp;root_window;&nbsp;<BR>static&nbsp;Atom&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myproperty;&nbsp;<BR>&nbsp;<BR>void&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;*argv[])&nbsp;<BR>{&nbsp;<BR>&nbsp;&nbsp;Widget&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toplevel,&nbsp;rc,&nbsp;put_data,&nbsp;data_field,&nbsp;quit_btn;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;if(&nbsp;argv[1]&nbsp;==&nbsp;NULL)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Usage:&nbsp;program_name&nbsp;property_name\n&quot;);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(0);&nbsp;<BR>&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;toplevel&nbsp;=&nbsp;XtInitialize(argv[0],&nbsp;&quot;PutDemo&quot;,&nbsp;NULL,&nbsp;0,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;argc,&nbsp;argv);&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;mydisplay&nbsp;=&nbsp;XtDisplay(toplevel);&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;if(&nbsp;(root_window&nbsp;=&nbsp;DefaultRootWindow(mydisplay))&nbsp;==&nbsp;NULL&nbsp;)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;root_window&nbsp;id&nbsp;is&nbsp;null\n&quot;);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-1);&nbsp;<BR>&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;/***************************************************&nbsp;<BR>&nbsp;&nbsp;&nbsp;*&nbsp;Get&nbsp;the&nbsp;display&nbsp;and&nbsp;root&nbsp;window&nbsp;id.&nbsp;<BR>&nbsp;&nbsp;&nbsp;***************************************************/&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;myproperty&nbsp;=&nbsp;XInternAtom(mydisplay,&nbsp;argv[1],&nbsp;False);&nbsp;<BR>&nbsp;&nbsp;if(&nbsp;myproperty&nbsp;==&nbsp;None&nbsp;)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Trying&nbsp;to&nbsp;create&nbsp;argv[1]&nbsp;property&nbsp;failed.&quot;,&nbsp;argv[1]);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-1);&nbsp;<BR>&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;/**********************************************************&nbsp;<BR>&nbsp;&nbsp;&nbsp;*&nbsp;Create&nbsp;a&nbsp;new&nbsp;property,&nbsp;convert&nbsp;the&nbsp;property's&nbsp;name&nbsp;<BR>&nbsp;&nbsp;&nbsp;*&nbsp;into&nbsp;an&nbsp;atom&nbsp;called&nbsp;myproperty.&nbsp;<BR>&nbsp;&nbsp;&nbsp;*&nbsp;Application&nbsp;takes&nbsp;predefined&nbsp;atom&nbsp;&quot;XA_STRING&quot;&nbsp;as&nbsp;the&nbsp;<BR>&nbsp;&nbsp;&nbsp;*&nbsp;data&nbsp;type&nbsp;of&nbsp;the&nbsp;property,&nbsp;so&nbsp;the&nbsp;job&nbsp;that&nbsp;converts&nbsp;<BR>&nbsp;&nbsp;&nbsp;*&nbsp;the&nbsp;property's&nbsp;data&nbsp;type&nbsp;into&nbsp;an&nbsp;atom&nbsp;can&nbsp;be&nbsp;exempted.&nbsp;<BR>&nbsp;&nbsp;&nbsp;**********************************************************/&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;rc&nbsp;=&nbsp;XtVaCreateManagedWidget(&quot;Panel&quot;,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmRowColumnWidgetClass,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toplevel,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL);&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;data_field&nbsp;=&nbsp;XtVaCreateManagedWidget(&quot;DataField&quot;,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmTextWidgetClass,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmNeditMode,&nbsp;&nbsp;&nbsp;&nbsp;XmMULTI_LINE_EDIT,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmNrows,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ROWS,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmNcolumns,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COLS,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL);&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;put_data&nbsp;=&nbsp;XtVaCreateManagedWidget(&quot;PutData&quot;,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmPushButtonWidgetClass,&nbsp;rc,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL);&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;XtAddEventHandler(put_data,&nbsp;ButtonPressMask,&nbsp;FALSE&nbsp;,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(XtEventHandler)&nbsp;PutData,&nbsp;&amp;data_field);&nbsp;<BR>&nbsp;&nbsp;/********************************************************&nbsp;<BR>&nbsp;&nbsp;&nbsp;*&nbsp;Create&nbsp;a&nbsp;push&nbsp;button&nbsp;widget(put_data),&nbsp;then&nbsp;register&nbsp;<BR>&nbsp;&nbsp;&nbsp;*&nbsp;an&nbsp;event&nbsp;handler&nbsp;named&nbsp;PutData&nbsp;which&nbsp;solicits&nbsp;button&nbsp;<BR>&nbsp;&nbsp;&nbsp;*&nbsp;press&nbsp;event.&nbsp;<BR>&nbsp;&nbsp;&nbsp;*&nbsp;data_field&nbsp;is&nbsp;taken&nbsp;as&nbsp;a&nbsp;client&nbsp;data&nbsp;which&nbsp;is&nbsp;gonna&nbsp;<BR>&nbsp;&nbsp;&nbsp;*&nbsp;pass&nbsp;to&nbsp;the&nbsp;PutData&nbsp;event&nbsp;handler.&nbsp;<BR>&nbsp;&nbsp;&nbsp;********************************************************/&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;quit_btn&nbsp;=&nbsp;XtVaCreateManagedWidget(&quot;Quit&quot;,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmPushButtonWidgetClass,&nbsp;rc,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL);&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;XtAddCallback(quit_btn,&nbsp;XmNactivateCallback,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(XtCallbackProc)&nbsp;DeleteProp,&nbsp;NULL);&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;XtRealizeWidget(toplevel);&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;XtMainLoop();&nbsp;<BR>&nbsp;<BR>}&nbsp;<BR>&nbsp;<BR>static&nbsp;void&nbsp;PutData(Widget&nbsp;w,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Widget&nbsp;*client_data,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XEvent&nbsp;*ev)&nbsp;<BR>{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*buff;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buff&nbsp;=&nbsp;XmTextGetString(*client_data);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(buff&nbsp;==&nbsp;NULL)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;XmTextGetString&nbsp;returns&nbsp;NULL\n&quot;);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XChangeProperty(mydisplay,&nbsp;root_window,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myproperty,&nbsp;XA_STRING,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;32,&nbsp;PropModeReplace,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(unsigned&nbsp;char*)&nbsp;buff,&nbsp;strlen(buff));&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/***************************************&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Store&nbsp;the&nbsp;data&nbsp;pointed&nbsp;by&nbsp;buff&nbsp;into&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;the&nbsp;property&nbsp;named&nbsp;myproperty.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;***************************************/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(buff);&nbsp;<BR>&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -