rename graph clients when app is renamed

this fixes autoconnection too because hidden clients are searched by name
This commit is contained in:
Nedko Arnaudov 2009-12-26 22:46:20 +02:00
parent 54897f8e92
commit 093af66573
11 changed files with 171 additions and 3 deletions

View File

@ -55,9 +55,15 @@ struct ladish_app_supervisor
uint64_t version;
uint64_t next_id;
struct list_head applist;
void (* on_app_renamed)(const char * old_name, const char * new_app_name);
};
bool ladish_app_supervisor_create(ladish_app_supervisor_handle * supervisor_handle_ptr, const char * opath, const char * name)
bool
ladish_app_supervisor_create(
ladish_app_supervisor_handle * supervisor_handle_ptr,
const char * opath,
const char * name,
void (* on_app_renamed)(const char * old_name, const char * new_app_name))
{
struct ladish_app_supervisor * supervisor_ptr;
@ -90,6 +96,8 @@ bool ladish_app_supervisor_create(ladish_app_supervisor_handle * supervisor_hand
INIT_LIST_HEAD(&supervisor_ptr->applist);
supervisor_ptr->on_app_renamed = on_app_renamed;
*supervisor_handle_ptr = (ladish_app_supervisor_handle)supervisor_ptr;
return true;
@ -881,6 +889,7 @@ static void set_app_properties(struct dbus_method_call * call_ptr)
if (name_buffer != NULL)
{
supervisor_ptr->on_app_renamed(app_ptr->name, name_buffer);
free(app_ptr->name);
app_ptr->name = name_buffer;
}

View File

@ -35,7 +35,8 @@ bool
ladish_app_supervisor_create(
ladish_app_supervisor_handle * supervisor_handle_ptr,
const char * opath,
const char * name);
const char * name,
void (* on_app_renamed)(const char * old_name, const char * new_app_name));
void
ladish_app_supervisor_destroy(

View File

@ -1626,6 +1626,55 @@ ladish_graph_remove_port(
return port_ptr->client_ptr->client;
}
bool
ladish_graph_rename_client(
ladish_graph_handle graph_handle,
ladish_client_handle client_handle,
const char * new_client_name)
{
char * name;
struct ladish_graph_client * client_ptr;
char * old_name;
name = strdup(new_client_name);
if (name == NULL)
{
log_error("strdup('%s') failed.", new_client_name);
return false;
}
client_ptr = ladish_graph_find_client(graph_ptr, client_handle);
if (client_ptr == NULL)
{
free(name);
ASSERT_NO_PASS;
return false;
}
old_name = client_ptr->name;
client_ptr->name = name;
graph_ptr->graph_version++;
if (!client_ptr->hidden && graph_ptr->opath != NULL)
{
dbus_signal_emit(
g_dbus_connection,
graph_ptr->opath,
JACKDBUS_IFACE_PATCHBAY,
"ClientRenamed",
"ttss",
&graph_ptr->graph_version,
&client_ptr->id,
&old_name,
&client_ptr->name);
}
free(old_name);
return true;
}
bool
ladish_graph_rename_port(
ladish_graph_handle graph_handle,

View File

@ -69,6 +69,12 @@ ladish_graph_remove_client(
ladish_client_handle client_handle,
bool destroy_ports);
bool
ladish_graph_rename_client(
ladish_graph_handle graph_handle,
ladish_client_handle client_handle,
const char * new_client_name);
bool
ladish_graph_add_port(
ladish_graph_handle graph_handle,

View File

@ -278,6 +278,23 @@ static void on_jack_server_disappeared(void)
ladish_environment_reset(&g_studio.env_store, ladish_environment_jack_server_present);
}
static void on_app_renamed(const char * old_name, const char * new_app_name)
{
ladish_client_handle client;
client = ladish_graph_find_client_by_name(g_studio.jack_graph, old_name);
if (client != NULL)
{
ladish_graph_rename_client(g_studio.jack_graph, client, new_app_name);
}
client = ladish_graph_find_client_by_name(g_studio.studio_graph, old_name);
if (client != NULL)
{
ladish_graph_rename_client(g_studio.studio_graph, client, new_app_name);
}
}
bool studio_init(void)
{
log_info("studio object construct");
@ -323,7 +340,7 @@ bool studio_init(void)
goto jack_graph_destroy;
}
if (!ladish_app_supervisor_create(&g_studio.app_supervisor, STUDIO_OBJECT_PATH, "studio"))
if (!ladish_app_supervisor_create(&g_studio.app_supervisor, STUDIO_OBJECT_PATH, "studio", on_app_renamed))
{
log_error("ladish_app_supervisor_create() failed.");
goto studio_graph_destroy;

View File

@ -695,6 +695,7 @@ ladish_virtualizer_create(
virtualizer_ptr,
clear,
client_appeared,
NULL, /* jackdbus does not have client rename functionality (yet) */
client_disappeared,
port_appeared,
port_renamed,

View File

@ -252,6 +252,14 @@ canvas_create_module(
#define module_ptr ((boost::shared_ptr<FlowCanvas::Module> *)module)
void
canvas_set_module_name(
canvas_module_handle module,
const char * name)
{
module_ptr->get()->set_name(name);
}
bool
canvas_destroy_module(
canvas_handle canvas,

View File

@ -100,6 +100,11 @@ canvas_destroy_module(
canvas_handle canvas,
canvas_module_handle module);
void
canvas_set_module_name(
canvas_module_handle module,
const char * name);
bool
canvas_create_port(
canvas_handle canvas,

View File

@ -338,6 +338,22 @@ client_disappeared(
free(client_ptr);
}
static void client_renamed(void * graph_canvas, uint64_t id, const char * old_name, const char * new_name)
{
struct client * client_ptr;
log_info("canvas::client_renamed(%"PRIu64", '%s', '%s')", id, old_name, new_name);
client_ptr = find_client(graph_canvas_ptr, id);
if (client_ptr == NULL)
{
log_error("cannot find renamed client %"PRIu64, id);
return;
}
canvas_set_module_name(client_ptr->canvas_module, new_name);
}
static
void
port_appeared(
@ -579,6 +595,7 @@ graph_canvas_attach(
graph_canvas,
clear,
client_appeared,
client_renamed,
client_disappeared,
port_appeared,
port_renamed,

View File

@ -32,6 +32,7 @@ struct monitor
void * context;
void (* clear)(void * context);
void (* client_appeared)(void * context, uint64_t id, const char * name);
void (* client_renamed)(void * context, uint64_t client_id, const char * old_client_name, const char * new_client_name);
void (* client_disappeared)(void * context, uint64_t id);
void (* port_appeared)(void * context, uint64_t client_id, uint64_t port_id, const char * port_name, bool is_input, bool is_terminal, bool is_midi);
void (* port_renamed)(void * context, uint64_t client_id, uint64_t port_id, const char * old_port_name, const char * new_port_name);
@ -76,6 +77,27 @@ static void client_appeared(struct graph * graph_ptr, uint64_t id, const char *
}
}
static
void
client_renamed(
struct graph * graph_ptr,
uint64_t client_id,
const char * old_client_name,
const char * new_client_name)
{
struct list_head * node_ptr;
struct monitor * monitor_ptr;
list_for_each(node_ptr, &graph_ptr->monitors)
{
monitor_ptr = list_entry(node_ptr, struct monitor, siblings);
if (monitor_ptr->client_renamed != NULL)
{
monitor_ptr->client_renamed(monitor_ptr->context, client_id, old_client_name, new_client_name);
}
}
}
static void client_disappeared(struct graph * graph_ptr, uint64_t id)
{
struct list_head * node_ptr;
@ -483,6 +505,7 @@ graph_proxy_attach(
void * context,
void (* clear)(void * context),
void (* client_appeared)(void * context, uint64_t id, const char * name),
void (* client_renamed)(void * context, uint64_t client_id, const char * old_client_name, const char * new_client_name),
void (* client_disappeared)(void * context, uint64_t id),
void (* port_appeared)(void * context, uint64_t client_id, uint64_t port_id, const char * port_name, bool is_input, bool is_terminal, bool is_midi),
void (* port_renamed)(void * context, uint64_t client_id, uint64_t port_id, const char * old_port_name, const char * new_port_name),
@ -507,6 +530,7 @@ graph_proxy_attach(
monitor_ptr->context = context;
monitor_ptr->clear = clear;
monitor_ptr->client_appeared = client_appeared;
monitor_ptr->client_renamed = client_renamed;
monitor_ptr->client_disappeared = client_disappeared;
monitor_ptr->port_appeared = port_appeared;
monitor_ptr->port_renamed = port_renamed;
@ -594,6 +618,35 @@ static void on_client_appeared(void * graph, DBusMessage * message_ptr)
}
}
static void on_client_renamed(void * graph, DBusMessage * message_ptr)
{
dbus_uint64_t new_graph_version;
dbus_uint64_t client_id;
const char * old_client_name;
const char * new_client_name;
if (!dbus_message_get_args(
message_ptr,
&g_dbus_error,
DBUS_TYPE_UINT64, &new_graph_version,
DBUS_TYPE_UINT64, &client_id,
DBUS_TYPE_STRING, &old_client_name,
DBUS_TYPE_STRING, &new_client_name,
DBUS_TYPE_INVALID))
{
log_error("dbus_message_get_args() failed to extract ClientRenamed signal arguments (%s)", g_dbus_error.message);
dbus_error_free(&g_dbus_error);
return;
}
if (new_graph_version > graph_ptr->version)
{
//log_info("got new graph version %llu", (unsigned long long)new_graph_version);
graph_ptr->version = new_graph_version;
client_renamed(graph_ptr, client_id, old_client_name, new_client_name);
}
}
static void on_client_disappeared(void * graph, DBusMessage * message_ptr)
{
dbus_uint64_t new_graph_version;
@ -914,6 +967,7 @@ bool graph_proxy_get_client_pid(graph_proxy_handle graph, uint64_t client_id, in
static struct dbus_signal_hook g_signal_hooks[] =
{
{"ClientAppeared", on_client_appeared},
{"ClientRenamed", on_client_renamed},
{"ClientDisappeared", on_client_disappeared},
{"PortAppeared", on_port_appeared},
{"PortRenamed", on_port_renamed},

View File

@ -62,6 +62,7 @@ graph_proxy_attach(
void * context,
void (* clear)(void * context),
void (* client_appeared)(void * context, uint64_t id, const char * name),
void (* client_renamed)(void * context, uint64_t client_id, const char * old_client_name, const char * new_client_name),
void (* client_disappeared)(void * context, uint64_t id),
void (* port_appeared)(void * context, uint64_t client_id, uint64_t port_id, const char * port_name, bool is_input, bool is_terminal, bool is_midi),
void (* port_renamed)(void * context, uint64_t client_id, uint64_t port_id, const char * old_port_name, const char * new_port_name),