aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/fluxbox.cc209
-rw-r--r--src/fluxbox.hh59
2 files changed, 149 insertions, 119 deletions
diff --git a/src/fluxbox.cc b/src/fluxbox.cc
index 01e2c3f..345cde8 100644
--- a/src/fluxbox.cc
+++ b/src/fluxbox.cc
@@ -22,7 +22,7 @@
22// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23// DEALINGS IN THE SOFTWARE. 23// DEALINGS IN THE SOFTWARE.
24 24
25// $Id: fluxbox.cc,v 1.73 2002/08/30 14:07:38 fluxgen Exp $ 25// $Id: fluxbox.cc,v 1.74 2002/09/07 20:25:39 fluxgen Exp $
26 26
27 27
28#include "fluxbox.hh" 28#include "fluxbox.hh"
@@ -39,6 +39,10 @@
39#include "StringUtil.hh" 39#include "StringUtil.hh"
40#include "Resource.hh" 40#include "Resource.hh"
41#include "XrmDatabaseHelper.hh" 41#include "XrmDatabaseHelper.hh"
42#include "AtomHandler.hh"
43#include "Gnome.hh"
44//#include "Ewmh.hh"
45
42#ifdef SLIT 46#ifdef SLIT
43#include "Slit.hh" 47#include "Slit.hh"
44#endif // SLIT 48#endif // SLIT
@@ -118,6 +122,7 @@
118#include <string> 122#include <string>
119#include <memory> 123#include <memory>
120#include <algorithm> 124#include <algorithm>
125#include <typeinfo>
121 126
122using namespace std; 127using namespace std;
123using namespace FbTk; 128using namespace FbTk;
@@ -336,6 +341,10 @@ key(0)
336 cursor.move = XCreateFontCursor(getXDisplay(), XC_fleur); 341 cursor.move = XCreateFontCursor(getXDisplay(), XC_fleur);
337 cursor.ll_angle = XCreateFontCursor(getXDisplay(), XC_ll_angle); 342 cursor.ll_angle = XCreateFontCursor(getXDisplay(), XC_ll_angle);
338 cursor.lr_angle = XCreateFontCursor(getXDisplay(), XC_lr_angle); 343 cursor.lr_angle = XCreateFontCursor(getXDisplay(), XC_lr_angle);
344
345 // setup atom handlers
346 m_atomhandler.push_back(new Gnome());
347// m_atomhandler.push_back(new Ewmh()); // TODO
339 348
340 //singleton pointer 349 //singleton pointer
341 singleton = this; 350 singleton = this;
@@ -376,11 +385,20 @@ key(0)
376 sprintf(scrname, "session.screen%d", i); 385 sprintf(scrname, "session.screen%d", i);
377 sprintf(altscrname, "session.Screen%d", i); 386 sprintf(altscrname, "session.Screen%d", i);
378 BScreen *screen = new BScreen(m_screen_rm, this, scrname, altscrname, i); 387 BScreen *screen = new BScreen(m_screen_rm, this, scrname, altscrname, i);
379
380 if (! screen->isScreenManaged()) { 388 if (! screen->isScreenManaged()) {
381 delete screen; 389 delete screen;
382 continue; 390 continue;
383 } 391 }
392 // attach screen signals to this
393 screen->currentWorkspaceSig().attach(this);
394 screen->workspaceCountSig().attach(this);
395 screen->workspaceNamesSig().attach(this);
396 screen->clientListSig().attach(this);
397
398 // initiate atomhandler for screen specific stuff
399 for (size_t atomh=0; atomh<m_atomhandler.size(); ++atomh) {
400 m_atomhandler[i]->initForScreen(*screen);
401 }
384 402
385 screenList.push_back(screen); 403 screenList.push_back(screen);
386 } 404 }
@@ -411,7 +429,13 @@ key(0)
411} 429}
412 430
413 431
414Fluxbox::~Fluxbox(void) { 432Fluxbox::~Fluxbox() {
433 // destroy atomhandlers
434 while (!m_atomhandler.empty()) {
435 delete m_atomhandler.back();
436 m_atomhandler.pop_back();
437 }
438
415 std::list<MenuTimestamp *>::iterator it = menuTimestamps.begin(); 439 std::list<MenuTimestamp *>::iterator it = menuTimestamps.begin();
416 std::list<MenuTimestamp *>::iterator it_end = menuTimestamps.end(); 440 std::list<MenuTimestamp *>::iterator it_end = menuTimestamps.end();
417 for (; it != it_end; ++it) { 441 for (; it != it_end; ++it) {
@@ -645,7 +669,10 @@ void Fluxbox::handleEvent(XEvent * const e) {
645 win = new FluxboxWindow(e->xmaprequest.window); 669 win = new FluxboxWindow(e->xmaprequest.window);
646 if (!win->isManaged()) { 670 if (!win->isManaged()) {
647 delete win; 671 delete win;
648 win = 0; 672 win = 0;
673 } else {
674 // attach signals
675 attachSignals(*win);
649 } 676 }
650 } 677 }
651 678
@@ -884,9 +911,9 @@ void Fluxbox::handleButtonEvent(XButtonEvent &be) {
884 FluxboxWindow *win = (FluxboxWindow *) 0; 911 FluxboxWindow *win = (FluxboxWindow *) 0;
885 Basemenu *menu = (Basemenu *) 0; 912 Basemenu *menu = (Basemenu *) 0;
886 913
887 #ifdef SLIT 914#ifdef SLIT
888 Slit *slit = (Slit *) 0; 915 Slit *slit = (Slit *) 0;
889 #endif // SLIT 916#endif // SLIT
890 917
891 Toolbar *tbar = (Toolbar *) 0; 918 Toolbar *tbar = (Toolbar *) 0;
892 Tab *tab = 0; 919 Tab *tab = 0;
@@ -901,10 +928,10 @@ void Fluxbox::handleButtonEvent(XButtonEvent &be) {
901 } else if ((menu = searchMenu(be.window))) { 928 } else if ((menu = searchMenu(be.window))) {
902 menu->buttonPressEvent(&be); 929 menu->buttonPressEvent(&be);
903 930
904 #ifdef SLIT 931#ifdef SLIT
905 } else if ((slit = searchSlit(be.window))) { 932 } else if ((slit = searchSlit(be.window))) {
906 slit->buttonPressEvent(&be); 933 slit->buttonPressEvent(&be);
907 #endif // SLIT 934#endif // SLIT
908 935
909 } else if ((tbar = searchToolbar(be.window))) { 936 } else if ((tbar = searchToolbar(be.window))) {
910 tbar->buttonPressEvent(&be); 937 tbar->buttonPressEvent(&be);
@@ -1107,17 +1134,12 @@ void Fluxbox::handleClientMessage(XClientMessageEvent &ce) {
1107 win->changeBlackboxHints(&net); 1134 win->changeBlackboxHints(&net);
1108 } 1135 }
1109 } else { 1136 } else {
1110 bool val = false; 1137 FluxboxWindow *win = searchWindow(ce.window);
1111 #ifdef GNOME 1138 BScreen *screen = searchScreen(ce.window);
1112 val = checkGnomeAtoms(ce); 1139
1113 #endif //!GNOME 1140 for (size_t i=0; i<m_atomhandler.size(); ++i) {
1114 1141 m_atomhandler[i]->checkClientMessage(ce, screen, win);
1115 #ifdef NEWWMSPEC 1142 }
1116 if (!val)
1117 val = checkNETWMAtoms(ce);
1118 #endif //!NEWWMSPEC
1119 //disable `unused`-warning
1120 val = true;
1121 } 1143 }
1122} 1144}
1123//----------- handleKeyEvent --------------- 1145//----------- handleKeyEvent ---------------
@@ -1531,80 +1553,6 @@ void Fluxbox::doWindowAction(Keys::KeyAction action, const int param) {
1531 } 1553 }
1532 1554
1533} 1555}
1534#ifdef GNOME
1535//---------------- checkGnomeAtoms ---------------
1536// Tries to find Gnome atoms in message
1537// Returns true on success else false
1538//---------------------------------------------
1539bool Fluxbox::checkGnomeAtoms(XClientMessageEvent &ce) {
1540 BScreen *screen = 0;
1541 FluxboxWindow *win = 0;
1542 win = searchWindow(ce.window);
1543 screen = searchScreen(ce.window);
1544
1545 if (ce.message_type == getGnomeWorkspaceAtom()) {
1546#ifdef DEBUG
1547 cerr<<__FILE__<<"("<<__LINE__<<"): Got workspace atom="<<ce.data.l[0]<<endl;
1548#endif//!DEBUG
1549 if ( win !=0 && // the message sent to client window?
1550 win->getScreen() && ce.data.l[0] >= 0 &&
1551 ce.data.l[0] < (signed)win->getScreen()->getCount()) {
1552 win->getScreen()->changeWorkspaceID(ce.data.l[0]);
1553
1554 } else if (screen!=0 && //the message sent to root window?
1555 ce.data.l[0] >= 0 &&
1556 ce.data.l[0] < (signed)screen->getCount())
1557 screen->changeWorkspaceID(ce.data.l[0]);
1558 return true;
1559 } else if (win) {
1560 if (ce.message_type == getGnomeStateAtom()) {
1561#ifdef DEBUG
1562 cerr<<__FILE__<<"("<<__LINE__<<"): _WIN_STATE"<<endl;
1563#endif // DEBUG
1564
1565#ifdef DEBUG
1566 cerr<<__FILE__<<"("<<__LINE__<<"): Mask of members to change:"<<
1567 hex<<ce.data.l[0]<<dec<<endl; // mask_of_members_to_change
1568 cerr<<"New members:"<<ce.data.l[1]<<endl;
1569#endif // DEBUG
1570
1571 //get new states
1572 int flag = ce.data.l[0] & ce.data.l[1];
1573 //set states
1574 win->setGnomeState(flag);
1575
1576 } else if (ce.message_type == getGnomeHintsAtom()) {
1577#ifdef DEBUG
1578 cerr<<__FILE__<<"("<<__LINE__<<"): _WIN_HINTS"<<endl;
1579#endif // DEBUG
1580
1581 } else
1582 return false; //the gnome atom wasn't found or not supported
1583 } else
1584 return false; //no gnome atom
1585
1586 return true;
1587}
1588#endif //!GNOME
1589
1590#ifdef NEWWMSPEC
1591//----------- checkNETWMAtoms -------------------
1592// Tries to find NEWWM atom in clientmessage
1593// Returns true on success else false
1594//-----------------------------------------------
1595bool Fluxbox::checkNETWMAtoms(XClientMessageEvent &ce) {
1596
1597 if (ce.message_type == getNETWMDesktopAtom()) { //_NET_WM_DESKTOP
1598 BScreen *screen = searchScreen(ce.window);
1599
1600 if (screen && ce.data.l[0] >= 0 &&
1601 ce.data.l[0] < screen->getCount())
1602 screen->changeWorkspaceID(ce.data.l[0]);
1603 } else return false;
1604
1605 return true;
1606}
1607#endif //!NEWWMSPEC
1608 1556
1609void Fluxbox::handleEvent(SignalEvent * const sig) { 1557void Fluxbox::handleEvent(SignalEvent * const sig) {
1610 I18n *i18n = I18n::instance(); 1558 I18n *i18n = I18n::instance();
@@ -1655,9 +1603,80 @@ void Fluxbox::handleEvent(SignalEvent * const sig) {
1655 abort(); 1603 abort();
1656 break; 1604 break;
1657 } 1605 }
1606}
1658 1607
1659
1660 1608
1609void Fluxbox::update(FbTk::Subject *changedsub) {
1610
1611 if (typeid(*changedsub) == typeid(FluxboxWindow)) {
1612 FluxboxWindow::WinSubject *winsub = dynamic_cast<FluxboxWindow::WinSubject *>(changedsub);
1613 FluxboxWindow &win = winsub->win();
1614 if ((&(win.hintSig())) == changedsub) { // hint signal
1615#ifdef DEBUG
1616 cerr<<__FILE__<<"("<<__LINE__<<") hint signal from "<<&win<<endl;
1617#endif // DEBUG
1618 for (size_t i=0; i<m_atomhandler.size(); ++i) {
1619 if (m_atomhandler[i]->update())
1620 m_atomhandler[i]->updateHints(&win);
1621 }
1622 } else if ((&(win.stateSig())) == changedsub) { // state signal
1623#ifdef DEBUG
1624 cerr<<__FILE__<<"("<<__LINE__<<") state signal from "<<&win<<endl;
1625#endif // DEBUG
1626 for (size_t i=0; i<m_atomhandler.size(); ++i) {
1627 if (m_atomhandler[i]->update())
1628 m_atomhandler[i]->updateState(&win);
1629 }
1630 } else if ((&(win.workspaceSig())) == changedsub) { // workspace signal
1631#ifdef DEBUG
1632 cerr<<__FILE__<<"("<<__LINE__<<") workspace signal from "<<&win<<endl;
1633#endif // DEBUG
1634
1635 }
1636
1637 } else if (typeid(*changedsub) == typeid(BScreen::ScreenSubject)) {
1638 BScreen::ScreenSubject *subj = dynamic_cast<BScreen::ScreenSubject *>(changedsub);
1639 BScreen &screen = subj->screen();
1640 if ((&(screen.workspaceCountSig())) == changedsub) {
1641#ifdef DEBUG
1642 cerr<<__FILE__<<"("<<__LINE__<<"): workspace count signal"<<endl;
1643#endif // DEBUG
1644 for (size_t i=0; i<m_atomhandler.size(); ++i) {
1645 if (m_atomhandler[i]->update())
1646 m_atomhandler[i]->updateWorkspaceCount(screen);
1647 }
1648 } else if ((&(screen.workspaceNamesSig())) == changedsub) {
1649#ifdef DEBUG
1650 cerr<<__FILE__<<"("<<__LINE__<<"): workspace names signal"<<endl;
1651#endif // DEBUG
1652 for (size_t i=0; i<m_atomhandler.size(); ++i) {
1653 if (m_atomhandler[i]->update())
1654 m_atomhandler[i]->updateWorkspaceNames(screen);
1655 }
1656 } else if ((&(screen.currentWorkspaceSig())) == changedsub) {
1657#ifdef DEBUG
1658 cerr<<__FILE__<<"("<<__LINE__<<"): current workspace signal"<<endl;
1659#endif // DEBUG
1660 for (size_t i=0; i<m_atomhandler.size(); ++i) {
1661 if (m_atomhandler[i]->update())
1662 m_atomhandler[i]->updateCurrentWorkspace(screen);
1663 }
1664 } else if ((&(screen.clientListSig())) == changedsub) {
1665#ifdef DEBUG
1666 cerr<<__FILE__<<"("<<__LINE__<<"): client list signal"<<endl;
1667#endif // DEBUG
1668 for (size_t i=0; i<m_atomhandler.size(); ++i) {
1669 if (m_atomhandler[i]->update())
1670 m_atomhandler[i]->updateClientList(screen);
1671 }
1672 }
1673 }
1674}
1675
1676void Fluxbox::attachSignals(FluxboxWindow &win) {
1677 win.hintSig().attach(this);
1678 win.stateSig().attach(this);
1679 win.workspaceSig().attach(this);
1661} 1680}
1662 1681
1663 1682
diff --git a/src/fluxbox.hh b/src/fluxbox.hh
index e877805..9d68be3 100644
--- a/src/fluxbox.hh
+++ b/src/fluxbox.hh
@@ -22,7 +22,7 @@
22// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23// DEALINGS IN THE SOFTWARE. 23// DEALINGS IN THE SOFTWARE.
24 24
25// $Id: fluxbox.hh,v 1.27 2002/08/17 22:13:00 fluxgen Exp $ 25// $Id: fluxbox.hh,v 1.28 2002/09/07 20:24:06 fluxgen Exp $
26 26
27#ifndef FLUXBOX_HH 27#ifndef FLUXBOX_HH
28#define FLUXBOX_HH 28#define FLUXBOX_HH
@@ -35,6 +35,7 @@
35#include "Window.hh" 35#include "Window.hh"
36#include "Tab.hh" 36#include "Tab.hh"
37#include "Toolbar.hh" 37#include "Toolbar.hh"
38#include "Observer.hh"
38 39
39#ifdef SLIT 40#ifdef SLIT
40#include "Slit.hh" 41#include "Slit.hh"
@@ -64,13 +65,17 @@
64#include <map> 65#include <map>
65#include <list> 66#include <list>
66 67
68class AtomHandler;
69
70
67/** 71/**
68 main class for the window manager. 72 main class for the window manager.
69 singleton type 73 singleton type
70*/ 74*/
71class Fluxbox : public BaseDisplay, public TimeoutHandler, 75class Fluxbox : public BaseDisplay, public TimeoutHandler,
72 public FbTk::EventHandler<FbTk::SignalEvent>, 76 public FbTk::EventHandler<FbTk::SignalEvent>,
73 public FbAtoms { 77 public FbAtoms,
78 public FbTk::Observer {
74public: 79public:
75 Fluxbox(int argc, char **argv, const char * dpy_name= 0, const char *rc = 0); 80 Fluxbox(int argc, char **argv, const char * dpy_name= 0, const char *rc = 0);
76 virtual ~Fluxbox(); 81 virtual ~Fluxbox();
@@ -153,6 +158,9 @@ public:
153 158
154 /// handle any system signal sent to the application 159 /// handle any system signal sent to the application
155 void handleEvent(FbTk::SignalEvent * const signum); 160 void handleEvent(FbTk::SignalEvent * const signum);
161 void update(FbTk::Subject *changed);
162
163 void attachSignals(FluxboxWindow &win);
156 164
157 virtual void timeout(); 165 virtual void timeout();
158 166
@@ -161,6 +169,7 @@ public:
161 inline const Cursor &getLowerLeftAngleCursor() const { return cursor.ll_angle; } 169 inline const Cursor &getLowerLeftAngleCursor() const { return cursor.ll_angle; }
162 inline const Cursor &getLowerRightAngleCursor() const { return cursor.lr_angle; } 170 inline const Cursor &getLowerRightAngleCursor() const { return cursor.lr_angle; }
163 171
172
164 173
165#ifdef SLIT 174#ifdef SLIT
166 Slit *searchSlit(Window); 175 Slit *searchSlit(Window);
@@ -181,18 +190,6 @@ private:
181 Cursor session, move, ll_angle, lr_angle; 190 Cursor session, move, ll_angle, lr_angle;
182 } cursor; 191 } cursor;
183 192
184 void setupConfigFiles();
185 void handleButtonEvent(XButtonEvent &be);
186 void handleUnmapNotify(XUnmapEvent &ue);
187 void handleClientMessage(XClientMessageEvent &ce);
188 void handleKeyEvent(XKeyEvent &ke);
189 void doWindowAction(Keys::KeyAction action, const int param);
190 #ifdef GNOME
191 bool checkGnomeAtoms(XClientMessageEvent &ce);
192 #endif
193 #ifdef NEWWMSPEC
194 bool checkNETWMAtoms(XClientMessageEvent &ce);
195 #endif
196 typedef struct MenuTimestamp { 193 typedef struct MenuTimestamp {
197 char *filename; 194 char *filename;
198 time_t timestamp; 195 time_t timestamp;
@@ -203,6 +200,29 @@ private:
203 timeval auto_raise_delay; 200 timeval auto_raise_delay;
204 } resource; 201 } resource;
205 202
203
204 std::string getRcFilename();
205 void getDefaultDataFilename(char *, std::string &);
206 void load_rc();
207
208 void reload_rc();
209 void real_rereadMenu();
210 void real_reconfigure();
211
212 void handleEvent(XEvent *xe);
213
214 void setupConfigFiles();
215 void handleButtonEvent(XButtonEvent &be);
216 void handleUnmapNotify(XUnmapEvent &ue);
217 void handleClientMessage(XClientMessageEvent &ce);
218 void handleKeyEvent(XKeyEvent &ke);
219 void doWindowAction(Keys::KeyAction action, const int param);
220
221 #ifdef NEWWMSPEC
222 bool checkNETWMAtoms(XClientMessageEvent &ce);
223 #endif
224
225
206 ResourceManager m_resourcemanager, m_screen_rm; 226 ResourceManager m_resourcemanager, m_screen_rm;
207 227
208 //--- Resources 228 //--- Resources
@@ -254,18 +274,9 @@ private:
254 std::string slitlist_path; 274 std::string slitlist_path;
255 //default arguments for titlebar left and right 275 //default arguments for titlebar left and right
256 static Fluxbox::Titlebar m_titlebar_left[], m_titlebar_right[]; 276 static Fluxbox::Titlebar m_titlebar_left[], m_titlebar_right[];
257
258 std::string getRcFilename();
259 void getDefaultDataFilename(char *, std::string &);
260 void load_rc();
261 277
262 void reload_rc();
263 void real_rereadMenu();
264 void real_reconfigure();
265
266 void handleEvent(XEvent *xe);
267 static Fluxbox *singleton; 278 static Fluxbox *singleton;
268 279 std::vector<AtomHandler *> m_atomhandler;
269}; 280};
270 281
271 282