r5356 - developers/werner/fped

werner at docs.openmoko.org werner at docs.openmoko.org
Sat Aug 1 01:24:00 CEST 2009


Author: werner
Date: 2009-08-01 01:24:00 +0200 (Sat, 01 Aug 2009)
New Revision: 5356

Modified:
   developers/werner/fped/TODO
   developers/werner/fped/error.c
   developers/werner/fped/error.h
   developers/werner/fped/expr.h
   developers/werner/fped/gui.c
   developers/werner/fped/gui_status.c
   developers/werner/fped/gui_status.h
   developers/werner/fped/gui_style.c
   developers/werner/fped/gui_style.h
   developers/werner/fped/util.c
   developers/werner/fped/util.h
Log:
- frame color wasn't set back to "selected" when selecting an item while 
  editing the frame name
- added "extern" to all variable declarations in headers
- new functions stralloc_printf and stralloc_vprintf to printf into a malloc'ed
  buffer
- errors during instantiation are now reported to the GUI



Modified: developers/werner/fped/TODO
===================================================================
--- developers/werner/fped/TODO	2009-07-31 22:16:10 UTC (rev 5355)
+++ developers/werner/fped/TODO	2009-07-31 23:24:00 UTC (rev 5356)
@@ -40,6 +40,7 @@
 
 Future directions:
 - future: consider using cairo instead of gdk
+- live update of value when entering strings and expressions ?
 - advanced: non-standard solder mask
 - advanced: solder paste exceptions (subtractive, additive)
 - advanced: silk line width

Modified: developers/werner/fped/error.c
===================================================================
--- developers/werner/fped/error.c	2009-07-31 22:16:10 UTC (rev 5355)
+++ developers/werner/fped/error.c	2009-07-31 23:24:00 UTC (rev 5356)
@@ -15,14 +15,16 @@
 #include <stdlib.h>
 #include <stdio.h>
 
+#include "util.h"
 #include "error.h"
 
 
+extern char *yytext;
+
 int lineno = 1;
+void (*reporter)(const char *s) = report_to_stderr;
 
-extern char *yytext;
 
-
 void __attribute__((noreturn)) yyerrorf(const char *fmt, ...)
 {
 	va_list ap;
@@ -42,13 +44,20 @@
 }
 
 
+void report_to_stderr(const char *s)
+{
+	fprintf(stderr, "%s\n", s);
+}
+
+
 void fail(const char *fmt, ...)
 {
 	va_list ap;
+	char *s;
 
 	va_start(ap, fmt);
-	vfprintf(stderr, fmt, ap);
+	s = stralloc_vprintf(fmt, ap);
 	va_end(ap);
-	fprintf(stderr, "\n");
+	reporter(s);
+	free(s);
 }
-

Modified: developers/werner/fped/error.h
===================================================================
--- developers/werner/fped/error.h	2009-07-31 22:16:10 UTC (rev 5355)
+++ developers/werner/fped/error.h	2009-07-31 23:24:00 UTC (rev 5356)
@@ -15,12 +15,15 @@
 #define ERROR_H
 
 
-int lineno;
+extern int lineno;
 
+extern void (*reporter)(const char *s);
 
+
 void __attribute__((noreturn)) yyerrorf(const char *fmt, ...);
 void __attribute__((noreturn)) yyerror(const char *s);
 
+void report_to_stderr(const char *s);
 void fail(const char *fmt, ...);
 
 #endif /* !ERROR_H */

Modified: developers/werner/fped/expr.h
===================================================================
--- developers/werner/fped/expr.h	2009-07-31 22:16:10 UTC (rev 5355)
+++ developers/werner/fped/expr.h	2009-07-31 23:24:00 UTC (rev 5356)
@@ -52,7 +52,7 @@
 };
 
 
-struct num undef;
+extern struct num undef;
 
 
 #define	is_undef(num)		((num).type == nt_none)

Modified: developers/werner/fped/gui.c
===================================================================
--- developers/werner/fped/gui.c	2009-07-31 22:16:10 UTC (rev 5355)
+++ developers/werner/fped/gui.c	2009-07-31 23:24:00 UTC (rev 5356)
@@ -371,9 +371,24 @@
 }
 
 
+static void unselect_frame(void *data)
+{
+	struct frame *frame= data;
+
+	/*
+	 * "unselect" means in this context that the selection has moved
+	 * elsewhere. However, this does not necessarily change the frame.
+	 * (And, in fact, since we rebuild the frame list anyway, the color
+	 * change here doesn't matter if selecting a different frame.)
+	 * So we revert from "editing" to "selected".
+	 */
+        label_in_box_bg(frame->label, COLOR_FRAME_SELECTED);
+}
+
+
 static void edit_frame(struct frame *frame)
 {
-	inst_select_outside(frame, NULL);
+	inst_select_outside(frame, unselect_frame);
 	label_in_box_bg(frame->label, COLOR_FRAME_EDITING);
 	status_set_name(frame->name);
 	edit_unique(&frame->name, validate_frame_name, frame);
@@ -480,6 +495,7 @@
 
 void change_world(void)
 {
+	status_begin_reporting();
 	instantiate();
 	label_in_box_bg(active_frame->label, COLOR_FRAME_SELECTED);
 	build_frames(frames_box);

Modified: developers/werner/fped/gui_status.c
===================================================================
--- developers/werner/fped/gui_status.c	2009-07-31 22:16:10 UTC (rev 5355)
+++ developers/werner/fped/gui_status.c	2009-07-31 23:24:00 UTC (rev 5356)
@@ -19,6 +19,7 @@
 
 #include "util.h"
 #include "coord.h"
+#include "error.h"
 #include "unparse.h"
 #include "gui_util.h"
 #include "gui_style.h"
@@ -48,10 +49,11 @@
 
 static void set_label(GtkWidget *label, const char *fmt, va_list ap)
 {
-	char buf[100]; /* @@@ enough :-) */
+	char *s;
 
-	vsprintf(buf, fmt, ap);
-	gtk_label_set_text(GTK_LABEL(label), buf);
+	s = stralloc_vprintf(fmt, ap);
+	gtk_label_set_text(GTK_LABEL(label), s);
+	free(s);
 }
 
 
@@ -91,7 +93,8 @@
 	GdkColor col;
 
 	col = get_color(color);
-	gtk_widget_modify_base(GTK_WIDGET(status_entry), GTK_STATE_NORMAL, &col);
+	gtk_widget_modify_base(GTK_WIDGET(status_entry),
+	    GTK_STATE_NORMAL, &col);
 }
 
 
@@ -299,6 +302,37 @@
 }
 
 
+/* ----- status reports ---------------------------------------------------- */
+
+
+static gint context_id;
+static int have_msg = 0;
+
+
+static void clear_status_msg(void)
+{
+	if (have_msg) {
+		gtk_statusbar_pop(GTK_STATUSBAR(status_msg), context_id);
+		have_msg = 0;
+	}
+}
+
+
+static void report_to_gui(const char *s)
+{
+	if (!have_msg)
+		gtk_statusbar_push(GTK_STATUSBAR(status_msg), context_id, s);
+	have_msg = 1;
+}
+
+
+void status_begin_reporting(void)
+{
+	clear_status_msg();
+	reporter = report_to_gui;
+}
+
+
 /* ----- setup ------------------------------------------------------------- */
 
 
@@ -368,4 +402,7 @@
 
 	status_msg = gtk_statusbar_new();
 	gtk_box_pack_start(GTK_BOX(vbox), status_msg, FALSE, FALSE, 0);
+
+	context_id = gtk_statusbar_get_context_id(GTK_STATUSBAR(status_msg),
+	    "messages");
 }

Modified: developers/werner/fped/gui_status.h
===================================================================
--- developers/werner/fped/gui_status.h	2009-07-31 22:16:10 UTC (rev 5355)
+++ developers/werner/fped/gui_status.h	2009-07-31 23:24:00 UTC (rev 5356)
@@ -38,6 +38,8 @@
 
 void status_set_xy(struct coord coord);
 
+void status_begin_reporting(void);
+
 void make_status_area(GtkWidget *vbox) ;
 
 #endif /* !GUI_STATUS_H */

Modified: developers/werner/fped/gui_style.c
===================================================================
--- developers/werner/fped/gui_style.c	2009-07-31 22:16:10 UTC (rev 5355)
+++ developers/werner/fped/gui_style.c	2009-07-31 23:24:00 UTC (rev 5356)
@@ -22,6 +22,13 @@
 #define	INVALID	"#00ffff"
 
 
+GdkGC *gc_bg;
+GdkGC *gc_vec[mode_n];
+GdkGC *gc_obj[mode_n];
+GdkGC *gc_pad[mode_n];
+GdkGC *gc_frame[mode_n];
+
+
 static GdkGC *gc(const char *spec, int width)
 {
 	GdkGCValues gc_values = {

Modified: developers/werner/fped/gui_style.h
===================================================================
--- developers/werner/fped/gui_style.h	2009-07-31 22:16:10 UTC (rev 5355)
+++ developers/werner/fped/gui_style.h	2009-07-31 23:24:00 UTC (rev 5356)
@@ -61,11 +61,11 @@
 /* ----- canvas drawing styles --------------------------------------------- */
 
 
-GdkGC *gc_bg;
-GdkGC *gc_vec[mode_n];
-GdkGC *gc_obj[mode_n];
-GdkGC *gc_pad[mode_n];
-GdkGC *gc_frame[mode_n];
+extern GdkGC *gc_bg;
+extern GdkGC *gc_vec[mode_n];
+extern GdkGC *gc_obj[mode_n];
+extern GdkGC *gc_pad[mode_n];
+extern GdkGC *gc_frame[mode_n];
 
 
 void gui_setup_style(GdkDrawable *drawable);

Modified: developers/werner/fped/util.c
===================================================================
--- developers/werner/fped/util.c	2009-07-31 22:16:10 UTC (rev 5355)
+++ developers/werner/fped/util.c	2009-07-31 23:24:00 UTC (rev 5356)
@@ -11,12 +11,44 @@
  */
 
 
+#include <stdarg.h>
+#include <stdio.h>
 #include <string.h>
 
 #include "util.h"
 
 
 
+/* ----- printf buffer allocation ------------------------------------------ */
+
+
+char *stralloc_vprintf(const char *fmt, va_list ap)
+{
+	char *buf;
+	int n;
+
+	n = snprintf(NULL, 0, fmt, ap);
+	buf = alloc_size(n+1);
+	vsnprintf(buf, n+1, fmt, ap);
+	return buf;
+}
+
+
+char *stralloc_printf(const char *fmt, ...)
+{
+	va_list ap;
+	char *s;
+
+	va_start(ap, fmt);
+	s = stralloc_vprintf(fmt, ap);
+	va_end(ap);
+	return s;
+}
+
+
+/* ----- identifier syntax check ------------------------------------------- */
+
+
 int is_id(char c, int first) 
 {
 	if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '_')

Modified: developers/werner/fped/util.h
===================================================================
--- developers/werner/fped/util.h	2009-07-31 22:16:10 UTC (rev 5355)
+++ developers/werner/fped/util.h	2009-07-31 23:24:00 UTC (rev 5356)
@@ -14,6 +14,7 @@
 #ifndef UTIL_H
 #define UTIL_H
 
+#include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
 
@@ -46,6 +47,9 @@
 	strnalloc_tmp; })
 
 
+char *stralloc_vprintf(const char *fmt, va_list ap);
+char *stralloc_printf(const char *fmt, ...);
+
 int is_id(char c, int first);
 
 const char *unique(const char *s);




More information about the commitlog mailing list