diff options
Diffstat (limited to 'src/Window.cc')
-rw-r--r-- | src/Window.cc | 158 |
1 files changed, 150 insertions, 8 deletions
diff --git a/src/Window.cc b/src/Window.cc index d0fae02..83f8771 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -639,10 +639,16 @@ void FluxboxWindow::attachClient(WinClient &client, int x, int y) { | |||
639 | if (client.fbwindow() != 0) { | 639 | if (client.fbwindow() != 0) { |
640 | FluxboxWindow *old_win = client.fbwindow(); // store old window | 640 | FluxboxWindow *old_win = client.fbwindow(); // store old window |
641 | 641 | ||
642 | ClientList::iterator client_insert_pos=getClientInsertPosition(x,y); | ||
643 | FbTk::TextButton *button_insert_pos=NULL; | ||
644 | if(client_insert_pos!=m_clientlist.end()) | ||
645 | button_insert_pos=m_labelbuttons[*client_insert_pos]; | ||
646 | |||
647 | |||
642 | // make sure we set new window search for each client | 648 | // make sure we set new window search for each client |
643 | ClientList::iterator client_it = old_win->clientList().begin(); | 649 | ClientList::iterator client_it = old_win->clientList().begin(); |
644 | ClientList::iterator client_it_end = old_win->clientList().end(); | 650 | ClientList::iterator client_it_end = old_win->clientList().end(); |
645 | for (; client_it != client_it_end; ++client_it) { | 651 | for (; client_it != client_it_end; ++client_it) { |
646 | // setup eventhandlers for client | 652 | // setup eventhandlers for client |
647 | evm.add(*this, (*client_it)->window()); | 653 | evm.add(*this, (*client_it)->window()); |
648 | 654 | ||
@@ -666,8 +672,11 @@ void FluxboxWindow::attachClient(WinClient &client, int x, int y) { | |||
666 | btn->setJustify(frame().theme().justify()); | 672 | btn->setJustify(frame().theme().justify()); |
667 | m_labelbuttons[(*client_it)] = btn; | 673 | m_labelbuttons[(*client_it)] = btn; |
668 | frame().addLabelButton(*btn); | 674 | frame().addLabelButton(*btn); |
669 | if(x >= 0) | 675 | if(x >= 0) { |
670 | frame().moveLabelButtonTo(*btn, x ,y); | 676 | if(button_insert_pos){ //null if we want the new button at the end of the list |
677 | frame().moveLabelButtonLeftOf(*btn, *button_insert_pos); | ||
678 | } | ||
679 | } | ||
671 | btn->show(); | 680 | btn->show(); |
672 | // we need motion notify so we mask it | 681 | // we need motion notify so we mask it |
673 | btn->setEventMask(ExposureMask | ButtonPressMask | | 682 | btn->setEventMask(ExposureMask | ButtonPressMask | |
@@ -682,11 +691,11 @@ void FluxboxWindow::attachClient(WinClient &client, int x, int y) { | |||
682 | 691 | ||
683 | (*client_it)->saveBlackboxAttribs(m_blackbox_attrib); | 692 | (*client_it)->saveBlackboxAttribs(m_blackbox_attrib); |
684 | } | 693 | } |
685 | 694 | ||
686 | // add client and move over all attached clients | 695 | // add client and move over all attached clients |
687 | // from the old window to this list | 696 | // from the old window to this list |
688 | // all the "left window"s will remain the same, except for the first. | 697 | m_clientlist.splice(client_insert_pos, old_win->m_clientlist); |
689 | m_clientlist.splice(m_clientlist.end(), old_win->m_clientlist); | 698 | updateClientLeftWindow(); |
690 | old_win->m_client = 0; | 699 | old_win->m_client = 0; |
691 | 700 | ||
692 | delete old_win; | 701 | delete old_win; |
@@ -928,6 +937,140 @@ void FluxboxWindow::moveClientRight() { | |||
928 | updateClientLeftWindow(); | 937 | updateClientLeftWindow(); |
929 | } | 938 | } |
930 | 939 | ||
940 | //std::list<*WinClient>::iterator FluxboxWindow::getClientInsertPosition(int x, int y) { | ||
941 | FluxboxWindow::ClientList::iterator FluxboxWindow::getClientInsertPosition(int x, int y) { | ||
942 | |||
943 | int dest_x=0, dest_y=0; | ||
944 | Window labelbutton=0; | ||
945 | if(!XTranslateCoordinates(FbTk::App::instance()->display(), | ||
946 | parent().window(), frame().label().window(), | ||
947 | x,y, &dest_x, &dest_y, | ||
948 | &labelbutton)) | ||
949 | return m_clientlist.end(); | ||
950 | Client2ButtonMap::iterator it = m_labelbuttons.begin(); | ||
951 | Client2ButtonMap::iterator it_end = m_labelbuttons.end(); | ||
952 | //find the label button to move next to | ||
953 | for(; it!=it_end; it++) { | ||
954 | if( (*it).second->window()==labelbutton) | ||
955 | break; | ||
956 | } | ||
957 | //label button not found | ||
958 | if(it==it_end) { | ||
959 | return m_clientlist.end(); | ||
960 | } | ||
961 | Window child_return=0; | ||
962 | //make x and y relative to our labelbutton | ||
963 | if(!XTranslateCoordinates(FbTk::App::instance()->display(), | ||
964 | frame().label().window(),labelbutton, | ||
965 | dest_x,dest_y, &x, &y, | ||
966 | &child_return)) | ||
967 | return m_clientlist.end(); | ||
968 | ClientList::iterator client = find(m_clientlist.begin(), | ||
969 | m_clientlist.end(), | ||
970 | it->first); | ||
971 | if(x>(*it).second->width()/2) | ||
972 | client++; | ||
973 | return client; | ||
974 | |||
975 | |||
976 | } | ||
977 | |||
978 | |||
979 | |||
980 | void FluxboxWindow::moveClientTo(WinClient &win, int x, int y) { | ||
981 | int dest_x=0, dest_y=0; | ||
982 | Window labelbutton=0; | ||
983 | if(!XTranslateCoordinates(FbTk::App::instance()->display(), | ||
984 | parent().window(), frame().label().window(), | ||
985 | x,y, &dest_x, &dest_y, | ||
986 | &labelbutton)) | ||
987 | return; | ||
988 | Client2ButtonMap::iterator it = m_labelbuttons.begin(); | ||
989 | Client2ButtonMap::iterator it_end = m_labelbuttons.end(); | ||
990 | //find the label button to move next to | ||
991 | for(; it!=it_end; it++) { | ||
992 | if( (*it).second->window()==labelbutton) | ||
993 | break; | ||
994 | } | ||
995 | //label button not found | ||
996 | if(it==it_end) { | ||
997 | return; | ||
998 | } | ||
999 | Window child_return=0; | ||
1000 | //make x and y relative to our labelbutton | ||
1001 | if(!XTranslateCoordinates(FbTk::App::instance()->display(), | ||
1002 | frame().label().window(),labelbutton, | ||
1003 | dest_x,dest_y, &x, &y, | ||
1004 | &child_return)) | ||
1005 | return; | ||
1006 | if(x>(*it).second->width()/2) { | ||
1007 | moveClientRightOf(win, *it->first); | ||
1008 | } else { | ||
1009 | moveClientLeftOf(win, *it->first); | ||
1010 | } | ||
1011 | |||
1012 | } | ||
1013 | |||
1014 | |||
1015 | void FluxboxWindow::moveClientLeftOf(WinClient &win, WinClient &dest) { | ||
1016 | |||
1017 | frame().moveLabelButtonLeftOf(*m_labelbuttons[&win], *m_labelbuttons[&dest]); | ||
1018 | |||
1019 | ClientList::iterator it = find(m_clientlist.begin(), | ||
1020 | m_clientlist.end(), | ||
1021 | &win); | ||
1022 | ClientList::iterator new_pos = find(m_clientlist.begin(), | ||
1023 | m_clientlist.end(), | ||
1024 | &dest); | ||
1025 | |||
1026 | // make sure we found them | ||
1027 | if (it == m_clientlist.end() || new_pos==m_clientlist.end()) { | ||
1028 | return; | ||
1029 | } | ||
1030 | //moving a button to the left of itself results in no change | ||
1031 | if( new_pos == it) { | ||
1032 | return; | ||
1033 | } | ||
1034 | //remove from list | ||
1035 | m_clientlist.erase(it); | ||
1036 | //insert on the new place | ||
1037 | m_clientlist.insert(new_pos, &win); | ||
1038 | |||
1039 | updateClientLeftWindow(); | ||
1040 | } | ||
1041 | |||
1042 | |||
1043 | void FluxboxWindow::moveClientRightOf(WinClient &win, WinClient &dest) { | ||
1044 | frame().moveLabelButtonRightOf(*m_labelbuttons[&win], *m_labelbuttons[&dest]); | ||
1045 | |||
1046 | ClientList::iterator it = find(m_clientlist.begin(), | ||
1047 | m_clientlist.end(), | ||
1048 | &win); | ||
1049 | ClientList::iterator new_pos = find(m_clientlist.begin(), | ||
1050 | m_clientlist.end(), | ||
1051 | &dest); | ||
1052 | |||
1053 | // make sure we found them | ||
1054 | if (it == m_clientlist.end() || new_pos==m_clientlist.end()) { | ||
1055 | return; | ||
1056 | } | ||
1057 | //moving a button to the right of itself results in no change | ||
1058 | if( new_pos == it) { | ||
1059 | return; | ||
1060 | } | ||
1061 | //remove from list | ||
1062 | m_clientlist.erase(it); | ||
1063 | //need to insert into the next position | ||
1064 | new_pos++; | ||
1065 | //insert on the new place | ||
1066 | if(new_pos == m_clientlist.end()) | ||
1067 | m_clientlist.push_back(&win); | ||
1068 | else | ||
1069 | m_clientlist.insert(new_pos, &win); | ||
1070 | |||
1071 | updateClientLeftWindow(); | ||
1072 | } | ||
1073 | |||
931 | /// Update LEFT window atom on all clients. | 1074 | /// Update LEFT window atom on all clients. |
932 | void FluxboxWindow::updateClientLeftWindow() { | 1075 | void FluxboxWindow::updateClientLeftWindow() { |
933 | if (clientList().empty()) | 1076 | if (clientList().empty()) |
@@ -3224,8 +3367,7 @@ void FluxboxWindow::attachTo(int x, int y, bool interrupted) { | |||
3224 | } | 3367 | } |
3225 | else if(attach_to_win==this && attach_to_win->isTabable()) { | 3368 | else if(attach_to_win==this && attach_to_win->isTabable()) { |
3226 | //reording of tabs within a frame | 3369 | //reording of tabs within a frame |
3227 | FbWinFrame *frame=&attach_to_win->frame(); | 3370 | moveClientTo(*old_attached, x, y); |
3228 | frame->moveLabelButtonTo(*m_labelbuttons[old_attached], x, y); | ||
3229 | } | 3371 | } |
3230 | 3372 | ||
3231 | } | 3373 | } |