view etc/tests/external-widget/test-ew-motif.c @ 5566:4654c01af32b

Improve the implementation, documentation of #'labels, #'flet. lisp/ChangeLog addition: 2011-09-07 Aidan Kehoe <kehoea@parhasard.net> * bytecomp.el: * bytecomp.el (for-effect): Move this earlier in the file, it's referenced in byte-compile-initial-macro-environment. * bytecomp.el (byte-compile-initial-macro-environment): In the byte-compile-macro-environment definition for #'labels, put off the compiling the lambda bodies until the point where the rest of the form is being compiled, allowing the lambda bodies to access appropriate values for byte-compile-bound-variables, and reducing excessive warning about free variables. Add a byte-compile-macro-environment definition for #'flet. This modifies byte-compile-function-environment appropriately, and warns about bindings of functions that have macro definitions in the current environment, about functions that have byte codes, and about functions that have byte-compile methods (which may not do what the user wants at runtime). * bytecomp.el (byte-compile-funcall): If FUNCTION is constant, call #'byte-compile-callargs-warn if that's appropriate, giving warnings about problems with calling functions bound with #'labels. * cl-macs.el: * cl-macs.el (flet): Mention the main difference from Common Lisp, that the bindings are dynamic, not lexical. Counsel the use of #'labels, not #'flet, for this and other reasons. Explain the limited single use case for #'flet. Cross-reference to bytecomp.el in a comment. * cl-macs.el (labels): Go into detail on which functions may be called from where. Explain how to access the function definition of a label within FORM. Add a comment cross-referencing to bytecomp.el. man/ChangeLog addition: 2011-09-07 Aidan Kehoe <kehoea@parhasard.net> * cl.texi (Function Bindings): Move #'labels first, describe it in more detail, explaining that it is to be preferred over #'flet, and explaining why. Explain that dynamic bindings with #'flet will also not work when functions are accessed through their bytecodes.
author Aidan Kehoe <kehoea@parhasard.net>
date Wed, 07 Sep 2011 16:26:45 +0100
parents 6a8c6c6f6c8e
children
line wrap: on
line source

/* Test external widget code in Motif.
   Copyright (C) 1993 Ben Wing.

This file is part of XEmacs.

XEmacs is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.

XEmacs is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with XEmacs.  If not, see <http://www.gnu.org/licenses/>. */

#include <Xm/Xm.h>
#include <Xm/RowColumn.h>
#include <Xm/Scale.h>
#include <Xm/PushB.h>
#include <Xm/Label.h>
#include <Xm/Text.h>
#include <Xm/PanedW.h>
#include "ExternalClient.h"

#ifdef TOOLTALK
#include <desktop/tt_c.h>
char *HxProcID;
#endif

XtAppContext xt_app_con;

void ScaleValueChangedCB(Widget scale, XtPointer app_data, XtPointer widget_data)
{
    XmScaleCallbackStruct *xms = (XmScaleCallbackStruct *) widget_data;
    Widget label = (Widget) app_data;
    char labelarr[10];
    XmString labelstr;
#if 0
    sprintf(labelarr, "%d", xms->value);
    labelstr = XmStringCreateLocalized(labelarr);
    XtVaSetValues(label, XmNlabelString, labelstr, NULL);
    XmStringFree(labelstr);
#endif
}

#ifdef TOOLTALK
static void
handle_tt_input(XtPointer client_data, int *source, XtInputId *id)
{
  Tt_message m = tt_message_receive();

  if (m && !(tt_ptr_error(m))) {
    tt_message_destroy(m);
  }
}

Tt_status
HxInitializeToolTalk()
{
  static Boolean initialized = FALSE;

  if (!initialized) {
    int fd;
    Tt_status status;

    HxProcID = tt_open();
    fd = tt_fd();
    if (TT_OK != (status = tt_session_join( tt_default_session() )))
      return status;
    (void)XtAppAddInput(xt_app_con, fd, (void *)XtInputReadMask, handle_tt_input, NULL);
    initialized = TRUE;
  }

  return TT_OK;
}
#endif

main(int argc, char **argv)
{
    Widget shell, rowcolumn, scale, pushbutton, label1, label2, text;
    Widget paned, text2;
    int n, i;
    Widget widlist[100];
    Widget emacscli[100];
    Arg args[100];
    int no_ews = 1;
    char buf[100];

    if (argc > 1)
      no_ews = atoi (argv[1]);

    shell = XtAppInitialize(&xt_app_con, "Testmotif", NULL, 0,
	&argc, argv, NULL, NULL, 0);

#ifdef TOOLTALK
    HxInitializeToolTalk();
#endif

    rowcolumn = XmCreateRowColumn(shell, "rowcolumn", NULL, 0);
    XtManageChild(rowcolumn);

    n = 0;
    XtSetArg(args[n], XmNtraversalOn, TRUE); n++;
#if 0
    label1 = XmCreateLabel(rowcolumn, "label1", args, n);
#endif
    label1 = XtVaCreateWidget("label1", xmLabelWidgetClass, rowcolumn,
			      XmNwidth, 50, XmNheight, 30,
			      XmNtraversalOn, TRUE, NULL);
    label2 = XmCreateLabel(rowcolumn, "label2", NULL, 0);
    scale = XmCreateScale(rowcolumn, "scale", NULL, 0);
    XtAddCallback(scale, XmNvalueChangedCallback, ScaleValueChangedCB, label1);
    paned = XmCreatePanedWindow(rowcolumn, "paned", NULL, 0);
    n = 0;
    widlist[n++] = label1;
    widlist[n++] = label2;
    widlist[n++] = scale;
    widlist[n++] = paned;
    XtManageChildren(widlist, n);

    pushbutton = XmCreatePushButton(paned, "pushbutton", NULL, 0);
    text = XmCreateText(paned, "text", NULL, 0);
    for (i=0; i<no_ews; i++) {
      sprintf (buf, "extcli%d", i);
      emacscli[i] = XtVaCreateWidget(buf, externalClientWidgetClass, paned,
				     XmNwidth, 500, XmNheight, 200,
				     XmNtraversalOn, TRUE,
#ifdef TOOLTALK
				     XtNuseToolTalk, TRUE,
#endif
				     NULL);
    }
    text2 = XmCreateText(paned, "text2", NULL, 0);
    n = 0;
    widlist[n++] = pushbutton;
    widlist[n++] = text;
    for (i=0; i<no_ews; i++)
      widlist[n++] = emacscli[i];
    widlist[n++] = text2;
    XtManageChildren(widlist, n);

    XtRealizeWidget(shell);

    {
      XmString lab;
      char labarr[1000];
      char tmpbuf[50];
      
      strcpy (labarr, "window:");
      for (i=0; i<no_ews; i++) {
	sprintf (tmpbuf, " %d", XtWindow(emacscli[i]));
	strcat (labarr, tmpbuf);
      }
      lab = XmStringCreateLocalized(labarr);
      XtVaSetValues(label2, XmNlabelString, lab, NULL);
      XmStringFree(lab);
    }
    
    XtAppMainLoop(xt_app_con);
}