From 03bb0b477d2e16f8519065562589a28180c63b98 Mon Sep 17 00:00:00 2001 From: Nedko Arnaudov Date: Sun, 23 Aug 2009 12:58:01 +0300 Subject: [PATCH] Studio renamed signal --- daemon/studio.c | 11 ++++++ gui/graph_view.c | 36 +++++++++++++++---- gui/graph_view.h | 1 + gui/main.c | 16 +++++++++ gui/world_tree.c | 10 ++++++ gui/world_tree.h | 1 + studio_proxy.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++ studio_proxy.h | 3 ++ 8 files changed, 166 insertions(+), 6 deletions(-) diff --git a/daemon/studio.c b/daemon/studio.c index f304878a..0bb6b16b 100644 --- a/daemon/studio.c +++ b/daemon/studio.c @@ -746,6 +746,11 @@ bool studio_load(const char * file_path) return false; /* not implemented yet */ } +void emit_studio_renamed() +{ + signal_new_valist(g_dbus_connection, STUDIO_OBJECT_PATH, IFACE_STUDIO, "StudioRenamed", DBUS_TYPE_STRING, &g_studio.name, DBUS_TYPE_INVALID); +} + static void ladish_get_studio_name(method_call_t * call_ptr) { method_return_new_single(call_ptr, DBUS_TYPE_STRING, &g_studio.name); @@ -774,6 +779,7 @@ static void ladish_rename_studio(method_call_t * call_ptr) g_studio.name = new_name_dup; method_return_new_void(call_ptr); + emit_studio_renamed(); } static void ladish_save_studio(method_call_t * call_ptr) @@ -799,6 +805,10 @@ METHODS_BEGIN METHOD_DESCRIBE(Save, ladish_save_studio) METHODS_END +SIGNAL_ARGS_BEGIN(StudioRenamed, "Studio name changed") + SIGNAL_ARG_DESCRIBE("studio_name", "s", "New studio name") +SIGNAL_ARGS_END + SIGNAL_ARGS_BEGIN(RoomAppeared, "Room D-Bus object appeared") SIGNAL_ARG_DESCRIBE("room_path", "s", "room object path") SIGNAL_ARGS_END @@ -808,6 +818,7 @@ SIGNAL_ARGS_BEGIN(RoomDisappeared, "Room D-Bus object disappeared") SIGNAL_ARGS_END SIGNALS_BEGIN + SIGNAL_DESCRIBE(StudioRenamed) SIGNAL_DESCRIBE(RoomAppeared) SIGNAL_DESCRIBE(RoomDisappeared) SIGNALS_END diff --git a/gui/graph_view.c b/gui/graph_view.c index 13f6a1d9..b4a776ce 100644 --- a/gui/graph_view.c +++ b/gui/graph_view.c @@ -41,13 +41,13 @@ struct graph_view struct list_head g_views; GtkScrolledWindow * g_main_scrolledwin; -graph_canvas_handle g_current_graph_canvas; +static struct graph_view * g_current_view; void view_init(void) { g_main_scrolledwin = GTK_SCROLLED_WINDOW(get_glade_widget("main_scrolledwin")); INIT_LIST_HEAD(&g_views); - g_current_graph_canvas = NULL; + g_current_view = NULL; } bool create_view(const char * name, const char * service, const char * object, bool force_activate, graph_view_handle * handle_ptr) @@ -130,7 +130,7 @@ static void attach_canvas(struct graph_view * view_ptr) gtk_container_remove(GTK_CONTAINER(g_main_scrolledwin), child); } - g_current_graph_canvas = view_ptr->graph_canvas; + g_current_view = view_ptr; gtk_container_add(GTK_CONTAINER(g_main_scrolledwin), view_ptr->canvas_widget); //_canvas->scroll_to(static_cast(_canvas->width()/2 - 320), static_cast(_canvas->height()/2 - 240)); // FIXME: hardcoded @@ -146,7 +146,7 @@ static void detach_canvas(struct graph_view * view_ptr) if (child == view_ptr->canvas_widget) { gtk_container_remove(GTK_CONTAINER(g_main_scrolledwin), view_ptr->canvas_widget); - g_current_graph_canvas = NULL; + g_current_view = NULL; } } @@ -182,12 +182,36 @@ const char * get_view_name(graph_view_handle view) return view_ptr->name; } +bool set_view_name(graph_view_handle view, const char * cname) +{ + char * name; + + name = strdup(cname); + if (name == NULL) + { + lash_error("strdup() failed for \"%s\"", name); + return false; + } + + free(view_ptr->name); + view_ptr->name = name; + + world_tree_name_changed(view); + + if (g_current_view == view_ptr) + { + set_main_window_title(view); + } + + return true; +} + canvas_handle get_current_canvas() { - if (g_current_graph_canvas == NULL) + if (g_current_view == NULL) { return NULL; } - return graph_canvas_get_canvas(g_current_graph_canvas); + return graph_canvas_get_canvas(g_current_view->graph_canvas); } diff --git a/gui/graph_view.h b/gui/graph_view.h index 531d7656..77b55eca 100644 --- a/gui/graph_view.h +++ b/gui/graph_view.h @@ -36,6 +36,7 @@ bool create_view(const char * name, const char * service, const char * object, b void destroy_view(graph_view_handle view); void activate_view(graph_view_handle view); const char * get_view_name(graph_view_handle view); +bool set_view_name(graph_view_handle view, const char * name); canvas_handle get_current_canvas(); /* not very good place for this prototype, because it is not implemented in graph_view.c */ diff --git a/gui/main.c b/gui/main.c index 7de95998..38ac835d 100644 --- a/gui/main.c +++ b/gui/main.c @@ -294,6 +294,14 @@ void control_proxy_on_studio_disappeared(void) } } +static void on_studio_renamed(const char * new_studio_name) +{ + if (g_studio_view != NULL) + { + set_view_name(g_studio_view, new_studio_name); + } +} + void jack_started(void) { lash_info("JACK started"); @@ -390,6 +398,13 @@ int main(int argc, char** argv) return 1; } + if (!studio_proxy_init()) + { + return 1; + } + + studio_proxy_set_renamed_callback(on_studio_renamed); + set_buffer_size_combo_width(); g_signal_connect(G_OBJECT(g_main_win), "destroy", G_CALLBACK(gtk_main_quit), NULL); @@ -408,6 +423,7 @@ int main(int argc, char** argv) gtk_main(); + studio_proxy_uninit(); control_proxy_uninit(); uninit_glade(); diff --git a/gui/world_tree.c b/gui/world_tree.c index 26f19e66..78f3c6e5 100644 --- a/gui/world_tree.c +++ b/gui/world_tree.c @@ -490,3 +490,13 @@ void world_tree_activate(graph_view_handle view) gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(g_world_tree_widget)), &iter); } } + +void world_tree_name_changed(graph_view_handle view) +{ + GtkTreeIter iter; + + if (find_view(view, &iter)) + { + gtk_tree_store_set(g_treestore, &iter, COL_NAME, get_view_name(view), -1); + } +} diff --git a/gui/world_tree.h b/gui/world_tree.h index d0e0e5de..459e4a86 100644 --- a/gui/world_tree.h +++ b/gui/world_tree.h @@ -34,5 +34,6 @@ void world_tree_init(void); void world_tree_add(graph_view_handle view, bool force_activate); void world_tree_remove(graph_view_handle view); void world_tree_activate(graph_view_handle view); +void world_tree_name_changed(graph_view_handle view); #endif // #ifndef WORLD_TREE_H__D786489B_E400_4E92_85C7_2BAE606DE56D__INCLUDED diff --git a/studio_proxy.c b/studio_proxy.c index f01f80ce..d50a5b7e 100644 --- a/studio_proxy.c +++ b/studio_proxy.c @@ -29,6 +29,95 @@ #include "dbus_constants.h" #include "dbus/helpers.h" +static void (* g_renamed_callback)(const char * new_studio_name) = NULL; + +static const char * g_signals[] = +{ + "StudioRenamed", + "RoomAppeared", + "RoomDisappeared", + NULL +}; + +static DBusHandlerResult message_hook(DBusConnection * connection, DBusMessage * message, void * data) +{ + const char * object_path; + char * name; + + object_path = dbus_message_get_path(message); + if (object_path == NULL || strcmp(object_path, STUDIO_OBJECT_PATH) != 0) + { + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + + if (dbus_message_is_signal(message, IFACE_STUDIO, "StudioRenamed")) + { + if (!dbus_message_get_args(message, &g_dbus_error, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID)) + { + lash_error("Invalid parameters of StudioRenamed signal: %s", g_dbus_error.message); + dbus_error_free(&g_dbus_error); + } + else + { + lash_info("StudioRenamed"); + + if (g_renamed_callback != NULL) + { + g_renamed_callback(name); + } + } + + return DBUS_HANDLER_RESULT_HANDLED; + } + + if (dbus_message_is_signal(message, IFACE_STUDIO, "RoomAppeared")) + { + lash_info("RoomAppeared"); + return DBUS_HANDLER_RESULT_HANDLED; + } + + if (dbus_message_is_signal(message, IFACE_STUDIO, "RoomDisappeared")) + { + lash_info("RoomDisappeared"); + return DBUS_HANDLER_RESULT_HANDLED; + } + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +bool studio_proxy_init(void) +{ + if (!dbus_register_object_signal_handler( + g_dbus_connection, + SERVICE_NAME, + STUDIO_OBJECT_PATH, + IFACE_STUDIO, + g_signals, + message_hook, + NULL)) + { + lash_error("studio_object_path() failed"); + return false; + } + + return true; +} + +void studio_proxy_uninit(void) +{ + if (!dbus_unregister_object_signal_handler( + g_dbus_connection, + SERVICE_NAME, + STUDIO_OBJECT_PATH, + IFACE_STUDIO, + g_signals, + message_hook, + NULL)) + { + lash_error("studio_object_path() failed"); + } +} + bool studio_proxy_get_name(char ** name_ptr) { const char * name; @@ -56,3 +145,8 @@ bool studio_proxy_save(void) { return dbus_call_simple(SERVICE_NAME, STUDIO_OBJECT_PATH, IFACE_STUDIO, "Save", "", ""); } + +void studio_proxy_set_renamed_callback(void (* callback)(const char * new_studio_name)) +{ + g_renamed_callback = callback; +} diff --git a/studio_proxy.h b/studio_proxy.h index 649e57eb..de16ae39 100644 --- a/studio_proxy.h +++ b/studio_proxy.h @@ -28,8 +28,11 @@ #ifndef STUDIO_PROXY_H__2CEC623F_C998_4618_A947_D1A0016DF978__INCLUDED #define STUDIO_PROXY_H__2CEC623F_C998_4618_A947_D1A0016DF978__INCLUDED +bool studio_proxy_init(void); +void studio_proxy_uninit(void); bool studio_proxy_get_name(char ** name); bool studio_proxy_rename(const char * name); bool studio_proxy_save(void); +void studio_proxy_set_renamed_callback(void (* callback)(const char * new_studio_name)); #endif /* #ifndef STUDIO_PROXY_H__2CEC623F_C998_4618_A947_D1A0016DF978__INCLUDED */