home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / TIERRA40.ZIP / ALMOND / OVERVIEW / OVXIFACE.C < prev   
C/C++ Source or Header  |  1992-07-06  |  30KB  |  1,146 lines

  1. /*
  2. * ovxiface.c
  3. *
  4. * Copyright (c) 1991, 1992 by Marc W. Cygnus and Virtual Life
  5. * All Rights Reserved.
  6. *
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <signal.h>
  11. #include <stdlib.h>
  12. #include <errno.h>
  13.  
  14. #include <X11/Intrinsic.h>
  15. #include <X11/StringDefs.h>
  16. #include <X11/Shell.h>
  17. #include <X11/Xaw/Cardinals.h>
  18. #include <X11/Xaw/Form.h>
  19. #include <X11/Xaw/Box.h>
  20. #include <X11/Xaw/Label.h>
  21. #include <X11/Xaw/Command.h>
  22. #include <X11/Xaw/Scrollbar.h>
  23.  
  24. #include "portlayr.h"
  25.  
  26. #include "debug.h"
  27.  
  28. #include <mlayer.h>
  29. #include "overview.h"
  30. #include "trequest.h"
  31.  
  32.  
  33.  
  34. /*** prototypes ********************************************************/
  35.  
  36. /*** local ***/
  37.  
  38. XtCallbackProc        quit_ov_proc P_(( Widget w, XtPointer client_data,
  39.               XtPointer call_data ));
  40. XtCallbackProc        toggle_ov_active P_(( Widget w, XtPointer client_data,
  41.               XtPointer call_data ));
  42. XtCallbackProc        toggle_mv_active P_(( Widget w, XtPointer client_data,
  43.               XtPointer call_data ));
  44. XtCallbackProc        toggle_ip_active P_(( Widget w, XtPointer client_data,
  45.               XtPointer call_data ));
  46. XtCallbackProc        update_scroll P_(( Widget w, XtPointer client_data,
  47.               XtPointer call_data ));
  48.  
  49. XtActionProc        set_resolution P_(( Widget w, XEvent *event,
  50.               String *params, Cardinal *pcount ));
  51. XtActionProc        query_organism P_(( Widget w, XEvent *event,
  52.               String *params, Cardinal *pcount ));
  53. XtActionProc        redraw_mem P_(( Widget w, XEvent *event,
  54.               String *params, Cardinal *pcount ));
  55.  
  56. OrgMap *        find_org_from_orgmap P_(( u_long where ));
  57.  
  58.  
  59. void            please_setup_infobox P_(( Widget ib ));
  60. void            do_plan P_(( void ));
  61. void            init_visual_parameters P_(( void ));
  62. void            setup_visual_constants P_(( void ));
  63. void            initialise_colours P_(( void ));
  64. void            initialise_fonts P_(( void ));
  65.  
  66.  
  67. /*** ovexpose.c ***/
  68.  
  69. extern XtEventHandler    expose_memframe P_(( Widget w, XtPointer client_data,
  70.               XEvent *event, Boolean *ctd ));
  71. extern XtEventHandler    expose_etcbox P_(( Widget w, XtPointer client_data,
  72.               XEvent *event, Boolean *ctd ));
  73. extern XtEventHandler    expose_statbox P_(( Widget w, XtPointer client_data,
  74.               XEvent *event, Boolean *ctd ));
  75.  
  76. /*** ovmemmap.c ***/
  77.  
  78. extern void        generate_memmap P_(( void ));
  79. extern void        free_old_memmap P_(( void ));
  80. extern void        add_org_to_memmap P_(( OrgMap *om, int dodraw ));
  81. extern void        del_org_from_memmap P_(( OrgMap *om ));
  82.         
  83.  
  84.  
  85.  
  86. /*** application specific **********************************************/
  87.  
  88. static char    *SpecColorDefaultNames[] = {
  89.   "#ff4f4f", "#ffba6b", "#ebff1c", "#1bff18", "#7effd4",
  90.   "#00d0ff", "#4848ff", "#cc00ff", "#ff00ea"
  91. };
  92.  
  93.  
  94. /* THE STRINGS THAT FOLLOW SHOULD REALLY BE STATIC! */
  95.  
  96. #define XtNiconGeometry         "iconGeometry"
  97. #define XtCIconGeometry         "IconGeometry"
  98. #define    XtNmemColor        "memColor"
  99. #define    XtCMemColor        "MemColor"
  100. #define    XtNspecColor        "specColor"
  101. #define    XtCSpecColor        "SpecColor"
  102. #define    XtNotherColor        "otherColor"
  103. #define    XtCOtherColor        "OtherColor"
  104. #define    XtNinfoFont        "infoFont"
  105. #define    XtCInfoFont        "InfoFont"
  106. #define    XtNmemLabelFont        "memLabelFont"
  107. #define    XtCMemLabelFont        "MemLabelFont"
  108. #define    XtNstatFont        "statFont"
  109. #define    XtCStatFont        "StatFont"
  110.  
  111. #define FGDEF                   "#00ff84"
  112. #define BGDEF                   "#626482"
  113. #define    CMEMDEF            "#757575"
  114. #define    COTHERDEF        "#e5e5e5"
  115.  
  116. #define    IFONTDEF        "-*-helvetica-bold-r-*-*-14-*-*-*-*-*-*-*"
  117. #define    MLFONTDEF        "-*-helvetica-bold-r-*-*-14-*-*-*-*-*-*-*"
  118. #define    STFONTDEF        "-*-helvetica-medium-r-*-*-14-*-*-*-*-*-*-*"
  119.  
  120. #define    DEFAULTFONT        "-*-helvetica-bold-r-*-*-14-*-*-*-*-*-*-*"
  121.  
  122. #define         CMD_BUTTONWIDTH         140
  123. #define         CMD_BUTTONHEIGHT        18
  124.  
  125.  
  126.  
  127.  
  128.  
  129. /*** other ***********************************************************/
  130.  
  131.  
  132.  
  133. String    fallback_resources[] = {
  134.   "*Command*borderWidth:    2",
  135.   "*Command*shapeStyle:        roundedRectangle",
  136.   "*Command*highlightThickness:    2",
  137.   "*Command*background:        #0092be",
  138.   "*Scrollbar*thickness:    10",
  139.   "*foreground:            #00ff84",
  140.   "*background:            #626482",
  141.   "*borderColor:        #00799e",
  142.   "*font:            -*-helvetica-bold-r-*--14-*-*-*-*-*-*-*",
  143.   NULL
  144. };
  145.  
  146.  
  147.  
  148. static XtActionsRec    ov_actions[] = {
  149.   { "SetRez",        (XtActionProc) set_resolution },
  150.   { "OrgQuery",        (XtActionProc) query_organism },
  151.   { "RedrawMem",    (XtActionProc) redraw_mem },
  152.   NULL
  153. };
  154.  
  155.  
  156.  
  157. /***********************************************************************/
  158.  
  159.  
  160.  
  161. /* DONE
  162. * initialise_xinterface()
  163. *
  164. */
  165.  
  166. void
  167. initialise_xinterface( argc, argv )
  168.   int        argc;
  169.   char        *argv[];
  170. {
  171.   static char        _gs_app_name[] = "Overview";
  172.   Arg            xargs[20];    /* HARDCODED CONSTANT */
  173.   int            i;
  174.   Widget        bigframe;
  175.   Widget        infobox;
  176.   Widget        cmdframe;
  177.   Widget        quit_ov, onoff_ov,ip_ov,mv_ov;
  178.   XGCValues        gcv;
  179.   XtResource        ovresources[ 100 ];    /* HARDCODED CONSTANT */
  180.   int            ovrsccount;
  181.  
  182.  
  183.   ovrsccount = init_resource_spec_list( ovresources, 100 );
  184.  
  185.     /* create topmost shell widget */
  186.  
  187.   GS.X.top = XtAppInitialize( &GS.X.app_con, _gs_app_name, NULL, ZERO,
  188.                   &argc, argv, fallback_resources, NULL, ZERO );
  189.   GS.X.d = XtDisplay( GS.X.top );
  190.  
  191.     /* meander thru the resource database a bit */
  192.  
  193.   XtGetApplicationResources( GS.X.top, (XtPointer)&GS.X, ovresources,
  194.                  ovrsccount, NULL, ZERO );
  195.  
  196.   initialise_colours();
  197.   initialise_fonts();
  198.   init_visual_parameters();
  199.  
  200.   XtAppAddActions( GS.X.app_con, ov_actions, XtNumber( ov_actions ) );
  201.  
  202.   bigframe = XtCreateManagedWidget( "bigframe", formWidgetClass, GS.X.top,
  203.                     NULL, ZERO );
  204.  
  205.     /* create the gfxframe */
  206.  
  207.   i = 0;
  208.   XtSetArg( xargs[i], XtNdefaultDistance, 0 );        i++;
  209.   XtSetArg( xargs[i], XtNtop, XtChainTop );        i++;
  210.   XtSetArg( xargs[i], XtNbottom, XtChainTop );        i++;
  211.   XtSetArg( xargs[i], XtNleft, XtChainLeft );        i++;
  212.   XtSetArg( xargs[i], XtNright, XtChainLeft );        i++;
  213.   GS.X.gfxframe = XtCreateManagedWidget( "gfxframe", formWidgetClass,
  214.             bigframe, xargs, i );
  215.  
  216.     /* create upper infobox */
  217.  
  218.   i = 0;
  219.   XtSetArg( xargs[i], XtNwidth, GS.winwidth );        i++;
  220.   XtSetArg( xargs[i], XtNborderWidth, 0 );        i++;
  221.   XtSetArg( xargs[i], XtNhorizDistance, 0 );        i++;
  222.   XtSetArg( xargs[i], XtNvertDistance, 0 );        i++;
  223.   XtSetArg( xargs[i], XtNbackground,
  224.         BlackPixelOfScreen( DefaultScreenOfDisplay( GS.X.d ) ) );    i++;
  225.   infobox = XtCreateManagedWidget( "infobox", formWidgetClass, GS.X.gfxframe,
  226.                    xargs, i );
  227.  
  228.   please_setup_infobox( infobox );
  229.  
  230.     /* create left etcbox */
  231.  
  232.   i = 0;
  233.   XtSetArg( xargs[i], XtNwidth, GS.ebwidth );        i++;
  234.   XtSetArg( xargs[i], XtNheight, GS.mfheight );        i++;
  235.   XtSetArg( xargs[i], XtNfromVert, infobox );        i++;
  236.   XtSetArg( xargs[i], XtNhorizDistance, 0 );        i++;
  237.   XtSetArg( xargs[i], XtNvertDistance, 0 );        i++;
  238.   XtSetArg( xargs[i], XtNbackground,
  239.         BlackPixelOfScreen( DefaultScreenOfDisplay( GS.X.d ) ) );    i++;
  240.   GS.X.etcbox = XtCreateManagedWidget( "etcbox", formWidgetClass,
  241.           GS.X.gfxframe, xargs, i );
  242.  
  243.   XtAddEventHandler( GS.X.etcbox, ExposureMask, False, expose_etcbox, NULL );
  244.  
  245.     /* create the actual overview frame (for graphics) */
  246.  
  247.   i = 0;
  248.   XtSetArg( xargs[i], XtNwidth, GS.mfwidth );        i++;
  249.   XtSetArg( xargs[i], XtNheight, GS.mfheight );        i++;
  250.   XtSetArg( xargs[i], XtNfromVert, infobox );        i++;
  251.   XtSetArg( xargs[i], XtNfromHoriz, GS.X.etcbox );    i++;
  252.   XtSetArg( xargs[i], XtNtop, XtChainTop );        i++;
  253.   XtSetArg( xargs[i], XtNbottom, XtChainTop );        i++;
  254.   XtSetArg( xargs[i], XtNleft, XtChainLeft );        i++;
  255.   XtSetArg( xargs[i], XtNright, XtChainLeft );        i++;
  256.   XtSetArg( xargs[i], XtNdefaultDistance, 0 );        i++;
  257.   XtSetArg( xargs[i], XtNhorizDistance, 0 );        i++;
  258.   XtSetArg( xargs[i], XtNvertDistance, 0 );        i++;
  259.   XtSetArg( xargs[i], XtNbackground,
  260.         BlackPixelOfScreen( DefaultScreenOfDisplay( GS.X.d ) ) );    i++;
  261.   GS.X.memframe = XtCreateManagedWidget( "memframe", formWidgetClass,
  262.             GS.X.gfxframe, xargs, i );
  263.  
  264.   XtAddEventHandler( GS.X.memframe, ExposureMask, True, expose_memframe,
  265.              NULL );
  266.  
  267.     /* create the memscroll bar */
  268.  
  269.   i = 0;
  270.   XtSetArg( xargs[i], XtNwidth, GS.X.memscrollwidth );    i++;
  271.   XtSetArg( xargs[i], XtNheight, GS.mfheight );        i++;
  272.   XtSetArg( xargs[i], XtNfromVert, infobox );        i++;
  273.   XtSetArg( xargs[i], XtNfromHoriz, GS.X.memframe );    i++;
  274.   XtSetArg( xargs[i], XtNtop, XtChainTop );        i++;
  275.   XtSetArg( xargs[i], XtNbottom, XtChainTop );        i++;
  276.   XtSetArg( xargs[i], XtNleft, XtChainLeft );        i++;
  277.   XtSetArg( xargs[i], XtNright, XtChainLeft );        i++;
  278.   XtSetArg( xargs[i], XtNdefaultDistance, 0 );        i++;
  279.   XtSetArg( xargs[i], XtNhorizDistance, 0 );        i++;
  280.   XtSetArg( xargs[i], XtNvertDistance, 0 );        i++;
  281.   if ( sizeof(float) > sizeof(XtArgVal) ) {
  282.     XtSetArg( xargs[i], XtNshown, GS.sbprop );        i++;
  283.   } else {
  284.     XtArgVal *l_sbprop = (XtArgVal *)&GS.sbprop;
  285.     XtSetArg( xargs[i], XtNshown, *l_sbprop );        i++;
  286.   }
  287.   GS.X.memscroll = XtCreateManagedWidget( "memscroll", scrollbarWidgetClass,
  288.         GS.X.gfxframe, xargs, i );
  289.  
  290.   XtAddCallback( GS.X.memscroll, XtNjumpProc, update_scroll, (XtPointer)NULL );
  291.  
  292.     /* create the lower statbox */
  293.  
  294.   i = 0;
  295.   XtSetArg( xargs[i], XtNwidth, GS.winwidth );        i++;
  296.   XtSetArg( xargs[i], XtNheight, GS.statheight );    i++;
  297.   XtSetArg( xargs[i], XtNfromVert, GS.X.etcbox );    i++;
  298.   XtSetArg( xargs[i], XtNborderWidth, 0 );        i++;
  299.   XtSetArg( xargs[i], XtNhorizDistance, 0 );        i++;
  300.   XtSetArg( xargs[i], XtNvertDistance, 0 );        i++;
  301.   XtSetArg( xargs[i], XtNbackground,
  302.         BlackPixelOfScreen( DefaultScreenOfDisplay( GS.X.d ) ) );    i++;
  303.   GS.X.statbox = XtCreateManagedWidget( "statbox", formWidgetClass,
  304.            GS.X.gfxframe, xargs, i );
  305.  
  306.   XtAddEventHandler( GS.X.statbox, ExposureMask, False, expose_statbox, NULL );
  307.  
  308.     /* create the lower command frame */
  309.  
  310.   i = 0;
  311.   XtSetArg( xargs[i], XtNfromVert, GS.X.gfxframe );    i++;
  312.   XtSetArg( xargs[i], XtNtop, XtChainTop );        i++;
  313.   XtSetArg( xargs[i], XtNbottom, XtChainTop );        i++;
  314.   XtSetArg( xargs[i], XtNleft, XtChainLeft );        i++;
  315.   XtSetArg( xargs[i], XtNright, XtChainLeft );        i++;
  316.   cmdframe = XtCreateManagedWidget( "cmdframe", formWidgetClass, bigframe,
  317.            xargs, i );
  318.  
  319.     /* quit button */
  320.  
  321.   i = 0;
  322.   XtSetArg( xargs[i], XtNfromHoriz, NULL );        i++;
  323.   XtSetArg( xargs[i], XtNfromVert, NULL );        i++;
  324.             /* HARDCODED CONSTANTS below */
  325.   XtSetArg( xargs[i], XtNwidth, 60 );            i++;
  326.   XtSetArg( xargs[i], XtNheight, 18 );            i++;
  327.   quit_ov = XtCreateManagedWidget( "quit", commandWidgetClass, cmdframe,
  328.           xargs, i );
  329.   XtAddCallback( quit_ov, XtNcallback, quit_ov_proc, (XtPointer)NULL );
  330.  
  331.     /* enable/disable button */
  332.  
  333.   i = 0;
  334.   XtSetArg( xargs[i], XtNfromHoriz, quit_ov );        i++;
  335.   XtSetArg( xargs[i], XtNfromVert, NULL );        i++;
  336.             /* HARDCODED CONSTANTS below */
  337.   XtSetArg( xargs[i], XtNwidth, 80 );            i++;
  338.   XtSetArg( xargs[i], XtNheight, 18 );            i++;
  339.   onoff_ov = XtCreateManagedWidget( "disable", commandWidgetClass, cmdframe,
  340.            xargs, i );
  341.   XtAddCallback( onoff_ov, XtNcallback, toggle_ov_active, (XtPointer)NULL );
  342.  
  343.     /* enable/disable IP button */
  344.  
  345.   i = 0;
  346.   XtSetArg( xargs[i], XtNfromHoriz, onoff_ov );        i++;
  347.   XtSetArg( xargs[i], XtNfromVert, NULL );        i++;
  348.             /* HARDCODED CONSTANTS below */
  349.   XtSetArg( xargs[i], XtNwidth, 80 );            i++;
  350.   XtSetArg( xargs[i], XtNheight, 18 );            i++;
  351.   ip_ov = XtCreateManagedWidget( "enable IP", commandWidgetClass, cmdframe,
  352.            xargs, i );
  353.   XtAddCallback( ip_ov, XtNcallback, toggle_ip_active, (XtPointer)NULL );
  354.  
  355.     /* enable/disable MV button */
  356.  
  357.   i = 0;
  358.   XtSetArg( xargs[i], XtNfromHoriz, ip_ov );        i++;
  359.   XtSetArg( xargs[i], XtNfromVert, NULL );        i++;
  360.             /* HARDCODED CONSTANTS below */
  361.   XtSetArg( xargs[i], XtNwidth, 88 );            i++;
  362.   XtSetArg( xargs[i], XtNheight, 18 );            i++;
  363.   ip_ov = XtCreateManagedWidget( "enable MV", commandWidgetClass, cmdframe,
  364.            xargs, i );
  365.   XtAddCallback( ip_ov, XtNcallback, toggle_mv_active, (XtPointer)NULL );
  366.  
  367.     /* initialise organism list */
  368.   initialise_orglist();
  369.  
  370.     /* generate a memory screen representation from orglist */
  371.   GS.memmap = (MemMap **)NULL;
  372.   generate_memmap();
  373.  
  374.     /* realise the top level overview widget */
  375.   XtRealizeWidget( GS.X.top );
  376.  
  377.   gcv.foreground = GS.X.foreground;
  378.   gcv.graphics_exposures = True;
  379.   GS.X.memgc = XCreateGC( GS.X.d, XtWindow( GS.X.top ),
  380.          GCForeground | GCGraphicsExposures, &gcv);
  381.  
  382.     /* initialise local statistics */
  383.   initialise_ov_statistics();
  384.  
  385.   GS.simstate = OV_ENABLED;
  386.   GS.ipstate = IP_DISABLED;
  387.   GS.mvstate = MV_DISABLED;
  388.  
  389. }
  390.  
  391.  
  392. /* INCOMPLETE
  393. * please_setup_infobox()
  394. *
  395. */
  396.  
  397. void
  398. please_setup_infobox( ib )
  399.   Widget    ib;
  400. {
  401.   Arg            xargs[20];    /* HARDCODED CONSTANT */
  402.   int            i;
  403.   char bbb[120];
  404.  
  405.   i = 0;
  406.   sprintf( GS.X.s_simulation, "Simulation [ %s:%d ]", GS.hostname,
  407.        GS.simport );
  408.   XtSetArg( xargs[i], XtNlabel, GS.X.s_simulation );        i++;
  409.   XtSetArg( xargs[i], XtNfont, GS.X.infofont );            i++;
  410.   XtSetArg( xargs[i], XtNbackground,  
  411.      BlackPixelOfScreen( DefaultScreenOfDisplay( GS.X.d ) ) );    i++; 
  412.   GS.X.l_simulation = XtCreateManagedWidget( "simlabel", labelWidgetClass, 
  413.             ib, xargs, i );
  414.  
  415.   i = 0;
  416.   sprintf(bbb, 
  417.  "Millions Exec= %8.8ld Cells = %8.8ld  Genotypes = %8.8ld  Sizes =%8.8ld ",
  418.    GS.InstExe_m,GS.NumCells,GS.NumGenotypes, GS.NumSizes); 
  419.  
  420.   XtSetArg( xargs[i], XtNfromHoriz, GS.X.l_simulation );    i++;
  421.   XtSetArg( xargs[i], XtNlabel, bbb );                i++;
  422.   XtSetArg( xargs[i], XtNfont, GS.X.infofont );            i++;
  423.   XtSetArg( xargs[i], XtNbackground,  
  424.      BlackPixelOfScreen( DefaultScreenOfDisplay( GS.X.d ) ) );    i++; 
  425.   GS.X.l_stats = XtCreateManagedWidget( "label2", 
  426.                  labelWidgetClass, ib, xargs, i );
  427.  
  428. }
  429.  
  430. void
  431. do_plan( )
  432. {
  433.   Arg            xargs[20];    /* HARDCODED CONSTANT */
  434.   char bbb[120];
  435.   int i=0;
  436.  
  437.   sprintf(bbb, 
  438.   "Millions Exec= %ld Cells = %4ld  Genotypes = %4ld  Sizes =%4ld ",
  439.    GS.InstExe_m,GS.NumCells,GS.NumGenotypes, GS.NumSizes); 
  440.  
  441.   XtSetArg( xargs[i], XtNlabel, bbb );                i++;
  442.  
  443.   /* XtSetValues( GS.X.l_stats, xargs, XtNumber( xargs ) );*/
  444.  
  445.   XtSetValues( GS.X.l_stats, xargs, i);
  446.  
  447.  
  448. }
  449.  
  450. /* DONE
  451. * init_visual_parameters()
  452. *
  453. */
  454.  
  455. void
  456. init_visual_parameters()
  457. {
  458.   static char        _sizerule[] = "0009000000";
  459.  
  460.   GS.rez = ( GS.memsize <= HiRezCutoff ) ? HiRez :
  461.          ( GS.memsize > LoRezCutoff ) ? LoRez : MedRez;
  462.  
  463.   setup_visual_constants();
  464.  
  465.   GS.X.memscrollwidth = 10;
  466.   GS.memrlen = 1000;
  467.   GS.rbd = 8;
  468.   GS.lbd = 6;
  469.  
  470.   GS.ebwidth = XTextWidth( GS.X.memlabelfont, _sizerule, strlen( _sizerule ) );
  471.   GS.mfwidth = GS.lbd + GS.rbd + GS.memrlen;    /* memframe width */
  472.     /* the next line has hardcoded constants which make the memory
  473.        window a consistent size over different magnifications */
  474.   GS.mfheight = (60000 / GS.memrlen) * 12 - 7 + 2 * (GS.vbd + GS.hashlen);
  475.   GS.realmfheight = ((GS.memsize - 1) / GS.memrlen + 1) *
  476.              (GS.memrwidth + GS.memrspace) -
  477.              GS.memrspace + 2 * (GS.vbd + GS.hashlen);
  478.   GS.statheight = ST_UBorder + ST_KeyWidth + ST_LBorder +
  479.     (int)(ST_Skip0 * (float)GS.X.memlabelfont->max_bounds.ascent) +
  480.     GS.X.memlabelfont->max_bounds.ascent +
  481.     (int)(ST_Skip1 * (float)GS.X.memlabelfont->max_bounds.ascent) +
  482.     2 * GS.X.statfont->max_bounds.ascent +
  483.     (int)(ST_Skip2 * (float)GS.X.statfont->max_bounds.ascent);
  484.  
  485.   GS.winwidth = GS.ebwidth + 2 + GS.mfwidth + 2 + GS.X.memscrollwidth + 2;
  486.  
  487.   GS.sbprop = (float)GS.mfheight / (float)GS.realmfheight;
  488.   if ( GS.sbprop > 1.0 )
  489.     GS.sbprop = 1.0;
  490.  
  491.   GS.memviewport = 0;
  492.  
  493. DEBUG(DBGD)
  494.   fprintf( stderr, "soup %lu; resolution %lu; mfwin (%dx%d)\n",
  495.        GS.memsize, GS.rez, GS.mfwidth, GS.mfheight );
  496. ENDDB()
  497.  
  498. }
  499.  
  500.  
  501. void
  502. setup_visual_constants()
  503. {
  504.  
  505.   switch ( GS.rez ) {
  506.     case MicroRez:
  507.       GS.hashlen = 4;
  508.       GS.memrwidth = 100;
  509.       GS.memrspace = 30;
  510.      /* GS.memrlen = 500; */
  511.       GS.vbd = 7;
  512.       GS.memlabelskip = 5;
  513.       break;
  514.  
  515.     case ZoomRez:
  516.       GS.hashlen = 2;
  517.       GS.memrwidth = 12;
  518.       GS.memrspace = 14;
  519.       GS.vbd = 7;
  520.       GS.memlabelskip = 5;
  521.       break;
  522.  
  523.     case HiRez:
  524.       GS.hashlen = 2;
  525.       GS.memrwidth = 5;
  526.       GS.memrspace = 7;
  527.       GS.vbd = 7;
  528.       GS.memlabelskip = 5;
  529.       break;
  530.  
  531.     case MedRez:
  532.       GS.hashlen = 1;
  533.       GS.memrwidth = 3;
  534.       GS.memrspace = 4;
  535.       GS.vbd = 5;
  536.       GS.memlabelskip = 5;
  537.       break;
  538.  
  539.     case LoRez:
  540.       GS.hashlen = 0;
  541.       GS.memrwidth = 1;
  542.       GS.memrspace = 0;
  543.       GS.vbd = 7;
  544.       GS.memlabelskip = 50;
  545.       break;
  546.   }
  547.  
  548. }
  549.  
  550.  
  551. #define    PackXResource( rl, name, class, type, size, rstruc, relem, deftype, defaddr )                                    \
  552.     {                                \
  553.       rl.resource_name = name;                    \
  554.       rl.resource_class = class;                    \
  555.       rl.resource_type = type;                    \
  556.       rl.resource_size = (size);                    \
  557.       rl.resource_offset = XtOffset( rstruc, relem );        \
  558.       rl.default_type = deftype;                    \
  559.       rl.default_addr = defaddr;                    \
  560.     }
  561.  
  562.  
  563. /* DONE
  564. * init_resource_spec_list()
  565. *
  566. */
  567.  
  568. int
  569. init_resource_spec_list( rsc, rscmax )
  570.   XtResource    *rsc;
  571.   int        rscmax;
  572. {
  573.   int            rc;
  574.   int            i;            /* HARDCODED CONSTANT below */
  575.   static char        colournames[NUM_SPECCOLOURS][ 15 ];
  576.  
  577.   rc = 0;
  578.   PackXResource( rsc[rc], XtNgeometry, XtCGeometry, XtRString, sizeof(char *),
  579.          GtXStuffPtr, geometry, XtRString, (caddr_t)NULL );
  580.   rc++;
  581.  
  582.   PackXResource( rsc[rc], XtNiconGeometry, XtCIconGeometry, XtRString,
  583.          sizeof(char *), GtXStuffPtr, iconGeometry, XtRString,
  584.          (caddr_t)NULL );
  585.   rc++;
  586.  
  587.   PackXResource( rsc[rc], XtNforeground, XtCForeground, XtRPixel,
  588.          sizeof(Pixel), GtXStuffPtr, foreground, XtRString, FGDEF );
  589.   rc++;
  590.  
  591.   PackXResource( rsc[rc], XtNbackground, XtCBackground, XtRPixel,
  592.          sizeof(Pixel), GtXStuffPtr, background, XtRString, BGDEF );
  593.   rc++;
  594.  
  595.   PackXResource( rsc[rc], XtNmemColor, XtCMemColor, XtRPixel,
  596.          sizeof(Pixel), GtXStuffPtr, cmemory, XtRString, CMEMDEF );
  597.   rc++;
  598.  
  599.   PackXResource( rsc[rc], XtNotherColor, XtCOtherColor, XtRPixel,
  600.          sizeof(Pixel), GtXStuffPtr, cother, XtRString, COTHERDEF );
  601.   rc++;
  602.  
  603.   PackXResource( rsc[rc], XtNinfoFont, XtCInfoFont, XtRString,
  604.          sizeof(String), GtXStuffPtr, ifname, XtRString, IFONTDEF );
  605.   rc++;
  606.  
  607.   PackXResource( rsc[rc], XtNmemLabelFont, XtCMemLabelFont, XtRString,
  608.          sizeof(String), GtXStuffPtr, mlfname, XtRString, MLFONTDEF );
  609.   rc++;
  610.  
  611.   PackXResource( rsc[rc], XtNstatFont, XtCStatFont, XtRString,
  612.          sizeof(String), GtXStuffPtr, stfname, XtRString, STFONTDEF );
  613.   rc++;
  614.  
  615.   for ( i = 0; i < NUM_SPECCOLOURS; i++ ) {
  616.     sprintf( colournames[i], "specColour%d", i );
  617.     PackXResource( rsc[rc], colournames[i], XtCSpecColor, XtRPixel,
  618.            sizeof(Pixel), GtXStuffPtr, cspectrum[i], XtRString,
  619.            SpecColorDefaultNames[i] );
  620.     rc++;
  621.   }
  622.  
  623.   return rc;
  624. }
  625.  
  626.  
  627. /* DONE
  628. * initialise_colours()
  629. *
  630. */
  631.  
  632. void
  633. initialise_colours()
  634. {
  635.   int        numpix;
  636.   Colormap    cmap;
  637.   XColor    *xc;
  638.  
  639.           int           i;
  640.           XColor        c;
  641.           XColor        ctmp;
  642.  
  643.     /* sum of:    number of spectrum colours */
  644.     /*        one "dead" memory colour */
  645.  
  646.   GS.numcolours = 0;
  647.   cmap = DefaultColormapOfScreen( XtScreen( GS.X.top ) );
  648.  
  649.   numpix = NUM_SPECCOLOURS + 4;        /* see GtXStuff for colour counts */
  650.  
  651. /***
  652.   if ( ! XAllocColorCells( GS.X.d, cmap, False, NULL, ZERO, xc, numpix ) ) {
  653.     fprintf( stderr, "Whoops; out of colourmap cells in init_colours()!!\n" );
  654.     exit( 1 );
  655.   }
  656.  
  657.   XStoreColor( GS.X.d, cmap, &GS.X.foreground );
  658.   XStoreColor( GS.X.d, cmap, &GS.X.background );
  659.   XStoreColor( GS.X.d, cmap, &GS.X.cmemory );
  660.   XStoreColor( GS.X.d, cmap, &GS.X.cother );
  661.   XStoreColors( GS.X.d, cmap, GS.X.cspectrum, NUM_SPECCOLOURS );
  662. ***/
  663.   
  664. }
  665.  
  666.  
  667. /* DONE
  668. * initialise_fonts()
  669. *
  670. */
  671.  
  672. void
  673. initialise_fonts()
  674. {
  675.   static char        _fonterrmsg[] =
  676.               "bummer: can't load font %s; using default...\n";
  677.  
  678.   if (( GS.X.defaultfont = XLoadQueryFont( GS.X.d, DEFAULTFONT )
  679.       ) == (XFontStruct *)NULL ) {
  680.     fprintf( stderr, "Lackey, fix your X11 setup! I can't even load %s!\n",
  681.          DEFAULTFONT );
  682.     exit( 1 );
  683.   }
  684.  
  685.   if (( GS.X.infofont = XLoadQueryFont( GS.X.d, GS.X.ifname )
  686.       ) == (XFontStruct *)NULL ) {
  687.     fprintf( stderr, _fonterrmsg, GS.X.ifname );
  688.     GS.X.infofont = GS.X.defaultfont;
  689.   }
  690.  
  691.   if (( GS.X.memlabelfont = XLoadQueryFont( GS.X.d, GS.X.mlfname )
  692.       ) == (XFontStruct *)NULL ) {
  693.     fprintf( stderr, _fonterrmsg, GS.X.mlfname );
  694.     GS.X.memlabelfont = GS.X.defaultfont;
  695.   }
  696.  
  697.   if (( GS.X.statfont = XLoadQueryFont( GS.X.d, GS.X.stfname )
  698.       ) == (XFontStruct *)NULL ) {
  699.     fprintf( stderr, _fonterrmsg, GS.X.stfname );
  700.     GS.X.statfont = GS.X.defaultfont;
  701.   }
  702.  
  703. }
  704.  
  705.  
  706. /* DONE
  707. * quit_ov_proc()
  708. *
  709. * widget callback
  710. *
  711. */
  712.  
  713. static XtCallbackProc
  714. quit_ov_proc( w, client_data, call_data )
  715.   Widget    w;
  716.   XtPointer    client_data;
  717.   XtPointer    call_data;
  718. {
  719.   int        i;
  720.   MemMap    *mm, *mt;
  721.  
  722.   XFreeGC( GS.X.d, GS.X.memgc );    /* free allocated GC */
  723.  
  724.     /* free memory redraw structure */
  725.  
  726.   free_old_memmap();
  727.  
  728.   XtDestroyWidget( GS.X.top );
  729.  
  730.   exit( 0 );
  731. }
  732.  
  733.  
  734. /* DONE
  735. * toggle_ip_active()
  736. *
  737. * widget callback
  738. *
  739. */
  740.  
  741. static XtCallbackProc
  742. toggle_ip_active( w, client_data, call_data )
  743.   Widget    w;
  744.   XtPointer    client_data;
  745.   XtPointer    call_data;
  746. {
  747.   static Arg    labelArgs[] = {
  748.     { XtNlabel, (XtArgVal)NULL },        /* ...set later */
  749.   };
  750.   static char    str_en[] = "enable IP";
  751.   static char    str_dis[] = "disable IP";
  752.   MtStatus    iRet;
  753.   int iWhich;
  754.  
  755.   switch ( GS.ipstate ) {
  756.     case IP_DISABLED:
  757.       XtSetArg( labelArgs[0], XtNlabel, str_dis );
  758.       XtSetValues( w, labelArgs, XtNumber( labelArgs ) );
  759.       GS.ipstate = IP_ENABLED;
  760.       iWhich = M_Enable;
  761.       if (( iRet = MGenRequest( GS.hLink, MrModifyDataflow, TrtIPEvent,
  762.                                 (pMtOpaque)&iWhich, sizeof( int ) )
  763.           ) != MsOK )
  764.         ALGripe( "MGenRequest", "error %d\n", iRet );
  765.       draw_stat_keys( 0, GS.winwidth, 0, GS.statheight, False );
  766.       break;
  767.  
  768.     case IP_ENABLED:
  769.       XtSetArg( labelArgs[0], XtNlabel, str_en );
  770.       XtSetValues( w, labelArgs, XtNumber( labelArgs ) );
  771.       GS.ipstate = IP_DISABLED;
  772.       iWhich = M_Disable;
  773.       if (( iRet = MGenRequest( GS.hLink, MrModifyDataflow, TrtIPEvent,
  774.                                 (pMtOpaque)&iWhich, sizeof( int ) )
  775.           ) != MsOK )
  776.         ALGripe( "MGenRequest", "error %d\n", iRet );
  777.       break;
  778.   }
  779. }
  780.  
  781. /* DONE
  782. * toggle_mv_active()
  783. *
  784. * widget callback
  785. *
  786. */
  787.  
  788. static XtCallbackProc
  789. toggle_mv_active( w, client_data, call_data )
  790.   Widget    w;
  791.   XtPointer    client_data;
  792.   XtPointer    call_data;
  793. {
  794.   static Arg    labelArgs[] = {
  795.     { XtNlabel, (XtArgVal)NULL },        /* ...set later */
  796.   };
  797.   static char    str_en[] = "enable MV";
  798.   static char    str_dis[] = "disable MV";
  799.   MtStatus    iRet;
  800.   int iWhich;
  801.  
  802.   switch ( GS.mvstate ) {
  803.     case MV_DISABLED:
  804.       XtSetArg( labelArgs[0], XtNlabel, str_dis );
  805.       XtSetValues( w, labelArgs, XtNumber( labelArgs ) );
  806.       GS.mvstate = MV_ENABLED;
  807.       iWhich = M_Enable;
  808.       if (( iRet = MGenRequest( GS.hLink, MrModifyDataflow, TrtMVEvent,
  809.                                 (pMtOpaque)&iWhich, sizeof( int ) )
  810.           ) != MsOK )
  811.         ALGripe( "MGenRequest", "error %d\n", iRet );
  812.       draw_stat_keys( 0, GS.winwidth, 0, GS.statheight, False );
  813.       break;
  814.  
  815.     case MV_ENABLED:
  816.       XtSetArg( labelArgs[0], XtNlabel, str_en );
  817.       XtSetValues( w, labelArgs, XtNumber( labelArgs ) );
  818.       GS.mvstate = MV_DISABLED;
  819.       iWhich = M_Disable;
  820.       if (( iRet = MGenRequest( GS.hLink, MrModifyDataflow, TrtMVEvent,
  821.                                 (pMtOpaque)&iWhich, sizeof( int ) )
  822.           ) != MsOK )
  823.         ALGripe( "MGenRequest", "error %d\n", iRet );
  824.       break;
  825.   }
  826. }
  827.  
  828. /* DONE
  829. * toggle_ov_active()
  830. *
  831. * widget callback
  832. *
  833. */
  834.  
  835. static XtCallbackProc
  836. toggle_ov_active( w, client_data, call_data )
  837.   Widget    w;
  838.   XtPointer    client_data;
  839.   XtPointer    call_data;
  840. {
  841.   static Arg    labelArgs[] = {
  842.     { XtNlabel, (XtArgVal)NULL },        /* ...set later */
  843.   };
  844.   static char    str_en[] = "enable";
  845.   static char    str_dis[] = "disable";
  846.   MtStatus    iRet;
  847.  
  848.   switch ( GS.simstate ) {
  849.     case OV_DISABLED:
  850.       XtSetArg( labelArgs[0], XtNlabel, str_dis );
  851.       XtSetValues( w, labelArgs, XtNumber( labelArgs ) );
  852.       GS.simstate = OV_ENABLED;
  853.       if (( iRet = MGenRequest( GS.hLink, MrMessage, TrtResumeSim, M_NoData,
  854.                     0 )) != MsOK )
  855.     ALGripe( "MGenRequest", "failed resuming simulation (%d)\n", iRet );
  856.       break;
  857.  
  858.     case OV_ENABLED:
  859.       XtSetArg( labelArgs[0], XtNlabel, str_en );
  860.       XtSetValues( w, labelArgs, XtNumber( labelArgs ) );
  861.       GS.simstate = OV_DISABLED;
  862.       if (( iRet = MGenRequest( GS.hLink, MrMessage, TrtPauseSim, M_NoData,
  863.                     0 )) != MsOK )
  864.     ALGripe( "MGenRequest", "failed pausing simulation (%d)\n", iRet );
  865.       draw_stat_keys( 0, GS.winwidth, 0, GS.statheight, False );
  866.       do_plan();
  867.       break;
  868.   }
  869. }
  870.  
  871.  
  872. XtActionProc
  873. set_resolution( w, event, params, pcount )
  874.   Widget    w;
  875.   XEvent    *event;
  876.   String    *params;
  877.   Cardinal    *pcount;
  878. {
  879.   float        scrollwant;
  880.  
  881.   if ( *pcount < 1 )
  882.     return;
  883.  
  884.   if ( strcmp( "hi", params[0] ) == 0 ) {
  885.     if ( GS.rez == HiRez )
  886.       return;
  887.     GS.rez = HiRez;
  888.   } else if ( strcmp( "med", params[0] ) == 0 ) {
  889.     if ( GS.rez == MedRez )
  890.       return;
  891.     GS.rez = MedRez;
  892.   } else if ( strcmp( "lo", params[0] ) == 0 ) {
  893.     if ( GS.rez == LoRez )
  894.       return;
  895.     GS.rez = LoRez;
  896.   } else if ( strcmp( "zoom", params[0] ) == 0 ) {
  897.     if ( GS.rez == ZoomRez )
  898.       return;
  899.     GS.rez = ZoomRez;
  900.   } else if ( strcmp( "micro", params[0] ) == 0 ) {
  901.     if ( GS.rez == MicroRez )
  902.       return;
  903.     GS.rez = MicroRez;
  904.   } else
  905.     return;
  906.  
  907.   setup_visual_constants();
  908.  
  909.   free_old_memmap();
  910.  
  911.   scrollwant = (float)GS.memviewport / (float)GS.realmfheight;
  912.   GS.realmfheight = ((GS.memsize - 1) / GS.memrlen + 1) *
  913.              (GS.memrwidth + GS.memrspace) -
  914.              GS.memrspace + 2 * (GS.vbd + GS.hashlen);
  915.  
  916.   generate_memmap();
  917.  
  918.   GS.sbprop = (float)GS.mfheight / (float)GS.realmfheight;
  919.   if ( GS.sbprop > 1.0 )
  920.     GS.sbprop = 1.0;
  921.   if ( scrollwant > 1.0 - GS.sbprop )
  922.     scrollwant = 1.0 - GS.sbprop;
  923.  
  924.   XawScrollbarSetThumb( GS.X.memscroll, scrollwant, GS.sbprop );
  925.   GS.memviewport = scrollwant * (float)GS.realmfheight;
  926.  
  927.   XClearWindow( GS.X.d, XtWindow( GS.X.memframe ) );
  928.   XClearWindow( GS.X.d, XtWindow( GS.X.etcbox ) );
  929.   expose_memory( 0, GS.mfwidth - 1, 0, GS.mfheight - 1 );
  930.   expose_memaxis( 0, GS.ebwidth - 1, 0, GS.mfheight - 1, GS.memviewport,
  931.           WhitePixel( GS.X.d, 0 ) );
  932.  
  933. }
  934.  
  935.  
  936. XtCallbackProc
  937. update_scroll( w, client_data, call_data )
  938.   Widget    w;
  939.   XtPointer    client_data;
  940.   XtPointer    call_data;
  941. {
  942.   static float        where;
  943.   XClientMessageEvent    ev;
  944.  
  945.   where = *(float *)call_data;
  946.   ev.type = ClientMessage;
  947.   ev.display = GS.X.d;
  948.   ev.window = XtWindow( GS.X.memframe );
  949.   ev.message_type = (Atom)MEM_SCROLL;
  950.   ev.format = 32;
  951.   ev.data.l[0] = (long)&where;
  952.  
  953.   XSendEvent( GS.X.d, XtWindow( GS.X.memframe ), True, ClientMessage, &ev );
  954.  
  955. }
  956.  
  957.  
  958. void
  959. actually_scroll_screen( where )
  960.   float        where;
  961. {
  962.   int        newy, dely, oldvpt;
  963.   Pixel        xorcolour;
  964.  
  965.   if ( where > 1.0 - GS.sbprop ) {
  966.     XawScrollbarSetThumb( GS.X.memscroll, 1.0 - GS.sbprop, -1.0 );
  967.     where = 1.0 - GS.sbprop;
  968.   }
  969.  
  970.   newy = where * (float)GS.realmfheight;
  971.   dely = GS.memviewport - newy;
  972.  
  973.   oldvpt = GS.memviewport;
  974.   GS.memviewport = newy;
  975.  
  976.   if ( dely == 0 )
  977.     return;
  978.  
  979.   xorcolour = WhitePixel( GS.X.d, 0 ) ^ BlackPixel( GS.X.d, 0 );
  980.  
  981.   if ( dely < 0 ) {
  982.  
  983.     XCopyArea( GS.X.d, XtWindow( GS.X.memframe ), XtWindow( GS.X.memframe ),
  984.            GS.X.memgc, 0, -dely, GS.mfwidth, GS.mfheight + dely, 0, 0 );
  985.     XClearArea( GS.X.d, XtWindow( GS.X.memframe ), 0, GS.mfheight + dely,
  986.         GS.mfwidth, - dely, False );
  987.     expose_memory( 0, GS.mfwidth - 1, GS.mfheight + dely, GS.mfheight - 1 );
  988.  
  989.   } else {
  990.  
  991.     XCopyArea( GS.X.d, XtWindow( GS.X.memframe ), XtWindow( GS.X.memframe ),
  992.            GS.X.memgc, 0, 0, GS.mfwidth, GS.mfheight - dely, 0, dely );
  993.     XClearArea( GS.X.d, XtWindow( GS.X.memframe ), 0, 0, GS.mfwidth, dely,
  994.         False );
  995.     expose_memory( 0, GS.mfwidth - 1, 0, dely - 1 );
  996.  
  997.   }
  998.  
  999.   XSetFunction( GS.X.d, GS.X.memgc, GXxor );
  1000.   expose_memaxis( 0, GS.ebwidth - 1, 0, GS.mfheight - 1, newy, xorcolour );
  1001.   expose_memaxis( 0, GS.ebwidth - 1, 0, GS.mfheight - 1, oldvpt, xorcolour );
  1002.   XSetFunction( GS.X.d, GS.X.memgc, GXcopy );
  1003.  
  1004.   XFlush( GS.X.d );
  1005.  
  1006. }
  1007.  
  1008.  
  1009. XtActionProc
  1010. query_organism( w, event, params, pcount )
  1011.   Widget    w;
  1012.   XEvent    *event;
  1013.   String    *params;
  1014.   Cardinal    *pcount;
  1015. {
  1016.   XButtonEvent        *ev;
  1017.   register int        yref, rowsep, row;
  1018.   register u_long    xmem;
  1019.   OrgMap        *om;
  1020.   int             tsz;
  1021.   TtOrgID        OID;
  1022.   pTtOrgInfo        pOI;
  1023.   int            iOILen;
  1024.   MtStatus        iRet;
  1025.  
  1026.   if ( event->type != ButtonPress ) {
  1027.     fprintf( stderr, "OrgQuery() only valid when bound to a ButtonPress event\n" );
  1028.     return;
  1029.   } else if ( GS.rez == LoRez ) {
  1030.     fprintf( stderr, "OrgQuery() not valid in LoRez mode\n" );
  1031.     return;
  1032.   }
  1033.   ev = (XButtonEvent *)event;
  1034.  
  1035.   rowsep = GS.memrwidth + GS.memrspace;
  1036.   yref = ( ev->y + GS.memviewport - GS.vbd + 1 );
  1037.   if ( yref % rowsep >= 2 * GS.hashlen + GS.memrwidth )
  1038.     return;
  1039.  
  1040.   row = yref / rowsep;
  1041.  
  1042.   xmem = (u_long)row * (u_long)GS.memrlen + (u_long)(ev->x - GS.lbd);
  1043.  
  1044.   if (( om = find_org_from_orgmap( xmem ) ) == (OrgMap *)NULL )
  1045.     return;
  1046.  
  1047.   fprintf( stderr, "Organism: [%u:%u]\n", om->start, om->len );
  1048.  
  1049.   OID.start = om->start;
  1050.   OID.length = om->len;
  1051.   if (( iRet = MGenRequestWithReply( GS.hLink, MrQuery, TrtQueryOrg,
  1052.                      (pMtOpaque)&OID, sizeof( OID ),
  1053.                      (pMtOpaque)&pOI, &iOILen )) != MsOK )
  1054.     ALGripe( "MGenReqWRep.", "error (%d)\n", iRet );
  1055.  
  1056.   if ( pOI != NULL ) {
  1057.  
  1058. /***
  1059.     schlepp_off_process( oi ,tsz);
  1060. ***/
  1061.     ALGripe( "info", "reply gotten ok to org query\n" );
  1062.  
  1063.     (void) ALFree( (char *)pOI );
  1064.  
  1065.   } else
  1066.     fprintf( stderr, "Oops!  Sorry, it's dead; you juuuuuust missed it!\n" );
  1067.  
  1068. }
  1069.  
  1070.  
  1071. int
  1072. schlepp_off_process( oi , ois)
  1073.   char *    oi;
  1074.   int ois;
  1075. {
  1076. FILE *dan_fd;
  1077. int tt;
  1078.  
  1079.   if ( fork() == 0 ) {
  1080.      signal(SIGIO,SIG_IGN);
  1081.      signal(SIGPIPE,SIG_IGN);
  1082.     oi[ois] = 0;
  1083.     /* printf("\n %d \n",ois); */
  1084.     dan_fd = fopen ("/tmp/schmoo","w");
  1085.     if ( dan_fd == NULL ) {perror("moo-open"); exit(-66);}
  1086.     tt = fwrite(oi,ois,ois,dan_fd);
  1087.     /* printf("%d\n",tt); */
  1088.     if ( tt < 0 ) {perror("moo-write"); exit(-66);}
  1089.     fclose(dan_fd);
  1090.     system( "xterm -e less /tmp/schmoo " ); 
  1091.     system( "rm -f /tmp/schmoo " ); 
  1092.      exit(-1); 
  1093.   }
  1094. }
  1095.  
  1096.  
  1097. /* DONE
  1098. * find_org_from_orgmap()
  1099. *
  1100. * NOTE: virtually identical to most of del_org_from_orgmap().
  1101. *
  1102. */
  1103.  
  1104. OrgMap *
  1105. find_org_from_orgmap( where )
  1106.   u_long    where;
  1107. {
  1108.   OrgMap    *orgmap;
  1109.  
  1110.   orgmap = GS.orgmap;
  1111.  
  1112.   if ( (long)(where / 2) < GS.memsize / 2 ) {
  1113.  
  1114.     while ( orgmap->next != (OrgMap *)NULL && orgmap->next->start <= where )
  1115.       orgmap = orgmap->next;
  1116.  
  1117.   } else {
  1118.  
  1119.     while ( orgmap->prev != (OrgMap *)NULL && orgmap->prev->start >= where )
  1120.       orgmap = orgmap->prev;
  1121.  
  1122.   }
  1123.  
  1124.   if ( orgmap != (OrgMap *)NULL )
  1125.     if ( orgmap->start > where || orgmap->start + orgmap->len <= where )
  1126.       orgmap = (OrgMap *)NULL;
  1127.  
  1128.   return orgmap;
  1129. }
  1130.  
  1131.  
  1132. XtActionProc
  1133. redraw_mem( w, event, params, pcount )
  1134.   Widget    w;
  1135.   XEvent    *event;
  1136.   String    *params;
  1137.   Cardinal    *pcount;
  1138. {
  1139.  
  1140.   expose_memory( 0, GS.mfwidth - 1, 0, GS.mfheight - 1 );
  1141.  
  1142. }
  1143.  
  1144.  
  1145.  
  1146.