diff --git a/pw3270.cbp b/pw3270.cbp
index 4f1d510..44fd0c9 100644
--- a/pw3270.cbp
+++ b/pw3270.cbp
@@ -142,6 +142,9 @@
+
+
+
diff --git a/src/objects/window/header.c b/src/objects/window/header.c
new file mode 100644
index 0000000..e93e458
--- /dev/null
+++ b/src/objects/window/header.c
@@ -0,0 +1,84 @@
+/*
+ * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
+ * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
+ * aplicativos mainframe. Registro no INPI sob o nome G3270.
+ *
+ * Copyright (C) <2008>
+ *
+ * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
+ * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
+ * Free Software Foundation.
+ *
+ * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
+ * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
+ * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
+ * obter mais detalhes.
+ *
+ * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
+ * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
+ * St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Este programa está nomeado como - e possui - linhas de código.
+ *
+ * Contatos:
+ *
+ * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
+ * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
+ *
+ */
+
+ #include "private.h"
+ #include
+ #include
+ #include
+ #include
+
+ static void on_sensitive(GtkWidget *button, GParamSpec *spec, GtkWidget *widget) {
+
+ gboolean sensitive;
+ g_object_get(button, "sensitive", &sensitive, NULL);
+ gtk_widget_set_visible(button,sensitive);
+
+ }
+
+ GtkWidget * pw3270_header_button_new_from_builder(GtkWidget *widget, GtkBuilder * builder, const gchar *action_name) {
+
+ GtkWidget * button = NULL;
+
+ if(g_str_has_prefix(action_name,"menu.")) {
+
+ // It's a menu
+ g_autofree gchar * icon_name = g_strconcat(action_name+5,"-symbolic",NULL);
+ button = pw3270_setup_image_button(gtk_menu_button_new(),icon_name);
+ gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(button), G_MENU_MODEL(gtk_builder_get_object(builder, action_name+5)));
+ gtk_widget_set_visible(button,TRUE);
+
+ } else if(g_str_has_prefix(action_name,"app.")) {
+
+ // It's an application action
+
+ } else if(g_str_has_prefix(action_name,"win.")) {
+
+ // It's a window action.
+ GAction * action = g_action_map_lookup_action(G_ACTION_MAP(widget),action_name+4);
+ const gchar * icon_name = pw3270_action_get_icon_name(action);
+ if(action && icon_name) {
+ button = pw3270_setup_image_button(gtk_menu_button_new(),icon_name);
+ gtk_actionable_set_action_name(GTK_ACTIONABLE(button),action_name);
+ gtk_widget_set_visible(button,g_action_get_enabled(action));
+
+
+ }
+
+ }
+
+ if(button) {
+
+ g_signal_connect(button, "notify::sensitive", G_CALLBACK(on_sensitive), widget);
+ gtk_widget_set_focus_on_click(button,FALSE);
+ gtk_widget_set_can_focus(button,FALSE);
+
+ }
+
+ return button;
+ }
diff --git a/src/objects/window/private.h b/src/objects/window/private.h
index 514b06f..5a1de79 100644
--- a/src/objects/window/private.h
+++ b/src/objects/window/private.h
@@ -89,4 +89,7 @@
G_GNUC_INTERNAL void pw3270_window_open_activated(GSimpleAction * action, GVariant *parameter, gpointer window);
G_GNUC_INTERNAL void pw3270_window_close_activated(GSimpleAction * action, GVariant *parameter, gpointer window);
+ // Window widgets & tools.
+ G_GNUC_INTERNAL GtkWidget * pw3270_header_button_new_from_builder(GtkWidget *widget, GtkBuilder * builder, const gchar *action_name);
+
#endif // PRIVATE_H_INCLUDED
diff --git a/src/objects/window/window.c b/src/objects/window/window.c
index 396045e..057bb83 100644
--- a/src/objects/window/window.c
+++ b/src/objects/window/window.c
@@ -40,7 +40,6 @@
size_t ix;
pw3270ApplicationWindow * window = PW3270_APPLICATION_WINDOW(widget);
-
debug("%s(%p)",__FUNCTION__,widget);
// Update actions
@@ -65,7 +64,6 @@
}
}
-
GTK_WIDGET_CLASS(pw3270ApplicationWindow_parent_class)->destroy(widget);
}
@@ -217,19 +215,39 @@
else
gtk_header_bar_set_has_subtitle(header,TRUE);
- // Create gear button
+ // Show the new header
+ gtk_widget_show_all(GTK_WIDGET(header));
+
+ // Create header's action buttons
// https://wiki.gnome.org/Initiatives/GnomeGoals/GearIcons
- GtkWidget * gear_menu = pw3270_setup_image_button(gtk_menu_button_new(),"open-menu-symbolic");
- gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(gear_menu), G_MENU_MODEL(gtk_builder_get_object (builder, "gear-menu")));
- gtk_header_bar_pack_end(header, gear_menu);
+ static const gchar * end_actions[] = {
+ "menu.open-menu",
+ };
+
+ for(ix = 0; ix < G_N_ELEMENTS(end_actions); ix++) {
+ gtk_header_bar_pack_end(header, pw3270_header_button_new_from_builder(GTK_WIDGET(window),builder,end_actions[ix]));
+ }
+
+
+ static const gchar * start_actions[] = {
+ "win.disconnect",
+ "win.reconnect"
+ };
+
+ for(ix = 0; ix < G_N_ELEMENTS(start_actions); ix++) {
+ gtk_header_bar_pack_start(header, pw3270_header_button_new_from_builder(GTK_WIDGET(window),builder,start_actions[ix]));
+ }
+
+
+ /*
// Create "new tab" bar
GtkWidget * new_tab_button = pw3270_setup_image_button(gtk_button_new(),"tab-new-symbolic");
gtk_actionable_set_action_name(GTK_ACTIONABLE(new_tab_button),"app.new.tab");
gtk_header_bar_pack_start(header, new_tab_button);
+ gtk_widget_show(new_tab_button);
+ */
- // Show the new header
- gtk_widget_show_all(GTK_WIDGET(header));
}
break;
diff --git a/ui/window.xml b/ui/window.xml
index 5e2061e..b1563c4 100644
--- a/ui/window.xml
+++ b/ui/window.xml
@@ -30,7 +30,7 @@
-