[beast: 10/11] BST: use Bse::SourceH instead of proxy IDs to store module handles



commit 8fcc4b13d107b478a63b748a1e7d27adf8a52458
Author: Tim Janik <timj gnu org>
Date:   Wed Sep 6 01:10:21 2017 +0200

    BST: use Bse::SourceH instead of proxy IDs to store module handles
    
    Signed-off-by: Tim Janik <timj gnu org>

 beast-gtk/bstcanvaslink.cc   |   16 ++--
 beast-gtk/bstcanvassource.cc |  147 ++++++++++++++++++++---------------------
 beast-gtk/bstcanvassource.hh |    2 +-
 beast-gtk/bstsnetrouter.cc   |   51 ++++++--------
 4 files changed, 103 insertions(+), 113 deletions(-)
---
diff --git a/beast-gtk/bstcanvaslink.cc b/beast-gtk/bstcanvaslink.cc
index 67bba6a..8338c3c 100644
--- a/beast-gtk/bstcanvaslink.cc
+++ b/beast-gtk/bstcanvaslink.cc
@@ -107,13 +107,13 @@ clink_view_update (BstCanvasLink *clink,
       const gchar *iname, *oname;
       gchar *string;
 
-      Bse::SourceH icsource = clink->icsource ? Bse::SourceH::down_cast (bse_server.from_proxy 
(clink->icsource->source)) : Bse::SourceH();
-      Bse::SourceH ocsource = clink->ocsource ? Bse::SourceH::down_cast (bse_server.from_proxy 
(clink->ocsource->source)) : Bse::SourceH();
+      Bse::SourceH icsource = clink->icsource->source;
+      Bse::SourceH ocsource = clink->ocsource->source;
 
       /* figure appropriate window title
        */
-      iname = clink->icsource ? bse_item_get_name_or_type (clink->icsource->source) : "<""???"">";
-      oname = clink->ocsource ? bse_item_get_name_or_type (clink->ocsource->source) : "<""???"">";
+      iname = clink->icsource ? bse_item_get_name_or_type (icsource.proxy_id()) : "<""???"">";
+      oname = clink->ocsource ? bse_item_get_name_or_type (ocsource.proxy_id()) : "<""???"">";
       string = g_strconcat (_("Module Link: "), iname, " <=> ", oname, NULL);
       gxk_dialog_set_title (GXK_DIALOG (clink->link_view), string);
       g_free (string);
@@ -208,7 +208,7 @@ bst_canvas_link_set_ocsource (BstCanvasLink   *clink,
   if (clink->ocsource)
     {
       if (clink->ocsource->source) /* source may be destroyed already */
-       bse_proxy_disconnect (clink->ocsource->source,
+       bse_proxy_disconnect (clink->ocsource->source.proxy_id(),
                              "any_signal", clink_view_check_update, clink,
                              NULL);
       if (g_signal_handler_is_connected (clink->ocsource, clink->oc_handler))
@@ -224,7 +224,7 @@ bst_canvas_link_set_ocsource (BstCanvasLink   *clink,
                                                     "notify",
                                                     G_CALLBACK (bst_canvas_link_update),
                                                     GTK_OBJECT (clink));
-      bse_proxy_connect (clink->ocsource->source,
+      bse_proxy_connect (clink->ocsource->source.proxy_id(),
                         "swapped_signal::property-notify::uname", clink_view_check_update, clink,
                         NULL);
       bst_canvas_link_update (clink);
@@ -243,7 +243,7 @@ bst_canvas_link_set_icsource (BstCanvasLink   *clink,
   if (clink->icsource)
     {
       if (clink->icsource->source) /* source may be destroyed already */
-       bse_proxy_disconnect (clink->icsource->source,
+       bse_proxy_disconnect (clink->icsource->source.proxy_id(),
                              "any_signal", clink_view_check_update, clink,
                              NULL);
       if (g_signal_handler_is_connected (clink->icsource, clink->ic_handler))
@@ -259,7 +259,7 @@ bst_canvas_link_set_icsource (BstCanvasLink   *clink,
                                                     "notify",
                                                     G_CALLBACK (bst_canvas_link_update),
                                                     GTK_OBJECT (clink));
-      bse_proxy_connect (clink->icsource->source,
+      bse_proxy_connect (clink->icsource->source.proxy_id(),
                         "swapped_signal::property-notify::uname", clink_view_check_update, clink,
                         NULL);
       bst_canvas_link_update (clink);
diff --git a/beast-gtk/bstcanvassource.cc b/beast-gtk/bstcanvassource.cc
index b1e571f..3868c7b 100644
--- a/beast-gtk/bstcanvassource.cc
+++ b/beast-gtk/bstcanvassource.cc
@@ -52,7 +52,8 @@ static void     bst_canvas_source_build         (BstCanvasSource        *csource
 
 
 /* --- static variables --- */
-static guint                 csource_signals[SIGNAL_LAST] = { 0 };
+static void *parent_class = NULL;
+static uint  csource_signals[SIGNAL_LAST] = { 0 };
 
 
 /* --- functions --- */
@@ -61,9 +62,8 @@ G_DEFINE_TYPE (BstCanvasSource, bst_canvas_source, GNOME_TYPE_CANVAS_GROUP);
 static void
 bst_canvas_source_init (BstCanvasSource *csource)
 {
-  GtkObject *object = GTK_OBJECT (csource);
+  new (&csource->source) Bse::SourceH();
 
-  csource->source = 0;
   csource->params_dialog = NULL;
   csource->source_info = NULL;
   csource->icon_item = NULL;
@@ -75,12 +75,24 @@ bst_canvas_source_init (BstCanvasSource *csource)
   csource->show_hints = FALSE;
   csource->move_dx = 0;
   csource->move_dy = 0;
+  GtkObject *object = GTK_OBJECT (csource);
   g_object_connect (object,
                    "signal::notify", bst_canvas_source_changed, NULL,
                    NULL);
 }
 
 static void
+bst_canvas_source_finalize (GObject *object)
+{
+  BstCanvasSource *self = BST_CANVAS_SOURCE (object);
+
+  G_OBJECT_CLASS (parent_class)->finalize (object);
+
+  using namespace Bse;
+  self->source.~SourceH();
+}
+
+static void
 source_channels_changed (BstCanvasSource *csource)
 {
   assert_return (BST_IS_CANVAS_SOURCE (csource));
@@ -99,7 +111,7 @@ idle_move_item (gpointer data)
   if (self->source && item->canvas)
     {
       SfiReal x, y;
-      bse_proxy_get (self->source,
+      bse_proxy_get (self->source.proxy_id(),
                      "pos-x", &x,
                      "pos-y", &y,
                      NULL);
@@ -146,7 +158,7 @@ source_name_changed (BstCanvasSource *csource)
 
   assert_return (BST_IS_CANVAS_SOURCE (csource));
 
-  name = bse_item_get_name_or_type (csource->source);
+  name = bse_item_get_name_or_type (csource->source.proxy_id());
 
   if (csource->text)
     g_object_set (csource->text, "text", name, NULL);
@@ -168,9 +180,8 @@ source_icon_changed (BstCanvasSource *csource)
   // update icon in group, revert to a stock icon if none is available
   if (csource->icon_item)
     {
-      Bse::ItemH source_item = Bse::ItemH::down_cast (bse_server.from_proxy (csource->source));
-      Bse::Icon icon = source_item.icon();
-      bst_canvas_icon_set (csource->icon_item, icon, bse_item_get_type (csource->source));
+      Bse::Icon icon = csource->source.icon();
+      bst_canvas_icon_set (csource->icon_item, icon, bse_item_get_type (csource->source.proxy_id()));
     }
 }
 
@@ -183,7 +194,7 @@ bst_canvas_source_destroy (GtkObject *object)
   if (csource->in_move)
     {
       csource->in_move = FALSE;
-      bse_item_ungroup_undo (csource->source);
+      bse_item_ungroup_undo (csource->source.proxy_id());
     }
 
   while (csource->channel_hints)
@@ -193,15 +204,15 @@ bst_canvas_source_destroy (GtkObject *object)
 
   if (csource->source)
     {
-      bse_proxy_disconnect (csource->source,
+      bse_proxy_disconnect (csource->source.proxy_id(),
                            "any_signal", gtk_object_destroy, csource,
                            "any_signal", source_channels_changed, csource,
                            "any_signal", source_name_changed, csource,
                            "any_signal", source_pos_changed, csource,
                            "any_signal", source_icon_changed, csource,
                            NULL);
-      bse_item_unuse (csource->source);
-      csource->source = 0;
+      bse_item_unuse (csource->source.proxy_id());
+      csource->source = Bse::SourceH();
     }
 
   GTK_OBJECT_CLASS (bst_canvas_source_parent_class)->destroy (object);
@@ -223,8 +234,10 @@ bst_canvas_source_new (GnomeCanvasGroup *group,
                                BST_TYPE_CANVAS_SOURCE,
                                NULL);
   csource = BST_CANVAS_SOURCE (item);
-  csource->source = bse_item_use (source);
-  bse_proxy_connect (csource->source,
+  csource->source = Bse::SourceH::down_cast (bse_server.from_proxy (source));
+  if (csource->source)
+    bse_item_use (csource->source.proxy_id());
+  bse_proxy_connect (csource->source.proxy_id(),
                     "swapped_signal::release", gtk_object_destroy, csource,
                     "swapped_signal::io_changed", source_channels_changed, csource,
                     "swapped_signal::property-notify::uname", source_name_changed, csource,
@@ -257,11 +270,11 @@ canvas_source_create_params (BstCanvasSource *csource)
     {
       GtkWidget *param_view;
 
-      param_view = bst_param_view_new (csource->source);
+      param_view = bst_param_view_new (csource->source.proxy_id());
       csource->params_dialog = (GtkWidget*) gxk_dialog_new (&csource->params_dialog,
                                                             GTK_OBJECT (csource),
                                                             GXK_DIALOG_POPUP_POS,
-                                                            bse_item_get_name_or_type (csource->source),
+                                                            bse_item_get_name_or_type 
(csource->source.proxy_id()),
                                                             param_view);
       source_name_changed (csource);
     }
@@ -326,20 +339,18 @@ csource_info_update (BstCanvasSource *csource)
     {
       /* construct information */
       gxk_scroll_text_clear (text);
-      gxk_scroll_text_aprintf (text, "%s:\n", bse_item_get_name_or_type (csource->source));
+      gxk_scroll_text_aprintf (text, "%s:\n", bse_item_get_name_or_type (csource->source.proxy_id()));
 
       /* type & category */
       gxk_scroll_text_push_indent (text);
-      gxk_scroll_text_aprintf (text, "Type: %s\n", bse_item_get_type_name (csource->source));
-      Bse::CategorySeq cseq = bse_server.category_match_typed ("*", bse_item_get_type_name 
(csource->source));
+      gxk_scroll_text_aprintf (text, "Type: %s\n", bse_item_get_type_name (csource->source.proxy_id()));
+      Bse::CategorySeq cseq = bse_server.category_match_typed ("*", bse_item_get_type_name 
(csource->source.proxy_id()));
       if (cseq.size())
         gxk_scroll_text_aprintf (text, "Category: %s\n", cseq[0].category);
       gxk_scroll_text_pop_indent (text);
 
-      Bse::SourceH csource_source = Bse::SourceH::down_cast (bse_server.from_proxy (csource->source));
-
       /* input channels */
-      const size_t csource_source_n_ichannels = csource_source.n_ichannels();
+      const size_t csource_source_n_ichannels = csource->source.n_ichannels();
       if (csource_source_n_ichannels)
        {
          gxk_scroll_text_aprintf (text, "\nInput Channels:\n");
@@ -347,10 +358,10 @@ csource_info_update (BstCanvasSource *csource)
        }
       for (size_t i = 0; i < csource_source_n_ichannels; i++)
        {
-          const String string = csource_source.ichannel_blurb (i);
+          const String string = csource->source.ichannel_blurb (i);
          gxk_scroll_text_aprintf (text, "%s[%s]%s\n",
-                                  csource_source.ichannel_label (i).c_str(),
-                                  csource_source.ichannel_ident (i).c_str(),
+                                  csource->source.ichannel_label (i).c_str(),
+                                  csource->source.ichannel_ident (i).c_str(),
                                   string.empty() ? "" : ":");
          if (!string.empty())
            {
@@ -363,7 +374,7 @@ csource_info_update (BstCanvasSource *csource)
        gxk_scroll_text_pop_indent (text);
 
       /* output channels */
-      const size_t csource_source_n_ochannels = csource_source.n_ochannels();
+      const size_t csource_source_n_ochannels = csource->source.n_ochannels();
       if (csource_source_n_ochannels)
        {
          gxk_scroll_text_aprintf (text, "\nOutput Channels:\n");
@@ -371,10 +382,10 @@ csource_info_update (BstCanvasSource *csource)
        }
       for (size_t i = 0; i < csource_source_n_ochannels; i++)
        {
-         const String string = csource_source.ochannel_blurb (i);
+         const String string = csource->source.ochannel_blurb (i);
          gxk_scroll_text_aprintf (text, "%s[%s]%s\n",
-                                  csource_source.ochannel_label (i).c_str(),
-                                  csource_source.ochannel_ident (i).c_str(),
+                                  csource->source.ochannel_label (i).c_str(),
+                                  csource->source.ochannel_ident (i).c_str(),
                                   string.empty() ? "" : ":");
           if (!string.empty())
            {
@@ -387,7 +398,7 @@ csource_info_update (BstCanvasSource *csource)
        gxk_scroll_text_pop_indent (text);
 
       /* description */
-      const gchar *string = bse_item_get_type_blurb (csource->source);
+      const gchar *string = bse_item_get_type_blurb (csource->source.proxy_id());
       if (string && string[0])
        {
          gxk_scroll_text_aprintf (text, "\nDescription:\n");
@@ -397,12 +408,12 @@ csource_info_update (BstCanvasSource *csource)
        }
 
       /* authors */
-      string = bse_item_get_type_authors (csource->source);
+      string = bse_item_get_type_authors (csource->source.proxy_id());
       if (string && string[0])
         gxk_scroll_text_aprintf (text, "\nAuthors: %s\n", string);
 
       /* license */
-      string = bse_item_get_type_license (csource->source);
+      string = bse_item_get_type_license (csource->source.proxy_id());
       if (string && string[0])
         gxk_scroll_text_aprintf (text, "\nLicense: %s\n", string);
     }
@@ -430,7 +441,7 @@ bst_canvas_source_popup_info (BstCanvasSource *csource)
       csource->source_info = (GtkWidget*) gxk_dialog_new (&csource->source_info,
                                                           GTK_OBJECT (csource),
                                                           GXK_DIALOG_POPUP_POS,
-                                                          bse_item_get_name_or_type (csource->source),
+                                                          bse_item_get_name_or_type 
(csource->source.proxy_id()),
                                                           sctext);
     }
   csource_info_update (csource);
@@ -466,9 +477,7 @@ bst_canvas_source_is_jchannel (BstCanvasSource *csource,
   if (!csource->source)
     return FALSE;
 
-  Bse::SourceH csource_source = Bse::SourceH::down_cast (bse_server.from_proxy (csource->source));
-
-  return csource_source.is_joint_ichannel_by_id (ichannel);
+  return csource->source.is_joint_ichannel_by_id (ichannel);
 }
 
 gboolean
@@ -479,13 +488,11 @@ bst_canvas_source_ichannel_free (BstCanvasSource *csource, uint ichannel)
   if (!csource->source)
     return FALSE;
 
-  Bse::SourceH csource_source = Bse::SourceH::down_cast (bse_server.from_proxy (csource->source));
-
-  if (csource_source.is_joint_ichannel_by_id (ichannel))
+  if (csource->source.is_joint_ichannel_by_id (ichannel))
     return TRUE;
   else
     {
-      Bse::SourceH osource = csource_source.ichannel_get_osource (ichannel, 0);
+      Bse::SourceH osource = csource->source.ichannel_get_osource (ichannel, 0);
       return osource == NULL;
     }
 }
@@ -502,10 +509,7 @@ bst_canvas_source_ichannel_pos (BstCanvasSource *csource,
 
   x = ICHANNEL_X (csource) + CHANNEL_WIDTH (csource) / 2;
   if (csource->source)
-    {
-      Bse::SourceH csource_source = Bse::SourceH::down_cast (bse_server.from_proxy (csource->source));
-      y = CHANNEL_HEIGHT (csource) / csource_source.n_ichannels();
-    }
+    y = CHANNEL_HEIGHT (csource) / csource->source.n_ichannels();
   y *= ochannel + 0.5;
   y += ICHANNEL_Y (csource);
   gnome_canvas_item_i2w (GNOME_CANVAS_ITEM (csource), &x, &y);
@@ -527,10 +531,7 @@ bst_canvas_source_ochannel_pos (BstCanvasSource *csource,
 
   x = OCHANNEL_X (csource) + CHANNEL_WIDTH (csource) / 2;
   if (csource->source)
-    {
-      Bse::SourceH csource_source = Bse::SourceH::down_cast (bse_server.from_proxy (csource->source));
-      y = CHANNEL_HEIGHT (csource) / csource_source.n_ochannels();
-    }
+    y = CHANNEL_HEIGHT (csource) / csource->source.n_ochannels();
   y *= ichannel + 0.5;
   y += OCHANNEL_Y (csource);
   gnome_canvas_item_i2w (GNOME_CANVAS_ITEM (csource), &x, &y);
@@ -549,17 +550,15 @@ bst_canvas_source_ichannel_at (BstCanvasSource *csource,
 
   assert_return (BST_IS_CANVAS_SOURCE (csource), 0);
 
-  Bse::SourceH csource_source = Bse::SourceH::down_cast (bse_server.from_proxy (csource->source));
-
   gnome_canvas_item_w2i (GNOME_CANVAS_ITEM (csource), &x, &y);
 
   x -= ICHANNEL_X (csource);
   y -= ICHANNEL_Y (csource);
   if (x > 0 && x < CHANNEL_WIDTH (csource) &&
       y > 0 && y < CHANNEL_HEIGHT (csource) &&
-      csource_source.n_ichannels())
+      csource->source.n_ichannels())
     {
-      y /= CHANNEL_HEIGHT (csource) / csource_source.n_ichannels();
+      y /= CHANNEL_HEIGHT (csource) / csource->source.n_ichannels();
       channel = y;
     }
 
@@ -575,17 +574,15 @@ bst_canvas_source_ochannel_at (BstCanvasSource *csource,
 
   assert_return (BST_IS_CANVAS_SOURCE (csource), 0);
 
-  Bse::SourceH csource_source = Bse::SourceH::down_cast (bse_server.from_proxy (csource->source));
-
   gnome_canvas_item_w2i (GNOME_CANVAS_ITEM (csource), &x, &y);
 
   x -= OCHANNEL_X (csource);
   y -= OCHANNEL_Y (csource);
   if (x > 0 && x < CHANNEL_WIDTH (csource) &&
       y > 0 && y < CHANNEL_HEIGHT (csource) &&
-      csource_source.n_ochannels())
+      csource->source.n_ochannels())
     {
-      y /= CHANNEL_HEIGHT (csource) / csource_source.n_ochannels();
+      y /= CHANNEL_HEIGHT (csource) / csource->source.n_ochannels();
       channel = y;
     }
 
@@ -651,17 +648,15 @@ bst_canvas_source_build_channels (BstCanvasSource *csource,
   gdouble d_y;
   gboolean east_channel = CHANNEL_EAST (csource, is_input);
 
-  Bse::SourceH csource_source = Bse::SourceH::down_cast (bse_server.from_proxy (csource->source));
-
   if (is_input)
     {
-      n_channels = csource_source.n_ichannels();
+      n_channels = csource->source.n_ichannels();
       x1 = ICHANNEL_X (csource);
       y1 = ICHANNEL_Y (csource);
     }
   else
     {
-      n_channels = csource_source.n_ochannels();
+      n_channels = csource->source.n_ochannels();
       x1 = OCHANNEL_X (csource);
       y1 = OCHANNEL_Y (csource);
     }
@@ -710,8 +705,8 @@ bst_canvas_source_build_channels (BstCanvasSource *csource,
   for (int i = 0; i < n_channels; i++)
     {
       GnomeCanvasItem *item;
-      gboolean is_jchannel = is_input && csource_source.is_joint_ichannel_by_id (i);
-      const String label = is_input ? csource_source.ichannel_label (i) : csource_source.ochannel_label (i);
+      gboolean is_jchannel = is_input && csource->source.is_joint_ichannel_by_id (i);
+      const String label = is_input ? csource->source.ichannel_label (i) : csource->source.ochannel_label 
(i);
       guint tmp_color = is_jchannel ? color2 : color1;
 
       y2 = y1 + d_y;
@@ -813,7 +808,7 @@ bst_canvas_source_build_async (gpointer data)
       if (!csource->text)
         {
           /* add text item, invoke name_changed callback to setup the text value */
-          guint ocolor = csource->source && bse_item_internal (csource->source) ? RGBA_INTERNAL : RGBA_BLACK;
+          guint ocolor = csource->source && bse_item_internal (csource->source.proxy_id()) ? RGBA_INTERNAL : 
RGBA_BLACK;
           csource->text = gnome_canvas_item_new (group,
                                                  GNOME_TYPE_CANVAS_TEXT,
                                                  "fill_color_rgba", ocolor,
@@ -906,8 +901,7 @@ bst_canvas_source_changed (BstCanvasSource *csource)
       GnomeCanvasItem *item = GNOME_CANVAS_ITEM (csource);
       gdouble x = 0, y = 0;
       gnome_canvas_item_i2w (item, &x, &y);
-      Bse::SourceH csource_source = Bse::SourceH::down_cast (bse_server.from_proxy (csource->source));
-      csource_source.set_pos (x / BST_CANVAS_SOURCE_PIXEL_SCALE, y / -BST_CANVAS_SOURCE_PIXEL_SCALE);
+      csource->source.set_pos (x / BST_CANVAS_SOURCE_PIXEL_SCALE, y / -BST_CANVAS_SOURCE_PIXEL_SCALE);
     }
 }
 
@@ -934,7 +928,7 @@ bst_canvas_source_event (GnomeCanvasItem *item,
               csource->move_dx = x;
               csource->move_dy = y;
               csource->in_move = TRUE;
-              bse_item_group_undo (csource->source, "Move");
+              bse_item_group_undo (csource->source.proxy_id(), "Move");
             }
          gdk_cursor_destroy (fleur);
          handled = TRUE;
@@ -952,7 +946,6 @@ bst_canvas_source_event (GnomeCanvasItem *item,
        }
       else
        {
-          Bse::SourceH csource_source = Bse::SourceH::down_cast (bse_server.from_proxy (csource->source));
          guint channel;
          const gchar *prefix = NULL;
           String label, ident;
@@ -961,8 +954,8 @@ bst_canvas_source_event (GnomeCanvasItem *item,
          channel = bst_canvas_source_ichannel_at (csource, event->motion.x, event->motion.y);
          if (channel != ~uint (0))
            {
-             label = csource_source.ichannel_label (channel);
-             ident = csource_source.ichannel_ident (channel);
+             label = csource->source.ichannel_label (channel);
+             ident = csource->source.ichannel_ident (channel);
              prefix = _("Input");
            }
          else
@@ -970,8 +963,8 @@ bst_canvas_source_event (GnomeCanvasItem *item,
              channel = bst_canvas_source_ochannel_at (csource, event->motion.x, event->motion.y);
              if (channel != ~uint (0))
                {
-                 label = csource_source.ochannel_label (channel);
-                 ident = csource_source.ochannel_ident (channel);
+                 label = csource->source.ochannel_label (channel);
+                 ident = csource->source.ochannel_ident (channel);
                  prefix = _("Output");
                }
            }
@@ -984,7 +977,7 @@ bst_canvas_source_event (GnomeCanvasItem *item,
     case GDK_BUTTON_RELEASE:
       if (bst_mouse_button_move (event) && csource->in_move)
        {
-          bse_item_ungroup_undo (csource->source);
+          bse_item_ungroup_undo (csource->source.proxy_id());
          csource->in_move = FALSE;
          gnome_canvas_item_ungrab (item, event->button.time);
          handled = TRUE;
@@ -1050,11 +1043,15 @@ bst_canvas_source_child_event (BstCanvasSource *csource,
 static void
 bst_canvas_source_class_init (BstCanvasSourceClass *klass)
 {
-  GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
-  GnomeCanvasItemClass *canvas_item_class = GNOME_CANVAS_ITEM_CLASS (klass);
-  /* GnomeCanvasGroupClass *canvas_group_class = GNOME_CANVAS_GROUP_CLASS (klass); */
+  parent_class = g_type_class_peek_parent (klass);
 
+  GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
   object_class->destroy = bst_canvas_source_destroy;
+
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize = bst_canvas_source_finalize;
+
+  GnomeCanvasItemClass *canvas_item_class = GNOME_CANVAS_ITEM_CLASS (klass);
   canvas_item_class->event = bst_canvas_source_event;
   klass->update_links = NULL;
 
diff --git a/beast-gtk/bstcanvassource.hh b/beast-gtk/bstcanvassource.hh
index 4ae2e5e..6841ec1 100644
--- a/beast-gtk/bstcanvassource.hh
+++ b/beast-gtk/bstcanvassource.hh
@@ -21,7 +21,7 @@ struct _BstCanvasSource
 {
   GnomeCanvasGroup parent_object;
 
-  SfiProxy        source;
+  Bse::SourceH     source;
 
   GtkWidget      *params_dialog;
   GtkWidget      *source_info;
diff --git a/beast-gtk/bstsnetrouter.cc b/beast-gtk/bstsnetrouter.cc
index 64c2f7e..09fbc90 100644
--- a/beast-gtk/bstsnetrouter.cc
+++ b/beast-gtk/bstsnetrouter.cc
@@ -153,24 +153,22 @@ bst_snet_router_update_links (BstSNetRouter   *self,
         self->canvas_links = sfi_ring_append (self->canvas_links, link);
     }
 
-  Bse::SourceH csource_source = Bse::SourceH::down_cast (bse_server.from_proxy (csource->source));
-
   /* now we walk the (c)source's input channels, keep
    * existing links and create new ones on the fly
    */
-  for (int i = 0; i < csource_source.n_ichannels(); i++)
+  for (int i = 0; i < csource->source.n_ichannels(); i++)
     {
-      guint j, n_joints = csource_source.ichannel_get_n_joints (i);
+      guint j, n_joints = csource->source.ichannel_get_n_joints (i);
       for (j = 0; j < n_joints; j++)
         {
-          Bse::ObjectH obj = bse_server.from_proxy (csource->source);
+          Bse::ObjectH obj = csource->source;
           assert_return (obj != NULL);
-          Bse::SourceH isource = Bse::SourceH::down_cast (bse_server.from_proxy (csource->source));
+          Bse::SourceH isource = csource->source;
           assert_return (isource != NULL);
           SfiProxy osource = isource.ichannel_get_osource (i, j).proxy_id();
           if (!osource)
             continue;
-          guint ochannel = csource_source.ichannel_get_ochannel (i, j);
+          guint ochannel = csource->source.ichannel_get_ochannel (i, j);
           BstCanvasSource *ocsource = bst_snet_router_csource_from_source (self, osource);
           if (!ocsource)
             {
@@ -472,7 +470,7 @@ bst_snet_router_csource_from_source (BstSNetRouter *router,
     {
       BstCanvasSource *csource = (BstCanvasSource*) list->data;
 
-      if (BST_IS_CANVAS_SOURCE (csource) && csource->source == source)
+      if (BST_IS_CANVAS_SOURCE (csource) && csource->source.proxy_id() == source)
         return csource;
     }
 
@@ -603,7 +601,7 @@ bst_snet_router_root_event (BstSNetRouter   *self,
                 gxk_status_set (GXK_STATUS_WAIT, _("Create Link"), _("Select input module"));
               handled = TRUE;
             }
-          else if (csource && csource->source != (SfiProxy) self->snet.proxy_id())
+          else if (csource && csource->source != self->snet)
             {
               if (bst_mouse_button_activate2 (event))
                 bst_canvas_source_toggle_info (csource);
@@ -623,15 +621,13 @@ bst_snet_router_root_event (BstSNetRouter   *self,
             }
           else
             {
-              Bse::SourceH csource_source = Bse::SourceH::down_cast (bse_server.from_proxy 
(csource->source));
-              Bse::SourceH drag_csource_source = Bse::SourceH::down_cast (bse_server.from_proxy 
(self->drag_csource->source));
               Bse::Error error;
               if (!csource || (self->drag_is_input ? ochannel : ichannel) == ~uint (0))
                 error = self->drag_is_input ? Bse::Error::SOURCE_NO_SUCH_OCHANNEL : 
Bse::Error::SOURCE_NO_SUCH_ICHANNEL;
               else if (self->drag_is_input)
-                error = drag_csource_source.set_input_by_id (self->drag_channel, csource_source, ochannel);
+                error = self->drag_csource->source.set_input_by_id (self->drag_channel, csource->source, 
ochannel);
               else
-                error = csource_source.set_input_by_id (ichannel, drag_csource_source, self->drag_channel);
+                error = csource->source.set_input_by_id (ichannel, self->drag_csource->source, 
self->drag_channel);
               self->drag_csource = NULL;
               self->drag_channel = ~0;
               bst_snet_router_reset_tool (self);
@@ -643,36 +639,35 @@ bst_snet_router_root_event (BstSNetRouter   *self,
         {
           if (csource)
             {
-              Bse::SourceH csource_source = Bse::SourceH::down_cast (bse_server.from_proxy 
(csource->source));
               GtkWidget *choice;
-              gchar *source_name = g_strconcat (bse_item_get_type_name (csource->source),
+              gchar *source_name = g_strconcat (bse_item_get_type_name (csource->source.proxy_id()),
                                                 ": ",
-                                                bse_item_get_name (csource->source),
+                                                bse_item_get_name (csource->source.proxy_id()),
                                                 NULL);
               /* create popup sumenu */
               uint has_inputs = 0, monitor_ids = 1000000;
               choice = bst_choice_menu_createv ("<BEAST-SNetRouter>/ModuleChannelPopup", NULL);
-              for (int i = 0; i < csource_source.n_ochannels(); i++)
+              for (int i = 0; i < csource->source.n_ochannels(); i++)
                 {
-                  gchar *name = g_strdup_format ("%d: %s", i + 1, csource_source.ochannel_label (i));
+                  gchar *name = g_strdup_format ("%d: %s", i + 1, csource->source.ochannel_label (i));
                   bst_choice_menu_add_choice_and_free (choice, BST_CHOICE (monitor_ids + i, name, NONE));
                   g_free (name);
                 }
               /* create popup */
-              for (int i = 0; has_inputs == 0 && i < csource_source.n_ichannels(); i++)
-                has_inputs += csource_source.ichannel_get_n_joints (i);
+              for (int i = 0; has_inputs == 0 && i < csource->source.n_ichannels(); i++)
+                has_inputs += csource->source.ichannel_get_n_joints (i);
               choice = bst_choice_menu_createv ("<BEAST-SNetRouter>/ModulePopup",
                                                 BST_CHOICE_TITLE (source_name),
                                                 BST_CHOICE_SEPERATOR,
                                                 BST_CHOICE (2, _("Properties"), PROPERTIES),
                                                 BST_CHOICE (6, _("Reset Properties"), PROPERTIES_RESET),
                                                 BST_CHOICE_S (3, _("Disconnect Inputs"), NO_ILINK, 
has_inputs),
-                                                BST_CHOICE_S (4, _("Disconnect Outputs"), NO_OLINK, 
csource_source.has_outputs()),
+                                                BST_CHOICE_S (4, _("Disconnect Outputs"), NO_OLINK, 
csource->source.has_outputs()),
                                                 BST_CHOICE_SEPERATOR,
                                                 BST_CHOICE (5, _("Show Info"), INFO),
                                                 BST_CHOICE_SUBMENU (_("Output Signal Monitor"), choice, 
SIGNAL),
                                                 BST_CHOICE_SEPERATOR,
-                                                BST_CHOICE_S (1, _("Delete"), DELETE, csource->source != 
(SfiProxy) self->snet.proxy_id()),
+                                                BST_CHOICE_S (1, _("Delete"), DELETE, csource->source != 
self->snet),
                                                 BST_CHOICE_END);
               g_free (source_name);
               int i = bst_choice_modal (choice, event->button.button, event->button.time);
@@ -687,21 +682,21 @@ bst_snet_router_root_event (BstSNetRouter   *self,
                   bst_canvas_source_reset_params (csource);
                   break;
                 case 3:
-                  csource_source.clear_inputs();
+                  csource->source.clear_inputs();
                   break;
                 case 4:
-                  csource_source.clear_outputs();
+                  csource->source.clear_outputs();
                   break;
                 case 5:
                   bst_canvas_source_popup_info (csource);
                   break;
                 case 1:
-                  error = self->snet.remove_source (csource_source);
+                  error = self->snet.remove_source (csource->source);
                   bst_status_eprintf (error, _("Remove Module"));
                   break;
                 case 0: break;
                 default:
-                  dialog = bst_scrollgraph_build_dialog (GTK_WIDGET (self), csource_source, i - monitor_ids);
+                  dialog = bst_scrollgraph_build_dialog (GTK_WIDGET (self), csource->source, i - 
monitor_ids);
                   gtk_widget_show (dialog);
                   break;
                 }
@@ -728,9 +723,7 @@ bst_snet_router_root_event (BstSNetRouter   *self,
                   Bse::Error error;
                 case 1:
                   {
-                    Bse::SourceH icsource = Bse::SourceH::down_cast (bse_server.from_proxy 
(clink->icsource->source));
-                    Bse::SourceH ocsource = Bse::SourceH::down_cast (bse_server.from_proxy 
(clink->ocsource->source));
-                    error = icsource.unset_input_by_id (clink->ichannel, ocsource, clink->ochannel);
+                    error = clink->icsource->source.unset_input_by_id (clink->ichannel, 
clink->ocsource->source, clink->ochannel);
                     bst_status_eprintf (error, _("Delete Link"));
                   }
                   break;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]