diff options
author | rathnor <rathnor> | 2003-07-04 01:03:41 (GMT) |
---|---|---|
committer | rathnor <rathnor> | 2003-07-04 01:03:41 (GMT) |
commit | 3144086eef171f6c402182f23bfc80a101e71fa2 (patch) | |
tree | 0df61dbcb4a7ce44fd90369b031e5a39037807c0 /src/Remember.cc | |
parent | 672ac023526d61af2e102a3a27b67eeedb2c4f10 (diff) | |
download | fluxbox-3144086eef171f6c402182f23bfc80a101e71fa2.zip fluxbox-3144086eef171f6c402182f23bfc80a101e71fa2.tar.bz2 |
support in remember for specifying groups.
Also split atomhandler::setupWindow
Diffstat (limited to 'src/Remember.cc')
-rw-r--r-- | src/Remember.cc | 111 |
1 files changed, 96 insertions, 15 deletions
diff --git a/src/Remember.cc b/src/Remember.cc index a31843b..97d1e35 100644 --- a/src/Remember.cc +++ b/src/Remember.cc | |||
@@ -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: Remember.cc,v 1.24 2003/06/12 15:12:19 rathnor Exp $ | 24 | // $Id: Remember.cc,v 1.25 2003/07/04 01:03:40 rathnor Exp $ |
25 | 25 | ||
26 | #include "Remember.hh" | 26 | #include "Remember.hh" |
27 | #include "ClientPattern.hh" | 27 | #include "ClientPattern.hh" |
@@ -46,6 +46,7 @@ | |||
46 | #include <fstream> | 46 | #include <fstream> |
47 | #include <string> | 47 | #include <string> |
48 | #include <memory> | 48 | #include <memory> |
49 | #include <set> | ||
49 | 50 | ||
50 | using namespace std; | 51 | using namespace std; |
51 | 52 | ||
@@ -128,7 +129,10 @@ FbTk::Menu *createRememberMenu(Remember &remember, FluxboxWindow &win) { | |||
128 | 129 | ||
129 | }; // end anonymous namespace | 130 | }; // end anonymous namespace |
130 | 131 | ||
131 | Application::Application() { | 132 | Application::Application(bool grouped) |
133 | : is_grouped(grouped), | ||
134 | group(0) | ||
135 | { | ||
132 | workspace_remember = | 136 | workspace_remember = |
133 | dimensions_remember = | 137 | dimensions_remember = |
134 | position_remember = | 138 | position_remember = |
@@ -146,6 +150,7 @@ Application::Application() { | |||
146 | ************/ | 150 | ************/ |
147 | 151 | ||
148 | Remember::Remember() { | 152 | Remember::Remember() { |
153 | enableUpdate(); | ||
149 | load(); | 154 | load(); |
150 | } | 155 | } |
151 | 156 | ||
@@ -155,12 +160,19 @@ Remember::~Remember() { | |||
155 | // the patterns free the "Application"s | 160 | // the patterns free the "Application"s |
156 | // the client mapping shouldn't need cleaning | 161 | // the client mapping shouldn't need cleaning |
157 | Patterns::iterator it; | 162 | Patterns::iterator it; |
163 | std::set<Application *> all_apps; // no duplicates | ||
158 | while (!m_pats.empty()) { | 164 | while (!m_pats.empty()) { |
159 | it = m_pats.begin(); | 165 | it = m_pats.begin(); |
160 | delete it->first; // ClientPattern | 166 | delete it->first; // ClientPattern |
161 | delete it->second; // Application | 167 | all_apps.insert(it->second); // Application, not necessarily unique |
162 | m_pats.erase(it); | 168 | m_pats.erase(it); |
163 | } | 169 | } |
170 | |||
171 | std::set<Application *>::iterator ait = all_apps.begin(); // no duplicates | ||
172 | while (ait != all_apps.end()) { | ||
173 | delete (*ait); | ||
174 | ++ait; | ||
175 | } | ||
164 | } | 176 | } |
165 | 177 | ||
166 | Application* Remember::find(WinClient &winclient) { | 178 | Application* Remember::find(WinClient &winclient) { |
@@ -184,7 +196,7 @@ Application* Remember::find(WinClient &winclient) { | |||
184 | 196 | ||
185 | Application * Remember::add(WinClient &winclient) { | 197 | Application * Remember::add(WinClient &winclient) { |
186 | ClientPattern *p = new ClientPattern(); | 198 | ClientPattern *p = new ClientPattern(); |
187 | Application *app = new Application(); | 199 | Application *app = new Application(false); |
188 | // by default, we match against the WMClass of a window. | 200 | // by default, we match against the WMClass of a window. |
189 | p->addTerm(p->getProperty(ClientPattern::NAME, winclient), ClientPattern::NAME); | 201 | p->addTerm(p->getProperty(ClientPattern::NAME, winclient), ClientPattern::NAME); |
190 | m_clients[&winclient] = app; | 202 | m_clients[&winclient] = app; |
@@ -193,11 +205,16 @@ Application * Remember::add(WinClient &winclient) { | |||
193 | return app; | 205 | return app; |
194 | } | 206 | } |
195 | 207 | ||
196 | int Remember::parseApp(ifstream &file, Application &app) { | 208 | int Remember::parseApp(ifstream &file, Application &app, string *first_line) { |
197 | string line; | 209 | string line; |
198 | int row = 0; | 210 | int row = 0; |
199 | while (! file.eof()) { | 211 | while (! file.eof()) { |
200 | if (getline(file, line)) { | 212 | if (first_line || getline(file, line)) { |
213 | if (first_line) { | ||
214 | line = *first_line; | ||
215 | first_line = 0; | ||
216 | } | ||
217 | |||
201 | row++; | 218 | row++; |
202 | if (line[0] != '#') { //the line is commented | 219 | if (line[0] != '#') { //the line is commented |
203 | int parse_pos = 0, err = 0; | 220 | int parse_pos = 0, err = 0; |
@@ -307,6 +324,8 @@ void Remember::load() { | |||
307 | if (!apps_file.eof()) { | 324 | if (!apps_file.eof()) { |
308 | string line; | 325 | string line; |
309 | int row = 0; | 326 | int row = 0; |
327 | bool in_group = false; | ||
328 | std::list<ClientPattern *> grouped_pats; | ||
310 | while (getline(apps_file, line) && ! apps_file.eof()) { | 329 | while (getline(apps_file, line) && ! apps_file.eof()) { |
311 | row++; | 330 | row++; |
312 | if (line[0] == '#') | 331 | if (line[0] == '#') |
@@ -319,14 +338,36 @@ void Remember::load() { | |||
319 | 338 | ||
320 | if (pos > 0 && key == "app") { | 339 | if (pos > 0 && key == "app") { |
321 | ClientPattern *pat = new ClientPattern(line.c_str() + pos); | 340 | ClientPattern *pat = new ClientPattern(line.c_str() + pos); |
322 | if ((err = pat->error()) == 0) { | 341 | if (!in_group) { |
323 | Application *app = new Application(); | 342 | if ((err = pat->error()) == 0) { |
324 | m_pats.push_back(make_pair(pat, app)); | 343 | Application *app = new Application(false); |
325 | row += parseApp(apps_file, *app); | 344 | m_pats.push_back(make_pair(pat, app)); |
345 | row += parseApp(apps_file, *app); | ||
346 | } else { | ||
347 | cerr<<"Error reading apps file at line "<<row<<", column "<<(err+pos)<<"."<<endl; | ||
348 | delete pat; // since it didn't work | ||
349 | } | ||
326 | } else { | 350 | } else { |
327 | cerr<<"Error reading apps file at line "<<row<<", column "<<(err+pos)<<"."<<endl; | 351 | grouped_pats.push_back(pat); |
328 | delete pat; // since it didn't work | 352 | } |
353 | } else if (pos > 0 && key == "group") { | ||
354 | in_group = true; | ||
355 | } else if (in_group) { | ||
356 | // otherwise assume that it is the start of the attributes | ||
357 | Application *app = new Application(true); | ||
358 | while (!grouped_pats.empty()) { | ||
359 | // associate all the patterns with this app | ||
360 | m_pats.push_back(make_pair(grouped_pats.front(), app)); | ||
361 | grouped_pats.pop_front(); | ||
362 | } | ||
363 | |||
364 | // we hit end... probably don't have attribs for the group | ||
365 | // so finish it off with an empty application | ||
366 | // otherwise parse the app | ||
367 | if (!(pos>0 && key == "end")) { | ||
368 | row += parseApp(apps_file, *app, &line); | ||
329 | } | 369 | } |
370 | in_group = false; | ||
330 | } else | 371 | } else |
331 | cerr<<"Error in apps file on line "<<row<<"."<<endl; | 372 | cerr<<"Error in apps file on line "<<row<<"."<<endl; |
332 | 373 | ||
@@ -350,9 +391,27 @@ void Remember::save() { | |||
350 | ofstream apps_file(apps_string.c_str()); | 391 | ofstream apps_file(apps_string.c_str()); |
351 | Patterns::iterator it = m_pats.begin(); | 392 | Patterns::iterator it = m_pats.begin(); |
352 | Patterns::iterator it_end = m_pats.end(); | 393 | Patterns::iterator it_end = m_pats.end(); |
394 | |||
395 | std::set<Application *> grouped_apps; // no duplicates | ||
396 | |||
353 | for (; it != it_end; ++it) { | 397 | for (; it != it_end; ++it) { |
354 | apps_file << "[app]"<<it->first->toString()<<endl; | ||
355 | Application &a = *it->second; | 398 | Application &a = *it->second; |
399 | if (a.is_grouped) { | ||
400 | // if already processed | ||
401 | if (grouped_apps.find(&a) != grouped_apps.end()) | ||
402 | continue; | ||
403 | // otherwise output this whole group | ||
404 | apps_file << "[group]" << endl; | ||
405 | Patterns::iterator git = m_pats.begin(); | ||
406 | Patterns::iterator git_end = m_pats.end(); | ||
407 | for (; git != git_end; git++) { | ||
408 | if (git->second->group == a.group) { | ||
409 | apps_file << " [app]"<<git->first->toString()<<endl; | ||
410 | } | ||
411 | } | ||
412 | } else { | ||
413 | apps_file << "[app]"<<it->first->toString()<<endl; | ||
414 | } | ||
356 | if (a.workspace_remember) { | 415 | if (a.workspace_remember) { |
357 | apps_file << " [Workspace]\t{" << a.workspace << "}" << endl; | 416 | apps_file << " [Workspace]\t{" << a.workspace << "}" << endl; |
358 | } | 417 | } |
@@ -541,7 +600,7 @@ void Remember::forgetAttrib(WinClient &winclient, Attribute attrib) { | |||
541 | } | 600 | } |
542 | } | 601 | } |
543 | 602 | ||
544 | void Remember::setupWindow(FluxboxWindow &win) { | 603 | void Remember::setupFrame(FluxboxWindow &win) { |
545 | WinClient &winclient = win.winClient(); | 604 | WinClient &winclient = win.winClient(); |
546 | 605 | ||
547 | // we don't touch the window if it is a transient | 606 | // we don't touch the window if it is a transient |
@@ -573,7 +632,10 @@ void Remember::setupWindow(FluxboxWindow &win) { | |||
573 | if (app == 0) | 632 | if (app == 0) |
574 | return; // nothing to do | 633 | return; // nothing to do |
575 | 634 | ||
576 | BScreen &screen = win.screen(); | 635 | if (app->is_grouped && app->group == 0) |
636 | app->group = &win; | ||
637 | |||
638 | BScreen &screen = winclient.screen(); | ||
577 | 639 | ||
578 | if (app->workspace_remember) { | 640 | if (app->workspace_remember) { |
579 | // TODO: fix placement to initialise properly | 641 | // TODO: fix placement to initialise properly |
@@ -611,10 +673,29 @@ void Remember::setupWindow(FluxboxWindow &win) { | |||
611 | 673 | ||
612 | } | 674 | } |
613 | 675 | ||
676 | void Remember::setupClient(WinClient &winclient) { | ||
677 | |||
678 | Application *app = find(winclient); | ||
679 | if (app == 0) | ||
680 | return; // nothing to do | ||
681 | |||
682 | if (winclient.fbwindow() == 0 && app->is_grouped && app->group) { | ||
683 | app->group->attachClient(winclient); | ||
684 | } | ||
685 | } | ||
686 | |||
614 | void Remember::updateWindowClose(FluxboxWindow &win) { | 687 | void Remember::updateWindowClose(FluxboxWindow &win) { |
615 | // This doesn't work at present since fluxbox.cc is missing the windowclose stuff. | 688 | // This doesn't work at present since fluxbox.cc is missing the windowclose stuff. |
616 | // I don't trust it (particularly winClient()) while this is the case | 689 | // I don't trust it (particularly winClient()) while this is the case |
617 | 690 | ||
691 | // scan all winclients and remove this fbw | ||
692 | Patterns::iterator it = m_pats.begin(); | ||
693 | while (it != m_pats.end()) { | ||
694 | if (&win == it->second->group) | ||
695 | it->second->group = 0; | ||
696 | ++it; | ||
697 | } | ||
698 | |||
618 | return; | 699 | return; |
619 | 700 | ||
620 | WinClient &winclient = win.winClient(); | 701 | WinClient &winclient = win.winClient(); |