rename graph clients when app is renamed
this fixes autoconnection too because hidden clients are searched by name
This commit is contained in:
parent
54897f8e92
commit
093af66573
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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},
|
||||
|
|
|
@ -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),
|
||||
|
|
Loading…
Reference in New Issue