aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Window.cc115
1 files changed, 66 insertions, 49 deletions
diff --git a/src/Window.cc b/src/Window.cc
index b7a28fa..55fe23c 100644
--- a/src/Window.cc
+++ b/src/Window.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: Window.cc,v 1.120 2003/02/18 15:11:10 rathnor Exp $ 25// $Id: Window.cc,v 1.121 2003/02/19 14:53:38 fluxgen Exp $
26 26
27#include "Window.hh" 27#include "Window.hh"
28 28
@@ -55,7 +55,7 @@ using namespace std;
55namespace { 55namespace {
56 56
57void grabButton(Display *display, unsigned int button, 57void grabButton(Display *display, unsigned int button,
58 Window window, Cursor cursor) { 58 Window window, Cursor cursor) {
59 59
60 //numlock 60 //numlock
61 XGrabButton(display, button, Mod1Mask|Mod2Mask, window, True, 61 XGrabButton(display, button, Mod1Mask|Mod2Mask, window, True,
@@ -93,6 +93,40 @@ void grabButton(Display *display, unsigned int button,
93 93
94} 94}
95 95
96/// raise window and do the same for each transient it holds
97void raiseFluxboxWindow(FluxboxWindow &win) {
98
99 if (!win.isIconic()) {
100 win.getScreen()->updateNetizenWindowRaise(win.getClientWindow());
101 win.getLayerItem().raise();
102 }
103
104 // for each transient do raise
105 std::list<FluxboxWindow *>::const_iterator it = win.getTransients().begin();
106 std::list<FluxboxWindow *>::const_iterator it_end = win.getTransients().end();
107 for (; it != it_end; ++it) {
108 if (!(*it)->isIconic())
109 raiseFluxboxWindow(*(*it));
110 }
111}
112
113/// lower window and do the same for each transient it holds
114void lowerFluxboxWindow(FluxboxWindow &win) {
115
116 if (!win.isIconic()) {
117 win.getScreen()->updateNetizenWindowLower(win.getClientWindow());
118 win.getLayerItem().lower();
119 }
120
121 // for each transient do lower
122 std::list<FluxboxWindow *>::const_iterator it = win.getTransients().begin();
123 std::list<FluxboxWindow *>::const_iterator it_end = win.getTransients().end();
124 for (; it != it_end; ++it) {
125 if (!(*it)->isIconic())
126 lowerFluxboxWindow(*(*it));
127 }
128}
129
96}; 130};
97 131
98FluxboxWindow::FluxboxWindow(Window w, BScreen *s, int screen_num, 132FluxboxWindow::FluxboxWindow(Window w, BScreen *s, int screen_num,
@@ -121,11 +155,11 @@ FluxboxWindow::FluxboxWindow(Window w, BScreen *s, int screen_num,
121{ 155{
122 156
123 m_layermenu = new LayerMenu<FluxboxWindow>( 157 m_layermenu = new LayerMenu<FluxboxWindow>(
124 menutheme, 158 menutheme,
125 screen_num, 159 screen_num,
126 imgctrl, 160 imgctrl,
127 *s->layerManager().getLayer(Fluxbox::instance()->getMenuLayer()), 161 *s->layerManager().getLayer(Fluxbox::instance()->getMenuLayer()),
128 this); 162 this);
129 163
130 164
131 // redirect events from frame to us 165 // redirect events from frame to us
@@ -153,8 +187,8 @@ FluxboxWindow::FluxboxWindow(Window w, BScreen *s, int screen_num,
153 decorations.menu = true; //override menu option 187 decorations.menu = true; //override menu option
154 // all decorations on by default 188 // all decorations on by default
155 decorations.titlebar = decorations.border = decorations.handle = true; 189 decorations.titlebar = decorations.border = decorations.handle = true;
156 decorations.maximize = decorations.close = decorations.sticky = decorations.shade = 190 decorations.maximize = decorations.close =
157 decorations.tab = true; 191 decorations.sticky = decorations.shade = decorations.tab = true;
158 192
159 193
160 functions.resize = functions.move = functions.iconify = functions.maximize = true; 194 functions.resize = functions.move = functions.iconify = functions.maximize = true;
@@ -269,7 +303,12 @@ FluxboxWindow::FluxboxWindow(Window w, BScreen *s, int screen_num,
269 303
270 restoreAttributes(); 304 restoreAttributes();
271 305
272 moveToLayer(m_layernum); 306 // if we're a transient then we should be on the same layer as our parent
307 if (isTransient()) {
308 getLayerItem().setLayer(getTransientFor()->getLayerItem().getLayer());
309 } else // if no parent then set default layer
310 moveToLayer(m_layernum);
311
273 screen->getWorkspace(workspace_number)->addWindow(this, place_window); 312 screen->getWorkspace(workspace_number)->addWindow(this, place_window);
274 313
275 moveResize(m_frame.x(), m_frame.y(), m_frame.width(), m_frame.height()); 314 moveResize(m_frame.x(), m_frame.y(), m_frame.width(), m_frame.height());
@@ -1194,61 +1233,40 @@ void FluxboxWindow::stick() {
1194 setState(current_state); 1233 setState(current_state);
1195} 1234}
1196 1235
1236
1197void FluxboxWindow::raise() { 1237void FluxboxWindow::raise() {
1198 if (isIconic()) 1238 if (isIconic())
1199 deiconify(); 1239 deiconify();
1200 1240
1241 // get root window
1201 FluxboxWindow *win = this; 1242 FluxboxWindow *win = this;
1202
1203 while (win->getTransientFor()) { 1243 while (win->getTransientFor()) {
1204 win = win->getTransientFor(); 1244 win = win->getTransientFor();
1205 assert(win != win->getTransientFor()); 1245 assert(win != win->getTransientFor());
1206 } 1246 }
1207 1247 // if we don't have any root window use this as root
1208 if (win == 0) 1248 if (win == 0)
1209 win = this; 1249 win = this;
1210 1250
1211 if (!win->isIconic()) { 1251 // raise this window and every transient in it
1212 screen->updateNetizenWindowRaise(win->getClientWindow()); 1252 raiseFluxboxWindow(*win);
1213 win->getLayerItem().raise();
1214 }
1215
1216 std::list<FluxboxWindow *>::const_iterator it = win->getTransients().begin();
1217 std::list<FluxboxWindow *>::const_iterator it_end = win->getTransients().end();
1218 for (; it != it_end; ++it) {
1219 if (!(*it)->isIconic()) {
1220 screen->updateNetizenWindowRaise((*it)->getClientWindow());
1221 (*it)->getLayerItem().raise();
1222 }
1223 }
1224} 1253}
1225 1254
1226void FluxboxWindow::lower() { 1255void FluxboxWindow::lower() {
1227 if (isIconic()) 1256 if (isIconic())
1228 deiconify(); 1257 deiconify();
1229 1258
1230 FluxboxWindow *win = (FluxboxWindow *) 0, *bottom = this; 1259 // get root window (i.e the bottom window)
1231 1260 FluxboxWindow *bottom = this;
1232 while (bottom->getTransientFor()) { 1261 while (bottom->getTransientFor()) {
1233 bottom = bottom->getTransientFor(); 1262 bottom = bottom->getTransientFor();
1234 assert(bottom != bottom->getTransientFor()); 1263 assert(bottom != bottom->getTransientFor());
1235 } 1264 }
1265
1266 if (bottom == 0)
1267 bottom = this;
1236 1268
1237 win = bottom; 1269 lowerFluxboxWindow(*bottom);
1238
1239 if (!win->isIconic()) {
1240 screen->updateNetizenWindowLower(win->getClientWindow());
1241 win->getLayerItem().lower();
1242 }
1243 std::list<FluxboxWindow *>::const_iterator it = win->getTransients().begin();
1244 std::list<FluxboxWindow *>::const_iterator it_end = win->getTransients().end();
1245 for (; it != it_end; ++it) {
1246 if (!(*it)->isIconic()) {
1247 screen->updateNetizenWindowLower((*it)->getClientWindow());
1248 (*it)->getLayerItem().lower();
1249 }
1250 }
1251
1252} 1270}
1253 1271
1254void FluxboxWindow::raiseLayer() { 1272void FluxboxWindow::raiseLayer() {
@@ -1619,7 +1637,9 @@ void FluxboxWindow::popupMenu() {
1619 return; 1637 return;
1620 } 1638 }
1621 1639
1622 m_windowmenu.move(m_last_button_x, m_frame.y() + m_frame.titlebar().height() + m_frame.titlebar().borderWidth()*2); 1640 m_windowmenu.move(m_last_button_x,
1641 m_frame.y() + m_frame.titlebar().height() +
1642 m_frame.titlebar().borderWidth()*2);
1623 m_windowmenu.show(); 1643 m_windowmenu.show();
1624 m_windowmenu.raise(); 1644 m_windowmenu.raise();
1625} 1645}
@@ -1850,8 +1870,6 @@ void FluxboxWindow::propertyNotifyEvent(Atom atom) {
1850 1870
1851 case XA_WM_ICON_NAME: 1871 case XA_WM_ICON_NAME:
1852 updateIconNameFromClient(); 1872 updateIconNameFromClient();
1853 if (iconic)
1854 screen->iconUpdate();
1855 updateIcon(); 1873 updateIcon();
1856 break; 1874 break;
1857 1875
@@ -1938,13 +1956,13 @@ void FluxboxWindow::configureRequestEvent(XConfigureRequestEvent &cr) {
1938 client.old_bw = cr.border_width; 1956 client.old_bw = cr.border_width;
1939 1957
1940 if (cr.value_mask & CWX) 1958 if (cr.value_mask & CWX)
1941 cx = cr.x;// - frame_mwm_border_w - screen->getBorderWidth(); 1959 cx = cr.x;
1942 1960
1943 if (cr.value_mask & CWY) 1961 if (cr.value_mask & CWY)
1944 cy = cr.y - m_frame.titlebar().height(); // - frame_mwm_border_w - screen->getBorderWidth(); 1962 cy = cr.y - m_frame.titlebar().height();
1945 1963
1946 if (cr.value_mask & CWWidth) 1964 if (cr.value_mask & CWWidth)
1947 cw = cr.width;// + (frame_mwm_border_w * 2); 1965 cw = cr.width;
1948 1966
1949 if (cr.value_mask & CWHeight) 1967 if (cr.value_mask & CWHeight)
1950 ch = cr.height; 1968 ch = cr.height;
@@ -2015,7 +2033,6 @@ void FluxboxWindow::buttonReleaseEvent(XButtonEvent &re) {
2015 XUngrabPointer(display, CurrentTime); 2033 XUngrabPointer(display, CurrentTime);
2016 } 2034 }
2017 2035
2018
2019} 2036}
2020 2037
2021 2038