diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/IconbarTool.cc | 130 | ||||
-rw-r--r-- | src/IconbarTool.hh | 10 |
2 files changed, 28 insertions, 112 deletions
diff --git a/src/IconbarTool.cc b/src/IconbarTool.cc index 7784327..4ce600f 100644 --- a/src/IconbarTool.cc +++ b/src/IconbarTool.cc | |||
@@ -348,15 +348,14 @@ inline bool checkAddWindow(IconbarTool::Mode mode, const FluxboxWindow &win) { | |||
348 | } | 348 | } |
349 | 349 | ||
350 | void removeDuplicate(const IconbarTool::IconList &iconlist, std::list<FluxboxWindow *> &windowlist) { | 350 | void removeDuplicate(const IconbarTool::IconList &iconlist, std::list<FluxboxWindow *> &windowlist) { |
351 | IconbarTool::IconList::const_iterator win_it = iconlist.begin(); | 351 | IconbarTool::IconList::const_iterator icon_it = iconlist.begin(); |
352 | IconbarTool::IconList::const_iterator win_it_end = iconlist.end(); | 352 | IconbarTool::IconList::const_iterator icon_it_end = iconlist.end(); |
353 | std::list<FluxboxWindow *>::iterator remove_it = windowlist.end(); | 353 | std::list<FluxboxWindow *>::iterator remove_it = windowlist.end(); |
354 | for (; win_it != win_it_end; ++win_it) | 354 | for (; icon_it != icon_it_end; ++icon_it) |
355 | remove_it = remove(windowlist.begin(), remove_it, &(*win_it)->win()); | 355 | remove_it = remove(windowlist.begin(), remove_it, &(*icon_it)->win()); |
356 | 356 | ||
357 | // remove already existing windows | 357 | // remove already existing windows |
358 | windowlist.erase(remove_it, windowlist.end()); | 358 | windowlist.erase(remove_it, windowlist.end()); |
359 | windowlist.unique(); | ||
360 | } | 359 | } |
361 | 360 | ||
362 | }; // end anonymous namespace | 361 | }; // end anonymous namespace |
@@ -486,22 +485,8 @@ void IconbarTool::setMode(Mode mode) { | |||
486 | deleteIcons(); | 485 | deleteIcons(); |
487 | 486 | ||
488 | // update mode | 487 | // update mode |
489 | switch (mode) { | 488 | if (mode != NONE) |
490 | case NONE: // nothing | 489 | updateList(); |
491 | break; | ||
492 | case ICONS: // all icons from all workspaces | ||
493 | case WORKSPACEICONS: // all icons on current workspace | ||
494 | updateIcons(); | ||
495 | break; | ||
496 | case WORKSPACENOICONS: | ||
497 | case WORKSPACE: // all windows and all icons on current workspace | ||
498 | updateWorkspace(); | ||
499 | break; | ||
500 | case NOICONS: | ||
501 | case ALLWINDOWS: // all windows and all icons from all workspaces | ||
502 | updateAllWindows(); | ||
503 | break; | ||
504 | }; | ||
505 | 490 | ||
506 | // unlock graphics update | 491 | // unlock graphics update |
507 | m_icon_container.setUpdateLock(false); | 492 | m_icon_container.setUpdateLock(false); |
@@ -614,23 +599,9 @@ void IconbarTool::update(FbTk::Subject *subj) { | |||
614 | deleteIcons(); | 599 | deleteIcons(); |
615 | 600 | ||
616 | // ok, we got some signal that we need to update our iconbar container | 601 | // ok, we got some signal that we need to update our iconbar container |
617 | switch (mode()) { | 602 | if (mode() == NONE) |
618 | case NONE: | ||
619 | return; | 603 | return; |
620 | break; | 604 | updateList(); |
621 | case ICONS: | ||
622 | case WORKSPACEICONS: | ||
623 | updateIcons(); | ||
624 | break; | ||
625 | case WORKSPACENOICONS: | ||
626 | case WORKSPACE: | ||
627 | updateWorkspace(); | ||
628 | break; | ||
629 | case NOICONS: | ||
630 | case ALLWINDOWS: | ||
631 | updateAllWindows(); | ||
632 | break; | ||
633 | } | ||
634 | 605 | ||
635 | // unlock container and update graphics | 606 | // unlock container and update graphics |
636 | m_icon_container.setUpdateLock(false); | 607 | m_icon_container.setUpdateLock(false); |
@@ -894,78 +865,27 @@ void IconbarTool::addWindow(FluxboxWindow &win) { | |||
894 | win.attentionSig().attach(this); | 865 | win.attentionSig().attach(this); |
895 | } | 866 | } |
896 | 867 | ||
897 | void IconbarTool::updateIcons() { | 868 | void IconbarTool::updateList() { |
898 | std::list<FluxboxWindow *> itemlist; | 869 | std::list<WinClient *> ordered_list = |
899 | // add icons to the itemlist | 870 | m_screen.focusControl().creationOrderList(); |
900 | BScreen::Icons::iterator icon_it = m_screen.iconList().begin(); | 871 | std::list<WinClient *>::iterator it = ordered_list.begin(); |
901 | BScreen::Icons::iterator icon_it_end = m_screen.iconList().end(); | 872 | std::list<WinClient *>::iterator it_end = ordered_list.end(); |
902 | for (; icon_it != icon_it_end; ++icon_it) { | 873 | for (; it != it_end; ++it) { |
903 | if (mode() == ICONS) | 874 | if ((*it)->fbwindow() && checkAddWindow(mode(), *(*it)->fbwindow()) && |
904 | itemlist.push_back(*icon_it); | 875 | !checkDuplicate(*(*it)->fbwindow())) |
905 | else if (mode() == WORKSPACEICONS && | 876 | addWindow(*(*it)->fbwindow()); |
906 | ((*icon_it)->workspaceNumber() == m_screen.currentWorkspaceID() || | ||
907 | (*icon_it)->isStuck())) | ||
908 | itemlist.push_back(*icon_it); | ||
909 | } | ||
910 | removeDuplicate(m_icon_list, itemlist); | ||
911 | addList(itemlist); | ||
912 | } | ||
913 | |||
914 | void IconbarTool::updateWorkspace() { | ||
915 | std::list<FluxboxWindow *> itemlist; | ||
916 | // add current workspace windows | ||
917 | Workspace &space = *m_screen.currentWorkspace(); | ||
918 | Workspace::Windows::iterator win_it = space.windowList().begin(); | ||
919 | Workspace::Windows::iterator win_it_end = space.windowList().end(); | ||
920 | for (; win_it != win_it_end; ++win_it) { | ||
921 | if (checkAddWindow(mode(), **win_it)) | ||
922 | itemlist.push_back(*win_it); | ||
923 | } | ||
924 | |||
925 | // add icons from current workspace | ||
926 | if (mode() != WORKSPACENOICONS) { | ||
927 | BScreen::Icons::iterator icon_it = m_screen.iconList().begin(); | ||
928 | BScreen::Icons::iterator icon_it_end = m_screen.iconList().end(); | ||
929 | for (; icon_it != icon_it_end; ++icon_it) { | ||
930 | if ((*icon_it)->workspaceNumber() == m_screen.currentWorkspaceID() || | ||
931 | (*icon_it)->isStuck()) | ||
932 | itemlist.push_back(*icon_it); | ||
933 | } | ||
934 | } | 877 | } |
935 | 878 | renderTheme(); | |
936 | removeDuplicate(m_icon_list, itemlist); | ||
937 | addList(itemlist); | ||
938 | } | 879 | } |
939 | 880 | ||
940 | 881 | bool IconbarTool::checkDuplicate(FluxboxWindow &win) { | |
941 | void IconbarTool::updateAllWindows() { | 882 | IconList::iterator it = m_icon_list.begin(); |
942 | std::list<FluxboxWindow *> full_list; | 883 | IconList::iterator it_end = m_icon_list.end(); |
943 | // for each workspace add clients to full list | 884 | for (; it != it_end; ++it) { |
944 | BScreen::Workspaces::iterator workspace_it = m_screen.getWorkspacesList().begin(); | 885 | if (&win == &(*it)->win()) |
945 | BScreen::Workspaces::iterator workspace_it_end = m_screen.getWorkspacesList().end(); | 886 | return true; |
946 | for (; workspace_it != workspace_it_end; ++workspace_it) { | ||
947 | full_list.insert(full_list.end(), | ||
948 | (*workspace_it)->windowList().begin(), | ||
949 | (*workspace_it)->windowList().end()); | ||
950 | } | ||
951 | // add icons | ||
952 | if(mode() != NOICONS && mode() != WORKSPACENOICONS) { | ||
953 | full_list.insert(full_list.end(), | ||
954 | m_screen.iconList().begin(), | ||
955 | m_screen.iconList().end()); | ||
956 | } | 887 | } |
957 | 888 | return false; | |
958 | removeDuplicate(m_icon_list, full_list); | ||
959 | addList(full_list); | ||
960 | } | ||
961 | |||
962 | void IconbarTool::addList(std::list<FluxboxWindow *> &winlist) { | ||
963 | // ok, now we should have a list of icons that we need to add | ||
964 | std::list<FluxboxWindow *>::iterator it = winlist.begin(); | ||
965 | std::list<FluxboxWindow *>::iterator it_end = winlist.end(); | ||
966 | for (; it != it_end; ++it) | ||
967 | addWindow(**it); | ||
968 | renderTheme(); | ||
969 | } | 889 | } |
970 | 890 | ||
971 | void IconbarTool::timedRender() { | 891 | void IconbarTool::timedRender() { |
diff --git a/src/IconbarTool.hh b/src/IconbarTool.hh index e39a39b..feae16a 100644 --- a/src/IconbarTool.hh +++ b/src/IconbarTool.hh | |||
@@ -120,13 +120,9 @@ private: | |||
120 | /// add a single window | 120 | /// add a single window |
121 | void addWindow(FluxboxWindow &win); | 121 | void addWindow(FluxboxWindow &win); |
122 | /// add icons to the list | 122 | /// add icons to the list |
123 | void updateIcons(); | 123 | void updateList(); |
124 | /// add normal windows to the list | 124 | /// check if window is already in the list |
125 | void updateWorkspace(); | 125 | bool checkDuplicate(FluxboxWindow &win); |
126 | /// add all windows to the list | ||
127 | void updateAllWindows(); | ||
128 | /// add a list of windows | ||
129 | void addList(std::list<FluxboxWindow *> &winlist); | ||
130 | /// so we can update current window without flicker | 126 | /// so we can update current window without flicker |
131 | void timedRender(); | 127 | void timedRender(); |
132 | 128 | ||