Sorry, forgot to include the code to save/restore the edge placement
stuff in the config files. Updated patch, which replaces earlier patch,
attached.
--
Patrick Bogen
Senior Network Analyst
Networking and Information Systems
Texas A&M University
***
This email has been stamped using Penny Post. Stamping email helps
combat spam.
Find out more about stamping your email at: http://pennypost.sourceforge.net
diff -Nru a/BlackboxResource.cc b/BlackboxResource.cc
--- a/BlackboxResource.cc 2008-05-08 10:46:25.000000000 -0500
+++ b/BlackboxResource.cc 2008-05-08 12:07:03.000000000 -0500
@@ -144,9 +144,34 @@
window_placement_policy = CenterPlacement;
else if (strcasecmp(str.c_str(), "CascadePlacement") == 0)
window_placement_policy = CascadePlacement;
+ else if (strcasecmp(str.c_str(), "EdgePlacement") == 0)
+ window_placement_policy = EdgePlacement;
else
window_placement_policy = RowSmartPlacement;
+ str = res.read("session.placementEdge",
+ "Session.PlacementEdge",
+ res.read( "session.screen0.placementEdge",
+ "Session.Screen0.PlacementEdge",
+ "TopLeft" ) );
+
+ if( strcasecmp( str.c_str(), "Top" ) == 0 )
+ placement_edge = Top;
+ else if( strcasecmp( str.c_str(), "TopRight" ) == 0 )
+ placement_edge = TopRight;
+ else if( strcasecmp( str.c_str(), "Right" ) == 0 )
+ placement_edge = Right;
+ else if( strcasecmp( str.c_str(), "BottomRight" ) == 0 )
+ placement_edge = BottomRight;
+ else if( strcasecmp( str.c_str(), "Bottom" ) == 0 )
+ placement_edge = Bottom;
+ else if( strcasecmp( str.c_str(), "BottomLeft" ) == 0 )
+ placement_edge = BottomLeft;
+ else if( strcasecmp( str.c_str(), "Left" ) == 0 )
+ placement_edge = Left;
+ else
+ placement_edge = TopLeft;
+
str = res.read("session.rowPlacementDirection",
"Session.RowPlacementDirection",
res.read("session.screen0.rowPlacementDirection",
@@ -288,12 +313,42 @@
case ColSmartPlacement:
str = "ColSmartPlacement";
break;
+ case EdgePlacement:
+ str = "EdgePlacement";
+ break;
case RowSmartPlacement:
default:
str = "RowSmartPlacement";
break;
}
res.write("session.windowPlacement", str);
+ switch( placement_edge ) {
+ case TopLeft:
+ str = "TopLeft";
+ break;
+ case Top:
+ str = "Top";
+ break;
+ case TopRight:
+ str = "TopRight";
+ break;
+ case Right:
+ str = "Right";
+ break;
+ case BottomRight:
+ str = "BottomRight";
+ break;
+ case Bottom:
+ str = "Bottom";
+ break;
+ case BottomLeft:
+ str = "BottomLeft";
+ break;
+ case Left:
+ str = "Left";
+ break;
+ }
+ res.write("session.placementEdge", str );
res.write("session.rowPlacementDirection",
(row_direction == LeftRight)
? "LeftToRight"
diff -Nru a/BlackboxResource.hh b/BlackboxResource.hh
--- a/BlackboxResource.hh 2005-10-18 02:34:46.000000000 -0500
+++ b/BlackboxResource.hh 2008-05-08 12:07:03.000000000 -0500
@@ -42,10 +42,19 @@
ColSmartPlacement,
CenterPlacement,
CascadePlacement,
+ EdgePlacement,
LeftRight,
RightLeft,
TopBottom,
- BottomTop
+ BottomTop,
+ TopLeft,
+ Top,
+ TopRight,
+ Right,
+ BottomRight,
+ Bottom,
+ BottomLeft,
+ Left
};
struct Cursors {
@@ -69,7 +78,7 @@
FocusModel focus_model;
int window_placement_policy;
- int row_direction, col_direction;
+ int row_direction, col_direction, placement_edge;
bool ignore_shaded;
bool auto_raise;
bool click_raise;
@@ -135,6 +144,11 @@
inline void setWindowPlacementPolicy(int p)
{ window_placement_policy = p; }
+ inline int placementEdge(void) const
+ { return placement_edge; }
+ inline void setPlacementEdge(int e)
+ { placement_edge = e; }
+
inline int rowPlacementDirection(void) const
{ return row_direction; }
inline void setRowPlacementDirection(int d)
diff -Nru a/Configmenu.cc b/Configmenu.cc
--- a/Configmenu.cc 2005-10-18 02:34:46.000000000 -0500
+++ b/Configmenu.cc 2008-05-08 12:07:03.000000000 -0500
@@ -271,6 +271,7 @@
insertItem(bt::toUnicode("Smart Placement (Columns)"), ColSmartPlacement);
insertItem(bt::toUnicode("Center Placement"), CenterPlacement);
insertItem(bt::toUnicode("Cascade Placement"), CascadePlacement);
+ insertItem(bt::toUnicode("Edge Placement"), EdgePlacement);
insertSeparator();
@@ -280,6 +281,17 @@
insertItem(bt::toUnicode("Bottom to Top"), BottomTop);
insertSeparator();
+
+ insertItem(bt::toUnicode("Top Left"), TopLeft);
+ insertItem(bt::toUnicode("Top"), Top);
+ insertItem(bt::toUnicode("Top Right"), TopRight);
+ insertItem(bt::toUnicode("Right"), Right);
+ insertItem(bt::toUnicode("Bottom Right"), BottomRight);
+ insertItem(bt::toUnicode("Bottom"), Bottom);
+ insertItem(bt::toUnicode("Bottom Left"), BottomLeft);
+ insertItem(bt::toUnicode("Left"), Left);
+
+ insertSeparator();
insertItem(bt::toUnicode("Ignore Shaded Windows"), IgnoreShadedWindows);
}
@@ -291,6 +303,7 @@
colsmart = res.windowPlacementPolicy() == ColSmartPlacement,
center = res.windowPlacementPolicy() == CenterPlacement,
cascade = res.windowPlacementPolicy() == CascadePlacement,
+ edge = res.windowPlacementPolicy() == EdgePlacement,
rl = res.rowPlacementDirection() == LeftRight,
tb = res.colPlacementDirection() == TopBottom;
@@ -298,18 +311,43 @@
setItemChecked(ColSmartPlacement, colsmart);
setItemChecked(CenterPlacement, center);
setItemChecked(CascadePlacement, cascade);
+ setItemChecked(EdgePlacement, edge);
+
+ setItemEnabled(LeftRight, rowsmart || colsmart);
+ setItemChecked(LeftRight, (rowsmart || colsmart) && (cascade || rl));
+
+ setItemEnabled(RightLeft, rowsmart || colsmart);
+ setItemChecked(RightLeft, (rowsmart || colsmart) && (!cascade && !rl));
+
+ setItemEnabled(TopBottom, rowsmart || colsmart);
+ setItemChecked(TopBottom, (rowsmart || colsmart) && (cascade || tb));
+
+ setItemEnabled(BottomTop, rowsmart || colsmart);
+ setItemChecked(BottomTop, (rowsmart || colsmart) && (!cascade && !tb));
- setItemEnabled(LeftRight, !center && !cascade);
- setItemChecked(LeftRight, !center && (cascade || rl));
+ setItemEnabled(TopLeft, edge);
+ setItemChecked(TopLeft, edge && res.placementEdge() == TopLeft );
- setItemEnabled(RightLeft, !center && !cascade);
- setItemChecked(RightLeft, !center && (!cascade && !rl));
+ setItemEnabled(Top, edge);
+ setItemChecked(Top, edge && res.placementEdge() == Top );
- setItemEnabled(TopBottom, !center && !cascade);
- setItemChecked(TopBottom, !center && (cascade || tb));
+ setItemEnabled(TopRight, edge);
+ setItemChecked(TopRight, edge && res.placementEdge() == TopRight );
- setItemEnabled(BottomTop, !center && !cascade);
- setItemChecked(BottomTop, !center && (!cascade && !tb));
+ setItemEnabled(Right, edge);
+ setItemChecked(Right, edge && res.placementEdge() == Right );
+
+ setItemEnabled(BottomRight, edge);
+ setItemChecked(BottomRight, edge && res.placementEdge() == BottomRight );
+
+ setItemEnabled(Bottom, edge);
+ setItemChecked(Bottom, edge && res.placementEdge() == Bottom );
+
+ setItemEnabled(BottomLeft, edge);
+ setItemChecked(BottomLeft, edge && res.placementEdge() == BottomLeft );
+
+ setItemEnabled(Left, edge);
+ setItemChecked(Left, edge && res.placementEdge() == Left );
setItemEnabled(IgnoreShadedWindows, !center);
setItemChecked(IgnoreShadedWindows, !center && res.placementIgnoresShaded());
@@ -323,6 +361,7 @@
case ColSmartPlacement:
case CenterPlacement:
case CascadePlacement:
+ case EdgePlacement:
res.setWindowPlacementPolicy(id);
break;
@@ -340,6 +379,17 @@
res.setPlacementIgnoresShaded(! res.placementIgnoresShaded());
break;
+ case TopLeft:
+ case Top:
+ case TopRight:
+ case Right:
+ case BottomRight:
+ case Bottom:
+ case BottomLeft:
+ case Left:
+ res.setPlacementEdge(id);
+ break;
+
default:
return;
} // switch
diff -Nru a/Screen.cc b/Screen.cc
--- a/Screen.cc 2008-05-08 10:46:25.000000000 -0500
+++ b/Screen.cc 2008-05-08 12:07:03.000000000 -0500
@@ -2072,6 +2072,9 @@
case CenterPlacement:
placed = centerPlacement(r, usableArea);
break;
+ case EdgePlacement:
+ placed = edgePlacement(r, usableArea);
+ break;
default:
break; // handled below
} // switch
@@ -2125,6 +2128,37 @@
return true;
}
+bool BScreen::edgePlacement(bt::Rect &rect, const bt::Rect &avail)
+{
+ const BlackboxResource &res = _blackbox->resource();
+ switch( res.placementEdge() ) {
+ case TopLeft:
+ rect.setPos( avail.x(), avail.y() );
+ break;
+ case Top:
+ rect.setPos( avail.x()+(avail.width()-rect.width())/2, avail.y() );
+ break;
+ case TopRight:
+ rect.setPos( avail.x()+(avail.width()-rect.width()), avail.y() );
+ break;
+ case Right:
+ rect.setPos( avail.x()+(avail.width()-rect.width()), avail.y()+(avail.height()-rect.height())/2 );
+ break;
+ case BottomRight:
+ rect.setPos( avail.x()+(avail.width()-rect.width()), avail.y()+(avail.height()-rect.height()) );
+ break;
+ case Bottom:
+ rect.setPos( avail.x()+(avail.width()-rect.width())/2, avail.y()+(avail.height()-rect.height()) );
+ break;
+ case BottomLeft:
+ rect.setPos( avail.x(), avail.y()+(avail.height()-rect.height()) );
+ break;
+ case Left:
+ rect.setPos( avail.x(), avail.y()+(avail.height()-rect.height())/2 );
+ break;
+ }
+ return true;
+}
bool BScreen::smartPlacement(unsigned int workspace, bt::Rect& rect,
const bt::Rect& avail) {
diff -Nru a/Screen.hh b/Screen.hh
--- a/Screen.hh 2005-10-18 02:34:46.000000000 -0500
+++ b/Screen.hh 2008-05-08 12:07:03.000000000 -0500
@@ -105,6 +105,7 @@
void placeWindow(BlackboxWindow *win);
bool cascadePlacement(bt::Rect& win, const bt::Rect& avail);
bool centerPlacement(bt::Rect &win, const bt::Rect &avail);
+ bool edgePlacement(bt::Rect &win, const bt::Rect &avail);
bool smartPlacement(unsigned int workspace, bt::Rect& win,
const bt::Rect& avail);
unsigned int cascade_x, cascade_y;
diff -Nru a/Toolbarmenu.cc b/Toolbarmenu.cc
--- a/Toolbarmenu.cc 2005-01-04 06:58:34.000000000 -0600
+++ b/Toolbarmenu.cc 2008-05-08 12:07:03.000000000 -0500
@@ -42,10 +42,22 @@
BScreen *_bscreen;
};
+class ToolbarWidthmenu : public bt::Menu {
+public:
+ ToolbarWidthmenu( bt::Application &app, unsigned int screen, BScreen *bscreen );
+ void refresh(void);
+
+protected:
+ void itemClicked( unsigned int id, unsigned int button );
+private:
+ BScreen *_bscreen;
+};
+
enum {
EnableToolbar,
Placement,
+ Width,
AlwaysOnTop,
AutoHide
};
@@ -59,9 +71,12 @@
showTitle();
ToolbarPlacementmenu *menu = new ToolbarPlacementmenu(app, screen, bscreen);
+ ToolbarWidthmenu *widthMenu = new ToolbarWidthmenu(app, screen, bscreen);
+
insertItem(bt::toUnicode("Enable Toolbar"), EnableToolbar);
insertSeparator();
insertItem(bt::toUnicode("Placement"), menu, Placement);
+ insertItem(bt::toUnicode("Width"), widthMenu, Width );
insertItem(bt::toUnicode("Always on top"), AlwaysOnTop);
insertItem(bt::toUnicode("Auto Hide"), AutoHide);
}
@@ -118,6 +133,43 @@
}
+ToolbarWidthmenu::ToolbarWidthmenu(bt::Application &app, unsigned int screen, BScreen *bscreen)
+ : bt::Menu( app, screen ), _bscreen( bscreen )
+{
+ setTitle(bt::toUnicode("Toolbar Width"));
+ showTitle();
+ insertItem(bt::toUnicode("100%"), 100);
+ insertItem(bt::toUnicode("75%"), 75);
+ insertItem(bt::toUnicode("66%"), 66);
+ insertItem(bt::toUnicode("50%"), 50);
+ insertItem(bt::toUnicode("33%"), 33);
+ insertItem(bt::toUnicode("25%"), 25);
+}
+
+void ToolbarWidthmenu::refresh(void) {
+ const ToolbarOptions &options = _bscreen->resource().toolbarOptions();
+ setItemChecked( 100, options.width_percent == 100 );
+ setItemChecked( 75, options.width_percent == 75 );
+ setItemChecked( 66, options.width_percent == 66 );
+ setItemChecked( 50, options.width_percent == 50 );
+ setItemChecked( 33, options.width_percent == 33 );
+ setItemChecked( 25, options.width_percent == 25 );
+}
+
+void ToolbarWidthmenu::itemClicked( unsigned int id, unsigned int button ) {
+ if( button != 1 )
+ return;
+
+ Toolbar *toolbar = _bscreen->toolbar();
+ ToolbarOptions &options =
+ const_cast<ToolbarOptions &>(_bscreen->resource().toolbarOptions());
+
+ options.width_percent = id;
+ if (toolbar)
+ toolbar->reconfigure();
+ _bscreen->saveResource();
+}
+
ToolbarPlacementmenu::ToolbarPlacementmenu(bt::Application &app,
unsigned int screen,
BScreen *bscreen)
@@ -133,6 +185,7 @@
insertItem(bt::toUnicode("Bottom Left"), Toolbar::BottomLeft);
insertItem(bt::toUnicode("Bottom Center"), Toolbar::BottomCenter);
insertItem(bt::toUnicode("Bottom Right"), Toolbar::BottomRight);
+ insertSeparator();
}
diff -Nru a/Window.cc b/Window.cc
--- a/Window.cc 2005-10-18 03:01:41.000000000 -0500
+++ b/Window.cc 2008-05-08 12:07:03.000000000 -0500
@@ -234,10 +234,10 @@
* 'rect' refers to the geometry of the frame in pixels.
*/
enum Corner {
- TopLeft,
- TopRight,
- BottomLeft,
- BottomRight
+ TopLeftCorner,
+ TopRightCorner,
+ BottomLeftCorner,
+ BottomRightCorner
};
static bt::Rect constrain(const bt::Rect &rect,
const bt::EWMH::Strut &margin,
@@ -337,19 +337,19 @@
int dy = rect.bottom() - r.bottom();
switch (corner) {
- case TopLeft:
+ case TopLeftCorner:
// nothing to do
break;
- case TopRight:
+ case TopRightCorner:
r.setPos(r.x() + dx, r.y());
break;
- case BottomLeft:
+ case BottomLeftCorner:
r.setPos(r.x(), r.y() + dy);
break;
- case BottomRight:
+ case BottomRightCorner:
r.setPos(r.x() + dx, r.y() + dy);
break;
}
@@ -2360,7 +2360,7 @@
bt::Rect r = ::applyGravity(client.premax,
frame.margin,
client.wmnormal.win_gravity);
- r = ::constrain(r, frame.margin, client.wmnormal, TopLeft);
+ r = ::constrain(r, frame.margin, client.wmnormal, TopLeftCorner);
// trick configure into working
frame.rect = bt::Rect();
configure(r);
@@ -2413,7 +2413,7 @@
frame.margin,
client.wmnormal.win_gravity);
- r = ::constrain(r, frame.margin, client.wmnormal, TopLeft);
+ r = ::constrain(r, frame.margin, client.wmnormal, TopLeftCorner);
// trick configure into working
frame.rect = bt::Rect();
configure(r);
@@ -2442,7 +2442,7 @@
r.setHeight(frame.rect.height());
}
- frame.rect = ::constrain(r, frame.margin, client.wmnormal, TopLeft);
+ frame.rect = ::constrain(r, frame.margin, client.wmnormal, TopLeftCorner);
positionWindows();
decorate();
@@ -2569,7 +2569,7 @@
bt::Rect r = ::applyGravity(client.premax,
frame.margin,
client.wmnormal.win_gravity);
- r = ::constrain(r, frame.margin, client.wmnormal, TopLeft);
+ r = ::constrain(r, frame.margin, client.wmnormal, TopLeftCorner);
// trick configure into working
frame.rect = bt::Rect();
@@ -3870,32 +3870,32 @@
void BlackboxWindow::startResize(Window window) {
if (frame.grab_x < (signed) frame.rect.width() / 2) {
if (frame.grab_y < (signed) frame.rect.height() / 2)
- frame.corner = BottomRight;
+ frame.corner = BottomRightCorner;
else
- frame.corner = TopRight;
+ frame.corner = TopRightCorner;
} else {
if (frame.grab_y < (signed) frame.rect.height() / 2)
- frame.corner = BottomLeft;
+ frame.corner = BottomLeftCorner;
else
- frame.corner = TopLeft;
+ frame.corner = TopLeftCorner;
}
Cursor cursor = None;
switch (frame.corner) {
- case TopLeft:
+ case TopLeftCorner:
cursor = blackbox->resource().cursors().resize_bottom_right;
frame.grab_x = frame.rect.width() - frame.grab_x;
frame.grab_y = frame.rect.height() - frame.grab_y;
break;
- case BottomLeft:
+ case BottomLeftCorner:
cursor = blackbox->resource().cursors().resize_top_right;
frame.grab_x = frame.rect.width() - frame.grab_x;
break;
- case TopRight:
+ case TopRightCorner:
cursor = blackbox->resource().cursors().resize_bottom_left;
frame.grab_y = frame.rect.height() - frame.grab_y;
break;
- case BottomRight:
+ case BottomRightCorner:
cursor = blackbox->resource().cursors().resize_top_left;
break;
}
@@ -3941,8 +3941,8 @@
const bt::Rect curr = frame.changing;
switch (frame.corner) {
- case TopLeft:
- case BottomLeft:
+ case TopLeftCorner:
+ case BottomLeftCorner:
frame.changing.setCoords(frame.changing.left(),
frame.changing.top(),
std::max<signed>(x_root + frame.grab_x,
@@ -3951,8 +3951,8 @@
+ frame.margin.right + 1)),
frame.changing.bottom());
break;
- case TopRight:
- case BottomRight:
+ case TopRightCorner:
+ case BottomRightCorner:
frame.changing.setCoords(std::min<signed>(x_root - frame.grab_x,
frame.changing.right()
- (frame.margin.left
@@ -3964,8 +3964,8 @@
}
switch (frame.corner) {
- case TopLeft:
- case TopRight:
+ case TopLeftCorner:
+ case TopRightCorner:
frame.changing.setCoords(frame.changing.left(),
frame.changing.top(),
frame.changing.right(),
@@ -3974,8 +3974,8 @@
+ (frame.margin.top
+ frame.margin.bottom + 1)));
break;
- case BottomLeft:
- case BottomRight:
+ case BottomLeftCorner:
+ case BottomRightCorner:
frame.changing.setCoords(frame.changing.left(),
std::min<signed>(y_root - frame.grab_y,
frame.rect.bottom()