diff options
Diffstat (limited to 'src/Window.cc')
-rw-r--r-- | src/Window.cc | 107 |
1 files changed, 77 insertions, 30 deletions
diff --git a/src/Window.cc b/src/Window.cc index f28f6ab..e1cf224 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -394,10 +394,11 @@ void FluxboxWindow::init() { | |||
394 | 394 | ||
395 | frame().setUseShape(!m_shaped); | 395 | frame().setUseShape(!m_shaped); |
396 | 396 | ||
397 | if (screen().getDefaultExternalTabs()) { | 397 | frame().setTabPlacement(screen().getTabPlacement()); |
398 | frame().setTabMode(FbWinFrame::EXTERNAL); | 398 | if (screen().getDefaultInternalTabs()) { |
399 | } else { | ||
400 | frame().setTabMode(FbWinFrame::INTERNAL); | 399 | frame().setTabMode(FbWinFrame::INTERNAL); |
400 | } else { | ||
401 | frame().setTabMode(FbWinFrame::EXTERNAL); | ||
401 | } | 402 | } |
402 | 403 | ||
403 | //!! TODO init of client should be better | 404 | //!! TODO init of client should be better |
@@ -3049,20 +3050,28 @@ void FluxboxWindow::setDecoration(Decoration decoration, bool apply) { | |||
3049 | case DECOR_NORMAL: | 3050 | case DECOR_NORMAL: |
3050 | decorations.titlebar = decorations.border = decorations.handle = | 3051 | decorations.titlebar = decorations.border = decorations.handle = |
3051 | decorations.iconify = decorations.maximize = | 3052 | decorations.iconify = decorations.maximize = |
3052 | decorations.menu = true; | 3053 | decorations.menu = decorations.tab = true; |
3054 | functions.resize = functions.move = functions.iconify = | ||
3055 | functions.maximize = true; | ||
3056 | break; | ||
3057 | |||
3058 | case DECOR_TAB: | ||
3059 | decorations.border = decorations.iconify = decorations.maximize = | ||
3060 | decorations.menu = decorations.tab = true; | ||
3061 | decorations.titlebar = decorations.handle = false; | ||
3053 | functions.resize = functions.move = functions.iconify = | 3062 | functions.resize = functions.move = functions.iconify = |
3054 | functions.maximize = true; | 3063 | functions.maximize = true; |
3055 | break; | 3064 | break; |
3056 | 3065 | ||
3057 | case DECOR_TINY: | 3066 | case DECOR_TINY: |
3058 | decorations.titlebar = decorations.iconify = decorations.menu = | 3067 | decorations.titlebar = decorations.iconify = decorations.menu = |
3059 | functions.move = functions.iconify = true; | 3068 | functions.move = functions.iconify = decorations.tab = true; |
3060 | decorations.border = decorations.handle = decorations.maximize = | 3069 | decorations.border = decorations.handle = decorations.maximize = |
3061 | functions.resize = functions.maximize = false; | 3070 | functions.resize = functions.maximize = false; |
3062 | break; | 3071 | break; |
3063 | 3072 | ||
3064 | case DECOR_TOOL: | 3073 | case DECOR_TOOL: |
3065 | decorations.titlebar = decorations.menu = functions.move = true; | 3074 | decorations.titlebar = decorations.tab = decorations.menu = functions.move = true; |
3066 | decorations.iconify = decorations.border = decorations.handle = | 3075 | decorations.iconify = decorations.border = decorations.handle = |
3067 | decorations.maximize = functions.resize = functions.maximize = | 3076 | decorations.maximize = functions.resize = functions.maximize = |
3068 | functions.iconify = false; | 3077 | functions.iconify = false; |
@@ -3110,7 +3119,7 @@ void FluxboxWindow::applyDecorations(bool initial) { | |||
3110 | if (decorations.titlebar) { | 3119 | if (decorations.titlebar) { |
3111 | bool change = frame().showTitlebar(); | 3120 | bool change = frame().showTitlebar(); |
3112 | client_move |= change; | 3121 | client_move |= change; |
3113 | if (change && !screen().getDefaultExternalTabs()) { | 3122 | if (change && screen().getDefaultInternalTabs()) { |
3114 | client_move |= frame().setTabMode(FbWinFrame::INTERNAL); | 3123 | client_move |= frame().setTabMode(FbWinFrame::INTERNAL); |
3115 | } | 3124 | } |
3116 | } else { | 3125 | } else { |
@@ -3357,42 +3366,56 @@ void FluxboxWindow::doSnapping(int &orig_left, int &orig_top) { | |||
3357 | int right = orig_left + width() + 2 * borderW; | 3366 | int right = orig_left + width() + 2 * borderW; |
3358 | int bottom = orig_top + height() + 2 * borderW; | 3367 | int bottom = orig_top + height() + 2 * borderW; |
3359 | 3368 | ||
3369 | // test against tabs too | ||
3370 | bool i_have_tabs = frame().externalTabMode(); | ||
3371 | int xoff,yoff,woff,hoff; | ||
3372 | if (i_have_tabs) { | ||
3373 | xoff = xOffset(); | ||
3374 | yoff = yOffset(); | ||
3375 | woff = widthOffset(); | ||
3376 | hoff = heightOffset(); | ||
3377 | } | ||
3378 | |||
3379 | |||
3360 | ///////////////////////////////////// | 3380 | ///////////////////////////////////// |
3361 | // begin by checking the screen (or Xinerama head) edges | 3381 | // begin by checking the screen (or Xinerama head) edges |
3362 | 3382 | ||
3363 | int h; | 3383 | int starth = 0; |
3364 | if (screen().numHeads() > 0) { | 3384 | |
3365 | // head "0" == whole screen width + height, which we skip since the | 3385 | // head "0" == whole screen width + height, which we skip since the |
3366 | // sum of all the heads covers those edges | 3386 | // sum of all the heads covers those edges, if >1 head |
3367 | for (h = 1; h <= screen().numHeads(); h++) { | 3387 | if (screen().numHeads() > 0) |
3368 | snapToWindow(dx, dy, left, right, top, bottom, | 3388 | starth=1; |
3389 | |||
3390 | for (int h=starth; h <= screen().numHeads(); h++) { | ||
3391 | snapToWindow(dx, dy, left, right, top, bottom, | ||
3392 | screen().maxLeft(h), | ||
3393 | screen().maxRight(h), | ||
3394 | screen().maxTop(h), | ||
3395 | screen().maxBottom(h)); | ||
3396 | |||
3397 | if (i_have_tabs) | ||
3398 | snapToWindow(dx, dy, left - xoff, right - xoff + woff, top - yoff, bottom - yoff + hoff, | ||
3369 | screen().maxLeft(h), | 3399 | screen().maxLeft(h), |
3370 | screen().maxRight(h), | 3400 | screen().maxRight(h), |
3371 | screen().maxTop(h), | 3401 | screen().maxTop(h), |
3372 | screen().maxBottom(h)); | 3402 | screen().maxBottom(h)); |
3373 | } | 3403 | } |
3374 | for (h = 1; h <= screen().numHeads(); h++) { | 3404 | for (int h=starth; h <= screen().numHeads(); h++) { |
3375 | snapToWindow(dx, dy, left, right, top, bottom, | 3405 | snapToWindow(dx, dy, left, right, top, bottom, |
3406 | screen().getHeadX(h), | ||
3407 | screen().getHeadX(h) + screen().getHeadWidth(h), | ||
3408 | screen().getHeadY(h), | ||
3409 | screen().getHeadY(h) + screen().getHeadHeight(h)); | ||
3410 | |||
3411 | if (i_have_tabs) | ||
3412 | snapToWindow(dx, dy, left - xoff, right - xoff + woff, top - yoff, bottom - yoff + hoff, | ||
3376 | screen().getHeadX(h), | 3413 | screen().getHeadX(h), |
3377 | screen().getHeadX(h) + screen().getHeadWidth(h), | 3414 | screen().getHeadX(h) + screen().getHeadWidth(h), |
3378 | screen().getHeadY(h), | 3415 | screen().getHeadY(h), |
3379 | screen().getHeadY(h) + screen().getHeadHeight(h)); | 3416 | screen().getHeadY(h) + screen().getHeadHeight(h)); |
3380 | } | ||
3381 | } else { | ||
3382 | snapToWindow(dx, dy, left, right, top, bottom, | ||
3383 | screen().maxLeft(0), | ||
3384 | screen().maxRight(0), | ||
3385 | screen().maxTop(0), | ||
3386 | screen().maxBottom(0)); | ||
3387 | |||
3388 | snapToWindow(dx, dy, left, right, top, bottom, | ||
3389 | screen().getHeadX(0), | ||
3390 | screen().getHeadX(0) + screen().getHeadWidth(0), | ||
3391 | screen().getHeadY(0), | ||
3392 | screen().getHeadY(0) + screen().getHeadHeight(0)); | ||
3393 | } | 3417 | } |
3394 | 3418 | ||
3395 | |||
3396 | ///////////////////////////////////// | 3419 | ///////////////////////////////////// |
3397 | // now check window edges | 3420 | // now check window edges |
3398 | 3421 | ||
@@ -3415,6 +3438,30 @@ void FluxboxWindow::doSnapping(int &orig_left, int &orig_top) { | |||
3415 | (*it)->x() + (*it)->width() + 2 * bw, | 3438 | (*it)->x() + (*it)->width() + 2 * bw, |
3416 | (*it)->y(), | 3439 | (*it)->y(), |
3417 | (*it)->y() + (*it)->height() + 2 * bw); | 3440 | (*it)->y() + (*it)->height() + 2 * bw); |
3441 | |||
3442 | if (i_have_tabs) | ||
3443 | snapToWindow(dx, dy, left - xoff, right - xoff + woff, top - yoff, bottom - yoff + hoff, | ||
3444 | (*it)->x(), | ||
3445 | (*it)->x() + (*it)->width() + 2 * bw, | ||
3446 | (*it)->y(), | ||
3447 | (*it)->y() + (*it)->height() + 2 * bw); | ||
3448 | |||
3449 | // also snap to the box containing the tabs (don't bother with actual | ||
3450 | // tab edges, since they're dynamic | ||
3451 | if ((*it)->frame().externalTabMode()) | ||
3452 | snapToWindow(dx, dy, left, right, top, bottom, | ||
3453 | (*it)->x() - (*it)->xOffset(), | ||
3454 | (*it)->x() - (*it)->xOffset() + (*it)->width() + 2 * bw + (*it)->widthOffset(), | ||
3455 | (*it)->y() - (*it)->yOffset(), | ||
3456 | (*it)->y() - (*it)->yOffset() + (*it)->height() + 2 * bw + (*it)->heightOffset()); | ||
3457 | |||
3458 | if (i_have_tabs) | ||
3459 | snapToWindow(dx, dy, left - xoff, right - xoff + woff, top - yoff, bottom - yoff + hoff, | ||
3460 | (*it)->x() - (*it)->xOffset(), | ||
3461 | (*it)->x() - (*it)->xOffset() + (*it)->width() + 2 * bw + (*it)->widthOffset(), | ||
3462 | (*it)->y() - (*it)->yOffset(), | ||
3463 | (*it)->y() - (*it)->yOffset() + (*it)->height() + 2 * bw + (*it)->heightOffset()); | ||
3464 | |||
3418 | } | 3465 | } |
3419 | 3466 | ||
3420 | // commit | 3467 | // commit |