summaryrefslogtreecommitdiff
path: root/src/Window.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/Window.cc')
-rw-r--r--src/Window.cc108
1 files changed, 80 insertions, 28 deletions
diff --git a/src/Window.cc b/src/Window.cc
index 8d1069e..ca26e5a 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.112 2003/01/10 20:20:37 fluxgen Exp $ 25// $Id: Window.cc,v 1.113 2003/02/02 16:32:39 rathnor Exp $
26 26
27#include "Window.hh" 27#include "Window.hh"
28 28
@@ -99,6 +99,7 @@ FluxboxWindow::FluxboxWindow(Window w, BScreen *s, int screen_num, FbTk::ImageCo
99 FbTk::MenuTheme &menutheme): 99 FbTk::MenuTheme &menutheme):
100 m_hintsig(*this), 100 m_hintsig(*this),
101 m_statesig(*this), 101 m_statesig(*this),
102 m_layersig(*this),
102 m_workspacesig(*this), 103 m_workspacesig(*this),
103 m_diesig(*this), 104 m_diesig(*this),
104 moving(false), resizing(false), shaded(false), maximized(false), 105 moving(false), resizing(false), shaded(false), maximized(false),
@@ -109,7 +110,9 @@ FluxboxWindow::FluxboxWindow(Window w, BScreen *s, int screen_num, FbTk::ImageCo
109 display(0), 110 display(0),
110 lastButtonPressTime(0), 111 lastButtonPressTime(0),
111 m_windowmenu(menutheme, screen_num, imgctrl), 112 m_windowmenu(menutheme, screen_num, imgctrl),
112 m_layer(LAYER_NORMAL), old_decoration(DECOR_NORMAL), 113 m_layeritem(0),
114 m_layernum(4),
115 old_decoration(DECOR_NORMAL),
113 tab(0), 116 tab(0),
114 m_frame(tm, imgctrl, screen_num, 0, 0, 100, 100) { 117 m_frame(tm, imgctrl, screen_num, 0, 0, 100, 100) {
115 118
@@ -150,13 +153,18 @@ FluxboxWindow::FluxboxWindow(Window w, BScreen *s, int screen_num, FbTk::ImageCo
150 client.mwm_hint = 0; 153 client.mwm_hint = 0;
151 client.blackbox_hint = 0; 154 client.blackbox_hint = 0;
152 Fluxbox *fluxbox = Fluxbox::instance(); 155 Fluxbox *fluxbox = Fluxbox::instance();
156
157 // default to normal layer
158 m_layernum = fluxbox->getNormalLayer();
153 159
154 getBlackboxHints(); 160 getBlackboxHints();
155 if (! client.blackbox_hint) 161 if (! client.blackbox_hint) {
156 getMWMHints(); 162 getMWMHints();
163 }
157 164
158 // get size, aspect, minimum/maximum size and other hints set 165 // get size, aspect, minimum/maximum size and other hints set
159 // by the client 166 // by the client
167
160 getWMProtocols(); 168 getWMProtocols();
161 getWMHints(); 169 getWMHints();
162 getWMNormalHints(); 170 getWMNormalHints();
@@ -206,7 +214,7 @@ FluxboxWindow::FluxboxWindow(Window w, BScreen *s, int screen_num, FbTk::ImageCo
206 } 214 }
207 215
208 upsize(); 216 upsize();
209 217
210 bool place_window = true; 218 bool place_window = true;
211 if (fluxbox->isStartup() || transient || 219 if (fluxbox->isStartup() || transient ||
212 client.normal_hint_flags & (PPosition|USPosition)) { 220 client.normal_hint_flags & (PPosition|USPosition)) {
@@ -241,13 +249,18 @@ FluxboxWindow::FluxboxWindow(Window w, BScreen *s, int screen_num, FbTk::ImageCo
241 associateClientWindow(); 249 associateClientWindow();
242 250
243 grabButtons(); 251 grabButtons();
244 252
245 positionWindows(); 253 positionWindows();
246 254
255 m_layeritem = new FbTk::XLayerItem(getFrameWindow());
256
247 if (workspace_number < 0 || workspace_number >= screen->getCount()) 257 if (workspace_number < 0 || workspace_number >= screen->getCount())
248 screen->getCurrentWorkspace()->addWindow(this, place_window); 258 workspace_number = screen->getCurrentWorkspaceID();
249 else 259
250 screen->getWorkspace(workspace_number)->addWindow(this, place_window); 260 restoreAttributes(place_window);
261
262 screen->moveWindowToLayer(this, m_layernum);
263 screen->getWorkspace(workspace_number)->addWindow(this, place_window);
251 264
252 moveResize(m_frame.x(), m_frame.y(), m_frame.width(), m_frame.height()); 265 moveResize(m_frame.x(), m_frame.y(), m_frame.width(), m_frame.height());
253 266
@@ -267,10 +280,13 @@ FluxboxWindow::FluxboxWindow(Window w, BScreen *s, int screen_num, FbTk::ImageCo
267 deiconify(); //we're omnipresent and visible 280 deiconify(); //we're omnipresent and visible
268 } 281 }
269 282
283 setState(current_state);
284
270 // no focus default 285 // no focus default
271 setFocusFlag(false); 286 setFocusFlag(false);
272 287
273 // finaly show the frame and the client window 288 // finaly show the frame and the client window
289
274 m_frame.show(); 290 m_frame.show();
275 XSync(display, False); 291 XSync(display, False);
276} 292}
@@ -342,6 +358,15 @@ FluxboxWindow::~FluxboxWindow() {
342 if (client.window) 358 if (client.window)
343 fluxbox->removeWindowSearch(client.window); 359 fluxbox->removeWindowSearch(client.window);
344 360
361 if (m_layeritem) {
362 m_layeritem->removeWindow(getFrameWindow());
363 //if (hasTab())
364 // m_layeritem->removeWindow(get tab window)
365 if (m_layeritem->isEmpty()) {
366 screen->removeLayerItem(m_layeritem);
367 }
368 }
369
345#ifdef DEBUG 370#ifdef DEBUG
346 cerr<<__FILE__<<"("<<__LINE__<<"): ~FluxboxWindow("<<this<<")"<<endl; 371 cerr<<__FILE__<<"("<<__LINE__<<"): ~FluxboxWindow("<<this<<")"<<endl;
347#endif // DEBUG 372#endif // DEBUG
@@ -732,6 +757,8 @@ void FluxboxWindow::getBlackboxHints() {
732 if (client.blackbox_hint->flags & BaseDisplay::ATTRIB_WORKSPACE) 757 if (client.blackbox_hint->flags & BaseDisplay::ATTRIB_WORKSPACE)
733 workspace_number = client.blackbox_hint->workspace; 758 workspace_number = client.blackbox_hint->workspace;
734 759
760 if (client.blackbox_hint->flags & BaseDisplay::ATTRIB_STACK)
761 workspace_number = client.blackbox_hint->stack;
735 762
736 if (client.blackbox_hint->flags & BaseDisplay::ATTRIB_DECORATION) { 763 if (client.blackbox_hint->flags & BaseDisplay::ATTRIB_DECORATION) {
737 old_decoration = static_cast<Decoration>(client.blackbox_hint->decoration); 764 old_decoration = static_cast<Decoration>(client.blackbox_hint->decoration);
@@ -1093,6 +1120,19 @@ void FluxboxWindow::setWorkspace(int n) {
1093 m_workspacesig.notify(); 1120 m_workspacesig.notify();
1094} 1121}
1095 1122
1123void FluxboxWindow::setLayerNum(int layernum) {
1124 m_layernum = layernum;
1125
1126 blackbox_attrib.flags |= BaseDisplay::ATTRIB_STACK;
1127 blackbox_attrib.stack = layernum;
1128 saveBlackboxHints();
1129
1130#ifdef DEBUG
1131 cerr<<this<<" notify layer signal"<<endl;
1132#endif // DEBUG
1133
1134 m_layersig.notify();
1135}
1096 1136
1097void FluxboxWindow::shade() { 1137void FluxboxWindow::shade() {
1098 if (decorations.titlebar) { 1138 if (decorations.titlebar) {
@@ -1147,18 +1187,13 @@ void FluxboxWindow::lower() {
1147 if (isIconic()) 1187 if (isIconic())
1148 deiconify(); 1188 deiconify();
1149 1189
1150 screen->getWorkspace(workspace_number)->lowerWindow(this); 1190 screen->lowerWindow(this);
1151 if (hasTab())
1152 getTab()->lower(); //lower the tab AND it's windows
1153} 1191}
1154 1192
1155void FluxboxWindow::raise() { 1193void FluxboxWindow::raise() {
1156 if (isIconic()) 1194 if (isIconic())
1157 deiconify(); 1195 deiconify();
1158 screen->getWorkspace(workspace_number)->raiseWindow(this); 1196 screen->raiseWindow(this);
1159 //raise tab first if there is any
1160 if (hasTab())
1161 tab->raise();
1162} 1197}
1163 1198
1164void FluxboxWindow::setFocusFlag(bool focus) { 1199void FluxboxWindow::setFocusFlag(bool focus) {
@@ -1214,6 +1249,13 @@ void FluxboxWindow::installColormap(bool install) {
1214 fluxbox->ungrab(); 1249 fluxbox->ungrab();
1215} 1250}
1216 1251
1252void FluxboxWindow::saveBlackboxHints() {
1253 Fluxbox *fluxbox = Fluxbox::instance();
1254 XChangeProperty(display, client.window, fluxbox->getFluxboxAttributesAtom(),
1255 fluxbox->getFluxboxAttributesAtom(), 32, PropModeReplace,
1256 (unsigned char *) &blackbox_attrib, PropBlackboxAttributesElements);
1257}
1258
1217 1259
1218void FluxboxWindow::setState(unsigned long new_state) { 1260void FluxboxWindow::setState(unsigned long new_state) {
1219 current_state = new_state; 1261 current_state = new_state;
@@ -1225,10 +1267,7 @@ void FluxboxWindow::setState(unsigned long new_state) {
1225 fluxbox->getWMStateAtom(), 32, PropModeReplace, 1267 fluxbox->getWMStateAtom(), 32, PropModeReplace,
1226 (unsigned char *) state, 2); 1268 (unsigned char *) state, 2);
1227 1269
1228 XChangeProperty(display, client.window, fluxbox->getFluxboxAttributesAtom(), 1270 saveBlackboxHints();
1229 fluxbox->getFluxboxAttributesAtom(), 32, PropModeReplace,
1230 (unsigned char *) &blackbox_attrib, PropBlackboxAttributesElements);
1231
1232 //notify state changed 1271 //notify state changed
1233 m_statesig.notify(); 1272 m_statesig.notify();
1234} 1273}
@@ -1328,8 +1367,12 @@ void FluxboxWindow::setGravityOffsets() {
1328 m_frame.move(newx, newy); 1367 m_frame.move(newx, newy);
1329} 1368}
1330 1369
1331 1370/*
1332void FluxboxWindow::restoreAttributes() { 1371 * restoreAttributes sets the attributes to what they should be
1372 * but doesn't change the actual state
1373 * (so the caller can set defaults etc as well)
1374 */
1375void FluxboxWindow::restoreAttributes(bool place_window) {
1333 if (!getState()) 1376 if (!getState())
1334 current_state = NormalState; 1377 current_state = NormalState;
1335 1378
@@ -1363,15 +1406,14 @@ void FluxboxWindow::restoreAttributes() {
1363 int save_state = 1406 int save_state =
1364 ((current_state == IconicState) ? NormalState : current_state); 1407 ((current_state == IconicState) ? NormalState : current_state);
1365 1408
1366 shaded = false; 1409 shaded = true;
1367 shade();
1368 1410
1369 current_state = save_state; 1411 current_state = save_state;
1370 } 1412 }
1371 1413
1372 if (( blackbox_attrib.workspace != screen->getCurrentWorkspaceID()) && 1414 if (( blackbox_attrib.workspace != screen->getCurrentWorkspaceID()) &&
1373 ( blackbox_attrib.workspace < screen->getCount())) { 1415 ( blackbox_attrib.workspace < screen->getCount())) {
1374 screen->reassociateWindow(this, blackbox_attrib.workspace, true); 1416 workspace_number = blackbox_attrib.workspace;
1375 1417
1376 if (current_state == NormalState) current_state = WithdrawnState; 1418 if (current_state == NormalState) current_state = WithdrawnState;
1377 } else if (current_state == WithdrawnState) 1419 } else if (current_state == WithdrawnState)
@@ -1379,12 +1421,16 @@ void FluxboxWindow::restoreAttributes() {
1379 1421
1380 if (blackbox_attrib.flags & BaseDisplay::ATTRIB_OMNIPRESENT && 1422 if (blackbox_attrib.flags & BaseDisplay::ATTRIB_OMNIPRESENT &&
1381 blackbox_attrib.attrib & BaseDisplay::ATTRIB_OMNIPRESENT) { 1423 blackbox_attrib.attrib & BaseDisplay::ATTRIB_OMNIPRESENT) {
1382 stuck = false; 1424 stuck = true;
1383 stick();
1384 1425
1385 current_state = NormalState; 1426 current_state = NormalState;
1386 } 1427 }
1387 1428
1429 if (blackbox_attrib.flags & BaseDisplay::ATTRIB_STACK) {
1430 //TODO check value?
1431 m_layernum = blackbox_attrib.stack;
1432 }
1433
1388 if ((blackbox_attrib.flags & BaseDisplay::ATTRIB_MAXHORIZ) || 1434 if ((blackbox_attrib.flags & BaseDisplay::ATTRIB_MAXHORIZ) ||
1389 (blackbox_attrib.flags & BaseDisplay::ATTRIB_MAXVERT)) { 1435 (blackbox_attrib.flags & BaseDisplay::ATTRIB_MAXVERT)) {
1390 int x = blackbox_attrib.premax_x, y = blackbox_attrib.premax_y; 1436 int x = blackbox_attrib.premax_x, y = blackbox_attrib.premax_y;
@@ -1392,7 +1438,7 @@ void FluxboxWindow::restoreAttributes() {
1392 maximized = false; 1438 maximized = false;
1393 if ((blackbox_attrib.flags & BaseDisplay::ATTRIB_MAXHORIZ) && 1439 if ((blackbox_attrib.flags & BaseDisplay::ATTRIB_MAXHORIZ) &&
1394 (blackbox_attrib.flags & BaseDisplay::ATTRIB_MAXVERT)) 1440 (blackbox_attrib.flags & BaseDisplay::ATTRIB_MAXVERT))
1395 maximize(); 1441 maximized = true;
1396 else if (blackbox_attrib.flags & BaseDisplay::ATTRIB_MAXVERT) 1442 else if (blackbox_attrib.flags & BaseDisplay::ATTRIB_MAXVERT)
1397 maximizeVertical(); 1443 maximizeVertical();
1398 else if (blackbox_attrib.flags & BaseDisplay::ATTRIB_MAXHORIZ) 1444 else if (blackbox_attrib.flags & BaseDisplay::ATTRIB_MAXHORIZ)
@@ -2221,7 +2267,7 @@ void FluxboxWindow::restore(bool remap) {
2221 if (! XCheckTypedWindowEvent(display, client.window, ReparentNotify, 2267 if (! XCheckTypedWindowEvent(display, client.window, ReparentNotify,
2222 &dummy)) { 2268 &dummy)) {
2223#ifdef DEBUG 2269#ifdef DEBUG
2224 cerr<<"FluxboxWindow::restore: reparent 0x"<<hex<<client.window<<dec<<"to root"<<endl; 2270 cerr<<"FluxboxWindow::restore: reparent 0x"<<hex<<client.window<<dec<<" to root"<<endl;
2225#endif // DEBUG 2271#endif // DEBUG
2226 2272
2227 // reparent to screen window 2273 // reparent to screen window
@@ -2282,6 +2328,12 @@ void FluxboxWindow::changeBlackboxHints(const BaseDisplay::BlackboxHints &net) {
2282 deiconify(); 2328 deiconify();
2283 } 2329 }
2284 2330
2331 if (net.flags & BaseDisplay::ATTRIB_STACK) {
2332 if ((unsigned int) m_layernum != net.stack) {
2333 screen->moveWindowToLayer(this, net.stack);
2334 }
2335 }
2336
2285 if (net.flags & BaseDisplay::ATTRIB_DECORATION) { 2337 if (net.flags & BaseDisplay::ATTRIB_DECORATION) {
2286 old_decoration = static_cast<Decoration>(net.decoration); 2338 old_decoration = static_cast<Decoration>(net.decoration);
2287 setDecoration(old_decoration); 2339 setDecoration(old_decoration);