summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--src/ClientPattern.cc11
-rw-r--r--src/ClientPattern.hh4
-rw-r--r--src/FbTk/FbWindow.cc30
-rw-r--r--src/FbTk/FbWindow.hh6
5 files changed, 50 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 8a7f45c..bc98ae0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
1(Format: Year/Month/Day) 1(Format: Year/Month/Day)
2Changes for 0.9.10: 2Changes for 0.9.10:
3*04/04/28:
4 * Add apps file matching on WM_WINDOW_ROLE (Simon)
5 - use "role=string". Particularly useful for gaim windows
6 [app] (role=buddy_list) ...
7 ClientPattern.hh/cc FbWindow.hh/cc
3*04/04/27: 8*04/04/27:
4 * Fix up several toolbar theme items and alignments (Simon) 9 * Fix up several toolbar theme items and alignments (Simon)
5 - big improvement in look/compatibility of older styles 10 - big improvement in look/compatibility of older styles
diff --git a/src/ClientPattern.cc b/src/ClientPattern.cc
index f41ccb0..2fba185 100644
--- a/src/ClientPattern.cc
+++ b/src/ClientPattern.cc
@@ -20,12 +20,13 @@
20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21// DEALINGS IN THE SOFTWARE. 21// DEALINGS IN THE SOFTWARE.
22 22
23// $Id: ClientPattern.cc,v 1.6 2003/12/17 01:19:39 fluxgen Exp $ 23// $Id: ClientPattern.cc,v 1.7 2004/04/28 13:04:06 rathnor Exp $
24 24
25#include "ClientPattern.hh" 25#include "ClientPattern.hh"
26#include "RegExp.hh" 26#include "RegExp.hh"
27#include "StringUtil.hh" 27#include "StringUtil.hh"
28#include "WinClient.hh" 28#include "WinClient.hh"
29#include "FbTk/App.hh"
29 30
30// use GNU extensions 31// use GNU extensions
31#ifndef _GNU_SOURCE 32#ifndef _GNU_SOURCE
@@ -110,6 +111,8 @@ ClientPattern::ClientPattern(const char *str):
110 prop = CLASS; 111 prop = CLASS;
111 } else if (strcasecmp(memstr.c_str(), "title") == 0) { 112 } else if (strcasecmp(memstr.c_str(), "title") == 0) {
112 prop = TITLE; 113 prop = TITLE;
114 } else if (strcasecmp(memstr.c_str(), "role") == 0) {
115 prop = ROLE;
113 } else { 116 } else {
114 had_error = pos + match.find_first_of('(') + 1; 117 had_error = pos + match.find_first_of('(') + 1;
115 break; 118 break;
@@ -186,6 +189,8 @@ std::string ClientPattern::toString() const {
186 case TITLE: 189 case TITLE:
187 pat.append("title="); 190 pat.append("title=");
188 break; 191 break;
192 case ROLE:
193 pat.append("role=");
189 } 194 }
190 195
191 pat.append((*it)->orig); 196 pat.append((*it)->orig);
@@ -246,6 +251,10 @@ std::string ClientPattern::getProperty(WinProperty prop, const WinClient &client
246 case NAME: 251 case NAME:
247 return client.getWMClassName(); 252 return client.getWMClassName();
248 break; 253 break;
254 case ROLE:
255 Atom wm_role = XInternAtom(FbTk::App::instance()->display(), "WM_WINDOW_ROLE", False);
256 return client.textProperty(wm_role);
257 break;
249 } 258 }
250 return client.getWMClassName(); 259 return client.getWMClassName();
251} 260}
diff --git a/src/ClientPattern.hh b/src/ClientPattern.hh
index 7e89511..2357a24 100644
--- a/src/ClientPattern.hh
+++ b/src/ClientPattern.hh
@@ -21,7 +21,7 @@
21// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22// DEALINGS IN THE SOFTWARE. 22// DEALINGS IN THE SOFTWARE.
23 23
24// $Id: ClientPattern.hh,v 1.2 2003/06/13 12:02:00 fluxgen Exp $ 24// $Id: ClientPattern.hh,v 1.3 2004/04/28 13:04:06 rathnor Exp $
25 25
26#ifndef CLIENTPATTERN_HH 26#ifndef CLIENTPATTERN_HH
27#define CLIENTPATTERN_HH 27#define CLIENTPATTERN_HH
@@ -53,7 +53,7 @@ public:
53 /// @return a string representation of this pattern 53 /// @return a string representation of this pattern
54 std::string toString() const; 54 std::string toString() const;
55 55
56 enum WinProperty { TITLE, CLASS, NAME }; 56 enum WinProperty { TITLE, CLASS, NAME, ROLE };
57 57
58 /// Does this client match this pattern? 58 /// Does this client match this pattern?
59 bool match(const WinClient &win) const; 59 bool match(const WinClient &win) const;
diff --git a/src/FbTk/FbWindow.cc b/src/FbTk/FbWindow.cc
index 195eeea..47e1399 100644
--- a/src/FbTk/FbWindow.cc
+++ b/src/FbTk/FbWindow.cc
@@ -19,7 +19,7 @@
19// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 19// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20// DEALINGS IN THE SOFTWARE. 20// DEALINGS IN THE SOFTWARE.
21 21
22// $Id: FbWindow.cc,v 1.31 2004/01/21 20:07:41 fluxgen Exp $ 22// $Id: FbWindow.cc,v 1.32 2004/04/28 13:04:06 rathnor Exp $
23 23
24#include "FbWindow.hh" 24#include "FbWindow.hh"
25 25
@@ -32,6 +32,7 @@
32#include "config.h" 32#include "config.h"
33#endif // HAVE_CONFIG_H 33#endif // HAVE_CONFIG_H
34 34
35#include <X11/Xutil.h>
35#include <X11/Xatom.h> 36#include <X11/Xatom.h>
36 37
37#include <cassert> 38#include <cassert>
@@ -342,6 +343,33 @@ void FbWindow::reparent(const FbWindow &parent, int x, int y) {
342 updateGeometry(); 343 updateGeometry();
343} 344}
344 345
346std::string FbWindow::textProperty(Atom property) const {
347 XTextProperty text_prop;
348 char ** stringlist;
349 int count;
350 std::string ret;
351
352 if (XGetTextProperty(s_display, window(), &text_prop, property) == 0)
353 return "";
354
355 if (text_prop.value == 0 || text_prop.nitems == 0)
356 return "";
357
358 if (text_prop.encoding != XA_STRING) {
359 // still returns a "StringList" despite the different name
360 if (XmbTextPropertyToTextList(s_display, &text_prop, &stringlist, &count) == 0 || count == 0)
361 return "";
362 } else {
363 if (XTextPropertyToStringList(&text_prop, &stringlist, &count) == 0 || count == 0)
364 return "";
365
366 }
367
368 ret = stringlist[0];
369 XFreeStringList(stringlist);
370 return ret;
371}
372
345bool FbWindow::property(Atom property, 373bool FbWindow::property(Atom property,
346 long long_offset, long long_length, 374 long long_offset, long long_length,
347 bool do_delete, 375 bool do_delete,
diff --git a/src/FbTk/FbWindow.hh b/src/FbTk/FbWindow.hh
index d44e36f..045356f 100644
--- a/src/FbTk/FbWindow.hh
+++ b/src/FbTk/FbWindow.hh
@@ -19,7 +19,7 @@
19// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 19// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20// DEALINGS IN THE SOFTWARE. 20// DEALINGS IN THE SOFTWARE.
21 21
22// $Id: FbWindow.hh,v 1.28 2004/01/21 20:22:26 fluxgen Exp $ 22// $Id: FbWindow.hh,v 1.29 2004/04/28 13:04:06 rathnor Exp $
23 23
24#ifndef FBTK_FBWINDOW_HH 24#ifndef FBTK_FBWINDOW_HH
25#define FBTK_FBWINDOW_HH 25#define FBTK_FBWINDOW_HH
@@ -28,7 +28,7 @@
28 28
29#include <X11/Xlib.h> 29#include <X11/Xlib.h>
30#include <memory> 30#include <memory>
31 31#include <string>
32 32
33namespace FbTk { 33namespace FbTk {
34 34
@@ -135,6 +135,8 @@ public:
135 unsigned char *data, 135 unsigned char *data,
136 int nelements); 136 int nelements);
137 137
138 std::string textProperty(Atom property) const;
139
138 /// @return parent FbWindow 140 /// @return parent FbWindow
139 const FbWindow *parent() const { return m_parent; } 141 const FbWindow *parent() const { return m_parent; }
140 /// @return real X window 142 /// @return real X window