Because Netscape insists on opening on the left hand side of the
screen, I decided to write a patch that would allow the auto-placement
settings to work from right-to-left or from left-to-right.  The patch
adds an option to the config menu that will allow you to choose which of
these two options you would like. 
    The only actual changes to the run-time code, not including the menu
options, were two if statments and a conditional.  So this should not
really make any difference in performance.  Try it out if you get a
chance and tell me how things go. 

-- 
Ryan Patrick Harris (maXter) 
[EMAIL PROTECTED]
http://www-personal.engin.umich.edu/~rpharris 
University of Michigan EECS
diff -urN blackbox-0.60.0.orig/src/Configmenu.cc blackbox-0.60.0.new/src/Configmenu.cc
--- blackbox-0.60.0.orig/src/Configmenu.cc      Sun Mar 19 17:21:51 2000
+++ blackbox-0.60.0.new/src/Configmenu.cc       Wed Apr 26 23:14:31 2000
@@ -85,17 +85,17 @@
       switch(item->function()) {
       case 1: { // dither
         Bool change = ((screen->getImageControl()->doDither()) ?  False : True);
-       screen->getImageControl()->setDither(change);
+        screen->getImageControl()->setDither(change);
          
-       setItemSelected(index, screen->getImageControl()->doDither());
+        setItemSelected(index, screen->getImageControl()->doDither());
 
         break; }
 
       case 2: { // opaque move
         Bool change = (! screen->doOpaqueMove());
-       screen->saveOpaqueMove(change);
+        screen->saveOpaqueMove(change);
          
-       setItemSelected(index, screen->doOpaqueMove());
+        setItemSelected(index, screen->doOpaqueMove());
 
         break; }
 
@@ -215,9 +215,21 @@
   insert("Smart Placement (Rows)", BScreen::RowSmartPlacement);
   insert("Smart Placement (Columns)", BScreen::ColSmartPlacement);
   insert("Cascade Placement", BScreen::CascadePlacement);
+  insert("Left To Right", BScreen::PlacementRight);
+  insert("Right To Left", BScreen::PlacementLeft);
 
   update();
 
+  switch (configmenu->screen->getPlacementDirection()) {
+    case BScreen::PlacementRight:
+      setItemSelected(3, True);
+      break;
+
+    case BScreen::PlacementLeft:
+      setItemSelected(4, True);
+      break;
+  }
+
   switch (configmenu->screen->getPlacementPolicy()) {
   case BScreen::RowSmartPlacement:
     setItemSelected(0, True);
@@ -229,8 +241,12 @@
 
   case BScreen::CascadePlacement:
     setItemSelected(2, True);
+    setItemEnabled(3, False);
+    setItemSelected(3, False);
+    setItemEnabled(4, False);
+    setItemSelected(4, False); 
     break;
-  }
+  } 
 }
 
 
@@ -248,32 +264,38 @@
     if (item->function()) {
       switch (item->function()) {
       case BScreen::RowSmartPlacement:
-       configmenu->screen->savePlacementPolicy(item->function());
-
-       setItemSelected(0, True);
-       setItemSelected(1, False);
-        setItemSelected(2, False);
-       
-       break;
-
-      case BScreen::ColSmartPlacement:
+      case BScreen::ColSmartPlacement: 
         configmenu->screen->savePlacementPolicy(item->function());
-
-        setItemSelected(0, False);
-        setItemSelected(1, True);
-        setItemSelected(2, False);
-
         break;
-       
-      case  BScreen::CascadePlacement:
-       configmenu->screen->savePlacementPolicy(item->function());
 
-       setItemSelected(0, False);
-        setItemSelected(1, False);
-       setItemSelected(2, True);
+      case BScreen::CascadePlacement:
+        configmenu->screen->savePlacementPolicy(item->function());
+        break;
 
-       break;
+      case BScreen::PlacementRight: 
+      case BScreen::PlacementLeft:
+        configmenu->screen->savePlacementDirection(item->function());
+        break;
       }
     }
   }
+    setItemSelected(0, (configmenu->screen->getPlacementPolicy() == 
+          BScreen::RowSmartPlacement));
+    setItemSelected(1, (configmenu->screen->getPlacementPolicy() == 
+          BScreen::ColSmartPlacement));
+    setItemSelected(2, (configmenu->screen->getPlacementPolicy() == 
+          BScreen::CascadePlacement));
+    setItemEnabled(3, (configmenu->screen->getPlacementPolicy() != 
+          BScreen::CascadePlacement)); 
+    setItemSelected(3, (configmenu->screen->getPlacementDirection() == 
+          BScreen::PlacementRight) && 
+        (configmenu->screen->getPlacementPolicy() != 
+         BScreen::CascadePlacement));
+    setItemEnabled(4, (configmenu->screen->getPlacementPolicy() != 
+          BScreen::CascadePlacement)); 
+    setItemSelected(4, (configmenu->screen->getPlacementDirection() == 
+          BScreen::PlacementLeft) && 
+        (configmenu->screen->getPlacementPolicy() != 
+         BScreen::CascadePlacement)); 
+  
 }
diff -urN blackbox-0.60.0.orig/src/Screen.hh blackbox-0.60.0.new/src/Screen.hh
--- blackbox-0.60.0.orig/src/Screen.hh  Sun Mar 19 17:17:31 2000
+++ blackbox-0.60.0.new/src/Screen.hh   Wed Apr 26 20:59:18 2000
@@ -119,7 +119,8 @@
     MenuStyle mstyle;
 
     Bool toolbar_on_top, sloppy_focus, auto_raise, auto_edge_balance,
-      image_dither, ordered_dither, opaque_move, full_max, focus_new;
+      image_dither, ordered_dither, opaque_move, full_max, focus_new,
+      placement_direction;
     BColor border_color;
     XrmDatabase stylerc;
     
@@ -219,6 +220,8 @@
     { return resource.toolbar_width_percent; }
   inline const int &getPlacementPolicy(void) const
     { return resource.placement_policy; }
+  inline const int &getPlacementDirection(void) const
+    { return resource.placement_direction; }
   inline const int &getEdgeSnapThreshold(void) const
     { return resource.edge_snap_threshold; }
 
@@ -231,6 +234,7 @@
     { resource.toolbar_width_percent = w; }
   inline void saveToolbarPlacement(int p) { resource.toolbar_placement = p; }
   inline void savePlacementPolicy(int p) { resource.placement_policy = p; }
+  inline void savePlacementDirection(int d) { resource.placement_direction = d;}
   inline void saveEdgeSnapThreshold(int t)
     { resource.edge_snap_threshold = t; }
   inline void saveImageDither(Bool d) { resource.image_dither = d; }
@@ -284,7 +288,9 @@
   void updateNetizenWindowRaise(Window);
   void updateNetizenWindowLower(Window);
 
-  enum { RowSmartPlacement = 1, ColSmartPlacement, CascadePlacement };
+  enum { RowSmartPlacement = 1, ColSmartPlacement, CascadePlacement,
+    PlacementRight, PlacementLeft };
+  
   enum { LeftJustify = 1, RightJustify, CenterJustify };
   enum { RoundBullet = 1, TriangleBullet, SquareBullet, NoBullet };
   enum { Restart = 1, RestartOther, Exit, Shutdown, Execute, Reconfigure,
diff -urN blackbox-0.60.0.orig/src/Workspace.cc blackbox-0.60.0.new/src/Workspace.cc
--- blackbox-0.60.0.orig/src/Workspace.cc       Sun Mar 19 20:11:07 2000
+++ blackbox-0.60.0.new/src/Workspace.cc        Wed Apr 26 21:31:25 2000
@@ -366,13 +366,18 @@
 
   switch (screen->getPlacementPolicy()) {
   case BScreen::RowSmartPlacement: {
-    test_x = test_y = screen->getBorderWidth() +
-      screen->getEdgeSnapThreshold();
+    test_y = screen->getBorderWidth() + screen->getEdgeSnapThreshold();
 
     while (test_y + win_h < (signed) screen->getHeight() && ! placed) {
-      test_x = screen->getBorderWidth() + screen->getEdgeSnapThreshold();
-
-      while (test_x + win_w < (signed) screen->getWidth() && ! placed) {
+      if(screen->getPlacementDirection() == BScreen::PlacementRight)
+          test_x = screen->getBorderWidth() + screen->getEdgeSnapThreshold();
+      else  
+          test_x = screen->getWidth() - screen->getEdgeSnapThreshold() - 
+          screen->getBorderWidth2x() - screen->getBorderWidth2x() - win_w; 
+
+      while ((screen->getPlacementDirection() == BScreen::PlacementRight ? 
+                test_x + win_w < (signed) screen->getWidth() : 
+                test_x > 0) && ! placed) {
         placed = True;
 
         it.reset();
@@ -414,7 +419,9 @@
           break;
         }
 
-        test_x += 2;
+        if(screen->getPlacementDirection() == BScreen::PlacementRight) 
+          test_x += 2;
+        else test_x -= 2;
       }
 
       test_y += 2;
@@ -423,10 +430,15 @@
     break; }
 
   case BScreen::ColSmartPlacement: {
-    test_x = test_y = screen->getBorderWidth() +
-      screen->getEdgeSnapThreshold();
+    if( screen->getPlacementDirection() == BScreen::PlacementRight)
+      test_x = screen->getBorderWidth() +
+        screen->getEdgeSnapThreshold();
+    else 
+      test_x = screen->getWidth() - screen->getEdgeSnapThreshold() -
+        screen->getBorderWidth2x() - screen->getBorderWidth2x() - win_w; 
 
-    while (test_x + win_w < (signed) screen->getWidth() && ! placed) {
+    while ((screen->getPlacementDirection() == BScreen::PlacementRight ? 
+       test_x + win_w < (signed) screen->getWidth() : test_x > 0) && ! placed) {
       test_y = screen->getBorderWidth() + screen->getEdgeSnapThreshold();
 
       while (test_y + win_h < (signed) screen->getHeight() && ! placed) {
@@ -472,9 +484,11 @@
        }
 
        test_y += 2;
-     }
+      }
 
-     test_x += 2;
+      if(screen->getPlacementDirection() == BScreen::PlacementRight) 
+        test_x += 2;
+      else test_x -= 2; 
    }
 
    break; }
diff -urN blackbox-0.60.0.orig/src/blackbox.cc blackbox-0.60.0.new/src/blackbox.cc
--- blackbox-0.60.0.orig/src/blackbox.cc        Thu Mar 30 18:36:37 2000
+++ blackbox-0.60.0.new/src/blackbox.cc Wed Apr 26 17:17:27 2000
@@ -1095,6 +1095,22 @@
            placement);
     XrmPutLineResource(&new_blackboxrc, rc_string);
 
+    char *direction = (char *) 0;
+    switch (screen->getPlacementDirection()) {
+
+    case BScreen::PlacementRight:
+      direction = "PlacementRight";
+      break;
+
+    default:
+    case BScreen::PlacementLeft:
+      direction = "PlacementLeft";
+      break;
+    }
+    sprintf(rc_string, "session.screen%d.placementDirection:  %s", 
+    screen_number , direction);
+    XrmPutLineResource(&new_blackboxrc, rc_string);
+
     sprintf(rc_string, "session.screen%d.focusModel:  %s", screen_number,
            ((screen->isSloppyFocus()) ?
             ((screen->doAutoRaise()) ? "AutoRaiseSloppyFocus" :
@@ -1521,6 +1537,17 @@
       screen->savePlacementPolicy(BScreen::CascadePlacement);
   else
     screen->savePlacementPolicy(BScreen::RowSmartPlacement);
+
+  sprintf(name_lookup,  "session.screen%d.placementDirection", screen_number);
+  sprintf(class_lookup, "Session.Screen%d.placementDirection", screen_number);
+  if (XrmGetResource(database, name_lookup, class_lookup, &value_type,
+                    &value))
+    if (! strncasecmp(value.addr, "PlacementRight", value.size))
+      screen->savePlacementDirection(BScreen::PlacementRight);
+    else
+      screen->savePlacementDirection(BScreen::PlacementLeft);
+  else
+    screen->savePlacementDirection(BScreen::PlacementLeft);
 
 #ifdef    SLIT
   sprintf(name_lookup, "session.screen%d.slit.placement", screen_number);

Reply via email to