Revision: 76646
          http://sourceforge.net/p/brlcad/code/76646
Author:   starseeker
Date:     2020-08-02 20:15:01 +0000 (Sun, 02 Aug 2020)
Log Message:
-----------
Now that we've gotten trunk into RELEASE so we can work on 7.32.0, merge the 
latest bioh changes to libged/libtclcad back into trunk.  Next steps are likely 
to be more invasive, so this seems to be a reasonable sync point.

Modified Paths:
--------------
    brlcad/trunk/include/bu/magic.h
    brlcad/trunk/include/dm/bview.h
    brlcad/trunk/include/ged/defines.h
    brlcad/trunk/include/ged/view.h
    brlcad/trunk/include/tclcad.h
    brlcad/trunk/src/libged/arb/rotate_arb_face.c
    brlcad/trunk/src/libged/bb/bb.c
    brlcad/trunk/src/libged/bigE/bigE.c
    brlcad/trunk/src/libged/bot/bot.cpp
    brlcad/trunk/src/libged/bot/bot_dump.c
    brlcad/trunk/src/libged/bot/check.cpp
    brlcad/trunk/src/libged/bot/edbot.c
    brlcad/trunk/src/libged/bot/extrude.cpp
    brlcad/trunk/src/libged/bot/remesh.cpp
    brlcad/trunk/src/libged/clone/clone.c
    brlcad/trunk/src/libged/comb/comb.c
    brlcad/trunk/src/libged/comb_std/comb_std.c
    brlcad/trunk/src/libged/copymat/copymat.c
    brlcad/trunk/src/libged/display_list.c
    brlcad/trunk/src/libged/draw/draw.c
    brlcad/trunk/src/libged/draw/preview.c
    brlcad/trunk/src/libged/edcodes/edcodes.c
    brlcad/trunk/src/libged/edit/edit.c
    brlcad/trunk/src/libged/edmater/edmater.c
    brlcad/trunk/src/libged/erase/erase.c
    brlcad/trunk/src/libged/facetize/facetize.cpp
    brlcad/trunk/src/libged/gdiff/gdiff.c
    brlcad/trunk/src/libged/ged.c
    brlcad/trunk/src/libged/ged_private.h
    brlcad/trunk/src/libged/ged_util.c
    brlcad/trunk/src/libged/get/get.c
    brlcad/trunk/src/libged/get_obj_bounds.c
    brlcad/trunk/src/libged/get_type/get_type.c
    brlcad/trunk/src/libged/include/plugin.h
    brlcad/trunk/src/libged/joint/joint.c
    brlcad/trunk/src/libged/kill/kill.c
    brlcad/trunk/src/libged/killrefs/killrefs.c
    brlcad/trunk/src/libged/killtree/killtree.c
    brlcad/trunk/src/libged/mater/mater.cpp
    brlcad/trunk/src/libged/metaball/metaball.c
    brlcad/trunk/src/libged/move_arb_edge/move_arb_edge.c
    brlcad/trunk/src/libged/move_arb_face/move_arb_face.c
    brlcad/trunk/src/libged/ocenter/ocenter.c
    brlcad/trunk/src/libged/orotate/orotate.c
    brlcad/trunk/src/libged/oscale/oscale.c
    brlcad/trunk/src/libged/otranslate/otranslate.c
    brlcad/trunk/src/libged/pipe/pipe.c
    brlcad/trunk/src/libged/pipe.c
    brlcad/trunk/src/libged/polyclip.cpp
    brlcad/trunk/src/libged/process/process.c
    brlcad/trunk/src/libged/protate/protate.c
    brlcad/trunk/src/libged/pscale/pscale.c
    brlcad/trunk/src/libged/pset/pset.c
    brlcad/trunk/src/libged/ptranslate/ptranslate.c
    brlcad/trunk/src/libged/put/put.c
    brlcad/trunk/src/libged/put_comb/put_comb.c
    brlcad/trunk/src/libged/remove/remove.c
    brlcad/trunk/src/libged/rmater/rmater.c
    brlcad/trunk/src/libged/rtabort/rtabort.c
    brlcad/trunk/src/libged/rtcheck/rtcheck.c
    brlcad/trunk/src/libged/rtwizard/rtwizard.c
    brlcad/trunk/src/libged/select/select.c
    brlcad/trunk/src/libged/set_transparency/set_transparency.c
    brlcad/trunk/src/libged/vdraw/vdraw.c
    brlcad/trunk/src/libged/view/data_lines.c
    brlcad/trunk/src/libged/wcodes/wcodes.c
    brlcad/trunk/src/libged/zap/zap.c
    brlcad/trunk/src/libtclcad/fb.c
    brlcad/trunk/src/libtclcad/tclcad_mouse.c
    brlcad/trunk/src/libtclcad/tclcad_obj.c
    brlcad/trunk/src/libtclcad/tclcad_obj_wrapper.c
    brlcad/trunk/src/libtclcad/tclcad_polygons.c
    brlcad/trunk/src/libtclcad/tclcad_private.h
    brlcad/trunk/src/libtclcad/view/arrows.c
    brlcad/trunk/src/libtclcad/view/autoview.c
    brlcad/trunk/src/libtclcad/view/axes.c
    brlcad/trunk/src/libtclcad/view/draw.c
    brlcad/trunk/src/libtclcad/view/faceplate.c
    brlcad/trunk/src/libtclcad/view/labels.c
    brlcad/trunk/src/libtclcad/view/lines.c
    brlcad/trunk/src/libtclcad/view/refresh.c
    brlcad/trunk/src/libtclcad/view/util.c
    brlcad/trunk/src/libtclcad/view/view.h
    brlcad/trunk/src/mged/chgview.c
    brlcad/trunk/src/mged/dodraw.c
    brlcad/trunk/src/mged/mged.c
    brlcad/trunk/src/mged/overlay.c
    brlcad/trunk/src/mged/setup.c
    brlcad/trunk/src/mged/utility1.c
    brlcad/trunk/src/mged/wdb_obj.c
    brlcad/trunk/src/shapes/coil.c

Added Paths:
-----------
    brlcad/trunk/src/libged/exec.cpp
    brlcad/trunk/src/libged/include/

Removed Paths:
-------------
    brlcad/trunk/src/libged/exec.cpp
    brlcad/trunk/src/libged/include/

Property Changed:
----------------
    brlcad/trunk/
    brlcad/trunk/NEWS
    brlcad/trunk/doc/
    brlcad/trunk/include/
    brlcad/trunk/regress/
    brlcad/trunk/src/libged/polyclip.cpp

Index: brlcad/trunk
===================================================================
--- brlcad/trunk        2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk        2020-08-02 20:15:01 UTC (rev 76646)

Property changes on: brlcad/trunk
___________________________________________________________________
Modified: svn:mergeinfo
## -1,5 +1,5 ##
 
/brlcad/branches/RELEASE:57439,57447-57860,69901-69913,70323-70333,71915-72242,72525-72534,72826-72858,74376-74454,74964-75140,75372-75685,76001-76451
-/brlcad/branches/bioh:75720-75736,75740-75742,75860-75891,75894-75986,76088-76153,76355-76365,76368-76376,76577
+/brlcad/branches/bioh:75720-75736,75740-75742,75860-75891,75894-75986,76088-76153,76354-76506,76577
 
/brlcad/branches/brep-debug:61373,61375,61404,61427,61429,61470,61544,61567,61576,61999,62018,62094,62098,62107,62117,62406,62416-62519,62521-62584,62593-62614,62623,62658,62660-62674,62681-62771,62876,62901,62907,62910,62925,62928,62931-63025,63027,63051,63054-63056,63069,63071-63073,63122,63160-63161,63165,63171,63184,63187,63189-63190,63193-63196,63200,63202,63205-63210,63213,63219-63225,63232-63233,63236,63238,63338,63350-63353,63481,63618,63669,64173-64174,64176-64177,64229-64233,64242,64244,64360-64362,65165,65245,65249,65334,65833-65834,66370-66375,66931-66932,66934,67012-67015,67018-67019,67021-67022,67406,67740,67746-67748,67950,67952,68144-68145,68636,68640-68643,68820,69081,69109,69168,69206,69289,69346,69460-69461,69582-69583,69719-69721,69857-69859,69927,69995-69996,70148-70149,70347-70349,70377,70526-70527,71006-71007,71009-71022,71046-71047,71049,71096-71100
 /brlcad/branches/bullet:62518
 /brlcad/branches/cmake:43219
Index: brlcad/trunk/NEWS
===================================================================
--- brlcad/trunk/NEWS   2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/NEWS   2020-08-02 20:15:01 UTC (rev 76646)

Property changes on: brlcad/trunk/NEWS
___________________________________________________________________
Modified: svn:mergeinfo
## -1,5 +1,5 ##
 
/brlcad/branches/RELEASE/NEWS:57439,57447-57860,68609-68613,69901-69913,70323-70333,71915-72242,72525-72534,72826-72858,74376-74454,74964-75140,76001-76451
-/brlcad/branches/bioh/NEWS:75894-75986,76088-76153
+/brlcad/branches/bioh/NEWS:75894-75986,76088-76153,76354-76506
 
/brlcad/branches/brep-debug/NEWS:61373,61375,61404,61427,61429,61470,61544,61567,61576,61999,62018,62094,62098,62107,62117,62406,62416-62519,62521-62584,62593-62614,62623,62658,62660-62674,62681-62771,62876,62901,62907,62910,62925,62928,62931-63025,63027,63051,63054-63056,63069,63071-63073,63122,63160-63161,63165,63171,63184,63187,63189-63190,63193-63196,63200,63202,63205-63210,63213,63219-63225,63232-63233,63236,63238,63338,63350-63353,63481,63618,63669,64173-64174,64176-64177,64229-64233,64242,64244,64360-64362,65165,65245,65249,65334,65833-65834,66370-66375,66931-66932,66934,67012-67015,67018-67019,67021-67022,67406,67740,67746-67748,67950,67952,68144-68145,68636,68640-68643,68820,69081,69109,69168,69206,69289,69346,69460-69461,69582-69583,69719-69721,69857-69859,69927,69995-69996,70148-70149,70347-70349,70377,70526-70527,71006-71007,71009-71022,71046-71047,71049,71096-71100
 /brlcad/branches/bullet/NEWS:62518
 /brlcad/branches/cmake/NEWS:43219
Index: brlcad/trunk/doc
===================================================================
--- brlcad/trunk/doc    2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/doc    2020-08-02 20:15:01 UTC (rev 76646)

Property changes on: brlcad/trunk/doc
___________________________________________________________________
Modified: svn:mergeinfo
## -1,5 +1,5 ##
 
/brlcad/branches/RELEASE/doc:57439,57447-57860,69901-69913,71917-72242,72525-72534,72826-72858,74376-74454,74964-75140
-/brlcad/branches/bioh/doc:75894-75986,76088-76153,76355-76365
+/brlcad/branches/bioh/doc:75894-75986,76088-76153,76354-76506
 
/brlcad/branches/brep-debug/doc:61373,61375,61404,61427,61429,61470,61544,61567,61576,61999,62018,62094,62098,62107,62117,62406,62416-62519,62521-62584,62593-62614,62623,62658,62660-62674,62681-62771,62876,62901,62907,62910,62925,62928,62931-63025,63027,63051,63054-63056,63069,63071-63073,63122,63160-63161,63165,63171,63184,63187,63189-63190,63193-63196,63200,63202,63205-63210,63213,63219-63225,63232-63233,63236,63238,63338,63350-63353,63481,63618,63669,64173-64174,64176-64177,64229-64233,64242,64244,64360-64362,65165,65245,65249,65334,65833-65834,66370-66375,66931-66932,66934,67012-67015,67018-67019,67021-67022,67406,67740,67746-67748,67950,67952,68144-68145,68636,68640-68643,68820,69081,69109,69206,69289,69346,69460-69461,69582-69583,69719-69721,69857-69859,69927
 /brlcad/branches/bullet/doc:62518
 /brlcad/branches/cmake/doc:43219
Index: brlcad/trunk/include
===================================================================
--- brlcad/trunk/include        2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/include        2020-08-02 20:15:01 UTC (rev 76646)

Property changes on: brlcad/trunk/include
___________________________________________________________________
Modified: svn:mergeinfo
## -1,5 +1,5 ##
 
/brlcad/branches/RELEASE/include:57439,57447-57860,69901-69913,71915-72242,72525-72534,72826-72858,74376-74454,74964-75140,75372-75681
-/brlcad/branches/bioh/include:75720-75736,75740-75742,75860-75891,75894-75986,76088-76153
+/brlcad/branches/bioh/include:75720-75736,75740-75742,75860-75891,75894-75986,76088-76153,76354-76506
 
/brlcad/branches/brep-debug/include:61373,61375,61404,61427,61429,61470,61544,61567,61576,61999,62018,62094,62098,62107,62117,62406,62416-62519,62521-62584,62593-62614,62623,62658,62660-62674,62681-62771,62876,62901,62907,62910,62925,62928,62931-63025,63027,63051,63054-63056,63069,63071-63073,63122,63160-63161,63165,63171,63184,63187,63189-63190,63193-63196,63200,63202,63205-63210,63213,63219-63225,63232-63233,63236,63238,63338,63350-63353,63481,63618,63669,64173-64174,64176-64177,64229-64233,64242,64244,64360-64362,65165,65245,65249,65334,65833-65834,66370-66375,66931-66932,66934,67012-67015,67018-67019,67021-67022,67406,67740,67746-67748,67950,67952,68144-68145,68636,68640-68643,68820,69081,69109,69206,69289,69346,69460-69461,69582-69583,69719-69721,69857-69859,69927
 /brlcad/branches/bullet/include:62518
 /brlcad/branches/cmake/include:43219
Modified: brlcad/trunk/include/bu/magic.h
===================================================================
--- brlcad/trunk/include/bu/magic.h     2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/include/bu/magic.h     2020-08-02 20:15:01 UTC (rev 76646)
@@ -209,6 +209,7 @@
 /* misc */
 
 #define ANIMATE_MAGIC                  0x414e4963 /**< ANIc */
+#define BVIEW_MAGIC                    0x62766965 /**< bvie */
 #define CURVE_BEZIER_MAGIC             0x62657a69 /**< bezi */
 #define CURVE_CARC_MAGIC               0x63617263 /**< carc */
 #define CURVE_LSEG_MAGIC               0x6c736567 /**< lseg */

Modified: brlcad/trunk/include/dm/bview.h
===================================================================
--- brlcad/trunk/include/dm/bview.h     2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/include/dm/bview.h     2020-08-02 20:15:01 UTC (rev 76646)
@@ -196,7 +196,8 @@
 };
 
 struct bview {
-    struct bu_list              l;
+    uint32_t                   magic;         /**< @brief magic number */
+    struct bu_vls               gv_name;
     fastf_t                     gv_scale;
     fastf_t                     gv_size;                /**< @brief  2.0 * 
scale */
     fastf_t                     gv_isize;               /**< @brief  1.0 / 
size */
@@ -251,11 +252,14 @@
     fastf_t                     gv_curve_scale;
     fastf_t                     gv_data_vZ;
     size_t                      gv_bot_threshold;
+    int                                gv_hidden;
+    void                        *dmp;  /* Display manager pointer, if one is 
associated with this view */
+    void                        *u_data; /* Caller data associated with this 
view */
     struct bu_ptbl *callbacks;
 };
 
 
-struct bview_client_data {
+struct bview_solid_data {
     struct display_list *gdlp;
     int draw_solid_lines_only;
     int wireframe_color_override;
@@ -266,37 +270,6 @@
     void *freesolid;
 };
 
-/**
- * A view object maintains state for controlling a view.
- */
-struct view_obj {
-    struct bu_list      l;
-    struct bu_vls       vo_name;                /**< @brief  view object 
name/cmd */
-    fastf_t             vo_scale;
-    fastf_t             vo_size;                /**< @brief  2.0 * scale */
-    fastf_t             vo_invSize;             /**< @brief  1.0 / size */
-    fastf_t             vo_perspective;         /**< @brief  perspective angle 
*/
-    fastf_t             vo_local2base;          /**< @brief  scale local units 
to base units (i.e. mm) */
-    fastf_t             vo_base2local;          /**< @brief  scale base units 
(i.e. mm) to local units */
-    vect_t              vo_aet;
-    vect_t              vo_eye_pos;             /**< @brief  eye position */
-    vect_t              vo_keypoint;
-    char                vo_coord;               /**< @brief  coordinate system 
*/
-    char                vo_rotate_about;        /**< @brief  indicates what 
point rotations are about */
-    mat_t               vo_rotation;
-    mat_t               vo_center;
-    mat_t               vo_model2view;
-    mat_t               vo_pmodel2view;
-    mat_t               vo_view2model;
-    mat_t               vo_pmat;                /**< @brief  perspective 
matrix */
-    struct bu_observer_list  vo_observers;
-    void                (*vo_callback)();       /**< @brief  called in 
vo_update with vo_clientData and vop */
-    void *              vo_clientData;          /**< @brief  passed to 
vo_callback */
-    int                 vo_zclip;
-    void               *interp;
-};
-#define VIEW_OBJ_NULL ((struct view_obj *)0)
-
 #endif /* DM_BVIEW_H */
 
 /** @} */

Modified: brlcad/trunk/include/ged/defines.h
===================================================================
--- brlcad/trunk/include/ged/defines.h  2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/include/ged/defines.h  2020-08-02 20:15:01 UTC (rev 76646)
@@ -35,6 +35,7 @@
 #include "bu/vls.h"
 #include "dm/bview.h"
 #include "rt/search.h"
+#include "rt/solid.h"
 
 __BEGIN_DECLS
 
@@ -73,16 +74,23 @@
 #define GED_DISPLAY_LIST_NULL ((struct display_list *)0)
 #define GED_DRAWABLE_NULL ((struct ged_drawable *)0)
 #define GED_VIEW_NULL ((struct bview *)0)
-#define GED_DM_VIEW_NULL ((struct ged_dm_view *)0)
 
 #define GED_RESULT_NULL ((void *)0)
 
+/* Forward declaration */
+struct ged;
+
+typedef int (*ged_func_ptr)(struct ged *, int, const char *[]);
 #define GED_FUNC_PTR_NULL ((ged_func_ptr)0)
-#define GED_REFRESH_CALLBACK_PTR_NULL ((ged_refresh_callback_ptr)0)
-#define GED_CREATE_VLIST_SOLID_CALLBACK_PTR_NULL 
((ged_create_vlist_solid_callback_ptr)0)
-#define GED_CREATE_VLIST_CALLBACK_PTR_NULL ((ged_create_vlist_callback_ptr)0)
-#define GED_FREE_VLIST_CALLBACK_PTR_NULL ((ged_free_vlist_callback_ptr)0)
 
+/* Callback related definitions */
+typedef void (*ged_io_func_t)(void *, int);
+typedef void (*ged_refresh_func_t)(void *);
+typedef void (*ged_create_vlist_solid_func_t)(struct solid *);
+typedef void (*ged_create_vlist_display_list_func_t)(struct display_list *);
+typedef void (*ged_destroy_vlist_func_t)(unsigned int, int);
+struct ged_callback_state;
+
 /**
  * Definition of global parallel-processing semaphores.
  *
@@ -116,10 +124,11 @@
 
 
 struct ged_subprocess {
-    struct bu_list l;
+    uint32_t magic;         /**< @brief magic number */
     struct bu_process *p;
     void *chan;
     int aborted;
+    struct ged *gedp;
 };
 
 /* FIXME: should be private */
@@ -145,11 +154,9 @@
 
 /* FIXME: should be private */
 struct ged_drawable {
-    struct bu_list             l;
-    struct bu_list             *gd_headDisplay;                /**< @brief  
head of display list */
+    struct bu_list             *gd_headDisplay;        /**< @brief  head of 
display list */
     struct bu_list             *gd_headVDraw;          /**< @brief  head of 
vdraw list */
     struct vd_curve            *gd_currVHead;          /**< @brief  current 
vdraw head */
-    struct solid                *gd_freeSolids;         /**< @brief  ptr to 
head of free solid list */
 
     char                       **gd_rt_cmd;    /* DEPRECATED - will be 
removed, do not use */
     int                                gd_rt_cmd_len;  /* DEPRECATED - will be 
removed, do not use */
@@ -172,8 +179,8 @@
 };
 
 
-typedef void (*ged_io_handler_callback_t)(void *, int);
 
+
 struct ged_cmd;
 
 /* struct details are private - use accessor functions to manipulate */
@@ -180,13 +187,19 @@
 struct ged_results;
 
 struct ged {
-    struct bu_list             l;
+    struct bu_vls               go_name;
     struct rt_wdb              *ged_wdbp;
 
+    // The full set of bviews associated with this ged object
+    struct bu_ptbl              ged_views;
+
+    void                        *u_data; /**< @brief User data associated with 
this ged instance */
+
     /** for catching log messages */
     struct bu_vls              *ged_log;
 
     struct solid                *freesolid;  /* For now this is a struct 
solid, but longer term that may not always be true */
+    struct bu_ptbl              free_solids; /**< @brief  solid structures 
available for reuse */
 
     /* @todo: add support for returning an array of objects, not just a
      * simple string.
@@ -205,22 +218,22 @@
     struct bview               *ged_gvp;
     struct bu_hash_tbl         *ged_selections; /**< @brief object name -> 
struct rt_object_selections */
 
-    void                       *ged_refresh_clientdata;        /**< @brief  
client data passed to refresh handler */
-    void                       (*ged_refresh_handler)(void *); /**< @brief  
function for handling refresh requests */
-    void                       (*ged_output_handler)(struct ged *, char *);    
/**< @brief  function for handling output */
     char                       *ged_output_script;             /**< @brief  
script for use by the outputHandler */
-    void                       (*ged_create_vlist_solid_callback)(struct solid 
*);     /**< @brief  function to call after creating a vlist to create display 
list for solid */
-    void                       (*ged_create_vlist_callback)(struct 
display_list *);    /**< @brief  function to call after all vlist created that 
loops through creating display list for each solid  */
-    void                       (*ged_free_vlist_callback)(unsigned int, int);  
/**< @brief  function to call after freeing a vlist */
 
-    /* FIXME -- this ugly hack needs to die.  the result string should be 
stored before the call. */
+
+    /* FIXME -- this ugly hack needs to die.  the result string should
+     * be stored before the call.
+     */
     int                        ged_internal_call;
 
-    /* Handler functions for I/O communication with asynchronous subprocess 
commands */
-    int io_mode;
-    void (*ged_create_io_handler)(void **chan, struct bu_process *p, int fd, 
int mode, void *data, ged_io_handler_callback_t callback);
-    void (*ged_delete_io_handler)(void *interp, void *chan, struct bu_process 
*p, int fd, void *data, ged_io_handler_callback_t callback);
 
+    /* TODO: hide all callback related symbols, callback typedefs
+     * (above), and eventually most if not all of the remaining fields
+     * into an _impl structure so callers are not tightly coupled to
+     * the ged structure.  access via public functions that have been
+     * given design consideration.
+     */
+
     /* FOR LIBGED INTERNAL USE */
     struct ged_cmd *cmds;
     int (*add)(struct ged *gedp, const struct ged_cmd *cmd);
@@ -227,21 +240,51 @@
     int (*del)(struct ged *gedp, const char *name);
     int (*run)(struct ged *gedp, int ac, char *av[]);
 
-    struct ged_subprocess      gd_headSubprocess; /**< @brief  head of forked 
processes */
+    struct bu_ptbl             ged_subp; /**< @brief  forked sub-processes */
 
+    /* Interface to LIBDM */
+    void *ged_dmp;
+
+
+    /* Callbacks */
+
+    struct ged_callback_state    *ged_cbs;
+    void                       (*ged_refresh_handler)(void *); /**< @brief  
function for handling refresh requests */
+    void                       *ged_refresh_clientdata;        /**< @brief  
client data passed to refresh handler */
+    void                       (*ged_output_handler)(struct ged *, char *);    
/**< @brief  function for handling output */
+    void                       (*ged_create_vlist_solid_callback)(struct solid 
*);     /**< @brief  function to call after creating a vlist to create display 
list for solid */
+    void                       
(*ged_create_vlist_display_list_callback)(struct display_list *);       /**< 
@brief  function to call after all vlist created that loops through creating 
display list for each solid  */
+    void                       (*ged_destroy_vlist_callback)(unsigned int, 
int);       /**< @brief  function to call after freeing a vlist */
+
+    /* Handler functions for I/O communication with asynchronous subprocess 
commands.  There
+     * are two opaque data structures at play here, with different scopes.  
One is the "data"
+     * pointer passed to ged_create_io_handler, which is used to store 
command-specific
+     * information internal to the library (the simplest thing to do is pass 
ged_subprocess
+     * in as the data pointer, but if that's not enough - see for example 
rtcheck - this
+     * mechanism allows for more elaborate measures.
+     *
+     * The second is ged_io_data, which is set in gedp by the calling 
application.  This is where
+     * information specific to the parent's I/O environment (which by 
definition the library
+     * can't know about as it is application specific) lives.  It should be 
assigned in the
+     * applications gedp before any calls to ged_create_io_handler are made.
+     * */
+    void (*ged_create_io_handler)(struct ged_subprocess *gp, int fd, 
ged_io_func_t callback, void *data);
+    void (*ged_delete_io_handler)(struct ged_subprocess *gp, int fd);
+    void *ged_io_data;  /**< brief caller supplied data */
+
+    // Other callbacks...
+    // Tcl command strings - these are libtclcad level callbacks that execute 
user supplied Tcl commands if set:
+    // gdv_callback, gdv_edit_motion_delta_callback, go_more_args_callback, 
go_rt_end_callback
+    //
+    // fbserv_obj: fbs_callback
+    // bview.h gv_callback (only used by MGED?)
+    // db_search_callback_t
+
     void *ged_interp; /* Temporary - do not rely on when designing new 
functionality */
     db_search_callback_t ged_interp_eval; /* FIXME: broke the rule written on 
the previous line */
 
-    /* Interface to LIBDM */
-    void *ged_dmp;
 };
 
-typedef int (*ged_func_ptr)(struct ged *, int, const char *[]);
-typedef void (*ged_refresh_callback_ptr)(void *);
-typedef void (*ged_create_vlist_solid_callback_ptr)(struct solid *);
-typedef void (*ged_create_vlist_callback_ptr)(struct display_list *);
-typedef void (*ged_free_vlist_callback_ptr)(unsigned int, int);
-
 /* accessor functions for ged_results - calling
  * applications should not work directly with the
  * internals of ged_results, which are not guaranteed

Modified: brlcad/trunk/include/ged/view.h
===================================================================
--- brlcad/trunk/include/ged/view.h     2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/include/ged/view.h     2020-08-02 20:15:01 UTC (rev 76646)
@@ -64,15 +64,10 @@
 /* defined in display_list.c */
 GED_EXPORT void dl_set_iflag(struct bu_list *hdlp, int iflag);
 GED_EXPORT extern void dl_color_soltab(struct bu_list *hdlp);
-GED_EXPORT extern void dl_erasePathFromDisplay(struct bu_list *hdlp,
-                                              struct db_i *dbip,
-                                              void (*callback)(unsigned int, 
int),
-                                              const char *path,
-                                              int allow_split,
-                                              struct solid *freesolid);
+GED_EXPORT extern void dl_erasePathFromDisplay(struct ged *gedp, const char 
*path, int allow_split);
 GED_EXPORT extern struct display_list *dl_addToDisplay(struct bu_list *hdlp, 
struct db_i *dbip, const char *name);
 
-GED_EXPORT extern int invent_solid(struct bu_list *hdlp, struct db_i *dbip, 
void (*callback_create)(struct solid *), void (*callback_free)(unsigned int, 
int), char *name, struct bu_list *vhead, long int rgb, int copy, fastf_t 
transparency, int dmode, struct solid *freesolid, int csoltab);
+GED_EXPORT extern int invent_solid(struct ged *gedp, char *name, struct 
bu_list *vhead, long int rgb, int copy, fastf_t transparency, int dmode, int 
csoltab);
 
 /* defined in ged.c */
 GED_EXPORT extern void ged_view_init(struct bview *gvp);
@@ -154,6 +149,8 @@
 GED_EXPORT extern int ged_polygons_overlap(struct ged *gedp, struct bg_polygon 
*polyA, struct bg_polygon *polyB);
 GED_EXPORT extern void ged_polygon_fill_segments(struct ged *gedp, struct 
bg_polygon *poly, vect2d_t vfilldir, fastf_t vfilldelta);
 
+GED_EXPORT extern struct bview * ged_find_view(struct ged *gedp, const char 
*key);
+
 // TODO - this (and probably the grid logic too) belong at the libdm level - 
they're operating
 // on the bview, rather than the ged level data...
 GED_EXPORT extern int ged_snap_to_lines(struct ged *gedp, fastf_t *vx, fastf_t 
*vy);

Modified: brlcad/trunk/include/tclcad.h
===================================================================
--- brlcad/trunk/include/tclcad.h       2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/include/tclcad.h       2020-08-02 20:15:01 UTC (rev 76646)
@@ -132,38 +132,40 @@
 DM_EXPORT extern int fbs_open(struct fbserv_obj *fbsp, int port);
 DM_EXPORT extern int fbs_close(struct fbserv_obj *fbsp);
 
+struct tclcad_ged_data {
+    struct ged         *gedp;
+    struct bu_vls      go_more_args_callback;
+    int                        go_more_args_callback_cnt;
 
-struct ged_dm_view {
-    struct bu_list             l;
-    struct bu_vls              gdv_callback;
-    struct bu_vls              gdv_edit_motion_delta_callback;
-    struct bu_vls              gdv_name;
-    struct bview               *gdv_view;
-    struct dm                  *gdv_dmp;
-    struct fbserv_obj          gdv_fbs;
-    struct ged_obj             *gdv_gop;
-    int                                gdv_hide_view;
-};
+    // These are view related, but appear to be intended as global across all
+    // views associated with the gedp - that is why they are here and not in
+    // tclcad_view_data.
+    struct bu_hash_tbl *go_edited_paths;
+    struct bu_vls      go_rt_end_callback;
+    int                 go_rt_end_callback_cnt;
+    int                        go_dlist_on;
+    int                        go_refresh_on;
 
-struct ged_obj {
-    struct ged         *go_gedp;
-    struct ged_dm_view go_head_views;
-    struct bu_vls      go_name;
-    struct bu_vls      go_more_args_callback;
-    struct bu_vls      go_rt_end_callback;
+    // TODO - these really shouldn't be libtclcad specific... we don't want to
+    // depend on Tcl for label primitives...
     struct bu_vls      *go_prim_label_list;
     int                        go_prim_label_list_size;
-    int                        go_refresh_on;
-    int                        go_dlist_on;
-    Tcl_Interp         *interp;
-    struct bu_hash_tbl *go_edited_paths;
 };
-#define GED_OBJ_NULL ((struct ged_obj *)0)
 
+// Data specific to an individual view rather than the geometry database
+// instance.
+struct tclcad_view_data {
+    struct ged         *gedp;
+    struct bu_vls      gdv_edit_motion_delta_callback;
+    int                 gdv_edit_motion_delta_callback_cnt;
+    struct bu_vls      gdv_callback;
+    int                        gdv_callback_cnt;
+    struct fbserv_obj  gdv_fbs;
+};
 
 struct tclcad_obj {
     struct bu_list     l;
-    struct ged_obj     *to_gop;
+    struct ged         *to_gedp;
     Tcl_Interp         *to_interp;
 };
 
@@ -349,108 +351,108 @@
 TCLCAD_EXPORT extern struct application *to_rt_gettrees_application(struct ged 
*gedp,
                                                                    int argc,
                                                                    const char 
*argv[]);
-TCLCAD_EXPORT extern void go_refresh(struct ged_obj *gop,
-                                    struct ged_dm_view *gdvp);
-TCLCAD_EXPORT extern void go_refresh_draw(struct ged_obj *gop,
-                                         struct ged_dm_view *gdvp,
+TCLCAD_EXPORT extern void go_refresh(struct ged *gedp,
+                                    struct bview *gdvp);
+TCLCAD_EXPORT extern void go_refresh_draw(struct ged *gedp,
+                                         struct bview *gdvp,
                                          int restore_zbuffer);
-TCLCAD_EXPORT extern int go_view_axes(struct ged_obj *gop,
-                                     struct ged_dm_view *gdvp,
+TCLCAD_EXPORT extern int go_view_axes(struct ged *gedp,
+                                     struct bview *gdvp,
                                      int argc,
                                      const char *argv[],
                                      const char *usage);
 TCLCAD_EXPORT extern int go_data_labels(Tcl_Interp *interp,
                                        struct ged *gedp,
-                                       struct ged_dm_view *gdvp,
+                                       struct bview *gdvp,
                                        int argc,
                                        const char *argv[],
                                        const char *usage);
 TCLCAD_EXPORT extern int go_data_arrows(Tcl_Interp *interp,
                                        struct ged *gedp,
-                                       struct ged_dm_view *gdvp,
+                                       struct bview *gdvp,
                                        int argc,
                                        const char *argv[],
                                        const char *usage);
 TCLCAD_EXPORT extern int go_data_pick(struct ged *gedp,
-                                     struct ged_dm_view *gdvp,
+                                     struct bview *gdvp,
                                      int argc,
                                      const char *argv[],
                                      const char *usage);
 TCLCAD_EXPORT extern int go_data_axes(Tcl_Interp *interp,
                                      struct ged *gedp,
-                                     struct ged_dm_view *gdvp,
+                                     struct bview *gdvp,
                                      int argc,
                                      const char *argv[],
                                      const char *usage);
 TCLCAD_EXPORT extern int go_data_lines(Tcl_Interp *interp,
                                       struct ged *gedp,
-                                      struct ged_dm_view *gdvp,
+                                      struct bview *gdvp,
                                       int argc,
                                       const char *argv[],
                                       const char *usage);
 TCLCAD_EXPORT extern int go_data_move(Tcl_Interp *interp,
                                      struct ged *gedp,
-                                     struct ged_dm_view *gdvp,
+                                     struct bview *gdvp,
                                      int argc,
                                      const char *argv[],
                                      const char *usage);
 TCLCAD_EXPORT extern int go_data_move_object_mode(Tcl_Interp *interp,
                                                  struct ged *gedp,
-                                                 struct ged_dm_view *gdvp,
+                                                 struct bview *gdvp,
                                                  int argc,
                                                  const char *argv[],
                                                  const char *usage);
 TCLCAD_EXPORT extern int go_data_move_point_mode(Tcl_Interp *interp,
                                                 struct ged *gedp,
-                                                struct ged_dm_view *gdvp,
+                                                struct bview *gdvp,
                                                 int argc,
                                                 const char *argv[],
                                                 const char *usage);
 TCLCAD_EXPORT extern int go_data_polygons(Tcl_Interp *interp,
                                          struct ged *gedp,
-                                         struct ged_dm_view *gdvp,
+                                         struct bview *gdvp,
                                          int argc,
                                          const char *argv[],
                                          const char *usage);
 TCLCAD_EXPORT extern int go_mouse_poly_circ(Tcl_Interp *interp,
                                            struct ged *gedp,
-                                           struct ged_dm_view *gdvp,
+                                           struct bview *gdvp,
                                            int argc,
                                            const char *argv[],
                                            const char *usage);
 TCLCAD_EXPORT extern int go_mouse_poly_cont(Tcl_Interp *interp,
                                            struct ged *gedp,
-                                           struct ged_dm_view *gdvp,
+                                           struct bview *gdvp,
                                            int argc,
                                            const char *argv[],
                                            const char *usage);
 TCLCAD_EXPORT extern int go_mouse_poly_ell(Tcl_Interp *interp,
                                           struct ged *gedp,
-                                          struct ged_dm_view *gdvp,
+                                          struct bview *gdvp,
                                           int argc,
                                           const char *argv[],
                                           const char *usage);
 TCLCAD_EXPORT extern int go_mouse_poly_rect(Tcl_Interp *interp,
                                            struct ged *gedp,
-                                           struct ged_dm_view *gdvp,
+                                           struct bview *gdvp,
                                            int argc,
                                            const char *argv[],
                                            const char *usage);
 TCLCAD_EXPORT extern int go_poly_circ_mode(Tcl_Interp *interp,
                                           struct ged *gedp,
-                                          struct ged_dm_view *gdvp,
+                                          struct bview *gdvp,
                                           int argc,
                                           const char *argv[],
                                           const char *usage);
 TCLCAD_EXPORT extern int go_poly_ell_mode(Tcl_Interp *interp,
                                          struct ged *gedp,
-                                         struct ged_dm_view *gdvp,
+                                         struct bview *gdvp,
                                          int argc,
                                          const char *argv[],
                                          const char *usage);
 TCLCAD_EXPORT extern int go_poly_rect_mode(Tcl_Interp *interp,
                                           struct ged *gedp,
-                                          struct ged_dm_view *gdvp,
+                                          struct bview *gdvp,
                                           int argc,
                                           const char *argv[],
                                           const char *usage);
@@ -459,13 +461,13 @@
                                          struct bu_vls *result_str);
 TCLCAD_EXPORT extern int go_poly_cont_build(Tcl_Interp *interp,
                                            struct ged *gedp,
-                                           struct ged_dm_view *gdvp,
+                                           struct bview *gdvp,
                                            int argc,
                                            const char *argv[],
                                            const char *usage);
 TCLCAD_EXPORT extern int go_poly_cont_build_end(Tcl_Interp *UNUSED(interp),
                                                struct ged *gedp,
-                                               struct ged_dm_view *gdvp,
+                                               struct bview *gdvp,
                                                int argc,
                                                const char *argv[],
                                                const char *usage);
@@ -512,16 +514,17 @@
 TCLCAD_EXPORT extern int tclcad_init(Tcl_Interp *interp, int init_gui, struct 
bu_vls *tlog);
 
 /**
- * Create Tcl specific I/O handlers
+ * Tcl specific I/O handlers
  */
+struct tclcad_io_data {
+    Tcl_Channel chan;
+    Tcl_Interp *interp;
+    int io_mode;
+};
 TCLCAD_EXPORT void
-tclcad_create_io_handler(void **chan, struct bu_process *p, int fd, int mode, 
void *data, ged_io_handler_callback_t callback);
-
-/**
- * Delete Tcl specific I/O handlers
- */
+tclcad_create_io_handler(struct ged_subprocess *p, int fd, ged_io_func_t 
callback, void *data);
 TCLCAD_EXPORT void
-tclcad_delete_io_handler(void *interp, void *chan, struct bu_process *p, int 
fd, void *data, ged_io_handler_callback_t callback);
+tclcad_delete_io_handler(struct ged_subprocess *p, int fd);
 
 
 /* dm_tcl.c */

Index: brlcad/trunk/regress
===================================================================
--- brlcad/trunk/regress        2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/regress        2020-08-02 20:15:01 UTC (rev 76646)

Property changes on: brlcad/trunk/regress
___________________________________________________________________
Modified: svn:mergeinfo
## -1,5 +1,5 ##
 
/brlcad/branches/RELEASE/regress:57439,57447-57860,69901-69913,71917-72242,72525-72534,72826-72858,74376-74454,75372-75681
-/brlcad/branches/bioh/regress:75860-75891,75894-75986,76088-76153,76355-76365,76368-76376
+/brlcad/branches/bioh/regress:75860-75891,75894-75986,76088-76153,76354-76506
 
/brlcad/branches/brep-debug/regress:61373,61375,61404,61427,61429,61470,61544,61567,61576,61999,62018,62094,62098,62107,62117,62406,62416-62519,62521-62584,62593-62614,62623,62658,62660-62674,62681-62771,62876,62901,62907,62910,62925,62928,62931-63025,63027,63051,63054-63056,63069,63071-63073,63122,63160-63161,63165,63171,63184,63187,63189-63190,63193-63196,63200,63202,63205-63210,63213,63219-63225,63232-63233,63236,63238,63338,63350-63353,63481,63618,63669,64173-64174,64176-64177,64229-64233,64242,64244,64360-64362,65165,65245,65249,65334,65833-65834,66370-66375,66931-66932,66934,67012-67015,67018-67019,67021-67022,67406,67740,67746-67748,67950,67952,68144-68145,68636,68640-68643,68820,69081,69109,69206,69289,69346,69460-69461,69582-69583,69719-69721,69857-69859,69927
 /brlcad/branches/bullet/regress:62518
 /brlcad/branches/cmake/regress:43219
Modified: brlcad/trunk/src/libged/arb/rotate_arb_face.c
===================================================================
--- brlcad/trunk/src/libged/arb/rotate_arb_face.c       2020-08-02 19:53:00 UTC 
(rev 76645)
+++ brlcad/trunk/src/libged/arb/rotate_arb_face.c       2020-08-02 20:15:01 UTC 
(rev 76646)
@@ -95,7 +95,7 @@
        return GED_ERROR;
     }
 
-    if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], 
gedp->ged_wdbp, mat) == GED_ERROR)
+    if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], 
gedp->ged_wdbp, mat) & GED_ERROR)
        return GED_ERROR;
 
     if (intern.idb_major_type != DB5_MAJORTYPE_BRLCAD ||

Modified: brlcad/trunk/src/libged/bb/bb.c
===================================================================
--- brlcad/trunk/src/libged/bb/bb.c     2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/src/libged/bb/bb.c     2020-08-02 20:15:01 UTC (rev 76646)
@@ -126,7 +126,7 @@
        VSETALL(rpp_min, INFINITY);
        VSETALL(rpp_max, -INFINITY);
        for (i = 0; i < argc; i++) {
-           if (ged_get_obj_bounds(gedp, argc - i, (const char **)argv+i, 
use_air, obj_min, obj_max) == GED_ERROR)
+           if (ged_get_obj_bounds(gedp, argc - i, (const char **)argv+i, 
use_air, obj_min, obj_max) & GED_ERROR)
                return GED_ERROR;
            VMINMAX(rpp_min, rpp_max, (double *)obj_min);
            VMINMAX(rpp_min, rpp_max, (double *)obj_max);

Modified: brlcad/trunk/src/libged/bigE/bigE.c
===================================================================
--- brlcad/trunk/src/libged/bigE/bigE.c 2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/src/libged/bigE/bigE.c 2020-08-02 20:15:01 UTC (rev 76646)
@@ -2053,7 +2053,7 @@
 
     av[1] = (char *)0;
     for (i = 0; i < argc; ++i) {
-       dl_erasePathFromDisplay(gedp->ged_gdp->gd_headDisplay, 
gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, argv[i], 0, 
gedp->freesolid);
+       dl_erasePathFromDisplay(gedp, argv[i], 0);
        dgcdp->gdlp = dl_addToDisplay(gedp->ged_gdp->gd_headDisplay, 
gedp->ged_wdbp->dbip, argv[i]);
 
        BU_ALLOC(dgcdp->ap, struct application);

Modified: brlcad/trunk/src/libged/bot/bot.cpp
===================================================================
--- brlcad/trunk/src/libged/bot/bot.cpp 2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/src/libged/bot/bot.cpp 2020-08-02 20:15:01 UTC (rev 76646)
@@ -115,7 +115,7 @@
        return GED_ERROR;
     }
 
-    if (_bot_obj_setup(gb, argv[1]) == GED_ERROR) {
+    if (_bot_obj_setup(gb, argv[1]) & GED_ERROR) {
        return GED_ERROR;
     }
 

Modified: brlcad/trunk/src/libged/bot/bot_dump.c
===================================================================
--- brlcad/trunk/src/libged/bot/bot_dump.c      2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/bot/bot_dump.c      2020-08-02 20:15:01 UTC (rev 
76646)
@@ -891,7 +891,7 @@
 
     using_dbot_dump = 0;
 
-    if (bot_dump_get_args(gedp, argc, argv) == GED_ERROR)
+    if (bot_dump_get_args(gedp, argc, argv) & GED_ERROR)
        return GED_ERROR;
 
     if (bu_optind > argc) {

Modified: brlcad/trunk/src/libged/bot/check.cpp
===================================================================
--- brlcad/trunk/src/libged/bot/check.cpp       2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/bot/check.cpp       2020-08-02 20:15:01 UTC (rev 
76646)
@@ -711,7 +711,7 @@
        return GED_OK;
     }
 
-    if (_bot_obj_setup(gb, argv[argc-1]) == GED_ERROR) {
+    if (_bot_obj_setup(gb, argv[argc-1]) & GED_ERROR) {
        return GED_ERROR;
     }
     argc--;

Modified: brlcad/trunk/src/libged/bot/edbot.c
===================================================================
--- brlcad/trunk/src/libged/bot/edbot.c 2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/src/libged/bot/edbot.c 2020-08-02 20:15:01 UTC (rev 76646)
@@ -89,7 +89,7 @@
        return GED_ERROR;
     }
 
-    if (wdb_import_from_path2(gedp->ged_result_str, &intern, last, 
gedp->ged_wdbp, mat) == GED_ERROR) {
+    if (wdb_import_from_path2(gedp->ged_result_str, &intern, last, 
gedp->ged_wdbp, mat) & GED_ERROR) {
        bu_vls_printf(gedp->ged_result_str, "%s: failed to find %s", argv[0], 
argv[1]);
        return GED_ERROR;
     }

Modified: brlcad/trunk/src/libged/bot/extrude.cpp
===================================================================
--- brlcad/trunk/src/libged/bot/extrude.cpp     2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/bot/extrude.cpp     2020-08-02 20:15:01 UTC (rev 
76646)
@@ -100,7 +100,7 @@
 
     argc--; argv++;
 
-    if (_bot_obj_setup(gb, argv[0]) == GED_ERROR) {
+    if (_bot_obj_setup(gb, argv[0]) & GED_ERROR) {
        return GED_ERROR;
     }
 

Modified: brlcad/trunk/src/libged/bot/remesh.cpp
===================================================================
--- brlcad/trunk/src/libged/bot/remesh.cpp      2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/bot/remesh.cpp      2020-08-02 20:15:01 UTC (rev 
76646)
@@ -179,7 +179,7 @@
 
     argc--; argv++;
 
-    if (_bot_obj_setup(gb, argv[0]) == GED_ERROR) {
+    if (_bot_obj_setup(gb, argv[0]) & GED_ERROR) {
        return GED_ERROR;
     }
 

Modified: brlcad/trunk/src/libged/clone/clone.c
===================================================================
--- brlcad/trunk/src/libged/clone/clone.c       2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/clone/clone.c       2020-08-02 20:15:01 UTC (rev 
76646)
@@ -1006,7 +1006,7 @@
     }
 
     /* validate user options */
-    if (get_args(gedp, argc, (char **)argv, &state) == GED_ERROR)
+    if (get_args(gedp, argc, (char **)argv, &state) & GED_ERROR)
        return GED_ERROR;
 
     bu_vls_init(&state.olist);

Modified: brlcad/trunk/src/libged/comb/comb.c
===================================================================
--- brlcad/trunk/src/libged/comb/comb.c 2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/src/libged/comb/comb.c 2020-08-02 20:15:01 UTC (rev 76646)
@@ -169,7 +169,7 @@
        bu_vls_free(&orig_name);
        return GED_ERROR;
     }
-    if (region_flag_clear(gedp, new_dp) == GED_ERROR) {
+    if (region_flag_clear(gedp, new_dp) & GED_ERROR) {
        bu_vls_free(&comb_child_name);
        bu_vls_free(&orig_name);
        return GED_ERROR;

Modified: brlcad/trunk/src/libged/comb_std/comb_std.c
===================================================================
--- brlcad/trunk/src/libged/comb_std/comb_std.c 2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/comb_std/comb_std.c 2020-08-02 20:15:01 UTC (rev 
76646)
@@ -561,7 +561,7 @@
 
            if (last_tok == TOK_RPAREN) {
                /* next token MUST be an operator */
-               if (add_operator(gedp, &tok_hd.l, ptr, &last_tok) == GED_ERROR) 
{
+               if (add_operator(gedp, &tok_hd.l, ptr, &last_tok) & GED_ERROR) {
                    free_tokens(&tok_hd.l);
                    return GED_ERROR;
                }

Modified: brlcad/trunk/src/libged/copymat/copymat.c
===================================================================
--- brlcad/trunk/src/libged/copymat/copymat.c   2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/copymat/copymat.c   2020-08-02 20:15:01 UTC (rev 
76646)
@@ -150,7 +150,7 @@
 wrapup:
 
     bu_vls_free(&pvls);
-    if (status == GED_ERROR)
+    if (status & GED_ERROR)
        rt_db_free_internal(&intern);
     return status;
 }

Modified: brlcad/trunk/src/libged/display_list.c
===================================================================
--- brlcad/trunk/src/libged/display_list.c      2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/display_list.c      2020-08-02 20:15:01 UTC (rev 
76646)
@@ -34,6 +34,7 @@
 #include "bn/plot3.h"
 
 #include "rt/solid.h"
+#include "ged.h"
 #include "./ged_private.h"
 
 /* defined in draw_calc.cpp */
@@ -203,10 +204,11 @@
  *
  */
 void
-dl_erasePathFromDisplay(struct bu_list *hdlp,
-       struct db_i *dbip, void (*callback)(unsigned int, int),
-               const char *path, int allow_split, struct solid *freesolid)
+dl_erasePathFromDisplay(struct ged *gedp, const char *path, int allow_split)
 {
+    struct bu_list *hdlp = gedp->ged_gdp->gd_headDisplay;
+    struct db_i *dbip = gedp->ged_wdbp->dbip;
+    struct solid *freesolid = gedp->freesolid;
     struct display_list *gdlp;
     struct display_list *next_gdlp;
     struct display_list *last_gdlp;
@@ -226,11 +228,11 @@
        next_gdlp = BU_LIST_PNEXT(display_list, gdlp);
 
        if (BU_STR_EQUAL(path, bu_vls_addr(&gdlp->dl_path))) {
-           if (callback != GED_FREE_VLIST_CALLBACK_PTR_NULL) {
+           if (gedp->ged_destroy_vlist_callback != 
GED_DESTROY_VLIST_FUNC_NULL) {
 
                /* We can't assume the display lists are contiguous */
                FOR_ALL_SOLIDS(sp, &gdlp->dl_headSolid) {
-                   (*callback)(BU_LIST_FIRST(solid, 
&gdlp->dl_headSolid)->s_dlist, 1);
+                   ged_destroy_vlist_cb(gedp, BU_LIST_FIRST(solid, 
&gdlp->dl_headSolid)->s_dlist, 1);
                }
            }
 
@@ -262,8 +264,7 @@
                nsp = BU_LIST_PNEXT(solid, sp);
 
                if (db_full_path_match_top(&subpath, &sp->s_fullpath)) {
-                   if (callback != GED_FREE_VLIST_CALLBACK_PTR_NULL)
-                       (*callback)(sp->s_dlist, 1);
+                   ged_destroy_vlist_cb(gedp, sp->s_dlist, 1);
 
                    BU_LIST_DEQUEUE(&sp->l);
                    FREE_SOLID(sp, &freesolid->l);
@@ -302,21 +303,19 @@
 
 
 HIDDEN void
-eraseAllSubpathsFromSolidList(struct display_list *gdlp,
+eraseAllSubpathsFromSolidList(struct ged *gedp, struct display_list *gdlp,
                              struct db_full_path *subpath,
-                             void (*callback)(unsigned int, int),
-                             const int skip_first, struct solid *freesolid)
+                             const int skip_first)
 {
     struct solid *sp;
     struct solid *nsp;
+    struct solid *freesolid = gedp->freesolid;
 
     sp = BU_LIST_NEXT(solid, &gdlp->dl_headSolid);
     while (BU_LIST_NOT_HEAD(sp, &gdlp->dl_headSolid)) {
        nsp = BU_LIST_PNEXT(solid, sp);
        if (db_full_path_subset(&sp->s_fullpath, subpath, skip_first)) {
-           if (callback != GED_FREE_VLIST_CALLBACK_PTR_NULL)
-               (*callback)(sp->s_dlist, 1);
-
+           ged_destroy_vlist_cb(gedp, sp->s_dlist, 1);
            BU_LIST_DEQUEUE(&sp->l);
            FREE_SOLID(sp, &freesolid->l);
        }
@@ -333,9 +332,10 @@
  *
  */
 void
-_dl_eraseAllNamesFromDisplay(struct bu_list *hdlp, struct db_i *dbip,
-               void (*callback)(unsigned int, int), const char *name, const 
int skip_first, struct solid *freesolid)
+_dl_eraseAllNamesFromDisplay(struct ged *gedp,  const char *name, const int 
skip_first)
 {
+    struct bu_list *hdlp = gedp->ged_gdp->gd_headDisplay;
+    struct db_i *dbip = gedp->ged_wdbp->dbip;
     struct display_list *gdlp;
     struct display_list *next_gdlp;
 
@@ -361,7 +361,7 @@
            }
 
            if (BU_STR_EQUAL(tok, name)) {
-               _dl_freeDisplayListItem(dbip, callback, gdlp, freesolid);
+               _dl_freeDisplayListItem(gedp, gdlp);
                found = 1;
 
                break;
@@ -375,7 +375,7 @@
            struct db_full_path subpath;
 
            if (db_string_to_path(&subpath, dbip, name) == 0) {
-               eraseAllSubpathsFromSolidList(gdlp, &subpath, callback, 
skip_first, freesolid);
+               eraseAllSubpathsFromSolidList(gedp, gdlp, &subpath, skip_first);
                db_free_full_path(&subpath);
            }
        }
@@ -387,12 +387,14 @@
 
 
 int
-_dl_eraseFirstSubpath(struct bu_list *hdlp, struct db_i *dbip,
-                              void (*callback)(unsigned int, int),
+_dl_eraseFirstSubpath(struct ged *gedp,
                       struct display_list *gdlp,
                       struct db_full_path *subpath,
-                      const int skip_first, struct solid *freesolid)
+                      const int skip_first)
 {
+    struct bu_list *hdlp = gedp->ged_gdp->gd_headDisplay;
+    struct db_i *dbip = gedp->ged_wdbp->dbip;
+    struct solid *freesolid = gedp->freesolid;
     struct solid *sp;
     struct solid *nsp;
     struct db_full_path dup_path;
@@ -406,8 +408,7 @@
            int ret;
            int full_len = sp->s_fullpath.fp_len;
 
-           if (callback != GED_FREE_VLIST_CALLBACK_PTR_NULL)
-               (*callback)(sp->s_dlist, 1);
+           ged_destroy_vlist_cb(gedp, sp->s_dlist, 1);
 
            sp->s_fullpath.fp_len = full_len - 1;
            db_dup_full_path(&dup_path, &sp->s_fullpath);
@@ -438,15 +439,13 @@
  * Erase/remove display list item from headDisplay if path is a subset of 
item's path.
  */
 void
-_dl_eraseAllPathsFromDisplay(struct bu_list *hdlp, struct db_i *dbip,
-                                     void (*callback)(unsigned int, int),
-                             const char *path,
-                             const int skip_first,
-                             struct solid *freesolid)
+_dl_eraseAllPathsFromDisplay(struct ged *gedp, const char *path, const int 
skip_first)
 {
     struct display_list *gdlp;
     struct display_list *next_gdlp;
     struct db_full_path fullpath, subpath;
+    struct bu_list *hdlp = gedp->ged_gdp->gd_headDisplay;
+    struct db_i *dbip = gedp->ged_wdbp->dbip;
 
     if (db_string_to_path(&subpath, dbip, path) == 0) {
        gdlp = BU_LIST_NEXT(display_list, hdlp);
@@ -470,8 +469,8 @@
 
            if (db_string_to_path(&fullpath, dbip, bu_vls_addr(&gdlp->dl_path)) 
== 0) {
                if (db_full_path_subset(&fullpath, &subpath, skip_first)) {
-                   _dl_freeDisplayListItem(dbip, callback, gdlp, freesolid);
-               } else if (_dl_eraseFirstSubpath(hdlp, dbip, callback, gdlp, 
&subpath, skip_first, freesolid)) {
+                   _dl_freeDisplayListItem(gedp, gdlp);
+               } else if (_dl_eraseFirstSubpath(gedp, gdlp, &subpath, 
skip_first)) {
                    gdlp = BU_LIST_NEXT(display_list, hdlp);
                    db_free_full_path(&fullpath);
                    continue;
@@ -489,18 +488,18 @@
 
 
 void
-_dl_freeDisplayListItem (struct db_i *dbip,
-               void (*callback)(unsigned int, int),
-       struct display_list *gdlp, struct solid *freesolid)
+_dl_freeDisplayListItem (struct ged *gedp, struct display_list *gdlp)
 {
+    struct db_i *dbip = gedp->ged_wdbp->dbip;
+    struct solid *freesolid = gedp->freesolid;
     struct solid *sp;
     struct directory *dp;
 
-    if (callback != GED_FREE_VLIST_CALLBACK_PTR_NULL) {
+    if (gedp->ged_destroy_vlist_callback != GED_DESTROY_VLIST_FUNC_NULL) {
 
        /* We can't assume the display lists are contiguous */
        FOR_ALL_SOLIDS(sp, &gdlp->dl_headSolid) {
-           (*callback)(BU_LIST_FIRST(solid, &gdlp->dl_headSolid)->s_dlist, 1);
+           ged_destroy_vlist_cb(gedp, BU_LIST_FIRST(solid, 
&gdlp->dl_headSolid)->s_dlist, 1);
        }
     }
 
@@ -668,10 +667,10 @@
 }
 
 void
-dl_add_path(struct display_list *gdlp, int dashflag, fastf_t transparency, int 
dmode, int hiddenLine, struct bu_list *vhead, const struct db_full_path *pathp, 
struct db_tree_state *tsp, unsigned char *wireframe_color_override, void 
(*callback)(struct solid *sp), struct solid *freesolid)
+dl_add_path(int dashflag, struct bu_list *vhead, const struct db_full_path 
*pathp, struct db_tree_state *tsp, unsigned char *wireframe_color_override, 
struct _ged_client_data *dgcdp)
 {
     struct solid *sp;
-    GET_SOLID(sp, &freesolid->l);
+    GET_SOLID(sp, &dgcdp->freesolid->l);
 
     solid_append_vlist(sp, (struct bn_vlist *)vhead);
 
@@ -691,23 +690,19 @@
     solid_set_color_info(sp, wireframe_color_override, tsp);
 
     sp->s_dlist = 0;
-    sp->s_transparency = transparency;
-    sp->s_dmode = dmode;
-    sp->s_hiddenLine = hiddenLine;
+    sp->s_transparency = dgcdp->transparency;
+    sp->s_dmode = dgcdp->dmode;
+    sp->s_hiddenLine = dgcdp->hiddenLine;
 
     /* append solid to display list */
     bu_semaphore_acquire(RT_SEM_MODEL);
-    BU_LIST_APPEND(gdlp->dl_headSolid.back, &sp->l);
+    BU_LIST_APPEND(dgcdp->gdlp->dl_headSolid.back, &sp->l);
     bu_semaphore_release(RT_SEM_MODEL);
 
-    if (callback != GED_CREATE_VLIST_SOLID_CALLBACK_PTR_NULL) {
-       (*callback)(sp);
-    }
+    ged_create_vlist_solid_cb(dgcdp->gedp, sp);
 
 }
 
-
-
 static fastf_t
 view_avg_size(struct bview *gvp)
 {
@@ -932,8 +927,11 @@
 
 
 int
-dl_redraw(struct display_list *gdlp, struct db_i *dbip, struct db_tree_state 
*tsp, struct bview *gvp, void (*callback)(struct display_list *), int 
skip_subtractions)
+dl_redraw(struct display_list *gdlp, struct ged *gedp, int skip_subtractions)
 {
+    struct db_i *dbip = gedp->ged_wdbp->dbip;
+    struct db_tree_state *tsp = &gedp->ged_wdbp->wdb_initial_tree_state;
+    struct bview *gvp = gedp->ged_gvp;
     int ret = 0;
     struct solid *sp;
     for (BU_LIST_FOR(sp, solid, &gdlp->dl_headSolid)) {
@@ -941,8 +939,7 @@
            ret += redraw_solid(sp, dbip, tsp, gvp);
        }
     }
-    if (callback != GED_CREATE_VLIST_CALLBACK_PTR_NULL)
-       (*callback)(gdlp);
+    ged_create_vlist_display_list_cb(gedp, gdlp);
     return ret;
 }
 
@@ -956,7 +953,7 @@
     point_t min, max;
     struct solid *sp;
     union tree *curtree;
-    struct bview_client_data *bview_data = (struct bview_client_data 
*)client_data;
+    struct bview_solid_data *bview_data = (struct bview_solid_data 
*)client_data;
 
     RT_CK_DB_INTERNAL(ip);
     BG_CK_TESS_TOL(tsp->ts_ttol);
@@ -1124,11 +1121,12 @@
     sp->s_vlen = bn_vlist_cmd_cnt((struct bn_vlist *)(&(sp->s_vlist)));
 }
 
-int invent_solid(struct bu_list *hdlp, struct db_i *dbip,
-               void (*callback_create)(struct solid *), void 
(*callback_free)(unsigned int, int),
-               char *name, struct bu_list *vhead, long int rgb, int copy, 
fastf_t transparency, int dmode,
-               struct solid *freesolid, int csoltab)
+int invent_solid(struct ged *gedp, char *name, struct bu_list *vhead, long int 
rgb, int copy,
+               fastf_t transparency, int dmode, int csoltab)
 {
+    struct bu_list *hdlp = gedp->ged_gdp->gd_headDisplay;
+    struct db_i *dbip = gedp->ged_wdbp->dbip;
+    struct solid *freesolid = gedp->freesolid;
     struct directory *dp;
     struct solid *sp;
     struct display_list *gdlp;
@@ -1147,7 +1145,7 @@
         * Name exists from some other overlay,
         * zap any associated solids
         */
-       dl_erasePathFromDisplay(hdlp, dbip, callback_free, name, 0, freesolid);
+       dl_erasePathFromDisplay(gedp, name, 0);
     }
     /* Need to enter phony name in directory structure */
     dp = db_diradd(dbip, name, RT_DIR_PHONY_ADDR, 0, RT_DIR_SOLID, (void 
*)&type);
@@ -1191,8 +1189,7 @@
     if (csoltab)
        color_soltab(sp);
 
-    if (callback_create != GED_CREATE_VLIST_SOLID_CALLBACK_PTR_NULL)
-       (*callback_create)(sp);
+    ged_create_vlist_solid_cb(gedp, sp);
 
     return 0;           /* OK */
 
@@ -1279,8 +1276,10 @@
 }
 
 void
-dl_zap(struct bu_list *hdlp, struct db_i *dbip, void (*callback)(unsigned int, 
int), struct solid *freesolid)
+dl_zap(struct ged *gedp, struct solid *freesolid)
 {
+    struct bu_list *hdlp = gedp->ged_gdp->gd_headDisplay;
+    struct db_i *dbip = gedp->ged_wdbp->dbip;
     struct solid *sp = SOLID_NULL;
     struct display_list *gdlp = NULL;
     struct bu_ptbl dls = BU_PTBL_INIT_ZERO;
@@ -1289,8 +1288,8 @@
 
     while (BU_LIST_WHILE(gdlp, display_list, hdlp)) {
 
-       if (callback != GED_FREE_VLIST_CALLBACK_PTR_NULL && 
BU_LIST_NON_EMPTY(&gdlp->dl_headSolid))
-           (*callback)(BU_LIST_FIRST(solid, &gdlp->dl_headSolid)->s_dlist,
+       if (BU_LIST_NON_EMPTY(&gdlp->dl_headSolid))
+           ged_destroy_vlist_cb(gedp, BU_LIST_FIRST(solid, 
&gdlp->dl_headSolid)->s_dlist,
                    BU_LIST_LAST(solid, &gdlp->dl_headSolid)->s_dlist -
                    BU_LIST_FIRST(solid, &gdlp->dl_headSolid)->s_dlist + 1);
 
@@ -2452,8 +2451,9 @@
 
 
 void
-dl_set_transparency(struct bu_list *hdlp, struct directory **dpp, double 
transparency, void (*callback)(struct display_list *))
+dl_set_transparency(struct ged *gedp, struct directory **dpp, double 
transparency)
 {
+    struct bu_list *hdlp = gedp->ged_gdp->gd_headDisplay;
     struct display_list *gdlp;
     struct display_list *next_gdlp;
     struct solid *sp;
@@ -2480,8 +2480,7 @@
 
        }
 
-       if (callback != GED_CREATE_VLIST_CALLBACK_PTR_NULL)
-           (*callback)(gdlp);
+       ged_create_vlist_display_list_cb(gedp, gdlp);
 
         gdlp = next_gdlp;
     }

Modified: brlcad/trunk/src/libged/draw/draw.c
===================================================================
--- brlcad/trunk/src/libged/draw/draw.c 2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/src/libged/draw/draw.c 2020-08-02 20:15:01 UTC (rev 76646)
@@ -848,7 +848,7 @@
 
                /* create solids */
                for (i = 0; i < argc; ++i) {
-                   struct bview_client_data bview_data;
+                   struct bview_solid_data bview_data;
                    bview_data.draw_solid_lines_only = 
dgcdp.draw_solid_lines_only;
                    bview_data.wireframe_color_override = 
dgcdp.wireframe_color_override;
                    bview_data.wireframe_color[0]= dgcdp.wireframe_color[0];
@@ -903,7 +903,7 @@
                        continue;
                    }
 
-                   ret = dl_redraw(gdlp, gedp->ged_wdbp->dbip, 
&gedp->ged_wdbp->wdb_initial_tree_state, gedp->ged_gvp, 
gedp->ged_create_vlist_callback, dgcdp.draw_non_subtract_only);
+                   ret = dl_redraw(gdlp, gedp, dgcdp.draw_non_subtract_only);
                    if (ret < 0) {
                        /* restore view bot threshold */
                        if (gedp && gedp->ged_gvp) 
gedp->ged_gvp->gv_bot_threshold = threshold_cached;
@@ -1134,7 +1134,7 @@
                continue;
            }
 
-           dl_erasePathFromDisplay(gedp->ged_gdp->gd_headDisplay, 
gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, new_argv[i], 0, 
gedp->freesolid);
+           dl_erasePathFromDisplay(gedp, new_argv[i], 0);
        }
 
        drawtrees_retval = _ged_drawtrees(gedp, new_argc, (const char 
**)new_argv, kind, (struct _ged_client_data *)0);
@@ -1168,7 +1168,7 @@
                continue;
            }
 
-           dl_erasePathFromDisplay(gedp->ged_gdp->gd_headDisplay, 
gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, argv[i], 0, 
gedp->freesolid);
+           dl_erasePathFromDisplay(gedp, argv[i], 0);
        }
 
        /* if our display is non-empty add -R to keep current view */
@@ -1246,7 +1246,7 @@
        /* redraw everything */
        for (BU_LIST_FOR(gdlp, display_list, gedp->ged_gdp->gd_headDisplay))
        {
-           ret = dl_redraw(gdlp, gedp->ged_wdbp->dbip, 
&gedp->ged_wdbp->wdb_initial_tree_state, gedp->ged_gvp, 
gedp->ged_create_vlist_callback, 0);
+           ret = dl_redraw(gdlp, gedp, 0);
            if (ret < 0) {
                bu_vls_printf(gedp->ged_result_str, "%s: redraw failure\n", 
argv[0]);
                return GED_ERROR;
@@ -1282,7 +1282,7 @@
                    found_path = 1;
                    db_free_full_path(&dl_path);
 
-                   ret = dl_redraw(gdlp, gedp->ged_wdbp->dbip, 
&gedp->ged_wdbp->wdb_initial_tree_state, gedp->ged_gvp, 
gedp->ged_create_vlist_callback, 0);
+                   ret = dl_redraw(gdlp, gedp, 0);
                    if (ret < 0) {
                        bu_vls_printf(gedp->ged_result_str,
                                "%s: %s redraw failure\n", argv[0], argv[i]);

Modified: brlcad/trunk/src/libged/draw/preview.c
===================================================================
--- brlcad/trunk/src/libged/draw/preview.c      2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/draw/preview.c      2020-08-02 20:15:01 UTC (rev 
76646)
@@ -146,8 +146,7 @@
        _ged_drawtrees(_ged_current_gedp, 
_ged_current_gedp->ged_gdp->gd_rt_cmd_len, (const char 
**)&_ged_current_gedp->ged_gdp->gd_rt_cmd[1], preview_mode, (struct 
_ged_client_data *)0);
     }
 
-    if (_ged_current_gedp->ged_refresh_handler != 
GED_REFRESH_CALLBACK_PTR_NULL)
-       
(*_ged_current_gedp->ged_refresh_handler)(_ged_current_gedp->ged_refresh_clientdata);
+    ged_refresh_cb(_ged_current_gedp);
 
     if (preview_delay > 0) {
        struct timeval tv;

Modified: brlcad/trunk/src/libged/edcodes/edcodes.c
===================================================================
--- brlcad/trunk/src/libged/edcodes/edcodes.c   2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/edcodes/edcodes.c   2020-08-02 20:15:01 UTC (rev 
76646)
@@ -227,7 +227,7 @@
 
     (void)fclose(fp);
 
-    if (ged_wcodes(gedp, argc + 1, (const char **)av) == GED_ERROR) {
+    if (ged_wcodes(gedp, argc + 1, (const char **)av) & GED_ERROR) {
        bu_file_delete(tmpfil);
        bu_free((void *)av, "ged_edcodes_core av");
        return GED_ERROR;

Modified: brlcad/trunk/src/libged/edit/edit.c
===================================================================
--- brlcad/trunk/src/libged/edit/edit.c 2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/src/libged/edit/edit.c 2020-08-02 20:15:01 UTC (rev 76646)
@@ -778,7 +778,7 @@
     point_t rpp_max;
     size_t i;
 
-    if (ged_path_validate(gedp, path) == GED_ERROR) {
+    if (ged_path_validate(gedp, path) & GED_ERROR) {
        bu_vls_printf(gedp->ged_result_str, "path \"%s\" does not exist in"
                      "the database", db_path_to_string(path));
        return GED_ERROR;

Modified: brlcad/trunk/src/libged/edmater/edmater.c
===================================================================
--- brlcad/trunk/src/libged/edmater/edmater.c   2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/edmater/edmater.c   2020-08-02 20:15:01 UTC (rev 
76646)
@@ -91,7 +91,7 @@
 
     (void)fclose(fp);
 
-    if (ged_wmater(gedp, argc, av) == GED_ERROR) {
+    if (ged_wmater(gedp, argc, av) & GED_ERROR) {
        bu_file_delete(tmpfil);
        bu_free((void *)av, "f_edmater: av");
        return GED_ERROR;

Modified: brlcad/trunk/src/libged/erase/erase.c
===================================================================
--- brlcad/trunk/src/libged/erase/erase.c       2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/erase/erase.c       2020-08-02 20:15:01 UTC (rev 
76646)
@@ -74,7 +74,7 @@
 
        if (strchr(argv[i], 'r')) {
                for (i = 1; i < (size_t)argc; ++i)
-               _dl_eraseAllPathsFromDisplay(gedp->ged_gdp->gd_headDisplay, 
gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, argv[i], 0, 
gedp->freesolid);
+               _dl_eraseAllPathsFromDisplay(gedp, argv[i], 0);
            return GED_OK;
        }
 
@@ -166,11 +166,11 @@
            if (new_argv[i][0] == '-')
                continue;
 
-           dl_erasePathFromDisplay(gedp->ged_gdp->gd_headDisplay, 
gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, new_argv[i], 1, 
gedp->freesolid);
+           dl_erasePathFromDisplay(gedp, new_argv[i], 1);
        }
     } else {
        for (i = 0; i < (size_t)argc; ++i)
-           dl_erasePathFromDisplay(gedp->ged_gdp->gd_headDisplay, 
gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, argv[i], 1, 
gedp->freesolid);
+           dl_erasePathFromDisplay(gedp, argv[i], 1);
     }
 
     return GED_OK;

Deleted: brlcad/trunk/src/libged/exec.cpp
===================================================================
--- brlcad/trunk/src/libged/exec.cpp    2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/src/libged/exec.cpp    2020-08-02 20:15:01 UTC (rev 76646)
@@ -1,95 +0,0 @@
-/*                        E X E C . C P P
- * BRL-CAD
- *
- * Copyright (c) 2020 United States Government as represented by
- * the U.S. Army Research Laboratory.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * version 2.1 as published by the Free Software Foundation.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this file; see the file named COPYING for more
- * information.
- */
-/** @file exec.cpp
- *
- * Brief description
- *
- */
-
-#include "common.h"
-
-#include <map>
-#include <string>
-
-#include "bu/time.h"
-#include "ged.h"
-#include "./include/plugin.h"
-
-extern "C" int
-ged_exec(struct ged *gedp, int argc, const char *argv[]) {
-    if (!gedp || !argc || !argv) {
-       return GED_ERROR;
-    }
-
-    double start = 0.0;
-    const char *tstr = getenv("GED_EXEC_TIME");
-    if (tstr) {
-       start = bu_gettime();
-    }
-
-    // TODO - right now this is the map from the libged load - should probably
-    // use this to initialize a struct ged copy when ged_init is called, so
-    // client codes can add their own commands to their gedp...
-    //
-    // The ged_cmds map should always reflect the original, vanilla state of
-    // libged's command set so we have a clean fallback available if we ever
-    // need it to fall back on/recover with.
-    std::map<std::string, const struct ged_cmd *> *cmap = 
(std::map<std::string, const struct ged_cmd *> *)ged_cmds;
-    std::string key(argv[0]);
-    std::map<std::string, const struct ged_cmd *>::iterator c_it = 
cmap->find(key);
-    if (c_it == cmap->end()) {
-       bu_vls_printf(gedp->ged_result_str, "unknown command: %s", argv[0]);
-       return (GED_ERROR | GED_UNKNOWN);
-    }
-
-    const struct ged_cmd *cmd = c_it->second;
-
-    // TODO - if interactive command via cmd->i->interactive, don't execute
-    // unless we have the necessary callbacks defined in gedp
-
-    int cret = (*cmd->i->cmd)(gedp, argc, argv);
-
-    if (tstr) {
-       bu_log("%s time: %g\n", argv[0], (bu_gettime() - start)/1e6);
-    }
-
-    // TODO - for the moment these are the hardcoded default opts.  Eventually
-    // an opts var should be added to struct ged, and each exec call will set
-    // the gedp->opts value to the command defaults.  Then the command option 
handling
-    // will be able to alter the flags if desired (for example, a flag to 
suppress
-    // autoview behavior will simply remove the flag from gedp->opts.
-    if (cmd->i->opts & GED_CMD_UPDATE_VIEW) {
-       // Do update view callback
-       if (gedp->ged_refresh_handler) {
-           (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
-       }
-    }
-
-    return cret;
-}
-
-// Local Variables:
-// tab-width: 8
-// mode: C++
-// c-basic-offset: 4
-// indent-tabs-mode: t
-// c-file-style: "stroustrup"
-// End:
-// ex: shiftwidth=4 tabstop=8

Copied: brlcad/trunk/src/libged/exec.cpp (from rev 76506, 
brlcad/branches/bioh/src/libged/exec.cpp)
===================================================================
--- brlcad/trunk/src/libged/exec.cpp                            (rev 0)
+++ brlcad/trunk/src/libged/exec.cpp    2020-08-02 20:15:01 UTC (rev 76646)
@@ -0,0 +1,83 @@
+/*                        E X E C . C P P
+ * BRL-CAD
+ *
+ * Copyright (c) 2020 United States Government as represented by
+ * the U.S. Army Research Laboratory.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * version 2.1 as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this file; see the file named COPYING for more
+ * information.
+ */
+/** @file exec.cpp
+ *
+ * Brief description
+ *
+ */
+
+#include "common.h"
+
+#include <map>
+#include <string>
+
+#include "bu/time.h"
+#include "ged.h"
+#include "./include/plugin.h"
+
+extern "C" int
+ged_exec(struct ged *gedp, int argc, const char *argv[]) {
+    if (!gedp || !argc || !argv) {
+       return GED_ERROR;
+    }
+
+    double start = 0.0;
+    const char *tstr = getenv("GED_EXEC_TIME");
+    if (tstr) {
+       start = bu_gettime();
+    }
+
+    // TODO - right now this is the map from the libged load - should probably
+    // use this to initialize a struct ged copy when ged_init is called, so
+    // client codes can add their own commands to their gedp...
+    //
+    // The ged_cmds map should always reflect the original, vanilla state of
+    // libged's command set so we have a clean fallback available if we ever
+    // need it to fall back on/recover with.
+    std::map<std::string, const struct ged_cmd *> *cmap = 
(std::map<std::string, const struct ged_cmd *> *)ged_cmds;
+    std::string key(argv[0]);
+    std::map<std::string, const struct ged_cmd *>::iterator c_it = 
cmap->find(key);
+    if (c_it == cmap->end()) {
+       bu_vls_printf(gedp->ged_result_str, "unknown command: %s", argv[0]);
+       return (GED_ERROR | GED_UNKNOWN);
+    }
+
+    const struct ged_cmd *cmd = c_it->second;
+
+    // TODO - if interactive command via cmd->i->interactive, don't execute
+    // unless we have the necessary callbacks defined in gedp
+
+    int cret = (*cmd->i->cmd)(gedp, argc, argv);
+
+    if (tstr) {
+       bu_log("%s time: %g\n", argv[0], (bu_gettime() - start)/1e6);
+    }
+
+    return cret;
+}
+
+// Local Variables:
+// tab-width: 8
+// mode: C++
+// c-basic-offset: 4
+// indent-tabs-mode: t
+// c-file-style: "stroustrup"
+// End:
+// ex: shiftwidth=4 tabstop=8

Modified: brlcad/trunk/src/libged/facetize/facetize.cpp
===================================================================
--- brlcad/trunk/src/libged/facetize/facetize.cpp       2020-08-02 19:53:00 UTC 
(rev 76645)
+++ brlcad/trunk/src/libged/facetize/facetize.cpp       2020-08-02 20:15:01 UTC 
(rev 76646)
@@ -938,7 +938,7 @@
            bu_vls_printf(&tmpname, "-0");
            bu_vls_incr(&tmpname, NULL, NULL, &_db_uniq_test, (void *)gedp);
        }
-       if (_write_bot(gedp, tbot, bu_vls_addr(&tmpname), opts) == GED_ERROR) {
+       if (_write_bot(gedp, tbot, bu_vls_addr(&tmpname), opts) & GED_ERROR) {
            bu_log("SPSR: could not write BoT to temporary name %s\n", 
bu_vls_addr(&tmpname));
            bu_vls_free(&tmpname);
            ret = GED_FACETIZE_FAILURE;

Modified: brlcad/trunk/src/libged/gdiff/gdiff.c
===================================================================
--- brlcad/trunk/src/libged/gdiff/gdiff.c       2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/gdiff/gdiff.c       2020-08-02 20:15:01 UTC (rev 
76646)
@@ -177,11 +177,11 @@
 
            /* Clear any previous diff drawing */
            if (db_lookup(gedp->ged_wdbp->dbip, "diff_visualff", LOOKUP_QUIET) 
!= RT_DIR_NULL)
-               dl_erasePathFromDisplay(gedp->ged_gdp->gd_headDisplay, 
gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, "diff_visualff", 1, 
gedp->freesolid);
+               dl_erasePathFromDisplay(gedp, "diff_visualff", 1);
            if (db_lookup(gedp->ged_wdbp->dbip, "diff_visualff0000", 
LOOKUP_QUIET) != RT_DIR_NULL)
-               dl_erasePathFromDisplay(gedp->ged_gdp->gd_headDisplay, 
gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, "diff_visualff0000", 1, 
gedp->freesolid);
+               dl_erasePathFromDisplay(gedp, "diff_visualff0000", 1);
            if (db_lookup(gedp->ged_wdbp->dbip, "diff_visualffffff", 
LOOKUP_QUIET) != RT_DIR_NULL)
-               dl_erasePathFromDisplay(gedp->ged_gdp->gd_headDisplay, 
gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, "diff_visualffffff", 1, 
gedp->freesolid);
+               dl_erasePathFromDisplay(gedp, "diff_visualffffff", 1);
 
            /* Draw left-only lines */
            if (view_left) {

Modified: brlcad/trunk/src/libged/ged.c
===================================================================
--- brlcad/trunk/src/libged/ged.c       2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/src/libged/ged.c       2020-08-02 20:15:01 UTC (rev 76646)
@@ -86,13 +86,16 @@
 
     /* Terminate any ged subprocesses */
     if (gedp != GED_NULL) {
-       struct ged_subprocess *rrp;
-       for (BU_LIST_FOR(rrp, ged_subprocess, &gedp->gd_headSubprocess.l)) {
+       for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_subp); i++) {
+           struct ged_subprocess *rrp = (struct ged_subprocess 
*)BU_PTBL_GET(&gedp->ged_subp, i);
            if (!rrp->aborted) {
                bu_terminate(bu_process_pid(rrp->p));
                rrp->aborted = 1;
            }
+           bu_ptbl_rm(&gedp->ged_subp, (long *)rrp);
+           BU_PUT(rrp, struct ged_subprocess);
        }
+       bu_ptbl_reset(&gedp->ged_subp);
     }
 
     ged_free(gedp);
@@ -154,7 +157,38 @@
 
     gedp->ged_wdbp = RT_WDB_NULL;
 
+    bu_vls_free(&gedp->go_name);
+
+    // Note - it is the caller's responsibility to have freed any data
+    // associated with the ged or its views in the u_data pointers.
+    //
+    // Since libged does not link libdm, it's also the responsibility of the
+    // caller to close any display managers associated with the view.
+    struct bview *gdvp;
+    for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views); i++) {
+       gdvp = (struct bview *)BU_PTBL_GET(&gedp->ged_views, i);
+       bu_vls_free(&gdvp->gv_name);
+       bu_ptbl_free(gdvp->callbacks);
+       BU_PUT(gdvp->callbacks, struct bu_ptbl);
+       bu_free((void *)gdvp, "bview");
+    }
+    bu_ptbl_free(&gedp->ged_views);
+
     if (gedp->ged_gdp != GED_DRAWABLE_NULL) {
+
+       for (size_t i = 0; i < BU_PTBL_LEN(&gedp->free_solids); i++) {
+           // TODO - FREE_SOLID macro is stashing on the freesolid list, not
+           // BU_PUT-ing the solid objects themselves - is that what we expect
+           // when doing ged_free?  I.e., is ownership of the free solid list
+           // with the struct ged or with the application as a whole?  We're
+           // BU_PUT-ing gedp->freesolid - above why just that one?
+#if 0
+           struct solid *sp = (struct solid *)BU_PTBL_GET(&gedp->free_solids, 
i);
+           RT_FREE_VLIST(&(sp->s_vlist));
+#endif
+       }
+       bu_ptbl_free(&gedp->free_solids);
+
        if (gedp->ged_gdp->gd_headDisplay)
            BU_PUT(gedp->ged_gdp->gd_headDisplay, struct bu_vls);
        if (gedp->ged_gdp->gd_headVDraw)
@@ -178,6 +212,7 @@
        BU_PUT(gedp->ged_result_str, struct bu_vls);
     }
 
+    // TODO - replace freesolid with free_solids ptbl
     {
        struct solid *nsp;
        sp = BU_LIST_NEXT(solid, &gedp->freesolid->l);
@@ -193,19 +228,24 @@
     free_object_selections(gedp->ged_selections);
     bu_hash_destroy(gedp->ged_selections);
 
+    BU_PUT(gedp->ged_cbs, struct ged_callback_state);
+
+    bu_ptbl_free(&gedp->ged_subp);
 }
 
 void
 ged_init(struct ged *gedp)
 {
-    struct solid *freesolid;
-
     if (gedp == GED_NULL)
        return;
 
-    BU_LIST_INIT(&gedp->l);
     gedp->ged_wdbp = RT_WDB_NULL;
 
+    // TODO - rename to ged_name
+    bu_vls_init(&gedp->go_name);
+
+    BU_PTBL_INIT(&gedp->ged_views);
+
     BU_GET(gedp->ged_log, struct bu_vls);
     bu_vls_init(gedp->ged_log);
 
@@ -212,7 +252,7 @@
     BU_GET(gedp->ged_results, struct ged_results);
     (void)_ged_results_init(gedp->ged_results);
 
-    BU_LIST_INIT(&gedp->gd_headSubprocess.l);
+    BU_PTBL_INIT(&gedp->ged_subp);
 
     /* For now, we're keeping the string... will go once no one uses it */
     BU_GET(gedp->ged_result_str, struct bu_vls);
@@ -230,19 +270,37 @@
     gedp->ged_selections = bu_hash_create(32);
 
     /* init the solid list */
+    struct solid *freesolid;
     BU_GET(freesolid, struct solid);
     BU_LIST_INIT(&freesolid->l);
     gedp->freesolid = freesolid;
-    gedp->ged_gdp->gd_freeSolids = freesolid;
 
-    /* (in)sanity */
+    /* TODO: If we're init-ing the list here, does that mean the gedp has
+     * ownership of all solid objects created and stored here, and should we
+     * then free them when ged_free is called? (don't appear to be currently,
+     * just calling FREE_SOLID which doesn't de-allocate... */
+    BU_PTBL_INIT(&gedp->free_solids);
+
+    /* Initialize callbacks */
+    BU_GET(gedp->ged_cbs, struct ged_callback_state);
+    gedp->ged_refresh_handler = NULL;
+    gedp->ged_refresh_clientdata = NULL;
+    gedp->ged_output_handler = NULL;
+    gedp->ged_create_vlist_solid_callback = NULL;
+    gedp->ged_create_vlist_display_list_callback = NULL;
+    gedp->ged_destroy_vlist_callback = NULL;
+    gedp->ged_create_io_handler = NULL;
+    gedp->ged_delete_io_handler = NULL;
+    gedp->ged_io_data = NULL;
+
+    /* Out of the gate we don't have display managers or views */
     gedp->ged_gvp = NULL;
     gedp->ged_dmp = NULL;
-    gedp->ged_refresh_clientdata = NULL;
-    gedp->ged_refresh_handler = NULL;
-    gedp->ged_output_handler = NULL;
+
+    /* ? */
     gedp->ged_output_script = NULL;
     gedp->ged_internal_call = 0;
+
 }
 
 
@@ -252,6 +310,8 @@
     if (gvp == GED_VIEW_NULL)
        return;
 
+    gvp->magic = BVIEW_MAGIC;
+
     gvp->gv_scale = 500.0;
     gvp->gv_size = 2.0 * gvp->gv_scale;
     gvp->gv_isize = 1.0 / gvp->gv_size;
@@ -654,6 +714,81 @@
     rt_db_free_internal(&intern);
 }
 
+/* Callback wrapper functions */
+
+void
+ged_refresh_cb(struct ged *gedp)
+{
+    if (gedp->ged_refresh_handler != GED_REFRESH_FUNC_NULL) {
+       gedp->ged_cbs->ged_refresh_handler_cnt++;
+       if (gedp->ged_cbs->ged_refresh_handler_cnt > 1) {
+           bu_log("Warning - recursive call of gedp->ged_refresh_handler!\n");
+       }
+       (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
+       gedp->ged_cbs->ged_refresh_handler_cnt--;
+    }
+}
+
+void
+ged_output_handler_cb(struct ged *gedp, char *str)
+{
+    if (gedp->ged_output_handler != (void (*)(struct ged *, char *))0) {
+       gedp->ged_cbs->ged_output_handler_cnt++;
+       if (gedp->ged_cbs->ged_output_handler_cnt > 1) {
+           bu_log("Warning - recursive call of gedp->ged_output_handler!\n");
+       }
+       (*gedp->ged_output_handler)(gedp, str);
+       gedp->ged_cbs->ged_output_handler_cnt--;
+    }
+}
+
+void
+ged_create_vlist_solid_cb(struct ged *gedp, struct solid *s)
+{
+    if (gedp->ged_create_vlist_solid_callback != 
GED_CREATE_VLIST_SOLID_FUNC_NULL) {
+       gedp->ged_cbs->ged_create_vlist_solid_callback_cnt++;
+       if (gedp->ged_cbs->ged_create_vlist_solid_callback_cnt > 1) {
+           bu_log("Warning - recursive call of 
gedp->ged_create_vlist_solid_callback!\n");
+       }
+       (*gedp->ged_create_vlist_solid_callback)(s);
+       gedp->ged_cbs->ged_create_vlist_solid_callback_cnt--;
+    }
+}
+
+void
+ged_create_vlist_display_list_cb(struct ged *gedp, struct display_list *dl)
+{
+    if (gedp->ged_create_vlist_display_list_callback != 
GED_CREATE_VLIST_DISPLAY_LIST_FUNC_NULL) {
+       gedp->ged_cbs->ged_create_vlist_display_list_callback_cnt++;
+       if (gedp->ged_cbs->ged_create_vlist_display_list_callback_cnt > 1) {
+           bu_log("Warning - recursive call of 
gedp->ged_create_vlist_callback!\n");
+       }
+       (*gedp->ged_create_vlist_display_list_callback)(dl);
+       gedp->ged_cbs->ged_create_vlist_display_list_callback_cnt--;
+    }
+}
+
+void
+ged_destroy_vlist_cb(struct ged *gedp, unsigned int i, int j)
+{
+    if (gedp->ged_destroy_vlist_callback != GED_DESTROY_VLIST_FUNC_NULL) {
+       gedp->ged_cbs->ged_destroy_vlist_callback_cnt++;
+       if (gedp->ged_cbs->ged_destroy_vlist_callback_cnt > 1) {
+           bu_log("Warning - recursive call of 
gedp->ged_destroy_vlist_callback!\n");
+       }
+       (*gedp->ged_destroy_vlist_callback)(i, j);
+       gedp->ged_cbs->ged_destroy_vlist_callback_cnt--;
+    }
+}
+
+#if 0
+int
+ged_io_handler_cb(struct ged *, ged_io_handler_callback_t *cb, void *, int)
+{
+    if (
+}
+#endif
+
 /*
  * Local Variables:
  * mode: C

Modified: brlcad/trunk/src/libged/ged_private.h
===================================================================
--- brlcad/trunk/src/libged/ged_private.h       2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/ged_private.h       2020-08-02 20:15:01 UTC (rev 
76646)
@@ -82,6 +82,37 @@
 /* Default libged column width assumption */
 #define GED_TERMINAL_WIDTH 80
 
+
+/* Callback management related structures */
+#define GED_REFRESH_FUNC_NULL ((ged_refresh_func_t)0)
+#define GED_CREATE_VLIST_SOLID_FUNC_NULL ((ged_create_vlist_solid_func_t)0)
+#define GED_CREATE_VLIST_DISPLAY_LIST_FUNC_NULL 
((ged_create_vlist_display_list_func_t)0)
+#define GED_DESTROY_VLIST_FUNC_NULL ((ged_destroy_vlist_func_t)0)
+
+// Private bookkeeping structure used by callback handlers
+struct ged_callback_state {
+    int ged_refresh_handler_cnt;
+    int ged_output_handler_cnt;
+    int ged_create_vlist_solid_callback_cnt;
+    int ged_create_vlist_display_list_callback_cnt;
+    int ged_destroy_vlist_callback_cnt;
+    int ged_io_handler_callback_cnt;
+};
+
+/* These are wrapper functions, that should be called by libged code instead of
+ * the callback pointers supplied by the client (if any).  They will do the 
boilerplate
+ * bookkeeping and validation required by callbacks.
+ */
+GED_EXPORT extern void ged_refresh_cb(struct ged *);
+GED_EXPORT extern void ged_output_handler_cb(struct ged *, char *);
+GED_EXPORT extern void ged_create_vlist_solid_cb(struct ged *, struct solid *);
+GED_EXPORT extern void ged_create_vlist_display_list_cb(struct ged *, struct 
display_list *);
+GED_EXPORT extern void ged_destroy_vlist_cb(struct ged *, unsigned int, int);
+GED_EXPORT extern void ged_io_handler_cb(struct ged *, void *, int);
+
+
+
+
 struct _ged_funtab {
     char *ft_name;
     char *ft_parms;
@@ -181,30 +212,22 @@
                         int validate);
 
 /* defined in display_list.c */
-GED_EXPORT extern void _dl_eraseAllNamesFromDisplay(struct bu_list *hdlp, 
struct db_i *dbip,
-               void (*callback)(unsigned int, int),
-                                         const char *name,
-                                         const int skip_first, struct solid 
*freesolid);
-GED_EXPORT extern void _dl_eraseAllPathsFromDisplay(struct bu_list *hdlp, 
struct db_i *dbip,
-               void (*callback)(unsigned int, int),
-                                         const char *path,
-                                         const int skip_first, struct solid 
*freesolid);
-extern void _dl_freeDisplayListItem(struct db_i *dbip,
-               void (*callback)(unsigned int, int),
-                                    struct display_list *gdlp, struct solid 
*freesolid);
+GED_EXPORT extern void _dl_eraseAllNamesFromDisplay(struct ged *gedp, const 
char *name, const int skip_first);
+GED_EXPORT extern void _dl_eraseAllPathsFromDisplay(struct ged *gedp, const 
char *path, const int skip_first);
+extern void _dl_freeDisplayListItem(struct ged *gedp, struct display_list 
*gdlp);
 extern int headsolid_splitGDL(struct bu_list *hdlp, struct db_i *dbip, struct 
display_list *gdlp, struct db_full_path *path);
 GED_EXPORT extern int dl_bounding_sph(struct bu_list *hdlp, vect_t *min, 
vect_t *max, int pflag);
 /* Returns a bu_ptbl of all solids referenced by the display list */
 extern struct bu_ptbl *dl_get_solids(struct display_list *gdlp);
 
-GED_EXPORT extern void dl_add_path(struct display_list *gdlp, int dashflag, 
fastf_t transparency, int dmode, int hiddenLine, struct bu_list *vhead, const 
struct db_full_path *pathp, struct db_tree_state *tsp, unsigned char 
*wireframe_color_override, void (*callback)(struct solid *), struct solid 
*freesolid);
+GED_EXPORT extern void dl_add_path(int dashflag, struct bu_list *vhead, const 
struct db_full_path *pathp, struct db_tree_state *tsp, unsigned char 
*wireframe_color_override, struct _ged_client_data *dgcdp);
 
-GED_EXPORT extern int dl_redraw(struct display_list *gdlp, struct db_i *dbip, 
struct db_tree_state *tsp, struct bview *gvp, void (*callback)(struct 
display_list *), int skip_subtractions);
+GED_EXPORT extern int dl_redraw(struct display_list *gdlp, struct ged *gedp, 
int skip_subtractions);
 GED_EXPORT extern union tree * append_solid_to_display_list(struct 
db_tree_state *tsp, const struct db_full_path *pathp, struct rt_db_internal 
*ip, void *client_data);
 GED_EXPORT int dl_set_illum(struct display_list *gdlp, const char *obj, int 
illum);
 GED_EXPORT void dl_set_flag(struct bu_list *hdlp, int flag);
 GED_EXPORT void dl_set_wflag(struct bu_list *hdlp, int wflag);
-GED_EXPORT void dl_zap(struct bu_list *hdlp, struct db_i *dbip, void 
(*callback)(unsigned int, int), struct solid *freesolid);
+GED_EXPORT void dl_zap(struct ged *gedp, struct solid *freesolid);
 GED_EXPORT int dl_how(struct bu_list *hdlp, struct bu_vls *vls, struct 
directory **dpp, int both);
 GED_EXPORT void dl_plot(struct bu_list *hdlp, FILE *fp, mat_t model2view, int 
floating, mat_t center, fastf_t scale, int Three_D, int Z_clip);
 GED_EXPORT void dl_png(struct bu_list *hdlp, mat_t model2view, fastf_t 
perspective, vect_t eye_pos, size_t size, size_t half_size, unsigned char 
**image);
@@ -222,7 +245,7 @@
 
 GED_EXPORT int dl_select(struct bu_list *hdlp, mat_t model2view, struct bu_vls 
*vls, double vx, double vy, double vwidth, double vheight, int rflag);
 GED_EXPORT int dl_select_partial(struct bu_list *hdlp, mat_t model2view, 
struct bu_vls *vls, double vx, double vy, double vwidth, double vheight, int 
rflag);
-GED_EXPORT void dl_set_transparency(struct bu_list *hdlp, struct directory 
**dpp, double transparency, void (*callback)(struct display_list *));
+GED_EXPORT void dl_set_transparency(struct ged *gedp, struct directory **dpp, 
double transparency);
 
 /* defined in draw.c */
 GED_EXPORT extern void _ged_cvt_vlblock_to_solids(struct ged *gedp,
@@ -626,6 +649,10 @@
 GED_EXPORT extern int ged_view_snap(struct ged *gedp, int argc, const char 
*argv[]);
 GED_EXPORT extern int ged_view_data_lines(struct ged *gedp, int argc, const 
char *argv[]);
 
+
+GED_EXPORT extern void ged_push_solid(struct ged *gedp, struct solid *sp);
+GED_EXPORT extern struct solid *ged_pop_solid(struct ged *gedp);
+
 __END_DECLS
 
 #endif /* LIBGED_GED_PRIVATE_H */

Modified: brlcad/trunk/src/libged/ged_util.c
===================================================================
--- brlcad/trunk/src/libged/ged_util.c  2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/src/libged/ged_util.c  2020-08-02 20:15:01 UTC (rev 76646)
@@ -50,6 +50,42 @@
 #include "ged.h"
 #include "./ged_private.h"
 
+struct bview *
+ged_find_view(struct ged *gedp, const char *key)
+{
+    struct bview *gdvp = NULL;
+    for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views); i++) {
+       gdvp = (struct bview *)BU_PTBL_GET(&gedp->ged_views, i);
+       if (BU_STR_EQUAL(bu_vls_addr(&gdvp->gv_name), key))
+           break;
+       gdvp = NULL;
+    }
+
+    return gdvp;
+}
+
+void
+ged_push_solid(struct ged *gedp, struct solid *sp)
+{
+    RT_FREE_VLIST(&(sp->s_vlist));
+    sp->s_fullpath.fp_len = 0; // Don't free memory, but implicitly clear 
contents
+    bu_ptbl_ins(&gedp->free_solids, (long *)sp);
+}
+
+struct solid *
+ged_pop_solid(struct ged *gedp)
+{
+    struct solid *sp = NULL;
+    if (BU_PTBL_LEN(&gedp->free_solids)) {
+       sp = (struct solid *)BU_PTBL_GET(&gedp->free_solids, 
(BU_PTBL_LEN(&gedp->free_solids) - 1));
+       bu_ptbl_rm(&gedp->free_solids, (long *)sp);
+    } else {
+       BU_ALLOC(sp, struct solid); // from GET_SOLID in rt/solid.h
+       db_full_path_init(&(sp)->s_fullpath);
+    }
+    return sp;
+}
+
 int
 _ged_results_init(struct ged_results *results)
 {
@@ -1018,9 +1054,9 @@
        wcolor[0] = (unsigned char)dgcdp->wireframe_color[0];
        wcolor[1] = (unsigned char)dgcdp->wireframe_color[1];
        wcolor[2] = (unsigned char)dgcdp->wireframe_color[2];
-       dl_add_path(dgcdp->gdlp, dashflag, dgcdp->transparency, dgcdp->dmode, 
dgcdp->hiddenLine, vhead, pathp, tsp, wcolor, 
dgcdp->gedp->ged_create_vlist_solid_callback, dgcdp->freesolid);
+       dl_add_path(dashflag, vhead, pathp, tsp, wcolor, dgcdp);
     } else {
-       dl_add_path(dgcdp->gdlp, dashflag, dgcdp->transparency, dgcdp->dmode, 
dgcdp->hiddenLine, vhead, pathp, tsp, NULL, 
dgcdp->gedp->ged_create_vlist_solid_callback, dgcdp->freesolid);
+       dl_add_path(dashflag, vhead, pathp, tsp, NULL, dgcdp);
     }
 }
 
@@ -1037,7 +1073,7 @@
        if (BU_LIST_IS_EMPTY(&(vbp->head[i])))
            continue;
        snprintf(namebuf, 64, "%s%lx", shortname, vbp->rgb[i]);
-       invent_solid(gedp->ged_gdp->gd_headDisplay, gedp->ged_wdbp->dbip, 
gedp->ged_create_vlist_solid_callback, gedp->ged_free_vlist_callback, namebuf, 
&vbp->head[i], vbp->rgb[i], copy, 1.0, 0, gedp->freesolid, 0);
+       invent_solid(gedp, namebuf, &vbp->head[i], vbp->rgb[i], copy, 1.0, 0, 
0);
     }
 }
 
@@ -1297,30 +1333,24 @@
     }
 }
 
-struct _ged_rt_client_data {
-    struct ged_subprocess *rrtp;
-    struct ged *gedp;
-};
-
 void
 _ged_rt_output_handler(void *clientData, int UNUSED(mask))
 {
-    struct _ged_rt_client_data *drcdp = (struct _ged_rt_client_data 
*)clientData;
-    struct ged_subprocess *run_rtp;
+    struct ged_subprocess *rrtp = (struct ged_subprocess *)clientData;
     int count = 0;
     int retcode = 0;
     int read_failed = 0;
     char line[RT_MAXLINE+1] = {0};
 
-    if (drcdp == (struct _ged_rt_client_data *)NULL ||
-       drcdp->gedp == (struct ged *)NULL ||
-       drcdp->rrtp == (struct ged_subprocess *)NULL)
+    if ((rrtp == (struct ged_subprocess *)NULL) || (rrtp->gedp == (struct ged 
*)NULL))
        return;
 
-    run_rtp = drcdp->rrtp;
+    BU_CKMAG(rrtp, GED_CMD_MAGIC, "ged subprocess");
 
+    struct ged *gedp = rrtp->gedp;
+
     /* Get data from rt */
-    if (bu_process_read((char *)line, &count, run_rtp->p, BU_PROCESS_STDERR, 
RT_MAXLINE) <= 0) {
+    if (bu_process_read((char *)line, &count, rrtp->p, BU_PROCESS_STDERR, 
RT_MAXLINE) <= 0) {
        read_failed = 1;
     }
 
@@ -1328,14 +1358,14 @@
        int aborted;
 
        /* Done watching for output, undo subprocess I/O hooks. */
-       if (drcdp->gedp->ged_delete_io_handler) {
-           (*drcdp->gedp->ged_delete_io_handler)(drcdp->gedp->ged_interp, 
run_rtp->chan,
-                   run_rtp->p, BU_PROCESS_STDERR, (void *)drcdp,
-                   _ged_rt_output_handler);
+       if (gedp->ged_delete_io_handler) {
+           (*gedp->ged_delete_io_handler)(rrtp, BU_PROCESS_STDERR);
        }
+
+
        /* Either EOF has been sent or there was a read error.
         * there is no need to block indefinitely */
-       retcode = bu_process_wait(&aborted, run_rtp->p, 120);
+       retcode = bu_process_wait(&aborted, rrtp->p, 120);
 
        if (aborted)
            bu_log("Raytrace aborted.\n");
@@ -1344,13 +1374,12 @@
        else
            bu_log("Raytrace complete.\n");
 
-       if (drcdp->gedp->ged_gdp->gd_rtCmdNotify != (void (*)(int))0)
-           drcdp->gedp->ged_gdp->gd_rtCmdNotify(aborted);
+       if (gedp->ged_gdp->gd_rtCmdNotify != (void (*)(int))0)
+           gedp->ged_gdp->gd_rtCmdNotify(aborted);
 
-       /* free run_rtp */
-       BU_LIST_DEQUEUE(&run_rtp->l);
-       BU_PUT(run_rtp, struct ged_subprocess);
-       BU_PUT(drcdp, struct _ged_rt_client_data);
+       /* free rrtp */
+       bu_ptbl_rm(&gedp->ged_subp, (long *)rrtp);
+       BU_PUT(rrtp, struct ged_subprocess);
 
        return;
     }
@@ -1359,10 +1388,11 @@
     line[count] = '\0';
 
     /* handle (i.e., probably log to stderr) the resulting line */
-    if (drcdp->gedp->ged_output_handler != (void (*)(struct ged *, char *))0)
-       drcdp->gedp->ged_output_handler(drcdp->gedp, line);
+    if (gedp->ged_output_handler != (void (*)(struct ged *, char *))0)
+       ged_output_handler_cb(gedp, line);
     else
-       bu_vls_printf(drcdp->gedp->ged_result_str, "%s", line);
+       bu_vls_printf(gedp->ged_result_str, "%s", line);
+
 }
 
 void
@@ -1431,7 +1461,6 @@
     FILE *fp_in;
     vect_t eye_model;
     struct ged_subprocess *run_rtp;
-    struct _ged_rt_client_data *drcdp;
     struct bu_process *p = NULL;
 
     bu_process_exec(&p, gd_rt_cmd[0], cmd_len, gd_rt_cmd, 0, 0);
@@ -1452,19 +1481,16 @@
     bu_process_close(p, BU_PROCESS_STDIN);
 
     BU_GET(run_rtp, struct ged_subprocess);
-    BU_LIST_INIT(&run_rtp->l);
-    BU_LIST_APPEND(&gedp->gd_headSubprocess.l, &run_rtp->l);
+    run_rtp->magic = GED_CMD_MAGIC;
+    bu_ptbl_ins(&gedp->ged_subp, (long *)run_rtp);
 
     run_rtp->p = p;
     run_rtp->aborted = 0;
+    run_rtp->gedp = gedp;
 
-    BU_GET(drcdp, struct _ged_rt_client_data);
-    drcdp->gedp = gedp;
-    drcdp->rrtp = run_rtp;
-
     /* If we know how, set up hooks so the parent process knows to watch for 
output. */
     if (gedp->ged_create_io_handler) {
-       (*gedp->ged_create_io_handler)(&(run_rtp->chan), p, BU_PROCESS_STDERR, 
gedp->io_mode, (void *)drcdp, _ged_rt_output_handler);
+       (*gedp->ged_create_io_handler)(run_rtp, BU_PROCESS_STDERR, 
_ged_rt_output_handler, (void *)run_rtp);
     }
     return GED_OK;
 }
@@ -1525,7 +1551,7 @@
     av[0] = objp->d_namep;
     av[1] = NULL;
 
-    if (_ged_combadd2(gedp, combname, ac, av, region_flag, relation, ident, 
air, NULL, 1) == GED_ERROR)
+    if (_ged_combadd2(gedp, combname, ac, av, region_flag, relation, ident, 
air, NULL, 1) & GED_ERROR)
        return RT_DIR_NULL;
 
     /* Done changing stuff - update nref. */

Modified: brlcad/trunk/src/libged/get/get.c
===================================================================
--- brlcad/trunk/src/libged/get/get.c   2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/src/libged/get/get.c   2020-08-02 20:15:01 UTC (rev 76646)
@@ -63,7 +63,7 @@
        return GED_ERROR;
     }
 
-    if (wdb_import_from_path(gedp->ged_result_str, &intern, argv[1], 
gedp->ged_wdbp) == GED_ERROR)
+    if (wdb_import_from_path(gedp->ged_result_str, &intern, argv[1], 
gedp->ged_wdbp) & GED_ERROR)
        return GED_ERROR;
 
     if (!intern.idb_meth->ft_get) {

Modified: brlcad/trunk/src/libged/get_obj_bounds.c
===================================================================
--- brlcad/trunk/src/libged/get_obj_bounds.c    2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/get_obj_bounds.c    2020-08-02 20:15:01 UTC (rev 
76646)
@@ -245,7 +245,7 @@
     VSETALL(rpp_min, MAX_FASTF);
     VREVERSE(rpp_max, rpp_min);
 
-    if (get_objpath_mat(gedp, argc, argv, gtdp) == GED_ERROR)
+    if (get_objpath_mat(gedp, argc, argv, gtdp) & GED_ERROR)
        return GED_ERROR;
 
     dp = gtdp->gtd_obj[gtdp->gtd_objpos-1];

Modified: brlcad/trunk/src/libged/get_type/get_type.c
===================================================================
--- brlcad/trunk/src/libged/get_type/get_type.c 2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/get_type/get_type.c 2020-08-02 20:15:01 UTC (rev 
76646)
@@ -56,7 +56,7 @@
        return GED_ERROR;
     }
 
-    if (wdb_import_from_path(gedp->ged_result_str, &intern, argv[1], 
gedp->ged_wdbp) == GED_ERROR)
+    if (wdb_import_from_path(gedp->ged_result_str, &intern, argv[1], 
gedp->ged_wdbp) & GED_ERROR)
        return GED_ERROR;
 
     if (intern.idb_major_type != DB5_MAJORTYPE_BRLCAD) {

Modified: brlcad/trunk/src/libged/include/plugin.h
===================================================================
--- brlcad/branches/bioh/src/libged/include/plugin.h    2020-07-26 02:18:58 UTC 
(rev 76506)
+++ brlcad/trunk/src/libged/include/plugin.h    2020-08-02 20:15:01 UTC (rev 
76646)
@@ -47,18 +47,21 @@
  * flags &= &( flag2 | flag3 );
  */
 
+/* Unsigned long long (which we get from C99) must be at least 64 bits, so we
+ * may define up to 64 flags here. (although we probably don't want that many,
+ * using that type for future proofing...) */
 #define GED_CMD_DEFAULT       0
-#define GED_CMD_INTERACTIVE   1 << 0
-#define GED_CMD_UPDATE_SCENE  1 << 1
-#define GED_CMD_UPDATE_VIEW   1 << 2
-#define GED_CMD_AUTOVIEW      1 << 3
-#define GED_CMD_ALL_VIEWS     1 << 4
-#define GED_CMD_VIEW_CALLBACK 1 << 5
+#define GED_CMD_INTERACTIVE   1ULL << 0
+#define GED_CMD_UPDATE_SCENE  1ULL << 1
+#define GED_CMD_UPDATE_VIEW   1ULL << 2
+#define GED_CMD_AUTOVIEW      1ULL << 3
+#define GED_CMD_ALL_VIEWS     1ULL << 4
+#define GED_CMD_VIEW_CALLBACK 1ULL << 5
 
 struct ged_cmd_impl {
     const char *cname;
     ged_func_ptr cmd;
-    int64_t opts;
+    unsigned long long opts;
 };
 
 

Modified: brlcad/trunk/src/libged/joint/joint.c
===================================================================
--- brlcad/trunk/src/libged/joint/joint.c       2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/joint/joint.c       2020-08-02 20:15:01 UTC (rev 
76646)
@@ -3231,8 +3231,7 @@
                    if (domesh) {
                        joint_mesh(gedp, 0, 0);
                        /* refreshing the screen */
-                       if (gedp->ged_refresh_handler != 
GED_REFRESH_CALLBACK_PTR_NULL)
-                           
(*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
+                       ged_refresh_cb(gedp);
                    }
                    joint_clear();
                }
@@ -3292,8 +3291,7 @@
            joint_mesh(gedp, 0, 0);
 
            /* refreshing the screen */
-           if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL)
-               (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
+           ged_refresh_cb(gedp);
        }
     }
     if (count < loops) {
@@ -3325,8 +3323,7 @@
                joint_mesh(gedp, 0, 0);
 
                /* refreshing the screen */
-               if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL)
-                   (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
+               ged_refresh_cb(gedp);
            }
        }
     }
@@ -3342,8 +3339,7 @@
        joint_mesh(gedp, 0, 0);
 
        /* refreshing the screen */
-       if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL)
-           (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
+       ged_refresh_cb(gedp);
     }
     return GED_OK;
 }
@@ -3462,8 +3458,7 @@
     joint_mesh(gedp, 0, 0);
 
     /* refreshing the screen */
-    if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL)
-       (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
+    ged_refresh_cb(gedp);
 
     return GED_OK;
 }

Modified: brlcad/trunk/src/libged/kill/kill.c
===================================================================
--- brlcad/trunk/src/libged/kill/kill.c 2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/src/libged/kill/kill.c 2020-08-02 20:15:01 UTC (rev 76646)
@@ -107,7 +107,7 @@
            if (is_phony)
                continue;
 
-           _dl_eraseAllNamesFromDisplay(gedp->ged_gdp->gd_headDisplay, 
gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, argv[i], 0, 
gedp->freesolid);
+           _dl_eraseAllNamesFromDisplay(gedp, argv[i], 0);
 
            if (db_delete(gedp->ged_wdbp->dbip, dp) != 0 || 
db_dirdelete(gedp->ged_wdbp->dbip, dp) != 0) {
                /* Abort kill processing on first error */

Modified: brlcad/trunk/src/libged/killrefs/killrefs.c
===================================================================
--- brlcad/trunk/src/libged/killrefs/killrefs.c 2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/killrefs/killrefs.c 2020-08-02 20:15:01 UTC (rev 
76646)
@@ -69,7 +69,7 @@
 
     if (!nflag && !gedp->ged_internal_call) {
        for (k = 1; k < argc; k++)
-           _dl_eraseAllNamesFromDisplay(gedp->ged_gdp->gd_headDisplay, 
gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, argv[k], 1, 
gedp->freesolid);
+           _dl_eraseAllNamesFromDisplay(gedp, argv[k], 1);
     }
 
     ret = GED_OK;

Modified: brlcad/trunk/src/libged/killtree/killtree.c
===================================================================
--- brlcad/trunk/src/libged/killtree/killtree.c 2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/killtree/killtree.c 2020-08-02 20:15:01 UTC (rev 
76646)
@@ -111,7 +111,7 @@
            bu_vls_printf(gktdp->gedp->ged_result_str, "%s ", dp->d_namep);
        }
     } else {
-       _dl_eraseAllNamesFromDisplay(gktdp->gedp->ged_gdp->gd_headDisplay, 
gktdp->gedp->ged_wdbp->dbip, gktdp->gedp->ged_free_vlist_callback, dp->d_namep, 
0, gktdp->gedp->freesolid);
+       _dl_eraseAllNamesFromDisplay(gktdp->gedp, dp->d_namep, 0);
 
        bu_vls_printf(gktdp->gedp->ged_result_str, "KILL %s:  %s\n",
                      (dp->d_flags & RT_DIR_COMB) ? "COMB" : "Solid",

Modified: brlcad/trunk/src/libged/mater/mater.cpp
===================================================================
--- brlcad/trunk/src/libged/mater/mater.cpp     2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/mater/mater.cpp     2020-08-02 20:15:01 UTC (rev 
76646)
@@ -390,7 +390,7 @@
     }
 
     // As a first cut, do a fault intolerant read - if there are any problems 
we want to know
-    if (_ged_read_densities(&a, &dsource, gedp, densities_filename, 0) == 
GED_ERROR) {
+    if (_ged_read_densities(&a, &dsource, gedp, densities_filename, 0) & 
GED_ERROR) {
        a = NULL;
     }
 

Modified: brlcad/trunk/src/libged/metaball/metaball.c
===================================================================
--- brlcad/trunk/src/libged/metaball/metaball.c 2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/metaball/metaball.c 2020-08-02 20:15:01 UTC (rev 
76646)
@@ -149,7 +149,7 @@
     /* convert from double to fastf_t */
     VMOVE(model_pt, scan);
 
-    if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], 
gedp->ged_wdbp, mat) == GED_ERROR)
+    if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], 
gedp->ged_wdbp, mat) & GED_ERROR)
        return GED_ERROR;
 
     nearest = find_metaball_pnt_nearest_pnt(&((struct rt_metaball_internal 
*)intern.idb_ptr)->metaball_ctrl_head,

Modified: brlcad/trunk/src/libged/move_arb_edge/move_arb_edge.c
===================================================================
--- brlcad/trunk/src/libged/move_arb_edge/move_arb_edge.c       2020-08-02 
19:53:00 UTC (rev 76645)
+++ brlcad/trunk/src/libged/move_arb_edge/move_arb_edge.c       2020-08-02 
20:15:01 UTC (rev 76646)
@@ -102,7 +102,7 @@
        return GED_ERROR;
     }
 
-    if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], 
gedp->ged_wdbp, mat) == GED_ERROR)
+    if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], 
gedp->ged_wdbp, mat) & GED_ERROR)
        return GED_ERROR;
 
     if (intern.idb_major_type != DB5_MAJORTYPE_BRLCAD ||

Modified: brlcad/trunk/src/libged/move_arb_face/move_arb_face.c
===================================================================
--- brlcad/trunk/src/libged/move_arb_face/move_arb_face.c       2020-08-02 
19:53:00 UTC (rev 76645)
+++ brlcad/trunk/src/libged/move_arb_face/move_arb_face.c       2020-08-02 
20:15:01 UTC (rev 76646)
@@ -126,7 +126,7 @@
        return GED_ERROR;
     }
 
-    if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], 
gedp->ged_wdbp, mat) == GED_ERROR)
+    if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], 
gedp->ged_wdbp, mat) & GED_ERROR)
        return GED_ERROR;
 
     if (intern.idb_major_type != DB5_MAJORTYPE_BRLCAD ||

Modified: brlcad/trunk/src/libged/ocenter/ocenter.c
===================================================================
--- brlcad/trunk/src/libged/ocenter/ocenter.c   2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/ocenter/ocenter.c   2020-08-02 20:15:01 UTC (rev 
76646)
@@ -68,7 +68,7 @@
      * One of the get bounds routines needs to be fixed to
      * work with all cases. In the meantime...
      */
-    if (_ged_get_obj_bounds2(gedp, 1, argv+1, &gtd, rpp_min, rpp_max) == 
GED_ERROR)
+    if (_ged_get_obj_bounds2(gedp, 1, argv+1, &gtd, rpp_min, rpp_max) & 
GED_ERROR)
        return GED_ERROR;
 
     dp = gtd.gtd_obj[gtd.gtd_objpos-1];

Modified: brlcad/trunk/src/libged/orotate/orotate.c
===================================================================
--- brlcad/trunk/src/libged/orotate/orotate.c   2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/orotate/orotate.c   2020-08-02 20:15:01 UTC (rev 
76646)
@@ -85,7 +85,7 @@
     if (argc == 5) {
        /* Use the object's center as the keypoint. */
 
-       if (_ged_get_obj_bounds2(gedp, 1, argv+1, &gtd, rpp_min, rpp_max) == 
GED_ERROR)
+       if (_ged_get_obj_bounds2(gedp, 1, argv+1, &gtd, rpp_min, rpp_max) & 
GED_ERROR)
            return GED_ERROR;
 
        dp = gtd.gtd_obj[gtd.gtd_objpos-1];

Modified: brlcad/trunk/src/libged/oscale/oscale.c
===================================================================
--- brlcad/trunk/src/libged/oscale/oscale.c     2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/oscale/oscale.c     2020-08-02 20:15:01 UTC (rev 
76646)
@@ -75,7 +75,7 @@
     }
 
     if (argc == 3) {
-       if (_ged_get_obj_bounds2(gedp, 1, argv+1, &gtd, rpp_min, rpp_max) == 
GED_ERROR)
+       if (_ged_get_obj_bounds2(gedp, 1, argv+1, &gtd, rpp_min, rpp_max) & 
GED_ERROR)
            return GED_ERROR;
 
        dp = gtd.gtd_obj[gtd.gtd_objpos-1];

Modified: brlcad/trunk/src/libged/otranslate/otranslate.c
===================================================================
--- brlcad/trunk/src/libged/otranslate/otranslate.c     2020-08-02 19:53:00 UTC 
(rev 76645)
+++ brlcad/trunk/src/libged/otranslate/otranslate.c     2020-08-02 20:15:01 UTC 
(rev 76646)
@@ -63,7 +63,7 @@
        return GED_ERROR;
     }
 
-    if (_ged_get_obj_bounds2(gedp, 1, argv+1, &gtd, rpp_min, rpp_max) == 
GED_ERROR)
+    if (_ged_get_obj_bounds2(gedp, 1, argv+1, &gtd, rpp_min, rpp_max) & 
GED_ERROR)
        return GED_ERROR;
 
     dp = gtd.gtd_obj[gtd.gtd_objpos-1];

Modified: brlcad/trunk/src/libged/pipe/pipe.c
===================================================================
--- brlcad/trunk/src/libged/pipe/pipe.c 2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/src/libged/pipe/pipe.c 2020-08-02 20:15:01 UTC (rev 76646)
@@ -191,7 +191,7 @@
     /* convert from double to fastf_t */
     VMOVE(model_pt, scan);
 
-    if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], 
gedp->ged_wdbp, mat) == GED_ERROR)
+    if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], 
gedp->ged_wdbp, mat) & GED_ERROR)
        return GED_ERROR;
 
     nearest = find_pipe_pnt_nearest_pnt(&((struct rt_pipe_internal 
*)intern.idb_ptr)->pipe_segs_head,

Modified: brlcad/trunk/src/libged/pipe.c
===================================================================
--- brlcad/trunk/src/libged/pipe.c      2020-08-02 19:53:00 UTC (rev 76645)
+++ brlcad/trunk/src/libged/pipe.c      2020-08-02 20:15:01 UTC (rev 76646)
@@ -628,7 +628,7 @@
     /* convert from double to fastf_t */
     VMOVE(view_ps_pt, scan);
 
-    if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], 
gedp->ged_wdbp, mat) == GED_ERROR)
+    if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], 
gedp->ged_wdbp, mat) & GED_ERROR)
        return GED_ERROR;
 
     if (intern.idb_major_type != DB5_MAJORTYPE_BRLCAD ||

Modified: brlcad/trunk/src/libged/polyclip.cpp
===================================================================
--- brlcad/trunk/src/libged/polyclip.cpp        2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/polyclip.cpp        2020-08-02 20:15:01 UTC (rev 
76646)
@@ -158,7 +158,7 @@
     struct contour_node *curr_cnode;
     struct bg_polygon *gpp;
 
-    if (wdb_import_from_path(gedp->ged_result_str, &intern, sname, 
gedp->ged_wdbp) == GED_ERROR)
+    if (wdb_import_from_path(gedp->ged_result_str, &intern, sname, 
gedp->ged_wdbp) & GED_ERROR)
        return (struct bg_polygon *)0;
 
     sketch_ip = (rt_sketch_internal *)intern.idb_ptr;


Property changes on: brlcad/trunk/src/libged/polyclip.cpp
___________________________________________________________________
Modified: svn:mergeinfo
## -1,7 +1,7 ##
 
/brlcad/branches/RELEASE/src/libged/polyclip/polyclip.cpp:57439,57447-57860,69901-69913,70323-70333,71915-72242,72525-72534,72826-72858,74376-74454,74964-75140,75372-75685
 
/brlcad/branches/RELEASE/src/libged/polyclip.cpp:57439,57447-57860,69901-69913,70323-70333,71915-72242,72525-72534,72826-72858,74376-74454,74964-75140,75372-75685,76001-76451
 
/brlcad/branches/bioh/src/libged/polyclip/polyclip.cpp:75720-75736,75740-75742,75860-75891,75894-75986,76088-76153,76360-76365
-/brlcad/branches/bioh/src/libged/polyclip.cpp:75720-75736,75740-75742,75860-75891,75894-75986,76088-76153,76355-76365,76368-76376
+/brlcad/branches/bioh/src/libged/polyclip.cpp:75720-75736,75740-75742,75860-75891,75894-75986,76088-76153,76354-76365,76368-76376,76506
 
/brlcad/branches/brep-debug/src/libged/polyclip/polyclip.cpp:61373,61375,61404,61427,61429,61470,61544,61567,61576,61999,62018,62094,62098,62107,62117,62406,62416-62519,62521-62584,62593-62614,62623,62658,62660-62674,62681-62771,62876,62901,62907,62910,62925,62928,62931-63025,63027,63051,63054-63056,63069,63071-63073,63122,63160-63161,63165,63171,63184,63187,63189-63190,63193-63196,63200,63202,63205-63210,63213,63219-63225,63232-63233,63236,63238,63338,63350-63353,63481,63618,63669,64173-64174,64176-64177,64229-64233,64242,64244,64360-64362,65165,65245,65249,65334,65833-65834,66370-66375,66931-66932,66934,67012-67015,67018-67019,67021-67022,67406,67740,67746-67748,67950,67952,68144-68145,68636,68640-68643,68820,69081,69109,69168,69206,69289,69346,69460-69461,69582-69583,69719-69721,69857-69859,69927,69995-69996,70148-70149,70347-70349,70377,70526-70527,71006-71007,71009-71022,71046-71047,71049,71096-71100
 
/brlcad/branches/brep-debug/src/libged/polyclip.cpp:61373,61375,61404,61427,61429,61470,61544,61567,61576,61999,62018,62094,62098,62107,62117,62406,62416-62519,62521-62584,62593-62614,62623,62658,62660-62674,62681-62771,62876,62901,62907,62910,62925,62928,62931-63025,63027,63051,63054-63056,63069,63071-63073,63122,63160-63161,63165,63171,63184,63187,63189-63190,63193-63196,63200,63202,63205-63210,63213,63219-63225,63232-63233,63236,63238,63338,63350-63353,63481,63618,63669,64173-64174,64176-64177,64229-64233,64242,64244,64360-64362,65165,65245,65249,65334,65833-65834,66370-66375,66931-66932,66934,67012-67015,67018-67019,67021-67022,67406,67740,67746-67748,67950,67952,68144-68145,68636,68640-68643,68820,69081,69109,69168,69206,69289,69346,69460-69461,69582-69583,69719-69721,69857-69859,69927,69995-69996,70148-70149,70347-70349,70377,70526-70527,71006-71007,71009-71022,71046-71047,71049,71096-71100
 /brlcad/branches/bullet/src/libged/polyclip/polyclip.cpp:62518
Modified: brlcad/trunk/src/libged/process/process.c
===================================================================
--- brlcad/trunk/src/libged/process/process.c   2020-08-02 19:53:00 UTC (rev 
76645)
+++ brlcad/trunk/src/libged/process/process.c   2020-08-02 20:15:01 UTC (rev 
76646)
@@ -57,7 +57,8 @@
     unsigned int longest_pid = 0;
 
     /* Find the largest pid we'll have to print */
-    for (BU_LIST_FOR(rrp, ged_subprocess, &gedp->gd_headSubprocess.l)) {
+    for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_subp); i++) {
+       rrp = (struct ged_subprocess *)BU_PTBL_GET(&gedp->ged_subp, i);
        int pid = bu_process_pid(rrp->p);
        bu_vls_sprintf(&pid_str, "%d", pid);
        longest_pid = (bu_vls_strlen(&pid_str) > longest_pid) ? 
bu_vls_strlen(&pid_str) : longest_pid;
@@ -65,7 +66,8 @@
     bu_vls_free(&pid_str);
 
     /* For each process print a line */
-    for (BU_LIST_FOR(rrp, ged_subprocess, &gedp->gd_headSubprocess.l)) {
+    for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_subp); i++) {
+       rrp = (struct ged_subprocess *)BU_PTBL_GET(&gedp->ged_subp, i);
        struct bu_vls pline = BU_VLS_INIT_ZERO;
        struct bu_vls cmdroot = BU_VLS_INIT_ZERO;
        const char * const *argv;
@@ -73,8 +75,8 @@
        int pid = bu_process_pid(rrp->p);
        (void)bu_path_component(&cmdroot, argv[0], BU_PATH_BASENAME_EXTLESS);
        bu_vls_sprintf(&pline, "%*d %s", longest_pid, pid, 
bu_vls_cstr(&cmdroot));

@@ Diff output truncated at 100000 characters. @@
This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
BRL-CAD Source Commits mailing list
brlcad-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to