From 89b7f8139f45a1253f7490b3412ba58d63e2ee58 Mon Sep 17 00:00:00 2001
From: James Hogan <james@albanarts.com>
Date: Wed, 5 Jan 2022 22:57:15 +0000
Subject: [PATCH] VRManager: Handle removal of prop getValue<const char *>()

Handle removal of SGPropertyNode::getValue<const char *>() in
VRManager::Listener<const char *>::valueChanged() by switching the
string listeners and VRManager setter handlers to std::string.

This fixes the following link error when VR is enabled:
ld: VRManager.cxx.o: in function `flightgear::VRManager::Listener<char const*>::valueChanged(SGPropertyNode*)':
src/Viewer/VRManager.hxx:147: undefined reference to `char const* SGPropertyNode::getValue<char const*>(std::enable_if<simgear::props::PropertyTraits<char const*>::Internal, void>::type*) const'
---
 src/Viewer/VRManager.cxx | 28 ++++++++++++++--------------
 src/Viewer/VRManager.hxx | 12 ++++++------
 2 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/src/Viewer/VRManager.cxx b/src/Viewer/VRManager.cxx
index 3dd9ddb76..85221020f 100644
--- a/src/Viewer/VRManager.cxx
+++ b/src/Viewer/VRManager.cxx
@@ -144,15 +144,15 @@ void VRManager::setVisibilityMask(bool visibilityMask)
     syncSettings();
 }
 
-void VRManager::setVRMode(const char * mode)
+void VRManager::setVRMode(const std::string& mode)
 {
     osgXR::Settings::VRMode vrMode = osgXR::Settings::VRMODE_AUTOMATIC;
 
-    if (strcmp(mode, "AUTOMATIC") == 0) {
+    if (mode == "AUTOMATIC") {
         vrMode = osgXR::Settings::VRMODE_AUTOMATIC;
-    } else if (strcmp(mode, "SLAVE_CAMERAS") == 0) {
+    } else if (mode == "SLAVE_CAMERAS") {
         vrMode = osgXR::Settings::VRMODE_SLAVE_CAMERAS;
-    } else if (strcmp(mode, "SCENE_VIEW") == 0) {
+    } else if (mode == "SCENE_VIEW") {
         vrMode = osgXR::Settings::VRMODE_SCENE_VIEW;
     }
 
@@ -160,15 +160,15 @@ void VRManager::setVRMode(const char * mode)
     syncSettings();
 }
 
-void VRManager::setSwapchainMode(const char * mode)
+void VRManager::setSwapchainMode(const std::string& mode)
 {
     osgXR::Settings::SwapchainMode swapchainMode = osgXR::Settings::SWAPCHAIN_AUTOMATIC;
 
-    if (strcmp(mode, "AUTOMATIC") == 0) {
+    if (mode == "AUTOMATIC") {
         swapchainMode = osgXR::Settings::SWAPCHAIN_AUTOMATIC;
-    } else if (strcmp(mode,"MULTIPLE") == 0) {
+    } else if (mode == "MULTIPLE") {
         swapchainMode = osgXR::Settings::SWAPCHAIN_MULTIPLE;
-    } else if (strcmp(mode,"SINGLE") == 0) {
+    } else if (mode == "SINGLE") {
         swapchainMode = osgXR::Settings::SWAPCHAIN_SINGLE;
     }
 
@@ -176,22 +176,22 @@ void VRManager::setSwapchainMode(const char * mode)
     syncSettings();
 }
 
-void VRManager::setMirrorMode(const char * mode)
+void VRManager::setMirrorMode(const std::string& mode)
 {
     osgXR::MirrorSettings::MirrorMode mirrorMode = osgXR::MirrorSettings::MIRROR_AUTOMATIC;
     int viewIndex = -1;
 
-    if (strcmp(mode, "AUTOMATIC") == 0) {
+    if (mode == "AUTOMATIC") {
         mirrorMode = osgXR::MirrorSettings::MIRROR_AUTOMATIC;
-    } else if (strcmp(mode, "NONE") == 0) {
+    } else if (mode == "NONE") {
         mirrorMode = osgXR::MirrorSettings::MIRROR_NONE;
-    } else if (strcmp(mode, "LEFT") == 0) {
+    } else if (mode == "LEFT") {
         mirrorMode = osgXR::MirrorSettings::MIRROR_SINGLE;
         viewIndex = 0;
-    } else if (strcmp(mode, "RIGHT") == 0) {
+    } else if (mode == "RIGHT") {
         mirrorMode = osgXR::MirrorSettings::MIRROR_SINGLE;
         viewIndex = 1;
-    } else if (strcmp(mode, "LEFT_RIGHT") == 0) {
+    } else if (mode == "LEFT_RIGHT") {
         mirrorMode = osgXR::MirrorSettings::MIRROR_LEFT_RIGHT;
     }
 
diff --git a/src/Viewer/VRManager.hxx b/src/Viewer/VRManager.hxx
index 95d156d67..72150c00d 100644
--- a/src/Viewer/VRManager.hxx
+++ b/src/Viewer/VRManager.hxx
@@ -80,9 +80,9 @@ class VRManager : public osgXR::Manager
         void setDepthInfo(bool depthInfo);
         void setVisibilityMask(bool visibilityMask);
 
-        void setVRMode(const char * mode);
-        void setSwapchainMode(const char * mode);
-        void setMirrorMode(const char * mode);
+        void setVRMode(const std::string& mode);
+        void setSwapchainMode(const std::string& mode);
+        void setMirrorMode(const std::string& mode);
 
         // osgXR::Manager overrides
 
@@ -130,11 +130,11 @@ class VRManager : public osgXR::Manager
 
         // Property listeners
 
-        template <typename T>
+        template <typename T, typename R = T>
         class Listener : public SGPropertyChangeListener
         {
             public:
-                typedef void (VRManager::*SetterFn)(T v);
+                typedef void (VRManager::*SetterFn)(R v);
 
                 Listener(VRManager *manager, SetterFn setter) :
                     _manager(manager),
@@ -153,7 +153,7 @@ class VRManager : public osgXR::Manager
                 SetterFn _setter;
         };
         typedef Listener<bool> ListenerBool;
-        typedef Listener<const char *> ListenerString;
+        typedef Listener<std::string, const std::string&> ListenerString;
 
         ListenerBool _listenerEnabled;
         ListenerBool _listenerDepthInfo;