diff --git a/src/include/pw3270/application.h b/src/include/pw3270/application.h index 3ff1fc1..afcaff8 100644 --- a/src/include/pw3270/application.h +++ b/src/include/pw3270/application.h @@ -69,7 +69,9 @@ void pw3270_application_set_ui_style(GApplication *app, PW3270_UI_STYLE type); PW3270_UI_STYLE pw3270_application_get_ui_style(GApplication *app); + // Plugins void pw3270_application_plugin_foreach(GApplication *app, GFunc func, gpointer user_data); + GSList * pw3270_application_get_plugins(GApplication *app); // Tools GtkBuilder * pw3270_application_get_builder(const gchar *name); diff --git a/src/objects/application/application.c b/src/objects/application/application.c index 4ba66d9..c089b6a 100644 --- a/src/objects/application/application.c +++ b/src/objects/application/application.c @@ -92,18 +92,63 @@ } + static void window_added(GtkApplication *application, GtkWindow *window) { + + GTK_APPLICATION_CLASS(pw3270Application_parent_class)->window_added(application,window); + + void (*call)(GtkWindow *window); + + GSList * item; + for(item = PW3270_APPLICATION(application)->plugins; item; item = g_slist_next(item)) { + if(g_module_symbol((GModule *) item->data, "pw3270_plugin_window_added", (gpointer *) &call)) { + call(window); + } + } + + } + + static void window_removed(GtkApplication *application, GtkWindow *window) { + + debug("%s(%p)",__FUNCTION__,window); + + void (*call)(GtkWindow *window); + + GSList * item; + for(item = PW3270_APPLICATION(application)->plugins; item; item = g_slist_next(item)) { + if(g_module_symbol((GModule *) item->data, "pw3270_plugin_window_removed", (gpointer *) &call)) { + call(window); + } + } + + + GTK_APPLICATION_CLASS(pw3270Application_parent_class)->window_removed(application,window); + + } + static void pw3270Application_class_init(pw3270ApplicationClass *klass) { - GApplicationClass *application_class = G_APPLICATION_CLASS(klass); GObjectClass *object_class = G_OBJECT_CLASS(klass); object_class->get_property = get_property; object_class->set_property = set_property; - object_class->finalize = finalize; + object_class->finalize = finalize; - application_class->startup = startup; - application_class->activate = activate; - application_class->open = pw3270_application_open; + { + GtkApplicationClass *application_class = GTK_APPLICATION_CLASS(klass); + + application_class->window_added = window_added; + application_class->window_removed = window_removed; + + } + + { + GApplicationClass * application_class = G_APPLICATION_CLASS(klass); + + application_class->startup = startup; + application_class->activate = activate; + application_class->open = pw3270_application_open; + + } props[PROP_UI_STYLE] = g_param_spec_uint( @@ -389,9 +434,18 @@ } + GSList * pw3270_application_get_plugins(GApplication *app) { + + g_return_val_if_fail(PW3270_IS_APPLICATION(app),NULL); + return PW3270_APPLICATION(app)->plugins; + + } + + /* void pw3270_application_plugin_foreach(GApplication *app, GFunc func, gpointer user_data) { g_return_if_fail(PW3270_IS_APPLICATION(app)); g_slist_foreach(PW3270_APPLICATION(app)->plugins, func, user_data); } + */ diff --git a/src/objects/window/page.c b/src/objects/window/page.c index 34b7798..2da9e5b 100644 --- a/src/objects/window/page.c +++ b/src/objects/window/page.c @@ -112,11 +112,12 @@ static gboolean terminal_popup(GtkWidget *widget, gboolean selected, gboolean online, GdkEvent *event, pw3270ApplicationWindow * window); static gboolean oia_popup(GtkWidget *widget, guint field, GdkEvent *event, pw3270ApplicationWindow * window); static void label_populate_popup(GtkLabel *label, GtkMenu *menu, GtkWidget *terminal); - static void plugin_start(GModule *module, GtkWidget *terminal); + static void label_disconnect(GtkWidget *label, GtkWidget *terminal); gint pw3270_application_window_append_page(GtkWidget * window, GtkWidget * terminal) { - GtkWidget * label = + // Setup label + GtkWidget * label = GTK_WIDGET( g_object_new( pw3270TabLabel_get_type(), @@ -125,7 +126,10 @@ NULL) ); - // gtk_label_new(v3270_get_session_name(terminal)); + g_signal_connect(G_OBJECT(terminal), "session_changed", G_CALLBACK(session_changed),label); + g_signal_connect(G_OBJECT(label), "destroy", G_CALLBACK(label_disconnect),terminal); + + // Setup tab GtkWidget * tab = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,2); GtkWidget * button = gtk_button_new_from_icon_name("window-close-symbolic",GTK_ICON_SIZE_MENU); @@ -136,7 +140,6 @@ g_signal_connect(G_OBJECT(label), "populate-popup", G_CALLBACK(label_populate_popup), terminal); g_signal_connect(G_OBJECT(terminal), "focus-in-event", G_CALLBACK(on_terminal_focus), window); - g_signal_connect(G_OBJECT(terminal), "session_changed", G_CALLBACK(session_changed),label); g_signal_connect(G_OBJECT(terminal), "disconnected", G_CALLBACK(disconnected),window); g_signal_connect(G_OBJECT(terminal), "connected", G_CALLBACK(connected),window); g_signal_connect(G_OBJECT(terminal), "destroy", G_CALLBACK(destroy),window); @@ -146,6 +149,7 @@ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(close_page), terminal); + gtk_box_pack_start(GTK_BOX(tab),label,FALSE,FALSE,0); gtk_box_pack_end(GTK_BOX(tab),button,FALSE,FALSE,0); @@ -157,9 +161,6 @@ gtk_notebook_set_tab_detachable(notebook,terminal,TRUE); gtk_notebook_set_tab_reorderable(notebook,terminal,TRUE); - // Initialize plugins - pw3270_application_plugin_foreach(G_APPLICATION(gtk_window_get_application(GTK_WINDOW(window))), (GFunc) plugin_start, terminal); - return page; } @@ -369,16 +370,9 @@ } - - void plugin_start(GModule *module, GtkWidget *terminal) { - - /* - int (*start)(GtkWidget *); - - if(g_module_symbol(module, "pw3270_plugin_insert_terminal", (gpointer *) &start)) { - start(terminal); - } - */ - + static void label_disconnect(GtkWidget *label, GtkWidget *terminal) { + debug("%s(%p)",__FUNCTION__,label); + g_signal_handlers_disconnect_by_data(G_OBJECT(terminal),label); } + diff --git a/src/objects/window/window.c b/src/objects/window/window.c index ed45e3a..d93798c 100644 --- a/src/objects/window/window.c +++ b/src/objects/window/window.c @@ -102,10 +102,6 @@ } - void on_page_changed(GtkNotebook *notebook, GtkWidget G_GNUC_UNUSED(*child), guint G_GNUC_UNUSED(page_num), gpointer G_GNUC_UNUSED(user_data)) { - gtk_notebook_set_show_tabs(notebook,gtk_notebook_get_n_pages(notebook) > 1); - } - static void pw3270ApplicationWindow_init(pw3270ApplicationWindow *widget) { GtkBox * vBox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL,0)); @@ -115,8 +111,6 @@ gtk_notebook_set_show_tabs(widget->notebook,FALSE); gtk_notebook_set_show_border(widget->notebook, FALSE); gtk_notebook_set_group_name(widget->notebook,PACKAGE_NAME ":Terminals"); - g_signal_connect(G_OBJECT(widget->notebook), "page-added", G_CALLBACK(on_page_changed), widget); - g_signal_connect(G_OBJECT(widget->notebook), "page-removed", G_CALLBACK(on_page_changed), widget); widget->toolbar = GTK_TOOLBAR(pw3270_toolbar_new()); gtk_box_pack_start(vBox,GTK_WIDGET(widget->toolbar),FALSE,TRUE,0); @@ -186,6 +180,42 @@ } + static void page_added(GtkNotebook *notebook, GtkWidget *child, guint G_GNUC_UNUSED(page_num), GtkApplication * application) { + + debug("%s(%p)",__FUNCTION__,child); + + gtk_notebook_set_show_tabs(notebook,gtk_notebook_get_n_pages(notebook) > 1); + + // Call plugins + int (*call)(GtkWidget *); + + GSList * item; + for(item = pw3270_application_get_plugins(G_APPLICATION(application)); item; item = g_slist_next(item)) { + if(g_module_symbol((GModule *) item->data, "pw3270_plugin_page_added", (gpointer *) &call)) { + call(child); + } + } + + } + + static void page_removed(GtkNotebook *notebook, GtkWidget *child, guint G_GNUC_UNUSED(page_num), GtkApplication * application) { + + debug("%s(%p)",__FUNCTION__,child); + + gtk_notebook_set_show_tabs(notebook,gtk_notebook_get_n_pages(notebook) > 1); + + // Call plugins + int (*call)(GtkWidget *); + + GSList * item; + for(item = pw3270_application_get_plugins(G_APPLICATION(application)); item; item = g_slist_next(item)) { + if(g_module_symbol((GModule *) item->data, "pw3270_plugin_page_removed", (gpointer *) &call)) { + call(child); + } + } + + } + GtkWidget * pw3270_application_window_new(GtkApplication * application, const gchar *session_file) { gchar *title = _( "IBM 3270 Terminal emulator" ); @@ -203,6 +233,9 @@ "application", application, NULL); + g_signal_connect(G_OBJECT(window->notebook), "page-added", G_CALLBACK(page_added), application); + g_signal_connect(G_OBJECT(window->notebook), "page-removed", G_CALLBACK(page_removed), application); + // // Get builder // -- libgit2 0.21.2