--- icewm-1.3.7/src/default.h.orig 2014-09-19 22:59:24.069636447 +1000 +++ icewm-1.3.7/src/default.h 2014-09-19 22:59:46.930568951 +1000 @@ -80,7 +80,7 @@ XIV(bool, miniIconsBottomToTop, false) XIV(bool, manualPlacement, false) XIV(bool, smartPlacement, true) -XIV(bool, centerLarge, false) +XIV(bool, centerPlacement, false) XIV(bool, centerTransientsOnOwner, true) XIV(bool, autoRaise, false) XIV(bool, delayPointerFocus, true) @@ -233,11 +233,11 @@ OBV("StrongPointerFocus", &strongPointerFocus, "Always maintain focus under mouse window (makes some keyboard support non-functional or unreliable"), OBV("OpaqueMove", &opaqueMove, "Opaque window move"), OBV("OpaqueResize", &opaqueResize, "Opaque window resize"), - OBV("ManualPlacement", &manualPlacement, "Windows initially placed manually by user"), + OBV("ManualPlacement", &manualPlacement, "Windows initially placed manually by user (supercedes all other placement options)"), OBV("SmartPlacement", &smartPlacement, "Smart window placement (minimal overlap)"), + OBV("CenterPlacement", ¢erPlacement, "All windows initially centered (supercedes SmartPlacement)"), OBV("HideTitleBarWhenMaximized", &hideTitleBarWhenMaximized, "Hide title bar when maximized"), - OBV("CenterLarge", ¢erLarge, "Center large windows"), - OBV("CenterTransientsOnOwner", ¢erTransientsOnOwner, "Center dialogs on owner window"), + OBV("CenterTransientsOnOwner", ¢erTransientsOnOwner, "Center dialogs on owner window (supercedes CenterPlacement and SmartPlacement)"), OBV("MenuMouseTracking", &menuMouseTracking, "Menus track mouse even with no mouse buttons held"), OBV("AutoRaise", &autoRaise, "Auto raise windows after delay"), OBV("DelayPointerFocus", &delayPointerFocus, "Delay pointer focusing when mouse moves"), --- icewm-1.3.7/src/wmmgr.cc.orig 2014-09-19 22:59:24.083636042 +1000 +++ icewm-1.3.7/src/wmmgr.cc 2014-09-20 00:02:51.127696570 +1000 @@ -1239,6 +1239,32 @@ focusTopWindow(); } +int YWindowManager::getCenterPlaceX(YFrameWindow *frame, int x, int w) { + int mx, my, Mx, My, nx; + + if (centerPlacement) { + manager->getWorkArea(frame, &mx, &my, &Mx, &My); + nx = (mx + Mx - w) / 2; /* = mx + (Mx - mx - w) / 2 */ + if (nx < mx) nx = mx; + } else { + nx = 0; + } + return nx; +} + +int YWindowManager::getCenterPlaceY(YFrameWindow *frame, int y, int h) { + int mx, my, Mx, My, ny; + + if (centerPlacement) { + manager->getWorkArea(frame, &mx, &my, &Mx, &My); + ny = (my + My - h) / 2; /* = my + (My - my - h) / 2 */ + if (ny < my) ny = my; + } else { + ny = 0; + } + return ny; +} + void YWindowManager::getNewPosition(YFrameWindow *frame, int &x, int &y, int w, int h, int xiscreen) { if (centerTransientsOnOwner && frame->owner() != 0) { x = frame->owner()->x() + frame->owner()->width() / 2 - w / 2; @@ -1246,22 +1272,11 @@ } else if (smartPlacement) { getSmartPlace(true, frame, x, y, w, h, xiscreen); } else { - - static int lastX = 0; - static int lastY = 0; + static int lastX = getCenterPlaceX(frame, x, w); + static int lastY = getCenterPlaceY(frame, y, h); getCascadePlace(frame, lastX, lastY, x, y, w, h); } - if (centerLarge) { - int mx, my, Mx, My; - manager->getWorkArea(frame, &mx, &my, &Mx, &My); - if (w > (Mx - mx) / 2 && h > (My - my) / 2) { - x = (mx + Mx - w) / 2; /* = mx + (Mx - mx - w) / 2 */ - if (x < mx) x = mx; - y = (my + My - h) / 2; /* = my + (My - my - h) / 2 */ - if (y < my) y = my; - } - } } void YWindowManager::placeWindow(YFrameWindow *frame, --- icewm-1.3.7/src/wmmgr.h.orig 2014-09-20 00:16:42.035243520 +1000 +++ icewm-1.3.7/src/wmmgr.h 2014-09-20 00:17:43.884043254 +1000 @@ -101,6 +101,8 @@ void tryCover(bool down, YFrameWindow *frame, int x, int y, int w, int h, int &px, int &py, int &cover, int xiscreen); bool getSmartPlace(bool down, YFrameWindow *frame, int &x, int &y, int w, int h, int xiscreen); + int getCenterPlaceX(YFrameWindow *frame, int x, int w); + int getCenterPlaceY(YFrameWindow *frame, int y, int h); void getNewPosition(YFrameWindow *frame, int &x, int &y, int w, int h, int xiscreen); void placeWindow(YFrameWindow *frame, int x, int y, int cw, int ch, bool newClient, bool &canActivate);