aboutsummaryrefslogtreecommitdiff
path: root/src/Screen.cc
diff options
context:
space:
mode:
authorrathnor <rathnor>2003-02-02 16:32:41 (GMT)
committerrathnor <rathnor>2003-02-02 16:32:41 (GMT)
commit1b063dcea92e0a7ac5008518fc5c13f03c055f54 (patch)
tree29d5b622c0870f06a94086ed463ab90e23bc673e /src/Screen.cc
parent5244fc32447d2649a52a06dc84d96da94e9fd715 (diff)
downloadfluxbox-1b063dcea92e0a7ac5008518fc5c13f03c055f54.zip
fluxbox-1b063dcea92e0a7ac5008518fc5c13f03c055f54.tar.bz2
Integration of new Layering code, plus updates to the layering code itself
- new KeyActions: Raise/LowerLayer, AlwaysOnTop/Bottom, Top/BottomLayer Added a "Quit" KeyAction
Diffstat (limited to 'src/Screen.cc')
-rw-r--r--src/Screen.cc184
1 files changed, 171 insertions, 13 deletions
diff --git a/src/Screen.cc b/src/Screen.cc
index e96dce8..864bc50 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.100 2003/01/12 23:56:49 fluxgen Exp $ 25// $Id: Screen.cc,v 1.101 2003/02/02 16:32:38 rathnor Exp $
26 26
27 27
28#include "Screen.hh" 28#include "Screen.hh"
@@ -43,6 +43,8 @@
43#include "BoolMenuItem.hh" 43#include "BoolMenuItem.hh"
44//#include "IntResMenuItem.hh" 44//#include "IntResMenuItem.hh"
45#include "MacroCommand.hh" 45#include "MacroCommand.hh"
46#include "XLayerItem.hh"
47#include "MultLayers.hh"
46 48
47//use GNU extensions 49//use GNU extensions
48#ifndef _GNU_SOURCE 50#ifndef _GNU_SOURCE
@@ -132,7 +134,11 @@ int dcmp(const void *one, const void *two) {
132} 134}
133 135
134FbTk::Menu *createMenuFromScreen(BScreen &screen) { 136FbTk::Menu *createMenuFromScreen(BScreen &screen) {
135 return new FbTk::Menu(*screen.menuTheme(), screen.getScreenNumber(), *screen.getImageControl()); 137 FbTk::Menu *menu = new FbTk::Menu(*screen.menuTheme(), screen.getScreenNumber(), *screen.getImageControl());
138 menu->setLayerItem(new FbTk::XLayerItem(menu->windowID()));
139
140 screen.setLayer(*menu->getLayerItem(), Fluxbox::instance()->getMenuLayer());
141 return menu;
136} 142}
137}; 143};
138 144
@@ -340,7 +346,8 @@ BScreen::BScreen(ResourceManager &rm,
340 m_workspacecount_sig(*this), // workspace count signal 346 m_workspacecount_sig(*this), // workspace count signal
341 m_workspacenames_sig(*this), // workspace names signal 347 m_workspacenames_sig(*this), // workspace names signal
342 m_currentworkspace_sig(*this), // current workspace signal 348 m_currentworkspace_sig(*this), // current workspace signal
343 theme(0), m_windowtheme(scrn), 349 m_layermanager(0),
350 theme(0), m_windowtheme(scrn),
344 m_menutheme(new FbTk::MenuTheme(scrn)), 351 m_menutheme(new FbTk::MenuTheme(scrn)),
345 resource(rm, screenname, altscreenname), 352 resource(rm, screenname, altscreenname),
346 m_root_theme(new RootTheme(*this)) 353 m_root_theme(new RootTheme(*this))
@@ -392,6 +399,7 @@ BScreen::BScreen(ResourceManager &rm,
392 399
393 fluxbox->load_rc(this); 400 fluxbox->load_rc(this);
394 401
402 m_layermanager = new FbTk::MultLayers(fluxbox->getNumberOfLayers());
395 image_control->setDither(*resource.image_dither); 403 image_control->setDither(*resource.image_dither);
396 theme = new Theme(disp, getRootWindow(), colormap(), getScreenNumber(), 404 theme = new Theme(disp, getRootWindow(), colormap(), getScreenNumber(),
397 fluxbox->getStyleFilename(), getRootCommand().c_str()); 405 fluxbox->getStyleFilename(), getRootCommand().c_str());
@@ -461,12 +469,12 @@ BScreen::BScreen(ResourceManager &rm,
461 Workspace *wkspc = (Workspace *) 0; 469 Workspace *wkspc = (Workspace *) 0;
462 if (*resource.workspaces != 0) { 470 if (*resource.workspaces != 0) {
463 for (int i = 0; i < *resource.workspaces; ++i) { 471 for (int i = 0; i < *resource.workspaces; ++i) {
464 wkspc = new Workspace(this, workspacesList.size()); 472 wkspc = new Workspace(this, *m_layermanager, workspacesList.size());
465 workspacesList.push_back(wkspc); 473 workspacesList.push_back(wkspc);
466 workspacemenu->insert(wkspc->name().c_str(), &wkspc->menu()); 474 workspacemenu->insert(wkspc->name().c_str(), &wkspc->menu());
467 } 475 }
468 } else { 476 } else {
469 wkspc = new Workspace(this, workspacesList.size()); 477 wkspc = new Workspace(this, *m_layermanager, workspacesList.size());
470 workspacesList.push_back(wkspc); 478 workspacesList.push_back(wkspc);
471 workspacemenu->insert(wkspc->name().c_str(), &wkspc->menu()); 479 workspacemenu->insert(wkspc->name().c_str(), &wkspc->menu());
472 } 480 }
@@ -547,7 +555,6 @@ BScreen::BScreen(ResourceManager &rm,
547 if (win) { 555 if (win) {
548 XMapRequestEvent mre; 556 XMapRequestEvent mre;
549 mre.window = children[i]; 557 mre.window = children[i];
550 win->restoreAttributes();
551 win->mapRequestEvent(mre); 558 win->mapRequestEvent(mre);
552 } 559 }
553 } 560 }
@@ -809,7 +816,7 @@ void BScreen::setAntialias(bool value) {
809} 816}
810 817
811int BScreen::addWorkspace() { 818int BScreen::addWorkspace() {
812 Workspace *wkspc = new Workspace(this, workspacesList.size()); 819 Workspace *wkspc = new Workspace(this, *m_layermanager, workspacesList.size());
813 workspacesList.push_back(wkspc); 820 workspacesList.push_back(wkspc);
814 addWorkspaceName(wkspc->name().c_str()); // update names 821 addWorkspaceName(wkspc->name().c_str()); // update names
815 //add workspace to workspacemenu 822 //add workspace to workspacemenu
@@ -902,7 +909,7 @@ void BScreen::changeWorkspaceID(unsigned int id) {
902 !(focused && focused->isMoving())) { 909 !(focused && focused->isMoving())) {
903 current_workspace->getLastFocusedWindow()->setInputFocus(); 910 current_workspace->getLastFocusedWindow()->setInputFocus();
904 911
905 } else if (focused && focused->isStuck()) { 912 } else if (focused && (focused->isStuck() || focused->isMoving())) {
906 focused->setInputFocus(); 913 focused->setInputFocus();
907 } 914 }
908 915
@@ -1184,6 +1191,13 @@ void BScreen::setupWindowActions(FluxboxWindow &win) {
1184} 1191}
1185void BScreen::raiseWindows(const Workspace::Stack &workspace_stack) { 1192void BScreen::raiseWindows(const Workspace::Stack &workspace_stack) {
1186 1193
1194 // TODO: I don't think we need this...
1195#ifdef DEBUG
1196 cerr<<"BScreen::raiseWindows() called"<<endl;
1197#endif //DEBUG
1198
1199 /*
1200
1187 Window session_stack[(workspace_stack.size() + workspacesList.size() + rootmenuList.size() + 30)]; 1201 Window session_stack[(workspace_stack.size() + workspacesList.size() + rootmenuList.size() + 30)];
1188 int i = 0; 1202 int i = 0;
1189 1203
@@ -1217,7 +1231,7 @@ void BScreen::raiseWindows(const Workspace::Stack &workspace_stack) {
1217 } 1231 }
1218 1232
1219 XRestackWindows(getBaseDisplay()->getXDisplay(), session_stack, i); 1233 XRestackWindows(getBaseDisplay()->getXDisplay(), session_stack, i);
1220 1234 */
1221} 1235}
1222 1236
1223void BScreen::saveStrftimeFormat(const char *format) { 1237void BScreen::saveStrftimeFormat(const char *format) {
@@ -1311,7 +1325,7 @@ void BScreen::nextFocus(int opts) {
1311 } while (*it != focused); 1325 } while (*it != focused);
1312 1326
1313 if (*it != focused && it != wins.end()) 1327 if (*it != focused && it != wins.end())
1314 wksp->raiseWindow(*it); 1328 raiseWindow(*it);
1315 1329
1316 } 1330 }
1317 1331
@@ -1354,7 +1368,7 @@ void BScreen::prevFocus(int opts) {
1354 } while (*it != focused); 1368 } while (*it != focused);
1355 1369
1356 if (*it != focused && it != wins.end()) 1370 if (*it != focused && it != wins.end())
1357 wksp->raiseWindow(*it); 1371 raiseWindow(*it);
1358 1372
1359 } 1373 }
1360} 1374}
@@ -1375,8 +1389,7 @@ void BScreen::raiseFocus() {
1375 } 1389 }
1376 1390
1377 if ((getCurrentWorkspace()->getCount() > 1) && have_focused) 1391 if ((getCurrentWorkspace()->getCount() > 1) && have_focused)
1378 getWorkspace(fb->getFocusedWindow()->getWorkspaceNumber())-> 1392 raiseWindow(fb->getFocusedWindow());
1379 raiseWindow(fb->getFocusedWindow());
1380} 1393}
1381 1394
1382void BScreen::initMenu() { 1395void BScreen::initMenu() {
@@ -1924,6 +1937,151 @@ void BScreen::hideGeometry() {
1924 } 1937 }
1925} 1938}
1926 1939
1940void BScreen::raise(FbTk::XLayerItem &item) {
1941 item.raise();
1942}
1943
1944void BScreen::lower(FbTk::XLayerItem &item) {
1945 item.lower();
1946}
1947
1948void BScreen::setLayer(FbTk::XLayerItem &item, int layernum) {
1949 m_layermanager->moveToLayer(item, layernum);
1950}
1951
1952void BScreen::removeLayerItem(FbTk::XLayerItem *item) {
1953 m_layermanager->remove(*item);
1954 delete item;
1955}
1956
1957void BScreen::raiseWindow(FluxboxWindow *w) {
1958 FluxboxWindow *win = w;
1959
1960 while (win->getTransientFor()) {
1961 win = win->getTransientFor();
1962 assert(win != win->getTransientFor());
1963 }
1964
1965 if (!win->isIconic()) {
1966 updateNetizenWindowRaise(win->getClientWindow());
1967 win->getLayerItem()->raise();
1968 }
1969 std::list<FluxboxWindow *>::const_iterator it = win->getTransients().begin();
1970 std::list<FluxboxWindow *>::const_iterator it_end = win->getTransients().end();
1971 for (; it != it_end; ++it) {
1972 if (!(*it)->isIconic()) {
1973 updateNetizenWindowRaise((*it)->getClientWindow());
1974 (*it)->getLayerItem()->raise();
1975 }
1976 }
1977}
1978
1979void BScreen::lowerWindow(FluxboxWindow *w) {
1980 FluxboxWindow *win = (FluxboxWindow *) 0, *bottom = w;
1981
1982 while (bottom->getTransientFor()) {
1983 bottom = bottom->getTransientFor();
1984 assert(bottom != bottom->getTransientFor());
1985 }
1986
1987 win = bottom;
1988
1989 if (!win->isIconic()) {
1990 updateNetizenWindowLower(win->getClientWindow());
1991 win->getLayerItem()->lower();
1992 }
1993 std::list<FluxboxWindow *>::const_iterator it = win->getTransients().begin();
1994 std::list<FluxboxWindow *>::const_iterator it_end = win->getTransients().end();
1995 for (; it != it_end; ++it) {
1996 if (!(*it)->isIconic()) {
1997 updateNetizenWindowLower((*it)->getClientWindow());
1998 (*it)->getLayerItem()->lower();
1999 }
2000 }
2001
2002}
2003
2004void BScreen::raiseWindowLayer(FluxboxWindow *w) {
2005 FluxboxWindow *win = w;
2006
2007 while (win->getTransientFor()) {
2008 win = win->getTransientFor();
2009 assert(win != win->getTransientFor());
2010 }
2011
2012 if (!win->isIconic()) {
2013 updateNetizenWindowRaise(win->getClientWindow());
2014 m_layermanager->raise(*win->getLayerItem());
2015 win->setLayerNum(win->getLayerNum()-1);
2016 }
2017 std::list<FluxboxWindow *>::const_iterator it = win->getTransients().begin();
2018 std::list<FluxboxWindow *>::const_iterator it_end = win->getTransients().end();
2019 for (; it != it_end; ++it) {
2020 if (!(*it)->isIconic()) {
2021 updateNetizenWindowRaise((*it)->getClientWindow());
2022 m_layermanager->raise(*(*it)->getLayerItem());
2023 (*it)->setLayerNum((*it)->getLayerNum()-1);
2024 }
2025 }
2026}
2027
2028void BScreen::lowerWindowLayer(FluxboxWindow *w) {
2029 FluxboxWindow *win = (FluxboxWindow *) 0, *bottom = w;
2030
2031 while (bottom->getTransientFor()) {
2032 bottom = bottom->getTransientFor();
2033 assert(bottom != bottom->getTransientFor());
2034 }
2035
2036 win = bottom;
2037
2038 if (!win->isIconic()) {
2039 updateNetizenWindowLower(win->getClientWindow());
2040 m_layermanager->lower(*win->getLayerItem());
2041 win->setLayerNum(win->getLayerNum()+1);
2042 }
2043 std::list<FluxboxWindow *>::const_iterator it = win->getTransients().begin();
2044 std::list<FluxboxWindow *>::const_iterator it_end = win->getTransients().end();
2045 for (; it != it_end; ++it) {
2046 if (!(*it)->isIconic()) {
2047 updateNetizenWindowLower((*it)->getClientWindow());
2048 m_layermanager->lower(*(*it)->getLayerItem());
2049 (*it)->setLayerNum((*it)->getLayerNum()+1);
2050 }
2051 }
2052
2053}
2054
2055void BScreen::moveWindowToLayer(FluxboxWindow *win, int layernum) {
2056 Fluxbox * fluxbox = Fluxbox::instance();
2057
2058 // don't let it set its layer into menu area
2059 if (layernum <= fluxbox->getMenuLayer()) {
2060 layernum = fluxbox->getMenuLayer() + 1;
2061 }
2062
2063 while (win->getTransientFor()) {
2064 win = win->getTransientFor();
2065 assert(win != win->getTransientFor());
2066 }
2067
2068 if (!win->isIconic()) {
2069 updateNetizenWindowRaise(win->getClientWindow());
2070 m_layermanager->moveToLayer(*win->getLayerItem(),layernum);
2071 win->setLayerNum(layernum);
2072 }
2073 std::list<FluxboxWindow *>::const_iterator it = win->getTransients().begin();
2074 std::list<FluxboxWindow *>::const_iterator it_end = win->getTransients().end();
2075 for (; it != it_end; ++it) {
2076 if (!(*it)->isIconic()) {
2077 updateNetizenWindowRaise((*it)->getClientWindow());
2078 m_layermanager->moveToLayer(*(*it)->getLayerItem(), layernum);
2079 (*it)->setLayerNum(layernum);
2080 }
2081 }
2082}
2083
2084
1927/** 2085/**
1928 Goes to the workspace "right" of the current 2086 Goes to the workspace "right" of the current
1929*/ 2087*/