From dda95bf106079fdfd12a690de0ce79a88279505f Mon Sep 17 00:00:00 2001
From: Mark Tiefenbruck <mark@fluxbox.org>
Date: Mon, 6 Oct 2008 18:16:26 -0700
Subject: allow relative path for background images in style files

---
 ChangeLog         |  3 +++
 src/FbTk/Image.cc | 36 +++++++++++++++++++-----------------
 src/FbTk/Image.hh |  2 ++
 src/RootTheme.cc  |  6 ++++--
 4 files changed, 28 insertions(+), 19 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index ad55595..fe11533 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
  (Format: Year/Month/Day)
 Changes for 1.1.2
+*08/10/07:
+   * Allow relative paths for background images in style files (Mark)
+     RootTheme.cc FbTk/Image.cc/hh
 *08/10/05:
    * Remove menu modes (Mark)
      Screen.cc/hh ScreenResources.cc FbTk/MenuTheme.cc/hh FbTk/Menu.cc
diff --git a/src/FbTk/Image.cc b/src/FbTk/Image.cc
index 639bafd..020f9c6 100644
--- a/src/FbTk/Image.cc
+++ b/src/FbTk/Image.cc
@@ -21,6 +21,7 @@
 
 #include "Image.hh"
 #include "StringUtil.hh"
+#include "FileUtil.hh"
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -94,25 +95,26 @@ PixmapWithMask *Image::load(const string &filename, int screen_num) {
     if (s_image_map.find(extension) == s_image_map.end())
         return false;
 
-    // load file
-    PixmapWithMask *pm = s_image_map[extension]->load(filename, screen_num);
-    // failed?, try different search paths
-    if (pm == 0 && s_search_paths.size()) {
-        // first we need to get basename of current filename
-        string base_filename = StringUtil::basename(filename);
-        string path = "";
-        // append each search path and try to load
-        StringList::iterator it = s_search_paths.begin();
-        StringList::iterator it_end = s_search_paths.end();
-        for (; it != it_end && pm == 0; ++it) {
-            // append search path and try load it
-            path = StringUtil::expandFilename(*it);
-            pm = s_image_map[extension]->load(path + "/" + base_filename, screen_num);
-        }
+    string path = locateFile(filename);
+    if (!path.empty())
+        return s_image_map[extension]->load(path, screen_num);
 
-    }
+    return 0;
+}
 
-    return pm;
+string Image::locateFile(const string &filename) {
+    string path = StringUtil::expandFilename(filename);
+    if (FileUtil::isRegularFile(path.c_str()))
+        return path;
+    string base = StringUtil::basename(filename);
+    StringList::iterator it = s_search_paths.begin();
+    StringList::iterator it_end = s_search_paths.end();
+    for (; it != it_end; ++it) {
+        path = StringUtil::expandFilename(*it) + "/" + base;
+        if (FileUtil::isRegularFile(path.c_str()))
+            return path;
+    }
+    return "";
 }
 
 bool Image::registerType(const string &type, ImageBase &base) {
diff --git a/src/FbTk/Image.hh b/src/FbTk/Image.hh
index c27e452..acb5879 100644
--- a/src/FbTk/Image.hh
+++ b/src/FbTk/Image.hh
@@ -55,6 +55,8 @@ public:
     static void removeSearchPath(const std::string &search_path);
     /// adds a path to search images from
     static void removeAllSearchPaths();
+    /// locates an image in the search path
+    static std::string locateFile(const std::string &filename);
 private:
     typedef std::map<std::string, ImageBase *> ImageMap;
     typedef std::list<std::string> StringList;
diff --git a/src/RootTheme.cc b/src/RootTheme.cc
index a40732e..049eb27 100644
--- a/src/RootTheme.cc
+++ b/src/RootTheme.cc
@@ -28,6 +28,7 @@
 
 #include "FbTk/App.hh"
 #include "FbTk/Font.hh"
+#include "FbTk/Image.hh"
 #include "FbTk/ImageControl.hh"
 #include "FbTk/Resource.hh"
 #include "FbTk/FileUtil.hh"
@@ -197,6 +198,7 @@ void RootTheme::reconfigTheme() {
     // if background argument is a file then
     // parse image options and call image setting
     // command specified in the resources
+    std::string img_path = FbTk::Image::locateFile(filename);
     filename = FbTk::StringUtil::expandFilename(filename);
     std::string cmd = realProgramName("fbsetbg") + (m_first ? " -z " : " -Z ");
 
@@ -204,7 +206,7 @@ void RootTheme::reconfigTheme() {
     if (strstr(m_background->options().c_str(), "none") != 0) {
         if (!m_first)
             return;
-    } else if (FbTk::FileUtil::isRegularFile(filename.c_str())) {
+    } else if (!img_path.empty()) {
         // parse options
         if (strstr(m_background->options().c_str(), "tiled") != 0)
             cmd += "-t ";
@@ -215,7 +217,7 @@ void RootTheme::reconfigTheme() {
         else
             cmd += "-f ";
 
-        cmd += filename;
+        cmd += img_path;
     } else if (FbTk::FileUtil::isDirectory(filename.c_str()) &&
                strstr(m_background->options().c_str(), "random") != 0) {
         cmd += "-r " + filename;
-- 
cgit v0.11.2