1 /* 2 * Copyright (c) 2005-2008, Haiku, Inc. 3 * Distributed under the terms of the MIT license. 4 * 5 * Authors: 6 * Axel Dörfler, axeld@pinc-software.de 7 */ 8 9 10 #include "DesktopSettings.h" 11 #include "Window.h" 12 13 14 const BPoint kInvalidWindowPosition = BPoint(INFINITY, INFINITY); 15 16 17 window_anchor::window_anchor() 18 : 19 next(NULL), 20 previous(NULL), 21 position(kInvalidWindowPosition) 22 { 23 } 24 25 26 // #pragma mark - 27 28 29 WindowList::WindowList(int32 index) 30 : 31 fIndex(index), 32 fFirstWindow(NULL), 33 fLastWindow(NULL) 34 { 35 } 36 37 38 WindowList::~WindowList() 39 { 40 } 41 42 43 void 44 WindowList::SetIndex(int32 index) 45 { 46 fIndex = index; 47 } 48 49 50 /*! 51 Adds the \a window to the end of the list. If \a before is 52 given, it will be inserted right before that window. 53 */ 54 void 55 WindowList::AddWindow(Window* window, Window* before) 56 { 57 window_anchor& windowAnchor = window->Anchor(fIndex); 58 59 if (before != NULL) { 60 window_anchor& beforeAnchor = before->Anchor(fIndex); 61 62 // add view before this one 63 windowAnchor.next = before; 64 windowAnchor.previous = beforeAnchor.previous; 65 if (windowAnchor.previous != NULL) 66 windowAnchor.previous->Anchor(fIndex).next = window; 67 68 beforeAnchor.previous = window; 69 if (fFirstWindow == before) 70 fFirstWindow = window; 71 } else { 72 // add view to the end of the list 73 if (fLastWindow != NULL) { 74 fLastWindow->Anchor(fIndex).next = window; 75 windowAnchor.previous = fLastWindow; 76 } else { 77 fFirstWindow = window; 78 windowAnchor.previous = NULL; 79 } 80 81 windowAnchor.next = NULL; 82 fLastWindow = window; 83 } 84 85 if (fIndex < kMaxWorkspaces) 86 window->SetWorkspaces(window->Workspaces() | (1UL << fIndex)); 87 } 88 89 90 void 91 WindowList::RemoveWindow(Window* window) 92 { 93 window_anchor& windowAnchor = window->Anchor(fIndex); 94 95 if (fFirstWindow == window) { 96 // it's the first child 97 fFirstWindow = windowAnchor.next; 98 } else { 99 // it must have a previous sibling, then 100 windowAnchor.previous->Anchor(fIndex).next = windowAnchor.next; 101 } 102 103 if (fLastWindow == window) { 104 // it's the last child 105 fLastWindow = windowAnchor.previous; 106 } else { 107 // then it must have a next sibling 108 windowAnchor.next->Anchor(fIndex).previous = windowAnchor.previous; 109 } 110 111 if (fIndex < kMaxWorkspaces) 112 window->SetWorkspaces(window->Workspaces() & ~(1UL << fIndex)); 113 114 windowAnchor.previous = NULL; 115 windowAnchor.next = NULL; 116 } 117 118 119 bool 120 WindowList::HasWindow(Window* window) const 121 { 122 if (window == NULL) 123 return false; 124 125 return window->Anchor(fIndex).next != NULL 126 || window->Anchor(fIndex).previous != NULL 127 || fFirstWindow == window 128 || fLastWindow == window; 129 } 130 131 132 /*! Unlike HasWindow(), this will not reference the window pointer. You 133 can use this method to check whether or not a window is still part 134 of a list (when it's possible that the window is already gone). 135 */ 136 bool 137 WindowList::ValidateWindow(Window* validateWindow) const 138 { 139 for (Window *window = FirstWindow(); window != NULL; 140 window = window->NextWindow(fIndex)) { 141 if (window == validateWindow) 142 return true; 143 } 144 145 return false; 146 } 147 148 149 int32 150 WindowList::Count() const 151 { 152 int32 count = 0; 153 154 for (Window *window = FirstWindow(); window != NULL; 155 window = window->NextWindow(fIndex)) { 156 count++; 157 } 158 159 return count; 160 } 161