[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

gEDA-cvs: gaf.git: branch: master updated (1.7.1-20110619-175-gbdb529e)



The branch, master has been updated
       via  bdb529ee1c070c0119cafbd143e067d2aea99457 (commit)
       via  7b4bd14b22cb890cfc156ef83678fef44e41afad (commit)
       via  a909848f6efd539c10348f23f1b01ae35882a956 (commit)
       via  50365b0d5da45201a834574441cdc02f0181db2a (commit)
      from  6633fa2583170a30032d57962d64a6e56a3fe324 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


=========
 Summary
=========

 gattrib/po/ChangeLog => gschem/FIXME |    0 
 gschem/include/gschem_struct.h       |    5 ++-
 gschem/include/prototype.h           |    9 ++--
 gschem/src/i_basic.c                 |    4 +-
 gschem/src/o_bus.c                   |   18 +------
 gschem/src/o_move.c                  |   99 +++++++++++++++++++++++----------
 gschem/src/o_net.c                   |   18 +------
 gschem/src/s_stretch.c               |   38 +++++++++++--
 8 files changed, 118 insertions(+), 73 deletions(-)
 copy gattrib/po/ChangeLog => gschem/FIXME (100%)


=================
 Commit Messages
=================

commit bdb529ee1c070c0119cafbd143e067d2aea99457
Author: Peter Clifton <pcjc2@xxxxxxxxx>
Commit: Peter Clifton <pcjc2@xxxxxxxxx>

    gschem: Play with move net-rubberbanding heuristics a little

:100644 100644 6016686... d744a5c... M	gschem/src/o_move.c

commit 7b4bd14b22cb890cfc156ef83678fef44e41afad
Author: Peter Clifton <pcjc2@xxxxxxxxx>
Commit: Peter Clifton <pcjc2@xxxxxxxxx>

    gschem: Add more abstract API for rubberbanding nets

:100644 100644 5f241e0... 7a92209... M	gschem/include/gschem_struct.h
:100644 100644 463c709... 7122893... M	gschem/include/prototype.h
:100644 100644 666669e... 9bfeba7... M	gschem/src/o_bus.c
:100644 100644 00865ed... 6016686... M	gschem/src/o_move.c
:100644 100644 d4b1b27... 20aba7d... M	gschem/src/o_net.c
:100644 100644 4bbf39e... 9d4a384... M	gschem/src/s_stretch.c

commit a909848f6efd539c10348f23f1b01ae35882a956
Author: Peter Clifton <pcjc2@xxxxxxxxx>
Commit: Peter Clifton <pcjc2@xxxxxxxxx>

    TEMPORARY: Debug redraws by removing updates to status-bar
    
    Changing the status bar text triggers a full-page redraw, don't do it!

:100644 100644 e6a3add... f44e4e9... M	gschem/src/i_basic.c

commit 50365b0d5da45201a834574441cdc02f0181db2a
Author: Peter Clifton <pcjc2@xxxxxxxxx>
Commit: Peter Clifton <pcjc2@xxxxxxxxx>

    gschem: Fix rendering artifacts when object creation is cancelled
    
    Object creation cancelled due to dragging out an invalid sized object
    (zero radius circle, box or picture with zero width or height), left
    an impression of the rubber-band lines on the screen.
    
    Cancelling object creation with the escape key does not cause this
    effect, as it triggers a state change which includes a complete redraw
    of the schematic page.
    
    TODO: Actually write the code!

:000000 100644 0000000... e69de29... A	gschem/FIXME

=========
 Changes
=========

commit bdb529ee1c070c0119cafbd143e067d2aea99457
Author: Peter Clifton <pcjc2@xxxxxxxxx>
Commit: Peter Clifton <pcjc2@xxxxxxxxx>

    gschem: Play with move net-rubberbanding heuristics a little

diff --git a/gschem/src/o_move.c b/gschem/src/o_move.c
index 6016686..d744a5c 100644
--- a/gschem/src/o_move.c
+++ b/gschem/src/o_move.c
@@ -432,6 +432,22 @@ int o_move_return_whichone(OBJECT * object, int x, int y)
   return (-1);
 }
 
+
+static GList *add_dummy_stretch_net (GSCHEM_TOPLEVEL *w_current,
+                                     GList *new_nets, CONN *conn,
+                                     int x1_percent, int y1_percent,
+                                     int x2_percent, int y2_percent)
+{
+  OBJECT *new_net = o_net_new (w_current->toplevel, OBJ_NET, NET_COLOR,
+                               conn->x, conn->y, conn->x, conn->y);
+
+  w_current->stretch_list = s_stretch_add (w_current->stretch_list, new_net,
+                                           x1_percent, y1_percent,
+                                           x2_percent, y2_percent);
+
+  return g_list_prepend (new_nets, new_net);
+}
+
 /*! \todo Finish function documentation!!!
  *  \brief
  *  \par Function Description
@@ -444,6 +460,7 @@ void o_move_check_endpoint(GSCHEM_TOPLEVEL *w_current, OBJECT * object)
   CONN *c_current;
   OBJECT *other;
   int whichone;
+  GList *new_nets = NULL;
 
   if (!object)
   return;
@@ -485,16 +502,33 @@ void o_move_check_endpoint(GSCHEM_TOPLEVEL *w_current, OBJECT * object)
      /* (object->type == OBJ_NET &&
           other->type == OBJ_PIN && other->pin_type == PIN_TYPE_NET) */
 
-      OBJECT *new_net;
-      /* other object is a pin, insert a net */
-      new_net = o_net_new (toplevel, OBJ_NET, NET_COLOR,
-                           c_current->x, c_current->y,
-                           c_current->x, c_current->y);
-      s_page_append (toplevel, toplevel->page_current, new_net);
-      /* This new net object is only picked up for stretching later,
-       * somewhat of a kludge. If the move operation is cancelled, these
-       * new 0 length nets are removed by the "undo" operation invoked.
+      /* other object is a pin, insert some nets to take up the slack */
+
+      /* This new net objects are explicitly added with the appropriate
+       * coefficients for them to take up the stretch between the pins.
+       * These nets become added to the page's connectivity list when
+       * they are added to the page at the end of this function, but won't
+       * really be important until they are rubber-banded into place.
+       *
+       * If the move operation is cancelled, the dummy 0 length nets
+       * are removed by the "undo" operation invoked.
+       *
+       * The following isn't a complete, there needs to be far better
+       * heuristics to adding these intermediate stretch nets.
        */
+
+      /* ASSUME CASE FOR TWO BUTTING HORIZONTAL PINS */
+      if (1) {
+        /* Absorb half X movement */
+        new_nets = add_dummy_stretch_net (w_current, new_nets,
+                                          c_current, 0, 0, 50, 0);
+        /* Absorb the Y movement, shift by half X movement */
+        new_nets = add_dummy_stretch_net (w_current, new_nets,
+                                          c_current, 50, 0, 50, 100);
+        /* Absorb half X movement, shift by half X movement */
+        new_nets = add_dummy_stretch_net (w_current, new_nets,
+                                          c_current, 50, 100, 100, 100);
+      }
     }
 
     /* Only attempt to stretch nets and buses */
@@ -522,6 +556,7 @@ void o_move_check_endpoint(GSCHEM_TOPLEVEL *w_current, OBJECT * object)
     }
   }
 
+  s_page_append_list (toplevel, toplevel->page_current, new_nets);
 }
 
 /*! \todo Finish function documentation!!!

commit 7b4bd14b22cb890cfc156ef83678fef44e41afad
Author: Peter Clifton <pcjc2@xxxxxxxxx>
Commit: Peter Clifton <pcjc2@xxxxxxxxx>

    gschem: Add more abstract API for rubberbanding nets

diff --git a/gschem/include/gschem_struct.h b/gschem/include/gschem_struct.h
index 5f241e0..7a92209 100644
--- a/gschem/include/gschem_struct.h
+++ b/gschem/include/gschem_struct.h
@@ -216,5 +216,8 @@ struct st_gschem_toplevel {
 struct st_stretch
 {
   OBJECT *object;
-  int whichone;
+  int x1_percent;
+  int y1_percent;
+  int x2_percent;
+  int y2_percent;
 };
diff --git a/gschem/include/prototype.h b/gschem/include/prototype.h
index 463c709..7122893 100644
--- a/gschem/include/prototype.h
+++ b/gschem/include/prototype.h
@@ -517,7 +517,7 @@ void o_buffer_free(GSCHEM_TOPLEVEL *w_current);
 /* o_bus.c */
 void o_bus_draw(GSCHEM_TOPLEVEL *w_current, OBJECT *o_current);
 void o_bus_draw_place(GSCHEM_TOPLEVEL *w_current, int dx, int dy, OBJECT *o_current);
-void o_bus_draw_stretch(GSCHEM_TOPLEVEL *w_current, int dx, int dy, int whichone, OBJECT *o_current);
+void o_bus_draw_stretch(GSCHEM_TOPLEVEL *w_current, OBJECT *o_current, int dx1, int dy1, int dx2, int dy2);
 void o_bus_start(GSCHEM_TOPLEVEL *w_current, int x, int y);
 int o_bus_end(GSCHEM_TOPLEVEL *w_current, int x, int y);
 void o_bus_motion(GSCHEM_TOPLEVEL *w_current, int x, int y);
@@ -610,7 +610,7 @@ void o_move_end_rubberband(GSCHEM_TOPLEVEL *w_current, int world_diff_x, int wor
 void o_net_reset(GSCHEM_TOPLEVEL *w_current); 
 void o_net_draw(GSCHEM_TOPLEVEL *w_current, OBJECT *o_current);
 void o_net_draw_place(GSCHEM_TOPLEVEL *w_current, int dx, int dy, OBJECT *o_current);
-void o_net_draw_stretch(GSCHEM_TOPLEVEL *w_current, int dx, int dy, int whichone, OBJECT *o_current);
+void o_net_draw_stretch(GSCHEM_TOPLEVEL *w_current, OBJECT *o_current, int dx1, int dy1, int dx2, int dy2);
 void o_net_guess_direction(GSCHEM_TOPLEVEL *w_current, int x, int y);
 void o_net_find_magnetic(GSCHEM_TOPLEVEL *w_current, int event_x, int event_y);
 void o_net_finishmagnetic(GSCHEM_TOPLEVEL *w_current);
@@ -697,10 +697,11 @@ void o_undo_remove_last_undo(GSCHEM_TOPLEVEL *w_current);
 /* parsecmd.c */
 int parse_commandline(int argc, char *argv[]);
 /* s_stretch.c */
-GList *s_stretch_add(GList *list, OBJECT *object, int whichone);
-GList *s_stretch_remove(GList *list, OBJECT *object);
+GList *s_stretch_add(GList *list, OBJECT *object, int x1_percent, int y1_percent, int x2_percent, int y2_percent);
+GList *s_stretch_remove_object(GList *list, OBJECT *object);
 void s_stretch_print_all(GList *list);
 void s_stretch_destroy_all(GList *list);
+void s_stretch_calc_deltas(GSCHEM_TOPLEVEL *w_current, STRETCH *stretch, int diff_x, int diff_y, int *dx1, int *dy1, int *dx2, int *dy2);
 /* x_attribedit.c */
 gint option_menu_get_history(GtkOptionMenu *option_menu);
 void attrib_edit_dialog_ok(GtkWidget *w, GSCHEM_TOPLEVEL *w_current);
diff --git a/gschem/src/o_bus.c b/gschem/src/o_bus.c
index 666669e..9bfeba7 100644
--- a/gschem/src/o_bus.c
+++ b/gschem/src/o_bus.c
@@ -96,27 +96,13 @@ void o_bus_draw_place (GSCHEM_TOPLEVEL *w_current, int dx, int dy, OBJECT *o_cur
  *  \par Function Description
  *
  */
-void o_bus_draw_stretch (GSCHEM_TOPLEVEL *w_current,
-                         int dx, int dy, int whichone, OBJECT *o_current)
+void o_bus_draw_stretch (GSCHEM_TOPLEVEL *w_current, OBJECT *o_current,
+                         int dx1, int dy1, int dx2, int dy2)
 {
-  int dx1= - 1, dy1 = - 1, dx2 = -1, dy2 = -1;
-
   if (o_current->line == NULL) {
     return;
   }
 
-  if (whichone == 0) {
-    dx1 = dx;
-    dy1 = dy;
-    dx2 = dy2 = 0;
-  } else if (whichone == 1) {
-    dx1 = dy1 = 0;
-    dx2 = dx;
-    dy2 = dy;
-  } else {
-    fprintf(stderr, _("Got an invalid which one in o_bus_draw_stretch\n"));
-  }
-
   gschem_cairo_line (w_current, END_NONE, 0,
                      o_current->line->x[0] + dx1, o_current->line->y[0] + dy1,
                      o_current->line->x[1] + dx2, o_current->line->y[1] + dy2);
diff --git a/gschem/src/o_move.c b/gschem/src/o_move.c
index 00865ed..6016686 100644
--- a/gschem/src/o_move.c
+++ b/gschem/src/o_move.c
@@ -339,12 +339,16 @@ void o_move_motion (GSCHEM_TOPLEVEL *w_current, int w_x, int w_y)
 void o_move_invalidate_rubber (GSCHEM_TOPLEVEL *w_current, int drawing)
 {
   GList *s_iter;
+  int diff_x, diff_y;
   int dx1, dx2, dy1, dy2;
   int x1, y1, x2, y2;
 
   o_place_invalidate_rubber (w_current, drawing);
   if (w_current->netconn_rubberband) {
 
+    diff_x = w_current->second_wx - w_current->first_wx;
+    diff_y = w_current->second_wy - w_current->first_wy;
+
     for (s_iter = w_current->stretch_list;
          s_iter != NULL; s_iter = g_list_next (s_iter)) {
       STRETCH *s_current = s_iter->data;
@@ -353,15 +357,8 @@ void o_move_invalidate_rubber (GSCHEM_TOPLEVEL *w_current, int drawing)
       switch (object->type) {
         case (OBJ_NET):
         case (OBJ_BUS):
-          if (s_current->whichone == 0) {
-            dx1 = w_current->second_wx - w_current->first_wx;
-            dy1 = w_current->second_wy - w_current->first_wy;
-            dx2 = dy2 = 0;
-          } else {
-            dx1 = dy1 = 0;
-            dx2 = w_current->second_wx - w_current->first_wx;
-            dy2 = w_current->second_wy - w_current->first_wy;
-          }
+          s_stretch_calc_deltas (w_current, s_current,
+                                 diff_x, diff_y, &dx1, &dy1, &dx2, &dy2);
 
           WORLDtoSCREEN (w_current, object->line->x[0] + dx1,
                                     object->line->y[0] + dy1, &x1, &y1);
@@ -384,6 +381,7 @@ void o_move_draw_rubber (GSCHEM_TOPLEVEL *w_current, int drawing)
 {
   GList *s_iter;
   int diff_x, diff_y;
+  int dx1, dy1, dx2, dy2;
 
   o_place_draw_rubber (w_current, drawing);
 
@@ -397,15 +395,17 @@ void o_move_draw_rubber (GSCHEM_TOPLEVEL *w_current, int drawing)
        s_iter != NULL; s_iter = g_list_next (s_iter)) {
     STRETCH *s_current = s_iter->data;
     OBJECT *object = s_current->object;
-    int whichone = s_current->whichone;
+
+    s_stretch_calc_deltas (w_current, s_current,
+                           diff_x, diff_y, &dx1, &dy1, &dx2, &dy2);
 
     switch (object->type) {
       case (OBJ_NET):
-        o_net_draw_stretch (w_current, diff_x, diff_y, whichone, object);
+        o_net_draw_stretch (w_current, object, dx1, dy1, dx2, dy2);
         break;
 
       case (OBJ_BUS):
-        o_bus_draw_stretch (w_current, diff_x, diff_y, whichone, object);
+        o_bus_draw_stretch (w_current, object, dx1, dy1, dx2, dy2);
         break;
     }
   }
@@ -501,8 +501,6 @@ void o_move_check_endpoint(GSCHEM_TOPLEVEL *w_current, OBJECT * object)
     if (other->type != OBJ_NET && other->type != OBJ_BUS)
       continue;
 
-    whichone = o_move_return_whichone (other, c_current->x, c_current->y);
-
 #if DEBUG
     printf ("FOUND: %s type: %d, whichone: %d, x,y: %d %d\n",
             other->name, c_current->type,
@@ -514,9 +512,13 @@ void o_move_check_endpoint(GSCHEM_TOPLEVEL *w_current, OBJECT * object)
            c_current->other_whichone);
 #endif
 
-    if (whichone >= 0 && whichone <= 1) {
-      w_current->stretch_list = s_stretch_add (w_current->stretch_list,
-                                               other, whichone);
+    whichone = o_move_return_whichone (other, c_current->x, c_current->y);
+    if (whichone == 0) {
+      w_current->stretch_list =
+        s_stretch_add (w_current->stretch_list, other, 100, 100, 0, 0);
+    } else if (whichone == 1) {
+      w_current->stretch_list =
+        s_stretch_add (w_current->stretch_list, other, 0, 0, 100, 100);
     }
   }
 
@@ -596,12 +598,12 @@ void o_move_end_rubberband (GSCHEM_TOPLEVEL *w_current,
 {
   TOPLEVEL *toplevel = w_current->toplevel;
   GList *s_iter, *s_iter_next;
+  int dx1, dy1, dx2, dy2;
 
   for (s_iter = w_current->stretch_list;
        s_iter != NULL; s_iter = s_iter_next) {
     STRETCH *s_current = s_iter->data;
     OBJECT *object = s_current->object;
-    int whichone = s_current->whichone;
 
     /* Store this now, since we may delete the current item */
     s_iter_next = g_list_next (s_iter);
@@ -612,12 +614,14 @@ void o_move_end_rubberband (GSCHEM_TOPLEVEL *w_current,
       /* remove the object's connections */
       s_conn_remove_object (toplevel, object);
 
-      object->line->x[whichone] += w_dx;
-      object->line->y[whichone] += w_dy;
+      s_stretch_calc_deltas (w_current, s_current,
+                             w_dx, w_dy, &dx1, &dy1, &dx2, &dy2);
+      object->line->x[0] += dx1;  object->line->y[0] += dy1;
+      object->line->x[1] += dx2;  object->line->y[1] += dy2;
 
       if (o_move_zero_length (object)) {
         w_current->stretch_list =
-          s_stretch_remove (w_current->stretch_list, object);
+          s_stretch_remove_object (w_current->stretch_list, object);
         o_delete (w_current, object);
         continue;
       }
diff --git a/gschem/src/o_net.c b/gschem/src/o_net.c
index d4b1b27..20aba7d 100644
--- a/gschem/src/o_net.c
+++ b/gschem/src/o_net.c
@@ -137,27 +137,13 @@ void o_net_draw_place (GSCHEM_TOPLEVEL *w_current, int dx, int dy, OBJECT *o_cur
  *  \par Function Description
  *
  */
-void o_net_draw_stretch (GSCHEM_TOPLEVEL *w_current,
-                         int dx, int dy, int whichone, OBJECT *o_current)
+void o_net_draw_stretch (GSCHEM_TOPLEVEL *w_current, OBJECT *o_current,
+                         int dx1, int dy1, int dx2, int dy2)
 {
-  int dx1 = -1, dx2 = -1, dy1 = -1,dy2 = -1;
-
   if (o_current->line == NULL) {
     return;
   }
 
-  if (whichone == 0) {
-    dx1 = dx;
-    dy1 = dy;
-    dx2 = dy2 = 0;
-  } else if (whichone == 1) {
-    dx1 = dy1 = 0;
-    dx2 = dx;
-    dy2 = dy;
-  } else {
-    fprintf(stderr, _("Got an invalid which one in o_net_draw_stretch\n"));
-  }
-
   gschem_cairo_line (w_current, END_NONE, 0,
                      o_current->line->x[0] + dx1, o_current->line->y[0] + dy1,
                      o_current->line->x[1] + dx2, o_current->line->y[1] + dy2);
diff --git a/gschem/src/s_stretch.c b/gschem/src/s_stretch.c
index 4bbf39e..9d4a384 100644
--- a/gschem/src/s_stretch.c
+++ b/gschem/src/s_stretch.c
@@ -33,7 +33,9 @@
  *  \par Function Description
  *
  */
-GList *s_stretch_add (GList *list, OBJECT *object, int whichone)
+GList *s_stretch_add (GList *list, OBJECT *object,
+                      int x1_percent, int y1_percent,
+                      int x2_percent, int y2_percent)
 {
   GList *s_iter;
   STRETCH *s_new;
@@ -48,7 +50,10 @@ GList *s_stretch_add (GList *list, OBJECT *object, int whichone)
 
   s_new = g_malloc (sizeof (STRETCH));
   s_new->object = object;
-  s_new->whichone = whichone;
+  s_new->x1_percent = x1_percent;
+  s_new->y1_percent = y1_percent;
+  s_new->x2_percent = x2_percent;
+  s_new->y2_percent = y2_percent;
 
   return g_list_append (list, s_new);
 }
@@ -75,7 +80,7 @@ static gint find_object (gconstpointer a, gconstpointer b)
  *  \par Function Description
  *
  */
-GList *s_stretch_remove (GList *list, OBJECT *object)
+GList *s_stretch_remove_object (GList *list, OBJECT *object)
 {
   GList *item;
 
@@ -106,8 +111,6 @@ void s_stretch_print_all (GList *list)
     } else {
       printf("Object is NULL\n");
     }
-
-    printf("which one: %d\n", s_current->whichone);
   }
   printf("DONE printing stretch ********************\n\n");
 }
@@ -122,3 +125,28 @@ void s_stretch_destroy_all (GList *list)
   g_list_foreach (list, (GFunc)g_free, NULL);
   g_list_free (list);
 }
+
+/*! \todo Finish function documentation!!!
+ *  \brief
+ *  \par Function Description
+ *
+ */
+void s_stretch_calc_deltas (GSCHEM_TOPLEVEL *w_current,
+                            STRETCH *stretch, int diff_x, int diff_y,
+                            int *dx1, int *dy1, int *dx2, int *dy2)
+{
+  /* Calculate line-end deltas from stretch percentages */
+  *dx1 = diff_x * stretch->x1_percent / 100;
+  *dy1 = diff_y * stretch->y1_percent / 100;
+  *dx2 = diff_x * stretch->x2_percent / 100;
+  *dy2 = diff_y * stretch->y2_percent / 100;
+
+  if (w_current->snap != SNAP_OFF) {
+    /* Round (down) to snap-grid */
+    /* NB: This might not be quite right for SNAP_RESNAP. */
+    *dx1 = (*dx1 / w_current->snap_size) * w_current->snap_size;
+    *dy1 = (*dy1 / w_current->snap_size) * w_current->snap_size;
+    *dx2 = (*dx2 / w_current->snap_size) * w_current->snap_size;
+    *dy2 = (*dy2 / w_current->snap_size) * w_current->snap_size;
+  }
+}

commit a909848f6efd539c10348f23f1b01ae35882a956
Author: Peter Clifton <pcjc2@xxxxxxxxx>
Commit: Peter Clifton <pcjc2@xxxxxxxxx>

    TEMPORARY: Debug redraws by removing updates to status-bar
    
    Changing the status bar text triggers a full-page redraw, don't do it!

diff --git a/gschem/src/i_basic.c b/gschem/src/i_basic.c
index e6a3add..f44e4e9 100644
--- a/gschem/src/i_basic.c
+++ b/gschem/src/i_basic.c
@@ -40,6 +40,8 @@
  */
 static void i_update_status(GSCHEM_TOPLEVEL *w_current, const char *string)
 {
+  return;
+
   if (!w_current->status_label)
     return;
 
@@ -587,7 +589,7 @@ void i_update_grid_info (GSCHEM_TOPLEVEL *w_current)
   }
 
   print_string = g_strdup_printf(_("Grid(%s, %s)"), snap, grid);
-  gtk_label_set(GTK_LABEL(w_current->grid_label), print_string);
+//  gtk_label_set(GTK_LABEL(w_current->grid_label), print_string);
   
   g_free(print_string);
   g_free(grid);

commit 50365b0d5da45201a834574441cdc02f0181db2a
Author: Peter Clifton <pcjc2@xxxxxxxxx>
Commit: Peter Clifton <pcjc2@xxxxxxxxx>

    gschem: Fix rendering artifacts when object creation is cancelled
    
    Object creation cancelled due to dragging out an invalid sized object
    (zero radius circle, box or picture with zero width or height), left
    an impression of the rubber-band lines on the screen.
    
    Cancelling object creation with the escape key does not cause this
    effect, as it triggers a state change which includes a complete redraw
    of the schematic page.
    
    TODO: Actually write the code!

diff --git a/gschem/FIXME b/gschem/FIXME
new file mode 100644
index 0000000..e69de29



_______________________________________________
geda-cvs mailing list
geda-cvs@xxxxxxxxxxxxxx
http://www.seul.org/cgi-bin/mailman/listinfo/geda-cvs