Selaa lähdekoodia

Added support for setting values to properties from command-line to modify how backgrounds look

Signed-off-by: Alexis Maiquez <almamu@almamu.com>
Alexis Maiquez 3 vuotta sitten
vanhempi
commit
9cddb56f60

+ 37 - 12
main.cpp

@@ -50,13 +50,14 @@ void print_help (const char* route)
         << "\ta full path to the background's folder" << std::endl
         << std::endl
         << "options:" << std::endl
-        << "  --silent\t\tMutes all the sound the wallpaper might produce" << std::endl
-        << "  --volume <amount>\tSets the volume for all the sounds in the background" << std::endl
-        << "  --screen-root <screen name>\tDisplay as screen's background" << std::endl
-        << "  --fps <maximum-fps>\tLimits the FPS to the given number, useful to keep battery consumption low" << std::endl
-        << "  --assets-dir <path>\tFolder where the assets are stored" << std::endl
-        << "  --screenshot\t\tTakes a screenshot of the background" << std::endl
-        << "  --list-properties\tList all the available properties and their possible values" << std::endl;
+        << "\t--silent\t\t\t\t\tMutes all the sound the wallpaper might produce" << std::endl
+        << "\t--volume <amount>\t\t\tSets the volume for all the sounds in the background" << std::endl
+        << "\t--screen-root <screen name>\tDisplay as screen's background" << std::endl
+        << "\t--fps <maximum-fps>\t\t\tLimits the FPS to the given number, useful to keep battery consumption low" << std::endl
+        << "\t--assets-dir <path>\t\t\tFolder where the assets are stored" << std::endl
+        << "\t--screenshot\t\t\t\tTakes a screenshot of the background" << std::endl
+        << "\t--list-properties\t\t\tList all the available properties and their possible values" << std::endl
+        << "\t--set-property <name=value>\tOverrides the default value of the given property" << std::endl;
 }
 
 std::string stringPathFixes(const std::string& s)
@@ -315,6 +316,7 @@ void takeScreenshot (WallpaperEngine::Render::CWallpaper* wp, const std::string&
 int main (int argc, char* argv[])
 {
     std::vector <std::string> screens;
+    std::map <std::string, std::string> propertyOverrides;
 
     int maximumFPS = 30;
     bool shouldEnableAudio = true;
@@ -336,6 +338,7 @@ int main (int argc, char* argv[])
         {"assets-dir",      required_argument, 0, 'a'},
         {"screenshot",      required_argument, 0, 'c'},
         {"list-properties", no_argument,       0, 'l'},
+        {"set-property",    required_argument, 0, 'o'},
         {nullptr,                           0, 0,   0}
     };
 
@@ -348,6 +351,22 @@ int main (int argc, char* argv[])
 
         switch (c)
         {
+            case 'o':
+                {
+                    std::string value = optarg;
+                    std::string::size_type equals = value.find ('=');
+
+                    // properties without value are treated as booleans for now
+                    if (equals == std::string::npos)
+                        propertyOverrides.insert_or_assign (value, "1");
+                    else
+                        propertyOverrides.insert_or_assign (
+                            value.substr (0, equals),
+                            value.substr (equals + 1)
+                        );
+                }
+                break;
+
             case 'l':
                 shouldListPropertiesAndStop = true;
                 break;
@@ -522,15 +541,21 @@ int main (int argc, char* argv[])
         chdir (path.c_str ());
 
     // show properties if required
-    if (shouldListPropertiesAndStop)
+    for (auto cur : project->getProperties ())
     {
-        for (auto cur : project->getProperties ())
-        {
+        // update the value of the property
+        auto override = propertyOverrides.find (cur->getName ());
+
+        if (override != propertyOverrides.end ())
+            cur->update (override->second);
+
+        if (shouldListPropertiesAndStop)
             std::cout << cur->dump () << std::endl;
-        }
+    }
 
+    // halt if the list-properties option was specified
+    if (shouldListPropertiesAndStop)
         return 0;
-    }
 
     // attach signals so if a stop is requested the X11 resources are freed and the program shutsdown gracefully
     std::signal(SIGINT, signalhandler);

+ 1 - 0
src/WallpaperEngine/Core/Projects/CProperty.h

@@ -19,6 +19,7 @@ namespace WallpaperEngine::Core::Projects
         template<class T> bool is () { return this->m_type == T::Type; }
 
         virtual std::string dump () const = 0;
+        virtual void update (const std::string& value) = 0;
 
         const std::string& getName () const;
         const std::string& getType () const;

+ 5 - 0
src/WallpaperEngine/Core/Projects/CPropertyBoolean.cpp

@@ -22,6 +22,11 @@ bool CPropertyBoolean::getValue ()
     return this->m_value;
 }
 
+void CPropertyBoolean::update (const std::string& value)
+{
+    this->m_value = value == "1" || value == "true";
+}
+
 std::string CPropertyBoolean::dump () const
 {
     std::stringstream ss;

+ 1 - 0
src/WallpaperEngine/Core/Projects/CPropertyBoolean.h

@@ -13,6 +13,7 @@ namespace WallpaperEngine::Core::Projects
 
         bool getValue ();
         std::string dump () const override;
+        void update (const std::string& value) override;
 
         static const std::string Type;
 

+ 22 - 14
src/WallpaperEngine/Core/Projects/CPropertyColor.cpp

@@ -4,28 +4,30 @@
 
 using namespace WallpaperEngine::Core::Projects;
 
-CPropertyColor* CPropertyColor::fromJSON (json data, const std::string& name)
+FloatColor ParseColor (const std::string& value)
 {
-    std::string value = *jsonFindRequired (data, "value", "Color property must have a value");
-    std::string text = jsonFindDefault <std::string> (data, "text", "");
-    FloatColor color (0, 0, 0, 0);
-
     if (value.find ('.') == std::string::npos && value != "0 0 0" && value != "1 1 1")
     {
         IntegerColor intcolor = WallpaperEngine::Core::aToColori (value);
 
-        color.r = intcolor.r / 255.0;
-        color.g = intcolor.g / 255.0;
-        color.b = intcolor.b / 255.0;
-        color.a = intcolor.a / 255.0;
-    }
-    else
-    {
-        color = WallpaperEngine::Core::aToColorf (value);
+        return {
+            intcolor.r / 255.0,
+            intcolor.g / 255.0,
+            intcolor.b / 255.0,
+            intcolor.a / 255.0
+        };
     }
 
+    return WallpaperEngine::Core::aToColorf (value);
+}
+
+CPropertyColor* CPropertyColor::fromJSON (json data, const std::string& name)
+{
+    std::string value = *jsonFindRequired (data, "value", "Color property must have a value");
+    std::string text = jsonFindDefault <std::string> (data, "text", "");
+
     return new CPropertyColor (
-        color,
+        ParseColor (value),
         name,
         text
     );
@@ -36,6 +38,12 @@ const FloatColor& CPropertyColor::getValue () const
     return this->m_color;
 }
 
+void CPropertyColor::update (const std::string& value)
+{
+    this->m_color = ParseColor (value);
+}
+
+
 std::string CPropertyColor::dump () const
 {
     std::stringstream ss;

+ 1 - 0
src/WallpaperEngine/Core/Projects/CPropertyColor.h

@@ -16,6 +16,7 @@ namespace WallpaperEngine::Core::Projects
 
         const FloatColor& getValue () const;
         std::string dump () const override;
+        void update (const std::string& value) override;
 
         static const std::string Type;
 

+ 20 - 0
src/WallpaperEngine/Core/Projects/CPropertyCombo.cpp

@@ -72,6 +72,26 @@ std::string CPropertyCombo::dump () const
     return ss.str();
 }
 
+void CPropertyCombo::update (const std::string& value)
+{
+    bool found = false;
+
+    // ensure the value is present somewhere in the value list
+    for (auto cur : this->m_values)
+    {
+        if (cur->value != value)
+            continue;
+
+        found = true;
+    }
+
+    if (found == false)
+        throw std::runtime_error ("Assigning invalid value to property");
+
+    this->m_defaultValue = value;
+}
+
+
 void CPropertyCombo::addValue (std::string label, std::string value)
 {
     CPropertyComboValue* prop = new CPropertyComboValue;

+ 1 - 0
src/WallpaperEngine/Core/Projects/CPropertyCombo.h

@@ -20,6 +20,7 @@ namespace WallpaperEngine::Core::Projects
 
         const std::string& getValue () const;
         std::string dump () const override;
+        void update (const std::string& value) override;
 
         static const std::string Type;
 

+ 10 - 0
src/WallpaperEngine/Core/Projects/CPropertySlider.cpp

@@ -56,6 +56,16 @@ std::string CPropertySlider::dump () const
     return ss.str();
 }
 
+void CPropertySlider::update (const std::string& value)
+{
+    double newValue = atof (value.c_str ());
+
+    if (newValue < this->m_min || newValue > this->m_max)
+        throw std::runtime_error ("Slider value is out of range");
+
+    this->m_value = newValue;
+}
+
 CPropertySlider::CPropertySlider (double value, const std::string& name, const std::string& text, double min, double max, double step) :
     CProperty (name, Type, text),
     m_value (value), m_min (min), m_max (max), m_step (step)

+ 1 - 0
src/WallpaperEngine/Core/Projects/CPropertySlider.h

@@ -19,6 +19,7 @@ namespace WallpaperEngine::Core::Projects
         const double& getMaxValue () const;
         const double& getStep () const;
         std::string dump () const override;
+        void update (const std::string& value) override;
 
         static const std::string Type;
 

+ 5 - 0
src/WallpaperEngine/Core/Projects/CPropertyText.cpp

@@ -25,6 +25,11 @@ std::string CPropertyText::dump () const
     return ss.str();
 }
 
+void CPropertyText::update (const std::string& value)
+{
+    this->m_text = value;
+}
+
 CPropertyText::CPropertyText (const std::string& name, const std::string& text) :
     CProperty (name, Type, text)
 {

+ 1 - 0
src/WallpaperEngine/Core/Projects/CPropertyText.h

@@ -11,6 +11,7 @@ namespace WallpaperEngine::Core::Projects
     public:
         static CPropertyText* fromJSON (json data, const std::string& name);
         std::string dump () const override;
+        void update (const std::string& value) override;
 
         static const std::string Type;