diff options
Diffstat (limited to 'src/Ewmh.cc')
-rw-r--r-- | src/Ewmh.cc | 118 |
1 files changed, 79 insertions, 39 deletions
diff --git a/src/Ewmh.cc b/src/Ewmh.cc index 87e55bf..9f89f08 100644 --- a/src/Ewmh.cc +++ b/src/Ewmh.cc | |||
@@ -1,6 +1,6 @@ | |||
1 | // Ewmh.cc for FbPager | 1 | // Ewmh.cc for FbPager |
2 | // Copyright (c) 2004 Henrik Kinnunen (fluxgen at users.sourceforge.net) | 2 | // Copyright (c) 2004 Henrik Kinnunen (fluxgen at users.sourceforge.net) |
3 | // | 3 | // |
4 | // Permission is hereby granted, free of charge, to any person obtaining a | 4 | // Permission is hereby granted, free of charge, to any person obtaining a |
5 | // copy of this software and associated documentation files (the "Software"), | 5 | // copy of this software and associated documentation files (the "Software"), |
6 | // to deal in the Software without restriction, including without limitation | 6 | // to deal in the Software without restriction, including without limitation |
@@ -27,6 +27,7 @@ | |||
27 | #include "FbTk/App.hh" | 27 | #include "FbTk/App.hh" |
28 | #include "FbTk/FbWindow.hh" | 28 | #include "FbTk/FbWindow.hh" |
29 | #include "FbRootWindow.hh" | 29 | #include "FbRootWindow.hh" |
30 | #include "PropertyTools.hh" | ||
30 | 31 | ||
31 | #include <X11/Xatom.h> | 32 | #include <X11/Xatom.h> |
32 | 33 | ||
@@ -36,7 +37,41 @@ | |||
36 | #include <unistd.h> | 37 | #include <unistd.h> |
37 | #include <memory> | 38 | #include <memory> |
38 | 39 | ||
40 | |||
39 | using namespace std; | 41 | using namespace std; |
42 | using namespace PropertyTools; | ||
43 | |||
44 | |||
45 | struct PropT { | ||
46 | PropT(unsigned char *data, unsigned int num):data(data), num(num) { } | ||
47 | ~PropT() { | ||
48 | if (data != 0) | ||
49 | XFree(data); | ||
50 | } | ||
51 | unsigned char *data; | ||
52 | unsigned int num; | ||
53 | }; | ||
54 | |||
55 | |||
56 | typedef std::auto_ptr<PropT> PropTPtr; | ||
57 | |||
58 | PropT *property(const FbTk::FbWindow &win, Atom atom, | ||
59 | Atom type, unsigned int num) { | ||
60 | Atom ret_type; | ||
61 | int fmt; | ||
62 | unsigned long nitems, bytes_after; | ||
63 | unsigned char *data = 0; | ||
64 | win.property(atom, | ||
65 | 0, num, | ||
66 | False, | ||
67 | type, | ||
68 | &ret_type, &fmt, | ||
69 | &nitems, | ||
70 | &bytes_after, | ||
71 | &data); | ||
72 | return new PropT(data, nitems); | ||
73 | |||
74 | } | ||
40 | 75 | ||
41 | namespace FbPager { | 76 | namespace FbPager { |
42 | 77 | ||
@@ -56,7 +91,7 @@ public: | |||
56 | wm_pid = XInternAtom(disp, "_NET_WM_PID", False); | 91 | wm_pid = XInternAtom(disp, "_NET_WM_PID", False); |
57 | wm_type = XInternAtom(disp, "_NET_WM_WINDOW_TYPE", False); | 92 | wm_type = XInternAtom(disp, "_NET_WM_WINDOW_TYPE", False); |
58 | type_dock = XInternAtom(disp, "_NET_WM_WINDOW_TYPE_DOCK", False); | 93 | type_dock = XInternAtom(disp, "_NET_WM_WINDOW_TYPE_DOCK", False); |
59 | number_of_desktops = XInternAtom(disp, "_NET_NUMBER_OF_DESKTOPS", False); | 94 | number_of_desktops = XInternAtom(disp, "_NET_NUMBER_OF_DESKTOPS", False); |
60 | current_desktop = XInternAtom(disp, "_NET_CURRENT_DESKTOP", False); | 95 | current_desktop = XInternAtom(disp, "_NET_CURRENT_DESKTOP", False); |
61 | clientlist = XInternAtom(disp, "_NET_CLIENT_LIST", False); | 96 | clientlist = XInternAtom(disp, "_NET_CLIENT_LIST", False); |
62 | moveresize_window = XInternAtom(disp, "_NET_MOVERESIZE_WINDOW", False); | 97 | moveresize_window = XInternAtom(disp, "_NET_MOVERESIZE_WINDOW", False); |
@@ -64,11 +99,11 @@ public: | |||
64 | close_window = XInternAtom(disp, "_NET_CLOSE_WINDOW", False); | 99 | close_window = XInternAtom(disp, "_NET_CLOSE_WINDOW", False); |
65 | desktop_layout = XInternAtom(disp, "_NET_DESKTOP_LAYOUT", False); | 100 | desktop_layout = XInternAtom(disp, "_NET_DESKTOP_LAYOUT", False); |
66 | } | 101 | } |
67 | Atom state_skip_pager, state_skip_taskbar, state_sticky, | 102 | Atom state_skip_pager, state_skip_taskbar, state_sticky, |
68 | state_hidden, state_shaded, state_above, state_below; | 103 | state_hidden, state_shaded, state_above, state_below; |
69 | Atom wm_desktop, wm_state, wm_pid, wm_type; | 104 | Atom wm_desktop, wm_state, wm_pid, wm_type; |
70 | Atom type_dock; | 105 | Atom type_dock; |
71 | Atom number_of_desktops, current_desktop; | 106 | Atom number_of_desktops, current_desktop; |
72 | Atom clientlist; | 107 | Atom clientlist; |
73 | Atom moveresize_window; | 108 | Atom moveresize_window; |
74 | Atom active_window; | 109 | Atom active_window; |
@@ -106,11 +141,11 @@ void Ewmh::setDesktopLayout(FbTk::FbWindow &root, | |||
106 | (unsigned char*)data, 4 ); | 141 | (unsigned char*)data, 4 ); |
107 | } | 142 | } |
108 | 143 | ||
109 | void Ewmh::moveResize(FbTk::FbWindow &win) { | 144 | void Ewmh::moveResize(FbTk::FbWindow &win) { |
110 | 145 | ||
111 | // We can't do this yet, there is a bug in fluxbox 0.9.8 | 146 | // We can't do this yet, there is a bug in fluxbox 0.9.8 |
112 | // and this makes it crash (it's fixed in cvs though) | 147 | // and this makes it crash (it's fixed in cvs though) |
113 | /* | 148 | /* |
114 | Display *disp = FbTk::App::instance()->display(); | 149 | Display *disp = FbTk::App::instance()->display(); |
115 | XEvent event; | 150 | XEvent event; |
116 | event.xclient.display = disp; | 151 | event.xclient.display = disp; |
@@ -144,9 +179,44 @@ void Ewmh::closeWindow(FbTk::FbWindow &win) { | |||
144 | XSendEvent(disp, RootWindow(disp, DefaultScreen(disp)), False, SubstructureNotifyMask, &event); | 179 | XSendEvent(disp, RootWindow(disp, DefaultScreen(disp)), False, SubstructureNotifyMask, &event); |
145 | } | 180 | } |
146 | 181 | ||
182 | bool Ewmh::propertyNotify(Pager &pager, XPropertyEvent &event) try { | ||
183 | if (event.window != DefaultRootWindow(FbTk::App::instance()->display())) { | ||
184 | return false; | ||
185 | } | ||
186 | if (event.atom == m_data->current_desktop) { | ||
187 | pager.setCurrentWorkspace(getIntProperty(event.window, event.atom)); | ||
188 | } else if (event.atom == m_data->number_of_desktops) { | ||
189 | pager.updateWorkspaceCount(getIntProperty(event.window, event.atom)); | ||
190 | } else if (event.atom == m_data->active_window) { | ||
191 | pager.setFocusedWindow(getWinProperty(event.window, event.atom)); | ||
192 | } else if (event.atom == m_data->clientlist) { | ||
193 | vector<Window> windows; | ||
194 | getWinArrayProperty(DefaultRootWindow(FbTk::App::instance()->display()), event.atom, windows); | ||
195 | std::vector< pair<Window, unsigned int > > wins_workspaces; | ||
196 | for ( unsigned int win = 0; win < windows.size(); ++win ) { | ||
197 | wins_workspaces. | ||
198 | push_back( std::make_pair(windows[win], | ||
199 | getIntProperty(windows[win], | ||
200 | m_data->wm_desktop))); | ||
201 | } | ||
202 | pager.addWindows(wins_workspaces); | ||
203 | } else { | ||
204 | // did not handle it here | ||
205 | return false; | ||
206 | } | ||
207 | |||
208 | return true; | ||
209 | |||
210 | } catch ( const PropertyException& e ) { | ||
211 | cerr << "Ewmh Exception: " << e.what() << endl; | ||
212 | // we handle it | ||
213 | return true; | ||
214 | } | ||
215 | |||
147 | bool Ewmh::clientMessage(Pager &pager, XClientMessageEvent &event) { | 216 | bool Ewmh::clientMessage(Pager &pager, XClientMessageEvent &event) { |
148 | if (!m_support) | 217 | if (!m_support) |
149 | return false; | 218 | return false; |
219 | |||
150 | 220 | ||
151 | if (event.message_type == m_data->current_desktop) { | 221 | if (event.message_type == m_data->current_desktop) { |
152 | pager.setCurrentWorkspace(event.data.l[0]); | 222 | pager.setCurrentWorkspace(event.data.l[0]); |
@@ -180,7 +250,7 @@ void Ewmh::changeWorkspace(int screen_num, int workspace) { | |||
180 | } | 250 | } |
181 | 251 | ||
182 | void Ewmh::setHints(FbTk::FbWindow &win, WindowHint &hint) { | 252 | void Ewmh::setHints(FbTk::FbWindow &win, WindowHint &hint) { |
183 | 253 | ||
184 | int data = getpid(); | 254 | int data = getpid(); |
185 | win.changeProperty(m_data->wm_pid, | 255 | win.changeProperty(m_data->wm_pid, |
186 | XA_CARDINAL, | 256 | XA_CARDINAL, |
@@ -238,36 +308,6 @@ void Ewmh::setHints(FbTk::FbWindow &win, WindowHint &hint) { | |||
238 | } | 308 | } |
239 | 309 | ||
240 | 310 | ||
241 | struct PropT { | ||
242 | PropT(unsigned char *data, unsigned int num):data(data), num(num) { } | ||
243 | ~PropT() { | ||
244 | if (data != 0) | ||
245 | XFree(data); | ||
246 | } | ||
247 | unsigned char *data; | ||
248 | unsigned int num; | ||
249 | }; | ||
250 | |||
251 | typedef std::auto_ptr<PropT> PropTPtr; | ||
252 | |||
253 | PropT *property(const FbTk::FbWindow &win, Atom atom, | ||
254 | Atom type, unsigned int num) { | ||
255 | Atom ret_type; | ||
256 | int fmt; | ||
257 | unsigned long nitems, bytes_after; | ||
258 | unsigned char *data = 0; | ||
259 | win.property(atom, | ||
260 | 0, num, | ||
261 | False, | ||
262 | type, | ||
263 | &ret_type, &fmt, | ||
264 | &nitems, | ||
265 | &bytes_after, | ||
266 | &data); | ||
267 | return new PropT(data, nitems); | ||
268 | |||
269 | } | ||
270 | |||
271 | void Ewmh::getHints(const FbTk::FbWindow &win, WindowHint &hint) const { | 311 | void Ewmh::getHints(const FbTk::FbWindow &win, WindowHint &hint) const { |
272 | PropTPtr p(property(win, | 312 | PropTPtr p(property(win, |
273 | m_data->wm_state, | 313 | m_data->wm_state, |