r5343 - developers/werner/fped

werner at docs.openmoko.org werner at docs.openmoko.org
Thu Jul 30 23:18:07 CEST 2009


Author: werner
Date: 2009-07-30 23:18:07 +0200 (Thu, 30 Jul 2009)
New Revision: 5343

Modified:
   developers/werner/fped/gui.c
   developers/werner/fped/gui_canvas.c
   developers/werner/fped/gui_canvas.h
   developers/werner/fped/obj.c
   developers/werner/fped/obj.h
Log:
- disentangled active path vs. active frame logic
- frame selection now marks the selection in the frame list
- reordered gui.c to avoid forward reference



Modified: developers/werner/fped/gui.c
===================================================================
--- developers/werner/fped/gui.c	2009-07-30 20:24:37 UTC (rev 5342)
+++ developers/werner/fped/gui.c	2009-07-30 21:18:07 UTC (rev 5343)
@@ -19,6 +19,7 @@
 #include "obj.h"
 #include "unparse.h"
 #include "gui_util.h"
+#include "gui_style.h"
 #include "gui_status.h"
 #include "gui_canvas.h"
 #include "gui.h"
@@ -29,8 +30,9 @@
 static GtkWidget *vars_box;
 
 
-static void build_vars(GtkWidget *vbox, struct frame *frame);
+/* ----- menu bar ---------------------------------------------------------- */
 
+
 static void make_menu_bar(GtkWidget *vbox)
 {
 	GtkWidget *bar;
@@ -53,36 +55,9 @@
 }
 
 
-static gboolean frame_select_event(GtkWidget *widget, GdkEventButton *event,
-     gpointer data)
-{
-	inst_deselect();
-	active_frame = data;
-	instantiate();
-	build_vars(vars_box, active_frame);
-	redraw();
-	return TRUE;
-}
+/* ----- variable list ----------------------------------------------------- */
 
 
-static void show_frames(GtkWidget *vbox)
-{
-	struct frame *f;
-	GtkWidget *label;
-
-	for (f = frames; f; f = f->next) {
-		label = label_in_box_new(f->name ? f->name : "(root)");
-		gtk_box_pack_start(GTK_BOX(vbox), box_of_label(label),
-		    FALSE, TRUE, 0);
-		gtk_misc_set_padding(GTK_MISC(label), 2, 2);
-		gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
-
-		g_signal_connect(G_OBJECT(box_of_label(label)),
-		    "button_press_event", G_CALLBACK(frame_select_event), f);
-	}
-}
-
-
 static void add_sep(GtkWidget *box, int size)
 {
 	GtkWidget *sep;
@@ -94,6 +69,9 @@
 }
 
 
+/* ----- GUI construction -------------------------------------------------- */
+
+
 static void build_assignment(GtkWidget *vbox, struct frame *frame,
      struct table *table)
 {
@@ -212,6 +190,55 @@
 }
 
 
+/* ----- frame list -------------------------------------------------------- */
+
+
+static void select_frame(struct frame *frame)
+{
+	if (active_frame) {
+		label_in_box_bg(active_frame->label, "grey");
+		inst_deselect();
+	}
+	active_frame = frame;
+	instantiate();
+	label_in_box_bg(active_frame->label, "pink");
+	build_vars(vars_box, active_frame);
+	redraw();
+}
+
+
+static gboolean frame_select_event(GtkWidget *widget, GdkEventButton *event,
+     gpointer data)
+{
+	select_frame(data);
+	return TRUE;
+}
+
+
+static void show_frames(GtkWidget *vbox)
+{
+	struct frame *f;
+	GtkWidget *label;
+
+	for (f = frames; f; f = f->next) {
+		label = label_in_box_new(f->name ? f->name : "(root)");
+		gtk_box_pack_start(GTK_BOX(vbox), box_of_label(label),
+		    FALSE, TRUE, 0);
+		gtk_misc_set_padding(GTK_MISC(label), 2, 2);
+		gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
+
+		label_in_box_bg(label, "grey");
+
+		g_signal_connect(G_OBJECT(box_of_label(label)),
+		    "button_press_event", G_CALLBACK(frame_select_event), f);
+		f->label = label;
+	}
+}
+
+
+/* ----- central screen area ----------------------------------------------- */
+
+
 static void make_center_area(GtkWidget *vbox)
 {
 	GtkWidget *hbox, *vars, *paned;
@@ -257,6 +284,9 @@
 }
 
 
+/* ----- GUI construction -------------------------------------------------- */
+
+
 static void make_screen(GtkWidget *window)
 {
 	GtkWidget *vbox;
@@ -295,6 +325,10 @@
 
 	gtk_widget_show_all(root);
 
+	gui_setup_style(root->window);
+	init_canvas();
+	select_frame(frames);
+
 	gtk_main();
 
 	return 0;

Modified: developers/werner/fped/gui_canvas.c
===================================================================
--- developers/werner/fped/gui_canvas.c	2009-07-30 20:24:37 UTC (rev 5342)
+++ developers/werner/fped/gui_canvas.c	2009-07-30 21:18:07 UTC (rev 5343)
@@ -237,16 +237,11 @@
      gpointer data)
 {
 	static int first = 1;
-
 	if (first) {
-		gui_setup_style(widget->window);
-		center();
-		auto_scale();
+		init_canvas();
 		first = 0;
 	}
-
 	redraw();
-
 	return TRUE;
 }
 
@@ -272,6 +267,19 @@
 /* ----- canvas setup ------------------------------------------------------ */
 
 
+/*
+ * Note that we call init_canvas twice: first to make sure we'll make it safely
+ * through select_frame, and the second time to set the geometry for the actual
+ * screen.
+ */
+
+void init_canvas(void)
+{
+	center();
+	auto_scale();
+}
+
+
 GtkWidget *make_canvas(void)
 {
 	GtkWidget *canvas;

Modified: developers/werner/fped/gui_canvas.h
===================================================================
--- developers/werner/fped/gui_canvas.h	2009-07-30 20:24:37 UTC (rev 5342)
+++ developers/werner/fped/gui_canvas.h	2009-07-30 21:18:07 UTC (rev 5343)
@@ -20,5 +20,6 @@
 void redraw(void);
 
 GtkWidget *make_canvas(void);
+void init_canvas(void);
 
 #endif /* !GUI_CANVAS_H */

Modified: developers/werner/fped/obj.c
===================================================================
--- developers/werner/fped/obj.c	2009-07-30 20:24:37 UTC (rev 5342)
+++ developers/werner/fped/obj.c	2009-07-30 21:18:07 UTC (rev 5343)
@@ -29,7 +29,7 @@
 
 
 static int generate_frame(struct frame *frame, struct coord base,
-    const struct frame *parent);
+    const struct frame *parent, int active);
 
 
 static int is_id(char c, int first)
@@ -133,7 +133,7 @@
 }
 
 
-static int generate_objs(struct frame *frame, struct coord base)
+static int generate_objs(struct frame *frame, struct coord base, int active)
 {
 	struct obj *obj;
 	char *name;
@@ -143,7 +143,7 @@
 		switch (obj->type) {
 		case ot_frame:
 			if (!generate_frame(obj->u.frame,
-			    obj->base ? obj->base->pos : base, frame))
+			    obj->base ? obj->base->pos : base, frame, active))
 				return 0;
 			break;
 		case ot_line:
@@ -184,8 +184,8 @@
 {
 	int ok;
 
-	inst_begin_active(active);
-	ok = generate_vecs(frame, base) && generate_objs(frame, base);
+	inst_begin_active(active && frame == active_frame);
+	ok = generate_vecs(frame, base) && generate_objs(frame, base, active);
 	inst_end_active();
 	return ok;
 }
@@ -256,7 +256,7 @@
 
 
 static int generate_frame(struct frame *frame, struct coord base,
-    const struct frame *parent)
+    const struct frame *parent, int active)
 {
 	int ok;
 
@@ -265,7 +265,7 @@
 	 */
 	inst_begin_frame(frame, base, frame == active_frame);
 	frame->curr_parent = parent;
-	ok = iterate_tables(frame, frame->tables, base, frame == active_frame);
+	ok = iterate_tables(frame, frame->tables, base, active);
 	inst_end_frame(frame);
 	return ok;
 }
@@ -277,7 +277,7 @@
 	int ok;
 
 	inst_start();
-	ok = generate_frame(frames, zero, NULL);
+	ok = generate_frame(frames, zero, NULL, 1);
 	if (ok)
 		inst_commit();
 	else

Modified: developers/werner/fped/obj.h
===================================================================
--- developers/werner/fped/obj.h	2009-07-30 20:24:37 UTC (rev 5342)
+++ developers/werner/fped/obj.h	2009-07-30 21:18:07 UTC (rev 5343)
@@ -14,6 +14,8 @@
 #ifndef OBJ_H
 #define OBJ_H
 
+#include <gtk/gtk.h>
+
 #include "expr.h"
 #include "coord.h"
 
@@ -80,6 +82,9 @@
 
 	/* used during generation */
 	const struct frame *curr_parent;
+
+	/* for the GUI */
+	GtkWidget *label;
 };
 
 enum obj_type {




More information about the commitlog mailing list