summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Configmenu.cc103
-rw-r--r--src/Screen.hh4
-rw-r--r--src/Workspace.cc27
-rw-r--r--src/Workspace.hh1
4 files changed, 96 insertions, 39 deletions
diff --git a/src/Configmenu.cc b/src/Configmenu.cc
index 6d1bbed2..77755e27 100644
--- a/src/Configmenu.cc
+++ b/src/Configmenu.cc
@@ -203,6 +203,8 @@ Configmenu::Placementmenu::Placementmenu(Configmenu *cm):
BScreen::ColSmartPlacement);
insert(i18n(ConfigmenuSet, ConfigmenuCascade, "Cascade Placement"),
BScreen::CascadePlacement);
+ insert(i18n(ConfigmenuSet, ConfigmenuUnderMouse, "Under Mouse Placement"),
+ BScreen::UnderMousePlacement);
insert(i18n(ConfigmenuSet, ConfigmenuLeftRight, "Left to Right"),
BScreen::LeftRight);
insert(i18n(ConfigmenuSet, ConfigmenuRightLeft, "Right to Left"),
@@ -217,28 +219,26 @@ Configmenu::Placementmenu::Placementmenu(Configmenu *cm):
void Configmenu::Placementmenu::setValues(void) {
- switch (getScreen()->getPlacementPolicy()) {
- case BScreen::RowSmartPlacement:
- setItemSelected(0, True);
- break;
-
- case BScreen::ColSmartPlacement:
- setItemSelected(1, True);
- break;
-
- case BScreen::CascadePlacement:
- setItemSelected(2, True);
- break;
- }
+ int placement = getScreen()->getPlacementPolicy();
+
+ setItemSelected(0, placement == BScreen::RowSmartPlacement);
+ setItemSelected(1, placement == BScreen::ColSmartPlacement);
+ setItemSelected(2, placement == BScreen::CascadePlacement);
+ setItemSelected(3, placement == BScreen::UnderMousePlacement);
bool rl = (getScreen()->getRowPlacementDirection() == BScreen::LeftRight),
- tb = (getScreen()->getColPlacementDirection() == BScreen::TopBottom);
-
- setItemSelected(3, rl);
- setItemSelected(4, ! rl);
-
- setItemSelected(5, tb);
- setItemSelected(6, ! tb);
+ tb = (getScreen()->getColPlacementDirection() == BScreen::TopBottom),
+ e = placement != BScreen::UnderMousePlacement;
+
+ setItemSelected(4, rl);
+ setItemSelected(5, ! rl);
+ setItemEnabled(4, e);
+ setItemEnabled(5, e);
+
+ setItemSelected(6, tb);
+ setItemSelected(7, ! tb);
+ setItemEnabled(6, e);
+ setItemEnabled(7, e);
}
@@ -261,59 +261,88 @@ void Configmenu::Placementmenu::itemSelected(int button, unsigned int index) {
case BScreen::RowSmartPlacement:
getScreen()->savePlacementPolicy(item->function());
- setItemSelected(0, True);
- setItemSelected(1, False);
- setItemSelected(2, False);
+ setItemSelected(0, true);
+ setItemSelected(1, false);
+ setItemSelected(2, false);
+ setItemSelected(3, false);
+ setItemEnabled(4, true);
+ setItemEnabled(5, true);
+ setItemEnabled(6, true);
+ setItemEnabled(7, true);
break;
case BScreen::ColSmartPlacement:
getScreen()->savePlacementPolicy(item->function());
- setItemSelected(0, False);
- setItemSelected(1, True);
- setItemSelected(2, False);
+ setItemSelected(0, false);
+ setItemSelected(1, true);
+ setItemSelected(2, false);
+ setItemSelected(3, false);
+ setItemEnabled(4, true);
+ setItemEnabled(5, true);
+ setItemEnabled(6, true);
+ setItemEnabled(7, true);
break;
case BScreen::CascadePlacement:
getScreen()->savePlacementPolicy(item->function());
- setItemSelected(0, False);
- setItemSelected(1, False);
- setItemSelected(2, True);
+ setItemSelected(0, false);
+ setItemSelected(1, false);
+ setItemSelected(2, true);
+ setItemSelected(3, false);
+ setItemEnabled(4, true);
+ setItemEnabled(5, true);
+ setItemEnabled(6, true);
+ setItemEnabled(7, true);
+
+ break;
+
+ case BScreen::UnderMousePlacement:
+ getScreen()->savePlacementPolicy(item->function());
+
+ setItemSelected(0, false);
+ setItemSelected(1, false);
+ setItemSelected(2, false);
+ setItemSelected(3, true);
+ setItemEnabled(4, false);
+ setItemEnabled(5, false);
+ setItemEnabled(6, false);
+ setItemEnabled(7, false);
break;
case BScreen::LeftRight:
getScreen()->saveRowPlacementDirection(BScreen::LeftRight);
- setItemSelected(3, True);
- setItemSelected(4, False);
+ setItemSelected(4, true);
+ setItemSelected(5, false);
break;
case BScreen::RightLeft:
getScreen()->saveRowPlacementDirection(BScreen::RightLeft);
- setItemSelected(3, False);
- setItemSelected(4, True);
+ setItemSelected(4, false);
+ setItemSelected(5, true);
break;
case BScreen::TopBottom:
getScreen()->saveColPlacementDirection(BScreen::TopBottom);
- setItemSelected(5, True);
- setItemSelected(6, False);
+ setItemSelected(6, true);
+ setItemSelected(7, false);
break;
case BScreen::BottomTop:
getScreen()->saveColPlacementDirection(BScreen::BottomTop);
- setItemSelected(5, False);
- setItemSelected(6, True);
+ setItemSelected(6, false);
+ setItemSelected(7, true);
break;
}
diff --git a/src/Screen.hh b/src/Screen.hh
index 34cc633a..3ed724f9 100644
--- a/src/Screen.hh
+++ b/src/Screen.hh
@@ -190,8 +190,8 @@ private:
public:
- enum { RowSmartPlacement = 1, ColSmartPlacement, CascadePlacement, LeftRight,
- RightLeft, TopBottom, BottomTop };
+ enum { RowSmartPlacement = 1, ColSmartPlacement, CascadePlacement,
+ UnderMousePlacement, LeftRight, RightLeft, TopBottom, BottomTop };
enum { RoundBullet = 1, TriangleBullet, SquareBullet, NoBullet };
enum { Restart = 1, RestartOther, Exit, Shutdown, Execute, Reconfigure,
WindowShade, WindowIconify, WindowMaximize, WindowClose, WindowRaise,
diff --git a/src/Workspace.cc b/src/Workspace.cc
index 0bc906cb..91bc1419 100644
--- a/src/Workspace.cc
+++ b/src/Workspace.cc
@@ -556,6 +556,31 @@ bool Workspace::smartPlacement(Rect& win, const Rect& availableArea) {
}
+bool Workspace::underMousePlacement(Rect &win, const Rect &availableArea) {
+ int x, y, rx, ry;
+ Window c, r;
+ unsigned int m;
+ XQueryPointer(screen->getBlackbox()->getXDisplay(), screen->getRootWindow(),
+ &r, &c, &rx, &ry, &x, &y, &m);
+ x = rx - win.width() / 2;
+ y = ry - win.height() / 2;
+
+ if (x < availableArea.x())
+ x = availableArea.x();
+ if (y < availableArea.y())
+ y = availableArea.y();
+ if (x + win.width() > availableArea.x() + availableArea.width())
+ x = availableArea.x() + availableArea.width() - win.width();
+ if (y + win.height() > availableArea.y() + availableArea.height())
+ y = availableArea.y() + availableArea.height() - win.height();
+
+ win.setX(x);
+ win.setY(y);
+
+ return True;
+}
+
+
bool Workspace::cascadePlacement(Rect &win, const Rect &availableArea) {
if ((cascade_x > static_cast<signed>(availableArea.width() / 2)) ||
(cascade_y > static_cast<signed>(availableArea.height() / 2)))
@@ -583,6 +608,8 @@ void Workspace::placeWindow(BlackboxWindow *win) {
case BScreen::ColSmartPlacement:
placed = smartPlacement(new_win, availableArea);
break;
+ case BScreen::UnderMousePlacement:
+ placed = underMousePlacement(new_win, availableArea);
default:
break; // handled below
} // switch
diff --git a/src/Workspace.hh b/src/Workspace.hh
index 652e8cef..dadb0dd0 100644
--- a/src/Workspace.hh
+++ b/src/Workspace.hh
@@ -64,6 +64,7 @@ private:
void placeWindow(BlackboxWindow *win);
bool cascadePlacement(Rect& win, const Rect& availableArea);
bool smartPlacement(Rect& win, const Rect& availableArea);
+ bool underMousePlacement(Rect& win, const Rect& availableArea);
public:
Workspace(BScreen *scrn, unsigned int i = 0);