[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
gEDA-cvs: CVS update: o_basic.c
User: cnieves
Date: 06/10/22 15:14:40
Modified: . Tag: glist_dev o_basic.c o_copy.c x_event.c
Log:
* src/o_basic.c, src/o_copy.c, src/x_event.c:
Make the copy action use the complex_place_list.
Revision Changes Path
No revision
No revision
1.21.2.6 +10 -11 eda/geda/gaf/gschem/src/o_basic.c
(In the diff below, changes in quantity of whitespace are not shown.)
Index: o_basic.c
===================================================================
RCS file: /home/cvspsrv/cvsroot/eda/geda/gaf/gschem/src/o_basic.c,v
retrieving revision 1.21.2.5
retrieving revision 1.21.2.6
diff -u -b -r1.21.2.5 -r1.21.2.6
--- o_basic.c 22 Oct 2006 15:30:38 -0000 1.21.2.5
+++ o_basic.c 22 Oct 2006 19:14:40 -0000 1.21.2.6
@@ -59,15 +59,12 @@
case(MOVE):
case(ENDMOVE):
o_erase_selected(w_current);
- /* continue */
- case(ENDCOPY):
- case(ENDMCOPY):
o_drawbounding(w_current, NULL,
- w_current->page_current->selection_list,
+ w_current->page_current->complex_place_list,
x_get_darkcolor(w_current->bb_color), FALSE);
-
break;
-
+ case(ENDCOPY):
+ case(ENDMCOPY):
case(DRAWCOMP):
case(ENDCOMP):
/* Call the o_draw_list without redrawing, so the components */
@@ -114,8 +111,10 @@
}
o_recalc_object_list(w_current, w_current->page_current->object_head);
- /* Uncomment this when using the complex_place_list for moving and copying */
- /* o_recalc_object_glist(w_current, w_current->page_current->complex_place_list); */
+ o_recalc_object_glist(w_current,
+ w_current->page_current->selection_list);
+ o_recalc_object_glist(w_current,
+ w_current->page_current->complex_place_list);
draw_selected = !(w_current->inside_action &&
((w_current->event_state == MOVE) ||
1.26.2.2 +247 -250 eda/geda/gaf/gschem/src/o_copy.c
(In the diff below, changes in quantity of whitespace are not shown.)
Index: o_copy.c
===================================================================
RCS file: /home/cvspsrv/cvsroot/eda/geda/gaf/gschem/src/o_copy.c,v
retrieving revision 1.26.2.1
retrieving revision 1.26.2.2
diff -u -b -r1.26.2.1 -r1.26.2.2
--- o_copy.c 21 Oct 2006 22:20:47 -0000 1.26.2.1
+++ o_copy.c 22 Oct 2006 19:14:40 -0000 1.26.2.2
@@ -37,79 +37,36 @@
*/
void o_copy_start(TOPLEVEL *w_current, int x, int y)
{
- if (w_current->page_current->selection_list != NULL) {
-
- /* This is commented out since it breaks the copy of objects. See below. */
-#if 0
- /* Save the current state. When rotating the selection when copying,
- we have to come back to here */
- o_undo_savestate(w_current, UNDO_ALL);
-#endif
-
- w_current->last_drawb_mode = -1;
- /* Shouldn't this set by the caller ? */
- /* w_current->event_state = COPY; */
-
- w_current->last_x = w_current->start_x = fix_x(w_current, x);
- w_current->last_y = w_current->start_y = fix_y(w_current, y);
- o_drawbounding(w_current, NULL,
- w_current->page_current->selection_list,
- x_get_darkcolor(w_current->bb_color), TRUE);
- w_current->inside_action = 1;
- }
-}
-
-/*! \todo Finish function documentation!!!
- * \brief
- * \par Function Description
- *
- */
-void o_copy_end(TOPLEVEL *w_current)
-{
- GList *temp_list = NULL;
GList *s_current = NULL;
GList *new_objects = NULL;
- GList *connected_objects=NULL;
+ OBJECT *object = NULL;
OBJECT *new_object = NULL;
OBJECT *complex_object = NULL;
OBJECT *new_objects_head = NULL;
- OBJECT *object;
- int diff_x, diff_y;
- int screen_diff_x, screen_diff_y;
- int lx, ly;
- int sx, sy;
int color;
/* int redraw_state; not needed for now */
+ if (w_current->page_current->selection_list == NULL) {
+ w_current->inside_action = 0;
+ i_set_state(w_current, SELECT);
+ return;
+ }
+
+ w_current->last_drawb_mode = -1;
+
object = o_select_return_first_object(w_current);
if (object == NULL) {
- /*! \todo error condition */
+ /* TODO: error condition */
w_current->inside_action = 0;
i_set_state(w_current, SELECT);
return;
}
- screen_diff_x = w_current->last_x - w_current->start_x;
- screen_diff_y = w_current->last_y - w_current->start_y;
+ w_current->start_x = w_current->last_x = fix_x(w_current, (int) mouse_x);
+ w_current->start_y = w_current->last_y = fix_x(w_current, (int) mouse_y);
- SCREENtoWORLD(w_current,
- w_current->last_x,
- w_current->last_y,
- &lx,
- &ly);
- SCREENtoWORLD(w_current,
- w_current->start_x,
- w_current->start_y,
- &sx,
- &sy);
-
- diff_x = lx - sx;
- diff_y = ly - sy;
-
- /* skip over head node */
s_current = w_current->page_current->selection_list;
- temp_list = NULL;
new_objects_head = s_basic_init_object("object_head");
while(s_current != NULL) {
@@ -117,10 +74,12 @@
object = (OBJECT *) s_current->data;
if (object == NULL) {
- fprintf(stderr, _("ERROR: NULL object in o_copy_end!\n"));
+ fprintf(stderr, _("ERROR: NULL object in o_copy_start!\n"));
exit(-1);
}
+ o_selection_unselect(object);
+
switch(object->type) {
case(OBJ_NET):
@@ -134,24 +93,11 @@
object);
w_current->ADDING_SEL=0;
- if (w_current->actionfeedback_mode == OUTLINE) {
- o_net_draw_xor(w_current,
- screen_diff_x, screen_diff_y,
- object);
- }
-
- o_net_translate_world(w_current,
- diff_x, diff_y,
- new_object);
-
- temp_list = o_selection_add(temp_list, new_object);
new_object->saved_color = object->saved_color;
- o_net_draw(w_current, new_object);
+ new_object->color = object->color;
s_conn_update_object(w_current, new_object);
- new_objects = g_list_append(new_objects, new_object);
- connected_objects = s_conn_return_others(connected_objects,
- new_object);
+ new_objects = o_selection_add(new_objects, new_object);
break;
case(OBJ_PIN):
@@ -163,26 +109,11 @@
return_tail(new_objects_head),
object);
w_current->ADDING_SEL=0;
-
- if (w_current->actionfeedback_mode == OUTLINE) {
- o_pin_draw_xor(w_current,
- screen_diff_x,
- screen_diff_y,
- object);
- }
-
- o_pin_translate_world(w_current,
- diff_x, diff_y,
- new_object);
-
- temp_list = o_selection_add(temp_list, new_object);
new_object->saved_color = object->saved_color;
- o_pin_draw(w_current, new_object);
+ new_object->color = object->color;
s_conn_update_object(w_current, new_object);
- new_objects = g_list_append(new_objects, new_object);
- connected_objects = s_conn_return_others(connected_objects,
- new_object);
+ new_objects = o_selection_add(new_objects, new_object);
break;
case(OBJ_BUS):
@@ -194,25 +125,11 @@
return_tail(new_objects_head),
object);
w_current->ADDING_SEL=0;
-
- if (w_current->actionfeedback_mode == OUTLINE) {
- o_bus_draw_xor(w_current,
- screen_diff_x, screen_diff_y,
- object);
- }
-
- o_bus_translate_world(w_current,
- diff_x, diff_y,
- new_object);
-
- temp_list = o_selection_add(temp_list, new_object);
new_object->saved_color = object->saved_color;
- o_bus_draw(w_current, new_object);
+ new_object->color = object->color;
s_conn_update_object(w_current, new_object);
- new_objects = g_list_append(new_objects, new_object);
- connected_objects = s_conn_return_others(connected_objects,
- new_object);
+ new_objects = o_selection_add(new_objects, new_object);
break;
case(OBJ_COMPLEX):
@@ -233,74 +150,35 @@
}
w_current->ADDING_SEL=0;
- complex_object = new_object;
-
- if (w_current->actionfeedback_mode == OUTLINE) {
- o_complex_draw_xor(w_current, screen_diff_x, screen_diff_y,
- object->complex->prim_objs);
- }
-
- o_complex_world_translate_toplevel(w_current,
- diff_x,
- diff_y,
- new_object);
-
- temp_list = o_selection_add(temp_list, new_object);
+ new_object->saved_color = object->saved_color;
+ new_object->color = object->color;
+ complex_object = new_object;
/* NEWSEL: this needs to be fixed too */
/* this may not be needed anymore? */
o_attrib_slot_copy(w_current, object,
new_object);
- new_object->saved_color = object->saved_color;
- o_redraw_single(w_current, new_object);
s_conn_update_complex(w_current, new_object->complex->prim_objs);
- new_objects = g_list_append(new_objects, new_object);
- connected_objects = s_conn_return_complex_others(connected_objects,
- new_object);
+ new_objects = o_selection_add(new_objects, new_object);
break;
case(OBJ_LINE):
new_object = (OBJECT *) o_line_copy(w_current,
return_tail(new_objects_head),
object);
- if (w_current->actionfeedback_mode == OUTLINE) {
- o_line_draw_xor(w_current,
- screen_diff_x, screen_diff_y,
- object);
- }
-
- w_current->ADDING_SEL=1;
- o_line_translate_world(w_current,
- diff_x, diff_y,
- new_object);
- w_current->ADDING_SEL=0;
-
- temp_list = o_selection_add(temp_list, new_object);
new_object->saved_color = object->saved_color;
- o_line_draw(w_current, new_object);
+ new_object->color = object->color;
+ new_objects = o_selection_add(new_objects, new_object);
break;
case(OBJ_BOX):
new_object = (OBJECT *) o_box_copy(w_current,
return_tail(new_objects_head),
object);
- if (w_current->actionfeedback_mode == OUTLINE) {
- o_box_draw_xor(w_current,
- screen_diff_x,
- screen_diff_y,
- object);
- }
-
- w_current->ADDING_SEL=1;
- o_box_translate_world(w_current,
- diff_x, diff_y,
- new_object);
- w_current->ADDING_SEL=0;
-
- temp_list = o_selection_add(temp_list, new_object);
new_object->saved_color = object->saved_color;
- o_box_draw(w_current, new_object);
+ new_object->color = object->color;
+ new_objects = o_selection_add(new_objects, new_object);
break;
@@ -308,22 +186,9 @@
new_object = (OBJECT *) o_picture_copy(w_current,
return_tail(new_objects_head),
object);
- if (w_current->actionfeedback_mode == OUTLINE) {
- o_picture_draw_xor(w_current,
- screen_diff_x,
- screen_diff_y,
- object);
- }
-
- w_current->ADDING_SEL=1;
- o_picture_translate_world(w_current,
- diff_x, diff_y,
- new_object);
- w_current->ADDING_SEL=0;
-
- temp_list = o_selection_add(temp_list, new_object);
new_object->saved_color = object->saved_color;
- o_picture_draw(w_current, new_object);
+ new_object->color = object->color;
+ new_objects = o_selection_add(new_objects, new_object);
break;
@@ -331,50 +196,24 @@
new_object = (OBJECT *) o_circle_copy(w_current,
return_tail(new_objects_head),
object);
-
- if (w_current->actionfeedback_mode == OUTLINE) {
- o_circle_draw_xor(w_current,
- screen_diff_x,
- screen_diff_y,
- object);
- }
-
- w_current->ADDING_SEL=1;
- o_circle_translate_world(w_current,
- diff_x, diff_y,
- new_object);
- w_current->ADDING_SEL=0;
-
- temp_list = o_selection_add(temp_list, new_object);
new_object->saved_color = object->saved_color;
- o_circle_draw(w_current, new_object);
+ new_object->color = object->color;
+ new_objects = o_selection_add(new_objects, new_object);
break;
case(OBJ_ARC):
new_object = (OBJECT *) o_arc_copy(w_current,
return_tail(new_objects_head),
object);
-
- if (w_current->actionfeedback_mode == OUTLINE) {
- o_arc_draw_xor(w_current,
- screen_diff_x,
- screen_diff_y,
- object);
- }
-
- w_current->ADDING_SEL=1;
- o_arc_translate_world(w_current,
- diff_x, diff_y,
- new_object);
- w_current->ADDING_SEL=0;
-
- temp_list = o_selection_add(temp_list, new_object);
new_object->saved_color = object->saved_color;
- o_arc_draw(w_current, new_object);
+ new_object->color = object->color;
+ new_objects = o_selection_add(new_objects, new_object);
break;
}
+ o_selection_select(object, SELECT_COLOR);
+
w_current->page_current->object_tail =
(OBJECT *) return_tail(w_current->page_current->
object_head);
@@ -388,7 +227,7 @@
object = (OBJECT *) s_current->data;
if (object == NULL) {
- fprintf(stderr, _("ERROR: NULL object in o_copy_end!\n"));
+ fprintf(stderr, _("ERROR: NULL object in o_copy_start!\n"));
exit(-1);
}
@@ -400,6 +239,7 @@
return_tail(new_objects_head),
object);
w_current->ADDING_SEL=0;
+ new_object->color = object->color;
/* this is also okay NEWSEL new_obj is single */
if (object->attached_to) {
@@ -407,7 +247,7 @@
o_attrib_attach(w_current, new_objects_head,
new_object, object->attached_to-> copied_to);
- /*! \todo I have no idea if this is
+ /* TODO: I have no idea if this is
really needed.... ? */
#if 0
o_attrib_slot_update(
@@ -419,37 +259,23 @@
object->attached_to->copied_to = NULL;
}
}
-
- if (w_current->actionfeedback_mode == OUTLINE) {
- o_text_draw_xor(w_current,
- screen_diff_x,
- screen_diff_y,
- object);
- }
-
- w_current->ADDING_SEL=1;
- o_text_translate_world(w_current, diff_x, diff_y, new_object);
- w_current->ADDING_SEL=0;
-
/* old object was attr */
if (!new_object->attribute &&
object->attribute) {
- new_object->color = w_current-> detachedattr_color;
o_complex_set_color(new_object, new_object->color);
new_object->visibility = VISIBLE;
color = new_object->color;
} else {
- color = object->saved_color;
+ /* color = object->saved_color;*/
+ color = object->color;
}
- temp_list = o_selection_add(temp_list, new_object);
- new_object->saved_color = color;
+ new_objects = o_selection_add(new_objects, new_object);
/* signify that object is no longer an attribute */
- o_text_draw(w_current, new_object);
+ /* o_text_draw(w_current, new_object);*/
- o_complex_set_saved_color_only(
- new_object->text->prim_objs,
+ o_complex_set_saved_color_only(new_object->text->prim_objs,
color);
break;
}
@@ -460,22 +286,199 @@
s_current = s_current->next;
}
- /* This is commented out since it breaks the copy of objects. */
- /* Required connection information is thrown away for some reason */
- /* Of course, commenting this out, will probably break the rotation */
- /* that this supported. */
-#if 0
- /* Go back to the state before copying, to restore possible rotations
- of the selection */
- redraw_state = w_current->DONT_REDRAW;
- w_current->DONT_REDRAW = 0;
- o_undo_callback(w_current, UNDO_ACTION);
- w_current->DONT_REDRAW = redraw_state;
-#endif
+ w_current->page_current->complex_place_list = new_objects;
+ o_drawbounding(w_current, NULL, w_current->page_current->complex_place_list,
+ x_get_darkcolor(w_current->bb_color), TRUE);
+ w_current->inside_action = 1;
+}
+
+
+void
+o_copy_end(TOPLEVEL *w_current)
+{
+ OBJECT *object, *new_objects_head;
+ GList *list_ptr;
+ GList *connected_objects=NULL;
+ int diff_x, diff_y;
+ int screen_diff_x, screen_diff_y;
+ int lx, ly;
+ int sx, sy;
+
+ w_current->last_drawb_mode = -1;
+
+ screen_diff_x = w_current->last_x - w_current->start_x;
+ screen_diff_y = w_current->last_y - w_current->start_y;
+
+ SCREENtoWORLD(w_current,
+ w_current->last_x,
+ w_current->last_y,
+ &lx,
+ &ly);
+ SCREENtoWORLD(w_current,
+ w_current->start_x,
+ w_current->start_y,
+ &sx,
+ &sy);
+
+ diff_x = lx - sx;
+ diff_y = ly - sy;
+
+ list_ptr = w_current->page_current->complex_place_list;
+ while (list_ptr) {
+ object = (OBJECT *) list_ptr->data;
+
+ switch(object->type) {
+ case(OBJ_NET):
+ if (w_current->actionfeedback_mode == OUTLINE) {
+ o_net_draw_xor(w_current,
+ screen_diff_x, screen_diff_y,
+ object);
+ }
+
+ o_net_translate_world(w_current,
+ diff_x, diff_y,
+ object);
+ connected_objects = s_conn_return_others(connected_objects,
+ object);
+ break;
+ case(OBJ_PIN):
+ if (w_current->actionfeedback_mode == OUTLINE) {
+ o_pin_draw_xor(w_current,
+ screen_diff_x,
+ screen_diff_y,
+ object);
+ }
+
+ o_pin_translate_world(w_current,
+ diff_x, diff_y,
+ object);
+ connected_objects = s_conn_return_others(connected_objects,
+ object);
+ break;
+
+ case(OBJ_BUS):
+ if (w_current->actionfeedback_mode == OUTLINE) {
+ o_bus_draw_xor(w_current,
+ screen_diff_x, screen_diff_y,
+ object);
+ }
+
+ o_bus_translate_world(w_current,
+ diff_x, diff_y,
+ object);
+ connected_objects = s_conn_return_others(connected_objects,
+ object);
+ break;
+ case(OBJ_COMPLEX):
+ case(OBJ_PLACEHOLDER):
+ if (w_current->actionfeedback_mode == OUTLINE) {
+ o_complex_draw_xor(w_current, screen_diff_x, screen_diff_y,
+ object->complex->prim_objs);
+ }
+
+ o_complex_world_translate_toplevel(w_current,
+ diff_x,
+ diff_y,
+ object);
+ connected_objects = s_conn_return_complex_others(connected_objects,
+ object);
+ break;
+
+ case(OBJ_LINE):
+ if (w_current->actionfeedback_mode == OUTLINE) {
+ o_line_draw_xor(w_current,
+ screen_diff_x, screen_diff_y,
+ object);
+ }
+
+ w_current->ADDING_SEL=1;
+ o_line_translate_world(w_current,
+ diff_x, diff_y,
+ object);
+ w_current->ADDING_SEL=0;
+ break;
+ case(OBJ_BOX):
+ if (w_current->actionfeedback_mode == OUTLINE) {
+ o_box_draw_xor(w_current,
+ screen_diff_x,
+ screen_diff_y,
+ object);
+ }
+
+ w_current->ADDING_SEL=1;
+ o_box_translate_world(w_current,
+ diff_x, diff_y,
+ object);
+ w_current->ADDING_SEL=0;
+ break;
+
+ case(OBJ_PICTURE):
+ if (w_current->actionfeedback_mode == OUTLINE) {
+ o_picture_draw_xor(w_current,
+ screen_diff_x,
+ screen_diff_y,
+ object);
+ }
+
+ w_current->ADDING_SEL=1;
+ o_picture_translate_world(w_current,
+ diff_x, diff_y,
+ object);
+ w_current->ADDING_SEL=0;
+ break;
+ case(OBJ_CIRCLE):
+ if (w_current->actionfeedback_mode == OUTLINE) {
+ o_circle_draw_xor(w_current,
+ screen_diff_x,
+ screen_diff_y,
+ object);
+ }
+
+ w_current->ADDING_SEL=1;
+ o_circle_translate_world(w_current,
+ diff_x, diff_y,
+ object);
+ w_current->ADDING_SEL=0;
+ break;
+ case(OBJ_ARC):
+ if (w_current->actionfeedback_mode == OUTLINE) {
+ o_arc_draw_xor(w_current,
+ screen_diff_x,
+ screen_diff_y,
+ object);
+ }
+
+ w_current->ADDING_SEL=1;
+ o_arc_translate_world(w_current,
+ diff_x, diff_y,
+ object);
+ w_current->ADDING_SEL=0;
+ break;
+ case(OBJ_TEXT):
+
+ if (w_current->actionfeedback_mode == OUTLINE) {
+ o_text_draw_xor(w_current,
+ screen_diff_x,
+ screen_diff_y,
+ object);
+ }
+
+ w_current->ADDING_SEL=1;
+ o_text_translate_world(w_current, diff_x, diff_y, object);
+ w_current->ADDING_SEL=0;
+ break;
+ }
+ list_ptr = list_ptr->next;
+ }
+
/* Add the new objects */
- w_current->page_current->object_tail = (OBJECT *)
- return_tail(w_current->page_current->object_head);
+ list_ptr = g_list_first(w_current->page_current->complex_place_list);
+ if (list_ptr == NULL) {
+ fprintf(stderr, "o_copy_end: Something went wrong. Selection list is empty!\n");
+ return;
+ }
+ new_objects_head = (OBJECT *) (list_ptr->data);
s_basic_link_object(new_objects_head, w_current->page_current->object_tail);
@@ -498,25 +501,21 @@
object=object->next;
}
- /* Delete the new object head */
- /* new_objects_head->next = NULL;
- s_delete_list_fromstart(w_current, new_objects_head); */
-
w_current->page_current->object_tail = (OBJECT *)
return_tail(w_current->page_current->object_head);
/* erase the bounding box */
if (w_current->actionfeedback_mode == BOUNDINGBOX) {
o_drawbounding(w_current, NULL,
- w_current->page_current->selection_list,
+ w_current->page_current->complex_place_list,
x_get_darkcolor(w_current->bb_color), TRUE);
}
o_select_run_hooks(w_current, NULL, 2);
o_selection_unselect_list(w_current,
&(w_current->page_current->selection_list));
- w_current->page_current->selection_list = NULL;
- w_current->page_current->selection_list = temp_list;
+ w_current->page_current->selection_list = w_current->page_current->complex_place_list;
+
#if DEBUG
o_selection_print_all(w_current->page_current->selection_list);
#endif
@@ -524,14 +523,12 @@
w_current->page_current->CHANGED = 1;
/* not needed o_redraw(w_current, w_current->page_current->object_head); */
- o_cue_draw_list(w_current, new_objects);
+ o_cue_draw_list(w_current, w_current->page_current->complex_place_list);
o_cue_undraw_list(w_current, connected_objects);
o_cue_draw_list(w_current, connected_objects);
- g_list_free(new_objects);
+ o_undo_savestate(w_current, UNDO_ALL);
g_list_free(connected_objects);
- new_objects = NULL;
- connected_objects = NULL;
- o_undo_savestate(w_current, UNDO_ALL);
+ w_current->page_current->complex_place_list = NULL;
}
1.41.2.2 +6 -10 eda/geda/gaf/gschem/src/x_event.c
(In the diff below, changes in quantity of whitespace are not shown.)
Index: x_event.c
===================================================================
RCS file: /home/cvspsrv/cvsroot/eda/geda/gaf/gschem/src/x_event.c,v
retrieving revision 1.41.2.1
retrieving revision 1.41.2.2
diff -u -b -r1.41.2.1 -r1.41.2.2
--- x_event.c 21 Oct 2006 22:20:50 -0000 1.41.2.1
+++ x_event.c 22 Oct 2006 19:14:40 -0000 1.41.2.2
@@ -87,10 +87,6 @@
case(COPY):
case(ENDCOPY):
case(ENDMCOPY):
- o_drawbounding(w_current, NULL,
- w_current->page_current->selection_list,
- x_get_darkcolor(w_current->bb_color), FALSE);
- break;
case(DRAWCOMP):
case(ENDCOMP):
case(ENDPASTE):
@@ -1088,12 +1084,12 @@
case(MCOPY):
if (w_current->inside_action) {
o_drawbounding(w_current, NULL,
- w_current->page_current->selection_list,
+ w_current->page_current->complex_place_list,
x_get_darkcolor(w_current->bb_color), FALSE);
w_current->last_x = fix_x(w_current, (int) event->x);
w_current->last_y = fix_y(w_current, (int) event->y);
o_drawbounding(w_current, NULL,
- w_current->page_current->selection_list,
+ w_current->page_current->complex_place_list,
x_get_darkcolor(w_current->bb_color), FALSE);
}
break;
_______________________________________________
geda-cvs mailing list
geda-cvs@xxxxxxxxxxxxxx
http://www.seul.org/cgi-bin/mailman/listinfo/geda-cvs