diff --git a/graph_proxy.c b/graph_proxy.c index 98f49e50..632b2651 100644 --- a/graph_proxy.c +++ b/graph_proxy.c @@ -64,6 +64,7 @@ struct graph char * service; char * object; uint64_t version; + bool active; }; DBusHandlerResult message_hook(DBusConnection *, DBusMessage *, void *); @@ -216,6 +217,8 @@ static void refresh_internal(struct graph * graph_ptr, bool force) const char *port2_name; dbus_uint64_t connection_id; + lash_info("refresh_internal() called"); + if (force) { version = 0; // workaround module split/join stupidity @@ -363,17 +366,6 @@ graph_create( graph_handle * graph_handle_ptr) { struct graph * graph_ptr; - char rule[1024]; - const char ** signal; - - const char * patchbay_signals[] = { - "ClientAppeared", - "ClientDisappeared", - "PortAppeared", - "PortDisappeared", - "PortsConnected", - "PortsDisconnected", - NULL}; graph_ptr = malloc(sizeof(struct graph)); if (graph_ptr == NULL) @@ -399,29 +391,7 @@ graph_create( INIT_LIST_HEAD(&graph_ptr->monitors); graph_ptr->version = 0; - - for (signal = patchbay_signals; *signal != NULL; signal++) - { - snprintf( - rule, - sizeof(rule), - "type='signal',sender='%s',path='%s',interface='" JACKDBUS_IFACE_PATCHBAY "',member='%s'", - service, - object, - *signal); - - dbus_bus_add_match(g_dbus_connection, rule, &g_dbus_error); - if (dbus_error_is_set(&g_dbus_error)) - { - lash_error("Failed to add D-Bus match rule: %s", g_dbus_error.message); - dbus_error_free(&g_dbus_error); - return false; - } - } - - dbus_connection_add_filter(g_dbus_connection, message_hook, graph_ptr, NULL); - - refresh_internal(graph_ptr, true); + graph_ptr->active = false; *graph_handle_ptr = (graph_handle)graph_ptr; @@ -450,6 +420,62 @@ graph_destroy( free(graph_ptr); } +bool +graph_activate( + graph_handle graph) +{ + char rule[1024]; + const char ** signal; + + const char * patchbay_signals[] = { + "ClientAppeared", + "ClientDisappeared", + "PortAppeared", + "PortDisappeared", + "PortsConnected", + "PortsDisconnected", + NULL}; + + if (list_empty(&graph_ptr->monitors)) + { + lash_error("no monitors to activate"); + return false; + } + + if (graph_ptr->active) + { + lash_error("graph already active"); + return false; + } + + for (signal = patchbay_signals; *signal != NULL; signal++) + { + snprintf( + rule, + sizeof(rule), + "type='signal',sender='%s',path='%s',interface='" JACKDBUS_IFACE_PATCHBAY "',member='%s'", + graph_ptr->service, + graph_ptr->object, + *signal); + + dbus_bus_add_match(g_dbus_connection, rule, &g_dbus_error); + if (dbus_error_is_set(&g_dbus_error)) + { + lash_error("Failed to add D-Bus match rule: %s", g_dbus_error.message); + dbus_error_free(&g_dbus_error); + return false; + } + } + + dbus_connection_add_filter(g_dbus_connection, message_hook, graph_ptr, NULL); + + graph_ptr->active = true; + + refresh_internal(graph_ptr, true); + + return true; +} + bool graph_attach( graph_handle graph, @@ -464,6 +490,11 @@ graph_attach( { struct monitor * monitor_ptr; + if (graph_ptr->active) + { + return false; + } + monitor_ptr = malloc(sizeof(struct monitor)); if (monitor_ptr == NULL) { diff --git a/graph_proxy.h b/graph_proxy.h index 9096ea82..7f55b211 100644 --- a/graph_proxy.h +++ b/graph_proxy.h @@ -48,6 +48,10 @@ void graph_destroy( graph_handle graph); +bool +graph_activate( + graph_handle graph); + bool graph_attach( graph_handle graph, diff --git a/gui/Patchage.cpp b/gui/Patchage.cpp index 4129b5f9..761aded7 100644 --- a/gui/Patchage.cpp +++ b/gui/Patchage.cpp @@ -45,6 +45,7 @@ #include "dbus_helpers.h" #include "load_projects_dialog.hpp" #include "graph_canvas.h" +#include "../jack_proxy.h" Patchage * g_app; @@ -52,6 +53,7 @@ Patchage * g_app; //#define LOG_TO_STATUS graph_canvas_handle g_jack_graph_canvas; +graph_handle g_jack_graph; /* Gtk helpers (resize combo boxes) */ @@ -117,8 +119,6 @@ Patchage::Patchage(int argc, char** argv) { g_app = this; - graph_canvas_create(1600 * 2, 1200 * 2, &g_jack_graph_canvas); - while (argc > 0) { if (!strcmp(*argv, "--help")) { std::cout << "Usage: patchage [OPTIONS]\nOptions: --no-alsa" << std::endl; @@ -131,6 +131,11 @@ Patchage::Patchage(int argc, char** argv) patchage_dbus_init(); + graph_create(JACKDBUS_SERVICE, JACKDBUS_OBJECT, &g_jack_graph); + graph_canvas_create(1600 * 2, 1200 * 2, &g_jack_graph_canvas); + graph_canvas_attach(g_jack_graph_canvas, g_jack_graph); + graph_activate(g_jack_graph); + Glib::set_application_name("Patchage"); _about_win->property_program_name() = "Patchage"; _about_win->property_logo_icon_name() = "gladish"; diff --git a/gui/graph_canvas.c b/gui/graph_canvas.c index 2bf2245c..4e8e5e50 100644 --- a/gui/graph_canvas.c +++ b/gui/graph_canvas.c @@ -25,8 +25,10 @@ */ #include +#include #include "graph_canvas.h" +#include "../common/debug.h" struct graph_canvas { @@ -63,6 +65,81 @@ graph_canvas_create( #define graph_canvas_ptr ((struct graph_canvas *)graph_canvas) +static +void +clear( + void * graph_canvas) +{ + lash_info("canvas::clear()"); +} + +static +void +client_appeared( + void * graph_canvas, + uint64_t id, + const char * name) +{ + lash_info("canvas::client_appeared(%"PRIu64", \"%s\")", id, name); +} + +static +void +client_disappeared( + void * graph_canvas, + uint64_t id) +{ + lash_info("canvas::client_disappeared(%"PRIu64")", id); +} + +static +void +port_appeared( + void * graph_canvas, + uint64_t client_id, + uint64_t port_id, + const char * port_name, + bool is_input, + bool is_terminal, + bool is_midi) +{ + lash_info("canvas::port_appeared(%"PRIu64", %"PRIu64", \"%s\")", client_id, port_id, port_name); +} + +static +void +port_disappeared( + void * graph_canvas, + uint64_t client_id, + uint64_t port_id) +{ + lash_info("canvas::port_disappeared(%"PRIu64", %"PRIu64")", client_id, port_id); +} + +static +void +ports_connected( + void * graph_canvas, + uint64_t client1_id, + uint64_t port1_id, + uint64_t client2_id, + uint64_t port2_id) +{ + lash_info("canvas::ports_connected(%"PRIu64", %"PRIu64", %"PRIu64", %"PRIu64")", client1_id, port1_id, client2_id, port2_id); +} + +static +void +ports_disconnected( + void * graph_canvas, + uint64_t client1_id, + uint64_t port1_id, + uint64_t client2_id, + uint64_t port2_id) +{ + lash_info("canvas::ports_disconnected(%"PRIu64", %"PRIu64", %"PRIu64", %"PRIu64")", client1_id, port1_id, client2_id, port2_id); +} + void graph_canvas_destroy( graph_canvas_handle graph_canvas) @@ -80,13 +157,34 @@ graph_canvas_attach( graph_canvas_handle graph_canvas, graph_handle graph) { - return false; + assert(graph_canvas_ptr->graph == NULL); + + if (!graph_attach( + graph, + graph_canvas, + clear, + client_appeared, + client_disappeared, + port_appeared, + port_disappeared, + ports_connected, + ports_disconnected)) + { + return false; + } + + graph_canvas_ptr->graph = graph; + + return true; } void graph_canvas_detach( graph_canvas_handle graph_canvas) { + assert(graph_canvas_ptr->graph != NULL); + graph_detach(graph_canvas_ptr->graph, graph_canvas); + graph_canvas_ptr->graph = NULL; } canvas_handle