summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2002-04-28 12:12:24 +0000
committerDana Jansens <danakj@orodu.net>2002-04-28 12:12:24 +0000
commit8ef0610e9056613eeb1988dde95d252bc0988883 (patch)
treeaae324539ea3e2d10f8a97c20e8ccb43399a47b7 /src
parent830e53f25cb8e48b50c8404b32e36708d335decc (diff)
added ClickMouse window placement policy
Diffstat (limited to 'src')
-rw-r--r--src/Configmenu.cc30
-rw-r--r--src/Screen.cc3
-rw-r--r--src/Screen.h2
-rw-r--r--src/Window.cc15
-rw-r--r--src/Workspace.cc1
-rw-r--r--src/openbox.cc14
6 files changed, 45 insertions, 20 deletions
diff --git a/src/Configmenu.cc b/src/Configmenu.cc
index e11c7c38..ffb5d6e3 100644
--- a/src/Configmenu.cc
+++ b/src/Configmenu.cc
@@ -240,6 +240,9 @@ Configmenu::Placementmenu::Placementmenu(Configmenu *cm) :
insert(i18n->getMessage(ConfigmenuSet, ConfigmenuUnderMouse,
"Under Mouse Placement"),
BScreen::UnderMousePlacement);
+ insert(i18n->getMessage(ConfigmenuSet, ConfigmenuClickMouse,
+ "Click Mouse Placement"),
+ BScreen::ClickMousePlacement);
insert(i18n->getMessage(ConfigmenuSet, ConfigmenuLeftRight,
"Left to Right"), BScreen::LeftRight);
insert(i18n->getMessage(ConfigmenuSet, ConfigmenuRightLeft,
@@ -260,21 +263,26 @@ void Configmenu::Placementmenu::setValues() {
setItemSelected(2, p == BScreen::CascadePlacement);
setItemSelected(3, p == BScreen::BestFitPlacement);
setItemSelected(4, p == BScreen::UnderMousePlacement);
+ setItemSelected(5, p == BScreen::ClickMousePlacement);
bool rl = (configmenu->screen.rowPlacementDirection() ==
BScreen::LeftRight),
tb = (configmenu->screen.colPlacementDirection() ==
BScreen::TopBottom);
- setItemSelected(5, rl);
- setItemEnabled(5, p != BScreen::UnderMousePlacement);
- setItemSelected(6, !rl);
- setItemEnabled(6, p != BScreen::UnderMousePlacement);
-
- setItemSelected(7, tb);
- setItemEnabled(7, p != BScreen::UnderMousePlacement);
- setItemSelected(8, !tb);
- setItemEnabled(8, p != BScreen::UnderMousePlacement);
+ setItemSelected(6, rl);
+ setItemEnabled(6, (p != BScreen::UnderMousePlacement &&
+ p != BScreen::ClickMousePlacement));
+ setItemSelected(7, !rl);
+ setItemEnabled(7, (p != BScreen::UnderMousePlacement &&
+ p != BScreen::ClickMousePlacement));
+
+ setItemSelected(8, tb);
+ setItemEnabled(8, (p != BScreen::UnderMousePlacement &&
+ p != BScreen::ClickMousePlacement));
+ setItemSelected(9, !tb);
+ setItemEnabled(9, (p != BScreen::UnderMousePlacement &&
+ p != BScreen::ClickMousePlacement));
}
void Configmenu::Placementmenu::reconfigure() {
@@ -312,6 +320,10 @@ void Configmenu::Placementmenu::itemSelected(int button, int index) {
configmenu->screen.setPlacementPolicy(item->function());
break;
+ case BScreen::ClickMousePlacement:
+ configmenu->screen.setPlacementPolicy(item->function());
+ break;
+
case BScreen::LeftRight:
configmenu->screen.setRowPlacementDirection(BScreen::LeftRight);
break;
diff --git a/src/Screen.cc b/src/Screen.cc
index a5c6c793..2c46a836 100644
--- a/src/Screen.cc
+++ b/src/Screen.cc
@@ -1027,6 +1027,7 @@ void BScreen::setPlacementPolicy(int p) {
case BestFitPlacement: placement = "BestFitPlacement"; break;
case ColSmartPlacement: placement = "ColSmartPlacement"; break;
case UnderMousePlacement: placement = "UnderMousePlacement"; break;
+ case ClickMousePlacement: placement = "ClickMousePlacement"; break;
default:
case RowSmartPlacement: placement = "RowSmartPlacement"; break;
}
@@ -1302,6 +1303,8 @@ void BScreen::load() {
resource.placement_policy = BestFitPlacement;
else if (0 == strncasecmp(s.c_str(), "UnderMousePlacement", s.length()))
resource.placement_policy = UnderMousePlacement;
+ else if (0 == strncasecmp(s.c_str(), "ClickMousePlacement", s.length()))
+ resource.placement_policy = ClickMousePlacement;
else //if (0 == strncasecmp(s.c_str(), "CascadePlacement", s.length()))
resource.placement_policy = CascadePlacement;
} else
diff --git a/src/Screen.h b/src/Screen.h
index 3b536d27..124d4f98 100644
--- a/src/Screen.h
+++ b/src/Screen.h
@@ -312,7 +312,7 @@ public:
void updateNetizenWindowLower(Window);
enum { RowSmartPlacement = 1, ColSmartPlacement, CascadePlacement,
- BestFitPlacement, UnderMousePlacement,
+ BestFitPlacement, UnderMousePlacement, ClickMousePlacement,
LeftRight, RightLeft, TopBottom, BottomTop };
enum { LeftJustify = 1, RightJustify, CenterJustify };
enum { RoundBullet = 1, TriangleBullet, SquareBullet, NoBullet };
diff --git a/src/Window.cc b/src/Window.cc
index 51e2b41b..3fc0f43d 100644
--- a/src/Window.cc
+++ b/src/Window.cc
@@ -2732,7 +2732,7 @@ void OpenboxWindow::buttonReleaseEvent(XButtonEvent *re) {
void OpenboxWindow::startMove(int x, int y) {
ASSERT(!flags.moving);
- XGrabPointer(display, frame.window, False, Button1MotionMask |
+ XGrabPointer(display, frame.window, False, PointerMotionMask |
ButtonReleaseMask, GrabModeAsync, GrabModeAsync,
None, openbox.getMoveCursor(), CurrentTime);
@@ -2853,14 +2853,13 @@ void OpenboxWindow::endMove() {
void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) {
- if (!flags.resizing && (me->state & Button1Mask) && functions.move &&
- (frame.title == me->window || frame.label == me->window ||
- frame.handle == me->window || frame.window == me->window)) {
- if (!flags.moving)
- startMove(me->x_root, me->y_root);
- else
+ if (flags.moving)
doMove(me->x_root, me->y_root);
- } else if (functions.resize &&
+ else if (!flags.resizing && (me->state & Button1Mask) && functions.move &&
+ (frame.title == me->window || frame.label == me->window ||
+ frame.handle == me->window || frame.window == me->window))
+ startMove(me->x_root, me->y_root);
+ else if (functions.resize &&
(((me->state & Button1Mask) && (me->window == frame.right_grip ||
me->window == frame.left_grip)) ||
(me->state & (Mod1Mask | Button3Mask) &&
diff --git a/src/Workspace.cc b/src/Workspace.cc
index b39769e9..ac655d15 100644
--- a/src/Workspace.cc
+++ b/src/Workspace.cc
@@ -606,6 +606,7 @@ void Workspace::placeWindow(OpenboxWindow &win) {
place = colSmartPlacement(window_size, space);
break;
case BScreen::UnderMousePlacement:
+ case BScreen::ClickMousePlacement:
place = underMousePlacement(window_size, space);
break;
} // switch
diff --git a/src/openbox.cc b/src/openbox.cc
index cfdb6e9b..99d623e5 100644
--- a/src/openbox.cc
+++ b/src/openbox.cc
@@ -479,9 +479,19 @@ void Openbox::process_event(XEvent *e) {
if (! win)
win = new OpenboxWindow(*this, e->xmaprequest.window);
- if ((win = searchWindow(e->xmaprequest.window)))
+ if ((win = searchWindow(e->xmaprequest.window))) {
win->mapRequestEvent(&e->xmaprequest);
-
+ // if we're using the click to place placement type, then immediately
+ // after the window is mapped, we need to start interactively moving it
+ if (win->getScreen()->placementPolicy() == BScreen::ClickMousePlacement) {
+ int x, y, rx, ry;
+ Window c, r;
+ unsigned int m;
+ XQueryPointer(getXDisplay(), win->getScreen()->getRootWindow(),
+ &r, &c, &rx, &ry, &x, &y, &m);
+ win->startMove(rx, ry);
+ }
+ }
break;
}