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