Implement graph_canvas::attach()
graph needs to be activated after monitors are attached
This commit is contained in:
parent
cc542efbac
commit
7230e29be9
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -48,6 +48,10 @@ void
|
|||
graph_destroy(
|
||||
graph_handle graph);
|
||||
|
||||
bool
|
||||
graph_activate(
|
||||
graph_handle graph);
|
||||
|
||||
bool
|
||||
graph_attach(
|
||||
graph_handle graph,
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue