From 9026f2088d1e223b44dd5ce06a2fb04a69e42844 Mon Sep 17 00:00:00 2001
From: Edward Hennessy <[EMAIL PROTECTED]>
Date: Sun, 3 Aug 2008 20:11:06 -0700
Subject: [PATCH] Converted toolbar to use GtkAction.

* Added GtkAction/s for all toolbar functions.  Placed drawing functions into
  a radio group.
* Toolbar items now generated from GtkAction/s.  Removed calls to deprecated
  gtk_toolbar_append_item().
* Modified i_toolbar_update() to keep radio actions in sync with event_state.
* Added new toolbar actions for copy, mirror, move, and rotate.
---
 gschem/include/Makefile.am     |    2 +-
 gschem/include/gschem_struct.h |    9 +-
 gschem/include/i_basic.h       |   55 +++++
 gschem/include/prototype.h     |   20 +--
 gschem/include/x_icons.h       |    4 +
 gschem/src/gschem_toplevel.c   |    9 +-
 gschem/src/i_basic.c           |  142 +++++++++----
 gschem/src/i_callbacks.c       |  104 ++++++++-
 gschem/src/x_icons.c           |    4 +
 gschem/src/x_window.c          |  451 +++++++++++++++++++++++++---------------
 10 files changed, 544 insertions(+), 256 deletions(-)
 create mode 100644 gschem/include/i_basic.h

diff --git a/gschem/include/Makefile.am b/gschem/include/Makefile.am
index 1392507..6ee5cee 100644
--- a/gschem/include/Makefile.am
+++ b/gschem/include/Makefile.am
@@ -5,7 +5,7 @@
 noinst_HEADERS = \
        globals.h i_vars.h prototype.h x_dialog.h x_states.h \
        gettext.h \
-       x_compselect.h x_icons.h \
+       x_compselect.h x_icons.h i_basic.h \
        x_log.h x_multiattrib.h x_pagesel.h x_print.h x_preview.h \
        gschem_dialog.h \
        gschem_struct.h
diff --git a/gschem/include/gschem_struct.h b/gschem/include/gschem_struct.h
index c238d7e..534110f 100644
--- a/gschem/include/gschem_struct.h
+++ b/gschem/include/gschem_struct.h
@@ -26,10 +26,6 @@ struct st_gschem_toplevel {
   GtkWidget *grid_label;
   GtkWidget *status_label;
 
-  GtkWidget *toolbar_select;
-  GtkWidget *toolbar_net;
-  GtkWidget *toolbar_bus;
-
   gchar *keyaccel_string;               /* visual feedback when pressing
                                            keyboard accelerators */
 
@@ -60,6 +56,11 @@ struct st_gschem_toplevel {
   GtkWidget *coord_world;                 /* World coordinate label */
   GtkWidget *coord_screen;                /* Screen coordinate window */
 
+  /* ------- */
+  /* Actions */
+  /* ------- */
+  GtkActionGroup *actions;
+
   /* ----------------- */
   /* Picture placement */
   /* ----------------- */
diff --git a/gschem/include/i_basic.h b/gschem/include/i_basic.h
new file mode 100644
index 0000000..0db16e8
--- /dev/null
+++ b/gschem/include/i_basic.h
@@ -0,0 +1,55 @@
+/**
+ * Names for all Gschem's actions.
+ */
+#define GSCHEM_ACTION_ADD_ARC                  "add-arc"
+#define GSCHEM_ACTION_ADD_BOX                  "add-box"
+#define GSCHEM_ACTION_ADD_BUS                  "add-bus"
+#define GSCHEM_ACTION_ADD_CIRCLE               "add-circle"
+#define GSCHEM_ACTION_ADD_COMPONENT            "add-component"
+#define GSCHEM_ACTION_ADD_LINE                 "add-line"
+#define GSCHEM_ACTION_ADD_NET                  "add-net"
+#define GSCHEM_ACTION_ADD_PIN                  "add-pin"
+#define GSCHEM_ACTION_ADD_TEXT                 "add-text"
+#define GSCHEM_ACTION_EDIT_COPY                "edit-copy"
+#define GSCHEM_ACTION_EDIT_MIRROR              "edit-mirror"
+#define GSCHEM_ACTION_EDIT_MOVE                "edit-move"
+#define GSCHEM_ACTION_EDIT_REDO                "edit-redo"
+#define GSCHEM_ACTION_EDIT_ROTATE              "edit-rotate"
+#define GSCHEM_ACTION_EDIT_SELECT              "edit-select"
+#define GSCHEM_ACTION_EDIT_UNDO                "edit-undo"
+#define GSCHEM_ACTION_FILE_NEW                 "file-new"
+#define GSCHEM_ACTION_FILE_OPEN                "file-open"
+#define GSCHEM_ACTION_FILE_SAVE                "file-save"
+#define GSCHEM_ACTION_HIERARCHY_DOWN_SCHEMATIC "hierarchy-down-schematic"
+#define GSCHEM_ACTION_HIERARCHY_DOWN_SYMBOL    "hierarchy-down-symbol"
+#define GSCHEM_ACTION_HIERARCHY_UP             "hierarchy-up"
+#define GSCHEM_ACTION_NULL                     "null-action"
+#define GSCHEM_ACTION_VIEW_ZOOM_IN             "view-zoom-in"
+#define GSCHEM_ACTION_VIEW_ZOOM_OUT            "view-zoom-out"
+
+/**
+ * Enumerate all the tools (drawing modes) for a GtkRadioAction group.
+ *
+ * TOOL_OTHER, not a real tool, provides a mechanism to cancel all other radio
+ * actions.
+ */
+#define TOOL_SELECT    0
+
+#define TOOL_ARC       1
+#define TOOL_BOX       2
+#define TOOL_BUS       3
+#define TOOL_CIRCLE    4
+#define TOOL_COMPONENT 5
+#define TOOL_COPY      6
+#define TOOL_LINE      7
+#define TOOL_MIRROR    8
+#define TOOL_MOVE      9
+#define TOOL_NET       10
+#define TOOL_PICTURE   11
+#define TOOL_PIN       12
+#define TOOL_ROTATE    13
+#define TOOL_TEXT      14
+#define TOOL_ZOOM      15
+
+#define TOOL_OTHER     99
+
diff --git a/gschem/include/prototype.h b/gschem/include/prototype.h
index e3a1234..917a2b8 100644
--- a/gschem/include/prototype.h
+++ b/gschem/include/prototype.h
@@ -305,13 +305,10 @@ void i_set_filename(GSCHEM_TOPLEVEL *w_current, const 
gchar *string);
 void i_set_grid(GSCHEM_TOPLEVEL *w_current, int visible_grid);
 /* i_callbacks.c */
 void i_callback_file_new(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
-void i_callback_action_file_new(GtkWidget *widget, gpointer data);
 void i_callback_file_new_window(SCM rest, gpointer data, guint 
callback_action, GtkWidget *widget);
 void i_callback_file_open(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
-void i_callback_action_file_open(GtkWidget *widget, gpointer data);
 void i_callback_file_script(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
 void i_callback_file_save(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
-void i_callback_action_file_save(GtkWidget *widget, gpointer data);
 void i_callback_file_save_all(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
 void i_callback_file_save_as(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
 void i_callback_file_print(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
@@ -320,9 +317,7 @@ void i_callback_file_close(SCM rest, gpointer data, guint 
callback_action, GtkWi
 int i_callback_close(gpointer data, guint callback_action, GtkWidget *widget);
 void i_callback_file_quit(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
 void i_callback_edit_undo(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
-void i_callback_action_edit_undo(GtkWidget *widget, gpointer data);
 void i_callback_edit_redo(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
-void i_callback_action_edit_redo(GtkWidget *widget, gpointer data);
 void i_callback_edit_select(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
 void i_callback_action_edit_select(GtkWidget *widget, gpointer data);
 void i_callback_edit_copy(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
@@ -400,17 +395,13 @@ void i_callback_buffer_paste3_hotkey(SCM rest, gpointer 
data, guint callback_act
 void i_callback_buffer_paste4_hotkey(SCM rest, gpointer data, guint 
callback_action, GtkWidget *widget);
 void i_callback_buffer_paste5_hotkey(SCM rest, gpointer data, guint 
callback_action, GtkWidget *widget);
 void i_callback_add_component(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
-void i_callback_action_add_component(GtkWidget *widget, gpointer data);
 void i_callback_add_attribute(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
 void i_callback_add_attribute_hotkey(SCM rest, gpointer data, guint 
callback_action, GtkWidget *widget);
 void i_callback_add_net(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
 void i_callback_add_net_hotkey(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
-void i_callback_action_add_net(GtkWidget *widget, gpointer data);
 void i_callback_add_bus(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
 void i_callback_add_bus_hotkey(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
-void i_callback_action_add_bus(GtkWidget *widget, gpointer data);
 void i_callback_add_text(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
-void i_callback_action_add_text(GtkWidget *widget, gpointer data);
 void i_callback_add_line(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
 void i_callback_add_line_hotkey(SCM rest, gpointer data, guint 
callback_action, GtkWidget *widget);
 void i_callback_add_box(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
@@ -452,16 +443,7 @@ void i_callback_help_about(SCM rest, gpointer data, guint 
callback_action, GtkWi
 void i_callback_help_hotkeys(SCM rest, gpointer data, guint callback_action, 
GtkWidget *widget);
 void i_callback_options_show_coord_window(SCM rest, gpointer data, guint 
callback_action, GtkWidget *widget);
 gboolean i_callback_close_wm(GtkWidget *widget, GdkEvent *event, gpointer 
data);
-void i_callback_action_add_arc(GtkWidget *widget, gpointer data);
-void i_callback_action_add_box(GtkWidget *widget, gpointer data);
-void i_callback_action_add_circle(GtkWidget *widget, gpointer data);
-void i_callback_action_add_line(GtkWidget *widget, gpointer data);
-void i_callback_action_add_pin(GtkWidget *widget, gpointer data);
-void i_callback_action_hierarchy_down_schematic(GtkWidget *widget, gpointer 
data);
-void i_callback_action_hierarchy_down_symbol(GtkWidget *widget, gpointer data);
-void i_callback_action_hierarchy_up(GtkWidget *widget, gpointer data);
-void i_callback_action_view_zoom_in(GtkWidget *widget, gpointer data);
-void i_callback_action_view_zoom_out(GtkWidget *widget, gpointer data);
+void i_callback_connect_signals(GSCHEM_TOPLEVEL *w_current);
 /* i_vars.c */
 void i_vars_set(GSCHEM_TOPLEVEL *w_current);
 /* o_arc.c */
diff --git a/gschem/include/x_icons.h b/gschem/include/x_icons.h
index 7194505..cb42e42 100644
--- a/gschem/include/x_icons.h
+++ b/gschem/include/x_icons.h
@@ -5,12 +5,16 @@
 #define GSCHEM_STOCK_BUS               "gschem-bus"
 #define GSCHEM_STOCK_CIRCLE            "gschem-circle"
 #define GSCHEM_STOCK_COMPONENT         "gschem-component"
+#define GSCHEM_STOCK_COPY              "gschem-copy"
 #define GSCHEM_STOCK_DOWN_SCHEMATIC    "gschem-down-schematic"
 #define GSCHEM_STOCK_DOWN_SYMBOL       "gschem-down-symbol"
 #define GSCHEM_STOCK_LINE              "gschem-line"
 #define GSCHEM_STOCK_NET               "gschem-net"
+#define GSCHEM_STOCK_MIRROR            "gschem-mirror"
+#define GSCHEM_STOCK_MOVE              "gschem-move"
 #define GSCHEM_STOCK_PICTURE           "gschem-picture"
 #define GSCHEM_STOCK_PIN               "gschem-pin"
+#define GSCHEM_STOCK_ROTATE            "gschem-rotate"
 #define GSCHEM_STOCK_SELECT            "gschem-select"
 #define GSCHEM_STOCK_TEXT              "gschem-text"
 #define GSCHEM_STOCK_UP                "gschem-up"
diff --git a/gschem/src/gschem_toplevel.c b/gschem/src/gschem_toplevel.c
index c05c933..b993334 100644
--- a/gschem/src/gschem_toplevel.c
+++ b/gschem/src/gschem_toplevel.c
@@ -49,10 +49,6 @@ GSCHEM_TOPLEVEL *gschem_toplevel_new ()
   w_current->grid_label = NULL;
   w_current->status_label = NULL;
 
-  w_current->toolbar_select = NULL;
-  w_current->toolbar_net    = NULL;
-  w_current->toolbar_bus    = NULL;
-
   w_current->keyaccel_string = NULL;
 
   /* ------------ */
@@ -82,6 +78,11 @@ GSCHEM_TOPLEVEL *gschem_toplevel_new ()
   w_current->coord_world  = NULL;
   w_current->coord_screen = NULL;
 
+  /* ------- */
+  /* Actions */
+  /* ------- */
+  w_current->actions = NULL;
+
   /* ----------------- */
   /* Picture placement */
   /* ----------------- */
diff --git a/gschem/src/i_basic.c b/gschem/src/i_basic.c
index 2c43eb2..cd1b888 100644
--- a/gschem/src/i_basic.c
+++ b/gschem/src/i_basic.c
@@ -27,6 +27,7 @@
 
 #include "../include/gschem_struct.h"
 #include "../include/globals.h"
+#include "../include/i_basic.h"
 #include "../include/prototype.h"
 
 #ifdef HAVE_LIBDMALLOC
@@ -283,80 +284,127 @@ void i_update_middle_button(GSCHEM_TOPLEVEL *w_current,
   }
 }
 
-/*! \todo Finish function documentation!!!
- *  \brief
- *  \param [in] w_current GSCHEM_TOPLEVEL structure
+/*! \brief Updates radio actions on the toolbar to reflect the current state.
+ *
+ *  The tool state can be changed by other means besides activating the
+ *  GtkAction.  This function updates the toolbar to ensure the radio actions
+ *  stay in sync with the current state.
  *
+ *  \param [in] w_current GSCHEM_TOPLEVEL structure
  */
 void i_update_toolbar(GSCHEM_TOPLEVEL *w_current)
 {
-  if (!w_current->toolbars) 
-       return;
+  GtkRadioAction *action;
+
+  g_assert(w_current != NULL);
+  g_assert(w_current->actions != NULL);
+
+  action = GTK_RADIO_ACTION(gtk_action_group_get_action(
+                            w_current->actions, GSCHEM_ACTION_EDIT_SELECT));
 
   switch(w_current->event_state) {
     case(NONE):
     case(SELECT):
     case(STARTSELECT): 
-      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
-                                  w_current->toolbar_select), TRUE);
+    case(GRIPS):
+      gtk_radio_action_set_current_value(action, TOOL_SELECT);
       break;
       
-    case(DRAWNET): 
-    case(STARTDRAWNET): 
-    case(NETCONT): 
-      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
-                                  w_current->toolbar_net), TRUE);
+    case(DRAWARC):
+    case(ENDARC):
+      gtk_radio_action_set_current_value(action, TOOL_ARC);
       break;
-      
+
+    case(DRAWBOX):
+    case(ENDBOX):
+      gtk_radio_action_set_current_value(action, TOOL_BOX);
+      break;
+
     case(DRAWBUS): 
     case(STARTDRAWBUS): 
     case(BUSCONT): 
-      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
-                                  w_current->toolbar_bus), TRUE);
+      gtk_radio_action_set_current_value(action, TOOL_BUS);
+      break;
+      
+    case(DRAWCIRCLE):
+    case(ENDCIRCLE):
+      gtk_radio_action_set_current_value(action, TOOL_CIRCLE);
+      break;
+
+    case(DRAWCOMP):
+    case(ENDCOMP):
+      gtk_radio_action_set_current_value(action, TOOL_COMPONENT);
+      break;
+
+    case(DRAWLINE):
+    case(ENDLINE):
+      gtk_radio_action_set_current_value(action, TOOL_LINE);
+      break;
+
+    case(DRAWNET): 
+    case(STARTDRAWNET): 
+    case(NETCONT): 
+      gtk_radio_action_set_current_value(action, TOOL_NET);
       break;
       
-    case(DRAWCOMP): /*! \todo */
-    case(DRAWLINE): /*! \todo */
-    case(DRAWBOX): /*! \todo */
     case(DRAWPICTURE): /*! \todo */
-    case(DRAWPIN): /*! \todo */
-    case(DRAWCIRCLE): /*! \todo */
-    case(DRAWARC): /*! \todo */
-    case(MOVE): /*! \todo */
-    case(COPY): /*! \todo */
-    case(ZOOM): /*! \todo */
-    case(PAN): /*! \todo */
-    case(STARTPAN): /*! \todo */
-    case(STARTCOPY): /*! \todo */
-    case(STARTMOVE): /*! \todo */
-    case(ENDCOPY): /*! \todo */
-    case(ENDMOVE): /*! \todo */
-    case(ENDLINE): /*! \todo */
-    case(ENDBOX): /*! \todo */
     case(ENDPICTURE): /*! \todo */
-    case(ENDCIRCLE): /*! \todo */
-    case(ENDARC): /*! \todo */
-    case(ENDPIN): /*! \todo */
-    case(ENDCOMP): /*! \todo */
-    case(DRAWTEXT): /*! \todo */
-    case(ENDTEXT): /*! \todo */
-    case(ENDROTATEP): /*! \todo */
-    case(ENDMIRROR): /*! \todo */
-    case(ZOOMBOXSTART): /*! \todo */
-    case(ZOOMBOXEND): /*! \todo */
+      gtk_radio_action_set_current_value(action, TOOL_OTHER);
+      break;
+
+    case(DRAWPIN):
+    case(ENDPIN):
+      gtk_radio_action_set_current_value(action, TOOL_PIN);
+      break;
+
+    case(DRAWTEXT):
+    case(ENDTEXT):
+      gtk_radio_action_set_current_value(action, TOOL_TEXT);
+      break;
+
+    case(STARTMOVE):
+    case(MOVE):
+    case(ENDMOVE):
+      gtk_radio_action_set_current_value(action, TOOL_MOVE);
+      break;
+
+    case(STARTCOPY):
+    case(COPY):
+    case(ENDCOPY):
+      gtk_radio_action_set_current_value(action, TOOL_COPY);
+      break;
+
+    case(STARTPAN): /*! \todo */
+    case(PAN): /*! \todo */
+      gtk_radio_action_set_current_value(action, TOOL_OTHER);
+      break;
+
+    case(ENDROTATEP):
+      gtk_radio_action_set_current_value(action, TOOL_ROTATE);
+      break;
+
+    case(ENDMIRROR):
+      gtk_radio_action_set_current_value(action, TOOL_MIRROR);
+      break;
+
+    case(ZOOMBOXSTART):
+    case(ZOOM):
+    case(ZOOMBOXEND):
+      gtk_radio_action_set_current_value(action, TOOL_OTHER);
+      break;
+
     case(STARTROUTENET): /*! \todo */
     case(ENDROUTENET): /*! \todo */
     case(MOUSEPAN): /*! \todo */
     case(STARTPASTE): /*! \todo */
     case(ENDPASTE): /*! \todo */
-    case(GRIPS): /*! \todo */
-    case(MCOPY): /*! \todo */
+
     case(STARTMCOPY): /*! \todo */
+    case(MCOPY): /*! \todo */
     case(ENDMCOPY): /*! \todo */
+
     default:
-      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
-                                  w_current->toolbar_select), TRUE);
-      break;
+      gtk_radio_action_set_current_value(action, TOOL_OTHER);
   }
 }
 
diff --git a/gschem/src/i_callbacks.c b/gschem/src/i_callbacks.c
index 22e9e1f..8c59afd 100644
--- a/gschem/src/i_callbacks.c
+++ b/gschem/src/i_callbacks.c
@@ -31,6 +31,7 @@
 
 #include "../include/gschem_struct.h"
 #include "../include/globals.h"
+#include "../include/i_basic.h"
 #include "../include/prototype.h"
 
 #ifdef HAVE_LIBDMALLOC
@@ -149,9 +150,13 @@ static void initiate_gschemdoc(const char* 
documentation,const char *device,
 /* Create adapters for GtkAction "activate" signal handlers.  These functions
  * adapt the GtkAction "activate" function signature to the classic i_callback
  * function signature.
+ *
+ * GtkRadioAction handlers requires a special function.  The GtkRadioAction
+ * emits a "activate" signal both when activated and deactivated.  The classic
+ * i_callback function must only be called when the action is activated.
  */
 #define ACTION_ADAPTER(name) \
-void i_callback_action_ ## name (GtkWidget *widget, gpointer data) \
+static void i_callback_action_ ## name (GtkWidget *widget, gpointer data) \
 {                                                                  \
   GSCHEM_TOPLEVEL *w_current;                                      \
   g_assert(data != NULL);                                          \
@@ -161,13 +166,32 @@ void i_callback_action_ ## name (GtkWidget *widget, 
gpointer data) \
   }                                                                \
 }
 
-ACTION_ADAPTER(add_arc)
-ACTION_ADAPTER(add_box)
-ACTION_ADAPTER(add_circle)
-ACTION_ADAPTER(add_component)
-ACTION_ADAPTER(add_line)
-ACTION_ADAPTER(add_pin)
-ACTION_ADAPTER(add_text)
+#define RADIO_ACTION_ADAPTER(name) \
+static void i_callback_action_ ## name (GtkWidget *widget, gpointer data) \
+{                                                                  \
+  GSCHEM_TOPLEVEL *w_current;                                      \
+  g_assert(data != NULL);                                          \
+  g_assert(widget != NULL);                                        \
+  if (gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(widget))) {   \
+    w_current = (GSCHEM_TOPLEVEL*) data;                           \
+    if (w_current->window != NULL) {                               \
+      i_callback_ ## name (SCM_EOL, data, 0, NULL);                \
+    }                                                              \
+  }                                                                \
+}
+
+RADIO_ACTION_ADAPTER(add_arc)
+RADIO_ACTION_ADAPTER(add_box)
+RADIO_ACTION_ADAPTER(add_circle)
+RADIO_ACTION_ADAPTER(add_component)
+RADIO_ACTION_ADAPTER(add_line)
+RADIO_ACTION_ADAPTER(add_pin)
+RADIO_ACTION_ADAPTER(add_text)
+RADIO_ACTION_ADAPTER(edit_copy)
+RADIO_ACTION_ADAPTER(edit_mirror)
+RADIO_ACTION_ADAPTER(edit_move)
+RADIO_ACTION_ADAPTER(edit_rotate_90)
+
 ACTION_ADAPTER(edit_redo)
 ACTION_ADAPTER(edit_undo)
 ACTION_ADAPTER(file_new)
@@ -503,7 +527,7 @@ void i_callback_action_edit_select(GtkWidget* widget, 
gpointer data)
   exit_if_null(w_current);
   if (!w_current->window) return;
 
-  if (GTK_TOGGLE_BUTTON (widget)->active) {
+  if (gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(widget))) {
     if (!o_erase_rubber(w_current)) {
       i_callback_cancel(SCM_EOL, w_current, 0, NULL);
     }
@@ -526,6 +550,7 @@ DEFINE_I_CALLBACK(edit_copy)
   if (o_select_return_first_object(w_current)) {
     o_redraw_cleanstates(w_current);
     i_set_state(w_current, STARTCOPY);
+    i_update_toolbar(w_current);
   } else {
     i_set_state_msg(w_current, SELECT, _("Select objs first"));
   }
@@ -616,6 +641,7 @@ DEFINE_I_CALLBACK(edit_move)
   if (o_select_return_first_object(w_current)) {
     o_redraw_cleanstates(w_current);
     i_set_state(w_current, STARTMOVE);
+    i_update_toolbar(w_current);
   } else {
     i_set_state_msg(w_current, SELECT, _("Select objs first"));
   }
@@ -775,6 +801,7 @@ DEFINE_I_CALLBACK(edit_rotate_90)
 
   i_set_state(w_current, ENDROTATEP);
   i_update_middle_button(w_current, i_callback_edit_rotate_90, _("Rotate"));
+  i_update_toolbar(w_current);
 }
 
 /*! \todo Finish function documentation!!!
@@ -843,6 +870,7 @@ DEFINE_I_CALLBACK(edit_mirror)
 
   i_set_state(w_current, ENDMIRROR);
   i_update_middle_button(w_current, i_callback_edit_mirror, _("Mirror"));
+  i_update_toolbar(w_current);
 }
 
 /*! \todo Finish function documentation!!!
@@ -2330,7 +2358,7 @@ void i_callback_action_add_net(GtkWidget* widget, 
gpointer data)
   exit_if_null(w_current);
   if (!w_current->window) return;
 
-  if (GTK_TOGGLE_BUTTON (widget)->active) {
+  if (gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(widget))) {
     i_callback_add_net(SCM_EOL, data, 0, NULL);
   }
 }
@@ -2401,7 +2429,7 @@ void i_callback_action_add_bus(GtkWidget* widget, 
gpointer data)
   exit_if_null(w_current);
   if (!w_current->window) return;
 
-  if (GTK_TOGGLE_BUTTON (widget)->active) {
+  if (gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(widget))) {
      i_callback_add_bus(SCM_EOL, data, 0, NULL);
   }
 }
@@ -3543,3 +3571,57 @@ gboolean i_callback_close_wm ( GtkWidget *widget, 
GdkEvent *event,
   /*   do */
   return TRUE;
 }
+
+
+struct _handler_entry
+{
+  gchar *action_name;
+  void (*handler)(GtkWidget*,gpointer);
+};
+
+static const struct _handler_entry handler_table[] =
+{
+  { GSCHEM_ACTION_ADD_ARC,            i_callback_action_add_arc           },
+  { GSCHEM_ACTION_ADD_BOX,            i_callback_action_add_box           },
+  { GSCHEM_ACTION_ADD_BUS,            i_callback_action_add_bus           },
+  { GSCHEM_ACTION_ADD_CIRCLE,         i_callback_action_add_circle        },
+  { GSCHEM_ACTION_ADD_COMPONENT,      i_callback_action_add_component     },
+  { GSCHEM_ACTION_ADD_LINE,           i_callback_action_add_line          },
+  { GSCHEM_ACTION_ADD_NET,            i_callback_action_add_net           },
+  { GSCHEM_ACTION_ADD_PIN,            i_callback_action_add_pin           },
+  { GSCHEM_ACTION_ADD_TEXT,           i_callback_action_add_text          },
+  { GSCHEM_ACTION_EDIT_COPY,          i_callback_action_edit_copy         },
+  { GSCHEM_ACTION_EDIT_MIRROR,        i_callback_action_edit_mirror       },
+  { GSCHEM_ACTION_EDIT_MOVE,          i_callback_action_edit_move         },
+  { GSCHEM_ACTION_EDIT_REDO,          i_callback_action_edit_redo         },
+  { GSCHEM_ACTION_EDIT_ROTATE,        i_callback_action_edit_rotate_90    },
+  { GSCHEM_ACTION_EDIT_SELECT,        i_callback_action_edit_select       },
+  { GSCHEM_ACTION_EDIT_UNDO,          i_callback_action_edit_undo         },
+  { GSCHEM_ACTION_FILE_NEW,           i_callback_action_file_new          },
+  { GSCHEM_ACTION_FILE_OPEN,          i_callback_action_file_open         },
+  { GSCHEM_ACTION_FILE_SAVE,          i_callback_action_file_save         },
+  { GSCHEM_ACTION_HIERARCHY_DOWN_SCHEMATIC, 
i_callback_action_hierarchy_down_schematic },
+  { GSCHEM_ACTION_HIERARCHY_DOWN_SYMBOL,    
i_callback_action_hierarchy_down_symbol    },
+  { GSCHEM_ACTION_HIERARCHY_UP,             i_callback_action_hierarchy_up     
        },
+  { GSCHEM_ACTION_VIEW_ZOOM_IN,       i_callback_action_view_zoom_in      },
+  { GSCHEM_ACTION_VIEW_ZOOM_OUT,      i_callback_action_view_zoom_out     },
+};
+
+#define HANDLER_SIZE (sizeof(handler_table)/sizeof(struct _handler_entry))
+
+void i_callback_connect_signals(GSCHEM_TOPLEVEL *w_current)
+{
+  int i;
+
+  g_assert(w_current != NULL);
+  g_assert(w_current->actions != NULL);
+
+  for ( i=0; i<HANDLER_SIZE; i++ ) {
+    g_signal_connect(gtk_action_group_get_action(w_current->actions,
+                                                 handler_table[i].action_name),
+                     "activate",
+                     G_CALLBACK(handler_table[i].handler),
+                     w_current);
+  }
+}
+
diff --git a/gschem/src/x_icons.c b/gschem/src/x_icons.c
index c42b473..a7f27ab 100644
--- a/gschem/src/x_icons.c
+++ b/gschem/src/x_icons.c
@@ -52,11 +52,15 @@ static const icon_entry icon_table[] =
   { GSCHEM_STOCK_BUS,               "gschem-bus.xpm"            },
   { GSCHEM_STOCK_CIRCLE,            "gschem-circle.svg"         },
   { GSCHEM_STOCK_COMPONENT,         "gschem-comp.xpm"           },
+  { GSCHEM_STOCK_COPY,              "gschem-copy.xpm"           },
   { GSCHEM_STOCK_DOWN_SCHEMATIC,    "gschem-down-schematic.svg" },
   { GSCHEM_STOCK_DOWN_SYMBOL,       "gschem-down-symbol.svg"    },
   { GSCHEM_STOCK_LINE,              "gschem-line.svg"           },
+  { GSCHEM_STOCK_MIRROR,            "gschem-mirror.xpm"         },
+  { GSCHEM_STOCK_MOVE,              "gschem-move.xpm"           },
   { GSCHEM_STOCK_NET,               "gschem-net.xpm"            },
   { GSCHEM_STOCK_PIN,               "gschem-pin.svg"            },
+  { GSCHEM_STOCK_ROTATE,            "gschem-rotate.xpm"         },
   { GSCHEM_STOCK_SELECT,            "gschem-select.xpm"         },
   { GSCHEM_STOCK_TEXT,              "gschem-text.xpm"           },
   { GSCHEM_STOCK_UP,                "gschem-up.svg"             },
diff --git a/gschem/src/x_window.c b/gschem/src/x_window.c
index 2aa6da1..08c180e 100644
--- a/gschem/src/x_window.c
+++ b/gschem/src/x_window.c
@@ -24,6 +24,7 @@
 #include <libgeda/libgeda.h>
 
 #include "../include/gschem_struct.h"
+#include "../include/i_basic.h"
 #include "../include/i_vars.h"
 #include "../include/globals.h"
 #include "../include/prototype.h"
@@ -33,6 +34,7 @@
 #include <dmalloc.h>
 #endif
 
+GtkActionGroup *x_window_create_action_group(void);
 static GtkWidget *x_window_create_toolbar(GSCHEM_TOPLEVEL *w_current);
 
 /*! \todo Finish function documentation!!!
@@ -303,6 +305,11 @@ void x_window_create_main(GSCHEM_TOPLEVEL *w_current)
        handlebox = gtk_handle_box_new ();
        gtk_box_pack_start (GTK_BOX (main_box), handlebox, FALSE, FALSE, 0);
   }
+
+  if (w_current->actions == NULL ) {
+    w_current->actions = x_window_create_action_group();
+    i_callback_connect_signals(w_current);
+  }
  
   if (w_current->toolbars) {
     toolbar = x_window_create_toolbar(w_current);
@@ -314,7 +321,6 @@ void x_window_create_main(GSCHEM_TOPLEVEL *w_current)
     }
   } 
 
-
   /*  Try to create popup menu (appears in right mouse button  */
   w_current->popup_menu = (GtkWidget *) get_main_popup(w_current);
 
@@ -554,6 +560,8 @@ void x_window_close(GSCHEM_TOPLEVEL *w_current)
   /* finally close the main window */
   gtk_widget_destroy(w_current->main_window);
 
+  g_object_unref(w_current->actions);
+
   s_toplevel_delete (toplevel);
   global_window_list = g_list_remove (global_window_list, w_current);
   g_free (w_current);
@@ -869,205 +877,308 @@ x_window_close_page (GSCHEM_TOPLEVEL *w_current, PAGE 
*page)
   }
 }
 
-/*! \brief Create this application's main toolbar.
+/*! \brief Create this application's main action group.
  *
- * \param [in] w_current The GSCHEM_TOPLEVEL.  This pointer gets provided to
- * this menu's signal handlers.  This function also stores references to
- * specific menu items within the GSCHEM_TOPLEVEL.
+ *  \returns A pointer to this application's main action group with a ref
+ *  count of 1.
  */
-static GtkWidget *x_window_create_toolbar(GSCHEM_TOPLEVEL *w_current)
+GtkActionGroup *x_window_create_action_group(void)
 {
-  GtkToolbar *toolbar = GTK_TOOLBAR(gtk_toolbar_new());
-
-  gtk_toolbar_set_orientation(toolbar, GTK_ORIENTATION_HORIZONTAL);
-
-  gtk_toolbar_set_style(toolbar, GTK_TOOLBAR_ICONS);
+  GtkAction *action;
+  GtkActionGroup *actions = gtk_action_group_new("gschem");
+  GtkRadioAction *radio;
+  GSList *group = NULL;
 
-  gtk_toolbar_append_item(toolbar, 
+  if (actions != NULL) {
+    action=gtk_action_new(GSCHEM_ACTION_FILE_NEW,
                           _("New"), 
-                          _("New file"), 
-                          "toolbar/new", 
-                          x_icons_new_toolbar_pixmap(GTK_STOCK_NEW),
-                          (GtkSignalFunc) i_callback_action_file_new, 
-                          w_current);
-
-  gtk_toolbar_append_item(toolbar, 
+                          _("New file"),
+                          GTK_STOCK_NEW);
+    gtk_action_group_add_action(actions, action);
+    g_object_unref(action);
+    
+    action=gtk_action_new(GSCHEM_ACTION_FILE_OPEN,
                           _("Open"), 
                           _("Open file..."), 
-                          "toolbar/open",
-                          x_icons_new_toolbar_pixmap(GTK_STOCK_OPEN),
-                          (GtkSignalFunc) i_callback_action_file_open, 
-                          w_current);
+                          GTK_STOCK_OPEN);
+    gtk_action_group_add_action(actions, action);
+    g_object_unref(action);
 
-  gtk_toolbar_append_item(toolbar, 
+    action=gtk_action_new(GSCHEM_ACTION_FILE_SAVE,
                           _("Save"), 
                           _("Save file"), 
-                          "toolbar/save", 
-                          x_icons_new_toolbar_pixmap(GTK_STOCK_SAVE),
-                          (GtkSignalFunc) i_callback_action_file_save, 
-                          w_current);
-
-  gtk_toolbar_append_space(toolbar); 
+                          GTK_STOCK_SAVE);
+    gtk_action_group_add_action(actions, action);
+    g_object_unref(action);
 
-  gtk_toolbar_append_item(toolbar, 
+    action=gtk_action_new(GSCHEM_ACTION_EDIT_UNDO,
                           _("Undo"), 
                           _("Undo last operation"), 
-                          "toolbar/undo", 
-                          x_icons_new_toolbar_pixmap(GTK_STOCK_UNDO),
-                          (GtkSignalFunc) i_callback_action_edit_undo, 
-                          w_current);
+                          GTK_STOCK_UNDO);
+    gtk_action_group_add_action(actions, action);
+    g_object_unref(action);
 
-  gtk_toolbar_append_item(toolbar, 
+    action=gtk_action_new(GSCHEM_ACTION_EDIT_REDO,
                           _("Redo"), 
                           _("Redo last undo"), 
-                          "toolbar/redo", 
-                          x_icons_new_toolbar_pixmap(GTK_STOCK_REDO),
-                          (GtkSignalFunc) i_callback_action_edit_redo, 
-                          w_current);
-
-  gtk_toolbar_append_space(toolbar); 
-
-  /* not part of any radio button group */
-  gtk_toolbar_append_item(toolbar, 
-                          _("Component"), 
-                          _("Add component...\nSelect library and component 
from list, move the mouse into main window, click to place\nRight mouse button 
to cancel"), 
-                          "toolbar/component", 
-                          x_icons_new_toolbar_pixmap(GSCHEM_STOCK_COMPONENT),
-                          (GtkSignalFunc) i_callback_action_add_component, 
-                          w_current);
-
-  w_current->toolbar_net = 
-    gtk_toolbar_append_element(toolbar,
-                               GTK_TOOLBAR_CHILD_RADIOBUTTON,
-                               NULL,
-                               _("Nets"),
-                               _("Add nets mode\nRight mouse button to 
cancel"),
-                               "toolbar/nets",
-                               x_icons_new_toolbar_pixmap(GSCHEM_STOCK_NET),
-                               (GtkSignalFunc) i_callback_action_add_net,
-                               w_current);
-
-  w_current->toolbar_bus = 
-    gtk_toolbar_append_element(toolbar,
-                               GTK_TOOLBAR_CHILD_RADIOBUTTON,
-                               w_current->toolbar_net,
-                               _("Bus"),
-                               _("Add buses mode\nRight mouse button to 
cancel"),
-                               "toolbar/bus",
-                               x_icons_new_toolbar_pixmap(GSCHEM_STOCK_BUS),
-                               (GtkSignalFunc) i_callback_action_add_bus,
-                               w_current);
-
-  /* not part of any radio button group */
-  gtk_toolbar_append_item(toolbar, 
-                          _("Text"), 
-                          _("Add Text..."), 
-                          "toolbar/text", 
-                          x_icons_new_toolbar_pixmap(GSCHEM_STOCK_TEXT),
-                          (GtkSignalFunc) i_callback_action_add_text, 
-                          w_current);
-
-  gtk_toolbar_append_space(toolbar); 
-
-  w_current->toolbar_select = 
-    gtk_toolbar_append_element(toolbar,
-                               GTK_TOOLBAR_CHILD_RADIOBUTTON,
-                               w_current->toolbar_bus,
-                               _("Select"),
-                               _("Select mode"),
-                               "toolbar/select",
-                               x_icons_new_toolbar_pixmap(GSCHEM_STOCK_SELECT),
-                               (GtkSignalFunc) i_callback_action_edit_select, 
-                               w_current);
-
-  gtk_toolbar_append_space(toolbar); 
-
-  gtk_toolbar_append_item(toolbar, 
-                          _("Arc"), 
-                          _("Add Arc"), 
-                          "toolbar/arc", 
-                          x_icons_new_toolbar_pixmap(GSCHEM_STOCK_ARC),
-                          (GtkSignalFunc) i_callback_action_add_arc, 
-                          w_current);
-
-  gtk_toolbar_append_item(toolbar, 
-                          _("Box"), 
-                          _("Add Box"), 
-                          "toolbar/box", 
-                          x_icons_new_toolbar_pixmap(GSCHEM_STOCK_BOX),
-                          (GtkSignalFunc) i_callback_action_add_box, 
-                          w_current);
-
-  gtk_toolbar_append_item(toolbar,
-                          _("Circle"),
-                          _("Add Circle"),
-                          "toolbar/circle",
-                          x_icons_new_toolbar_pixmap(GSCHEM_STOCK_CIRCLE),
-                          (GtkSignalFunc) i_callback_action_add_circle,
-                          w_current);
-
-  gtk_toolbar_append_item(toolbar,
-                          _("Line"),
-                          _("Add Line"),
-                          "toolbar/line",
-                          x_icons_new_toolbar_pixmap(GSCHEM_STOCK_LINE),
-                          (GtkSignalFunc) i_callback_action_add_line,
-                          w_current);
-
-  gtk_toolbar_append_item(toolbar, 
-                          _("Pin"), 
-                          _("Add Pin"), 
-                          "toolbar/pin", 
-                          x_icons_new_toolbar_pixmap(GSCHEM_STOCK_PIN),
-                          (GtkSignalFunc) i_callback_action_add_pin, 
-                          w_current);
-
-  gtk_toolbar_append_space(toolbar); 
-
-  gtk_toolbar_append_item(toolbar,
-                          _("Up Hierarchy"),
-                          _("Up Hierarchy"),
-                          "toolbar/up-hierarchy",
-                          x_icons_new_toolbar_pixmap(GSCHEM_STOCK_UP),
-                          (GtkSignalFunc) i_callback_action_hierarchy_up,
-                          w_current);
+                          GTK_STOCK_REDO);
+    gtk_action_group_add_action(actions, action);
+    g_object_unref(action);
 
-  gtk_toolbar_append_item(toolbar,
+    action=gtk_action_new(GSCHEM_ACTION_HIERARCHY_DOWN_SCHEMATIC,
                           _("Down Schematic"),
                           _("Down Schematic"),
-                          "toolbar/down-schematic",
-                          
x_icons_new_toolbar_pixmap(GSCHEM_STOCK_DOWN_SCHEMATIC),
-                          (GtkSignalFunc) 
i_callback_action_hierarchy_down_schematic,
-                          w_current);
+                          GSCHEM_STOCK_DOWN_SCHEMATIC);
+    gtk_action_group_add_action(actions, action);
+    g_object_unref(action);
 
-  gtk_toolbar_append_item(toolbar, 
+    action=gtk_action_new(GSCHEM_ACTION_HIERARCHY_DOWN_SYMBOL,
                           _("Down Symbol"), 
                           _("Down Symbol"), 
-                          "toolbar/down-symbol", 
-                          x_icons_new_toolbar_pixmap(GSCHEM_STOCK_DOWN_SYMBOL),
-                          (GtkSignalFunc) 
i_callback_action_hierarchy_down_symbol, 
-                          w_current);
+                          GSCHEM_STOCK_DOWN_SYMBOL);
+    gtk_action_group_add_action(actions, action);
+    g_object_unref(action);
 
-  gtk_toolbar_append_space(toolbar); 
+    action=gtk_action_new(GSCHEM_ACTION_HIERARCHY_UP,
+                          _("Up"),
+                          _("Up Hierarchy"),
+                          GSCHEM_STOCK_UP);
+    gtk_action_group_add_action(actions, action);
+    g_object_unref(action);
 
-  gtk_toolbar_append_item(toolbar, 
+    action=gtk_action_new(GSCHEM_ACTION_VIEW_ZOOM_IN,
                           _("Zoom In"), 
                           _("Zoom In"), 
-                          "toolbar/zoom-in", 
-                          x_icons_new_toolbar_pixmap(GTK_STOCK_ZOOM_IN),
-                          (GtkSignalFunc) i_callback_action_view_zoom_in, 
-                          w_current);
+                          GTK_STOCK_ZOOM_IN);
+    gtk_action_group_add_action(actions, action);
+    g_object_unref(action);
 
-  gtk_toolbar_append_item(toolbar, 
+    action=gtk_action_new(GSCHEM_ACTION_VIEW_ZOOM_OUT,
                           _("Zoom Out"), 
                           _("Zoom Out"), 
-                          "toolbar/zoom-out", 
-                          x_icons_new_toolbar_pixmap(GTK_STOCK_ZOOM_OUT),
-                          (GtkSignalFunc) i_callback_action_view_zoom_out, 
-                          w_current);
+                          GTK_STOCK_ZOOM_OUT);
+    gtk_action_group_add_action(actions, action);
+    g_object_unref(action);
 
-  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w_current->toolbar_select),
-                               TRUE);
+    /* GtkRadioAction for tools */
 
+    radio=gtk_radio_action_new(GSCHEM_ACTION_EDIT_SELECT,
+                               _("Select"),
+                               _("Select mode"),
+                               GSCHEM_STOCK_SELECT,
+                               TOOL_SELECT);
+    gtk_action_group_add_action(actions, GTK_ACTION(radio));
+    gtk_radio_action_set_group(radio, group);
+    group = gtk_radio_action_get_group(radio);
+    g_object_unref(radio);
+
+    radio=gtk_radio_action_new(GSCHEM_ACTION_ADD_ARC,
+                               _("Arc"), 
+                               _("Add Arc"), 
+                               GSCHEM_STOCK_ARC,
+                               TOOL_ARC);
+    gtk_action_group_add_action(actions, GTK_ACTION(radio));
+    gtk_radio_action_set_group(radio, group);
+    group = gtk_radio_action_get_group(radio);
+    g_object_unref(radio);
+
+    radio=gtk_radio_action_new(GSCHEM_ACTION_ADD_BOX,
+                               _("Box"), 
+                               _("Add Box"), 
+                               GSCHEM_STOCK_BOX,
+                               TOOL_BOX);
+    gtk_action_group_add_action(actions, GTK_ACTION(radio));
+    gtk_radio_action_set_group(radio, group);
+    group = gtk_radio_action_get_group(radio);
+    g_object_unref(radio);
+
+    radio=gtk_radio_action_new(GSCHEM_ACTION_ADD_BUS,
+                               _("Bus"),
+                               _("Add buses mode\nRight mouse button to 
cancel"),
+                               GSCHEM_STOCK_BUS,
+                               TOOL_BUS);
+    gtk_action_group_add_action(actions, GTK_ACTION(radio));
+    gtk_radio_action_set_group(radio, group);
+    group = gtk_radio_action_get_group(radio);
+    g_object_unref(radio);
+
+    radio=gtk_radio_action_new(GSCHEM_ACTION_ADD_CIRCLE,
+                               _("Circle"), 
+                               _("Add Circle"), 
+                               GSCHEM_STOCK_CIRCLE,
+                               TOOL_CIRCLE);
+    gtk_action_group_add_action(actions, GTK_ACTION(radio));
+    gtk_radio_action_set_group(radio, group);
+    group = gtk_radio_action_get_group(radio);
+    g_object_unref(radio);
+
+    radio=gtk_radio_action_new(GSCHEM_ACTION_ADD_COMPONENT,
+                               _("Component"), 
+                               _("Add component...\nSelect library and 
component from list, move the mouse into main window, click to place\nRight 
mouse button to cancel"), 
+                               GSCHEM_STOCK_COMPONENT,
+                               TOOL_COMPONENT);
+    gtk_action_group_add_action(actions, GTK_ACTION(radio));
+    gtk_radio_action_set_group(radio, group);
+    group = gtk_radio_action_get_group(radio);
+    g_object_unref(radio);
+
+    radio=gtk_radio_action_new(GSCHEM_ACTION_ADD_LINE,
+                               _("Line"),
+                               _("Add Line"),
+                               GSCHEM_STOCK_LINE,
+                               TOOL_LINE);
+    gtk_action_group_add_action(actions, GTK_ACTION(radio));
+    gtk_radio_action_set_group(radio, group);
+    group = gtk_radio_action_get_group(radio);
+    g_object_unref(radio);
+
+    radio=gtk_radio_action_new(GSCHEM_ACTION_EDIT_COPY,
+                               _("Copy"),
+                               _("Copy Mode"),
+                               GSCHEM_STOCK_COPY,
+                               TOOL_COPY);
+    gtk_action_group_add_action(actions, GTK_ACTION(radio));
+    gtk_radio_action_set_group(radio, group);
+    group = gtk_radio_action_get_group(radio);
+    g_object_unref(radio);
+
+    radio=gtk_radio_action_new(GSCHEM_ACTION_ADD_NET,
+                               _("Nets"),
+                               _("Add nets mode\nRight mouse button to 
cancel"),
+                               GSCHEM_STOCK_NET,
+                               TOOL_NET);
+    gtk_action_group_add_action(actions, GTK_ACTION(radio));
+    gtk_radio_action_set_group(radio, group);
+    group = gtk_radio_action_get_group(radio);
+    g_object_unref(radio);
+
+    radio=gtk_radio_action_new(GSCHEM_ACTION_EDIT_MIRROR,
+                               _("Mirror"),
+                               _("Mirror Mode"),
+                               GSCHEM_STOCK_MIRROR,
+                               TOOL_MIRROR);
+    gtk_action_group_add_action(actions, GTK_ACTION(radio));
+    gtk_radio_action_set_group(radio, group);
+    group = gtk_radio_action_get_group(radio);
+    g_object_unref(radio);
+
+    radio=gtk_radio_action_new(GSCHEM_ACTION_EDIT_MOVE,
+                              _("Move"),
+                              _("Move Mode"),
+                              GSCHEM_STOCK_MOVE,
+                              TOOL_MOVE);
+    gtk_action_group_add_action(actions, GTK_ACTION(radio));
+    gtk_radio_action_set_group(radio, group);
+    group = gtk_radio_action_get_group(radio);
+    g_object_unref(radio);
+
+    radio=gtk_radio_action_new(GSCHEM_ACTION_ADD_PIN,
+                               _("Pin"), 
+                               _("Add Pin"), 
+                               GSCHEM_STOCK_PIN,
+                               TOOL_PIN);
+    gtk_action_group_add_action(actions, GTK_ACTION(radio));
+    gtk_radio_action_set_group(radio, group);
+    group = gtk_radio_action_get_group(radio);
+    g_object_unref(radio);
+
+    radio=gtk_radio_action_new(GSCHEM_ACTION_EDIT_ROTATE,
+                               _("Rotate"),
+                               _("Rotate Mode"),
+                               GSCHEM_STOCK_ROTATE,
+                               TOOL_ROTATE);
+    gtk_action_group_add_action(actions, GTK_ACTION(radio));
+    gtk_radio_action_set_group(radio, group);
+    group = gtk_radio_action_get_group(radio);
+    g_object_unref(radio);
+
+    radio=gtk_radio_action_new(GSCHEM_ACTION_ADD_TEXT,
+                               _("Text"), 
+                               _("Add Text..."), 
+                               GSCHEM_STOCK_TEXT,
+                               TOOL_TEXT);
+    gtk_action_group_add_action(actions,GTK_ACTION(radio));
+    gtk_radio_action_set_group(radio, group);
+    group = gtk_radio_action_get_group(radio);
+    g_object_unref(radio);
+   
+    /* A dummy action to cancel other actions in the radio group */
+
+    radio=gtk_radio_action_new(GSCHEM_ACTION_NULL,
+                               "",
+                               "", 
+                               NULL,
+                               TOOL_OTHER);
+    gtk_action_group_add_action(actions,GTK_ACTION(radio));
+    gtk_radio_action_set_group(radio, group);
+    g_object_unref(radio);
+  }
+  return actions;
+}
+
+/*! \brief Create this application's main toolbar.
+ *
+ * \param [in] w_current The GSCHEM_TOPLEVEL.  This pointer gets provided to
+ * this menu's signal handlers.
+ */
+static GtkWidget *x_window_create_toolbar(GSCHEM_TOPLEVEL *w_current)
+{
+  static const gchar *tool_table[] = {
+    GSCHEM_ACTION_FILE_NEW,
+    GSCHEM_ACTION_FILE_OPEN,
+    GSCHEM_ACTION_FILE_SAVE,
+    "",
+    GSCHEM_ACTION_EDIT_UNDO,
+    GSCHEM_ACTION_EDIT_REDO,
+    "",
+    GSCHEM_ACTION_VIEW_ZOOM_IN,
+    GSCHEM_ACTION_VIEW_ZOOM_OUT,
+    "",
+    GSCHEM_ACTION_EDIT_SELECT,
+    GSCHEM_ACTION_ADD_COMPONENT,
+    GSCHEM_ACTION_ADD_NET,
+    GSCHEM_ACTION_ADD_BUS,
+    GSCHEM_ACTION_ADD_TEXT,
+    "",
+    GSCHEM_ACTION_ADD_ARC,
+    GSCHEM_ACTION_ADD_BOX,
+    GSCHEM_ACTION_ADD_CIRCLE,
+    GSCHEM_ACTION_ADD_LINE,
+    GSCHEM_ACTION_ADD_PIN,
+    "",
+    GSCHEM_ACTION_HIERARCHY_UP,
+    GSCHEM_ACTION_HIERARCHY_DOWN_SCHEMATIC,
+    GSCHEM_ACTION_HIERARCHY_DOWN_SYMBOL,
+    "",
+    GSCHEM_ACTION_EDIT_COPY,
+    GSCHEM_ACTION_EDIT_MIRROR,
+    GSCHEM_ACTION_EDIT_MOVE,
+    GSCHEM_ACTION_EDIT_ROTATE,
+    NULL
+  };
+
+  GtkToolbar *toolbar;
+
+  toolbar = GTK_TOOLBAR(gtk_toolbar_new());
+
+  if ( toolbar !=NULL ) {
+    const gchar **tool;
+    
+    gtk_toolbar_set_orientation(toolbar, GTK_ORIENTATION_HORIZONTAL);
+
+    gtk_toolbar_set_style(toolbar, GTK_TOOLBAR_ICONS);
+
+    for (tool = tool_table; *tool != NULL; tool++) {
+      if (**tool == '\0') {
+        gtk_toolbar_insert(toolbar, gtk_separator_tool_item_new(), -1);
+      }
+      else {
+        gtk_toolbar_insert(toolbar,
+          GTK_TOOL_ITEM(gtk_action_create_tool_item(
+             gtk_action_group_get_action(w_current->actions, *tool))),
+          -1);
+      }
+    }
+  }
   return GTK_WIDGET(toolbar); 
 }
-- 
1.5.6


_______________________________________________
geda-dev mailing list
[email protected]
http://www.seul.org/cgi-bin/mailman/listinfo/geda-dev

Reply via email to