diff options
-rw-r--r-- | src/fluxbox.cc | 178 |
1 files changed, 84 insertions, 94 deletions
diff --git a/src/fluxbox.cc b/src/fluxbox.cc index 00caa3b..4a8bb0c 100644 --- a/src/fluxbox.cc +++ b/src/fluxbox.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: fluxbox.cc,v 1.87 2002/12/09 22:21:00 fluxgen Exp $ | 25 | // $Id: fluxbox.cc,v 1.88 2003/01/05 22:41:21 fluxgen Exp $ |
26 | 26 | ||
27 | 27 | ||
28 | #include "fluxbox.hh" | 28 | #include "fluxbox.hh" |
@@ -561,7 +561,7 @@ void Fluxbox::handleEvent(XEvent * const e) { | |||
561 | if ((masked == e->xany.window) && masked_window && | 561 | if ((masked == e->xany.window) && masked_window && |
562 | (e->type == MotionNotify)) { | 562 | (e->type == MotionNotify)) { |
563 | last_time = e->xmotion.time; | 563 | last_time = e->xmotion.time; |
564 | masked_window->motionNotifyEvent(&e->xmotion); | 564 | masked_window->motionNotifyEvent(e->xmotion); |
565 | 565 | ||
566 | return; | 566 | return; |
567 | } | 567 | } |
@@ -582,7 +582,7 @@ void Fluxbox::handleEvent(XEvent * const e) { | |||
582 | #endif // SLIT | 582 | #endif // SLIT |
583 | 583 | ||
584 | if ((win = searchWindow(e->xconfigurerequest.window))) { | 584 | if ((win = searchWindow(e->xconfigurerequest.window))) { |
585 | win->configureRequestEvent(&e->xconfigurerequest); | 585 | win->configureRequestEvent(e->xconfigurerequest); |
586 | 586 | ||
587 | #ifdef SLIT | 587 | #ifdef SLIT |
588 | } else if ((slit = searchSlit(e->xconfigurerequest.window))) { | 588 | } else if ((slit = searchSlit(e->xconfigurerequest.window))) { |
@@ -612,83 +612,76 @@ void Fluxbox::handleEvent(XEvent * const e) { | |||
612 | 612 | ||
613 | } | 613 | } |
614 | break; | 614 | break; |
615 | case MapRequest: | 615 | case MapRequest: { |
616 | { | ||
617 | #ifdef DEBUG | 616 | #ifdef DEBUG |
618 | fprintf(stderr, | 617 | cerr<<"MapRequest for 0x"<<hex<<e->xmaprequest.window<<dec<<endl; |
619 | I18n::instance()-> | ||
620 | getMessage( | ||
621 | FBNLS::blackboxSet, FBNLS::blackboxMapRequest, | ||
622 | "Fluxbox::process_event(): MapRequest for 0x%lx\n"), | ||
623 | e->xmaprequest.window); | ||
624 | #endif // DEBUG | 618 | #endif // DEBUG |
625 | 619 | ||
626 | #ifdef SLIT | 620 | #ifdef SLIT |
627 | #ifdef KDE | 621 | #ifdef KDE |
628 | //Check and see if client is KDE dock applet. | 622 | //Check and see if client is KDE dock applet. |
629 | //If so add to Slit | 623 | //If so add to Slit |
630 | bool iskdedockapp = false; | 624 | bool iskdedockapp = false; |
631 | Atom ajunk; | 625 | Atom ajunk; |
632 | int ijunk; | 626 | int ijunk; |
633 | unsigned long *data = (unsigned long *) 0, uljunk; | 627 | unsigned long *data = (unsigned long *) 0, uljunk; |
634 | 628 | ||
635 | // Check if KDE v2.x dock applet | 629 | // Check if KDE v2.x dock applet |
636 | if (XGetWindowProperty(getXDisplay(), e->xmaprequest.window, | 630 | if (XGetWindowProperty(getXDisplay(), e->xmaprequest.window, |
637 | getKWM2DockwindowAtom(), 0l, 1l, False, | 631 | getKWM2DockwindowAtom(), 0l, 1l, False, |
638 | XA_WINDOW, &ajunk, &ijunk, &uljunk, | 632 | XA_WINDOW, &ajunk, &ijunk, &uljunk, |
639 | &uljunk, (unsigned char **) &data) == Success) { | 633 | &uljunk, (unsigned char **) &data) == Success) { |
640 | 634 | ||
641 | if (data) | 635 | if (data) |
642 | iskdedockapp = True; | 636 | iskdedockapp = True; |
643 | XFree((char *) data); | 637 | XFree((char *) data); |
644 | 638 | ||
645 | } | 639 | } |
646 | 640 | ||
647 | // Check if KDE v1.x dock applet | 641 | // Check if KDE v1.x dock applet |
648 | if (!iskdedockapp) { | 642 | if (!iskdedockapp) { |
649 | if (XGetWindowProperty(getXDisplay(), e->xmaprequest.window, | 643 | if (XGetWindowProperty(getXDisplay(), e->xmaprequest.window, |
650 | getKWM1DockwindowAtom(), 0l, 1l, False, | 644 | getKWM1DockwindowAtom(), 0l, 1l, False, |
651 | getKWM1DockwindowAtom(), &ajunk, &ijunk, &uljunk, | 645 | getKWM1DockwindowAtom(), &ajunk, &ijunk, &uljunk, |
652 | &uljunk, (unsigned char **) &data) == Success) { | 646 | &uljunk, (unsigned char **) &data) == Success) { |
653 | iskdedockapp = (data && data[0] != 0); | 647 | iskdedockapp = (data && data[0] != 0); |
654 | XFree((char *) data); | 648 | XFree((char *) data); |
655 | } | ||
656 | } | 649 | } |
650 | } | ||
657 | 651 | ||
658 | if (iskdedockapp) { | 652 | if (iskdedockapp) { |
659 | XSelectInput(getXDisplay(), e->xmaprequest.window, StructureNotifyMask); | 653 | XSelectInput(getXDisplay(), e->xmaprequest.window, StructureNotifyMask); |
660 | ScreenList::iterator it = screenList.begin(); | 654 | ScreenList::iterator it = screenList.begin(); |
661 | for (; (*it) == screenList.back(); ++it) { | 655 | for (; (*it) == screenList.back(); ++it) { |
662 | (*it)->getSlit()->addClient(e->xmaprequest.window); | 656 | (*it)->getSlit()->addClient(e->xmaprequest.window); |
663 | } | ||
664 | return; | ||
665 | } | 657 | } |
658 | return; | ||
659 | } | ||
666 | #endif //KDE | 660 | #endif //KDE |
667 | #endif // SLIT | 661 | #endif // SLIT |
668 | 662 | ||
669 | FluxboxWindow *win = searchWindow(e->xmaprequest.window); | 663 | FluxboxWindow *win = searchWindow(e->xmaprequest.window); |
670 | 664 | ||
671 | if (! win) { | 665 | if (! win) { |
672 | win = new FluxboxWindow(e->xmaprequest.window); | 666 | //!!! TODO |
673 | if (!win->isManaged()) { | 667 | BScreen *scr = searchScreen(e->xmaprequest.parent); |
674 | delete win; | 668 | cerr<<"screen = "<<scr<<endl; |
675 | win = 0; | 669 | if (scr != 0) |
676 | } else { | 670 | scr->createWindow(e->xmaprequest.window); |
677 | // attach signals | 671 | else |
678 | attachSignals(*win); | 672 | cerr<<"Fluxbox Warning! Could not find screen to map window on!"<<endl; |
679 | } | 673 | } |
680 | } | ||
681 | 674 | ||
682 | if ((win = searchWindow(e->xmaprequest.window))) | 675 | if ((win = searchWindow(e->xmaprequest.window))) |
683 | win->mapRequestEvent(&e->xmaprequest); | 676 | win->mapRequestEvent(e->xmaprequest); |
684 | 677 | ||
685 | } | 678 | } |
686 | break; | 679 | break; |
687 | case MapNotify: | 680 | case MapNotify: |
688 | { | 681 | { |
689 | FluxboxWindow *win = searchWindow(e->xmap.window); | 682 | FluxboxWindow *win = searchWindow(e->xmap.window); |
690 | if (win != 0) | 683 | if (win != 0) |
691 | win->mapNotifyEvent(&e->xmap); | 684 | win->mapNotifyEvent(e->xmap); |
692 | 685 | ||
693 | } | 686 | } |
694 | break; | 687 | break; |
@@ -706,12 +699,10 @@ void Fluxbox::handleEvent(XEvent * const e) { | |||
706 | Slit *slit = 0; | 699 | Slit *slit = 0; |
707 | #endif // SLIT | 700 | #endif // SLIT |
708 | 701 | ||
709 | if ((win = searchWindow(e->xdestroywindow.window))) { | 702 | if ((win = searchWindow(e->xdestroywindow.window)) && win->getClientWindow() == e->xdestroywindow.window) { |
710 | if (win->destroyNotifyEvent(&e->xdestroywindow)) { | 703 | win->destroyNotifyEvent(e->xdestroywindow); |
711 | delete win; | 704 | removeWindowSearch(win->getClientWindow()); |
712 | win = 0; | 705 | delete win; |
713 | } | ||
714 | |||
715 | } | 706 | } |
716 | #ifdef SLIT | 707 | #ifdef SLIT |
717 | else if ((slit = searchSlit(e->xdestroywindow.window))) { | 708 | else if ((slit = searchSlit(e->xdestroywindow.window))) { |
@@ -729,7 +720,7 @@ void Fluxbox::handleEvent(XEvent * const e) { | |||
729 | Tab *tab = 0; | 720 | Tab *tab = 0; |
730 | 721 | ||
731 | if ((win = searchWindow(e->xmotion.window)) !=0) | 722 | if ((win = searchWindow(e->xmotion.window)) !=0) |
732 | win->motionNotifyEvent(&e->xmotion); | 723 | win->motionNotifyEvent(e->xmotion); |
733 | else if ((tab = searchTab(e->xmotion.window)) !=0) | 724 | else if ((tab = searchTab(e->xmotion.window)) !=0) |
734 | tab->motionNotifyEvent(&e->xmotion); | 725 | tab->motionNotifyEvent(&e->xmotion); |
735 | 726 | ||
@@ -829,7 +820,7 @@ void Fluxbox::handleEvent(XEvent * const e) { | |||
829 | Tab *tab = 0; | 820 | Tab *tab = 0; |
830 | 821 | ||
831 | if ((win = searchWindow(e->xexpose.window))) | 822 | if ((win = searchWindow(e->xexpose.window))) |
832 | win->exposeEvent(&e->xexpose); | 823 | win->exposeEvent(e->xexpose); |
833 | else if ((tab = searchTab(e->xexpose.window))) | 824 | else if ((tab = searchTab(e->xexpose.window))) |
834 | tab->exposeEvent(&e->xexpose); | 825 | tab->exposeEvent(&e->xexpose); |
835 | } | 826 | } |
@@ -891,7 +882,7 @@ void Fluxbox::handleButtonEvent(XButtonEvent &be) { | |||
891 | 882 | ||
892 | if ((win = searchWindow(be.window))) { | 883 | if ((win = searchWindow(be.window))) { |
893 | 884 | ||
894 | win->buttonPressEvent(&be); | 885 | win->buttonPressEvent(be); |
895 | 886 | ||
896 | if (be.button == 1) | 887 | if (be.button == 1) |
897 | win->installColormap(True); | 888 | win->installColormap(True); |
@@ -997,7 +988,7 @@ void Fluxbox::handleButtonEvent(XButtonEvent &be) { | |||
997 | Tab *tab = 0; | 988 | Tab *tab = 0; |
998 | 989 | ||
999 | if ((win = searchWindow(be.window))) | 990 | if ((win = searchWindow(be.window))) |
1000 | win->buttonReleaseEvent(&be); | 991 | win->buttonReleaseEvent(be); |
1001 | else if ((tab = searchTab(be.window))) | 992 | else if ((tab = searchTab(be.window))) |
1002 | tab->buttonReleaseEvent(&be); | 993 | tab->buttonReleaseEvent(&be); |
1003 | } | 994 | } |
@@ -1022,10 +1013,12 @@ void Fluxbox::handleUnmapNotify(XUnmapEvent &ue) { | |||
1022 | 1013 | ||
1023 | if ((win = searchWindow(ue.window)) != 0) { | 1014 | if ((win = searchWindow(ue.window)) != 0) { |
1024 | 1015 | ||
1025 | if (win->unmapNotifyEvent(&ue)) { | 1016 | win->unmapNotifyEvent(ue); |
1026 | delete win; | 1017 | if (win->getClientWindow() == ue.window) { |
1027 | if (focused_window == win) // some extra checking | 1018 | if (win == focused_window) |
1028 | focused_window = 0; | 1019 | focused_window = 0; |
1020 | removeWindowSearch(win->getClientWindow()); | ||
1021 | delete win; | ||
1029 | win = 0; | 1022 | win = 0; |
1030 | } | 1023 | } |
1031 | 1024 | ||
@@ -1091,7 +1084,7 @@ void Fluxbox::handleClientMessage(XClientMessageEvent &ce) { | |||
1091 | net.workspace = ce.data.l[2]; | 1084 | net.workspace = ce.data.l[2]; |
1092 | net.stack = ce.data.l[3]; | 1085 | net.stack = ce.data.l[3]; |
1093 | net.decoration = static_cast<int>(ce.data.l[4]); | 1086 | net.decoration = static_cast<int>(ce.data.l[4]); |
1094 | win->changeBlackboxHints(&net); | 1087 | win->changeBlackboxHints(net); |
1095 | } | 1088 | } |
1096 | } else { | 1089 | } else { |
1097 | FluxboxWindow *win = searchWindow(ce.window); | 1090 | FluxboxWindow *win = searchWindow(ce.window); |
@@ -1391,66 +1384,66 @@ void Fluxbox::doWindowAction(Keys::KeyAction action, const int param) { | |||
1391 | focused_window->getTab()->shade(); | 1384 | focused_window->getTab()->shade(); |
1392 | break; | 1385 | break; |
1393 | case Keys::MAXIMIZE: | 1386 | case Keys::MAXIMIZE: |
1394 | focused_window->maximize(0); | 1387 | focused_window->maximize(); |
1395 | break; | 1388 | break; |
1396 | case Keys::STICK: | 1389 | case Keys::STICK: |
1397 | focused_window->stick(); | 1390 | focused_window->stick(); |
1398 | break; | 1391 | break; |
1399 | case Keys::VERTMAX: | 1392 | case Keys::VERTMAX: |
1400 | if (focused_window->isResizable()) | 1393 | if (focused_window->isResizable()) |
1401 | focused_window->maximize(2); // maximize vertically, done with mouse2 | 1394 | focused_window->maximizeVertical(); |
1402 | break; | 1395 | break; |
1403 | case Keys::HORIZMAX: | 1396 | case Keys::HORIZMAX: |
1404 | if (focused_window->isResizable()) | 1397 | if (focused_window->isResizable()) |
1405 | focused_window->maximize(3); // maximize horisontally, done with mouse3 | 1398 | focused_window->maximizeHorizontal(); |
1406 | break; | 1399 | break; |
1407 | case Keys::NUDGERIGHT: | 1400 | case Keys::NUDGERIGHT: |
1408 | focused_window->configure( | 1401 | focused_window->moveResize( |
1409 | focused_window->getXFrame()+param, focused_window->getYFrame(), | 1402 | focused_window->getXFrame()+param, focused_window->getYFrame(), |
1410 | focused_window->getWidth(), focused_window->getHeight()); | 1403 | focused_window->getWidth(), focused_window->getHeight()); |
1411 | break; | 1404 | break; |
1412 | case Keys::NUDGELEFT: | 1405 | case Keys::NUDGELEFT: |
1413 | focused_window->configure( | 1406 | focused_window->moveResize( |
1414 | focused_window->getXFrame()-param, focused_window->getYFrame(), | 1407 | focused_window->getXFrame()-param, focused_window->getYFrame(), |
1415 | focused_window->getWidth(), focused_window->getHeight()); | 1408 | focused_window->getWidth(), focused_window->getHeight()); |
1416 | break; | 1409 | break; |
1417 | case Keys::NUDGEUP: | 1410 | case Keys::NUDGEUP: |
1418 | focused_window->configure( | 1411 | focused_window->moveResize( |
1419 | focused_window->getXFrame(), focused_window->getYFrame()-param, | 1412 | focused_window->getXFrame(), focused_window->getYFrame()-param, |
1420 | focused_window->getWidth(), focused_window->getHeight()); | 1413 | focused_window->getWidth(), focused_window->getHeight()); |
1421 | break; | 1414 | break; |
1422 | case Keys::NUDGEDOWN: | 1415 | case Keys::NUDGEDOWN: |
1423 | focused_window->configure( | 1416 | focused_window->moveResize( |
1424 | focused_window->getXFrame(), focused_window->getYFrame()+param, | 1417 | focused_window->getXFrame(), focused_window->getYFrame()+param, |
1425 | focused_window->getWidth(), focused_window->getHeight()); | 1418 | focused_window->getWidth(), focused_window->getHeight()); |
1426 | break; | 1419 | break; |
1427 | // NOTE !!! BIGNUDGExxxx is not needed, just use 10 as a parameter | 1420 | // NOTE !!! BIGNUDGExxxx is not needed, just use 10 as a parameter |
1428 | case Keys::BIGNUDGERIGHT: | 1421 | case Keys::BIGNUDGERIGHT: |
1429 | focused_window->configure( | 1422 | focused_window->moveResize( |
1430 | focused_window->getXFrame()+10, focused_window->getYFrame(), | 1423 | focused_window->getXFrame()+10, focused_window->getYFrame(), |
1431 | focused_window->getWidth(), focused_window->getHeight()); | 1424 | focused_window->getWidth(), focused_window->getHeight()); |
1432 | break; | 1425 | break; |
1433 | case Keys::BIGNUDGELEFT: | 1426 | case Keys::BIGNUDGELEFT: |
1434 | focused_window->configure( | 1427 | focused_window->moveResize( |
1435 | focused_window->getXFrame()-10, focused_window->getYFrame(), | 1428 | focused_window->getXFrame()-10, focused_window->getYFrame(), |
1436 | focused_window->getWidth(), focused_window->getHeight()); | 1429 | focused_window->getWidth(), focused_window->getHeight()); |
1437 | break; | 1430 | break; |
1438 | case Keys::BIGNUDGEUP: | 1431 | case Keys::BIGNUDGEUP: |
1439 | focused_window->configure( | 1432 | focused_window->moveResize( |
1440 | focused_window->getXFrame(), focused_window->getYFrame()-10, | 1433 | focused_window->getXFrame(), focused_window->getYFrame()-10, |
1441 | focused_window->getWidth(), focused_window->getHeight()); | 1434 | focused_window->getWidth(), focused_window->getHeight()); |
1442 | break; | 1435 | break; |
1443 | case Keys::BIGNUDGEDOWN: | 1436 | case Keys::BIGNUDGEDOWN: |
1444 | focused_window->configure( | 1437 | focused_window->moveResize( |
1445 | focused_window->getXFrame(), focused_window->getYFrame()+10, | 1438 | focused_window->getXFrame(), focused_window->getYFrame()+10, |
1446 | focused_window->getWidth(), focused_window->getHeight()); | 1439 | focused_window->getWidth(), focused_window->getHeight()); |
1447 | break; | 1440 | break; |
1448 | case Keys::HORIZINC: | 1441 | case Keys::HORIZINC: |
1449 | if (focused_window->isResizable()) | 1442 | focused_window->moveResize( |
1450 | focused_window->configure( | ||
1451 | focused_window->getXFrame(), focused_window->getYFrame(), | 1443 | focused_window->getXFrame(), focused_window->getYFrame(), |
1452 | focused_window->getWidth()+10, focused_window->getHeight()); | 1444 | focused_window->getWidth()+10, focused_window->getHeight()); |
1453 | 1445 | ||
1446 | |||
1454 | if (focused_window->hasTab() && | 1447 | if (focused_window->hasTab() && |
1455 | (t_placement == Tab::PTOP || t_placement == Tab::PBOTTOM)) { | 1448 | (t_placement == Tab::PTOP || t_placement == Tab::PBOTTOM)) { |
1456 | if (t_alignment == Tab::ARELATIVE) | 1449 | if (t_alignment == Tab::ARELATIVE) |
@@ -1460,8 +1453,7 @@ void Fluxbox::doWindowAction(Keys::KeyAction action, const int param) { | |||
1460 | } | 1453 | } |
1461 | break; | 1454 | break; |
1462 | case Keys::VERTINC: | 1455 | case Keys::VERTINC: |
1463 | if (focused_window->isResizable()) | 1456 | focused_window->moveResize( |
1464 | focused_window->configure( | ||
1465 | focused_window->getXFrame(), focused_window->getYFrame(), | 1457 | focused_window->getXFrame(), focused_window->getYFrame(), |
1466 | focused_window->getWidth(), focused_window->getHeight()+10); | 1458 | focused_window->getWidth(), focused_window->getHeight()+10); |
1467 | 1459 | ||
@@ -1474,8 +1466,7 @@ void Fluxbox::doWindowAction(Keys::KeyAction action, const int param) { | |||
1474 | } | 1466 | } |
1475 | break; | 1467 | break; |
1476 | case Keys::HORIZDEC: | 1468 | case Keys::HORIZDEC: |
1477 | if (focused_window->isResizable()) | 1469 | focused_window->moveResize( |
1478 | focused_window->configure( | ||
1479 | focused_window->getXFrame(), focused_window->getYFrame(), | 1470 | focused_window->getXFrame(), focused_window->getYFrame(), |
1480 | focused_window->getWidth()-10, focused_window->getHeight()); | 1471 | focused_window->getWidth()-10, focused_window->getHeight()); |
1481 | 1472 | ||
@@ -1488,8 +1479,7 @@ void Fluxbox::doWindowAction(Keys::KeyAction action, const int param) { | |||
1488 | } | 1479 | } |
1489 | break; | 1480 | break; |
1490 | case Keys::VERTDEC: | 1481 | case Keys::VERTDEC: |
1491 | if (focused_window->isResizable()) | 1482 | focused_window->moveResize( |
1492 | focused_window->configure( | ||
1493 | focused_window->getXFrame(), focused_window->getYFrame(), | 1483 | focused_window->getXFrame(), focused_window->getYFrame(), |
1494 | focused_window->getWidth(), focused_window->getHeight()-10); | 1484 | focused_window->getWidth(), focused_window->getHeight()-10); |
1495 | 1485 | ||