|
DataMuseum.dkPresents historical artifacts from the history of: Regnecentalen RC-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Regnecentalen RC-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 8363 (0x20ab) Types: TextFile Notes: UNIX file Names: »xmprotocol.c«
└─⟦a0a611847⟧ Bits:30004636/disk1.imd INTERACTIVE Motif Environment Development System └─⟦a0a611847⟧ UNIX Filesystem └─⟦this⟧ »xt/new/usr/lib/X11/examples/xmsamplers/xmprotocol.c«
#ifdef REV_INFO #ifndef lint static char SCCSID[] = "OSF/Motif: @(#)xmprotocol.c 1.1 - 89/08/30 - 12:13:00"; #endif /* lint */ #endif /* REV_INFO */ /**--------------------------------------------------------------------- *** *** file: xmprotocol.c *** *** project: Motif Widgets example programs *** *** description: This program demonstrates the Motif protocols *** for communication between the toolkit and the *** window manager. *** *** *** (c) Copyright 1989 by Open Software Foundation, Inc. *** All Rights Reserved. *** *** (c) Copyright 1989 by Hewlett-Packard Company. *** *** ***-------------------------------------------------------------------*/ #include <stdio.h> #include <sys/signal.h> #include <X11/IntrinsicP.h> #include <X11/StringDefs.h> #include <X11/Shell.h> #include <Xm/Xm.h> #include <Xm/XmP.h> #include <Xm/RowColumn.h> #include <Xm/ScrollBar.h> #include <Xm/DrawingA.h> #include <Xm/ScrolledW.h> #include <Xm/PushB.h> #include <X11/Protocols.h> #include <X11/AtomMgr.h> #include <X11/MwmUtil.h> Atom wm_delete_window, mwm_messages; static Widget ShellAncestor(w) Widget w; { while ((w != NULL) && !XtIsShell(w)) w = w->core.parent; return(w); } #define SET_ITEMS 0 #define REMOVE_CALLBACKS 1 #define ACTIVATE_ITEMS 2 #define DEACTIVATE_ITEMS 3 #define REMOVE_PROTOCOLS 4 typedef struct _MenuChangeRec{ String label; Cardinal start_num, end_num; int operation; }MenuChangeRec; static XtCallbackProc EntrySelected(w, closure, call_data) Widget w; caddr_t closure, call_data; { printf("entry %d selected\n", closure); } void MakeMenu(start_num, end_num, str_rtn) Cardinal start_num, end_num; String str_rtn; { Cardinal i, j; String str = str_rtn; if (!start_num && !end_num) { *str = '\0'; } else { for (i = start_num; i<= end_num ; i++) { sprintf(str, " entry_%d f.send_msg %d \n",i,i); str += strlen(str); } *(str-1) = '\0'; } } void ChangeMenu(w, menu_data, call_data) Widget w; MenuChangeRec *menu_data; caddr_t call_data; { Widget shell; Arg arg; static char menu_string[256]; Cardinal i; Atom atoms[16]; Boolean doUnmap = False; shell = ShellAncestor(w); switch (menu_data->operation) { case SET_ITEMS: /* * Generate the string that is passed to mwm for appending * (after interpretation) to the system menu. */ MakeMenu(menu_data->start_num, menu_data->end_num, menu_string); XtSetArg(arg, XmNmwmMenu, menu_string); XtSetValues(shell, &arg, 1); for (i = menu_data->start_num; i<= menu_data->end_num ; i++) /* * XmAddProtocolCallback will check to see if the protocol * already exists, and add it (by calling XmAddProtocols) * if it doesn't. It doesn't check for duplicate callbacks * or change the state of the activation. */ XmAddProtocolCallback(shell, mwm_messages, (Atom)i, EntrySelected, (caddr_t)i); doUnmap = True; break; case REMOVE_CALLBACKS: for (i = menu_data->start_num; i<= menu_data->end_num ; i++) /* * RemoveProtocolCallback will remove the first callback * with this signature from the list. It does not check * for duplicates or change the activation (gray-out). */ XmRemoveProtocolCallback(shell, mwm_messages, (Atom)i, EntrySelected, (caddr_t)i); break; case REMOVE_PROTOCOLS: for (i = menu_data->start_num; i<= menu_data->end_num ; i++) atoms[i - menu_data->start_num] = i; XmRemoveProtocols(shell, mwm_messages, atoms, menu_data->end_num - menu_data->start_num +1); doUnmap = True; break; case ACTIVATE_ITEMS: for (i = menu_data->start_num; i<= menu_data->end_num ; i++) /* * Tell Mwm these protocols (menu items) are now active */ XmActivateProtocol(shell, mwm_messages, (Atom)i, EntrySelected, (caddr_t)i); break; case DEACTIVATE_ITEMS: for (i = menu_data->start_num; i<= menu_data->end_num ; i++) /* * Tell Mwm these protocols (menu items) are now inactive */ XmDeactivateProtocol(shell, mwm_messages, (Atom)i, EntrySelected, (caddr_t)i); break; } if (XtIsRealized(shell) && doUnmap) { XtUnmapWidget(shell); XtMapWidget(shell); } } static void Quit() { exit(0); } MenuChangeRec menuops[] = { { "add 0-4", 0, 4, SET_ITEMS}, { "add 1-3", 1, 3, SET_ITEMS}, { "add 2-2", 2, 2, SET_ITEMS}, { "activate 0-2" , 0, 2, ACTIVATE_ITEMS}, { "deactivate 0-2", 0, 2, DEACTIVATE_ITEMS}, { "activate 2-4" , 2, 4, ACTIVATE_ITEMS}, { "deactivate 2-4", 2, 4, DEACTIVATE_ITEMS}, }; void main(argc, argv) unsigned int argc; char **argv; { int i,items, selected; unsigned char policy; XEvent event; Widget inner_box, toplevel,fw,bb; Widget buttons[16]; XmScrolledWindowWidget sw; Widget hsb,vsb; static Boolean BailOut; Arg myArgs[20]; XmString text; XmStringCharSet cs = "ISOLatin1"; XFontStruct *fnt; XmFontList font1, font2, font3, curfont; int NewPbutton; signal(SIGINT, Quit); toplevel = XtInitialize(argv[0], "XmDemos", NULL, 0, &argc, argv); /* * intern the atoms and add mwm_messages to wm_protocols so that * mwm will look for mwm_messages property changes. Also add a * callback for handling WM_DELETE_WINDOW for when the user * selects the close button. */ mwm_messages = XmInternAtom(XtDisplay(toplevel), _XA_MWM_MESSAGES, FALSE); wm_delete_window = XmInternAtom(XtDisplay(toplevel), "WM_DELETE_WINDOW", FALSE); XmAddWMProtocolCallback(toplevel, wm_delete_window, Quit, 0); XmAddWMProtocols(toplevel, &mwm_messages, 1); fnt = XLoadQueryFont(XtDisplay(toplevel), "vr-20"); font1 = XmFontListCreate(fnt, cs); fnt = XLoadQueryFont(XtDisplay(toplevel), "vri-25"); font2 = XmFontListCreate(fnt, cs); fnt = XLoadQueryFont(XtDisplay(toplevel), "vbee-36"); font3 = XmFontListCreate(fnt, cs); curfont = font1; i = 0; items = 0; selected = 0; sw = (XmScrolledWindowWidget ) XtCreateManagedWidget("ScrolledWindow", xmScrolledWindowWidgetClass, toplevel, (ArgList)myArgs, i); i = 0; XtSetArg (myArgs[i], XmNscrollingPolicy,(XtArgVal) &policy); i++; XtGetValues(sw,myArgs,1); if (policy == XmAPPLICATION_DEFINED) { i = 0; XtSetArg (myArgs[i], XmNorientation,(XtArgVal) (XmVERTICAL)); i++; vsb = XtCreateManagedWidget("vScrollBar", xmScrollBarWidgetClass, (Widget) sw, myArgs, i); i = 0; XtSetArg (myArgs[i], XmNorientation,(XtArgVal) (XmHORIZONTAL)); i++; hsb = XtCreateManagedWidget("hScrollBar", xmScrollBarWidgetClass, (Widget) sw, myArgs, i); } i = 0; XtSetArg(myArgs[i], XmNborderWidth, (XtArgVal) 2); i++; XtSetArg(myArgs[i], XmNshadowThickness, (XtArgVal) 0); i++; inner_box = XtCreateManagedWidget ("RowCol", xmRowColumnWidgetClass, sw, (ArgList)myArgs, i); /* * Create the button list from the item table. All buttons call * the ChangeMenu routine. */ for (items = 0; items < XtNumber(menuops); items++) { i = 0; text = XmStringLtoRCreate(menuops[items].label, cs); XtSetArg(myArgs[i], XmNfontList, (XtArgVal) curfont);i++; XtSetArg(myArgs[i], XmNlabelString, (XtArgVal) text);i++; XtSetArg(myArgs[i], XmNlabelType, (XtArgVal) XmSTRING);i++; buttons[items] = XtCreateManagedWidget(argv[0], xmPushButtonWidgetClass, inner_box, (ArgList)myArgs, i); XtAddCallback(buttons[items], XmNactivateCallback, ChangeMenu, (caddr_t)&menuops[items]); } i = 0; if (policy == XmAPPLICATION_DEFINED) { XtSetArg(myArgs[i], XmNhorizontalScrollBar, (XtArgVal) hsb); i++; XtSetArg(myArgs[i], XmNverticalScrollBar, (XtArgVal) vsb); i++; } XtSetArg(myArgs[i], XmNworkWindow, (XtArgVal)inner_box); i++; XtSetValues(sw, myArgs, i); XtRealizeWidget(toplevel); XtMainLoop(); }