Hi, all:     I am studying the book --> "UNIX Desktop Guide to OPEN LOOK". There is an example --> winprop.c that demonstrate how to program WM_PROTOCOLS property in chapter 8.  It can run, but only show the static text messages, no Notice pop_up. What is the problem? 	    Thanks in advance for help!!1	    IOP /*-------------------------------------------------------------*/ /*  File:  winprop.c  *  *  Shows how to set properties on a window.  *  */ #include <X11/Xatom.h>	/* For definition of XA_ATOM */ #include <X11/Intrinsic.h> #include <X11/StringDefs.h> #include <Xol/OpenLook.h> #include <Xol/StaticText.h> #include <Xol/OblongButt.h> #include <Xol/Notice.h> /* This file defines the atoms with _OL_ prefix */ /* ID of the top-level and NoticeShell widget */ static Widget top_level, notice_shell; static Widget make_notice(); static char message[] = "Clients use properties to communicate \ with the window manager. This example illustrates how an OPEN \ LOOK application requests notification from the window manager \ when certain events occur. The communication is in the form of \ a ClientMessage event that the application processes in an \ event-handler."; /* Atoms used for inter-client communication */ Atom ATOM_WM_PROTOCOLS, ATOM_WM_DELETE_WINDOW,      ATOM_WM_SAVE_YOURSELF; static void handle_wm_messages(); static void save_and_exit(); static void save_yourself(); static void pop_notice(); static void do_exit(); /* String to hold comand line (for use in responding to  * the WM_SAVE_YOURSELF protocol message.  */ char saved_cmdline[128]; /*-------------------------------------------------------------*/ void main(argc, argv) int  argc; char **argv; {     Widget w;     int i; /* Save the command-line for use in responding to the  * WM_SAVE_YOURSELF protocol message.  */     sprintf(saved_cmdline, "%s ", argv[0]);     if(argc > 1) 	for(i = 1; i < argc; i++) 	{ 	    strcat(saved_cmdline, argv[i]); 	    strcat(saved_cmdline, " "); 	} /* Create and initialize the top-level widget */     top_level = OlInitialize(argv[0], "Ol_main", NULL, 			       0, &argc, argv); /* Create a StaticText widget */     w = XtVaCreateManagedWidget("Stext", 		      staticTextWidgetClass, top_level, 		      XtNstring,    message, 		      XtNwidth,     200, 		      NULL); /* Create a NoticeShell widget for later use */     make_notice(top_level); /* Intern the atoms */     ATOM_WM_PROTOCOLS = XInternAtom(XtDisplay(w), 					"WM_PROTOCOLS", False);     ATOM_WM_DELETE_WINDOW = XInternAtom(XtDisplay(w), 				    "WM_DELETE_WINDOW", False);     ATOM_WM_SAVE_YOURSELF = XInternAtom(XtDisplay(w), 				    "WM_SAVE_YOURSELF", False); /* Add an event-handler to process ClientMessage events sent  * by the window manager  */     XtAddEventHandler(top_level, NoEventMask, True, 		      handle_wm_messages, NULL); /* Realize the widgets and start processing events */     XtRealizeWidget(top_level); /* Append the properties WM_DELETE_WINDOW and WM_SAVE_YOURSELF  * to the definition of the WM_PROTOCOLS property. This step  * requires the window ID of the top-level widget. The window  * ID is valid only after the widget is realized.  */     XChangeProperty(XtDisplay(top_level), XtWindow(top_level), 		    ATOM_WM_PROTOCOLS, XA_ATOM, 32, 		    PropModeAppend, 		    &ATOM_WM_DELETE_WINDOW, 1);     XChangeProperty(XtDisplay(top_level), XtWindow(top_level), 		    ATOM_WM_PROTOCOLS, XA_ATOM, 32, 		    PropModeAppend, 		    &ATOM_WM_SAVE_YOURSELF, 1);     XtMainLoop(); } /*-------------------------------------------------------------*/ static void handle_wm_messages(w, client_data, p_event) Widget	  w; XtPointer client_data; XEvent	  *p_event; {     if(p_event->type == ClientMessage &&        p_event->xclient.message_type == ATOM_WM_PROTOCOLS)     { 	if(p_event->xclient.data.l[0] == ATOM_WM_DELETE_WINDOW) 	{ 		save_and_exit(); 	} 	if(p_event->xclient.data.l[0] == ATOM_WM_SAVE_YOURSELF) 	{ 		save_yourself(); 	}     } } /*-------------------------------------------------------------*/ static void save_and_exit() { /* Display a notice giving the user a chance to respond */     pop_notice(top_level, notice_shell); } /*-------------------------------------------------------------*/ static void save_yourself() { /* Set the WM_COMMAND property to the saved command-line. */     XChangeProperty(XtDisplay(top_level), XtWindow(top_level), 		    XA_WM_COMMAND, XA_STRING, 8, 		    PropModeReplace, saved_cmdline, 		    strlen(saved_cmdline) + 1); } /*-------------------------------------------------------------*/ static Widget make_notice(parent) Widget parent; {     Widget w, n_text, n_control, n_exit, n_cancel; /* Create a button and provide a callback to pop up a Notice */     w = XtVaCreateManagedWidget("QuitButton", 		      oblongButtonWidgetClass, parent, 		      XtNlabel,    "Exit...", 		      NULL);     XtAddCallback(w, XtNselect, pop_notice, NULL); /* Create the NoticeShell widget. Note that you have to use  * XtVaCreatePopupShell instead of the usual  * XtVaCreateManagedWidget.  */     notice_shell = XtVaCreatePopupShell("QuitNotice", 		      noticeShellWidgetClass, w, 		      NULL); /* Get the ID of the text and control area widgets of the  * NoticeShell.  */     XtVaGetValues(notice_shell, 		  XtNtextArea,	      &n_text, 		  XtNcontrolArea,     &n_control, 		  NULL); /* Place a message in the text area of the NoticeShell */     XtVaSetValues(n_text, 	    XtNstring, "Please confirm exit from program.", 	    NULL); /* Add buttons to the control area of the NoticeShell.  * Each button has an appropriate callback.  */     n_exit = XtVaCreateManagedWidget("NoticeExit", 		      oblongButtonWidgetClass, n_control, 		      XtNlabel,    "Exit", 		      NULL);     XtAddCallback(n_exit, XtNselect, do_exit, NULL);     n_cancel = XtVaCreateManagedWidget("NoticeCancel", 		      oblongButtonWidgetClass, n_control, 		      XtNlabel,    "Cancel", 		      XtNdefault,  True, 		      NULL);     return w; } /*-------------------------------------------------------------*/ static void pop_notice(w_emanate, w_notice) Widget	  w_emanate, w_notice; {     XtVaSetValues(w_notice, XtNemanateWidget, w_emanate, NULL); /* Pop up the NoticeShell widget. The NoticeShell widget makes  * sure that the aplication waits until the user selects from  * one of the buttons in the NoticeShell's control area.  */     XtPopup(w_notice, XtGrabExclusive); } /*-------------------------------------------------------------*/ static void do_exit(w, call_data, client_data) Widget	  w; XtPointer call_data, client_data; {     XCloseDisplay(XtDisplay(w));     exit(0); }