More work on tooltips and a build fix.

- Makefile: use PID in temporary file name in PPM to XPM conversion, so that we
  don't get mysterious failures in parallel builds
- gui_util.c (debug_save_pixbuf, debug_save_widget): helper functions to debug
  pixbuf and widget content
- Makefile: added target "montage" to show the images recorded with
  debug_save_pixbuf and debug_save_widget
- gui_over.c: when debugging, record the saves pixbuf in files
- gui_tool.c (tool_hover): removed unnecessary initialization
- added infrastructure for tooltips on the canvas (doesn't work properly yet)



git-svn-id: http://svn.openmoko.org/trunk/eda/fped@5769 99fdad57-331a-0410-800a-d7fa5415bdb3
This commit is contained in:
werner 2010-01-02 12:55:34 +00:00
parent 329b8306aa
commit 14f21c0aee
8 changed files with 129 additions and 16 deletions

View File

@ -1,8 +1,8 @@
#
# Makefile - Makefile of fped, the footprint editor
#
# Written 2009 by Werner Almesberger
# Copyright 2009 by Werner Almesberger
# Written 2009, 2010 by Werner Almesberger
# Copyright 2009, 2010 by Werner Almesberger
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -78,7 +78,7 @@ endif
# ----- Rules -----------------------------------------------------------------
.PHONY: all dep depend clean install uninstall manual upload-manual
.PHONY: update
.PHONY: update montage
.SUFFIXES: .fig .xpm .ppm
@ -92,10 +92,10 @@ endif
# ppmtoxpm is very chatty, so we suppress its stderr
.ppm.xpm:
$(GEN) ppmcolormask white $< >_tmp && \
ppmtoxpm -name xpm_`basename $@ .xpm` -alphamask _tmp \
$< >$@ 2>/dev/null && rm -f _tmp || \
{ rm -f $@ _tmp; exit 1; }
$(GEN) export TMP=_tmp$$$$; ppmcolormask white $< >$$TMP && \
ppmtoxpm -name xpm_`basename $@ .xpm` -alphamask $$TMP \
$< >$@ 2>/dev/null && rm -f $$TMP || \
{ rm -f $@ $$TMP; exit 1; }
all: fped
@ -129,6 +129,11 @@ upload-manual: manual
scp $(XPMS:%.xpm=manual/%.png) $(PNGS:%=manual/%) \
$(UPLOAD)/manual/
# ----- Debugging help --------------------------------------------------------
montage:
montage -label %f -frame 3 __dbg????.png png:- | display -
# ----- Dependencies ----------------------------------------------------------
dep depend .depend: lex.yy.c y.tab.h y.tab.c
@ -143,6 +148,7 @@ endif
clean:
rm -f $(OBJS) $(XPMS:%=icons/%) $(XPMS:%.xpm=icons/%.ppm)
rm -f lex.yy.c y.tab.c y.tab.h y.output .depend
rm -f __dbg????.png _tmp*
# ----- Install / uninstall ---------------------------------------------------

View File

@ -1,8 +1,8 @@
/*
* gui_canvas.c - GUI, canvas
*
* Written 2009 by Werner Almesberger
* Copyright 2009 by Werner Almesberger
* Written 2009, 2010 by Werner Almesberger
* Copyright 2009, 2010 by Werner Almesberger
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -131,10 +131,13 @@ void redraw(void)
gdk_draw_rectangle(draw_ctx.widget->window,
instantiation_error ? gc_bg_error : gc_bg, TRUE, 0, 0, aw, ah);
DPRINTF("--- redraw: inst_draw ---");
inst_draw();
if (highlight)
highlight();
DPRINTF("--- redraw: tool_redraw ---");
tool_redraw();
DPRINTF("--- redraw: done ---");
}
@ -444,6 +447,23 @@ static gboolean leave_notify_event(GtkWidget *widget, GdkEventCrossing *event,
}
/* ----- tooltip ----------------------------------------------------------- */
static gboolean canvas_tooltip(GtkWidget *widget, gint x, gint y,
gboolean keyboard_mode, GtkTooltip *tooltip, gpointer user_data)
{
struct coord pos = canvas_to_coord(x, y);
const char *res;
res = tool_tip(pos);
if (!res)
return FALSE;
gtk_tooltip_set_markup(tooltip, res);
return TRUE;
}
/* ----- canvas setup ------------------------------------------------------ */
@ -491,6 +511,10 @@ GtkWidget *make_canvas(void)
g_signal_connect(G_OBJECT(canvas), "leave_notify_event",
G_CALLBACK(leave_notify_event), NULL);
gtk_widget_set(canvas, "has-tooltip", TRUE, NULL);
g_signal_connect(G_OBJECT(canvas), "query_tooltip",
G_CALLBACK(canvas_tooltip), NULL);
gtk_widget_set_events(canvas,
GDK_EXPOSE | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK |
GDK_KEY_PRESS_MASK |

View File

@ -1,8 +1,8 @@
/*
* gui_frame.c - GUI, frame window
*
* Written 2009 by Werner Almesberger
* Copyright 2009 by Werner Almesberger
* Written 2009, 2010 by Werner Almesberger
* Copyright 2009, 2010 by Werner Almesberger
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View File

@ -1,8 +1,8 @@
/*
* gui_over.c - GUI, canvas overlays
*
* Written 2009 by Werner Almesberger
* Copyright 2009 by Werner Almesberger
* Written 2009, 2010 by Werner Almesberger
* Copyright 2009, 2010 by Werner Almesberger
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -27,8 +27,10 @@
#if 0
#define DPRINTF(fmt, ...) fprintf(stderr, fmt "\n", ##__VA_ARGS__)
#define DSAVE(pix_buf) debug_save_pixbuf(pix_buf->buf)
#else
#define DPRINTF(fmt, ...)
#define DSAVE(buf)
#endif
@ -59,12 +61,14 @@ static struct coord over_pos;
static void draw_D(void)
{
buf_D = over_D_save_and_draw(over_D_user, over_pos);
DSAVE(buf_D);
}
static void draw_H(void)
{
buf_H = over_H_save_and_draw(over_H_user);
DSAVE(buf_H);
}

View File

@ -805,7 +805,7 @@ static struct inst *get_hover_inst(struct coord pos)
void tool_hover(struct coord pos)
{
struct inst *curr = NULL;
struct inst *curr;
curr = get_hover_inst(pos);
#if 0
@ -837,6 +837,39 @@ got:
}
/* ----- tooltip ----------------------------------------------------------- */
const char *tool_tip(struct coord pos)
{
struct inst *inst;
inst = get_hover_inst(pos);
if (!inst)
return NULL;
/*
* Tooltips don't work properly yet, so we return NULL here. The
* tooltips themselves are fine, but the expose event generated when
* removing the tooltip window upsets the overlay logic for some yet
* unknown reason.
*/
return NULL;
/*
* The logic below follows exactly what happens in get_hover_inst.
*/
if (drag.new)
return "End here";
if (drag.anchors_n)
return "Move here";
if (selected_inst)
return "Move this point";
return "Start here";
}
/* ----- mouse actions ----------------------------------------------------- */

View File

@ -1,8 +1,8 @@
/*
* gui_tool.h - GUI, tool bar
*
* Written 2009 by Werner Almesberger
* Copyright 2009 by Werner Almesberger
* Written 2009, 2010 by Werner Almesberger
* Copyright 2009, 2010 by Werner Almesberger
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -47,6 +47,7 @@ void do_move_to_arc(struct inst *inst, struct inst *to, int i);
void tool_dehover(void);
void tool_hover(struct coord pos);
const char *tool_tip(struct coord pos);
int tool_consider_drag(struct coord pos);
void tool_drag(struct coord to);
void tool_cancel_drag(void);

View File

@ -332,6 +332,48 @@ void render_text(GdkDrawable *da, GdkGC *gc, int x, int y, double angle,
}
/* ----- Debugging support ------------------------------------------------- */
/*
* View with make montage or something like
*
* montage -label %f -frame 3 __dbg????.png png:- | display -
*/
void debug_save_pixbuf(GdkPixbuf *buf)
{
static int buf_num = 0;
char name[20]; /* plenty */
sprintf(name, "__dbg%04d.png", buf_num++);
gdk_pixbuf_save(buf, name, "png", NULL, NULL);
fprintf(stderr, "saved to %s\n", name);
}
/*
* gtk_widget_get_snapshot seems to use an expose event to do the drawing. This
* means that we can't call debug_save_widget from the expose event handler of
* the widget being dumped.
*/
void debug_save_widget(GtkWidget *widget)
{
GdkPixmap *pixmap;
GdkPixbuf *pixbuf;
gint w, h;
pixmap = gtk_widget_get_snapshot(widget, NULL);
gdk_drawable_get_size(GDK_DRAWABLE(pixmap), &w, &h);
pixbuf = gdk_pixbuf_get_from_drawable(NULL, GDK_DRAWABLE(pixmap),
NULL, 0, 0, 0, 0, w, h);
debug_save_pixbuf(pixbuf);
gdk_pixmap_unref(pixmap);
g_object_unref(pixbuf);
}
/* ----- kill the content of a container ----------------------------------- */

View File

@ -74,6 +74,9 @@ void render_text(GdkDrawable *da, GdkGC *gc, int x, int y, double angle,
const char *s, const char *font, double xalign, double yalign,
int xmax, int ymax);
void debug_save_pixbuf(GdkPixbuf *buf);
void debug_save_widget(GtkWidget *widget);
void destroy_all_children(GtkContainer *container);
#endif /* !GUI_UTIL_H */