1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00
cde/cde/examples/tt/broadcast.c
2012-03-10 18:58:32 +00:00

284 lines
7.7 KiB
C

/*
* CDE - Common Desktop Environment
*
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
*
* These libraries and programs are free software; you can
* redistribute them and/or modify them under the terms of the GNU
* Lesser General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* These libraries and programs are distributed in the hope that
* they will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with these librararies and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/*
* (c) Copyright 1995 Digital Equipment Corporation.
* (c) Copyright 1993, 1994, 1995 Hewlett-Packard Company
* (c) Copyright 1993, 1994, 1995 International Business Machines Corp.
* (c) Copyright 1993, 1994, 1995 Sun Microsystems, Inc.
* (c) Copyright 1993, 1994, 1995 Novell, Inc.
* (c) Copyright 1995 FUJITSU LIMITED.
* (c) Copyright 1995 Hitachi.
*
* $XConsortium: broadcast.c /main/4 1996/08/12 18:34:24 barstow $
*
* broadcast - dynamic pattern and procedural notification example
*
*/
#include <stdio.h>
#include <sys/param.h>
#include <sys/types.h>
#include <string.h>
#include <Xm/XmAll.h>
#include <Tt/tt_c.h>
Widget toplevel, base_frame, controls, slider, gauge, button;
char *my_procid;
void broadcast_value();
void receive_tt_message();
void create_ui_components();
void
main(argc, argv)
int argc;
char **argv;
{
int ttfd;
Tt_pattern pat;
XtAppContext app;
/*
* Initialize Motif and create ui components
*/
toplevel = XtVaAppInitialize(&app, "ttsample1", NULL, 0,
&argc, argv, NULL, NULL);
XtVaSetValues(toplevel, XmNtitle, "ToolTalk Sample 1", 0);
create_ui_components();
/*
* Initialize ToolTalk, using the initial default session, and
* obtain the file descriptor that will become active whenever
* ToolTalk has a message for this process.
*/
my_procid = tt_open();
ttfd = tt_fd();
/*
* Arrange for Motif to call receive_tt_message when the ToolTalk
* file descriptor becomes active.
*/
XtAppAddInput(app, ttfd, (XtPointer) XtInputReadMask,
receive_tt_message, 0);
/*
* Create and register a pattern so ToolTalk knows we are interested
* in "ttsample1_value" messages within the session we join.
*/
pat = tt_pattern_create();
tt_pattern_category_set(pat, TT_OBSERVE);
tt_pattern_scope_add(pat, TT_SESSION);
tt_pattern_op_add(pat, "ttsample1_value");
tt_pattern_register(pat);
/*
* Join the default session
*/
tt_session_join(tt_default_session());
/*
* Turn control over to Motif.
*/
XtRealizeWidget(toplevel);
XtAppMainLoop(app);
/*
* Before leaving, allow ToolTalk to clean up.
*/
tt_close();
exit(0);
}
/*
* When the button is pressed, broadcast the new slider value.
*/
void
broadcast_value(widget, client_data, call_data)
Widget widget;
XtPointer client_data, call_data;
{
int slider_value;
Tt_message msg_out;
/*
* Create and send a ToolTalk notice message
* ttsample1_value(in int <new value)
*/
XtVaGetValues(slider, XmNvalue, &slider_value, 0);
slider_value++;
XtVaSetValues(slider, XmNvalue, slider_value, 0);
msg_out = tt_pnotice_create(TT_SESSION, "ttsample1_value");
tt_message_arg_add(msg_out, TT_IN, "integer", NULL);
tt_message_arg_ival_set(msg_out, 0, slider_value);
tt_message_send(msg_out);
/*
* Since this message is a notice, we don't expect a reply, so
* there's no reason to keep a handle for the message.
*/
tt_message_destroy(msg_out);
}
/*
* When a ToolTalk message is available, receive it; if it's a
* ttsample1_value message, update the gauge with the new value.
*/
void
receive_tt_message(client_data, fid, id)
XtPointer client_data;
int *fid;
XtInputId *id;
{
Tt_message msg_in;
int mark;
int val_in;
char *op;
Tt_status err;
msg_in = tt_message_receive();
/*
* It's possible that the file descriptor would become active
* even though ToolTalk doesn't really have a message for us.
* The returned message handle is NULL in this case.
*/
if (msg_in == NULL) return;
/*
* Get a storage mark so we can easily free all the data
* ToolTalk returns to us.
*/
mark = tt_mark();
op = tt_message_op(msg_in);
err = tt_ptr_error(op);
if (err > TT_WRN_LAST) {
printf( "tt_message_op(): %s\n", tt_status_message(err));
} else if (op != 0) {
if (0==strcmp("ttsample1_value", tt_message_op(msg_in))) {
tt_message_arg_ival(msg_in, 0, &val_in);
XtVaSetValues(gauge, XmNvalue, val_in, 0);
}
}
tt_message_destroy(msg_in);
tt_release(mark);
return;
}
/*
* Straight Motif calls for creating the ui elements. No
* ToolTalk-specific code here.
*/
void
create_ui_components()
{
int decor;
Widget glabel, slabel;
XmString label;
base_frame = XtVaCreateManagedWidget("base_frame",
xmMainWindowWidgetClass, toplevel,
XmNwidth, 250,
XmNheight, 175,
0);
XtVaGetValues(base_frame, XmNmwmDecorations, &decor, 0);
decor &= ~MWM_DECOR_RESIZEH;
XtVaSetValues(base_frame, XmNmwmDecorations, &decor, 0);
controls = XtVaCreateManagedWidget("controls",
xmFormWidgetClass, base_frame, NULL, 0, 0);
slabel = XtVaCreateManagedWidget("Send:",
xmLabelWidgetClass, controls,
XmNleftAttachment, XmATTACH_WIDGET,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, controls,
XmNtopOffset, 10,
XmNleftOffset, 5,
0);
slider = XtVaCreateManagedWidget("slider",
xmScaleWidgetClass, controls,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, controls,
XmNleftOffset, 10,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, slabel,
XmNscaleWidth, 225,
XmNscaleHeight, 18,
XmNminimum, 0,
XmNmaximum, 25,
XmNorientation, XmHORIZONTAL,
XmNshowValue, TRUE,
0);
glabel = XtVaCreateManagedWidget("Received:",
xmLabelWidgetClass, controls,
XmNleftAttachment, XmATTACH_WIDGET,
XmNtopAttachment, XmATTACH_WIDGET,
XmNleftOffset, 5,
XmNtopWidget, slider,
0);
gauge = XtVaCreateManagedWidget("gauge",
xmScaleWidgetClass, controls,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, controls,
XmNleftOffset, 10,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, glabel,
XmNorientation, XmHORIZONTAL,
XmNscaleWidth, 225,
XmNscaleHeight, 18,
XmNminimum, 0,
XmNmaximum, 25,
XmNshowValue, TRUE,
0);
label = XmStringCreateSimple("Broadcast");
button = XtVaCreateManagedWidget("button",
xmPushButtonWidgetClass, controls,
XmNtopWidget, gauge,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopOffset, 5,
XmNleftOffset, 75,
XmNleftWidget, controls,
XmNleftAttachment, XmATTACH_WIDGET,
XmNbottomOffset, 5,
XmNlabelString, label,
0);
XmStringFree(label);
XtAddCallback(button, XmNactivateCallback, broadcast_value, 0);
}