Implement graph_canvas::attach()

graph needs to be activated after monitors are attached
This commit is contained in:
Nedko Arnaudov 2009-08-12 15:41:09 +03:00
parent cc542efbac
commit 7230e29be9
4 changed files with 175 additions and 37 deletions

View File

@ -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)
{

View File

@ -48,6 +48,10 @@ void
graph_destroy(
graph_handle graph);
bool
graph_activate(
graph_handle graph);
bool
graph_attach(
graph_handle graph,

View File

@ -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";

View File

@ -25,8 +25,10 @@
*/
#include <stdlib.h>
#include <inttypes.h>
#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