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

Reply via email to