aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Screen.cc152
-rw-r--r--src/Screen.hh47
2 files changed, 59 insertions, 140 deletions
diff --git a/src/Screen.cc b/src/Screen.cc
index 60c8a63..492f0d1 100644
--- a/src/Screen.cc
+++ b/src/Screen.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: Screen.cc,v 1.65 2002/08/30 14:03:31 fluxgen Exp $ 25// $Id: Screen.cc,v 1.66 2002/09/07 20:22:08 fluxgen Exp $
26 26
27//use GNU extensions 27//use GNU extensions
28#ifndef _GNU_SOURCE 28#ifndef _GNU_SOURCE
@@ -220,9 +220,11 @@ toolbar_placement(rm, Toolbar::BOTTOMCENTER, scrname+".toolbar.placement", altsc
220BScreen::BScreen(ResourceManager &rm, Fluxbox *b, 220BScreen::BScreen(ResourceManager &rm, Fluxbox *b,
221 const string &screenname, const string &altscreenname, 221 const string &screenname, const string &altscreenname,
222 int scrn) : ScreenInfo(b, scrn), 222 int scrn) : ScreenInfo(b, scrn),
223#ifdef GNOME 223m_clientlist_sig(*this), // client signal
224gnome_win(None), 224m_workspacecount_sig(*this), // workspace count signal
225#endif 225m_workspacenames_sig(*this), // workspace names signal
226m_currentworkspace_sig(*this), // current workspace signal
227
226theme(0), 228theme(0),
227resource(rm, screenname, altscreenname) 229resource(rm, screenname, altscreenname)
228{ 230{
@@ -279,9 +281,6 @@ resource(rm, screenname, altscreenname)
279 theme = new Theme(getBaseDisplay()->getXDisplay(), getRootWindow(), colormap(), getScreenNumber(), 281 theme = new Theme(getBaseDisplay()->getXDisplay(), getRootWindow(), colormap(), getScreenNumber(),
280 image_control, fluxbox->getStyleFilename(), getRootCommand().c_str()); 282 image_control, fluxbox->getStyleFilename(), getRootCommand().c_str());
281 283
282 #ifdef GNOME
283 initGnomeAtoms();
284 #endif
285 284
286 #ifdef NEWWMSPEC 285 #ifdef NEWWMSPEC
287 Atom netwmsupported[] = { 286 Atom netwmsupported[] = {
@@ -446,6 +445,8 @@ resource(rm, screenname, altscreenname)
446 if (!win->isManaged()) { 445 if (!win->isManaged()) {
447 delete win; 446 delete win;
448 win = 0; 447 win = 0;
448 } else {
449 Fluxbox::instance()->attachSignals(*win);
449 } 450 }
450 451
451 if (win) { 452 if (win) {
@@ -475,9 +476,6 @@ namespace {
475} 476}
476 477
477BScreen::~BScreen() { 478BScreen::~BScreen() {
478 #ifdef GNOME
479 XDestroyWindow(getBaseDisplay()->getXDisplay(), gnome_win);
480 #endif
481 if (! managed) return; 479 if (! managed) return;
482 480
483 if (geom_pixmap != None) 481 if (geom_pixmap != None)
@@ -666,30 +664,7 @@ void BScreen::removeWorkspaceNames() {
666} 664}
667 665
668void BScreen::updateWorkspaceNamesAtom() { 666void BScreen::updateWorkspaceNamesAtom() {
669 667 m_workspacenames_sig.notify();
670#ifdef GNOME
671 XTextProperty text;
672 int number_of_desks = workspaceNames.size();
673
674 char s[1024];
675 char *names[number_of_desks];
676
677 for (int i = 0; i < number_of_desks; i++) {
678 sprintf(s, "Desktop %i", i);
679 names[i] = new char[strlen(s) + 1];
680 strcpy(names[i], s);
681 }
682
683 if (XStringListToTextProperty(names, number_of_desks, &text)) {
684 XSetTextProperty(getBaseDisplay()->getXDisplay(), getRootWindow(),
685 &text, FbAtoms::instance()->getGnomeWorkspaceNamesAtom());
686 XFree(text.value);
687 }
688
689 for (int i = 0; i < number_of_desks; i++)
690 delete names[i];
691
692#endif
693 668
694} 669}
695 670
@@ -899,21 +874,15 @@ void BScreen::removeNetizen(Window w) {
899 874
900 875
901void BScreen::updateNetizenCurrentWorkspace() { 876void BScreen::updateNetizenCurrentWorkspace() {
902 #ifdef NEWWMSPEC 877#ifdef NEWWMSPEC
903 //update _NET_WM_CURRENT_DESKTOP 878 //update _NET_WM_CURRENT_DESKTOP
904 int workspace = getCurrentWorkspaceID(); 879 int workspace = getCurrentWorkspaceID();
905 XChangeProperty(getBaseDisplay()->getXDisplay(), getRootWindow(), 880 XChangeProperty(getBaseDisplay()->getXDisplay(), getRootWindow(),
906 getBaseDisplay()->getNETCurrentDesktopAtom(), XA_CARDINAL, 32, PropModeReplace, 881 getBaseDisplay()->getNETCurrentDesktopAtom(), XA_CARDINAL, 32, PropModeReplace,
907 (unsigned char *)&workspace, 1); 882 (unsigned char *)&workspace, 1);
908 #endif 883#endif // NEWWMSPEC
909 #ifdef GNOME 884
910 //update _WIN_WORKSPACE 885 m_currentworkspace_sig.notify();
911 int gnome_workspace = getCurrentWorkspaceID();
912 XChangeProperty(getBaseDisplay()->getXDisplay(), getRootWindow(),
913 FbAtoms::instance()->getGnomeWorkspaceAtom(), XA_CARDINAL, 32, PropModeReplace,
914 (unsigned char *)&gnome_workspace, 1);
915 updateGnomeClientList();
916 #endif
917 886
918 Netizens::iterator it = netizenList.begin(); 887 Netizens::iterator it = netizenList.begin();
919 Netizens::iterator it_end = netizenList.end(); 888 Netizens::iterator it_end = netizenList.end();
@@ -931,22 +900,15 @@ void BScreen::updateNetizenWorkspaceCount() {
931 for (; it != it_end; ++it) { 900 for (; it != it_end; ++it) {
932 (*it)->sendWorkspaceCount(); 901 (*it)->sendWorkspaceCount();
933 } 902 }
934 #ifdef NEWWMSPEC 903#ifdef NEWWMSPEC
935 //update _NET_WM_NUMBER_OF_DESKTOPS 904 //update _NET_WM_NUMBER_OF_DESKTOPS
936 int numworkspaces = getCount()-1; 905 int numworkspaces = getCount()-1;
937 XChangeProperty(getBaseDisplay()->getXDisplay(), getRootWindow(), 906 XChangeProperty(getBaseDisplay()->getXDisplay(), getRootWindow(),
938 getBaseDisplay()->getNETNumberOfDesktopsAtom(), XA_CARDINAL, 32, PropModeReplace, 907 getBaseDisplay()->getNETNumberOfDesktopsAtom(), XA_CARDINAL, 32, PropModeReplace,
939 (unsigned char *)&numworkspaces, 1); 908 (unsigned char *)&numworkspaces, 1);
940 #endif 909#endif // NEWWMSPEC
941 910
942 #ifdef GNOME 911 m_workspacecount_sig.notify();
943 {
944 int numworkspaces = getCount();
945 XChangeProperty(getBaseDisplay()->getXDisplay(), getRootWindow(),
946 FbAtoms::instance()->getGnomeWorkspaceCountAtom(), XA_CARDINAL, 32, PropModeReplace,
947 (unsigned char *)&numworkspaces, 1);
948 }
949 #endif
950 912
951} 913}
952 914
@@ -969,9 +931,8 @@ void BScreen::updateNetizenWindowAdd(Window w, unsigned long p) {
969 for (; it != it_end; ++it) { 931 for (; it != it_end; ++it) {
970 (*it)->sendWindowAdd(w, p); 932 (*it)->sendWindowAdd(w, p);
971 } 933 }
972 #ifdef GNOME 934
973 updateGnomeClientList(); 935 m_clientlist_sig.notify();
974 #endif
975 936
976} 937}
977 938
@@ -982,9 +943,8 @@ void BScreen::updateNetizenWindowDel(Window w) {
982 for (; it != it_end; ++it) { 943 for (; it != it_end; ++it) {
983 (*it)->sendWindowDel(w); 944 (*it)->sendWindowDel(w);
984 } 945 }
985 #ifdef GNOME 946
986 updateGnomeClientList(); 947 m_clientlist_sig.notify();
987 #endif
988} 948}
989 949
990 950
@@ -1761,73 +1721,3 @@ FluxboxWindow* BScreen::useAutoGroupWindow() {
1761 return w ? Fluxbox::instance()->searchWindow(w) : 0; 1721 return w ? Fluxbox::instance()->searchWindow(w) : 0;
1762} 1722}
1763 1723
1764#ifdef GNOME
1765void BScreen::initGnomeAtoms() {
1766
1767 /* create the GNOME window */
1768 gnome_win = XCreateSimpleWindow(getBaseDisplay()->getXDisplay(),
1769 getRootWindow(), 0, 0, 5, 5, 0, 0, 0);
1770 FbAtoms *fba = FbAtoms::instance();
1771 /* supported WM check */
1772 XChangeProperty(getBaseDisplay()->getXDisplay(),
1773 getRootWindow(), fba->getGnomeSupportingWMCheckAtom(),
1774 XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &gnome_win, 1);
1775
1776 XChangeProperty(getBaseDisplay()->getXDisplay(), gnome_win,
1777 fba->getGnomeSupportingWMCheckAtom(),
1778 XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &gnome_win, 1);
1779
1780 Atom gnomeatomlist[] = {
1781 fba->getGnomeWorkspaceAtom(),
1782 fba->getGnomeWorkspaceCountAtom(),
1783 fba->getGnomeStateAtom(),
1784 fba->getGnomeWorkspaceNamesAtom(),
1785 fba->getGnomeHintsAtom(),
1786 fba->getGnomeClientListAtom(),
1787// getBaseDisplay()->getGnomeLayerAtom(), // not supported yet
1788 };
1789
1790 //list atoms that we support
1791 XChangeProperty(getBaseDisplay()->getXDisplay(), getRootWindow(),
1792 fba->getGnomeProtAtom(), XA_ATOM, 32, PropModeReplace,
1793 (unsigned char *)gnomeatomlist, (sizeof gnomeatomlist)/sizeof gnomeatomlist[0]);
1794
1795}
1796
1797void BScreen::updateGnomeClientList() {
1798 int num=0;
1799 Workspaces::iterator workspace_it = workspacesList.begin();
1800 Workspaces::iterator workspace_it_end = workspacesList.end();
1801 for (; workspace_it != workspace_it_end; ++workspace_it) {
1802 num += (*workspace_it)->getWindowList().size();
1803 }
1804 //int num = getCurrentWorkspace()->getWindowList().size();
1805
1806 Window *wl = new Window[num];
1807 //start the iterator from begining
1808 workspace_it = workspacesList.begin();
1809 int win=0;
1810 for (; workspace_it != workspace_it_end; ++workspace_it) {
1811
1812 // Fill in array of window ID's
1813 Workspace::Windows::const_iterator it = (*workspace_it)->getWindowList().begin();
1814 Workspace::Windows::const_iterator it_end = (*workspace_it)->getWindowList().end();
1815 for (; it != it_end; ++it) {
1816 //check if the window don't want to be visible in the list
1817 if (! ( (*it)->getGnomeHints() & FluxboxWindow::WIN_STATE_HIDDEN) ) {
1818 wl[win++] = (*it)->getClientWindow();
1819 }
1820 }
1821 }
1822 //number of windows to show in client list
1823 num = win;
1824 XChangeProperty(getBaseDisplay()->getXDisplay(),
1825 getRootWindow(), FbAtoms::instance()->getGnomeClientListAtom(), XA_CARDINAL, 32,
1826 PropModeReplace, (unsigned char *)wl, num);
1827
1828 if (wl)
1829 delete wl;
1830}
1831
1832#endif //!GNOME
1833
diff --git a/src/Screen.hh b/src/Screen.hh
index 967804e..78d518f 100644
--- a/src/Screen.hh
+++ b/src/Screen.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: Screen.hh,v 1.43 2002/08/30 14:03:31 fluxgen Exp $ 25// $Id: Screen.hh,v 1.44 2002/09/07 20:19:13 fluxgen Exp $
26 26
27#ifndef SCREEN_HH 27#ifndef SCREEN_HH
28#define SCREEN_HH 28#define SCREEN_HH
@@ -64,6 +64,9 @@
64 64
65class BScreen : public ScreenInfo { 65class BScreen : public ScreenInfo {
66public: 66public:
67 typedef std::vector<Workspace *> Workspaces;
68 typedef std::vector<std::string> WorkspaceNames;
69
67 BScreen(ResourceManager &rm, Fluxbox *b, 70 BScreen(ResourceManager &rm, Fluxbox *b,
68 const std::string &screenname, const std::string &altscreenname, 71 const std::string &screenname, const std::string &altscreenname,
69 int scrn); 72 int scrn);
@@ -133,8 +136,20 @@ public:
133 inline unsigned int getIconCount() const { return iconList.size(); } 136 inline unsigned int getIconCount() const { return iconList.size(); }
134 inline const Icons &getIconList() const { return iconList; } 137 inline const Icons &getIconList() const { return iconList; }
135 inline Icons &getIconList() { return iconList; } 138 inline Icons &getIconList() { return iconList; }
139 const Workspaces &getWorkspacesList() const { return workspacesList; }
140 const WorkspaceNames &getWorkspaceNames() const { return workspaceNames; }
141
142 /// client list signal
143 FbTk::Subject &clientListSig() { return m_clientlist_sig; }
144 /// workspace count signal
145 FbTk::Subject &workspaceCountSig() { return m_workspacecount_sig; }
146 /// workspace names signal
147 FbTk::Subject &workspaceNamesSig() { return m_workspacenames_sig; }
148 /// current workspace signal
149 FbTk::Subject &currentWorkspaceSig() { return m_currentworkspace_sig; }
150
136 /// @return the resource value of number of workspace 151 /// @return the resource value of number of workspace
137 inline int getNumberOfWorkspaces() const { return *resource.workspaces; } 152 inline int getNumberOfWorkspaces() const { return *resource.workspaces; }
138 inline Toolbar::Placement getToolbarPlacement() const { return *resource.toolbar_placement; } 153 inline Toolbar::Placement getToolbarPlacement() const { return *resource.toolbar_placement; }
139#ifdef XINERAMA 154#ifdef XINERAMA
140 inline int getToolbarOnHead() { return *resource.toolbar_on_head; } 155 inline int getToolbarOnHead() { return *resource.toolbar_on_head; }
@@ -255,13 +270,27 @@ public:
255 // prevFocus/nextFocus option bits 270 // prevFocus/nextFocus option bits
256 enum { CYCLESKIPLOWERTABS = 0x01, CYCLESKIPSTUCK = 0x02, CYCLESKIPSHADED = 0x04, 271 enum { CYCLESKIPLOWERTABS = 0x01, CYCLESKIPSTUCK = 0x02, CYCLESKIPSHADED = 0x04,
257 CYCLEDEFAULT = 0x00 }; 272 CYCLEDEFAULT = 0x00 };
273
274 class ScreenSubject:public FbTk::Subject {
275 public:
276 ScreenSubject(BScreen &scr):m_scr(scr) { }
277 const BScreen &screen() const { return m_scr; }
278 BScreen &screen() { return m_scr; }
279 private:
280 BScreen &m_scr;
281 };
282
258private: 283private:
259 bool doSkipWindow(const FluxboxWindow *w, int options); 284 bool doSkipWindow(const FluxboxWindow *w, int options);
260 #ifdef GNOME 285
261 void initGnomeAtoms(); 286 ScreenSubject
262 void updateGnomeClientList(); 287 m_clientlist_sig, ///< client signal
263 Window gnome_win; 288 m_workspacecount_sig, ///< workspace count signal
264 #endif 289 m_workspacenames_sig, ///< workspace names signal
290 m_currentworkspace_sig; ///< current workspace signal
291
292
293
265 Theme *theme; 294 Theme *theme;
266 295
267 Bool root_colormap_installed, managed, geom_visible; 296 Bool root_colormap_installed, managed, geom_visible;
@@ -294,8 +323,8 @@ private:
294 unsigned int geom_w, geom_h; 323 unsigned int geom_w, geom_h;
295 unsigned long event_mask; 324 unsigned long event_mask;
296 325
297 typedef std::vector<std::string> WorkspaceNames; 326
298 typedef std::vector<Workspace *> Workspaces; 327
299 328
300 WorkspaceNames workspaceNames; 329 WorkspaceNames workspaceNames;
301 Workspaces workspacesList; 330 Workspaces workspacesList;