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()

Reply via email to