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,7 +46,8 @@ SOURCES= \ | ||
46 | $(wildcard src/dialogs/@OSNAME@/*.c) \ | 46 | $(wildcard src/dialogs/@OSNAME@/*.c) \ |
47 | $(wildcard src/dialogs/print/*.c) \ | 47 | $(wildcard src/dialogs/print/*.c) \ |
48 | $(wildcard src/dialogs/save/*.c) \ | 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 | TEST_SOURCES= \ | 52 | TEST_SOURCES= \ |
52 | $(wildcard src/testprogram/*.c) | 53 | $(wildcard src/testprogram/*.c) |
src/dialogs/colors.c
@@ -215,7 +215,7 @@ static void load(GtkWidget G_GNUC_UNUSED(*w), GtkWidget *terminal) | @@ -215,7 +215,7 @@ static void load(GtkWidget G_GNUC_UNUSED(*w), GtkWidget *terminal) | ||
215 | static void V3270ColorSelection_class_init(G_GNUC_UNUSED V3270ColorSelectionClass *klass) | 215 | static void V3270ColorSelection_class_init(G_GNUC_UNUSED V3270ColorSelectionClass *klass) |
216 | { | 216 | { |
217 | GTK_V3270_SETTINGS_CLASS(klass)->load = load; | 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 | static void color_scheme_changed(GtkWidget G_GNUC_UNUSED(*dunno), const GdkRGBA *colors, V3270ColorSelection *widget) { | 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,19 +354,20 @@ static void load(GtkWidget G_GNUC_UNUSED(*w), GtkWidget *terminal) | ||
354 | 354 | ||
355 | LIB3270_EXPORT GtkWidget * v3270_color_selection_new() | 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 | LIB3270_EXPORT void v3270_edit_color_table(GtkWidget *terminal) | 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,6 +98,7 @@ LIB3270_EXPORT GtkWidget * v3270_dialog_new(GtkWidget *widget, const gchar *titl | ||
98 | LIB3270_EXPORT void v3270_dialog_setup(GtkWidget *dialog, const gchar *title, const gchar *apply) | 98 | LIB3270_EXPORT void v3270_dialog_setup(GtkWidget *dialog, const gchar *title, const gchar *apply) |
99 | { | 99 | { |
100 | 100 | ||
101 | +/* | ||
101 | #if GTK_CHECK_VERSION(3,12,0) | 102 | #if GTK_CHECK_VERSION(3,12,0) |
102 | 103 | ||
103 | GtkWidget * header = gtk_dialog_get_header_bar(GTK_DIALOG(dialog)); | 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,6 +138,7 @@ LIB3270_EXPORT void v3270_dialog_setup(GtkWidget *dialog, const gchar *title, co | ||
137 | ); | 138 | ); |
138 | 139 | ||
139 | #endif // GTK 3.12 | 140 | #endif // GTK 3.12 |
141 | +*/ | ||
140 | 142 | ||
141 | } | 143 | } |
142 | 144 |
src/dialogs/font/chooser.c
@@ -148,7 +148,7 @@ | @@ -148,7 +148,7 @@ | ||
148 | 148 | ||
149 | G_OBJECT_CLASS(klass)->dispose = dispose; | 149 | G_OBJECT_CLASS(klass)->dispose = dispose; |
150 | 150 | ||
151 | - widget->cancel = cancel; | 151 | + widget->revert = cancel; |
152 | widget->load = load; | 152 | widget->load = load; |
153 | 153 | ||
154 | } | 154 | } |
@@ -323,9 +323,11 @@ static void V3270FontChooserWidget_init(V3270FontChooserWidget *widget) | @@ -323,9 +323,11 @@ static void V3270FontChooserWidget_init(V3270FontChooserWidget *widget) | ||
323 | 323 | ||
324 | GtkWidget * v3270_font_chooser_widget_new() | 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,26 +349,28 @@ static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget) | ||
349 | 349 | ||
350 | LIB3270_EXPORT GtkWidget * v3270_host_select_new() | 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 | LIB3270_EXPORT void v3270_select_host(GtkWidget *widget) | 360 | LIB3270_EXPORT void v3270_select_host(GtkWidget *widget) |
356 | { | 361 | { |
357 | g_return_if_fail(GTK_IS_V3270(widget)); | 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 | gtk_window_set_default_size(GTK_WINDOW(dialog), 700, 150); | 375 | gtk_window_set_default_size(GTK_WINDOW(dialog), 700, 150); |
374 | gtk_widget_show_all(dialog); | 376 | gtk_widget_show_all(dialog); |
@@ -383,17 +385,18 @@ LIB3270_EXPORT void v3270_select_host(GtkWidget *widget) | @@ -383,17 +385,18 @@ LIB3270_EXPORT void v3270_select_host(GtkWidget *widget) | ||
383 | { | 385 | { |
384 | case GTK_RESPONSE_APPLY: | 386 | case GTK_RESPONSE_APPLY: |
385 | debug("V3270HostSelectWidget::%s=%s",__FUNCTION__,"GTK_RESPONSE_APPLY"); | 387 | debug("V3270HostSelectWidget::%s=%s",__FUNCTION__,"GTK_RESPONSE_APPLY"); |
388 | + v3270_settings_dialog_apply(dialog); | ||
386 | again = lib3270_reconnect(v3270_get_session(widget),0); | 389 | again = lib3270_reconnect(v3270_get_session(widget),0); |
387 | break; | 390 | break; |
388 | 391 | ||
389 | case GTK_RESPONSE_CANCEL: | 392 | case GTK_RESPONSE_CANCEL: |
390 | again = FALSE; | 393 | again = FALSE; |
391 | debug("V3270HostSelectWidget::%s=%s",__FUNCTION__,"GTK_RESPONSE_CANCEL"); | 394 | debug("V3270HostSelectWidget::%s=%s",__FUNCTION__,"GTK_RESPONSE_CANCEL"); |
395 | + v3270_settings_dialog_revert(dialog); | ||
392 | break; | 396 | break; |
393 | } | 397 | } |
394 | } | 398 | } |
395 | 399 | ||
396 | - debug("%s end",__FUNCTION__); | ||
397 | gtk_widget_destroy(dialog); | 400 | gtk_widget_destroy(dialog); |
398 | 401 | ||
399 | } | 402 | } |
src/dialogs/settings.c
@@ -1,212 +0,0 @@ | @@ -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 @@ | @@ -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 @@ | @@ -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,21 +65,38 @@ | ||
65 | V3270_SIGNAL_TOGGLE_CHANGED, | 65 | V3270_SIGNAL_TOGGLE_CHANGED, |
66 | V3270_SIGNAL_MESSAGE_CHANGED, | 66 | V3270_SIGNAL_MESSAGE_CHANGED, |
67 | V3270_SIGNAL_KEYPRESS, | 67 | V3270_SIGNAL_KEYPRESS, |
68 | - V3270_SIGNAL_CONNECTED, | ||
69 | - V3270_SIGNAL_DISCONNECTED, | ||
70 | - V3270_SIGNAL_UPDATE_CONFIG, | ||
71 | V3270_SIGNAL_MODEL_CHANGED, | 68 | V3270_SIGNAL_MODEL_CHANGED, |
72 | - V3270_SIGNAL_SELECTING, | ||
73 | V3270_SIGNAL_POPUP, | 69 | V3270_SIGNAL_POPUP, |
74 | - V3270_SIGNAL_PASTENEXT, | ||
75 | - V3270_SIGNAL_CLIPBOARD, | ||
76 | V3270_SIGNAL_CHANGED, | 70 | V3270_SIGNAL_CHANGED, |
77 | V3270_SIGNAL_MESSAGE, | 71 | V3270_SIGNAL_MESSAGE, |
78 | V3270_SIGNAL_FIELD, | 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 | V3270_SIGNAL_PRINT_SETUP, | 91 | V3270_SIGNAL_PRINT_SETUP, |
80 | V3270_SIGNAL_PRINT_APPLY, | 92 | V3270_SIGNAL_PRINT_APPLY, |
81 | V3270_SIGNAL_PRINT_DONE, | 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 | V3270_SIGNAL_LAST | 101 | V3270_SIGNAL_LAST |
85 | }; | 102 | }; |
@@ -102,6 +119,9 @@ | @@ -102,6 +119,9 @@ | ||
102 | 119 | ||
103 | G_GNUC_INTERNAL void v3270_dialog_close(GtkDialog *dialog, gpointer user_data); | 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 | G_GNUC_INTERNAL gchar * v3270_convert_to_3270_charset(GtkWidget *widget, const gchar *text, const gchar *encoding, GError **error); | 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,7 +35,7 @@ | ||
35 | 35 | ||
36 | G_BEGIN_DECLS | 36 | G_BEGIN_DECLS |
37 | 37 | ||
38 | -/*--[ Progress widget ]------------------------------------------------------------------------------*/ | 38 | +/*--[ V3270 Settings Widget ]------------------------------------------------------------------------*/ |
39 | 39 | ||
40 | #define GTK_TYPE_V3270_SETTINGS (V3270Settings_get_type()) | 40 | #define GTK_TYPE_V3270_SETTINGS (V3270Settings_get_type()) |
41 | #define GTK_V3270_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270_SETTINGS, V3270Settings)) | 41 | #define GTK_V3270_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270_SETTINGS, V3270Settings)) |
@@ -47,6 +47,9 @@ | @@ -47,6 +47,9 @@ | ||
47 | typedef struct _V3270Settings { | 47 | typedef struct _V3270Settings { |
48 | GtkGrid parent; | 48 | GtkGrid parent; |
49 | GtkWidget * terminal; | 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 | } V3270Settings; | 53 | } V3270Settings; |
51 | 54 | ||
52 | typedef struct _V3270SettingsClass { | 55 | typedef struct _V3270SettingsClass { |
@@ -54,25 +57,52 @@ | @@ -54,25 +57,52 @@ | ||
54 | 57 | ||
55 | void (*load)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method to load the properties from terminal widget | 58 | void (*load)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method to load the properties from terminal widget |
56 | void (*apply)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method for GTK_RESPONSE_APPLY | 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 | void (*update_message)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Lib3270 message has changed. | 61 | void (*update_message)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Lib3270 message has changed. |
59 | 62 | ||
60 | } V3270SettingsClass; | 63 | } V3270SettingsClass; |
61 | 64 | ||
62 | -/*--[ Prototypes ]-----------------------------------------------------------------------------------*/ | 65 | + LIB3270_EXPORT GType V3270Settings_get_type(void); |
63 | 66 | ||
64 | LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWidget *terminal); | 67 | LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWidget *terminal); |
65 | LIB3270_EXPORT GtkWidget * v3270_settings_get_terminal_widget(GtkWidget *widget); | 68 | LIB3270_EXPORT GtkWidget * v3270_settings_get_terminal_widget(GtkWidget *widget); |
66 | 69 | ||
67 | - LIB3270_EXPORT GType V3270Settings_get_type(void); | ||
68 | LIB3270_EXPORT void v3270_settings_apply(GtkWidget *widget); | 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 | G_END_DECLS | 107 | G_END_DECLS |
78 | 108 |
src/terminal/widget.c
@@ -456,6 +456,15 @@ static void v3270_class_init(v3270Class *klass) | @@ -456,6 +456,15 @@ static void v3270_class_init(v3270Class *klass) | ||
456 | v3270_VOID__VOID_POINTER_UINT, | 456 | v3270_VOID__VOID_POINTER_UINT, |
457 | G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_UINT, 0); | 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 | v3270_init_properties(gobject_class); | 468 | v3270_init_properties(gobject_class); |
460 | 469 | ||
461 | } | 470 | } |
@@ -750,3 +759,15 @@ LIB3270_EXPORT GtkIMContext * v3270_get_im_context(GtkWidget *widget) | @@ -750,3 +759,15 @@ LIB3270_EXPORT GtkIMContext * v3270_get_im_context(GtkWidget *widget) | ||
750 | return GTK_V3270(widget)->input_method; | 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,13 +54,21 @@ | ||
54 | 54 | ||
55 | static void font_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) | 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 | GtkWidget * dialog = v3270_settings_dialog_new(terminal, v3270_font_chooser_widget_new()); | 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 | gtk_widget_show_all(dialog); | 68 | gtk_widget_show_all(dialog); |
62 | gtk_dialog_run(GTK_DIALOG(dialog)); | 69 | gtk_dialog_run(GTK_DIALOG(dialog)); |
63 | gtk_widget_destroy(dialog); | 70 | gtk_widget_destroy(dialog); |
71 | + */ | ||
64 | 72 | ||
65 | } | 73 | } |
66 | 74 |
v3270.cbp
@@ -102,6 +102,12 @@ | @@ -102,6 +102,12 @@ | ||
102 | <Unit filename="src/dialogs/settings.c"> | 102 | <Unit filename="src/dialogs/settings.c"> |
103 | <Option compilerVar="CC" /> | 103 | <Option compilerVar="CC" /> |
104 | </Unit> | 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 | <Unit filename="src/dialogs/togglebutton.c"> | 111 | <Unit filename="src/dialogs/togglebutton.c"> |
106 | <Option compilerVar="CC" /> | 112 | <Option compilerVar="CC" /> |
107 | </Unit> | 113 | </Unit> |