New studio command. Closes #7
This commit is contained in:
parent
3978e8c4db
commit
f55a45416e
|
@ -183,6 +183,25 @@ static void ladish_delete_studio(method_call_t * call_ptr)
|
|||
}
|
||||
}
|
||||
|
||||
static void ladish_new_studio(method_call_t * call_ptr)
|
||||
{
|
||||
const char * name;
|
||||
|
||||
dbus_error_init(&g_dbus_error);
|
||||
|
||||
if (!dbus_message_get_args(call_ptr->message, &g_dbus_error, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID))
|
||||
{
|
||||
lash_dbus_error(call_ptr, LASH_DBUS_ERROR_INVALID_ARGS, "Invalid arguments to method \"%s\": %s", call_ptr->method_name, g_dbus_error.message);
|
||||
dbus_error_free(&g_dbus_error);
|
||||
return;
|
||||
}
|
||||
|
||||
if (studio_new(call_ptr, name))
|
||||
{
|
||||
method_return_new_void(call_ptr);
|
||||
}
|
||||
}
|
||||
|
||||
static void ladish_get_application_list(method_call_t * call_ptr)
|
||||
{
|
||||
DBusMessageIter iter;
|
||||
|
@ -281,6 +300,10 @@ METHOD_ARGS_BEGIN(GetStudioList, "Get list of studios")
|
|||
METHOD_ARG_DESCRIBE_OUT("studio_list", "a(sa{sv})", "List of studios, name and properties")
|
||||
METHOD_ARGS_END
|
||||
|
||||
METHOD_ARGS_BEGIN(NewStudio, "New studio")
|
||||
METHOD_ARG_DESCRIBE_IN("studio_name", "s", "Name of studio, if empty name will be generated")
|
||||
METHOD_ARGS_END
|
||||
|
||||
METHOD_ARGS_BEGIN(LoadStudio, "Load studio")
|
||||
METHOD_ARG_DESCRIBE_IN("studio_name", "s", "Name of studio to load")
|
||||
METHOD_ARG_DESCRIBE_IN("options", "a{sv}", "Load options")
|
||||
|
@ -300,6 +323,7 @@ METHOD_ARGS_END
|
|||
METHODS_BEGIN
|
||||
METHOD_DESCRIBE(IsStudioLoaded, ladish_is_studio_loaded)
|
||||
METHOD_DESCRIBE(GetStudioList, ladish_get_studio_list)
|
||||
METHOD_DESCRIBE(NewStudio, ladish_new_studio)
|
||||
METHOD_DESCRIBE(LoadStudio, ladish_load_studio)
|
||||
METHOD_DESCRIBE(DeleteStudio, ladish_delete_studio)
|
||||
METHOD_DESCRIBE(GetApplicationList, ladish_get_application_list)
|
||||
|
|
|
@ -1607,6 +1607,43 @@ static void ladish_save_studio(method_call_t * call_ptr)
|
|||
}
|
||||
}
|
||||
|
||||
bool studio_new(void * call_ptr, const char * studio_name)
|
||||
{
|
||||
studio_clear();
|
||||
|
||||
assert(g_studio.name == NULL);
|
||||
if (*studio_name != 0)
|
||||
{
|
||||
g_studio.name = strdup(studio_name);
|
||||
if (g_studio.name == NULL)
|
||||
{
|
||||
lash_dbus_error(call_ptr, LASH_DBUS_ERROR_GENERIC, "strdup() failed to allocate studio name.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (!studio_name_generate(&g_studio.name))
|
||||
{
|
||||
lash_dbus_error(call_ptr, LASH_DBUS_ERROR_GENERIC, "studio_name_generate() failed.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!studio_activate())
|
||||
{
|
||||
lash_dbus_error(call_ptr, LASH_DBUS_ERROR_GENERIC, "studio_activate() failed.");
|
||||
studio_clear();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!studio_fetch_jack_settings(g_studio))
|
||||
{
|
||||
lash_dbus_error(call_ptr, LASH_DBUS_ERROR_GENERIC, "studio_fetch_jack_settings() failed.");
|
||||
studio_clear();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
METHOD_ARGS_BEGIN(GetName, "Get studio name")
|
||||
METHOD_ARG_DESCRIBE_OUT("studio_name", "s", "Name of studio")
|
||||
METHOD_ARGS_END
|
||||
|
|
|
@ -33,6 +33,7 @@ void studio_run(void);
|
|||
bool studio_is_loaded(void);
|
||||
|
||||
bool studios_iterate(void * call_ptr, void * context, bool (* callback)(void * call_ptr, void * context, const char * studio, uint32_t modtime));
|
||||
bool studio_new(void * call_ptr, const char * studio_name);
|
||||
bool studio_load(void * call_ptr, const char * studio_name);
|
||||
bool studio_delete(void * call_ptr, const char * studio_name);
|
||||
|
||||
|
|
|
@ -149,6 +149,22 @@ bool control_proxy_get_studio_list(void (* callback)(void * context, const char
|
|||
return true;
|
||||
}
|
||||
|
||||
bool control_proxy_new_studio(const char * studio_name)
|
||||
{
|
||||
if (studio_name == NULL)
|
||||
{
|
||||
studio_name = "";
|
||||
}
|
||||
|
||||
if (!dbus_call_simple(SERVICE_NAME, CONTROL_OBJECT_PATH, IFACE_CONTROL, "NewStudio", "s", &studio_name, ""))
|
||||
{
|
||||
lash_error("NewStudio() failed.");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool control_proxy_load_studio(const char * studio_name)
|
||||
{
|
||||
if (!dbus_call_simple(SERVICE_NAME, CONTROL_OBJECT_PATH, IFACE_CONTROL, "LoadStudio", "s", &studio_name, ""))
|
||||
|
|
|
@ -36,6 +36,7 @@ void control_proxy_uninit(void);
|
|||
void control_proxy_on_studio_appeared(void);
|
||||
void control_proxy_on_studio_disappeared(void);
|
||||
bool control_proxy_get_studio_list(void (* callback)(void * context, const char * studio_name), void * context);
|
||||
bool control_proxy_new_studio(const char * studio_name);
|
||||
bool control_proxy_load_studio(const char * studio_name);
|
||||
bool control_proxy_delete_studio(const char * studio_name);
|
||||
bool control_proxy_exit(void);
|
||||
|
|
|
@ -20,6 +20,21 @@
|
|||
<property name="use_underline">True</property>
|
||||
<child>
|
||||
<widget class="GtkMenu" id="studio_menu">
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="menu_item_new_studio">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">_New Studio...</property>
|
||||
<property name="use_underline">True</property>
|
||||
<accelerator key="N" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK" signal="activate"/>
|
||||
<child internal-child="image">
|
||||
<widget class="GtkImage" id="menu-item-new-studio-image">
|
||||
<property name="visible">True</property>
|
||||
<property name="stock">gtk-new</property>
|
||||
<property name="icon_size">1</property>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="menu_item_load_studio">
|
||||
<property name="visible">True</property>
|
||||
|
@ -784,10 +799,10 @@ along with LADI Session Handler; if not, write to the Free Software Foundation,
|
|||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
<widget class="GtkDialog" id="rename_dialog">
|
||||
<widget class="GtkDialog" id="name_dialog">
|
||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||
<property name="border_width">5</property>
|
||||
<property name="title" translatable="yes">Rename</property>
|
||||
<property name="title" translatable="yes">Set name</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
|
||||
<property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
|
||||
|
@ -810,7 +825,7 @@ along with LADI Session Handler; if not, write to the Free Software Foundation,
|
|||
<property name="label_xalign">0</property>
|
||||
<property name="shadow_type">GTK_SHADOW_NONE</property>
|
||||
<child>
|
||||
<widget class="GtkEntry" id="rename_entry">
|
||||
<widget class="GtkEntry" id="name_entry">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||
|
@ -818,7 +833,7 @@ along with LADI Session Handler; if not, write to the Free Software Foundation,
|
|||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkLabel" id="rename_label">
|
||||
<widget class="GtkLabel" id="name_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||
<property name="label" translatable="yes"><b>Name</b></property>
|
||||
|
@ -844,7 +859,7 @@ along with LADI Session Handler; if not, write to the Free Software Foundation,
|
|||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||
<property name="layout_style">GTK_BUTTONBOX_END</property>
|
||||
<child>
|
||||
<widget class="GtkButton" id="rename_cancel_button">
|
||||
<widget class="GtkButton" id="name_cancel_button">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="can_default">True</property>
|
||||
|
@ -856,7 +871,7 @@ along with LADI Session Handler; if not, write to the Free Software Foundation,
|
|||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkButton" id="rename_ok_button">
|
||||
<widget class="GtkButton" id="name_ok_button">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="can_default">True</property>
|
||||
|
|
55
gui/main.c
55
gui/main.c
|
@ -48,16 +48,15 @@ GtkWidget * g_clear_load_button;
|
|||
GtkWidget * g_xrun_progress_bar;
|
||||
GtkWidget * g_buffer_size_combo;
|
||||
|
||||
GtkWidget * g_menu_item_load_studio;
|
||||
GtkWidget * g_menu_item_new_studio;
|
||||
GtkWidget * g_menu_item_save_studio;
|
||||
GtkWidget * g_menu_item_rename_studio;
|
||||
GtkWidget * g_menu_item_delete_studio;
|
||||
GtkWidget * g_menu_item_create_room;
|
||||
GtkWidget * g_menu_item_destroy_room;
|
||||
GtkWidget * g_menu_item_load_project;
|
||||
GtkWidget * g_menu_item_start_app;
|
||||
|
||||
GtkWidget * g_rename_dialog;
|
||||
GtkWidget * g_name_dialog;
|
||||
|
||||
graph_view_handle g_jack_view = NULL;
|
||||
graph_view_handle g_studio_view = NULL;
|
||||
|
@ -177,33 +176,33 @@ static void clear_load(void)
|
|||
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(g_xrun_progress_bar), 0.0);
|
||||
}
|
||||
|
||||
bool rename_dialog(const char * object, const char * old_name, char ** new_name)
|
||||
bool name_dialog(const char * title, const char * object, const char * old_name, char ** new_name)
|
||||
{
|
||||
guint result;
|
||||
bool renamed;
|
||||
GtkEntry * entry = GTK_ENTRY(get_glade_widget("rename_entry"));
|
||||
bool ok;
|
||||
GtkEntry * entry = GTK_ENTRY(get_glade_widget("name_entry"));
|
||||
|
||||
gtk_widget_show(g_rename_dialog);
|
||||
gtk_widget_show(g_name_dialog);
|
||||
|
||||
gtk_label_set_text(GTK_LABEL(get_glade_widget("rename_label")), object);
|
||||
gtk_label_set_text(GTK_LABEL(get_glade_widget("name_label")), object);
|
||||
gtk_entry_set_text(entry, old_name);
|
||||
gtk_editable_select_region(GTK_EDITABLE(entry), 0, -1);
|
||||
|
||||
result = gtk_dialog_run(GTK_DIALOG(g_rename_dialog));
|
||||
renamed = result == 2;
|
||||
if (renamed)
|
||||
result = gtk_dialog_run(GTK_DIALOG(g_name_dialog));
|
||||
ok = result == 2;
|
||||
if (ok)
|
||||
{
|
||||
*new_name = strdup(gtk_entry_get_text(entry));
|
||||
if (*new_name == NULL)
|
||||
{
|
||||
lash_error("strdup failed for new name (rename)");
|
||||
renamed = false;
|
||||
lash_error("strdup failed for new name (name_dialog)");
|
||||
ok = false;
|
||||
}
|
||||
}
|
||||
|
||||
gtk_widget_hide(g_rename_dialog);
|
||||
gtk_widget_hide(g_name_dialog);
|
||||
|
||||
return renamed;
|
||||
return ok;
|
||||
}
|
||||
|
||||
static void arrange(void)
|
||||
|
@ -315,6 +314,25 @@ static void save_studio(void)
|
|||
if (!studio_proxy_save())
|
||||
{
|
||||
lash_error("studio save failed");
|
||||
/* TODO: display error message */
|
||||
}
|
||||
}
|
||||
|
||||
static void new_studio(void)
|
||||
{
|
||||
char * new_name;
|
||||
|
||||
lash_info("new studio request");
|
||||
|
||||
if (name_dialog("New studio", "Studio name", "", &new_name))
|
||||
{
|
||||
if (!control_proxy_new_studio(new_name))
|
||||
{
|
||||
lash_error("creation of new studio failed");
|
||||
/* TODO: display error message */
|
||||
}
|
||||
|
||||
free(new_name);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -322,11 +340,12 @@ static void rename_studio(void)
|
|||
{
|
||||
char * new_name;
|
||||
|
||||
if (rename_dialog("Studio name", get_view_name(g_studio_view), &new_name))
|
||||
if (name_dialog("Rename studio", "Studio name", get_view_name(g_studio_view), &new_name))
|
||||
{
|
||||
if (!studio_proxy_rename(new_name))
|
||||
{
|
||||
lash_error("studio rename failed");
|
||||
/* TODO: display error message */
|
||||
}
|
||||
|
||||
free(new_name);
|
||||
|
@ -498,6 +517,7 @@ int main(int argc, char** argv)
|
|||
g_clear_load_button = get_glade_widget("clear_load_button");
|
||||
g_xrun_progress_bar = get_glade_widget("xrun_progress_bar");
|
||||
g_buffer_size_combo = get_glade_widget("buffer_size_combo");
|
||||
g_menu_item_new_studio = get_glade_widget("menu_item_new_studio");
|
||||
g_menu_item_save_studio = get_glade_widget("menu_item_save_studio");
|
||||
g_menu_item_rename_studio = get_glade_widget("menu_item_rename_studio");
|
||||
g_menu_item_create_room = get_glade_widget("menu_item_create_room");
|
||||
|
@ -505,7 +525,7 @@ int main(int argc, char** argv)
|
|||
g_menu_item_load_project = get_glade_widget("menu_item_load_project");
|
||||
g_menu_item_start_app = get_glade_widget("menu_item_start_app");
|
||||
|
||||
g_rename_dialog = get_glade_widget("rename_dialog");
|
||||
g_name_dialog = get_glade_widget("name_dialog");
|
||||
|
||||
init_studio_list(&g_load_studio_list, "menu_item_load_studio", "load_studio_menu", on_load_studio);
|
||||
init_studio_list(&g_delete_studio_list, "menu_item_delete_studio", "delete_studio_menu", on_delete_studio);
|
||||
|
@ -539,6 +559,7 @@ int main(int argc, char** argv)
|
|||
g_signal_connect(G_OBJECT(g_buffer_size_combo), "changed", G_CALLBACK(buffer_size_change_request), NULL);
|
||||
g_signal_connect(G_OBJECT(g_clear_load_button), "clicked", G_CALLBACK(clear_load), NULL);
|
||||
g_signal_connect(G_OBJECT(get_glade_widget("menu_item_view_arrange")), "activate", G_CALLBACK(arrange), NULL);
|
||||
g_signal_connect(G_OBJECT(g_menu_item_new_studio), "activate", G_CALLBACK(new_studio), NULL);
|
||||
g_signal_connect(G_OBJECT(g_menu_item_save_studio), "activate", G_CALLBACK(save_studio), NULL);
|
||||
g_signal_connect(G_OBJECT(g_menu_item_rename_studio), "activate", G_CALLBACK(rename_studio), NULL);
|
||||
|
||||
|
|
Loading…
Reference in New Issue