|
|
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 - downloadIndex: T U x
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();
}