add UnderMousePlacement placement policy, plus a little fix for window

positioning (Simon)
This commit is contained in:
rathnor 2003-04-25 09:07:14 +00:00
parent 9014e53be3
commit 384603e962
5 changed files with 63 additions and 13 deletions

View file

@ -1,5 +1,9 @@
(Format: Year/Month/Day)
Changes for 0.9.2:
*03/04/25:
* Add UnderMousePlacement policy, plus minor positioning fix (Simon)
-> Patch originally contributed by "Mike" (lgn@users.sf)
Screen.hh Workspace.cc fluxbox.cc Window.cc
*03/04/21:
* Fix toolbar startup and reconfigure things (Simon)
(Thanks Brian Sea)

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: Screen.hh,v 1.82 2003/04/20 13:45:07 fluxgen Exp $
// $Id: Screen.hh,v 1.83 2003/04/25 09:07:08 rathnor Exp $
#ifndef SCREEN_HH
#define SCREEN_HH
@ -309,8 +309,8 @@ public:
FluxboxWindow *createWindow(WinClient &client);
void setupWindowActions(FluxboxWindow &win);
enum { ROWSMARTPLACEMENT = 1, COLSMARTPLACEMENT, CASCADEPLACEMENT, LEFTRIGHT,
RIGHTLEFT, TOPBOTTOM, BOTTOMTOP };
enum { ROWSMARTPLACEMENT = 1, COLSMARTPLACEMENT, CASCADEPLACEMENT,
UNDERMOUSEPLACEMENT, LEFTRIGHT, RIGHTLEFT, TOPBOTTOM, BOTTOMTOP };
enum { LEFTJUSTIFY = 1, RIGHTJUSTIFY, CENTERJUSTIFY };
/// obsolete

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: Window.cc,v 1.144 2003/04/20 02:47:14 rathnor Exp $
// $Id: Window.cc,v 1.145 2003/04/25 09:07:09 rathnor Exp $
#include "Window.hh"
@ -409,9 +409,6 @@ void FluxboxWindow::init() {
upsize();
m_frame.move(wattrib.x, wattrib.y);
m_frame.resizeForClient(wattrib.width, wattrib.height);
bool place_window = true;
if (fluxbox->isStartup() || transient ||
m_client->normal_hint_flags & (PPosition|USPosition)) {
@ -444,15 +441,19 @@ void FluxboxWindow::init() {
restoreAttributes();
m_frame.move(wattrib.x, wattrib.y);
m_frame.resizeForClient(wattrib.width, wattrib.height);
// if we're a transient then we should be on the same layer as our parent
if (isTransient())
getLayerItem().setLayer(getTransientFor()->getLayerItem().getLayer());
else // if no parent then set default layer
moveToLayer(m_layernum);
screen.getWorkspace(workspace_number)->addWindow(*this, place_window);
if (!place_window)
moveResize(m_frame.x(), m_frame.y(), m_frame.width(), m_frame.height());
moveResize(m_frame.x(), m_frame.y(), m_frame.width(), m_frame.height());
screen.getWorkspace(workspace_number)->addWindow(*this, place_window);
if (shaded) { // start shaded
shaded = false;
@ -471,7 +472,6 @@ void FluxboxWindow::init() {
}
setState(current_state);
m_frame.resizeForClient(wattrib.width, wattrib.height);
m_frame.reconfigure();
sendConfigureNotify();
// no focus default

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: Workspace.cc,v 1.53 2003/04/16 14:43:06 rathnor Exp $
// $Id: Workspace.cc,v 1.54 2003/04/25 09:07:13 rathnor Exp $
#include "Workspace.hh"
@ -528,13 +528,53 @@ void Workspace::placeWindow(FluxboxWindow &win) {
if (screen.getRowPlacementDirection() == BScreen::RIGHTLEFT)
change_x = -1;
int win_w = win.getWidth() + screen.getBorderWidth2x(),
win_h = win.getHeight() + screen.getBorderWidth2x();
int test_x, test_y, curr_x, curr_y, curr_w, curr_h;
switch (screen.getPlacementPolicy()) {
case BScreen::UNDERMOUSEPLACEMENT: {
int root_x, root_y, min_y, min_x, max_y, max_x, ignore_i;
unsigned int ignore_ui;
Window ignore_w;
XQueryPointer(screen.getBaseDisplay()->getXDisplay(),
screen.getRootWindow(), &ignore_w, &ignore_w, &root_x, &root_y,
&ignore_i, &ignore_i, &ignore_ui);
test_x = root_x - (win_w / 2);
test_y = root_y - (win_h / 2);
min_x = (int) screen.getMaxLeft();
min_y = (int) screen.getMaxTop();
max_x = (int) screen.getMaxRight() - win_w;
max_y = (int) screen.getMaxBottom() - win_h;
// keep the window inside the screen
if (test_x < min_x)
test_x = min_x;
if (test_x > max_x)
test_x = max_x;
if (test_y < min_y)
test_y = min_y;
if (test_y > max_y)
test_y = max_y;
place_x = test_x;
place_y = test_y;
placed = true;
break;
} // end case UNDERMOUSEPLACEMENT
case BScreen::ROWSMARTPLACEMENT: {
test_y = 0;

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: fluxbox.cc,v 1.115 2003/04/20 12:21:35 rathnor Exp $
// $Id: fluxbox.cc,v 1.116 2003/04/25 09:07:14 rathnor Exp $
#include "fluxbox.hh"
@ -1776,6 +1776,10 @@ void Fluxbox::save_rc() {
placement = "ColSmartPlacement";
break;
case BScreen::UNDERMOUSEPLACEMENT:
placement = "UnderMousePlacement";
break;
default:
case BScreen::ROWSMARTPLACEMENT:
placement = "RowSmartPlacement";
@ -2021,6 +2025,8 @@ void Fluxbox::load_rc(BScreen &screen) {
screen.savePlacementPolicy(BScreen::ROWSMARTPLACEMENT);
else if (! strncasecmp(value.addr, "ColSmartPlacement", value.size))
screen.savePlacementPolicy(BScreen::COLSMARTPLACEMENT);
else if (! strncasecmp(value.addr, "UnderMousePlacement", value.size))
screen.savePlacementPolicy(BScreen::UNDERMOUSEPLACEMENT);
else
screen.savePlacementPolicy(BScreen::CASCADEPLACEMENT);
} else