Ever since I met Autolisp at a trade show as a kid I thought that any
self-respecting CAD program should expose a programming interface to a
user, that is accessible in its GUI. This patch was surprisingly little
work!
These are the commits I've pushed to branch berndj/abstract-symbols at
git://repo.or.cz/srv/git/geda-gaf/berndj.git
One or two of the hunks might not apply cleanly to master. To apply,
you can safely delete the "SCM rest" parameter I've added (for other
reasons) to the i_callback_* functions.
commit f75a5f1e6e09b837ce058cc55a6fe11e8ba08106
Author: Bernd Jendrissek <[EMAIL PROTECTED]>
Date: Tue Jul 8 01:13:49 2008 +0200
Use g_scm_c_eval_string_protected() so we don't crash on bad forms.
diff --git a/gschem/src/x_window.c b/gschem/src/x_window.c
index f8516a4..ea0f21e 100644
--- a/gschem/src/x_window.c
+++ b/gschem/src/x_window.c
@@ -326,7 +326,7 @@ static void x_window_invoke_macro(GtkEntry *entry, void
*userdata)
{
GSCHEM_TOPLEVEL *w_current = userdata;
- scm_c_eval_string(gtk_entry_get_text(entry));
+ g_scm_c_eval_string_protected(gtk_entry_get_text(entry));
gtk_widget_hide(w_current->macro_box);
gtk_widget_grab_focus(w_current->drawing_area);
}
commit f0d0e594e0487614095402dd1cfbc34a085fc533
Author: Bernd Jendrissek <[EMAIL PROTECTED]>
Date: Mon Jul 7 04:46:19 2008 +0200
Invoke scheme forms from a command prompt below the drawing area.
diff --git a/gschem/include/gschem_struct.h b/gschem/include/gschem_struct.h
index 376b28b..30d9620 100644
--- a/gschem/include/gschem_struct.h
+++ b/gschem/include/gschem_struct.h
@@ -21,6 +21,8 @@ struct st_gschem_toplevel {
GtkObject *h_adjustment;
GtkObject *v_adjustment;
+ GtkWidget *macro_box;
+ GtkWidget *macro_entry;
GtkWidget *left_label;
GtkWidget *middle_label;
GtkWidget *right_label;
diff --git a/gschem/include/prototype.h b/gschem/include/prototype.h
index 26f15ef..08a3455 100644
--- a/gschem/include/prototype.h
+++ b/gschem/include/prototype.h
@@ -84,6 +84,7 @@ SCM g_keys_edit_unlock(SCM rest);
SCM g_keys_edit_linetype(SCM rest);
SCM g_keys_edit_filltype(SCM rest);
SCM g_keys_edit_translate(SCM rest);
+SCM g_keys_edit_invoke_macro(SCM rest);
SCM g_keys_edit_embed(SCM rest);
SCM g_keys_edit_unembed(SCM rest);
SCM g_keys_edit_update(SCM rest);
@@ -344,6 +345,7 @@ void i_callback_edit_mirror_hotkey(SCM rest, gpointer data,
guint callback_actio
void i_callback_edit_lock(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
void i_callback_edit_unlock(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
void i_callback_edit_translate(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
+void i_callback_edit_invoke_macro(SCM rest, gpointer data, guint
callback_action, GtkWidget *widget);
void i_callback_edit_embed(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
void i_callback_edit_unembed(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
void i_callback_edit_update(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
diff --git a/gschem/lib/system-gschemrc.in b/gschem/lib/system-gschemrc.in
index 4c69a8a..14fedad 100644
--- a/gschem/lib/system-gschemrc.in
+++ b/gschem/lib/system-gschemrc.in
@@ -1212,6 +1212,7 @@
("w" . edit-linetype)
("f" . edit-filltype)
("t" . edit-translate)
+ (":" . edit-invoke-macro)
("b" . edit-embed)
("u" . edit-unembed)
("p" . edit-update)
@@ -1431,6 +1432,7 @@
("Line Width & Type..." edit-linetype edit-linetype)
("Fill Type..." edit-filltype edit-filltype)
("Symbol Translate..." edit-translate edit-translate)
+ ("Invoke Macro" edit-invoke-macro edit-invoke-macro)
("Embed Component/Picture" edit-embed edit-embed)
("Unembed Component/Picture" edit-unembed edit-unembed)
("Update Component" edit-update edit-update)
diff --git a/gschem/src/g_keys.c b/gschem/src/g_keys.c
index b99efcb..9e6aecf 100644
--- a/gschem/src/g_keys.c
+++ b/gschem/src/g_keys.c
@@ -248,6 +248,7 @@ DEFINE_G_KEYS(edit_unlock)
DEFINE_G_KEYS(edit_linetype)
DEFINE_G_KEYS(edit_filltype)
DEFINE_G_KEYS(edit_translate)
+DEFINE_G_KEYS(edit_invoke_macro)
DEFINE_G_KEYS(edit_embed)
DEFINE_G_KEYS(edit_unembed)
DEFINE_G_KEYS(edit_update)
diff --git a/gschem/src/g_register.c b/gschem/src/g_register.c
index 29bbbf4..13aa48a 100644
--- a/gschem/src/g_register.c
+++ b/gschem/src/g_register.c
@@ -209,6 +209,7 @@ static struct gsubr_t gschem_funcs[] = {
{ "edit-linetype", 0, 0, 0, g_keys_edit_linetype },
{ "edit-filltype", 0, 0, 0, g_keys_edit_filltype },
{ "edit-translate", 0, 0, 0, g_keys_edit_translate },
+ { "edit-invoke-macro", 0, 0, 0, g_keys_edit_invoke_macro },
{ "edit-embed", 0, 0, 0, g_keys_edit_embed },
{ "edit-unembed", 0, 0, 0, g_keys_edit_unembed },
{ "edit-update", 0, 0, 0, g_keys_edit_update },
diff --git a/gschem/src/i_callbacks.c b/gschem/src/i_callbacks.c
index b5726bb..a60bb6f 100644
--- a/gschem/src/i_callbacks.c
+++ b/gschem/src/i_callbacks.c
@@ -1057,6 +1057,16 @@ DEFINE_I_CALLBACK(edit_translate)
translate_dialog(w_current);
}
+DEFINE_I_CALLBACK(edit_invoke_macro)
+{
+ GSCHEM_TOPLEVEL *w_current = (GSCHEM_TOPLEVEL*) data;
+
+ exit_if_null(w_current);
+
+ gtk_widget_show(w_current->macro_box);
+ gtk_widget_grab_focus(w_current->macro_entry);
+}
+
/*! \todo Finish function documentation!!!
* \brief
* \par Function Description
diff --git a/gschem/src/x_window.c b/gschem/src/x_window.c
index b535713..f8516a4 100644
--- a/gschem/src/x_window.c
+++ b/gschem/src/x_window.c
@@ -322,6 +322,15 @@ static GtkWidget *x_window_stock_pixmap(const char *stock,
GSCHEM_TOPLEVEL *w_cu
return wpixmap;
}
+static void x_window_invoke_macro(GtkEntry *entry, void *userdata)
+{
+ GSCHEM_TOPLEVEL *w_current = userdata;
+
+ scm_c_eval_string(gtk_entry_get_text(entry));
+ gtk_widget_hide(w_current->macro_box);
+ gtk_widget_grab_focus(w_current->drawing_area);
+}
+
/*! \todo Finish function documentation!!!
* \brief
* \par Function Description
@@ -542,6 +551,18 @@ void x_window_create_main(GSCHEM_TOPLEVEL *w_current)
w_current);
}
+ /* macro box */
+ w_current->macro_entry = gtk_entry_new();
+ g_signal_connect(w_current->macro_entry, "activate",
+ G_CALLBACK(&x_window_invoke_macro), w_current);
+
+ w_current->macro_box = gtk_hbox_new(FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(w_current->macro_box), w_current->macro_entry,
+ FALSE, FALSE, 2);
+ gtk_container_border_width(GTK_CONTAINER(w_current->macro_box), 1);
+ gtk_box_pack_start (GTK_BOX (main_box), w_current->macro_box,
+ FALSE, FALSE, 0);
+
/* bottom box */
bottom_box = gtk_hbox_new(FALSE, 0);
gtk_container_border_width(GTK_CONTAINER(bottom_box), 1);
@@ -599,6 +620,7 @@ void x_window_create_main(GSCHEM_TOPLEVEL *w_current)
FALSE, 10);
gtk_widget_show_all (w_current->main_window);
+ gtk_widget_hide(w_current->macro_box);
w_current->window = w_current->drawing_area->window;
_______________________________________________
geda-dev mailing list
[email protected]
http://www.seul.org/cgi-bin/mailman/listinfo/geda-dev