summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Window.cc217
1 files changed, 91 insertions, 126 deletions
diff --git a/src/Window.cc b/src/Window.cc
index 2df8f30..838a0a2 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.79 2002/09/07 20:16:43 fluxgen Exp $ 25// $Id: Window.cc,v 1.80 2002/09/08 19:51:30 fluxgen Exp $
26 26
27#include "Window.hh" 27#include "Window.hh"
28 28
@@ -139,7 +139,7 @@ tab(0) {
139 functions.close = decorations.close = false; 139 functions.close = decorations.close = false;
140 140
141 client.wm_hint_flags = client.normal_hint_flags = 0; 141 client.wm_hint_flags = client.normal_hint_flags = 0;
142 client.transient_for = client.transient = 0; 142 client.transient_for = 0;
143 client.mwm_hint = (MwmHints *) 0; 143 client.mwm_hint = (MwmHints *) 0;
144 client.blackbox_hint = 0; 144 client.blackbox_hint = 0;
145 145
@@ -335,7 +335,8 @@ tab(0) {
335FluxboxWindow::~FluxboxWindow() { 335FluxboxWindow::~FluxboxWindow() {
336 if (screen == 0) //the window wasn't created 336 if (screen == 0) //the window wasn't created
337 return; 337 return;
338 338 timer.stop();
339
339 Fluxbox *fluxbox = Fluxbox::instance(); 340 Fluxbox *fluxbox = Fluxbox::instance();
340 341
341 if (moving || resizing) { 342 if (moving || resizing) {
@@ -343,13 +344,11 @@ FluxboxWindow::~FluxboxWindow() {
343 XUngrabPointer(display, CurrentTime); 344 XUngrabPointer(display, CurrentTime);
344 } 345 }
345 346
346 if (!iconic) { 347 if (iconic)
347 Workspace *workspace = screen->getWorkspace(workspace_number);
348 if (workspace)
349 workspace->removeWindow(this);
350 } else //it's iconic
351 screen->removeIcon(this); 348 screen->removeIcon(this);
352 349
350 screen->removeWindow(this);
351
353 if (windowmenu) { 352 if (windowmenu) {
354 delete windowmenu; 353 delete windowmenu;
355 windowmenu = 0; 354 windowmenu = 0;
@@ -371,32 +370,20 @@ FluxboxWindow::~FluxboxWindow() {
371 } 370 }
372 371
373 372
374 if (isTransient()) { 373 if (client.transient_for != 0) {
375 //guard from having transient_for = this 374 client.transient_for->client.transients.remove(this);
376 if (client.transient_for == this) { 375 client.transient_for = 0;
377#ifdef DEBUG 376 }
378 cerr<<__FILE__<<"("<<__LINE__<<"): WARNING! client.transient_for == this WARNING!"<<endl; 377
379 assert(0); 378 while (!client.transients.empty()) {
380#endif //DEBUG 379 client.transients.back()->client.transient_for = 0;
381 client.transient_for = 0; 380 client.transients.pop_back();
382
383 }
384 if (client.transient == this) {
385 client.transient = 0;
386 assert(0);
387 }
388 fluxbox->setFocusedWindow(client.transient_for);
389 } 381 }
390 382
391 if (client.window_group) { 383 if (client.window_group) {
392 fluxbox->removeGroupSearch(client.window_group); 384 fluxbox->removeGroupSearch(client.window_group);
393 client.window_group = 0; 385 client.window_group = 0;
394 } 386 }
395
396 if (transient && client.transient_for)
397 client.transient_for->client.transient = client.transient;
398 if (client.transient)
399 client.transient->client.transient_for = client.transient_for;
400 387
401 destroyTitlebar(); 388 destroyTitlebar();
402 389
@@ -430,17 +417,11 @@ FluxboxWindow::~FluxboxWindow() {
430 frame.window = 0; 417 frame.window = 0;
431 } 418 }
432 419
433 // Make sure we don't remove 420 fluxbox->removeWindowSearch(client.window);
434 // a slit client from the list
435 if (managed) {
436 fluxbox->removeWindowSearch(client.window);
437 screen->removeNetizen(client.window);
438 }
439
440 421
441 #ifdef DEBUG 422#ifdef DEBUG
442 cerr<<__FILE__<<"("<<__LINE__<<"): ~FluxboxWindow(this="<<this<<") done"<<endl; 423 cerr<<__FILE__<<"("<<__LINE__<<"): ~FluxboxWindow("<<this<<")"<<endl;
443 #endif 424#endif // DEBUG
444} 425}
445 426
446Window FluxboxWindow::createToplevelWindow( 427Window FluxboxWindow::createToplevelWindow(
@@ -1524,37 +1505,38 @@ bool FluxboxWindow::setInputFocus() {
1524 frame.y + screen->getBorderWidth(), frame.width, frame.height); 1505 frame.y + screen->getBorderWidth(), frame.width, frame.height);
1525 } 1506 }
1526 1507
1527 Fluxbox *fluxbox = Fluxbox::instance();
1528 fluxbox->grab();
1529 if (! validateClient()) 1508 if (! validateClient())
1530 return false; 1509 return false;
1531 1510
1532 bool ret = false; 1511 bool ret = false;
1533 1512
1534 if (client.transient && modal) { 1513 if (client.transients.size() && modal) {
1535 fluxbox->ungrab(); 1514 std::list<FluxboxWindow *>::iterator it = client.transients.begin();
1536 return client.transient->setInputFocus(); 1515 std::list<FluxboxWindow *>::iterator it_end = client.transients.end();
1516 for (; it != it_end; ++it) {
1517 if ((*it)->modal)
1518 return (*it)->setInputFocus();
1519 }
1537 } else { 1520 } else {
1538 if (! focused) { 1521 if (! focused) {
1539 if (focus_mode == F_LOCALLYACTIVE || focus_mode == F_PASSIVE) { 1522 if (focus_mode == F_LOCALLYACTIVE || focus_mode == F_PASSIVE) {
1540 XSetInputFocus(display, client.window, 1523 XSetInputFocus(display, client.window,
1541 RevertToPointerRoot, CurrentTime); 1524 RevertToPointerRoot, CurrentTime);
1542 } else { 1525 } else {
1543 fluxbox->ungrab();
1544 return false; 1526 return false;
1545 } 1527 }
1546 1528 Fluxbox *fb = Fluxbox::instance();
1547 fluxbox->setFocusedWindow(this); 1529 fb->setFocusedWindow(this);
1548 1530
1549 if (send_focus_message) { 1531 if (send_focus_message) {
1550 XEvent ce; 1532 XEvent ce;
1551 ce.xclient.type = ClientMessage; 1533 ce.xclient.type = ClientMessage;
1552 ce.xclient.message_type = fluxbox->getWMProtocolsAtom(); 1534 ce.xclient.message_type = fb->getWMProtocolsAtom();
1553 ce.xclient.display = display; 1535 ce.xclient.display = display;
1554 ce.xclient.window = client.window; 1536 ce.xclient.window = client.window;
1555 ce.xclient.format = 32; 1537 ce.xclient.format = 32;
1556 ce.xclient.data.l[0] = fluxbox->getWMTakeFocusAtom(); 1538 ce.xclient.data.l[0] = fb->getWMTakeFocusAtom();
1557 ce.xclient.data.l[1] = fluxbox->getLastTime(); 1539 ce.xclient.data.l[1] = fb->getLastTime();
1558 ce.xclient.data.l[2] = 0l; 1540 ce.xclient.data.l[2] = 0l;
1559 ce.xclient.data.l[3] = 0l; 1541 ce.xclient.data.l[3] = 0l;
1560 ce.xclient.data.l[4] = 0l; 1542 ce.xclient.data.l[4] = 0l;
@@ -1569,8 +1551,6 @@ bool FluxboxWindow::setInputFocus() {
1569 } 1551 }
1570 } 1552 }
1571 1553
1572 fluxbox->ungrab();
1573
1574 return ret; 1554 return ret;
1575} 1555}
1576 1556
@@ -1624,9 +1604,13 @@ void FluxboxWindow::iconify() {
1624 if (tab) //if this window got a tab then iconify it too 1604 if (tab) //if this window got a tab then iconify it too
1625 tab->iconify(); 1605 tab->iconify();
1626 1606
1627 if (client.transient) { 1607 if (client.transients.size()) {
1628 if (! client.transient->iconic) 1608 std::list<FluxboxWindow *>::iterator it = client.transients.begin();
1629 client.transient->iconify(); 1609 std::list<FluxboxWindow *>::iterator it_end = client.transients.end();
1610 for (; it != it_end; ++it) {
1611 if (! (*it)->iconic)
1612 (*it)->iconify();
1613 }
1630 } 1614 }
1631 1615
1632} 1616}
@@ -1648,12 +1632,20 @@ void FluxboxWindow::deiconify(bool reassoc, bool raise) {
1648 XMapSubwindows(display, frame.window); 1632 XMapSubwindows(display, frame.window);
1649 XMapWindow(display, frame.window); 1633 XMapWindow(display, frame.window);
1650 1634
1651 if (iconic && screen->doFocusNew()) setInputFocus(); 1635 if (iconic && screen->doFocusNew())
1636 setInputFocus();
1652 1637
1653 visible = true; 1638 visible = true;
1654 iconic = false; 1639 iconic = false;
1655 1640
1656 if (reassoc && client.transient) client.transient->deiconify(true, false); 1641 if (reassoc && client.transients.size()) {
1642 // deiconify all transients
1643 std::list<FluxboxWindow *>::iterator it = client.transients.begin();
1644 std::list<FluxboxWindow *>::iterator it_end = client.transients.end();
1645 for (; it != it_end; ++it) {
1646 (*it)->deiconify(true, false);
1647 }
1648 }
1657 1649
1658 if (tab) 1650 if (tab)
1659 tab->deiconify(); 1651 tab->deiconify();
@@ -2405,18 +2397,18 @@ void FluxboxWindow::restoreGravity() {
2405 // restore y coordinate 2397 // restore y coordinate
2406 switch (client.win_gravity) { 2398 switch (client.win_gravity) {
2407 // handle Northbound gravity 2399 // handle Northbound gravity
2408 case NorthWestGravity: 2400 case NorthWestGravity:
2409 case NorthGravity: 2401 case NorthGravity:
2410 case NorthEastGravity: 2402 case NorthEastGravity:
2411 default: 2403 default:
2412 client.y = frame.y; 2404 client.y = frame.y;
2413 break; 2405 break;
2414 2406
2415 // handle Southbound gravity 2407 // handle Southbound gravity
2416 case SouthWestGravity: 2408 case SouthWestGravity:
2417 case SouthGravity: 2409 case SouthGravity:
2418 case SouthEastGravity: 2410 case SouthEastGravity:
2419 client.y = (frame.y + frame.height) - client.height; 2411 client.y = (frame.y + frame.height) - client.height;
2420 break; 2412 break;
2421 } 2413 }
2422} 2414}
@@ -2710,11 +2702,12 @@ void FluxboxWindow::propertyNotifyEvent(Atom atom) {
2710 windowmenu->reconfigure(); 2702 windowmenu->reconfigure();
2711 } 2703 }
2712 } else { 2704 } else {
2705
2706#ifdef NEWWMSPEC
2713 bool val = false; 2707 bool val = false;
2714 #ifdef NEWWMSPEC
2715 if (!val) 2708 if (!val)
2716 handleNETWMPropertyNotify(atom); 2709 handleNETWMPropertyNotify(atom);
2717 #endif 2710#endif // NEWWMSPEC
2718 } 2711 }
2719 break; 2712 break;
2720 } 2713 }
@@ -3485,77 +3478,49 @@ void FluxboxWindow::destroyHandle() {
3485} 3478}
3486 3479
3487void FluxboxWindow::checkTransient() { 3480void FluxboxWindow::checkTransient() {
3488 // default values 3481 // remove us from parent
3482 if (client.transient_for != 0) {
3483 client.transient_for->client.transients.remove(this);
3484 }
3489 client.transient_for = 0; 3485 client.transient_for = 0;
3490 client.transient = 0;
3491 3486
3492 Fluxbox *fluxbox = Fluxbox::instance();
3493 // determine if this is a transient window 3487 // determine if this is a transient window
3494 Window win; 3488 Window win;
3495 if (!XGetTransientForHint(display, client.window, &win)) { 3489 if (!XGetTransientForHint(display, client.window, &win)) {
3496 client.transient_for = 0; 3490 client.transient_for = 0;
3497 return; 3491 return;
3498 } 3492 }
3499 3493
3494
3500 if (win == client.window) 3495 if (win == client.window)
3501 return; 3496 return;
3502 3497
3503 if (win && (win != client.window)) {
3504 FluxboxWindow *tr = fluxbox->searchWindow(win);
3505 if (tr != 0) {
3506
3507 while (tr->client.transient != 0) {
3508 tr = tr->client.transient;
3509 if (tr == tr->client.transient) { //ops! something is wrong with transient
3510 tr->client.transient = 0;
3511 if (tr->client.transient_for == tr)
3512 tr->client.transient_for = 0;
3513 break;
3514 }
3515 }
3516
3517 if (tr != this) {
3518 client.transient_for = tr;
3519 tr->client.transient = this;
3520 transient = true;
3521 } else {
3522 client.transient_for = 0;
3523 client.transient = 0;
3524 }
3525 if (client.transient_for != 0) {
3526 stuck = client.transient_for->stuck;
3527 }
3528
3529 } else if (win == client.window_group) {
3530 if ((tr = fluxbox->searchGroup(win, this))) {
3531
3532 while (tr->client.transient != 0) {
3533 tr = tr->client.transient;
3534 if (tr && tr == tr->client.transient) { //ops! somehtin is wrong with transient
3535 tr->client.transient = 0;
3536 }
3537 }
3538
3539 if (tr != this) {
3540 client.transient_for = tr;
3541 tr->client.transient = this;
3542 transient = true;
3543 } else {
3544 client.transient_for = 0;
3545 client.transient = 0;
3546 }
3547
3548 if (client.transient_for != 0) {
3549 stuck = client.transient_for->stuck;
3550 }
3551
3552 }
3553 }
3554 }
3555
3556 if (win == screen->getRootWindow()) 3498 if (win == screen->getRootWindow())
3557 modal = true; 3499 modal = true;
3558 3500
3501 client.transient_for = Fluxbox::instance()->searchWindow(win);
3502 if (client.transient_for != 0 &&
3503 client.window_group != None && win == client.window_group) {
3504
3505 FluxboxWindow *leader = Fluxbox::instance()->searchGroup(win, this);
3506 if (leader != 0)
3507 client.transient_for = leader;
3508 return;
3509 }
3510
3511 // make sure we don't have deadlock loop in transient chain
3512 for (FluxboxWindow *w = this; w != 0; w = w->client.transient_for) {
3513 if (w == w->client.transient_for) {
3514 w->client.transient_for = 0;
3515 }
3516 }
3517
3518 if (client.transient_for != 0) {
3519 client.transient_for->client.transients.push_back(this);
3520 // make sure we only have on instance of this
3521 client.transient_for->client.transients.unique();
3522 stuck = client.transient_for->stuck;
3523 }
3559} 3524}
3560 3525
3561void FluxboxWindow::restore(bool remap) { 3526void FluxboxWindow::restore(bool remap) {