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