diff options
Diffstat (limited to 'src/ScreenPlacement.cc')
-rw-r--r-- | src/ScreenPlacement.cc | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/src/ScreenPlacement.cc b/src/ScreenPlacement.cc index 3e0c377..46ff718 100644 --- a/src/ScreenPlacement.cc +++ b/src/ScreenPlacement.cc | |||
@@ -30,6 +30,8 @@ | |||
30 | #include "Screen.hh" | 30 | #include "Screen.hh" |
31 | #include "Window.hh" | 31 | #include "Window.hh" |
32 | 32 | ||
33 | #include "FbTk/Menu.hh" | ||
34 | |||
33 | #include <iostream> | 35 | #include <iostream> |
34 | #include <exception> | 36 | #include <exception> |
35 | #ifdef HAVE_CSTRING | 37 | #ifdef HAVE_CSTRING |
@@ -51,7 +53,8 @@ ScreenPlacement::ScreenPlacement(BScreen &screen): | |||
51 | screen.name()+".windowPlacement", | 53 | screen.name()+".windowPlacement", |
52 | screen.altName()+".WindowPlacement"), | 54 | screen.altName()+".WindowPlacement"), |
53 | m_old_policy(ROWSMARTPLACEMENT), | 55 | m_old_policy(ROWSMARTPLACEMENT), |
54 | m_strategy(0) | 56 | m_strategy(0), |
57 | m_screen(screen) | ||
55 | { | 58 | { |
56 | } | 59 | } |
57 | 60 | ||
@@ -128,7 +131,51 @@ bool ScreenPlacement::placeWindow(const FluxboxWindow &win, int head, | |||
128 | return true; | 131 | return true; |
129 | } | 132 | } |
130 | 133 | ||
134 | bool ScreenPlacement::placeAndShowMenu(FbTk::Menu& menu, int x, int y, bool respect_struts) { | ||
135 | |||
136 | int head = m_screen.getHead(x, y); | ||
137 | |||
138 | menu.setScreen(m_screen.getHeadX(head), | ||
139 | m_screen.getHeadY(head), | ||
140 | m_screen.getHeadWidth(head), | ||
141 | m_screen.getHeadHeight(head)); | ||
142 | |||
143 | menu.updateMenu(); // recalculate the size | ||
144 | |||
145 | x = x - (menu.width() / 2); | ||
146 | if (menu.isTitleVisible()) | ||
147 | y = y - (menu.titleWindow().height() / 2); | ||
148 | |||
149 | // adjust (x, y) to fit on the screen | ||
150 | if (!respect_struts) { | ||
151 | |||
152 | int bw = 2 * menu.fbwindow().borderWidth(); | ||
153 | std::pair<int, int> pos = m_screen.clampToHead(head, x, y, menu.width() + bw, menu.height() + bw); | ||
154 | x = pos.first; | ||
155 | y = pos.second; | ||
131 | 156 | ||
157 | } else { // do not cover toolbar if no title | ||
158 | |||
159 | int top = static_cast<signed>(m_screen.maxTop(head)); | ||
160 | int bottom = static_cast<signed>(m_screen.maxBottom(head)); | ||
161 | int left = static_cast<signed>(m_screen.maxLeft(head)); | ||
162 | int right = static_cast<signed>(m_screen.maxRight(head)); | ||
163 | |||
164 | if (y < top) | ||
165 | y = top; | ||
166 | else if (y + static_cast<signed>(menu.height()) >= bottom) | ||
167 | y = bottom - menu.height() - 1 - menu.fbwindow().borderWidth(); | ||
168 | |||
169 | if (x < left) | ||
170 | x = left; | ||
171 | else if (x + static_cast<signed>(menu.width()) >= right) | ||
172 | x = right - static_cast<int>(menu.width()) - 1; | ||
173 | } | ||
174 | |||
175 | menu.move(x, y); | ||
176 | menu.show(); | ||
177 | menu.grabInputFocus(); | ||
178 | } | ||
132 | 179 | ||
133 | ////////////////////// Placement Resources | 180 | ////////////////////// Placement Resources |
134 | namespace FbTk { | 181 | namespace FbTk { |