Commit 4a5875a1bd9e7c6a661485ff007225f97b65ce17
1 parent
aa4e04a7
Exists in
master
and in
4 other branches
Improving header buttons.
Showing
5 changed files
with
117 additions
and
9 deletions
Show diff stats
pw3270.cbp
... | ... | @@ -142,6 +142,9 @@ |
142 | 142 | <Unit filename="src/objects/window/actions/setcolors.c"> |
143 | 143 | <Option compilerVar="CC" /> |
144 | 144 | </Unit> |
145 | + <Unit filename="src/objects/window/header.c"> | |
146 | + <Option compilerVar="CC" /> | |
147 | + </Unit> | |
145 | 148 | <Unit filename="src/objects/window/private.h" /> |
146 | 149 | <Unit filename="src/objects/window/terminal.c"> |
147 | 150 | <Option compilerVar="CC" /> | ... | ... |
... | ... | @@ -0,0 +1,84 @@ |
1 | +/* | |
2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
5 | + * | |
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
7 | + * | |
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
10 | + * Free Software Foundation. | |
11 | + * | |
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
15 | + * obter mais detalhes. | |
16 | + * | |
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
20 | + * | |
21 | + * Este programa está nomeado como - e possui - linhas de código. | |
22 | + * | |
23 | + * Contatos: | |
24 | + * | |
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
27 | + * | |
28 | + */ | |
29 | + | |
30 | + #include "private.h" | |
31 | + #include <pw3270.h> | |
32 | + #include <pw3270/toolbar.h> | |
33 | + #include <pw3270/application.h> | |
34 | + #include <pw3270/actions.h> | |
35 | + | |
36 | + static void on_sensitive(GtkWidget *button, GParamSpec *spec, GtkWidget *widget) { | |
37 | + | |
38 | + gboolean sensitive; | |
39 | + g_object_get(button, "sensitive", &sensitive, NULL); | |
40 | + gtk_widget_set_visible(button,sensitive); | |
41 | + | |
42 | + } | |
43 | + | |
44 | + GtkWidget * pw3270_header_button_new_from_builder(GtkWidget *widget, GtkBuilder * builder, const gchar *action_name) { | |
45 | + | |
46 | + GtkWidget * button = NULL; | |
47 | + | |
48 | + if(g_str_has_prefix(action_name,"menu.")) { | |
49 | + | |
50 | + // It's a menu | |
51 | + g_autofree gchar * icon_name = g_strconcat(action_name+5,"-symbolic",NULL); | |
52 | + button = pw3270_setup_image_button(gtk_menu_button_new(),icon_name); | |
53 | + gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(button), G_MENU_MODEL(gtk_builder_get_object(builder, action_name+5))); | |
54 | + gtk_widget_set_visible(button,TRUE); | |
55 | + | |
56 | + } else if(g_str_has_prefix(action_name,"app.")) { | |
57 | + | |
58 | + // It's an application action | |
59 | + | |
60 | + } else if(g_str_has_prefix(action_name,"win.")) { | |
61 | + | |
62 | + // It's a window action. | |
63 | + GAction * action = g_action_map_lookup_action(G_ACTION_MAP(widget),action_name+4); | |
64 | + const gchar * icon_name = pw3270_action_get_icon_name(action); | |
65 | + if(action && icon_name) { | |
66 | + button = pw3270_setup_image_button(gtk_menu_button_new(),icon_name); | |
67 | + gtk_actionable_set_action_name(GTK_ACTIONABLE(button),action_name); | |
68 | + gtk_widget_set_visible(button,g_action_get_enabled(action)); | |
69 | + | |
70 | + | |
71 | + } | |
72 | + | |
73 | + } | |
74 | + | |
75 | + if(button) { | |
76 | + | |
77 | + g_signal_connect(button, "notify::sensitive", G_CALLBACK(on_sensitive), widget); | |
78 | + gtk_widget_set_focus_on_click(button,FALSE); | |
79 | + gtk_widget_set_can_focus(button,FALSE); | |
80 | + | |
81 | + } | |
82 | + | |
83 | + return button; | |
84 | + } | ... | ... |
src/objects/window/private.h
... | ... | @@ -89,4 +89,7 @@ |
89 | 89 | G_GNUC_INTERNAL void pw3270_window_open_activated(GSimpleAction * action, GVariant *parameter, gpointer window); |
90 | 90 | G_GNUC_INTERNAL void pw3270_window_close_activated(GSimpleAction * action, GVariant *parameter, gpointer window); |
91 | 91 | |
92 | + // Window widgets & tools. | |
93 | + G_GNUC_INTERNAL GtkWidget * pw3270_header_button_new_from_builder(GtkWidget *widget, GtkBuilder * builder, const gchar *action_name); | |
94 | + | |
92 | 95 | #endif // PRIVATE_H_INCLUDED | ... | ... |
src/objects/window/window.c
... | ... | @@ -40,7 +40,6 @@ |
40 | 40 | size_t ix; |
41 | 41 | pw3270ApplicationWindow * window = PW3270_APPLICATION_WINDOW(widget); |
42 | 42 | |
43 | - | |
44 | 43 | debug("%s(%p)",__FUNCTION__,widget); |
45 | 44 | |
46 | 45 | // Update actions |
... | ... | @@ -65,7 +64,6 @@ |
65 | 64 | } |
66 | 65 | } |
67 | 66 | |
68 | - | |
69 | 67 | GTK_WIDGET_CLASS(pw3270ApplicationWindow_parent_class)->destroy(widget); |
70 | 68 | |
71 | 69 | } |
... | ... | @@ -217,19 +215,39 @@ |
217 | 215 | else |
218 | 216 | gtk_header_bar_set_has_subtitle(header,TRUE); |
219 | 217 | |
220 | - // Create gear button | |
218 | + // Show the new header | |
219 | + gtk_widget_show_all(GTK_WIDGET(header)); | |
220 | + | |
221 | + // Create header's action buttons | |
221 | 222 | // https://wiki.gnome.org/Initiatives/GnomeGoals/GearIcons |
222 | - GtkWidget * gear_menu = pw3270_setup_image_button(gtk_menu_button_new(),"open-menu-symbolic"); | |
223 | - gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(gear_menu), G_MENU_MODEL(gtk_builder_get_object (builder, "gear-menu"))); | |
224 | - gtk_header_bar_pack_end(header, gear_menu); | |
225 | 223 | |
224 | + static const gchar * end_actions[] = { | |
225 | + "menu.open-menu", | |
226 | + }; | |
227 | + | |
228 | + for(ix = 0; ix < G_N_ELEMENTS(end_actions); ix++) { | |
229 | + gtk_header_bar_pack_end(header, pw3270_header_button_new_from_builder(GTK_WIDGET(window),builder,end_actions[ix])); | |
230 | + } | |
231 | + | |
232 | + | |
233 | + static const gchar * start_actions[] = { | |
234 | + "win.disconnect", | |
235 | + "win.reconnect" | |
236 | + }; | |
237 | + | |
238 | + for(ix = 0; ix < G_N_ELEMENTS(start_actions); ix++) { | |
239 | + gtk_header_bar_pack_start(header, pw3270_header_button_new_from_builder(GTK_WIDGET(window),builder,start_actions[ix])); | |
240 | + } | |
241 | + | |
242 | + | |
243 | + /* | |
226 | 244 | // Create "new tab" bar |
227 | 245 | GtkWidget * new_tab_button = pw3270_setup_image_button(gtk_button_new(),"tab-new-symbolic"); |
228 | 246 | gtk_actionable_set_action_name(GTK_ACTIONABLE(new_tab_button),"app.new.tab"); |
229 | 247 | gtk_header_bar_pack_start(header, new_tab_button); |
248 | + gtk_widget_show(new_tab_button); | |
249 | + */ | |
230 | 250 | |
231 | - // Show the new header | |
232 | - gtk_widget_show_all(GTK_WIDGET(header)); | |
233 | 251 | } |
234 | 252 | break; |
235 | 253 | ... | ... |