1
0
mirror of git://projects.qi-hardware.com/fped.git synced 2024-11-22 07:30:16 +02:00

- measurement offsets can now use variables. We evaluate the offset during

instantiation and create a partially formed instance. During measurement
  instantiation, we complete that instance.
- leak.supp: finally figured out how to write a valgrind suppression file
- fped.c: we don't need the FPED_NO_GUI kludge anymore
- fped.c: moved gui_cleanup_style to gui_main
- dereference icons (seems that this doesn't deallocate everything, though)



git-svn-id: http://svn.openmoko.org/trunk/eda/fped@5514 99fdad57-331a-0410-800a-d7fa5415bdb3
This commit is contained in:
werner 2009-08-21 18:20:37 +00:00
parent 9e7e804d1a
commit 94f4534494
13 changed files with 114 additions and 41 deletions

2
TODO
View File

@ -34,8 +34,6 @@ Bugs:
- whenever we call parse_* for input parsing, we may leak lots of expressions - whenever we call parse_* for input parsing, we may leak lots of expressions
- can't edit measurement labels through the GUI - can't edit measurement labels through the GUI
- r of rpads is misleading, particularly if we have a circle - r of rpads is misleading, particularly if we have a circle
- using variables in a measurement offset causes a crash because evaluation
takes place after all table entries have been visited
Code cleanup: Code cleanup:
- merge edit_unique with edit_name - merge edit_unique with edit_name

11
fped.c
View File

@ -56,13 +56,10 @@ int main(int argc, char **argv)
int error; int error;
int batch_write_kicad = 0, batch_write_ps = 0; int batch_write_kicad = 0, batch_write_ps = 0;
int c; int c;
int have_gui = !getenv("FPED_NO_GUI");
if (have_gui) { error = gui_init(&argc, &argv);
error = gui_init(&argc, &argv); if (error)
if (error) return error;
return error;
}
while ((c = getopt(argc, argv, "kp")) != EOF) while ((c = getopt(argc, argv, "kp")) != EOF)
switch (c) { switch (c) {
@ -106,7 +103,7 @@ int main(int argc, char **argv)
write_kicad(); write_kicad();
if (batch_write_ps) if (batch_write_ps)
write_ps(); write_ps();
if (have_gui && !batch_write_kicad && !batch_write_ps) { if (!batch_write_kicad && !batch_write_ps) {
error = gui_main(); error = gui_main();
if (error) if (error)
return error; return error;

13
gui.c
View File

@ -139,6 +139,15 @@ static void make_tool_bar(GtkWidget *hbox, GdkDrawable *drawable)
} }
static void cleanup_tool_bar(void)
{
g_object_unref(stuff_image[0]);
g_object_unref(stuff_image[1]);
g_object_unref(meas_image[0]);
g_object_unref(meas_image[1]);
}
static void make_top_bar(GtkWidget *vbox) static void make_top_bar(GtkWidget *vbox)
{ {
GtkWidget *hbox; GtkWidget *hbox;
@ -248,5 +257,9 @@ int gui_main(void)
gtk_main(); gtk_main();
gui_cleanup_style();
gui_cleanup_tools();
cleanup_tool_bar();
return 0; return 0;
} }

View File

@ -74,3 +74,9 @@ void gui_setup_style(GdkDrawable *drawable)
item_list_font = pango_font_description_from_string(ITEM_LIST_FONT); item_list_font = pango_font_description_from_string(ITEM_LIST_FONT);
} }
void gui_cleanup_style(void)
{
pango_font_description_free(item_list_font);
}

View File

@ -115,5 +115,6 @@ extern GdkGC *gc_frame[mode_n];
extern PangoFontDescription *item_list_font; extern PangoFontDescription *item_list_font;
void gui_setup_style(GdkDrawable *drawable); void gui_setup_style(GdkDrawable *drawable);
void gui_cleanup_style(void);
#endif /* !GUI_STYLE_H */ #endif /* !GUI_STYLE_H */

View File

@ -1044,3 +1044,13 @@ GtkWidget *gui_setup_tools(GdkDrawable *drawable)
return bar; return bar;
} }
void gui_cleanup_tools(void)
{
g_object_unref(frame_image);
g_object_unref(frame_image_locked);
g_object_unref(frame_image_ready);
g_object_unref(delete_image[0]);
g_object_unref(delete_image[1]);
}

View File

@ -77,5 +77,6 @@ void tool_selected_inst(struct inst *inst);
void tool_reset(void); void tool_reset(void);
GtkWidget *gui_setup_tools(GdkDrawable *drawable); GtkWidget *gui_setup_tools(GdkDrawable *drawable);
void gui_cleanup_tools(void);
#endif /* !GUI_TOOL_H */ #endif /* !GUI_TOOL_H */

37
inst.c
View File

@ -803,18 +803,28 @@ static struct inst_ops meas_ops = {
}; };
int inst_meas(struct obj *obj, static struct inst *find_meas_hint(const struct obj *obj)
struct coord from, struct coord to, unit_type offset) {
struct inst *inst;
for (inst = curr_pkg->insts[ip_meas]; inst; inst = inst->next)
if (inst->obj == obj)
break;
return inst;
}
int inst_meas(struct obj *obj, struct coord from, struct coord to)
{ {
struct inst *inst; struct inst *inst;
struct coord a1, b1; struct coord a1, b1;
inst = add_inst(&meas_ops, ip_meas, from); inst = find_meas_hint(obj);
inst->obj = obj; assert(inst);
inst->base = from;
inst->u.meas.end = to; inst->u.meas.end = to;
inst->u.meas.offset = offset;
inst->active = 1; /* measurements are always active */
/* @@@ we still need to consider the text size as well */ /* @@@ we still need to consider the text size as well */
update_bbox(&inst->bbox, from);
update_bbox(&inst->bbox, to); update_bbox(&inst->bbox, to);
project_meas(inst, &a1, &b1); project_meas(inst, &a1, &b1);
update_bbox(&inst->bbox, a1); update_bbox(&inst->bbox, a1);
@ -824,6 +834,21 @@ int inst_meas(struct obj *obj,
} }
void inst_meas_hint(struct obj *obj, unit_type offset)
{
static const struct coord zero = { 0, 0 };
struct inst *inst;
inst = find_meas_hint(obj);
if (inst)
return;
inst = add_inst(&meas_ops, ip_meas, zero);
inst->obj = obj;
inst->u.meas.offset = offset;
inst->active = 1; /* measurements are always active */
}
/* ----- direct editing of objects ----------------------------------------- */ /* ----- direct editing of objects ----------------------------------------- */

4
inst.h
View File

@ -164,8 +164,8 @@ int inst_rect(struct obj *obj, struct coord a, struct coord b, unit_type width);
int inst_pad(struct obj *obj, const char *name, struct coord a, struct coord b); int inst_pad(struct obj *obj, const char *name, struct coord a, struct coord b);
int inst_arc(struct obj *obj, struct coord center, struct coord start, int inst_arc(struct obj *obj, struct coord center, struct coord start,
struct coord stop, unit_type width); struct coord stop, unit_type width);
int inst_meas(struct obj *obj, struct coord from, struct coord to, int inst_meas(struct obj *obj, struct coord from, struct coord to);
unit_type offset); void inst_meas_hint(struct obj *obj, unit_type offset);
void inst_begin_active(int active); void inst_begin_active(int active);
void inst_end_active(void); void inst_end_active(void);

31
leak.supp Normal file
View File

@ -0,0 +1,31 @@
{
gtk_internal
Memcheck:Leak
...
fun:gtk_init
}
{
lex
Memcheck:Leak
fun:malloc
...
fun:yyensure_buffer_stack
...
}
{
pango_leaks_like_crazy
Memcheck:Leak
...
fun:pango_*
...
}
{
gdk_pixbuf_new_from_xpm_data_leaks_through_dlopen
Memcheck:Leak
...
fun:dlopen
...
}

View File

@ -1,13 +1,4 @@
#!/bin/sh #!/bin/sh
#valgrind --leak-check=full --show-reachable=yes --suppressions=leak.supp \ valgrind --leak-check=full --show-reachable=yes --num-callers=50 \
# ./fped "$@" --suppressions=leak.supp \
#
# Seems that we can't suppress warnings from gtk_init, so we use FPED_NO_GUI
# to avoid bringing up Gtk+ at all.
#
FPED_NO_GUI=y valgrind --leak-check=full --show-reachable=yes \
./fped "$@" ./fped "$@"
#valgrind --leak-check=full --show-reachable=no \
# ./fped "$@"

13
meas.c
View File

@ -231,7 +231,6 @@ static int instantiate_meas_pkg(void)
const struct meas *meas; const struct meas *meas;
struct coord a0, b0; struct coord a0, b0;
lt_op_type lt; lt_op_type lt;
struct num offset;
for (obj = root_frame->objs; obj; obj = obj->next) { for (obj = root_frame->objs; obj; obj = obj->next) {
if (obj->type != ot_meas) if (obj->type != ot_meas)
@ -250,18 +249,8 @@ static int instantiate_meas_pkg(void)
b0 = meas_find_max(lt, b0 = meas_find_max(lt,
curr_pkg->samples[meas->high->n]); curr_pkg->samples[meas->high->n]);
if (!meas->offset)
offset.n = 0;
else {
offset = eval_unit(meas->offset, root_frame);
if (is_undef(offset)) {
instantiation_error = obj;
return 0;
}
}
inst_meas(obj, inst_meas(obj,
meas->inverted ? b0 : a0, meas->inverted ? a0 : b0, meas->inverted ? b0 : a0, meas->inverted ? a0 : b0);
offset.n);
} }
return 1; return 1;
} }

13
obj.c
View File

@ -94,10 +94,15 @@ error:
static int generate_objs(struct frame *frame, struct coord base, int active) static int generate_objs(struct frame *frame, struct coord base, int active)
{ {
static const struct num zero_offset = {
.type = nt_mm,
.exponent = 0,
.n = 0,
};
struct obj *obj; struct obj *obj;
char *name; char *name;
int ok; int ok;
struct num width; struct num width, offset;
for (obj = frame->objs; obj; obj = obj->next) for (obj = frame->objs; obj; obj = obj->next)
switch (obj->type) { switch (obj->type) {
@ -150,6 +155,12 @@ static int generate_objs(struct frame *frame, struct coord base, int active)
goto error; goto error;
break; break;
case ot_meas: case ot_meas:
assert(frame == root_frame);
offset = eval_unit_default(obj->u.meas.offset, frame,
zero_offset);
if (is_undef(offset))
goto error;
inst_meas_hint(obj, offset.n);
break; break;
default: default:
abort(); abort();