Commit ae57e6cf80b5cea72444b0df313c06f3095cc59d

Authored by Perry Werneck
1 parent 292e4138

Fixing tab cleanup.

src/include/pw3270/application.h
@@ -69,7 +69,9 @@ @@ -69,7 +69,9 @@
69 void pw3270_application_set_ui_style(GApplication *app, PW3270_UI_STYLE type); 69 void pw3270_application_set_ui_style(GApplication *app, PW3270_UI_STYLE type);
70 PW3270_UI_STYLE pw3270_application_get_ui_style(GApplication *app); 70 PW3270_UI_STYLE pw3270_application_get_ui_style(GApplication *app);
71 71
  72 + // Plugins
72 void pw3270_application_plugin_foreach(GApplication *app, GFunc func, gpointer user_data); 73 void pw3270_application_plugin_foreach(GApplication *app, GFunc func, gpointer user_data);
  74 + GSList * pw3270_application_get_plugins(GApplication *app);
73 75
74 // Tools 76 // Tools
75 GtkBuilder * pw3270_application_get_builder(const gchar *name); 77 GtkBuilder * pw3270_application_get_builder(const gchar *name);
src/objects/application/application.c
@@ -92,18 +92,63 @@ @@ -92,18 +92,63 @@
92 92
93 } 93 }
94 94
  95 + static void window_added(GtkApplication *application, GtkWindow *window) {
  96 +
  97 + GTK_APPLICATION_CLASS(pw3270Application_parent_class)->window_added(application,window);
  98 +
  99 + void (*call)(GtkWindow *window);
  100 +
  101 + GSList * item;
  102 + for(item = PW3270_APPLICATION(application)->plugins; item; item = g_slist_next(item)) {
  103 + if(g_module_symbol((GModule *) item->data, "pw3270_plugin_window_added", (gpointer *) &call)) {
  104 + call(window);
  105 + }
  106 + }
  107 +
  108 + }
  109 +
  110 + static void window_removed(GtkApplication *application, GtkWindow *window) {
  111 +
  112 + debug("%s(%p)",__FUNCTION__,window);
  113 +
  114 + void (*call)(GtkWindow *window);
  115 +
  116 + GSList * item;
  117 + for(item = PW3270_APPLICATION(application)->plugins; item; item = g_slist_next(item)) {
  118 + if(g_module_symbol((GModule *) item->data, "pw3270_plugin_window_removed", (gpointer *) &call)) {
  119 + call(window);
  120 + }
  121 + }
  122 +
  123 +
  124 + GTK_APPLICATION_CLASS(pw3270Application_parent_class)->window_removed(application,window);
  125 +
  126 + }
  127 +
95 static void pw3270Application_class_init(pw3270ApplicationClass *klass) { 128 static void pw3270Application_class_init(pw3270ApplicationClass *klass) {
96 129
97 - GApplicationClass *application_class = G_APPLICATION_CLASS(klass);  
98 GObjectClass *object_class = G_OBJECT_CLASS(klass); 130 GObjectClass *object_class = G_OBJECT_CLASS(klass);
99 131
100 object_class->get_property = get_property; 132 object_class->get_property = get_property;
101 object_class->set_property = set_property; 133 object_class->set_property = set_property;
102 - object_class->finalize = finalize; 134 + object_class->finalize = finalize;
103 135
104 - application_class->startup = startup;  
105 - application_class->activate = activate;  
106 - application_class->open = pw3270_application_open; 136 + {
  137 + GtkApplicationClass *application_class = GTK_APPLICATION_CLASS(klass);
  138 +
  139 + application_class->window_added = window_added;
  140 + application_class->window_removed = window_removed;
  141 +
  142 + }
  143 +
  144 + {
  145 + GApplicationClass * application_class = G_APPLICATION_CLASS(klass);
  146 +
  147 + application_class->startup = startup;
  148 + application_class->activate = activate;
  149 + application_class->open = pw3270_application_open;
  150 +
  151 + }
107 152
108 props[PROP_UI_STYLE] = 153 props[PROP_UI_STYLE] =
109 g_param_spec_uint( 154 g_param_spec_uint(
@@ -389,9 +434,18 @@ @@ -389,9 +434,18 @@
389 434
390 } 435 }
391 436
  437 + GSList * pw3270_application_get_plugins(GApplication *app) {
  438 +
  439 + g_return_val_if_fail(PW3270_IS_APPLICATION(app),NULL);
  440 + return PW3270_APPLICATION(app)->plugins;
  441 +
  442 + }
  443 +
  444 + /*
392 void pw3270_application_plugin_foreach(GApplication *app, GFunc func, gpointer user_data) { 445 void pw3270_application_plugin_foreach(GApplication *app, GFunc func, gpointer user_data) {
393 446
394 g_return_if_fail(PW3270_IS_APPLICATION(app)); 447 g_return_if_fail(PW3270_IS_APPLICATION(app));
395 g_slist_foreach(PW3270_APPLICATION(app)->plugins, func, user_data); 448 g_slist_foreach(PW3270_APPLICATION(app)->plugins, func, user_data);
396 449
397 } 450 }
  451 + */
src/objects/window/page.c
@@ -112,11 +112,12 @@ @@ -112,11 +112,12 @@
112 static gboolean terminal_popup(GtkWidget *widget, gboolean selected, gboolean online, GdkEvent *event, pw3270ApplicationWindow * window); 112 static gboolean terminal_popup(GtkWidget *widget, gboolean selected, gboolean online, GdkEvent *event, pw3270ApplicationWindow * window);
113 static gboolean oia_popup(GtkWidget *widget, guint field, GdkEvent *event, pw3270ApplicationWindow * window); 113 static gboolean oia_popup(GtkWidget *widget, guint field, GdkEvent *event, pw3270ApplicationWindow * window);
114 static void label_populate_popup(GtkLabel *label, GtkMenu *menu, GtkWidget *terminal); 114 static void label_populate_popup(GtkLabel *label, GtkMenu *menu, GtkWidget *terminal);
115 - static void plugin_start(GModule *module, GtkWidget *terminal); 115 + static void label_disconnect(GtkWidget *label, GtkWidget *terminal);
116 116
117 gint pw3270_application_window_append_page(GtkWidget * window, GtkWidget * terminal) { 117 gint pw3270_application_window_append_page(GtkWidget * window, GtkWidget * terminal) {
118 118
119 - GtkWidget * label = 119 + // Setup label
  120 + GtkWidget * label =
120 GTK_WIDGET( 121 GTK_WIDGET(
121 g_object_new( 122 g_object_new(
122 pw3270TabLabel_get_type(), 123 pw3270TabLabel_get_type(),
@@ -125,7 +126,10 @@ @@ -125,7 +126,10 @@
125 NULL) 126 NULL)
126 ); 127 );
127 128
128 - // gtk_label_new(v3270_get_session_name(terminal)); 129 + g_signal_connect(G_OBJECT(terminal), "session_changed", G_CALLBACK(session_changed),label);
  130 + g_signal_connect(G_OBJECT(label), "destroy", G_CALLBACK(label_disconnect),terminal);
  131 +
  132 + // Setup tab
129 133
130 GtkWidget * tab = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,2); 134 GtkWidget * tab = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,2);
131 GtkWidget * button = gtk_button_new_from_icon_name("window-close-symbolic",GTK_ICON_SIZE_MENU); 135 GtkWidget * button = gtk_button_new_from_icon_name("window-close-symbolic",GTK_ICON_SIZE_MENU);
@@ -136,7 +140,6 @@ @@ -136,7 +140,6 @@
136 g_signal_connect(G_OBJECT(label), "populate-popup", G_CALLBACK(label_populate_popup), terminal); 140 g_signal_connect(G_OBJECT(label), "populate-popup", G_CALLBACK(label_populate_popup), terminal);
137 141
138 g_signal_connect(G_OBJECT(terminal), "focus-in-event", G_CALLBACK(on_terminal_focus), window); 142 g_signal_connect(G_OBJECT(terminal), "focus-in-event", G_CALLBACK(on_terminal_focus), window);
139 - g_signal_connect(G_OBJECT(terminal), "session_changed", G_CALLBACK(session_changed),label);  
140 g_signal_connect(G_OBJECT(terminal), "disconnected", G_CALLBACK(disconnected),window); 143 g_signal_connect(G_OBJECT(terminal), "disconnected", G_CALLBACK(disconnected),window);
141 g_signal_connect(G_OBJECT(terminal), "connected", G_CALLBACK(connected),window); 144 g_signal_connect(G_OBJECT(terminal), "connected", G_CALLBACK(connected),window);
142 g_signal_connect(G_OBJECT(terminal), "destroy", G_CALLBACK(destroy),window); 145 g_signal_connect(G_OBJECT(terminal), "destroy", G_CALLBACK(destroy),window);
@@ -146,6 +149,7 @@ @@ -146,6 +149,7 @@
146 149
147 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(close_page), terminal); 150 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(close_page), terminal);
148 151
  152 +
149 gtk_box_pack_start(GTK_BOX(tab),label,FALSE,FALSE,0); 153 gtk_box_pack_start(GTK_BOX(tab),label,FALSE,FALSE,0);
150 gtk_box_pack_end(GTK_BOX(tab),button,FALSE,FALSE,0); 154 gtk_box_pack_end(GTK_BOX(tab),button,FALSE,FALSE,0);
151 155
@@ -157,9 +161,6 @@ @@ -157,9 +161,6 @@
157 gtk_notebook_set_tab_detachable(notebook,terminal,TRUE); 161 gtk_notebook_set_tab_detachable(notebook,terminal,TRUE);
158 gtk_notebook_set_tab_reorderable(notebook,terminal,TRUE); 162 gtk_notebook_set_tab_reorderable(notebook,terminal,TRUE);
159 163
160 - // Initialize plugins  
161 - pw3270_application_plugin_foreach(G_APPLICATION(gtk_window_get_application(GTK_WINDOW(window))), (GFunc) plugin_start, terminal);  
162 -  
163 return page; 164 return page;
164 165
165 } 166 }
@@ -369,16 +370,9 @@ @@ -369,16 +370,9 @@
369 370
370 } 371 }
371 372
372 -  
373 - void plugin_start(GModule *module, GtkWidget *terminal) {  
374 -  
375 - /*  
376 - int (*start)(GtkWidget *);  
377 -  
378 - if(g_module_symbol(module, "pw3270_plugin_insert_terminal", (gpointer *) &start)) {  
379 - start(terminal);  
380 - }  
381 - */  
382 - 373 + static void label_disconnect(GtkWidget *label, GtkWidget *terminal) {
  374 + debug("%s(%p)",__FUNCTION__,label);
  375 + g_signal_handlers_disconnect_by_data(G_OBJECT(terminal),label);
383 } 376 }
384 377
  378 +
src/objects/window/window.c
@@ -102,10 +102,6 @@ @@ -102,10 +102,6 @@
102 102
103 } 103 }
104 104
105 - void on_page_changed(GtkNotebook *notebook, GtkWidget G_GNUC_UNUSED(*child), guint G_GNUC_UNUSED(page_num), gpointer G_GNUC_UNUSED(user_data)) {  
106 - gtk_notebook_set_show_tabs(notebook,gtk_notebook_get_n_pages(notebook) > 1);  
107 - }  
108 -  
109 static void pw3270ApplicationWindow_init(pw3270ApplicationWindow *widget) { 105 static void pw3270ApplicationWindow_init(pw3270ApplicationWindow *widget) {
110 106
111 GtkBox * vBox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL,0)); 107 GtkBox * vBox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL,0));
@@ -115,8 +111,6 @@ @@ -115,8 +111,6 @@
115 gtk_notebook_set_show_tabs(widget->notebook,FALSE); 111 gtk_notebook_set_show_tabs(widget->notebook,FALSE);
116 gtk_notebook_set_show_border(widget->notebook, FALSE); 112 gtk_notebook_set_show_border(widget->notebook, FALSE);
117 gtk_notebook_set_group_name(widget->notebook,PACKAGE_NAME ":Terminals"); 113 gtk_notebook_set_group_name(widget->notebook,PACKAGE_NAME ":Terminals");
118 - g_signal_connect(G_OBJECT(widget->notebook), "page-added", G_CALLBACK(on_page_changed), widget);  
119 - g_signal_connect(G_OBJECT(widget->notebook), "page-removed", G_CALLBACK(on_page_changed), widget);  
120 114
121 widget->toolbar = GTK_TOOLBAR(pw3270_toolbar_new()); 115 widget->toolbar = GTK_TOOLBAR(pw3270_toolbar_new());
122 gtk_box_pack_start(vBox,GTK_WIDGET(widget->toolbar),FALSE,TRUE,0); 116 gtk_box_pack_start(vBox,GTK_WIDGET(widget->toolbar),FALSE,TRUE,0);
@@ -186,6 +180,42 @@ @@ -186,6 +180,42 @@
186 180
187 } 181 }
188 182
  183 + static void page_added(GtkNotebook *notebook, GtkWidget *child, guint G_GNUC_UNUSED(page_num), GtkApplication * application) {
  184 +
  185 + debug("%s(%p)",__FUNCTION__,child);
  186 +
  187 + gtk_notebook_set_show_tabs(notebook,gtk_notebook_get_n_pages(notebook) > 1);
  188 +
  189 + // Call plugins
  190 + int (*call)(GtkWidget *);
  191 +
  192 + GSList * item;
  193 + for(item = pw3270_application_get_plugins(G_APPLICATION(application)); item; item = g_slist_next(item)) {
  194 + if(g_module_symbol((GModule *) item->data, "pw3270_plugin_page_added", (gpointer *) &call)) {
  195 + call(child);
  196 + }
  197 + }
  198 +
  199 + }
  200 +
  201 + static void page_removed(GtkNotebook *notebook, GtkWidget *child, guint G_GNUC_UNUSED(page_num), GtkApplication * application) {
  202 +
  203 + debug("%s(%p)",__FUNCTION__,child);
  204 +
  205 + gtk_notebook_set_show_tabs(notebook,gtk_notebook_get_n_pages(notebook) > 1);
  206 +
  207 + // Call plugins
  208 + int (*call)(GtkWidget *);
  209 +
  210 + GSList * item;
  211 + for(item = pw3270_application_get_plugins(G_APPLICATION(application)); item; item = g_slist_next(item)) {
  212 + if(g_module_symbol((GModule *) item->data, "pw3270_plugin_page_removed", (gpointer *) &call)) {
  213 + call(child);
  214 + }
  215 + }
  216 +
  217 + }
  218 +
189 GtkWidget * pw3270_application_window_new(GtkApplication * application, const gchar *session_file) { 219 GtkWidget * pw3270_application_window_new(GtkApplication * application, const gchar *session_file) {
190 220
191 gchar *title = _( "IBM 3270 Terminal emulator" ); 221 gchar *title = _( "IBM 3270 Terminal emulator" );
@@ -203,6 +233,9 @@ @@ -203,6 +233,9 @@
203 "application", application, 233 "application", application,
204 NULL); 234 NULL);
205 235
  236 + g_signal_connect(G_OBJECT(window->notebook), "page-added", G_CALLBACK(page_added), application);
  237 + g_signal_connect(G_OBJECT(window->notebook), "page-removed", G_CALLBACK(page_removed), application);
  238 +
206 // 239 //
207 // Get builder 240 // Get builder
208 // 241 //