From 8b5f039f10e51f972dbed0a4d75fc569bde4b9a8 Mon Sep 17 00:00:00 2001 From: rathnor <rathnor> Date: Fri, 30 Jan 2004 11:06:25 +0000 Subject: slitlist fixing up --- ChangeLog | 5 +++++ src/Slit.cc | 31 ++++++++++++++++++++++--------- src/Xutil.cc | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- src/Xutil.hh | 6 +++++- 4 files changed, 87 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 02cdd7c..589df47 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ (Format: Year/Month/Day) Changes for 0.9.9: +*04/01/30: + * Tidy up a few slitlist things (Simon) + - expand ~, trim spaces, allow comments, use WM_CLASS instead of NAME + - should make it use regexp like remember sometime + Slit.cc Xutil.hh/cc *04/01/23: * Fix a few window frame issues when changing styles (Simon) - particularly a "void" area of the window diff --git a/src/Slit.cc b/src/Slit.cc index 5d596ef..2c2574e 100644 --- a/src/Slit.cc +++ b/src/Slit.cc @@ -22,7 +22,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Slit.cc,v 1.87 2004/01/10 02:58:21 fluxgen Exp $ +// $Id: Slit.cc,v 1.88 2004/01/30 11:06:25 rathnor Exp $ #include "Slit.hh" @@ -57,6 +57,7 @@ #include "SlitClient.hh" #include "Xutil.hh" #include "FbAtoms.hh" +#include "FbTk/StringUtil.hh" #include <algorithm> #include <iostream> @@ -415,7 +416,7 @@ void Slit::addClient(Window w) { // Look for slot in client list by name SlitClient *client = 0; std::string match_name; - match_name = Xutil::getWMName(w); + match_name = Xutil::getWMClassName(w); SlitClients::iterator it = m_client_list.begin(); SlitClients::iterator it_end = m_client_list.end(); bool found_match = false; @@ -1123,22 +1124,34 @@ void Slit::toggleHidden() { } void Slit::loadClientList(const char *filename) { - if (filename == 0) + if (filename == 0 || filename[0] == '\0') return; - m_filename = filename; // save filename so we can save client list later + // save filename so we can save client list later + m_filename = FbTk::StringUtil::expandFilename(filename); struct stat buf; - if (!stat(filename, &buf)) { + if (stat(filename, &buf) != 0) { std::ifstream file(filename); std::string name; while (! file.eof()) { name = ""; std::getline(file, name); // get the entire line - if (name.size() > 0) { // don't add client unless we have a valid line - SlitClient *client = new SlitClient(name.c_str()); - m_client_list.push_back(client); - } + if (name.size() <= 0) + continue; + + // remove whitespaces from start and end + FbTk::StringUtil::removeFirstWhitespace(name); + + // the cleaned string could still be a comment, or blank + if ( name.size() <= 0 || name[0] == '#' || name[0] == '!' ) + continue; + + // trailing whitespace won't affect the above test + FbTk::StringUtil::removeTrailingWhitespace(name); + + SlitClient *client = new SlitClient(name.c_str()); + m_client_list.push_back(client); } } } diff --git a/src/Xutil.cc b/src/Xutil.cc index a5a6c59..e36080a 100644 --- a/src/Xutil.cc +++ b/src/Xutil.cc @@ -20,7 +20,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Xutil.cc,v 1.3 2004/01/11 16:04:39 fluxgen Exp $ +// $Id: Xutil.cc,v 1.4 2004/01/30 11:06:25 rathnor Exp $ #include "Xutil.hh" @@ -30,6 +30,8 @@ #include <X11/Xutil.h> #include <X11/Xatom.h> #include <X11/Xlib.h> +#include <iostream> +using namespace std; namespace Xutil { @@ -79,5 +81,57 @@ std::string getWMName(Window window) { return name; } + +// The name of this particular instance +std::string getWMClassName(Window win) { + XClassHint ch; + std::string instance_name; + + if (XGetClassHint(FbTk::App::instance()->display(), win, &ch) == 0) { +#ifdef DEBUG + cerr<<"Xutil: Failed to read class hint!"<<endl; +#endif //DEBUG + instance_name = ""; + } else { + + XFree(ch.res_class); + + if (ch.res_class != 0) { + instance_name = const_cast<char *>(ch.res_name); + XFree(ch.res_name); + ch.res_name = 0; + } else + instance_name = ""; + } + + return instance_name; + +} + +// the name of the general class of the app +std::string getWMClassClass(Window win) { + XClassHint ch; + std::string class_name; + + if (XGetClassHint(FbTk::App::instance()->display(), win, &ch) == 0) { +#ifdef DEBUG + cerr<<"Xutil: Failed to read class hint!"<<endl; +#endif //DEBUG + class_name = ""; + } else { + + XFree(ch.res_name); + + if (ch.res_class != 0) { + class_name = const_cast<char *>(ch.res_class); + XFree(ch.res_class); + ch.res_class = 0; + } else + class_name = ""; + } + + return class_name; +} + }; // end namespace Xutil diff --git a/src/Xutil.hh b/src/Xutil.hh index cbb7f78..43796db 100644 --- a/src/Xutil.hh +++ b/src/Xutil.hh @@ -20,7 +20,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Xutil.hh,v 1.2 2004/01/11 16:04:39 fluxgen Exp $ +// $Id: Xutil.hh,v 1.3 2004/01/30 11:06:25 rathnor Exp $ #ifndef XUTIL_HH #define XUTIL_HH @@ -33,6 +33,10 @@ namespace Xutil { std::string getWMName(Window window); +std::string getWMClassName(Window win); +std::string getWMClassClass(Window win); + + }; // end namespace Xutil #endif // XUTIL_HH -- cgit v0.11.2