Revision: 75498
          http://sourceforge.net/p/brlcad/code/75498
Author:   starseeker
Date:     2020-04-21 17:16:59 +0000 (Tue, 21 Apr 2020)
Log Message:
-----------
plugin aware type recognition

Modified Paths:
--------------
    brlcad/branches/dm-fb-merge/include/dm.h
    brlcad/branches/dm-fb-merge/src/libdm/dm_plugins.c
    brlcad/branches/dm-fb-merge/src/libdm/tests/dm_test.c

Modified: brlcad/branches/dm-fb-merge/include/dm.h
===================================================================
--- brlcad/branches/dm-fb-merge/include/dm.h    2020-04-21 16:59:05 UTC (rev 
75497)
+++ brlcad/branches/dm-fb-merge/include/dm.h    2020-04-21 17:16:59 UTC (rev 
75498)
@@ -182,7 +182,8 @@
 /* Test plugin functions */
 DM_EXPORT extern void dm_list_backends(const char *separator);
 DM_EXPORT extern int dm_valid_type(const char *name, const char *dpy_string);
-DM_EXPORT struct dm* dm_popen(void *interp, const char *type, int argc, const 
char *argv[]);
+DM_EXPORT struct dm * dm_popen(void *interp, const char *type, int argc, const 
char *argv[]);
+DM_EXPORT const char * dm_recommend_type(const char *dpy_string);
 
 /* functions to make a dm struct hideable - will need to
  * sort these out later */

Modified: brlcad/branches/dm-fb-merge/src/libdm/dm_plugins.c
===================================================================
--- brlcad/branches/dm-fb-merge/src/libdm/dm_plugins.c  2020-04-21 16:59:05 UTC 
(rev 75497)
+++ brlcad/branches/dm-fb-merge/src/libdm/dm_plugins.c  2020-04-21 17:16:59 UTC 
(rev 75498)
@@ -181,7 +181,52 @@
     return is_valid;
 }
 
+/** dm_recommend_type determines what mged will normally
+  * use as the default display manager
+  */
+const char *
+dm_recommend_type(const char *dpy_string)
+{
+    static const char *priority_list[] = {"osgl", "wgl", "ogl", "X", "tk", 
"nu"};
 
+    struct bu_ptbl plugins = BU_PTBL_INIT_ZERO;
+    struct bu_ptbl handles = BU_PTBL_INIT_ZERO;
+    int dm_cnt = dm_load_backends(&plugins, &handles);
+    if (!dm_cnt) {
+       bu_log("No display manager implementations found!\n");
+       return NULL;
+    }
+
+    const char *ret = NULL;
+
+    int i = 0;
+    const char *b = priority_list[i];
+    while (!BU_STR_EQUAL(b, "nu")) {
+       for (size_t j = 0; j < BU_PTBL_LEN(&plugins); j++) {
+           const struct dm *d = (const struct dm *)BU_PTBL_GET(&plugins, j);
+           if (BU_STR_EQUIV(b, dm_get_name(d))) {
+               if (d->i->dm_viable(dpy_string) == 1) {
+                   ret = b;
+                   break;
+               }
+           }
+       }
+       if (ret) {
+           break;
+       }    
+       i++;
+       b = priority_list[i];
+    }
+
+    bu_ptbl_free(&plugins);
+    if (dm_close_backends(&handles)) {
+       bu_log("bu_dlclose failed to unload plugins.\n");
+    }
+    bu_ptbl_free(&handles);
+
+    return (ret) ? ret : b;
+} 
+
 /*
  * Local Variables:
  * tab-width: 8

Modified: brlcad/branches/dm-fb-merge/src/libdm/tests/dm_test.c
===================================================================
--- brlcad/branches/dm-fb-merge/src/libdm/tests/dm_test.c       2020-04-21 
16:59:05 UTC (rev 75497)
+++ brlcad/branches/dm-fb-merge/src/libdm/tests/dm_test.c       2020-04-21 
17:16:59 UTC (rev 75498)
@@ -55,6 +55,7 @@
     bu_log("dmp name: %s\n", dm_get_name(dmp));
     dm_close(dmp);
 
+    bu_log("recommended type: %s\n", dm_recommend_type(NULL));
 
     return 0;
 }

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