diff options
author | fluxgen <fluxgen> | 2002-03-19 14:30:43 (GMT) |
---|---|---|
committer | fluxgen <fluxgen> | 2002-03-19 14:30:43 (GMT) |
commit | 95aeda26271cce3061a46a3ca0b122bc13c8f5c8 (patch) | |
tree | aaa01d20e77a2445a20a0522d86296b981049b8e /src/Window.cc | |
parent | 1871169b06d8b9909ff26b761d24a40a65ef18f9 (diff) | |
download | fluxbox-95aeda26271cce3061a46a3ca0b122bc13c8f5c8.zip fluxbox-95aeda26271cce3061a46a3ca0b122bc13c8f5c8.tar.bz2 |
Xinerama support
Diffstat (limited to 'src/Window.cc')
-rw-r--r-- | src/Window.cc | 144 |
1 files changed, 121 insertions, 23 deletions
diff --git a/src/Window.cc b/src/Window.cc index d41b77e..c74f101 100644 --- a/src/Window.cc +++ b/src/Window.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: Window.cc,v 1.33 2002/03/19 00:15:58 fluxgen Exp $ | 25 | // $Id: Window.cc,v 1.34 2002/03/19 14:30:42 fluxgen Exp $ |
26 | 26 | ||
27 | //use GNU extensions | 27 | //use GNU extensions |
28 | #ifndef _GNU_SOURCE | 28 | #ifndef _GNU_SOURCE |
@@ -265,32 +265,44 @@ tab(0) | |||
265 | client.normal_hint_flags & (PPosition|USPosition)) { | 265 | client.normal_hint_flags & (PPosition|USPosition)) { |
266 | setGravityOffsets(); | 266 | setGravityOffsets(); |
267 | 267 | ||
268 | if (! fluxbox->isStartup()) { // is going to be used when position | 268 | if (! fluxbox->isStartup()) { |
269 | if (decorations.tab) { // window is cleanly fixed | 269 | #ifdef XINERAMA |
270 | int real_x = frame.x; | 270 | unsigned int head = 0; |
271 | int real_y = frame.y; | 271 | if (screen->hasXinerama()) { |
272 | head = screen->getHead(frame.x, frame.y); | ||
273 | } | ||
274 | #endif // XINERAMA | ||
272 | 275 | ||
273 | if (screen->getTabPlacement() == Tab::PTOP) | 276 | int real_x = frame.x; |
274 | real_y -= screen->getTabHeight(); | 277 | int real_y = frame.y; |
275 | 278 | ||
276 | else if (screen->getTabPlacement() == Tab::PLEFT) { | 279 | if (decorations.tab) { |
277 | if (screen->isTabRotateVertical()) | 280 | if (screen->getTabPlacement() == Tab::PTOP) { |
278 | real_x -= screen->getTabHeight(); | 281 | real_y -= screen->getTabHeight(); |
279 | else | 282 | } else if (screen->getTabPlacement() == Tab::PLEFT) { |
280 | real_x -= screen->getTabWidth(); | 283 | real_x -= (screen->isTabRotateVertical()) |
284 | ? screen->getTabHeight() | ||
285 | : screen->getTabWidth(); | ||
281 | } | 286 | } |
287 | } | ||
282 | 288 | ||
283 | if (real_x >= 0 && | 289 | #ifdef XINERAMA |
284 | real_y + frame.y_border >= 0 && | 290 | // check is within the current head, so it won't overlap heads |
285 | real_x <= (signed) screen->getWidth() && | 291 | if (real_x >= screen->getHeadX(head) && |
286 | real_y <= (signed) screen->getHeight()) | 292 | real_y + frame.y_border >= screen->getHeadY(head) && |
287 | place_window = false; | 293 | (real_x + frame.width) <= |
288 | 294 | (screen->getHeadX(head) + screen->getHeadWidth(head)) && | |
289 | } else if (frame.x >= 0 && // non tab | 295 | (real_y + frame.height) <= |
290 | (signed) (frame.y + frame.y_border) >= 0 && | 296 | (screen->getHeadY(head) + screen->getHeadHeight(head)) ) |
291 | frame.x <= (signed) screen->getWidth() && | 297 | place_window = false; |
292 | frame.y <= (signed) screen->getHeight()) | 298 | #else // !XINERAMA |
299 | if (real_x >= 0 && | ||
300 | real_y + frame.y_border >= 0 && | ||
301 | real_x <= (signed) screen->getWidth() && | ||
302 | real_y <= (signed) screen->getHeight()) | ||
293 | place_window = false; | 303 | place_window = false; |
304 | #endif // XIENRAMA | ||
305 | |||
294 | } else | 306 | } else |
295 | place_window = false; | 307 | place_window = false; |
296 | 308 | ||
@@ -2083,7 +2095,25 @@ void FluxboxWindow::maximize(unsigned int button) { | |||
2083 | if (! maximized) { | 2095 | if (! maximized) { |
2084 | int dx, dy; | 2096 | int dx, dy; |
2085 | unsigned int dw, dh, slitModL = 0, slitModR = 0, slitModT = 0, slitModB = 0; | 2097 | unsigned int dw, dh, slitModL = 0, slitModR = 0, slitModT = 0, slitModB = 0; |
2098 | |||
2099 | #ifdef XINERAMA | ||
2100 | // get the head the window is on, taking the middle of the window to | ||
2101 | // make it feel right, maybe someone will like client.x, client.y better | ||
2102 | // tough? | ||
2103 | unsigned int head = (screen->hasXinerama()) ? | ||
2104 | screen->getHead(client.x + (client.width / 2), client.y + (client.height / 2)) | ||
2105 | : 0; | ||
2106 | #endif // XINERAMA | ||
2107 | |||
2108 | |||
2086 | #ifdef SLIT | 2109 | #ifdef SLIT |
2110 | |||
2111 | #ifdef XINERAMA | ||
2112 | // take the slit in account if it's on the same head | ||
2113 | // (always true if we don't have xinerama | ||
2114 | if (!screen->hasXinerama() || screen->getSlitOnHead() == head) { | ||
2115 | #endif // XINERAMA | ||
2116 | |||
2087 | Slit* mSlt = screen->getSlit(); | 2117 | Slit* mSlt = screen->getSlit(); |
2088 | 2118 | ||
2089 | if(!screen->doMaxOverSlit() && !screen->doFullMax() && (mSlt->getWidth() > 1)) | 2119 | if(!screen->doMaxOverSlit() && !screen->doFullMax() && (mSlt->getWidth() > 1)) |
@@ -2138,6 +2168,10 @@ void FluxboxWindow::maximize(unsigned int button) { | |||
2138 | break; | 2168 | break; |
2139 | } | 2169 | } |
2140 | } | 2170 | } |
2171 | #ifdef XINERAMA | ||
2172 | } | ||
2173 | #endif // XINERAMA | ||
2174 | |||
2141 | #endif // SLIT | 2175 | #endif // SLIT |
2142 | 2176 | ||
2143 | blackbox_attrib.premax_x = frame.x; | 2177 | blackbox_attrib.premax_x = frame.x; |
@@ -2145,21 +2179,44 @@ void FluxboxWindow::maximize(unsigned int button) { | |||
2145 | blackbox_attrib.premax_w = frame.width; | 2179 | blackbox_attrib.premax_w = frame.width; |
2146 | blackbox_attrib.premax_h = frame.height; | 2180 | blackbox_attrib.premax_h = frame.height; |
2147 | 2181 | ||
2182 | #ifdef XINERAMA | ||
2183 | dw = screen->getHeadWidth(head) - slitModL - slitModR; | ||
2184 | #else // !XINERAMA | ||
2148 | dw = screen->getWidth() - slitModL - slitModR; | 2185 | dw = screen->getWidth() - slitModL - slitModR; |
2186 | #endif // XINERAMA | ||
2149 | dw -= screen->getBorderWidth2x(); | 2187 | dw -= screen->getBorderWidth2x(); |
2150 | dw -= frame.mwm_border_w * 2; | 2188 | dw -= frame.mwm_border_w * 2; |
2151 | dw -= client.base_width; | 2189 | dw -= client.base_width; |
2152 | 2190 | ||
2191 | #ifdef XINERAMA | ||
2192 | dh = screen->getHeadHeight(head) - slitModT - slitModB; | ||
2193 | #else // !XINERAMA | ||
2153 | dh = screen->getHeight() - slitModT - slitModB; | 2194 | dh = screen->getHeight() - slitModT - slitModB; |
2195 | #endif // XINERAMA | ||
2154 | dh -= screen->getBorderWidth2x(); | 2196 | dh -= screen->getBorderWidth2x(); |
2155 | dh -= frame.mwm_border_w * 2; | 2197 | dh -= frame.mwm_border_w * 2; |
2156 | dh -= ((frame.handle_h + screen->getBorderWidth()) * decorations.handle); | 2198 | dh -= ((frame.handle_h + screen->getBorderWidth()) * decorations.handle); |
2157 | dh -= client.base_height; | 2199 | dh -= client.base_height; |
2158 | dh -= frame.y_border; | 2200 | dh -= frame.y_border; |
2159 | 2201 | ||
2160 | if (! screen->doFullMax()) | 2202 | if (! screen->doFullMax()) { |
2203 | #ifdef XINERAMA | ||
2204 | if (screen->hasXinerama()) { | ||
2205 | // is the toolbar on this head? | ||
2206 | if ((screen->getToolbarOnHead() == (signed) head) || | ||
2207 | (screen->getToolbarOnHead() < 0)) { | ||
2208 | dh -= screen->getToolbar()->getExposedHeight() + | ||
2209 | screen->getBorderWidth2x(); | ||
2210 | } | ||
2211 | } else { | ||
2212 | dh -= screen->getToolbar()->getExposedHeight() + | ||
2213 | screen->getBorderWidth2x(); | ||
2214 | } | ||
2215 | #else // !XINERAMA | ||
2161 | dh -= screen->getToolbar()->getExposedHeight() + | 2216 | dh -= screen->getToolbar()->getExposedHeight() + |
2162 | screen->getBorderWidth2x(); | 2217 | screen->getBorderWidth2x(); |
2218 | #endif // XINERAMA | ||
2219 | } | ||
2163 | 2220 | ||
2164 | if (dw < client.min_width) dw = client.min_width; | 2221 | if (dw < client.min_width) dw = client.min_width; |
2165 | if (dh < client.min_height) dh = client.min_height; | 2222 | if (dh < client.min_height) dh = client.min_height; |
@@ -2177,20 +2234,61 @@ void FluxboxWindow::maximize(unsigned int button) { | |||
2177 | dh += (frame.handle_h + screen->getBorderWidth()); | 2234 | dh += (frame.handle_h + screen->getBorderWidth()); |
2178 | dh += frame.mwm_border_w * 2; | 2235 | dh += frame.mwm_border_w * 2; |
2179 | 2236 | ||
2237 | #ifdef XINERAMA | ||
2238 | dx = screen->getHeadX(head) + | ||
2239 | ((screen->getHeadWidth(head) + slitModL - slitModR - dw) / 2) | ||
2240 | - screen->getBorderWidth(); | ||
2241 | #else // !XINERAMA | ||
2180 | dx = ((screen->getWidth()+ slitModL - slitModR - dw) / 2) - screen->getBorderWidth(); | 2242 | dx = ((screen->getWidth()+ slitModL - slitModR - dw) / 2) - screen->getBorderWidth(); |
2243 | #endif // XINERAMA | ||
2181 | 2244 | ||
2182 | if (screen->doFullMax()) { | 2245 | if (screen->doFullMax()) { |
2246 | #ifdef XINERAMA | ||
2247 | dy = screen->getHeadY(head) + | ||
2248 | ((screen->getHeadHeight(head) - dh) / 2) - screen->getBorderWidth(); | ||
2249 | #else // !XINERAMA | ||
2183 | dy = ((screen->getHeight() - dh) / 2) - screen->getBorderWidth(); | 2250 | dy = ((screen->getHeight() - dh) / 2) - screen->getBorderWidth(); |
2251 | #endif // XINERAMA | ||
2184 | } else { | 2252 | } else { |
2253 | #ifdef XINERAMA | ||
2254 | if (screen->hasXinerama()) { // xinerama | ||
2255 | dy = screen->getHeadY(head); | ||
2256 | // is the toolbar on this head? | ||
2257 | if ((screen->getToolbarOnHead() == (signed) head) || | ||
2258 | (screen->getToolbarOnHead() < 0)) { | ||
2259 | dy += (((screen->getHeadHeight(head) + slitModT - slitModB | ||
2260 | - (screen->getToolbar()->getExposedHeight())) - dh) / 2) | ||
2261 | - screen->getBorderWidth2x(); | ||
2262 | } else { | ||
2263 | dy += ((screen->getHeadHeight(head) + slitModT - slitModB - dh) / 2) - | ||
2264 | screen->getBorderWidth(); | ||
2265 | } | ||
2266 | } else { // no xinerama | ||
2267 | dy = (((screen->getHeight() + slitModT - slitModB - | ||
2268 | (screen->getToolbar()->getExposedHeight())) - dh) / 2) - | ||
2269 | screen->getBorderWidth2x(); | ||
2270 | } | ||
2271 | #else // !XINERAMA | ||
2185 | dy = (((screen->getHeight() + slitModT - slitModB - (screen->getToolbar()->getExposedHeight())) | 2272 | dy = (((screen->getHeight() + slitModT - slitModB - (screen->getToolbar()->getExposedHeight())) |
2186 | - dh) / 2) - screen->getBorderWidth2x(); | 2273 | - dh) / 2) - screen->getBorderWidth2x(); |
2274 | #endif // XINERAMA | ||
2187 | 2275 | ||
2188 | switch (screen->getToolbarPlacement()) { | 2276 | switch (screen->getToolbarPlacement()) { |
2189 | case Toolbar::TOPLEFT: | 2277 | case Toolbar::TOPLEFT: |
2190 | case Toolbar::TOPCENTER: | 2278 | case Toolbar::TOPCENTER: |
2191 | case Toolbar::TOPRIGHT: | 2279 | case Toolbar::TOPRIGHT: |
2280 | #ifdef XINERAMA | ||
2281 | // if < 0 than it's over ALL heads, with no xinerama it's there too | ||
2282 | if (!screen->hasXinerama() || | ||
2283 | (screen->getToolbarOnHead() == (signed) head) || | ||
2284 | (screen->getToolbarOnHead() < 0)) { | ||
2285 | dy += screen->getToolbar()->getExposedHeight() + | ||
2286 | screen->getBorderWidth2x(); | ||
2287 | } | ||
2288 | #else // !XINERAMA | ||
2192 | dy += screen->getToolbar()->getExposedHeight() + | 2289 | dy += screen->getToolbar()->getExposedHeight() + |
2193 | screen->getBorderWidth2x(); | 2290 | screen->getBorderWidth2x(); |
2291 | #endif // XINERAMA | ||
2194 | break; | 2292 | break; |
2195 | default: | 2293 | default: |
2196 | break; | 2294 | break; |