Revision: 76666
          http://sourceforge.net/p/brlcad/code/76666
Author:   starseeker
Date:     2020-08-06 14:53:49 +0000 (Thu, 06 Aug 2020)
Log Message:
-----------
Make a stab at pushing down the DM-specific event functions into libdm.  The 
dirty flag needs more attention - as MGED is using it, the scope appears to be 
all DMs rather than each individual instance, and there's no internal 'this DM 
is no longer dirty' reset post-draw at the moment (as one would expect for a DM 
scoped flag of this sort.)  Need to better understand the relationship between 
DMP, stuct dm_list, and how it should or shouldn't relate to bview.

Modified Paths:
--------------
    brlcad/trunk/include/dm.h
    brlcad/trunk/src/libdm/X/dm-X.c
    brlcad/trunk/src/libdm/dm-generic.c
    brlcad/trunk/src/libdm/glx/dm-ogl.c
    brlcad/trunk/src/libdm/include/calltable.h
    brlcad/trunk/src/libdm/null/dm-Null.c
    brlcad/trunk/src/libdm/null/dm-Null.h
    brlcad/trunk/src/libdm/osgl/dm-osgl.cpp
    brlcad/trunk/src/libdm/plot/dm-plot.c
    brlcad/trunk/src/libdm/postscript/dm-ps.c
    brlcad/trunk/src/libdm/qt/dm-qt.cpp
    brlcad/trunk/src/libdm/tk/dm-tk.c
    brlcad/trunk/src/libdm/txt/dm-txt.c
    brlcad/trunk/src/libdm/wgl/dm-wgl.c
    brlcad/trunk/src/mged/attach.c
    brlcad/trunk/src/mged/cmd.c
    brlcad/trunk/src/mged/doevent.c
    brlcad/trunk/src/mged/mged.h
    brlcad/trunk/src/mged/mged_dm.h

Modified: brlcad/trunk/include/dm.h
===================================================================
--- brlcad/trunk/include/dm.h   2020-08-06 13:14:22 UTC (rev 76665)
+++ brlcad/trunk/include/dm.h   2020-08-06 14:53:49 UTC (rev 76666)
@@ -201,6 +201,9 @@
 DM_EXPORT extern int dm_set_fg(struct dm *dmp, unsigned char r, unsigned char 
g, unsigned char b, int strict, fastf_t transparency);
 DM_EXPORT extern int dm_reshape(struct dm *dmp, int width, int height);
 DM_EXPORT extern int dm_make_current(struct dm *dmp);
+DM_EXPORT extern int dm_doevent(struct dm *dmp, void *clientData, void 
*eventPtr);
+DM_EXPORT extern int dm_get_dirty(struct dm *dmp);
+DM_EXPORT extern void dm_set_dirty(struct dm *dmp, int i);
 DM_EXPORT extern vect_t *dm_get_clipmin(struct dm *dmp);
 DM_EXPORT extern vect_t *dm_get_clipmax(struct dm *dmp);
 DM_EXPORT extern int dm_get_bound_flag(struct dm *dmp);

Modified: brlcad/trunk/src/libdm/X/dm-X.c
===================================================================
--- brlcad/trunk/src/libdm/X/dm-X.c     2020-08-06 13:14:22 UTC (rev 76665)
+++ brlcad/trunk/src/libdm/X/dm-X.c     2020-08-06 14:53:49 UTC (rev 76666)
@@ -157,6 +157,18 @@
     return 0;
 }
 
+HIDDEN int
+X_doevent(struct dm *dmp, void *UNUSED(vclientData), void *veventPtr)
+{
+    XEvent *eventPtr= (XEvent *)veventPtr;
+    if (eventPtr->type == Expose && eventPtr->xexpose.count == 0) {
+        dm_set_dirty(dmp, 1);
+        /* no further processing for this event */
+        return TCL_RETURN;
+    }
+    /* allow further processing of this event */
+    return TCL_OK;
+}
 
 HIDDEN int
 X_configureWin_guts(struct dm *dmp, int force)
@@ -2095,6 +2107,7 @@
     X_getDisplayImage, /* display to image function */
     X_reshape,
     null_makeCurrent,
+    X_doevent,
     X_openFb,
     NULL,
     NULL,
@@ -2113,9 +2126,10 @@
     1,                         /* bound flag */
     "X",
     "X Window System (X11)",
-    1,
-    0,
-    0,
+    1, /* top */
+    0, /* width */
+    0, /* height */
+    0, /* dirty */
     0, /* bytes per pixel */
     0, /* bits per channel */
     0,

Modified: brlcad/trunk/src/libdm/dm-generic.c
===================================================================
--- brlcad/trunk/src/libdm/dm-generic.c 2020-08-06 13:14:22 UTC (rev 76665)
+++ brlcad/trunk/src/libdm/dm-generic.c 2020-08-06 14:53:49 UTC (rev 76666)
@@ -304,6 +304,27 @@
     return dmp->i->dm_makeCurrent(dmp);
 }
 
+int
+dm_doevent(struct dm *dmp, void *clientData, void *eventPtr)
+{
+    if (UNLIKELY(!dmp)) return 0;
+    return dmp->i->dm_doevent(dmp, clientData, eventPtr);
+}
+
+int
+dm_get_dirty(struct dm *dmp)
+{
+    if (UNLIKELY(!dmp)) return 0;
+    return dmp->i->dm_dirty;
+}
+
+void
+dm_set_dirty(struct dm *dmp, int i)
+{
+    if (UNLIKELY(!dmp)) return;
+    dmp->i->dm_dirty = i;
+}
+
 vect_t *
 dm_get_clipmin(struct dm *dmp)
 {

Modified: brlcad/trunk/src/libdm/glx/dm-ogl.c
===================================================================
--- brlcad/trunk/src/libdm/glx/dm-ogl.c 2020-08-06 13:14:22 UTC (rev 76665)
+++ brlcad/trunk/src/libdm/glx/dm-ogl.c 2020-08-06 14:53:49 UTC (rev 76666)
@@ -416,6 +416,19 @@
     return BRLCAD_OK;
 }
 
+HIDDEN int
+ogl_doevent(struct dm *dmp, void *UNUSED(vclientData), void *veventPtr)
+{
+    XEvent *eventPtr= (XEvent *)veventPtr;
+    if (eventPtr->type == Expose && eventPtr->xexpose.count == 0) {
+       (void)dm_make_current(dmp);
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+       dm_set_dirty(dmp, 1);
+       return TCL_OK;
+    }
+    /* allow further processing of this event */
+    return TCL_OK;
+}
 
 HIDDEN int
 ogl_configureWin(struct dm *dmp, int force)
@@ -3032,6 +3045,7 @@
     ogl_getDisplayImage, /* display to image function */
     ogl_reshape,
     ogl_makeCurrent,
+    ogl_doevent,
     ogl_openFb,
     ogl_get_internal,
     ogl_put_internal,
@@ -3050,9 +3064,10 @@
     1,                         /* bound flag */
     "ogl",
     "X Windows with OpenGL graphics",
-    1,
-    0,
-    0,
+    1, /* top */
+    0, /* width */
+    0, /* height */
+    0, /* dirty */
     0, /* bytes per pixel */
     0, /* bits per channel */
     0,

Modified: brlcad/trunk/src/libdm/include/calltable.h
===================================================================
--- brlcad/trunk/src/libdm/include/calltable.h  2020-08-06 13:14:22 UTC (rev 
76665)
+++ brlcad/trunk/src/libdm/include/calltable.h  2020-08-06 14:53:49 UTC (rev 
76666)
@@ -96,6 +96,7 @@
     int (*dm_getDisplayImage)(struct dm *dmp, unsigned char **image);  /**< 
@brief (0,0) is upper left pixel */
     int (*dm_reshape)(struct dm *dmp, int width, int height);
     int (*dm_makeCurrent)(struct dm *dmp);
+    int (*dm_doevent)(struct dm *dmp, void *clientData, void *eventPtr);
     int (*dm_openFb)(struct dm *dmp);
     int (*dm_get_internal)(struct dm *dmp);
     int (*dm_put_internal)(struct dm *dmp);
@@ -117,6 +118,7 @@
     int dm_top;                   /**< @brief !0 means toplevel window */
     int dm_width;
     int dm_height;
+    int dm_dirty;
     int dm_bytes_per_pixel;
     int dm_bits_per_channel;  /* bits per color channel */
     int dm_lineWidth;

Modified: brlcad/trunk/src/libdm/null/dm-Null.c
===================================================================
--- brlcad/trunk/src/libdm/null/dm-Null.c       2020-08-06 13:14:22 UTC (rev 
76665)
+++ brlcad/trunk/src/libdm/null/dm-Null.c       2020-08-06 14:53:49 UTC (rev 
76666)
@@ -293,6 +293,11 @@
     return 0;
 }
 
+int
+null_doevent(struct dm *UNUSED(dmp), void *UNUSED(clientData), void 
*UNUSED(eventPtr))
+{
+    return 0;
+}
 
 int
 null_openFb(struct dm *UNUSED(dmp))
@@ -341,6 +346,7 @@
     null_getDisplayImage,
     null_reshape,
     null_makeCurrent,
+    null_doevent,
     null_openFb,
     NULL,
     NULL,
@@ -362,6 +368,7 @@
     0,/* top */
     0,/* width */
     0,/* height */
+    0,/* dirty */
     0,/* bytes per pixel */
     0,/* bits per channel */
     0,

Modified: brlcad/trunk/src/libdm/null/dm-Null.h
===================================================================
--- brlcad/trunk/src/libdm/null/dm-Null.h       2020-08-06 13:14:22 UTC (rev 
76665)
+++ brlcad/trunk/src/libdm/null/dm-Null.h       2020-08-06 14:53:49 UTC (rev 
76666)
@@ -194,6 +194,10 @@
 null_makeCurrent(struct dm *dmp);
 
 
+DM_NULL_EXPORT extern int
+null_doevent(struct dm *dmp, void *clientData, void *eventPtr);
+
+
 DM_NULL_EXPORT extern void
 null_processEvents(struct dm *dmp);
 

Modified: brlcad/trunk/src/libdm/osgl/dm-osgl.cpp
===================================================================
--- brlcad/trunk/src/libdm/osgl/dm-osgl.cpp     2020-08-06 13:14:22 UTC (rev 
76665)
+++ brlcad/trunk/src/libdm/osgl/dm-osgl.cpp     2020-08-06 14:53:49 UTC (rev 
76666)
@@ -305,6 +305,19 @@
     return TCL_OK;
 }
 
+HIDDEN int
+osgl_doevent(struct dm *dmp, void *UNUSED(vclientData), void *veventPtr)
+{
+    XEvent *eventPtr= (XEvent *)veventPtr;
+    if (eventPtr->type == Expose && eventPtr->xexpose.count == 0) {
+        (void)dm_make_current(dmp);
+        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+        dm_set_dirty(dmp, 1);
+        return TCL_OK;
+    }
+    /* allow further processing of this event */
+    return TCL_OK;
+}
 
 HIDDEN int
 osgl_configureWin(struct dm *dmp, int force)
@@ -2682,6 +2695,7 @@
     osgl_getDisplayImage, /* display to image function */
     osgl_reshape,
     osgl_makeCurrent,
+    osgl_doevent,
     osgl_openFb,
     osgl_get_internal,
     osgl_put_internal,
@@ -2700,9 +2714,10 @@
     1,                         /* bound flag */
     "osgl",
     "OpenGL graphics via OpenSceneGraph",
-    1,
-    0,
-    0,
+    1, /* top */
+    0, /* width */
+    0, /* height */
+    0, /* dirty */
     0, /* bytes per pixel */
     0, /* bits per channel */
     0,

Modified: brlcad/trunk/src/libdm/plot/dm-plot.c
===================================================================
--- brlcad/trunk/src/libdm/plot/dm-plot.c       2020-08-06 13:14:22 UTC (rev 
76665)
+++ brlcad/trunk/src/libdm/plot/dm-plot.c       2020-08-06 14:53:49 UTC (rev 
76666)
@@ -704,6 +704,7 @@
     null_getDisplayImage,      /* display to image function */
     null_reshape,
     null_makeCurrent,
+    null_doevent,
     null_openFb,
     NULL,
     NULL,
@@ -722,9 +723,10 @@
     1,                         /* bound flag */
     "plot",
     "Screen to UNIX-Plot",
-    0,
-    0,
-    0,
+    0, /* top */
+    0, /* width */
+    0, /* height */
+    0, /* dirty */
     0, /* bytes per pixel */
     0, /* bits per channel */
     0,

Modified: brlcad/trunk/src/libdm/postscript/dm-ps.c
===================================================================
--- brlcad/trunk/src/libdm/postscript/dm-ps.c   2020-08-06 13:14:22 UTC (rev 
76665)
+++ brlcad/trunk/src/libdm/postscript/dm-ps.c   2020-08-06 14:53:49 UTC (rev 
76666)
@@ -773,6 +773,7 @@
     null_getDisplayImage,      /* display to image function */
     null_reshape,
     null_makeCurrent,
+    null_doevent,
     null_openFb,
     NULL,
     NULL,
@@ -791,9 +792,10 @@
     1,                         /* bound flag */
     "ps",
     "Screen to PostScript",
-    0,
-    0,
-    0,
+    0, /* top */
+    0, /* width */
+    0, /* height */
+    0, /* dirty */
     0, /* bytes per pixel */
     0, /* bits per channel */
     0,

Modified: brlcad/trunk/src/libdm/qt/dm-qt.cpp
===================================================================
--- brlcad/trunk/src/libdm/qt/dm-qt.cpp 2020-08-06 13:14:22 UTC (rev 76665)
+++ brlcad/trunk/src/libdm/qt/dm-qt.cpp 2020-08-06 14:53:49 UTC (rev 76666)
@@ -1347,6 +1347,7 @@
     qt_getDisplayImage,
     qt_reshape,
     null_makeCurrent,
+    null_doevent,
     qt_openFb,
     NULL,
     NULL,
@@ -1368,6 +1369,7 @@
     1,
     0,/* width */
     0,/* height */
+    0,/* dirty */
     0,/* bytes per pixel */
     0,/* bits per channel */
     0,

Modified: brlcad/trunk/src/libdm/tk/dm-tk.c
===================================================================
--- brlcad/trunk/src/libdm/tk/dm-tk.c   2020-08-06 13:14:22 UTC (rev 76665)
+++ brlcad/trunk/src/libdm/tk/dm-tk.c   2020-08-06 14:53:49 UTC (rev 76666)
@@ -1146,6 +1146,7 @@
     null_getDisplayImage,      /* display to image function */
     null_reshape,
     null_makeCurrent,
+    null_doevent,
     null_openFb,
     NULL,
     NULL,
@@ -1164,9 +1165,10 @@
     1,                         /* bound flag */
     "Tk",
     "Tcl/Tk Abstraction Layer",
-    1,
-    0,
-    0,
+    1, /* top */
+    0, /* width */
+    0, /* height */
+    0, /* dirty */
     0, /* bytes per pixel */
     0, /* bits per channel */
     0,

Modified: brlcad/trunk/src/libdm/txt/dm-txt.c
===================================================================
--- brlcad/trunk/src/libdm/txt/dm-txt.c 2020-08-06 13:14:22 UTC (rev 76665)
+++ brlcad/trunk/src/libdm/txt/dm-txt.c 2020-08-06 14:53:49 UTC (rev 76666)
@@ -341,6 +341,13 @@
 
 
 HIDDEN int
+txt_doevent(struct dm *UNUSED(dmp), void *UNUSED(vclientData), void 
*UNUSED(veventPtr))
+{
+    bu_log("doevent called\n");
+    return 0;
+}
+
+HIDDEN int
 txt_openFb(struct dm *UNUSED(dmp))
 {
     bu_log("openFb called\n");
@@ -388,6 +395,7 @@
     txt_getDisplayImage,
     txt_reshape,
     txt_makeCurrent,
+    txt_doevent,
     txt_openFb,
     NULL,
     NULL,
@@ -409,6 +417,7 @@
     0,/* top */
     0,/* width */
     0,/* height */
+    0,/* dirty */
     0,/* bytes per pixel */
     0,/* bits per channel */
     0,

Modified: brlcad/trunk/src/libdm/wgl/dm-wgl.c
===================================================================
--- brlcad/trunk/src/libdm/wgl/dm-wgl.c 2020-08-06 13:14:22 UTC (rev 76665)
+++ brlcad/trunk/src/libdm/wgl/dm-wgl.c 2020-08-06 14:53:49 UTC (rev 76666)
@@ -1786,7 +1786,26 @@
     return BRLCAD_OK;
 }
 
+HIDDEN int
+wgl_doevent(struct dm *dmp, void *UNUSED(vclientData), void *veventPtr)
+{
+    XEvent *eventPtr= (XEvent *)veventPtr;
+    if (!dm_make_current(dmp))
+        /* allow further processing of this event */
+        return TCL_OK;
 
+    if (eventPtr->type == Expose && eventPtr->xexpose.count == 0) {
+        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+        dm_set_dirty(dmp, 1);
+        /* no further processing for this event */
+        return TCL_RETURN;
+    }
+    /* allow further processing of this event */
+    return TCL_OK;
+}
+
+
 HIDDEN int
 wgl_configureWin(struct dm *dmp, int force)
 {
@@ -2312,6 +2331,7 @@
     wgl_getDisplayImage,       /* display to image function */
     wgl_reshape,
     wgl_makeCurrent,
+    wgl_doevent,
     wgl_openFb,
     wgl_get_internal,
     wgl_put_internal,
@@ -2330,9 +2350,10 @@
     1,                         /* bound flag */
     "wgl",
     "Windows with OpenGL graphics",
-    1,
-    0,
-    0,
+    1, /* top */
+    0, /* width */
+    0, /* height */
+    0, /* dirty */
     0, /* bytes per pixel */
     0, /* bits per channel */
     1,

Modified: brlcad/trunk/src/mged/attach.c
===================================================================
--- brlcad/trunk/src/mged/attach.c      2020-08-06 13:14:22 UTC (rev 76665)
+++ brlcad/trunk/src/mged/attach.c      2020-08-06 14:53:49 UTC (rev 76666)
@@ -83,124 +83,6 @@
     }
 }
 
-#ifdef DM_OGL
-static int
-ogl_doevent(void *UNUSED(vclientData), void *veventPtr)
-{
-    /*ClientData clientData = (ClientData)vclientData;*/
-    XEvent *eventPtr= (XEvent *)veventPtr;
-    if (eventPtr->type == Expose && eventPtr->xexpose.count == 0) {
-       (void)dm_make_current(DMP);
-       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-       dirty = 1;
-       return TCL_OK;
-    }
-    /* allow further processing of this event */
-    return TCL_OK;
-}
-#endif
-
-#ifdef DM_OSGL
-static int
-osgl_doevent(void *UNUSED(vclientData), void *veventPtr)
-{
-    /*ClientData clientData = (ClientData)vclientData;*/
-    XEvent *eventPtr= (XEvent *)veventPtr;
-    if (eventPtr->type == Expose && eventPtr->xexpose.count == 0) {
-       (void)dm_make_current(DMP);
-       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-       dirty = 1;
-       return TCL_OK;
-    }
-    /* allow further processing of this event */
-    return TCL_OK;
-}
-#endif
-
-#ifdef DM_WGL
-/* TODO - is there a reason the dm_make_current is outside the
- * if clause on Windows but not elsewhere? */
-static int
-wgl_doevent(void *UNUSED(vclientData), void *veventPtr)
-{
-    /*ClientData clientData = (ClientData)vclientData;*/
-    XEvent *eventPtr= (XEvent *)veventPtr;
-    if (!dm_make_current(DMP))
-       /* allow further processing of this event */
-       return TCL_OK;
-
-    if (eventPtr->type == Expose && eventPtr->xexpose.count == 0) {
-       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-       dirty = 1;
-       /* no further processing for this event */
-       return TCL_RETURN;
-    }
-    /* allow further processing of this event */
-    return TCL_OK;
-}
-#endif
-
-#if defined(HAVE_TK)
-static int
-x_doevent(void *UNUSED(vclientData), void *veventPtr)
-{
-    /*ClientData clientData = (ClientData)vclientData;*/
-    XEvent *eventPtr= (XEvent *)veventPtr;
-    if (eventPtr->type == Expose && eventPtr->xexpose.count == 0) {
-
-       dirty = 1;
-       /* no further processing for this event */
-       return TCL_RETURN;
-    }
-    /* allow further processing of this event */
-    return TCL_OK;
-}
-#endif
-
-typedef int (*eventfptr)();
-
-struct w_dm which_dm[] = {
-    { "plot", NULL},  /* DM_PLOT_INDEX defined in mged_dm.h */
-    { "ps", NULL},      /* DM_PS_INDEX defined in mged_dm.h */
-    { "txt", NULL},
-#ifdef DM_X
-    { "X", x_doevent },
-#endif /* DM_X */
-#ifdef DM_TK
-    { "tk", NULL},
-#endif /* DM_TK */
-#ifdef DM_WGL
-    { "wgl", wgl_doevent },
-#endif /* DM_WGL */
-#ifdef DM_OGL
-#  if defined(HAVE_TK)
-    { "ogl", ogl_doevent },
-#  endif
-#endif /* DM_OGL */
-#ifdef DM_OSGL
-#  if defined(HAVE_TK)
-    { "osgl", osgl_doevent },
-#  endif
-#endif /* DM_OSGL */
-#ifdef DM_QT
-    { "qt", x_doevent },
-#endif /* DM_QT */
-    { (char *)NULL, (int (*)())NULL}
-};
-
-static eventfptr
-dm_doevent(const char *dm_type) {
-    int i = 0;
-    while (which_dm[i].name != NULL) {
-       if (dm_type == which_dm[i].name) {
-           return which_dm[i].doevent;
-       }
-       i++;
-    }
-    return NULL;
-}
-
 int
 mged_dm_init(struct dm_list *o_dm_list,
        const char *dm_type,
@@ -225,9 +107,6 @@
     dm_set_vp(DMP, &view_state->vs_gvp->gv_scale);
     dm_set_perspective(DMP, mged_variables->mv_perspective_mode);
 
-    /* TODO - look up event handler based on dm_type */
-    eventHandler = dm_doevent(dm_type);
-
 #ifdef HAVE_TK
     Tk_CreateGenericHandler(doEvent, (ClientData)NULL);
 #endif
@@ -431,8 +310,6 @@
 int
 f_attach(ClientData UNUSED(clientData), Tcl_Interp *interpreter, int argc, 
const char *argv[])
 {
-    struct w_dm *wp;
-
     if (argc < 2) {
        struct bu_vls vls = BU_VLS_INIT_ZERO;
 
@@ -449,18 +326,13 @@
        return TCL_OK;
     }
 
-    /* Look at last argument, skipping over any options which precede it */
-    for (wp = &which_dm[2]; wp->name != NULL; wp++)
-       if (BU_STR_EQUAL(argv[argc - 1], wp->name))
-           break;
-
-    if (wp->name == NULL) {
+    if (!dm_valid_type(argv[argc-1], NULL)) {
        Tcl_AppendResult(interpreter, "attach(", argv[argc - 1], "): BAD\n", 
(char *)NULL);
        print_valid_dm(interpreter);
        return TCL_ERROR;
     }
 
-    return mged_attach(wp, argc, argv);
+    return mged_attach(argv[argc - 1], argc, argv);
 }
 
 
@@ -541,13 +413,13 @@
 
 
 int
-mged_attach(struct w_dm *wp, int argc, const char *argv[])
+mged_attach(const char *wp_name, int argc, const char *argv[])
 {
     int opt_argc;
     char **opt_argv;
     struct dm_list *o_dm_list;
 
-    if (!wp) {
+    if (!wp_name) {
        return TCL_ERROR;
     }
 
@@ -559,7 +431,7 @@
     predictor_init();
 
     /* Only need to do this once */
-    if (tkwin == NULL && NEED_GUI(wp->name)) {
+    if (tkwin == NULL && NEED_GUI(wp_name)) {
        struct dm *tmp_dmp;
        struct bu_vls tmp_vls = BU_VLS_INIT_ZERO;
 
@@ -593,11 +465,11 @@
 
     BU_LIST_APPEND(&head_dm_list.l, &curr_dm_list->l);
 
-    if (!wp->name) {
+    if (!wp_name) {
        return TCL_ERROR;
     }
 
-    if (mged_dm_init(o_dm_list, wp->name, argc, argv) == TCL_ERROR) {
+    if (mged_dm_init(o_dm_list, wp_name, argc, argv) == TCL_ERROR) {
        goto Bad;
     }
 
@@ -650,24 +522,32 @@
 void
 get_attached(void)
 {
-    int argc;
-    const char *argv[3];
-    struct w_dm *wp = (struct w_dm *)NULL;
     int inflimit = 1000;
     int ret;
     struct bu_vls type = BU_VLS_INIT_ZERO;
 
+    struct bu_vls type_msg = BU_VLS_INIT_ZERO;
+    struct bu_vls *dm_types = dm_list_types(" ");
+    char **dms = (char **)bu_calloc(bu_vls_strlen(dm_types), sizeof(char *), 
"dm name array");
+    int nargc = bu_argv_from_string(dms, bu_vls_strlen(dm_types), 
bu_vls_addr(dm_types));
+
+    bu_vls_sprintf(&type_msg, "attach (nu");
+    for (int i = 0; i < nargc; i++) {
+       if (BU_STR_EQUAL(dms[i], "nu"))
+           continue;
+       if (BU_STR_EQUAL(dms[i], "plot"))
+           continue;
+       if (BU_STR_EQUAL(dms[i], "postscript"))
+           continue;
+       bu_vls_printf(&type_msg, " %s", dms[i]);
+    }
+    bu_vls_printf(&type_msg, ")[nu]? ");
+    bu_free(dms, "array");
+    bu_vls_free(dm_types);
+
     while (inflimit > 0) {
-       bu_vls_trunc(&type, 0);
-       bu_log("attach (nu");
+       bu_log("%s", bu_vls_cstr(&type_msg));
 
-       /* print all the available display manager types, skipping plot and ps 
*/
-       wp = &which_dm[2];
-       for (; wp->name != NULL; wp++) {
-           bu_log("|%s", wp->name);
-       }
-       bu_log(")[nu]? ");
-
        ret = bu_vls_gets(&type, stdin);
        if (ret < 0) {
            /* handle EOF */
@@ -685,13 +565,7 @@
        /* trim whitespace before comparisons (but not before checking empty) */
        bu_vls_trimspace(&type);
 
-       for (wp = &which_dm[2]; wp->name != NULL; wp++) {
-           if (BU_STR_EQUAL(bu_vls_addr(&type), wp->name)) {
-               break;
-           }
-       }
-
-       if (wp->name != NULL) {
+       if (dm_valid_type(bu_vls_cstr(&type), NULL)) {
            break;
        }
 
@@ -699,20 +573,23 @@
        inflimit--;
     }
 
-    bu_vls_free(&type);
+    bu_vls_free(&type_msg);
 
     if (inflimit <= 0) {
        bu_log("\nInfinite loop protection, attach aborted!\n");
+       bu_vls_free(&type);
        return;
     }
 
-    bu_log("Starting an %s display manager\n", wp->name);
+    bu_log("Starting an %s display manager\n", bu_vls_cstr(&type));
 
-    argc = 2;
+    int argc = 1;
+    const char *argv[3];
     argv[0] = "";
     argv[1] = "";
     argv[2] = (char *)NULL;
-    (void)mged_attach(wp, argc, argv);
+    (void)mged_attach(bu_vls_cstr(&type), argc, argv);
+    bu_vls_free(&type);
 }
 
 

Modified: brlcad/trunk/src/mged/cmd.c
===================================================================
--- brlcad/trunk/src/mged/cmd.c 2020-08-06 13:14:22 UTC (rev 76665)
+++ brlcad/trunk/src/mged/cmd.c 2020-08-06 14:53:49 UTC (rev 76666)
@@ -1442,7 +1442,7 @@
 
     dml = curr_dm_list;
     GEDP->ged_gvp = view_state->vs_gvp;
-    status = mged_attach(&which_dm[DM_PS_INDEX], argc, argv);
+    status = mged_attach("postscript", argc, argv);
     if (status == TCL_ERROR)
        return TCL_ERROR;
 

Modified: brlcad/trunk/src/mged/doevent.c
===================================================================
--- brlcad/trunk/src/mged/doevent.c     2020-08-06 13:14:22 UTC (rev 76665)
+++ brlcad/trunk/src/mged/doevent.c     2020-08-06 14:53:49 UTC (rev 76666)
@@ -133,12 +133,9 @@
        return TCL_OK;
     }
 
-    /* XXX - windows fix, for now */
-    if (eventHandler == NULL)
-       return TCL_CONTINUE;
-
     /* calling the display manager specific event handler */
-    status = eventHandler(clientData, eventPtr);
+    status = dm_doevent(DMP, clientData, eventPtr);
+    dirty = dm_get_dirty(DMP);
 
     /* no further processing of this event */
     if (status != TCL_OK) {

Modified: brlcad/trunk/src/mged/mged.h
===================================================================
--- brlcad/trunk/src/mged/mged.h        2020-08-06 13:14:22 UTC (rev 76665)
+++ brlcad/trunk/src/mged/mged.h        2020-08-06 14:53:49 UTC (rev 76666)
@@ -76,12 +76,10 @@
 /* Needed to define struct menu_item */
 #include "./menu.h"
 
-/* Needed to define struct w_dm */
-#include "./mged_dm.h"
-
 /* Needed to define struct solid */
 #include "rt/solid.h"
 
+#include "./mged_dm.h" /* _view_state */
 
 #define MGED_DB_NAME "db"
 #define MGED_INMEM_NAME ".inmem"
@@ -449,7 +447,7 @@
 
 /* attach.c */
 int is_dm_null(void);
-int mged_attach(struct w_dm *wp, int argc, const char *argv[]);
+int mged_attach(const char *wp_name, int argc, const char *argv[]);
 void mged_link_vars(struct dm_list *p);
 void mged_slider_free_vls(struct dm_list *p);
 int gui_setup(const char *dstr);

Modified: brlcad/trunk/src/mged/mged_dm.h
===================================================================
--- brlcad/trunk/src/mged/mged_dm.h     2020-08-06 13:14:22 UTC (rev 76665)
+++ brlcad/trunk/src/mged/mged_dm.h     2020-08-06 14:53:49 UTC (rev 76666)
@@ -589,12 +589,6 @@
 /* defined in setup.c */
 extern void mged_rtCmdNotify();
 
-struct w_dm {
-    char *name;
-    int        (*doevent)();
-};
-extern struct w_dm which_dm[];  /* defined in attach.c */
-
 /* indices into which_dm[] */
 #define DM_PLOT_INDEX 0
 #define DM_PS_INDEX 1

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to