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