Commit 812163f45eed9c412eb5f5ccb045b0fb8deb0905
1 parent
3d1738f1
Exists in
master
and in
1 other branch
Refactoring settings dialogs to a more standard and consistent behavior.
Showing
13 changed files
with
577 additions
and
256 deletions
Show diff stats
Makefile.in
... | ... | @@ -46,7 +46,8 @@ SOURCES= \ |
46 | 46 | $(wildcard src/dialogs/@OSNAME@/*.c) \ |
47 | 47 | $(wildcard src/dialogs/print/*.c) \ |
48 | 48 | $(wildcard src/dialogs/save/*.c) \ |
49 | - $(wildcard src/dialogs/font/*.c) | |
49 | + $(wildcard src/dialogs/font/*.c) \ | |
50 | + $(wildcard src/dialogs/settings/*.c) | |
50 | 51 | |
51 | 52 | TEST_SOURCES= \ |
52 | 53 | $(wildcard src/testprogram/*.c) | ... | ... |
src/dialogs/colors.c
... | ... | @@ -215,7 +215,7 @@ static void load(GtkWidget G_GNUC_UNUSED(*w), GtkWidget *terminal) |
215 | 215 | static void V3270ColorSelection_class_init(G_GNUC_UNUSED V3270ColorSelectionClass *klass) |
216 | 216 | { |
217 | 217 | GTK_V3270_SETTINGS_CLASS(klass)->load = load; |
218 | - GTK_V3270_SETTINGS_CLASS(klass)->cancel = cancel; | |
218 | + GTK_V3270_SETTINGS_CLASS(klass)->revert = cancel; | |
219 | 219 | } |
220 | 220 | |
221 | 221 | static void color_scheme_changed(GtkWidget G_GNUC_UNUSED(*dunno), const GdkRGBA *colors, V3270ColorSelection *widget) { |
... | ... | @@ -354,19 +354,20 @@ static void load(GtkWidget G_GNUC_UNUSED(*w), GtkWidget *terminal) |
354 | 354 | |
355 | 355 | LIB3270_EXPORT GtkWidget * v3270_color_selection_new() |
356 | 356 | { |
357 | - return GTK_WIDGET(g_object_new(GTK_TYPE_V3270_COLOR_SELECTION, NULL)); | |
357 | + V3270Settings * settings = GTK_V3270_SETTINGS(g_object_new(GTK_TYPE_V3270_COLOR_SELECTION, NULL)); | |
358 | + | |
359 | + settings->title = _("Terminal colors"); | |
360 | + settings->label = _("Colors"); | |
361 | + | |
362 | + return GTK_WIDGET(settings); | |
358 | 363 | } |
359 | 364 | |
360 | 365 | LIB3270_EXPORT void v3270_edit_color_table(GtkWidget *terminal) |
361 | 366 | { |
362 | - g_return_if_fail(GTK_IS_V3270(terminal)); | |
363 | - | |
364 | - GtkWidget * dialog = v3270_settings_dialog_new(terminal, v3270_color_selection_new()); | |
365 | - | |
366 | - v3270_dialog_setup(dialog,_("Color setup"),_("_Save")); | |
367 | - | |
368 | - gtk_widget_show_all(dialog); | |
369 | - gtk_dialog_run(GTK_DIALOG(dialog)); | |
370 | - gtk_widget_destroy(dialog); | |
367 | + v3270_settings_popup_dialog( | |
368 | + v3270_color_selection_new(), | |
369 | + terminal, | |
370 | + FALSE | |
371 | + ); | |
371 | 372 | |
372 | 373 | } | ... | ... |
src/dialogs/commondialog.c
... | ... | @@ -98,6 +98,7 @@ LIB3270_EXPORT GtkWidget * v3270_dialog_new(GtkWidget *widget, const gchar *titl |
98 | 98 | LIB3270_EXPORT void v3270_dialog_setup(GtkWidget *dialog, const gchar *title, const gchar *apply) |
99 | 99 | { |
100 | 100 | |
101 | +/* | |
101 | 102 | #if GTK_CHECK_VERSION(3,12,0) |
102 | 103 | |
103 | 104 | GtkWidget * header = gtk_dialog_get_header_bar(GTK_DIALOG(dialog)); |
... | ... | @@ -137,6 +138,7 @@ LIB3270_EXPORT void v3270_dialog_setup(GtkWidget *dialog, const gchar *title, co |
137 | 138 | ); |
138 | 139 | |
139 | 140 | #endif // GTK 3.12 |
141 | +*/ | |
140 | 142 | |
141 | 143 | } |
142 | 144 | ... | ... |
src/dialogs/font/chooser.c
... | ... | @@ -148,7 +148,7 @@ |
148 | 148 | |
149 | 149 | G_OBJECT_CLASS(klass)->dispose = dispose; |
150 | 150 | |
151 | - widget->cancel = cancel; | |
151 | + widget->revert = cancel; | |
152 | 152 | widget->load = load; |
153 | 153 | |
154 | 154 | } |
... | ... | @@ -323,9 +323,11 @@ static void V3270FontChooserWidget_init(V3270FontChooserWidget *widget) |
323 | 323 | |
324 | 324 | GtkWidget * v3270_font_chooser_widget_new() |
325 | 325 | { |
326 | - V3270FontChooserWidget * font_chooser = (V3270FontChooserWidget *) g_object_new(GTK_TYPE_V3270_FONT_CHOOSER, NULL); | |
326 | + V3270Settings * settings = GTK_V3270_SETTINGS(g_object_new(GTK_TYPE_V3270_FONT_CHOOSER, NULL)); | |
327 | 327 | |
328 | + settings->title = _("Terminal font"); | |
329 | + settings->label = _("Font"); | |
328 | 330 | |
329 | - return GTK_WIDGET(font_chooser); | |
331 | + return GTK_WIDGET(settings); | |
330 | 332 | } |
331 | 333 | ... | ... |
src/dialogs/hostselect.c
... | ... | @@ -349,26 +349,28 @@ static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget) |
349 | 349 | |
350 | 350 | LIB3270_EXPORT GtkWidget * v3270_host_select_new() |
351 | 351 | { |
352 | - return GTK_WIDGET(g_object_new(GTK_TYPE_V3270HostSelectWidget, NULL)); | |
352 | + V3270Settings * settings = GTK_V3270_SETTINGS(g_object_new(GTK_TYPE_V3270HostSelectWidget, NULL)); | |
353 | + | |
354 | + settings->title = _("Host definition"); | |
355 | + settings->label = _("Host"); | |
356 | + | |
357 | + return GTK_WIDGET(settings); | |
353 | 358 | } |
354 | 359 | |
355 | 360 | LIB3270_EXPORT void v3270_select_host(GtkWidget *widget) |
356 | 361 | { |
357 | 362 | g_return_if_fail(GTK_IS_V3270(widget)); |
358 | 363 | |
359 | - /* | |
360 | - if(v3270_is_connected(widget)) | |
361 | - { | |
362 | - gtk_widget_error_bell(widget); | |
363 | - return; | |
364 | - } | |
365 | - */ | |
364 | + GtkWidget * dialog = v3270_settings_dialog_new(); | |
366 | 365 | |
367 | - debug("V3270HostSelectWidget::%s",__FUNCTION__); | |
366 | + gtk_window_set_title(GTK_WINDOW(dialog), _("Host definition")); | |
367 | + | |
368 | + gtk_container_add(GTK_CONTAINER(dialog), v3270_host_select_new()); | |
368 | 369 | |
369 | - GtkWidget * dialog = v3270_settings_dialog_new(widget, v3270_host_select_new()); | |
370 | + gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(gtk_widget_get_toplevel(widget))); | |
371 | + gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); | |
370 | 372 | |
371 | - v3270_dialog_setup(dialog,_("Setup host"),_("C_onnect")); | |
373 | + v3270_settings_dialog_set_terminal_widget(dialog, widget); | |
372 | 374 | |
373 | 375 | gtk_window_set_default_size(GTK_WINDOW(dialog), 700, 150); |
374 | 376 | gtk_widget_show_all(dialog); |
... | ... | @@ -383,17 +385,18 @@ LIB3270_EXPORT void v3270_select_host(GtkWidget *widget) |
383 | 385 | { |
384 | 386 | case GTK_RESPONSE_APPLY: |
385 | 387 | debug("V3270HostSelectWidget::%s=%s",__FUNCTION__,"GTK_RESPONSE_APPLY"); |
388 | + v3270_settings_dialog_apply(dialog); | |
386 | 389 | again = lib3270_reconnect(v3270_get_session(widget),0); |
387 | 390 | break; |
388 | 391 | |
389 | 392 | case GTK_RESPONSE_CANCEL: |
390 | 393 | again = FALSE; |
391 | 394 | debug("V3270HostSelectWidget::%s=%s",__FUNCTION__,"GTK_RESPONSE_CANCEL"); |
395 | + v3270_settings_dialog_revert(dialog); | |
392 | 396 | break; |
393 | 397 | } |
394 | 398 | } |
395 | 399 | |
396 | - debug("%s end",__FUNCTION__); | |
397 | 400 | gtk_widget_destroy(dialog); |
398 | 401 | |
399 | 402 | } | ... | ... |
src/dialogs/settings.c
... | ... | @@ -1,212 +0,0 @@ |
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 <v3270/settings.h> | |
32 | - #include <lib3270/log.h> | |
33 | - | |
34 | - G_DEFINE_TYPE(V3270Settings, V3270Settings, GTK_TYPE_GRID); | |
35 | - | |
36 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | |
37 | - | |
38 | -static void apply(GtkWidget G_GNUC_UNUSED(*widget), GtkWidget G_GNUC_UNUSED(*terminal)) | |
39 | -{ | |
40 | - debug("V3270Settings::%s",__FUNCTION__); | |
41 | -} | |
42 | - | |
43 | -static void cancel(GtkWidget G_GNUC_UNUSED(*widget), GtkWidget G_GNUC_UNUSED(*terminal)) | |
44 | -{ | |
45 | - debug("V3270Settings::%s",__FUNCTION__); | |
46 | -} | |
47 | - | |
48 | -static void load(GtkWidget G_GNUC_UNUSED(*widget), GtkWidget G_GNUC_UNUSED(*terminal)) | |
49 | -{ | |
50 | - debug("V3270Settings::%s",__FUNCTION__); | |
51 | -} | |
52 | - | |
53 | -static void update_message(GtkWidget G_GNUC_UNUSED(*widget), GtkWidget G_GNUC_UNUSED(*terminal)) | |
54 | -{ | |
55 | - debug("V3270Settings::%s",__FUNCTION__); | |
56 | -} | |
57 | - | |
58 | -static void finalize(GObject *object) | |
59 | -{ | |
60 | - v3270_settings_set_terminal_widget(GTK_WIDGET(object),NULL); | |
61 | - G_OBJECT_CLASS(V3270Settings_parent_class)->finalize(object); | |
62 | -} | |
63 | - | |
64 | -static void V3270Settings_class_init(V3270SettingsClass *klass) | |
65 | -{ | |
66 | - klass->apply = apply; | |
67 | - klass->cancel = cancel; | |
68 | - klass->load = load; | |
69 | - klass->update_message = update_message; | |
70 | - | |
71 | - G_OBJECT_CLASS(klass)->finalize = finalize; | |
72 | -} | |
73 | - | |
74 | -static void V3270Settings_init(V3270Settings *widget) | |
75 | -{ | |
76 | - widget->terminal = NULL; | |
77 | - | |
78 | - // https://developer.gnome.org/hig/stable/visual-layout.html.en | |
79 | - gtk_grid_set_row_spacing(GTK_GRID(widget),6); | |
80 | - gtk_grid_set_column_spacing(GTK_GRID(widget),12); | |
81 | - | |
82 | -} | |
83 | - | |
84 | -static void signal_update_message(GtkWidget *terminal, LIB3270_MESSAGE G_GNUC_UNUSED(id), GtkWidget *settings) | |
85 | -{ | |
86 | - GTK_V3270_SETTINGS_GET_CLASS(settings)->update_message(settings,terminal); | |
87 | -} | |
88 | - | |
89 | -LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWidget *terminal) | |
90 | -{ | |
91 | - g_return_if_fail(GTK_IS_V3270_SETTINGS(widget)); | |
92 | - | |
93 | - V3270Settings * settings = GTK_V3270_SETTINGS(widget); | |
94 | - | |
95 | - // Return if there's nothing to do. | |
96 | - if(settings->terminal == terminal) | |
97 | - return; | |
98 | - | |
99 | - if(settings->terminal) | |
100 | - { | |
101 | - // Disconnect old terminal widget | |
102 | - gulong handler = g_signal_handler_find( | |
103 | - settings->terminal, | |
104 | - G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA, | |
105 | - 0, | |
106 | - 0, | |
107 | - NULL, | |
108 | - G_CALLBACK(signal_update_message), | |
109 | - widget | |
110 | - ); | |
111 | - | |
112 | - debug("handler=%u",(unsigned long) handler); | |
113 | - | |
114 | - if(handler) | |
115 | - g_signal_handler_disconnect(settings->terminal, handler); | |
116 | - | |
117 | - } | |
118 | - | |
119 | - // Update terminal | |
120 | - settings->terminal = terminal; | |
121 | - | |
122 | - if(settings->terminal) | |
123 | - { | |
124 | - // Connect the new widget. | |
125 | - g_signal_connect(G_OBJECT(terminal),I_("message_changed"), G_CALLBACK(signal_update_message), widget); | |
126 | - | |
127 | - // Update dialog state. | |
128 | - GTK_V3270_SETTINGS_GET_CLASS(widget)->update_message(widget,terminal); | |
129 | - | |
130 | - // Load the dialog contents. | |
131 | - GTK_V3270_SETTINGS_GET_CLASS(widget)->load(widget,terminal); | |
132 | - } | |
133 | - | |
134 | - } | |
135 | - | |
136 | - LIB3270_EXPORT GtkWidget * v3270_settings_get_terminal_widget(GtkWidget *widget) | |
137 | - { | |
138 | - g_return_val_if_fail(GTK_IS_V3270_SETTINGS(widget),NULL); | |
139 | - return GTK_V3270_SETTINGS(widget)->terminal; | |
140 | - } | |
141 | - | |
142 | - LIB3270_EXPORT void v3270_settings_apply(GtkWidget *widget) | |
143 | - { | |
144 | - g_return_if_fail(GTK_IS_V3270_SETTINGS(widget)); | |
145 | - GTK_V3270_SETTINGS_GET_CLASS(widget)->apply(widget,GTK_V3270_SETTINGS(widget)->terminal); | |
146 | - } | |
147 | - | |
148 | - LIB3270_EXPORT void v3270_settings_cancel(GtkWidget *widget) | |
149 | - { | |
150 | - g_return_if_fail(GTK_IS_V3270_SETTINGS(widget)); | |
151 | - GTK_V3270_SETTINGS_GET_CLASS(widget)->cancel(widget,GTK_V3270_SETTINGS(widget)->terminal); | |
152 | - } | |
153 | - | |
154 | - LIB3270_EXPORT void v3270_settings_on_dialog_response(GtkDialog G_GNUC_UNUSED(*dialog), gint response_id, GtkWidget *settings) | |
155 | - { | |
156 | - switch(response_id) | |
157 | - { | |
158 | - case GTK_RESPONSE_APPLY: | |
159 | - v3270_settings_apply(settings); | |
160 | - break; | |
161 | - | |
162 | - case GTK_RESPONSE_CANCEL: | |
163 | - v3270_settings_cancel(settings); | |
164 | - break; | |
165 | - | |
166 | - } | |
167 | - } | |
168 | - | |
169 | - LIB3270_EXPORT GtkWidget * v3270_settings_dialog_new(GtkWidget *terminal, GtkWidget *settings) | |
170 | - { | |
171 | -#if GTK_CHECK_VERSION(3,12,0) | |
172 | - | |
173 | - gboolean use_header; | |
174 | - g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); | |
175 | - | |
176 | - GtkWidget * dialog = | |
177 | - GTK_WIDGET(g_object_new( | |
178 | - GTK_TYPE_DIALOG, | |
179 | - "use-header-bar", (use_header ? 1 : 0), | |
180 | - NULL | |
181 | - )); | |
182 | - | |
183 | -#else | |
184 | - | |
185 | - GtkWidget * dialog = gtk_dialog_new(); | |
186 | - | |
187 | -#endif // GTK 3.12 | |
188 | - | |
189 | - GtkWidget * content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); | |
190 | - | |
191 | - // https://developer.gnome.org/hig/stable/visual-layout.html.en | |
192 | - gtk_box_set_spacing( | |
193 | - GTK_BOX(content_area), | |
194 | - 18 | |
195 | - ); | |
196 | - | |
197 | - gtk_box_pack_start(GTK_BOX(content_area),settings,TRUE,TRUE,2); | |
198 | - v3270_settings_set_terminal_widget(settings,terminal); | |
199 | - | |
200 | - g_signal_connect(G_OBJECT(dialog),"response",G_CALLBACK(v3270_settings_on_dialog_response),settings); | |
201 | - | |
202 | - gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE); | |
203 | - | |
204 | - // https://developer.gnome.org/hig/stable/visual-layout.html.en | |
205 | - gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),18); | |
206 | - | |
207 | - gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gtk_widget_get_toplevel(terminal))); | |
208 | - //gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); | |
209 | - gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); | |
210 | - | |
211 | - return dialog; | |
212 | - } |
... | ... | @@ -0,0 +1,276 @@ |
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 <internals.h> | |
32 | + #include <v3270/settings.h> | |
33 | + #include <lib3270/log.h> | |
34 | + | |
35 | + G_DEFINE_TYPE(V3270SettingsDialog, V3270SettingsDialog, GTK_TYPE_DIALOG); | |
36 | + | |
37 | +/*--[ Implement ]------------------------------------------------------------------------------------*/ | |
38 | + | |
39 | +static gboolean on_tab_focus(V3270Settings *settings, GdkEvent G_GNUC_UNUSED(*event), GtkWindow *dialog) | |
40 | +{ | |
41 | + debug("title: %s",settings->title); | |
42 | + debug("label: %s",settings->label); | |
43 | + | |
44 | + if(settings->title) | |
45 | + gtk_window_set_title(dialog,settings->title); | |
46 | + | |
47 | + return FALSE; | |
48 | +} | |
49 | + | |
50 | +static void add(GtkContainer *container, GtkWidget *widget) | |
51 | +{ | |
52 | + g_return_if_fail(GTK_IS_V3270_SETTINGS(widget)); | |
53 | + | |
54 | + debug("Added settings dialog %p",widget); | |
55 | + | |
56 | + GtkWidget * label = NULL; | |
57 | + if(GTK_V3270_SETTINGS(widget)->label) | |
58 | + { | |
59 | + label = gtk_label_new(GTK_V3270_SETTINGS(widget)->label); | |
60 | + | |
61 | + if(GTK_V3270_SETTINGS(widget)->tooltip) | |
62 | + gtk_widget_set_tooltip_markup(label,GTK_V3270_SETTINGS(widget)->tooltip); | |
63 | + | |
64 | + } | |
65 | + | |
66 | + gtk_notebook_append_page( | |
67 | + GTK_V3270_SETTINGS_DIALOG(container)->tabs, | |
68 | + widget, | |
69 | + label | |
70 | + ); | |
71 | + | |
72 | + g_signal_connect(G_OBJECT(widget), "focus-in-event", G_CALLBACK(on_tab_focus), container); | |
73 | + | |
74 | + | |
75 | +} | |
76 | + | |
77 | +static void apply_settings(GtkWidget *widget, GtkWidget G_GNUC_UNUSED(* terminal)) | |
78 | +{ | |
79 | + if(GTK_IS_V3270_SETTINGS(widget)) | |
80 | + v3270_settings_apply(widget); | |
81 | +} | |
82 | + | |
83 | +static void revert_settings(GtkWidget *widget, GtkWidget G_GNUC_UNUSED(* terminal)) | |
84 | +{ | |
85 | + if(GTK_IS_V3270_SETTINGS(widget)) | |
86 | + v3270_settings_revert(widget); | |
87 | +} | |
88 | + | |
89 | +void v3270_settings_dialog_apply(GtkWidget *dialog) | |
90 | +{ | |
91 | + debug("%s",__FUNCTION__); | |
92 | + | |
93 | + GtkWidget * terminal = GTK_V3270_SETTINGS_DIALOG(dialog)->terminal; | |
94 | + if(!terminal) | |
95 | + return; | |
96 | + | |
97 | + gtk_container_foreach( | |
98 | + GTK_CONTAINER(GTK_V3270_SETTINGS_DIALOG(dialog)->tabs), | |
99 | + (GtkCallback) apply_settings, | |
100 | + terminal | |
101 | + ); | |
102 | + | |
103 | + v3270_emit_save_settings(terminal); | |
104 | + | |
105 | +} | |
106 | + | |
107 | +void v3270_settings_dialog_revert(GtkWidget *dialog) | |
108 | +{ | |
109 | + debug("%s",__FUNCTION__); | |
110 | + | |
111 | + GtkWidget * terminal = GTK_V3270_SETTINGS_DIALOG(dialog)->terminal; | |
112 | + if(!terminal) | |
113 | + return; | |
114 | + | |
115 | + gtk_container_foreach( | |
116 | + GTK_CONTAINER(GTK_V3270_SETTINGS_DIALOG(dialog)->tabs), | |
117 | + (GtkCallback) revert_settings, | |
118 | + terminal | |
119 | + ); | |
120 | + | |
121 | +} | |
122 | + | |
123 | +/* | |
124 | +static void response(GtkDialog *dialog, gint response_id) | |
125 | +{ | |
126 | + if(!terminal) | |
127 | + return; | |
128 | + | |
129 | + | |
130 | +} | |
131 | +*/ | |
132 | + | |
133 | +static void dispose(GObject *object) | |
134 | +{ | |
135 | + debug("%s",__FUNCTION__); | |
136 | + | |
137 | + V3270SettingsDialog * widget = GTK_V3270_SETTINGS_DIALOG(object); | |
138 | + | |
139 | + | |
140 | + G_OBJECT_CLASS(V3270SettingsDialog_parent_class)->dispose(object); | |
141 | +} | |
142 | + | |
143 | +static void V3270SettingsDialog_class_init(V3270SettingsDialogClass *klass) | |
144 | +{ | |
145 | + GTK_CONTAINER_CLASS(klass)->add = add; | |
146 | + | |
147 | + // Object class | |
148 | + G_OBJECT_CLASS(klass)->dispose = dispose; | |
149 | + | |
150 | +} | |
151 | + | |
152 | +static void on_page_changed(GtkNotebook *notebook, GtkWidget G_GNUC_UNUSED(*child), guint G_GNUC_UNUSED(page_num), V3270SettingsDialog G_GNUC_UNUSED(*dialog)) { | |
153 | + gtk_notebook_set_show_tabs(notebook,gtk_notebook_get_n_pages(notebook) > 1); | |
154 | +} | |
155 | + | |
156 | +static void V3270SettingsDialog_init(V3270SettingsDialog *dialog) | |
157 | +{ | |
158 | + GtkWidget * content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); | |
159 | + | |
160 | + // https://developer.gnome.org/hig/stable/visual-layout.html.en | |
161 | + gtk_box_set_spacing(GTK_BOX(content_area),18); | |
162 | + gtk_container_set_border_width(GTK_CONTAINER(content_area),18); | |
163 | + | |
164 | + gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE); | |
165 | + gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); | |
166 | + | |
167 | + gtk_dialog_add_buttons( | |
168 | + GTK_DIALOG(dialog), | |
169 | + _("_Cancel"), GTK_RESPONSE_CANCEL, | |
170 | + _("_Apply"), GTK_RESPONSE_APPLY, | |
171 | + NULL | |
172 | + ); | |
173 | + | |
174 | + // Create notebook for settings widgets | |
175 | + dialog->tabs = GTK_NOTEBOOK(gtk_notebook_new()); | |
176 | + | |
177 | + gtk_notebook_set_scrollable(dialog->tabs,TRUE); | |
178 | + gtk_notebook_set_show_tabs(dialog->tabs,FALSE); | |
179 | + gtk_notebook_set_show_border(dialog->tabs, FALSE); | |
180 | + g_signal_connect(G_OBJECT(dialog->tabs), "page-added", G_CALLBACK(on_page_changed), dialog); | |
181 | + g_signal_connect(G_OBJECT(dialog->tabs), "page-removed", G_CALLBACK(on_page_changed), dialog); | |
182 | + gtk_box_pack_start(GTK_BOX(content_area),GTK_WIDGET(dialog->tabs),TRUE,TRUE,0); | |
183 | + | |
184 | +} | |
185 | + | |
186 | +GtkWidget * v3270_settings_dialog_new() | |
187 | +{ | |
188 | +#if GTK_CHECK_VERSION(3,12,0) | |
189 | + | |
190 | + gboolean use_header; | |
191 | + g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); | |
192 | + | |
193 | + GtkWidget * dialog = | |
194 | + GTK_WIDGET(g_object_new( | |
195 | + GTK_TYPE_V3270_SETTINGS_DIALOG, | |
196 | + "use-header-bar", (use_header ? 1 : 0), | |
197 | + NULL | |
198 | + )); | |
199 | + | |
200 | +#else | |
201 | + | |
202 | + GtkWidget * dialog = GTK_WIDGET(g_object_new(GTK_TYPE_V3270_SETTINGS_DIALOG, NULL)); | |
203 | + | |
204 | +#endif // GTK 3.12 | |
205 | + | |
206 | + return dialog; | |
207 | + | |
208 | +} | |
209 | + | |
210 | +static void set_terminal_widget(GtkWidget *settings, GtkWidget *terminal) | |
211 | +{ | |
212 | + if(GTK_IS_V3270_SETTINGS(settings)) | |
213 | + v3270_settings_set_terminal_widget(settings,terminal); | |
214 | +} | |
215 | + | |
216 | +void v3270_settings_dialog_set_terminal_widget(GtkWidget *widget, GtkWidget *terminal) | |
217 | +{ | |
218 | + g_return_if_fail(GTK_IS_V3270_SETTINGS_DIALOG(widget)); | |
219 | + | |
220 | + GTK_V3270_SETTINGS_DIALOG(widget)->terminal = terminal; | |
221 | + | |
222 | + gtk_container_foreach( | |
223 | + GTK_CONTAINER(GTK_V3270_SETTINGS_DIALOG(widget)->tabs), | |
224 | + (GtkCallback) set_terminal_widget, | |
225 | + terminal | |
226 | + ); | |
227 | +} | |
228 | + | |
229 | +void v3270_settting_dialog_response(GtkDialog *dialog, gint response_id, GtkWidget *terminal) | |
230 | +{ | |
231 | + switch(response_id) | |
232 | + { | |
233 | + case GTK_RESPONSE_APPLY: | |
234 | + debug("%s:apply",__FUNCTION__); | |
235 | + v3270_settings_dialog_apply(dialog); | |
236 | + break; | |
237 | + | |
238 | + case GTK_RESPONSE_CANCEL: | |
239 | + case GTK_RESPONSE_DELETE_EVENT: | |
240 | + debug("%s:cancel",__FUNCTION__); | |
241 | + v3270_settings_dialog_revert(dialog); | |
242 | + break; | |
243 | + | |
244 | + default: | |
245 | + g_warning("Unexpected settings dialog response \"%d\"",response_id); | |
246 | + } | |
247 | + | |
248 | + gtk_widget_destroy(dialog); | |
249 | + | |
250 | +} | |
251 | + | |
252 | +void v3270_settings_popup_dialog(GtkWidget *widget, GtkWidget *terminal, gboolean modal) | |
253 | +{ | |
254 | + g_return_if_fail(GTK_IS_V3270(terminal) && GTK_IS_V3270_SETTINGS(widget)); | |
255 | + | |
256 | + GtkWidget * dialog = v3270_settings_dialog_new(); | |
257 | + V3270Settings * settings = GTK_V3270_SETTINGS(widget); | |
258 | + | |
259 | + if(settings->title) | |
260 | + gtk_window_set_title(GTK_WINDOW(dialog),settings->title); | |
261 | + | |
262 | + gtk_container_add(GTK_CONTAINER(dialog), widget); | |
263 | + gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(gtk_widget_get_toplevel(terminal))); | |
264 | + | |
265 | + gtk_window_set_modal(GTK_WINDOW(dialog),modal); | |
266 | + | |
267 | + v3270_settings_dialog_set_terminal_widget(dialog, terminal); | |
268 | + | |
269 | + g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL); | |
270 | + g_signal_connect(dialog,"response",G_CALLBACK(v3270_settting_dialog_response),NULL); | |
271 | + | |
272 | + gtk_widget_show_all(dialog); | |
273 | + | |
274 | +} | |
275 | + | |
276 | + | ... | ... |
... | ... | @@ -0,0 +1,163 @@ |
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 <internals.h> | |
32 | + #include <v3270/settings.h> | |
33 | + #include <lib3270/log.h> | |
34 | + | |
35 | + G_DEFINE_TYPE(V3270Settings, V3270Settings, GTK_TYPE_GRID); | |
36 | + | |
37 | +/*--[ Implement ]------------------------------------------------------------------------------------*/ | |
38 | + | |
39 | +static void apply(GtkWidget G_GNUC_UNUSED(*widget), GtkWidget G_GNUC_UNUSED(*terminal)) | |
40 | +{ | |
41 | + debug("V3270Settings::%s",__FUNCTION__); | |
42 | +} | |
43 | + | |
44 | +static void cancel(GtkWidget G_GNUC_UNUSED(*widget), GtkWidget G_GNUC_UNUSED(*terminal)) | |
45 | +{ | |
46 | + debug("V3270Settings::%s",__FUNCTION__); | |
47 | +} | |
48 | + | |
49 | +static void load(GtkWidget G_GNUC_UNUSED(*widget), GtkWidget G_GNUC_UNUSED(*terminal)) | |
50 | +{ | |
51 | + debug("V3270Settings::%s",__FUNCTION__); | |
52 | +} | |
53 | + | |
54 | +static void update_message(GtkWidget G_GNUC_UNUSED(*widget), GtkWidget G_GNUC_UNUSED(*terminal)) | |
55 | +{ | |
56 | + debug("V3270Settings::%s",__FUNCTION__); | |
57 | +} | |
58 | + | |
59 | +static void finalize(GObject *object) | |
60 | +{ | |
61 | + v3270_settings_set_terminal_widget(GTK_WIDGET(object),NULL); | |
62 | + G_OBJECT_CLASS(V3270Settings_parent_class)->finalize(object); | |
63 | +} | |
64 | + | |
65 | +static void V3270Settings_class_init(V3270SettingsClass *klass) | |
66 | +{ | |
67 | + klass->apply = apply; | |
68 | + klass->revert = cancel; | |
69 | + klass->load = load; | |
70 | + klass->update_message = update_message; | |
71 | + | |
72 | + G_OBJECT_CLASS(klass)->finalize = finalize; | |
73 | +} | |
74 | + | |
75 | +static void V3270Settings_init(V3270Settings *widget) | |
76 | +{ | |
77 | + widget->terminal = NULL; | |
78 | + | |
79 | + // https://developer.gnome.org/hig/stable/visual-layout.html.en | |
80 | + gtk_grid_set_row_spacing(GTK_GRID(widget),6); | |
81 | + gtk_grid_set_column_spacing(GTK_GRID(widget),12); | |
82 | + | |
83 | +} | |
84 | + | |
85 | +static void signal_update_message(GtkWidget *terminal, LIB3270_MESSAGE G_GNUC_UNUSED(id), GtkWidget *settings) | |
86 | +{ | |
87 | + GTK_V3270_SETTINGS_GET_CLASS(settings)->update_message(settings,terminal); | |
88 | +} | |
89 | + | |
90 | +LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWidget *terminal) | |
91 | +{ | |
92 | + g_return_if_fail(GTK_IS_V3270_SETTINGS(widget)); | |
93 | + | |
94 | + V3270Settings * settings = GTK_V3270_SETTINGS(widget); | |
95 | + | |
96 | + // Return if there's nothing to do. | |
97 | + if(settings->terminal == terminal) | |
98 | + return; | |
99 | + | |
100 | + if(settings->terminal) | |
101 | + { | |
102 | + // Disconnect old terminal widget | |
103 | + gulong handler = g_signal_handler_find( | |
104 | + settings->terminal, | |
105 | + G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA, | |
106 | + 0, | |
107 | + 0, | |
108 | + NULL, | |
109 | + G_CALLBACK(signal_update_message), | |
110 | + widget | |
111 | + ); | |
112 | + | |
113 | + debug("handler=%u",(unsigned long) handler); | |
114 | + | |
115 | + if(handler) | |
116 | + g_signal_handler_disconnect(settings->terminal, handler); | |
117 | + | |
118 | + } | |
119 | + | |
120 | + // Update terminal | |
121 | + settings->terminal = terminal; | |
122 | + | |
123 | + if(settings->terminal) | |
124 | + { | |
125 | + // Connect the new widget. | |
126 | + g_signal_connect(G_OBJECT(terminal),I_("message_changed"), G_CALLBACK(signal_update_message), widget); | |
127 | + | |
128 | + // Update dialog state. | |
129 | + GTK_V3270_SETTINGS_GET_CLASS(widget)->update_message(widget,terminal); | |
130 | + | |
131 | + // Load the dialog contents. | |
132 | + GTK_V3270_SETTINGS_GET_CLASS(widget)->load(widget,terminal); | |
133 | + } | |
134 | + | |
135 | + } | |
136 | + | |
137 | + LIB3270_EXPORT GtkWidget * v3270_settings_get_terminal_widget(GtkWidget *widget) | |
138 | + { | |
139 | + g_return_val_if_fail(GTK_IS_V3270_SETTINGS(widget),NULL); | |
140 | + return GTK_V3270_SETTINGS(widget)->terminal; | |
141 | + } | |
142 | + | |
143 | + LIB3270_EXPORT void v3270_settings_apply(GtkWidget *widget) | |
144 | + { | |
145 | + g_return_if_fail(GTK_IS_V3270_SETTINGS(widget)); | |
146 | + GTK_V3270_SETTINGS_GET_CLASS(widget)->apply(widget,GTK_V3270_SETTINGS(widget)->terminal); | |
147 | + | |
148 | + /* | |
149 | + | |
150 | + BUG: The signal should be sent by the dialog! | |
151 | + | |
152 | + V3270Settings * settings = GTK_V3270_SETTINGS(widget); | |
153 | + if(settings && settings->terminal) | |
154 | + v3270_emit_save_settings(settings->terminal); | |
155 | + */ | |
156 | + } | |
157 | + | |
158 | + LIB3270_EXPORT void v3270_settings_revert(GtkWidget *widget) | |
159 | + { | |
160 | + g_return_if_fail(GTK_IS_V3270_SETTINGS(widget)); | |
161 | + GTK_V3270_SETTINGS_GET_CLASS(widget)->revert(widget,GTK_V3270_SETTINGS(widget)->terminal); | |
162 | + } | |
163 | + | ... | ... |
src/include/internals.h
... | ... | @@ -65,21 +65,38 @@ |
65 | 65 | V3270_SIGNAL_TOGGLE_CHANGED, |
66 | 66 | V3270_SIGNAL_MESSAGE_CHANGED, |
67 | 67 | V3270_SIGNAL_KEYPRESS, |
68 | - V3270_SIGNAL_CONNECTED, | |
69 | - V3270_SIGNAL_DISCONNECTED, | |
70 | - V3270_SIGNAL_UPDATE_CONFIG, | |
71 | 68 | V3270_SIGNAL_MODEL_CHANGED, |
72 | - V3270_SIGNAL_SELECTING, | |
73 | 69 | V3270_SIGNAL_POPUP, |
74 | - V3270_SIGNAL_PASTENEXT, | |
75 | - V3270_SIGNAL_CLIPBOARD, | |
76 | 70 | V3270_SIGNAL_CHANGED, |
77 | 71 | V3270_SIGNAL_MESSAGE, |
78 | 72 | V3270_SIGNAL_FIELD, |
73 | + V3270_SIGNAL_SESSION_CHANGED, | |
74 | + | |
75 | + // | |
76 | + // Clipboard signals. | |
77 | + // | |
78 | + V3270_SIGNAL_SELECTING, | |
79 | + V3270_SIGNAL_CLIPBOARD, | |
80 | + V3270_SIGNAL_PASTENEXT, | |
81 | + | |
82 | + // | |
83 | + // Network signals. | |
84 | + // | |
85 | + V3270_SIGNAL_CONNECTED, | |
86 | + V3270_SIGNAL_DISCONNECTED, | |
87 | + | |
88 | + // | |
89 | + // Print session signals. | |
90 | + // | |
79 | 91 | V3270_SIGNAL_PRINT_SETUP, |
80 | 92 | V3270_SIGNAL_PRINT_APPLY, |
81 | 93 | V3270_SIGNAL_PRINT_DONE, |
82 | - V3270_SIGNAL_SESSION_CHANGED, | |
94 | + | |
95 | + // | |
96 | + // Settings signals (Mostly fired by V3270Settings dialogs). | |
97 | + // | |
98 | + V3270_SIGNAL_SAVE_SETTINGS, ///< @brief Notify main application to save all widget settings. | |
99 | + V3270_SIGNAL_UPDATE_CONFIG, ///< @brief Update config signal (deprecated!) | |
83 | 100 | |
84 | 101 | V3270_SIGNAL_LAST |
85 | 102 | }; |
... | ... | @@ -102,6 +119,9 @@ |
102 | 119 | |
103 | 120 | G_GNUC_INTERNAL void v3270_dialog_close(GtkDialog *dialog, gpointer user_data); |
104 | 121 | |
122 | + /// @brief Emit the "save-settings" signal. | |
123 | + G_GNUC_INTERNAL void v3270_emit_save_settings(GtkWidget *widget); | |
124 | + | |
105 | 125 | G_GNUC_INTERNAL gchar * v3270_convert_to_3270_charset(GtkWidget *widget, const gchar *text, const gchar *encoding, GError **error); |
106 | 126 | |
107 | 127 | ... | ... |
src/include/v3270/settings.h
... | ... | @@ -35,7 +35,7 @@ |
35 | 35 | |
36 | 36 | G_BEGIN_DECLS |
37 | 37 | |
38 | -/*--[ Progress widget ]------------------------------------------------------------------------------*/ | |
38 | +/*--[ V3270 Settings Widget ]------------------------------------------------------------------------*/ | |
39 | 39 | |
40 | 40 | #define GTK_TYPE_V3270_SETTINGS (V3270Settings_get_type()) |
41 | 41 | #define GTK_V3270_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270_SETTINGS, V3270Settings)) |
... | ... | @@ -47,6 +47,9 @@ |
47 | 47 | typedef struct _V3270Settings { |
48 | 48 | GtkGrid parent; |
49 | 49 | GtkWidget * terminal; |
50 | + const gchar * label; ///< @brief Label for settings dialog. | |
51 | + const gchar * title; ///< @brief Title for settings dialog. | |
52 | + const gchar * tooltip; ///< @brief Tooltip for settings dialog. | |
50 | 53 | } V3270Settings; |
51 | 54 | |
52 | 55 | typedef struct _V3270SettingsClass { |
... | ... | @@ -54,25 +57,52 @@ |
54 | 57 | |
55 | 58 | void (*load)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method to load the properties from terminal widget |
56 | 59 | void (*apply)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method for GTK_RESPONSE_APPLY |
57 | - void (*cancel)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method for GTK_RESPONSE_CANCEL | |
60 | + void (*revert)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method for GTK_RESPONSE_CANCEL | |
58 | 61 | void (*update_message)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Lib3270 message has changed. |
59 | 62 | |
60 | 63 | } V3270SettingsClass; |
61 | 64 | |
62 | -/*--[ Prototypes ]-----------------------------------------------------------------------------------*/ | |
65 | + LIB3270_EXPORT GType V3270Settings_get_type(void); | |
63 | 66 | |
64 | 67 | LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWidget *terminal); |
65 | 68 | LIB3270_EXPORT GtkWidget * v3270_settings_get_terminal_widget(GtkWidget *widget); |
66 | 69 | |
67 | - LIB3270_EXPORT GType V3270Settings_get_type(void); | |
68 | 70 | LIB3270_EXPORT void v3270_settings_apply(GtkWidget *widget); |
69 | - LIB3270_EXPORT void v3270_settings_cancel(GtkWidget *widget); | |
71 | + LIB3270_EXPORT void v3270_settings_revert(GtkWidget *widget); | |
72 | + | |
73 | + /// @brief Popup a settings dialog for the terminal. | |
74 | + LIB3270_EXPORT void v3270_settings_popup_dialog(GtkWidget *settings, GtkWidget *terminal, gboolean modal); | |
75 | + | |
76 | +/*--[ V3270 Settings Dialog ]------------------------------------------------------------------------*/ | |
77 | + | |
78 | + #define GTK_TYPE_V3270_SETTINGS_DIALOG (V3270SettingsDialog_get_type()) | |
79 | + #define GTK_V3270_SETTINGS_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270_SETTINGS_DIALOG, V3270SettingsDialog)) | |
80 | + #define GTK_V3270_SETTINGS_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_V3270_SETTINGS_DIALOG, V3270SettingsDialogClass)) | |
81 | + #define GTK_IS_V3270_SETTINGS_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_V3270_SETTINGS_DIALOG)) | |
82 | + #define GTK_IS_V3270_SETTINGS_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_V3270_SETTINGS_DIALOG)) | |
83 | + #define GTK_V3270_SETTINGS_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_V3270_SETTINGS_DIALOG, V3270SettingsDialogClass)) | |
84 | + | |
85 | + typedef struct _V3270SettingsDialog { | |
86 | + GtkDialog parent; | |
87 | + GtkNotebook * tabs; | |
88 | + GtkWidget * terminal; | |
89 | + } V3270SettingsDialog; | |
90 | + | |
91 | + typedef struct _V3270SettingsDialogClass { | |
92 | + GtkDialogClass parent_class; | |
93 | + | |
94 | + } V3270SettingsDialogClass; | |
95 | + | |
96 | + LIB3270_EXPORT GType V3270SettingsDialog_get_type(void); | |
97 | + | |
98 | + LIB3270_EXPORT GtkWidget * v3270_settings_dialog_new(); | |
99 | + LIB3270_EXPORT void v3270_settings_dialog_set_terminal_widget(GtkWidget *widget, GtkWidget *terminal); | |
70 | 100 | |
71 | - /// @brief Callback for GtkDialog's "response" signal. | |
72 | - LIB3270_EXPORT void v3270_settings_on_dialog_response(GtkDialog *dialog, gint response_id, GtkWidget *settings); | |
101 | + /// @brief Process GtkDialog's "response" signal. | |
102 | + LIB3270_EXPORT void v3270_settting_dialog_response(GtkDialog *dialog, gint response_id, GtkWidget *terminal); | |
73 | 103 | |
74 | - LIB3270_EXPORT GtkWidget * v3270_settings_dialog_new(GtkWidget *terminal, GtkWidget *settings); | |
75 | - // LIB3270_EXPORT gint v3270_settings_dialog_run(GtkWidget *widget, GtkWidget *terminal); | |
104 | + LIB3270_EXPORT void v3270_settings_dialog_apply(GtkWidget *widget); | |
105 | + LIB3270_EXPORT void v3270_settings_dialog_revert(GtkWidget *widget); | |
76 | 106 | |
77 | 107 | G_END_DECLS |
78 | 108 | ... | ... |
src/terminal/widget.c
... | ... | @@ -456,6 +456,15 @@ static void v3270_class_init(v3270Class *klass) |
456 | 456 | v3270_VOID__VOID_POINTER_UINT, |
457 | 457 | G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_UINT, 0); |
458 | 458 | |
459 | + v3270_widget_signal[V3270_SIGNAL_SAVE_SETTINGS] = | |
460 | + g_signal_new( I_("save-settings"), | |
461 | + G_OBJECT_CLASS_TYPE (gobject_class), | |
462 | + G_SIGNAL_RUN_FIRST, | |
463 | + 0, | |
464 | + NULL, NULL, | |
465 | + v3270_VOID__VOID, | |
466 | + G_TYPE_NONE, 0); | |
467 | + | |
459 | 468 | v3270_init_properties(gobject_class); |
460 | 469 | |
461 | 470 | } |
... | ... | @@ -750,3 +759,15 @@ LIB3270_EXPORT GtkIMContext * v3270_get_im_context(GtkWidget *widget) |
750 | 759 | return GTK_V3270(widget)->input_method; |
751 | 760 | } |
752 | 761 | |
762 | +static gboolean bg_emit_save_settings(GObject *widget) | |
763 | +{ | |
764 | + g_signal_emit(widget,v3270_widget_signal[V3270_SIGNAL_SAVE_SETTINGS], 0, FALSE); | |
765 | + return FALSE; | |
766 | +} | |
767 | + | |
768 | +void v3270_emit_save_settings(GtkWidget *widget) | |
769 | +{ | |
770 | + if(widget) | |
771 | + g_idle_add((GSourceFunc) bg_emit_save_settings, G_OBJECT(widget)); | |
772 | +} | |
773 | + | ... | ... |
src/testprogram/toolbar.c
... | ... | @@ -54,13 +54,21 @@ |
54 | 54 | |
55 | 55 | static void font_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) |
56 | 56 | { |
57 | + v3270_settings_popup_dialog( | |
58 | + v3270_font_chooser_widget_new(), | |
59 | + terminal, | |
60 | + FALSE | |
61 | + ); | |
62 | + | |
63 | + /* | |
57 | 64 | GtkWidget * dialog = v3270_settings_dialog_new(terminal, v3270_font_chooser_widget_new()); |
58 | 65 | |
59 | - v3270_dialog_setup(dialog,_("Font setup"),_("_Save")); | |
66 | +// v3270_dialog_setup(dialog,_("Font setup"),_("_Save")); | |
60 | 67 | |
61 | 68 | gtk_widget_show_all(dialog); |
62 | 69 | gtk_dialog_run(GTK_DIALOG(dialog)); |
63 | 70 | gtk_widget_destroy(dialog); |
71 | + */ | |
64 | 72 | |
65 | 73 | } |
66 | 74 | ... | ... |
v3270.cbp
... | ... | @@ -102,6 +102,12 @@ |
102 | 102 | <Unit filename="src/dialogs/settings.c"> |
103 | 103 | <Option compilerVar="CC" /> |
104 | 104 | </Unit> |
105 | + <Unit filename="src/dialogs/settings/dialog.c"> | |
106 | + <Option compilerVar="CC" /> | |
107 | + </Unit> | |
108 | + <Unit filename="src/dialogs/settings/widget.c"> | |
109 | + <Option compilerVar="CC" /> | |
110 | + </Unit> | |
105 | 111 | <Unit filename="src/dialogs/togglebutton.c"> |
106 | 112 | <Option compilerVar="CC" /> |
107 | 113 | </Unit> | ... | ... |