Commit 9bb3294a9b31e4a9772f88d21f579f2164a1c534

Authored by Perry Werneck
1 parent 11b02b6b
Exists in master and in 1 other branch develop

Color scheme widget is now a v3270_settings widget.

src/dialogs/colors.c
... ... @@ -29,6 +29,8 @@
29 29  
30 30 #include "private.h"
31 31 #include <v3270/colorscheme.h>
  32 + #include <v3270/settings.h>
  33 + #include <v3270/dialogs.h>
32 34 #include <lib3270/log.h>
33 35  
34 36 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
... ... @@ -37,15 +39,14 @@
37 39  
38 40 struct _V3270ColorSelectionClass
39 41 {
40   - GtkGridClass parent_class;
  42 + V3270SettingsClass parent_class;
41 43  
42 44 };
43 45  
44 46 struct _V3270ColorSelection
45 47 {
46   - GtkGrid parent;
  48 + V3270Settings parent;
47 49  
48   - GtkWidget * terminal;
49 50 int selected;
50 51  
51 52 struct {
... ... @@ -64,16 +65,10 @@
64 65  
65 66 };
66 67  
67   - G_DEFINE_TYPE(V3270ColorSelection, V3270ColorSelection, GTK_TYPE_GRID);
  68 + G_DEFINE_TYPE(V3270ColorSelection, V3270ColorSelection, GTK_TYPE_V3270_SETTINGS);
68 69  
69 70 /*--[ Implement ]------------------------------------------------------------------------------------*/
70 71  
71   - static void V3270ColorSelection_class_init(G_GNUC_UNUSED V3270ColorSelectionClass *klass)
72   - {
73   -
74   -
75   - }
76   -
77 72 static void update_color_chooser(V3270ColorSelection *widget, int id)
78 73 {
79 74 widget->selected = id;
... ... @@ -88,7 +83,7 @@
88 83 return;
89 84 }
90 85  
91   - GdkRGBA * clr = v3270_get_color(widget->terminal,id);
  86 + GdkRGBA * clr = v3270_get_color(GTK_V3270_SETTINGS(widget)->terminal,id);
92 87  
93 88 #if USE_GTK_COLOR_CHOOSER
94 89 {
... ... @@ -111,39 +106,135 @@
111 106 gtk_widget_set_sensitive(widget->colors.editor,TRUE);
112 107 #endif // GTK_CHECK_VERSION
113 108  
114   - }
  109 +}
115 110  
116   - static void color_scheme_changed(GtkWidget G_GNUC_UNUSED(*dunno), const GdkRGBA *colors, V3270ColorSelection *widget) {
  111 +static void cancel(GtkWidget *widget, GtkWidget *terminal)
  112 +{
  113 + debug("V3270ColorSelection::%s",__FUNCTION__);
117 114  
118   - debug("%s=%p",__FUNCTION__,colors);
  115 + V3270ColorSelection * sel = GTK_V3270_COLOR_SELECTION(widget);
119 116  
120 117 int f;
121 118 for(f=0;f<V3270_COLOR_COUNT;f++)
122   - v3270_set_color(widget->terminal,f,colors+f);
  119 + v3270_set_color(terminal,f,sel->saved+f);
123 120  
124   - update_color_chooser(widget,widget->selected);
  121 + update_color_chooser(sel,sel->selected);
125 122  
126   - v3270_reload(widget->terminal);
127   - gtk_widget_queue_draw(widget->terminal);
  123 + v3270_reload(terminal);
  124 + gtk_widget_queue_draw(terminal);
128 125  
129   - }
  126 +}
  127 +
  128 +static void load(GtkWidget G_GNUC_UNUSED(*w), GtkWidget *terminal)
  129 +{
  130 + debug("V3270ColorSelection::%s",__FUNCTION__);
  131 +
  132 + V3270ColorSelection * widget = GTK_V3270_COLOR_SELECTION(w);
  133 +
  134 + // Load colors
  135 + {
  136 + static const struct _node
  137 + {
  138 + int id;
  139 + const char *text;
  140 + } node[] =
  141 + {
  142 + { V3270_COLOR_BACKGROUND, N_( "Terminal colors" ) },
  143 + { V3270_COLOR_FIELD, N_( "Field colors" ) },
  144 + { V3270_COLOR_SELECTED_BG, N_( "Misc colors" ) },
  145 + };
  146 +
  147 + static const gchar *color_name[V3270_COLOR_COUNT] =
  148 + {
  149 + N_( "Background" ), // V3270_COLOR_BACKGROUND
  150 + N_( "Blue" ), // V3270_COLOR_BLUE
  151 + N_( "Red" ), // V3270_COLOR_RED
  152 + N_( "Pink" ), // V3270_COLOR_PINK
  153 + N_( "Green" ), // V3270_COLOR_GREEN
  154 + N_( "Turquoise" ), // V3270_COLOR_TURQUOISE
  155 + N_( "Yellow" ), // V3270_COLOR_YELLOW
  156 + N_( "White" ), // V3270_COLOR_WHITE
  157 + N_( "Black" ), // V3270_COLOR_BLACK
  158 + N_( "Dark Blue" ), // V3270_COLOR_DARK_BLUE
  159 + N_( "Orange" ), // V3270_COLOR_ORANGE
  160 + N_( "Purple" ), // V3270_COLOR_PURPLE
  161 + N_( "Dark Green" ), // V3270_COLOR_DARK_GREEN
  162 + N_( "Dark Turquoise" ), // V3270_COLOR_DARK_TURQUOISE
  163 + N_( "Mustard" ), // V3270_COLOR_MUSTARD
  164 + N_( "Gray" ), // V3270_COLOR_GRAY
  165 +
  166 + N_( "Normal/Unprotected" ), // V3270_COLOR_FIELD
  167 + N_( "Intensified/Unprotected" ), // V3270_COLOR_FIELD_INTENSIFIED
  168 + N_( "Normal/Protected" ), // V3270_COLOR_FIELD_PROTECTED
  169 + N_( "Intensified/Protected" ), // V3270_COLOR_FIELD_PROTECTED_INTENSIFIED
  170 +
  171 + N_( "Selection background" ), // TERMINAL_COLOR_SELECTED_BG
  172 + N_( "Selection foreground" ), // TERMINAL_COLOR_SELECTED_FG
  173 +
  174 + N_( "Cross hair cursor" ), // TERMINAL_COLOR_CROSS_HAIR
  175 +
  176 + // Oia Colors
  177 + N_( "OIA background" ), // TERMINAL_COLOR_OIA_BACKGROUND
  178 + N_( "OIA foreground" ), // TERMINAL_COLOR_OIA_FOREGROUND
  179 + N_( "OIA separator" ), // TERMINAL_COLOR_OIA_SEPARATOR
  180 + N_( "OIA status ok" ), // TERMINAL_COLOR_OIA_STATUS_OK
  181 + N_( "OIA Warning" ), // V3270_COLOR_OIA_STATUS_WARNING
  182 + N_( "OIA status invalid" ), // TERMINAL_COLOR_OIA_STATUS_INVALID
  183 +
  184 + };
  185 +
  186 + GtkTreeIter iter;
  187 + GtkTreeIter parent;
  188 + int title = 0;
  189 + int f;
  190 +
  191 + gtk_tree_store_append(GTK_TREE_STORE(widget->colors.list),&parent,NULL);
  192 + gtk_tree_store_set(GTK_TREE_STORE(widget->colors.list), &parent, 0, gettext(node[title++].text), 1, V3270_COLOR_COUNT, -1);
  193 +
  194 + for(f=0;f<V3270_COLOR_COUNT;f++)
  195 + {
  196 + widget->saved[f] = *(v3270_get_color(terminal,f));
  197 +
  198 + if(f == node[title].id)
  199 + {
  200 + gtk_tree_store_append(GTK_TREE_STORE(widget->colors.list),&parent,NULL);
  201 + gtk_tree_store_set(GTK_TREE_STORE(widget->colors.list), &parent, 0, gettext(node[title++].text), 1, V3270_COLOR_COUNT, -1);
  202 + }
  203 + gtk_tree_store_append(GTK_TREE_STORE(widget->colors.list),&iter,&parent);
  204 + gtk_tree_store_set(GTK_TREE_STORE(widget->colors.list), &iter, 0, gettext(color_name[f]), 1, f, -1);
  205 + }
  206 +
  207 + gtk_tree_view_expand_all(GTK_TREE_VIEW(widget->colors.view));
  208 +
  209 + }
  210 +
  211 + v3270_color_scheme_set_rgba(widget->colors.scheme,v3270_get_color_table(terminal));
130 212  
131   - LIB3270_EXPORT void v3270_color_selection_reset(GtkWidget *widget)
  213 +}
  214 +
  215 + static void V3270ColorSelection_class_init(G_GNUC_UNUSED V3270ColorSelectionClass *klass)
132 216 {
133   - V3270ColorSelection * sel = GTK_V3270_COLOR_SELECTION(widget);
  217 + GTK_V3270_SETTINGS_CLASS(klass)->load = load;
  218 + GTK_V3270_SETTINGS_CLASS(klass)->cancel = cancel;
  219 + }
  220 +
  221 + static void color_scheme_changed(GtkWidget G_GNUC_UNUSED(*dunno), const GdkRGBA *colors, V3270ColorSelection *widget) {
  222 +
  223 + GtkWidget * terminal = GTK_V3270_SETTINGS(widget)->terminal;
134 224  
135 225 int f;
136 226 for(f=0;f<V3270_COLOR_COUNT;f++)
137   - v3270_set_color(sel->terminal,f,sel->saved+f);
  227 + v3270_set_color(terminal,f,colors+f);
138 228  
139   - update_color_chooser(sel,sel->selected);
  229 + update_color_chooser(widget,widget->selected);
140 230  
141   - v3270_reload(sel->terminal);
142   - gtk_widget_queue_draw(sel->terminal);
  231 + v3270_reload(terminal);
  232 + gtk_widget_queue_draw(terminal);
143 233  
144 234 }
145 235  
146 236  
  237 +
147 238 #if USE_GTK_COLOR_CHOOSER
148 239 static void color_activated(GtkColorChooser *chooser, GdkRGBA *clr, V3270ColorSelection *widget)
149 240 {
... ... @@ -162,16 +253,17 @@
162 253 static void color_changed(GtkWidget *colorselection, V3270ColorSelection *widget)
163 254 {
164 255 GdkRGBA clr;
  256 + GtkWidget * terminal = GTK_V3270_SETTINGS(widget)->terminal;
165 257  
166 258 if(widget->selected < 0 || widget->selected >= V3270_COLOR_COUNT)
167 259 return;
168 260  
169 261 gtk_color_selection_get_current_rgba(GTK_COLOR_SELECTION(colorselection),&clr);
170 262  
171   - v3270_set_color(widget->terminal,widget->selected,&clr);
172   - v3270_reload(widget->terminal);
173   - v3270_color_scheme_set_rgba(widget->colors.scheme,v3270_get_color_table(widget->terminal));
174   - gtk_widget_queue_draw(widget->terminal);
  263 + v3270_set_color(terminal,widget->selected,&clr);
  264 + v3270_reload(terminal);
  265 + v3270_color_scheme_set_rgba(widget->colors.scheme,v3270_get_color_table(terminal));
  266 + gtk_widget_queue_draw(terminal);
175 267  
176 268 }
177 269 #endif // GTK_CHECK_VERSION
... ... @@ -195,10 +287,6 @@
195 287  
196 288 static void V3270ColorSelection_init(V3270ColorSelection *widget)
197 289 {
198   - // https://developer.gnome.org/hig/stable/visual-layout.html.en
199   - gtk_grid_set_row_spacing(GTK_GRID(widget),6);
200   - gtk_grid_set_column_spacing(GTK_GRID(widget),12);
201   -
202 290 {
203 291 // Create colors list view.
204 292 widget->colors.list = (GtkTreeModel *) gtk_tree_store_new(2,G_TYPE_STRING,G_TYPE_INT);
... ... @@ -265,94 +353,21 @@
265 353  
266 354 }
267 355  
268   - LIB3270_EXPORT GtkWidget * v3270_color_selection_new(GtkWidget *terminal)
  356 + LIB3270_EXPORT GtkWidget * v3270_color_selection_new()
269 357 {
270   - g_return_val_if_fail(GTK_IS_V3270(terminal),NULL);
271   -
272   - V3270ColorSelection * widget = GTK_V3270_COLOR_SELECTION(g_object_new(GTK_TYPE_V3270_COLOR_SELECTION, NULL));
273   -
274   - widget->terminal = terminal;
275   -
276   - // Load colors
277   - {
278   - static const struct _node
279   - {
280   - int id;
281   - const char *text;
282   - } node[] =
283   - {
284   - { V3270_COLOR_BACKGROUND, N_( "Terminal colors" ) },
285   - { V3270_COLOR_FIELD, N_( "Field colors" ) },
286   - { V3270_COLOR_SELECTED_BG, N_( "Misc colors" ) },
287   - };
288   -
289   - static const gchar *color_name[V3270_COLOR_COUNT] =
290   - {
291   - N_( "Background" ), // V3270_COLOR_BACKGROUND
292   - N_( "Blue" ), // V3270_COLOR_BLUE
293   - N_( "Red" ), // V3270_COLOR_RED
294   - N_( "Pink" ), // V3270_COLOR_PINK
295   - N_( "Green" ), // V3270_COLOR_GREEN
296   - N_( "Turquoise" ), // V3270_COLOR_TURQUOISE
297   - N_( "Yellow" ), // V3270_COLOR_YELLOW
298   - N_( "White" ), // V3270_COLOR_WHITE
299   - N_( "Black" ), // V3270_COLOR_BLACK
300   - N_( "Dark Blue" ), // V3270_COLOR_DARK_BLUE
301   - N_( "Orange" ), // V3270_COLOR_ORANGE
302   - N_( "Purple" ), // V3270_COLOR_PURPLE
303   - N_( "Dark Green" ), // V3270_COLOR_DARK_GREEN
304   - N_( "Dark Turquoise" ), // V3270_COLOR_DARK_TURQUOISE
305   - N_( "Mustard" ), // V3270_COLOR_MUSTARD
306   - N_( "Gray" ), // V3270_COLOR_GRAY
307   -
308   - N_( "Normal/Unprotected" ), // V3270_COLOR_FIELD
309   - N_( "Intensified/Unprotected" ), // V3270_COLOR_FIELD_INTENSIFIED
310   - N_( "Normal/Protected" ), // V3270_COLOR_FIELD_PROTECTED
311   - N_( "Intensified/Protected" ), // V3270_COLOR_FIELD_PROTECTED_INTENSIFIED
312   -
313   - N_( "Selection background" ), // TERMINAL_COLOR_SELECTED_BG
314   - N_( "Selection foreground" ), // TERMINAL_COLOR_SELECTED_FG
315   -
316   - N_( "Cross hair cursor" ), // TERMINAL_COLOR_CROSS_HAIR
317   -
318   - // Oia Colors
319   - N_( "OIA background" ), // TERMINAL_COLOR_OIA_BACKGROUND
320   - N_( "OIA foreground" ), // TERMINAL_COLOR_OIA_FOREGROUND
321   - N_( "OIA separator" ), // TERMINAL_COLOR_OIA_SEPARATOR
322   - N_( "OIA status ok" ), // TERMINAL_COLOR_OIA_STATUS_OK
323   - N_( "OIA Warning" ), // V3270_COLOR_OIA_STATUS_WARNING
324   - N_( "OIA status invalid" ), // TERMINAL_COLOR_OIA_STATUS_INVALID
325   -
326   - };
327   -
328   - GtkTreeIter iter;
329   - GtkTreeIter parent;
330   - int title = 0;
331   - int f;
332   -
333   - gtk_tree_store_append(GTK_TREE_STORE(widget->colors.list),&parent,NULL);
334   - gtk_tree_store_set(GTK_TREE_STORE(widget->colors.list), &parent, 0, gettext(node[title++].text), 1, V3270_COLOR_COUNT, -1);
335   -
336   - for(f=0;f<V3270_COLOR_COUNT;f++)
337   - {
338   - widget->saved[f] = *(v3270_get_color(terminal,f));
  358 + return GTK_WIDGET(g_object_new(GTK_TYPE_V3270_COLOR_SELECTION, NULL));
  359 + }
339 360  
340   - if(f == node[title].id)
341   - {
342   - gtk_tree_store_append(GTK_TREE_STORE(widget->colors.list),&parent,NULL);
343   - gtk_tree_store_set(GTK_TREE_STORE(widget->colors.list), &parent, 0, gettext(node[title++].text), 1, V3270_COLOR_COUNT, -1);
344   - }
345   - gtk_tree_store_append(GTK_TREE_STORE(widget->colors.list),&iter,&parent);
346   - gtk_tree_store_set(GTK_TREE_STORE(widget->colors.list), &iter, 0, gettext(color_name[f]), 1, f, -1);
347   - }
  361 + LIB3270_EXPORT void v3270_edit_color_table(GtkWidget *terminal)
  362 + {
  363 + g_return_if_fail(GTK_IS_V3270(terminal));
348 364  
349   - gtk_tree_view_expand_all(GTK_TREE_VIEW(widget->colors.view));
  365 + GtkWidget * dialog = v3270_settings_dialog_new(terminal, v3270_color_selection_new());
350 366  
351   - }
  367 + v3270_dialog_setup(dialog,_("Color setup"),_("_Save"));
352 368  
353   - v3270_color_scheme_set_rgba(widget->colors.scheme,v3270_get_color_table(terminal));
  369 + gtk_widget_show_all(dialog);
  370 + gtk_dialog_run(GTK_DIALOG(dialog));
  371 + gtk_widget_destroy(dialog);
354 372  
355   - gtk_widget_show_all(GTK_WIDGET(widget));
356   - return GTK_WIDGET(widget);
357 373 }
358   -
... ...
src/dialogs/print/settingsdialog.c 0 → 100644
... ... @@ -0,0 +1,503 @@
  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 +/**
  31 + * SECTION:V3270FTSettingsDialog
  32 + * @Short_description: A dialog for define/edit file transfer.
  33 + * @Title: V3270FTSettingsDialog
  34 + *
  35 + * The #V3270FTSettingsDialog is a complete dialog box for managing a V3270
  36 + * file transfer queue.
  37 + *
  38 + */
  39 +
  40 + #include <internals.h>
  41 + #include <v3270/filetransfer.h>
  42 + #include "private.h"
  43 +
  44 +/*--[ Widget definition ]----------------------------------------------------------------------------*/
  45 +
  46 + struct _V3270FTSettingsDialog
  47 + {
  48 + GtkDialog parent;
  49 +
  50 + GtkWidget * settings;
  51 +
  52 + H3270 * hSession;
  53 + const void * stHandle;
  54 +
  55 + struct
  56 + {
  57 + GtkWidget * insert;
  58 + GtkWidget * update;
  59 + GtkWidget * remove;
  60 + GtkWidget * reset;
  61 + GtkWidget * begin;
  62 + } button;
  63 +
  64 + struct
  65 + {
  66 + GtkWidget * view;
  67 + GtkWidget * load;
  68 + GtkWidget * save;
  69 + GtkWidget * saveAs;
  70 + } queue;
  71 +
  72 + };
  73 +
  74 + struct _V3270FTSettingsDialogClass
  75 + {
  76 + GtkDialogClass parent_class;
  77 + };
  78 +
  79 + G_DEFINE_TYPE(V3270FTSettingsDialog, V3270FTSettingsDialog, GTK_TYPE_DIALOG);
  80 +
  81 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  82 +
  83 +static void finalize(GObject *object)
  84 +{
  85 + debug("%s",__FUNCTION__);
  86 +
  87 + V3270FTSettingsDialog * dialog = GTK_V3270_FT_DIALOG(object);
  88 +
  89 + if(dialog->hSession && dialog->stHandle)
  90 + {
  91 + lib3270_unregister_schange(dialog->hSession,LIB3270_STATE_CONNECT,dialog->stHandle);
  92 + dialog->stHandle = NULL;
  93 + }
  94 +
  95 + G_OBJECT_CLASS(V3270FTSettingsDialog_parent_class)->finalize(object);
  96 +}
  97 +
  98 +static void V3270FTSettingsDialog_class_init(G_GNUC_UNUSED V3270FTSettingsDialogClass *klass)
  99 +{
  100 + G_OBJECT_CLASS(klass)->finalize = finalize;
  101 +}
  102 +
  103 +void activity_selected(GtkWidget G_GNUC_UNUSED(*view), GObject * activity, V3270FTSettingsDialog *widget)
  104 +{
  105 + debug("%s(widget=%p activity=%p",__FUNCTION__,widget,activity);
  106 +
  107 + v3270_ft_settings_set_activity(widget->settings,activity);
  108 +
  109 + if(activity)
  110 + {
  111 + gtk_widget_set_sensitive(widget->button.update,TRUE);
  112 + gtk_widget_set_sensitive(widget->button.remove,TRUE);
  113 + gtk_widget_set_sensitive(widget->button.reset,TRUE);
  114 + }
  115 + else
  116 + {
  117 + gtk_widget_set_sensitive(widget->button.update,FALSE);
  118 + gtk_widget_set_sensitive(widget->button.remove,FALSE);
  119 + gtk_widget_set_sensitive(widget->button.reset,FALSE);
  120 + }
  121 +
  122 +
  123 +}
  124 +
  125 +static void validity_changed(GtkWidget G_GNUC_UNUSED(*settings), gboolean valid, V3270FTSettingsDialog *widget)
  126 +{
  127 + debug("The file transfer settings are now %s",valid ? "valid" : "invalid");
  128 + gtk_widget_set_sensitive(widget->button.insert,valid);
  129 + gtk_widget_set_sensitive(widget->button.update,valid);
  130 +}
  131 +
  132 +static void has_activity_changed(GtkWidget G_GNUC_UNUSED(*settings), gboolean have_activity, V3270FTSettingsDialog *widget)
  133 +{
  134 + gtk_widget_set_sensitive(widget->button.reset,have_activity);
  135 + gtk_widget_set_sensitive(widget->button.update,have_activity);
  136 + gtk_widget_set_sensitive(widget->button.remove,have_activity);
  137 +}
  138 +
  139 +static void reset_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
  140 +{
  141 + v3270_ft_settings_reset(widget->settings);
  142 +}
  143 +
  144 +static void update_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
  145 +{
  146 + v3270_ft_settings_update(widget->settings);
  147 + gtk_tree_view_columns_autosize(GTK_TREE_VIEW(widget->queue.view));
  148 +}
  149 +
  150 +static void load_queue_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
  151 +{
  152 + v3270_activity_list_load(widget->queue.view);
  153 +}
  154 +
  155 +static void save_queue_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
  156 +{
  157 + debug("%s",__FUNCTION__);
  158 + v3270_activity_list_save(widget->queue.view);
  159 +}
  160 +
  161 +static void save_queue_as_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
  162 +{
  163 + v3270_activity_list_save_as(widget->queue.view);
  164 +}
  165 +
  166 +static void begin_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
  167 +{
  168 + gtk_dialog_response(GTK_DIALOG(widget),GTK_RESPONSE_ACCEPT);
  169 +}
  170 +
  171 +static gboolean v3270_activity_compare_filenames(const GObject *a, const GObject *b)
  172 +{
  173 + if(strcmp(v3270_ft_activity_get_local_filename(a),v3270_ft_activity_get_local_filename(b)))
  174 + return FALSE;
  175 +
  176 + if(strcmp(v3270_ft_activity_get_remote_filename(a),v3270_ft_activity_get_remote_filename(b)))
  177 + return FALSE;
  178 +
  179 + return TRUE;
  180 +}
  181 +
  182 +int v3270_ft_settings_dialog_append_activity(GtkWidget *widget, GObject *activity, GError **error)
  183 +{
  184 + V3270FTSettingsDialog *dialog = GTK_V3270_FT_DIALOG(widget);
  185 +
  186 + GtkTreeIter iter;
  187 + GtkTreeModel * model = gtk_tree_view_get_model(GTK_TREE_VIEW(dialog->queue.view));
  188 +
  189 + if(gtk_tree_model_get_iter_first(model,&iter))
  190 + {
  191 + do
  192 + {
  193 + GObject * a = NULL;
  194 + gtk_tree_model_get(model, &iter, 0, &a, -1);
  195 +
  196 + if(a && v3270_activity_compare_filenames(activity, a))
  197 + {
  198 + // Activity already exist
  199 + if(error && !*error)
  200 + *error = g_error_new_literal(g_quark_from_static_string(PACKAGE_NAME),EPERM,_("Activity already on the queue"));
  201 +
  202 + return -1;
  203 + }
  204 +
  205 + }
  206 + while(gtk_tree_model_iter_next(model,&iter));
  207 + }
  208 +
  209 + // Not found, insert it.
  210 + v3270_activity_list_append(dialog->queue.view,activity,FALSE);
  211 +
  212 + return 0;
  213 +}
  214 +
  215 +static void insert_clicked(GtkWidget *button, V3270FTSettingsDialog *widget)
  216 +{
  217 + GtkTreeIter iter;
  218 + GtkTreeModel * model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget->queue.view));
  219 +
  220 + if(gtk_tree_model_get_iter_first(model,&iter))
  221 + {
  222 + do
  223 + {
  224 + GObject * activity = NULL;
  225 + gtk_tree_model_get(model, &iter, 0, &activity, -1);
  226 +
  227 + if(activity && v3270_ft_settings_equals(widget->settings,activity))
  228 + {
  229 + // Activity already exist
  230 + GtkWidget * dialog =
  231 + gtk_message_dialog_new(
  232 + GTK_WINDOW(gtk_widget_get_toplevel(button)),
  233 + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
  234 + GTK_MESSAGE_ERROR,
  235 + GTK_BUTTONS_CLOSE,
  236 + _("Activity already on the queue")
  237 + );
  238 +
  239 + gtk_message_dialog_format_secondary_text(
  240 + GTK_MESSAGE_DIALOG(dialog),
  241 + _( "You can't add more than one acitivity with the same files.")
  242 + );
  243 +
  244 + gtk_window_set_title(GTK_WINDOW(dialog),_("Can't add activity"));
  245 +
  246 + gtk_dialog_run(GTK_DIALOG(dialog));
  247 + gtk_widget_destroy(dialog);
  248 +
  249 + return;
  250 + }
  251 +
  252 + }
  253 + while(gtk_tree_model_iter_next(model,&iter));
  254 + }
  255 +
  256 + // Not found, insert it.
  257 + v3270_activity_list_append(widget->queue.view,v3270_ft_settings_create_activity(widget->settings),FALSE);
  258 +
  259 +}
  260 +
  261 +static void remove_clicked(GtkWidget G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
  262 +{
  263 + v3270_activity_list_remove(widget->queue.view,v3270_ft_settings_get_activity(widget->settings));
  264 + v3270_ft_settings_set_activity(widget->settings,NULL);
  265 +}
  266 +
  267 +static void enable_queue_save(GtkWidget G_GNUC_UNUSED(*save), gboolean enabled, V3270FTSettingsDialog *widget)
  268 +{
  269 + debug("%s: %s",__FUNCTION__,(enabled ? "Enable" : "Disable"));
  270 + gtk_widget_set_sensitive(widget->queue.save,enabled);
  271 +}
  272 +
  273 +static void V3270FTSettingsDialog_init(V3270FTSettingsDialog *widget)
  274 +{
  275 + widget->settings = v3270_ft_settings_new();
  276 + g_signal_connect(G_OBJECT(widget->settings),"validity",G_CALLBACK(validity_changed),widget);
  277 + g_signal_connect(G_OBJECT(widget->settings),"has-activity",G_CALLBACK(has_activity_changed),widget);
  278 +
  279 +#if GTK_CHECK_VERSION(3,12,0)
  280 + // Does the dialog have header bar?
  281 + GtkHeaderBar * header = v3270_dialog_get_header_bar(GTK_WIDGET(widget));
  282 +
  283 + if(header)
  284 + gtk_header_bar_set_title(header,_( "3270 File transfer"));
  285 + else
  286 + gtk_window_set_title(GTK_WINDOW(widget),_( "3270 File transfer"));
  287 +#else
  288 + gtk_window_set_title(GTK_WINDOW(widget),_( "3270 File transfer"));
  289 +#endif // GTK 3.12
  290 +
  291 + // https://developer.gnome.org/hig/stable/visual-layout.html.en
  292 + gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(widget))),18);
  293 +
  294 + // Create box
  295 + GtkWidget * container = gtk_box_new(GTK_ORIENTATION_VERTICAL,6);
  296 + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(widget))),container,TRUE,TRUE,0);
  297 +
  298 + // Pack settings widget
  299 + gtk_widget_set_halign(GTK_WIDGET(widget->settings),GTK_ALIGN_START);
  300 + gtk_widget_set_hexpand(GTK_WIDGET(widget->settings),FALSE);
  301 + gtk_widget_set_vexpand(GTK_WIDGET(widget->settings),FALSE);
  302 + gtk_box_pack_start(GTK_BOX(container),widget->settings,FALSE,FALSE,0);
  303 +
  304 + // Create action buttons
  305 + {
  306 + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,6);
  307 +
  308 + g_object_set(G_OBJECT(box),"margin-top",6,NULL);
  309 + g_object_set(G_OBJECT(box),"margin-end",6,NULL);
  310 +
  311 + widget->button.reset = v3270_box_pack_end(box,gtk_button_new_with_mnemonic("_Reset"),FALSE,FALSE,0);
  312 + g_signal_connect(widget->button.reset,"clicked",G_CALLBACK(reset_clicked),widget);
  313 +
  314 + widget->button.update = v3270_box_pack_end(box,gtk_button_new_with_mnemonic("_Update"),FALSE,FALSE,0);
  315 + g_signal_connect(widget->button.update,"clicked",G_CALLBACK(update_clicked),widget);
  316 +
  317 + widget->button.remove = v3270_box_pack_end(box,gtk_button_new_with_mnemonic("_Delete"),FALSE,FALSE,0);
  318 + g_signal_connect(widget->button.remove,"clicked",G_CALLBACK(remove_clicked),widget);
  319 +
  320 + widget->button.insert = v3270_box_pack_end(box,gtk_button_new_with_mnemonic("_Insert"),FALSE,FALSE,0);
  321 + g_signal_connect(widget->button.insert,"clicked",G_CALLBACK(insert_clicked),widget);
  322 +
  323 + gtk_widget_set_sensitive(widget->button.update,FALSE);
  324 + gtk_widget_set_sensitive(widget->button.remove,FALSE);
  325 + gtk_widget_set_sensitive(widget->button.insert,FALSE);
  326 + gtk_widget_set_sensitive(widget->button.reset,FALSE);
  327 +
  328 + gtk_box_pack_start(GTK_BOX(container),box,FALSE,FALSE,0);
  329 +
  330 + }
  331 +
  332 + // Create Transfer queue buttons
  333 + {
  334 +#if GTK_CHECK_VERSION(3,10,0)
  335 + // https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html
  336 + widget->queue.load = gtk_button_new_from_icon_name("document-open",GTK_ICON_SIZE_SMALL_TOOLBAR);
  337 + widget->queue.save = gtk_button_new_from_icon_name("document-save",GTK_ICON_SIZE_SMALL_TOOLBAR);
  338 + widget->queue.saveAs = gtk_button_new_from_icon_name("document-save-as",GTK_ICON_SIZE_SMALL_TOOLBAR);
  339 +#else
  340 + // https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html
  341 + widget->queue.load = gtk_button_new_from_stock(GTK_STOCK_OPEN);
  342 + widget->queue.save = gtk_button_new_from_stock(GTK_STOCK_SAVE);
  343 + widget->queue.saveAs = gtk_button_new_from_stock(GTK_STOCK_SAVE_AS);
  344 +#endif // GTK_CHECK_VERSION
  345 +
  346 + gtk_widget_set_tooltip_markup(widget->queue.load,_("Get transfer queue from file"));
  347 + g_signal_connect(widget->queue.load,"clicked",G_CALLBACK(load_queue_clicked),widget);
  348 +
  349 + gtk_widget_set_tooltip_markup(widget->queue.save,_("Save transfer queue"));
  350 + g_signal_connect(widget->queue.save,"clicked",G_CALLBACK(save_queue_clicked),widget);
  351 + gtk_widget_set_sensitive(widget->queue.save,FALSE);
  352 +
  353 + gtk_widget_set_tooltip_markup(widget->queue.saveAs,_("Save transfer queue to file"));
  354 + g_signal_connect(widget->queue.saveAs,"clicked",G_CALLBACK(save_queue_as_clicked),widget);
  355 +
  356 + }
  357 +
  358 + // Create file list view
  359 + {
  360 + widget->queue.view = v3270_activity_list_new();
  361 + gtk_widget_set_tooltip_markup(widget->queue.view,_("Files to transfer"));
  362 + g_signal_connect(G_OBJECT(widget->queue.view),"has-file",G_CALLBACK(enable_queue_save),widget);
  363 + g_signal_connect(G_OBJECT(widget->queue.view),"changed",G_CALLBACK(activity_selected),widget);
  364 +
  365 + // Put the view inside a scrolled window.
  366 + GtkWidget * scrolled = gtk_scrolled_window_new(NULL,NULL);
  367 + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
  368 + gtk_container_add(GTK_CONTAINER(scrolled),widget->queue.view);
  369 + gtk_widget_set_size_request(scrolled,50,150);
  370 +
  371 + gtk_widget_set_vexpand(scrolled,TRUE);
  372 + gtk_widget_set_hexpand(scrolled,TRUE);
  373 +
  374 +#if GTK_CHECK_VERSION(3,12,0)
  375 + if(header)
  376 + {
  377 + debug("Dialog %s header bar","have");
  378 +
  379 + GtkWidget * frame = v3270_dialog_create_frame(scrolled,_("Transfer queue"));
  380 + gtk_box_pack_start(GTK_BOX(container),frame,TRUE,TRUE,0);
  381 +
  382 + widget->button.begin = gtk_button_new_from_icon_name("network-transmit",GTK_ICON_SIZE_SMALL_TOOLBAR);
  383 +
  384 + g_object_set(G_OBJECT(widget->button.begin),"margin-end",12,NULL);
  385 + g_signal_connect(widget->button.begin,"clicked",G_CALLBACK(begin_clicked),widget);
  386 +
  387 + gtk_header_bar_pack_start(header,widget->button.begin);
  388 + gtk_header_bar_pack_start(header,widget->queue.load);
  389 + gtk_header_bar_pack_start(header,widget->queue.save);
  390 + gtk_header_bar_pack_start(header,widget->queue.saveAs);
  391 +
  392 + }
  393 + else
  394 + {
  395 + debug("Dialog %s header bar","don't have");
  396 +
  397 + GtkWidget * hBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,6);
  398 + GtkWidget * frame = v3270_dialog_create_frame(hBox,_("Transfer queue"));
  399 + gtk_box_pack_start(GTK_BOX(container),frame,TRUE,TRUE,0);
  400 +
  401 + GtkBox * box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL,6));
  402 + gtk_box_pack_start(GTK_BOX(hBox),GTK_WIDGET(box),FALSE,FALSE,0);
  403 +
  404 + gtk_box_pack_start(box,widget->queue.load,FALSE,FALSE,0);
  405 + gtk_box_pack_start(box,widget->queue.save,FALSE,FALSE,0);
  406 + gtk_box_pack_start(box,widget->queue.saveAs,FALSE,FALSE,0);
  407 +
  408 + gtk_box_pack_start(GTK_BOX(hBox),GTK_WIDGET(scrolled),TRUE,TRUE,0);
  409 +
  410 + gtk_dialog_add_button(GTK_DIALOG (widget),_("_Cancel"),GTK_RESPONSE_CANCEL);
  411 + widget->button.begin = gtk_dialog_add_button(GTK_DIALOG (widget),_("B_egin transfer"),GTK_RESPONSE_ACCEPT);
  412 +
  413 + }
  414 +#else
  415 +
  416 + GtkWidget * hBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,6);
  417 + GtkWidget * frame = v3270_dialog_create_frame(hBox,_("Transfer queue"));
  418 + gtk_box_pack_start(GTK_BOX(container),frame,TRUE,TRUE,0);
  419 +
  420 + GtkBox * box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL,6));
  421 + gtk_box_pack_start(GTK_BOX(hBox),GTK_WIDGET(box),FALSE,FALSE,0);
  422 +
  423 + gtk_box_pack_start(box,widget->queue.load,FALSE,FALSE,0);
  424 + gtk_box_pack_start(box,widget->queue.save,FALSE,FALSE,0);
  425 + gtk_box_pack_start(box,widget->queue.saveAs,FALSE,FALSE,0);
  426 +
  427 + gtk_box_pack_start(GTK_BOX(hBox),GTK_WIDGET(scrolled),TRUE,TRUE,0);
  428 +
  429 + gtk_dialog_add_button(GTK_DIALOG (widget),_("_Cancel"),GTK_RESPONSE_CANCEL);
  430 + widget->button.begin = gtk_dialog_add_button(GTK_DIALOG (widget),_("B_egin transfer"),GTK_RESPONSE_ACCEPT);
  431 +
  432 +#endif // GTK_CHECK_VERSION(3,12,0)
  433 +
  434 + // gtk_widget_set_sensitive(widget->button.begin,FALSE);
  435 + gtk_widget_set_tooltip_markup(widget->button.begin,_("Start transfer"));
  436 + gtk_widget_set_sensitive(widget->button.begin,FALSE);
  437 +
  438 +/*
  439 +#ifdef DEBUG
  440 + GObject * activity = v3270_ft_activity_new();
  441 +
  442 + v3270_ft_activity_set_local_filename(activity,"local---");
  443 + v3270_ft_activity_set_remote_filename(activity,"remote---");
  444 + v3270_ft_activity_set_options(activity,LIB3270_FT_OPTION_SEND|LIB3270_FT_OPTION_ASCII|LIB3270_FT_OPTION_CRLF|LIB3270_FT_OPTION_REMAP|LIB3270_FT_OPTION_APPEND|LIB3270_FT_RECORD_FORMAT_VARIABLE);
  445 +
  446 + v3270_activity_list_append(widget->queue.view,activity,FALSE);
  447 +#endif // DEBUG
  448 +*/
  449 +
  450 + }
  451 +
  452 +
  453 +}
  454 +
  455 +LIB3270_EXPORT GtkWidget * v3270_ft_settings_dialog_new(GtkWidget *parent)
  456 +{
  457 + gboolean use_header;
  458 + g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL);
  459 +
  460 + GtkWidget * dialog =
  461 + GTK_WIDGET(g_object_new(
  462 + GTK_TYPE_V3270_FT_DIALOG,
  463 + "use-header-bar", (use_header ? 1 : 0),
  464 + NULL
  465 + ));
  466 +
  467 + if(parent)
  468 + {
  469 + gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gtk_widget_get_toplevel(parent)));
  470 + gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
  471 + gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE);
  472 + }
  473 +
  474 + if(GTK_IS_V3270(parent))
  475 + v3270_ft_settings_dialog_set_session(dialog,v3270_get_session(parent));
  476 +
  477 + return dialog;
  478 +}
  479 +
  480 +static void connect_changed(H3270 G_GNUC_UNUSED(*hSession), int state, void *widget)
  481 +{
  482 + V3270FTSettingsDialog * dialog = GTK_V3270_FT_DIALOG( ((GtkWidget *) widget) );
  483 + gtk_widget_set_sensitive(dialog->button.begin,state ? TRUE : FALSE);
  484 +}
  485 +
  486 +LIB3270_EXPORT void v3270_ft_settings_dialog_set_session(GtkWidget *widget, H3270 *hSession)
  487 +{
  488 + V3270FTSettingsDialog * dialog = GTK_V3270_FT_DIALOG(widget);
  489 +
  490 + if(dialog->hSession && dialog->stHandle)
  491 + {
  492 + lib3270_unregister_schange(dialog->hSession,LIB3270_STATE_CONNECT,dialog->stHandle);
  493 + dialog->stHandle = NULL;
  494 + }
  495 +
  496 + dialog->hSession = hSession;
  497 + dialog->stHandle = lib3270_register_schange(hSession,LIB3270_STATE_CONNECT,connect_changed,(void *) widget);
  498 +
  499 + gtk_widget_set_sensitive(dialog->button.begin,lib3270_is_connected(hSession) ? TRUE : FALSE);
  500 +
  501 + v3270_ft_settings_set_tso(dialog->settings,lib3270_is_tso(hSession));
  502 +
  503 +}
... ...
src/dialogs/settings.c
... ... @@ -142,7 +142,7 @@ LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWid
142 142 gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),18);
143 143  
144 144 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gtk_widget_get_toplevel(terminal)));
145   - gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
  145 + //gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
146 146 gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE);
147 147  
148 148 return dialog;
... ...
src/dialogs/settingsdialog.c
... ... @@ -1,503 +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   -/**
31   - * SECTION:V3270FTSettingsDialog
32   - * @Short_description: A dialog for define/edit file transfer.
33   - * @Title: V3270FTSettingsDialog
34   - *
35   - * The #V3270FTSettingsDialog is a complete dialog box for managing a V3270
36   - * file transfer queue.
37   - *
38   - */
39   -
40   - #include <internals.h>
41   - #include <v3270/filetransfer.h>
42   - #include "private.h"
43   -
44   -/*--[ Widget definition ]----------------------------------------------------------------------------*/
45   -
46   - struct _V3270FTSettingsDialog
47   - {
48   - GtkDialog parent;
49   -
50   - GtkWidget * settings;
51   -
52   - H3270 * hSession;
53   - const void * stHandle;
54   -
55   - struct
56   - {
57   - GtkWidget * insert;
58   - GtkWidget * update;
59   - GtkWidget * remove;
60   - GtkWidget * reset;
61   - GtkWidget * begin;
62   - } button;
63   -
64   - struct
65   - {
66   - GtkWidget * view;
67   - GtkWidget * load;
68   - GtkWidget * save;
69   - GtkWidget * saveAs;
70   - } queue;
71   -
72   - };
73   -
74   - struct _V3270FTSettingsDialogClass
75   - {
76   - GtkDialogClass parent_class;
77   - };
78   -
79   - G_DEFINE_TYPE(V3270FTSettingsDialog, V3270FTSettingsDialog, GTK_TYPE_DIALOG);
80   -
81   -/*--[ Implement ]------------------------------------------------------------------------------------*/
82   -
83   -static void finalize(GObject *object)
84   -{
85   - debug("%s",__FUNCTION__);
86   -
87   - V3270FTSettingsDialog * dialog = GTK_V3270_FT_DIALOG(object);
88   -
89   - if(dialog->hSession && dialog->stHandle)
90   - {
91   - lib3270_unregister_schange(dialog->hSession,LIB3270_STATE_CONNECT,dialog->stHandle);
92   - dialog->stHandle = NULL;
93   - }
94   -
95   - G_OBJECT_CLASS(V3270FTSettingsDialog_parent_class)->finalize(object);
96   -}
97   -
98   -static void V3270FTSettingsDialog_class_init(G_GNUC_UNUSED V3270FTSettingsDialogClass *klass)
99   -{
100   - G_OBJECT_CLASS(klass)->finalize = finalize;
101   -}
102   -
103   -void activity_selected(GtkWidget G_GNUC_UNUSED(*view), GObject * activity, V3270FTSettingsDialog *widget)
104   -{
105   - debug("%s(widget=%p activity=%p",__FUNCTION__,widget,activity);
106   -
107   - v3270_ft_settings_set_activity(widget->settings,activity);
108   -
109   - if(activity)
110   - {
111   - gtk_widget_set_sensitive(widget->button.update,TRUE);
112   - gtk_widget_set_sensitive(widget->button.remove,TRUE);
113   - gtk_widget_set_sensitive(widget->button.reset,TRUE);
114   - }
115   - else
116   - {
117   - gtk_widget_set_sensitive(widget->button.update,FALSE);
118   - gtk_widget_set_sensitive(widget->button.remove,FALSE);
119   - gtk_widget_set_sensitive(widget->button.reset,FALSE);
120   - }
121   -
122   -
123   -}
124   -
125   -static void validity_changed(GtkWidget G_GNUC_UNUSED(*settings), gboolean valid, V3270FTSettingsDialog *widget)
126   -{
127   - debug("The file transfer settings are now %s",valid ? "valid" : "invalid");
128   - gtk_widget_set_sensitive(widget->button.insert,valid);
129   - gtk_widget_set_sensitive(widget->button.update,valid);
130   -}
131   -
132   -static void has_activity_changed(GtkWidget G_GNUC_UNUSED(*settings), gboolean have_activity, V3270FTSettingsDialog *widget)
133   -{
134   - gtk_widget_set_sensitive(widget->button.reset,have_activity);
135   - gtk_widget_set_sensitive(widget->button.update,have_activity);
136   - gtk_widget_set_sensitive(widget->button.remove,have_activity);
137   -}
138   -
139   -static void reset_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
140   -{
141   - v3270_ft_settings_reset(widget->settings);
142   -}
143   -
144   -static void update_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
145   -{
146   - v3270_ft_settings_update(widget->settings);
147   - gtk_tree_view_columns_autosize(GTK_TREE_VIEW(widget->queue.view));
148   -}
149   -
150   -static void load_queue_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
151   -{
152   - v3270_activity_list_load(widget->queue.view);
153   -}
154   -
155   -static void save_queue_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
156   -{
157   - debug("%s",__FUNCTION__);
158   - v3270_activity_list_save(widget->queue.view);
159   -}
160   -
161   -static void save_queue_as_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
162   -{
163   - v3270_activity_list_save_as(widget->queue.view);
164   -}
165   -
166   -static void begin_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
167   -{
168   - gtk_dialog_response(GTK_DIALOG(widget),GTK_RESPONSE_ACCEPT);
169   -}
170   -
171   -static gboolean v3270_activity_compare_filenames(const GObject *a, const GObject *b)
172   -{
173   - if(strcmp(v3270_ft_activity_get_local_filename(a),v3270_ft_activity_get_local_filename(b)))
174   - return FALSE;
175   -
176   - if(strcmp(v3270_ft_activity_get_remote_filename(a),v3270_ft_activity_get_remote_filename(b)))
177   - return FALSE;
178   -
179   - return TRUE;
180   -}
181   -
182   -int v3270_ft_settings_dialog_append_activity(GtkWidget *widget, GObject *activity, GError **error)
183   -{
184   - V3270FTSettingsDialog *dialog = GTK_V3270_FT_DIALOG(widget);
185   -
186   - GtkTreeIter iter;
187   - GtkTreeModel * model = gtk_tree_view_get_model(GTK_TREE_VIEW(dialog->queue.view));
188   -
189   - if(gtk_tree_model_get_iter_first(model,&iter))
190   - {
191   - do
192   - {
193   - GObject * a = NULL;
194   - gtk_tree_model_get(model, &iter, 0, &a, -1);
195   -
196   - if(a && v3270_activity_compare_filenames(activity, a))
197   - {
198   - // Activity already exist
199   - if(error && !*error)
200   - *error = g_error_new_literal(g_quark_from_static_string(PACKAGE_NAME),EPERM,_("Activity already on the queue"));
201   -
202   - return -1;
203   - }
204   -
205   - }
206   - while(gtk_tree_model_iter_next(model,&iter));
207   - }
208   -
209   - // Not found, insert it.
210   - v3270_activity_list_append(dialog->queue.view,activity,FALSE);
211   -
212   - return 0;
213   -}
214   -
215   -static void insert_clicked(GtkWidget *button, V3270FTSettingsDialog *widget)
216   -{
217   - GtkTreeIter iter;
218   - GtkTreeModel * model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget->queue.view));
219   -
220   - if(gtk_tree_model_get_iter_first(model,&iter))
221   - {
222   - do
223   - {
224   - GObject * activity = NULL;
225   - gtk_tree_model_get(model, &iter, 0, &activity, -1);
226   -
227   - if(activity && v3270_ft_settings_equals(widget->settings,activity))
228   - {
229   - // Activity already exist
230   - GtkWidget * dialog =
231   - gtk_message_dialog_new(
232   - GTK_WINDOW(gtk_widget_get_toplevel(button)),
233   - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
234   - GTK_MESSAGE_ERROR,
235   - GTK_BUTTONS_CLOSE,
236   - _("Activity already on the queue")
237   - );
238   -
239   - gtk_message_dialog_format_secondary_text(
240   - GTK_MESSAGE_DIALOG(dialog),
241   - _( "You can't add more than one acitivity with the same files.")
242   - );
243   -
244   - gtk_window_set_title(GTK_WINDOW(dialog),_("Can't add activity"));
245   -
246   - gtk_dialog_run(GTK_DIALOG(dialog));
247   - gtk_widget_destroy(dialog);
248   -
249   - return;
250   - }
251   -
252   - }
253   - while(gtk_tree_model_iter_next(model,&iter));
254   - }
255   -
256   - // Not found, insert it.
257   - v3270_activity_list_append(widget->queue.view,v3270_ft_settings_create_activity(widget->settings),FALSE);
258   -
259   -}
260   -
261   -static void remove_clicked(GtkWidget G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
262   -{
263   - v3270_activity_list_remove(widget->queue.view,v3270_ft_settings_get_activity(widget->settings));
264   - v3270_ft_settings_set_activity(widget->settings,NULL);
265   -}
266   -
267   -static void enable_queue_save(GtkWidget G_GNUC_UNUSED(*save), gboolean enabled, V3270FTSettingsDialog *widget)
268   -{
269   - debug("%s: %s",__FUNCTION__,(enabled ? "Enable" : "Disable"));
270   - gtk_widget_set_sensitive(widget->queue.save,enabled);
271   -}
272   -
273   -static void V3270FTSettingsDialog_init(V3270FTSettingsDialog *widget)
274   -{
275   - widget->settings = v3270_ft_settings_new();
276   - g_signal_connect(G_OBJECT(widget->settings),"validity",G_CALLBACK(validity_changed),widget);
277   - g_signal_connect(G_OBJECT(widget->settings),"has-activity",G_CALLBACK(has_activity_changed),widget);
278   -
279   -#if GTK_CHECK_VERSION(3,12,0)
280   - // Does the dialog have header bar?
281   - GtkHeaderBar * header = v3270_dialog_get_header_bar(GTK_WIDGET(widget));
282   -
283   - if(header)
284   - gtk_header_bar_set_title(header,_( "3270 File transfer"));
285   - else
286   - gtk_window_set_title(GTK_WINDOW(widget),_( "3270 File transfer"));
287   -#else
288   - gtk_window_set_title(GTK_WINDOW(widget),_( "3270 File transfer"));
289   -#endif // GTK 3.12
290   -
291   - // https://developer.gnome.org/hig/stable/visual-layout.html.en
292   - gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(widget))),18);
293   -
294   - // Create box
295   - GtkWidget * container = gtk_box_new(GTK_ORIENTATION_VERTICAL,6);
296   - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(widget))),container,TRUE,TRUE,0);
297   -
298   - // Pack settings widget
299   - gtk_widget_set_halign(GTK_WIDGET(widget->settings),GTK_ALIGN_START);
300   - gtk_widget_set_hexpand(GTK_WIDGET(widget->settings),FALSE);
301   - gtk_widget_set_vexpand(GTK_WIDGET(widget->settings),FALSE);
302   - gtk_box_pack_start(GTK_BOX(container),widget->settings,FALSE,FALSE,0);
303   -
304   - // Create action buttons
305   - {
306   - GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,6);
307   -
308   - g_object_set(G_OBJECT(box),"margin-top",6,NULL);
309   - g_object_set(G_OBJECT(box),"margin-end",6,NULL);
310   -
311   - widget->button.reset = v3270_box_pack_end(box,gtk_button_new_with_mnemonic("_Reset"),FALSE,FALSE,0);
312   - g_signal_connect(widget->button.reset,"clicked",G_CALLBACK(reset_clicked),widget);
313   -
314   - widget->button.update = v3270_box_pack_end(box,gtk_button_new_with_mnemonic("_Update"),FALSE,FALSE,0);
315   - g_signal_connect(widget->button.update,"clicked",G_CALLBACK(update_clicked),widget);
316   -
317   - widget->button.remove = v3270_box_pack_end(box,gtk_button_new_with_mnemonic("_Delete"),FALSE,FALSE,0);
318   - g_signal_connect(widget->button.remove,"clicked",G_CALLBACK(remove_clicked),widget);
319   -
320   - widget->button.insert = v3270_box_pack_end(box,gtk_button_new_with_mnemonic("_Insert"),FALSE,FALSE,0);
321   - g_signal_connect(widget->button.insert,"clicked",G_CALLBACK(insert_clicked),widget);
322   -
323   - gtk_widget_set_sensitive(widget->button.update,FALSE);
324   - gtk_widget_set_sensitive(widget->button.remove,FALSE);
325   - gtk_widget_set_sensitive(widget->button.insert,FALSE);
326   - gtk_widget_set_sensitive(widget->button.reset,FALSE);
327   -
328   - gtk_box_pack_start(GTK_BOX(container),box,FALSE,FALSE,0);
329   -
330   - }
331   -
332   - // Create Transfer queue buttons
333   - {
334   -#if GTK_CHECK_VERSION(3,10,0)
335   - // https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html
336   - widget->queue.load = gtk_button_new_from_icon_name("document-open",GTK_ICON_SIZE_SMALL_TOOLBAR);
337   - widget->queue.save = gtk_button_new_from_icon_name("document-save",GTK_ICON_SIZE_SMALL_TOOLBAR);
338   - widget->queue.saveAs = gtk_button_new_from_icon_name("document-save-as",GTK_ICON_SIZE_SMALL_TOOLBAR);
339   -#else
340   - // https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html
341   - widget->queue.load = gtk_button_new_from_stock(GTK_STOCK_OPEN);
342   - widget->queue.save = gtk_button_new_from_stock(GTK_STOCK_SAVE);
343   - widget->queue.saveAs = gtk_button_new_from_stock(GTK_STOCK_SAVE_AS);
344   -#endif // GTK_CHECK_VERSION
345   -
346   - gtk_widget_set_tooltip_markup(widget->queue.load,_("Get transfer queue from file"));
347   - g_signal_connect(widget->queue.load,"clicked",G_CALLBACK(load_queue_clicked),widget);
348   -
349   - gtk_widget_set_tooltip_markup(widget->queue.save,_("Save transfer queue"));
350   - g_signal_connect(widget->queue.save,"clicked",G_CALLBACK(save_queue_clicked),widget);
351   - gtk_widget_set_sensitive(widget->queue.save,FALSE);
352   -
353   - gtk_widget_set_tooltip_markup(widget->queue.saveAs,_("Save transfer queue to file"));
354   - g_signal_connect(widget->queue.saveAs,"clicked",G_CALLBACK(save_queue_as_clicked),widget);
355   -
356   - }
357   -
358   - // Create file list view
359   - {
360   - widget->queue.view = v3270_activity_list_new();
361   - gtk_widget_set_tooltip_markup(widget->queue.view,_("Files to transfer"));
362   - g_signal_connect(G_OBJECT(widget->queue.view),"has-file",G_CALLBACK(enable_queue_save),widget);
363   - g_signal_connect(G_OBJECT(widget->queue.view),"changed",G_CALLBACK(activity_selected),widget);
364   -
365   - // Put the view inside a scrolled window.
366   - GtkWidget * scrolled = gtk_scrolled_window_new(NULL,NULL);
367   - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
368   - gtk_container_add(GTK_CONTAINER(scrolled),widget->queue.view);
369   - gtk_widget_set_size_request(scrolled,50,150);
370   -
371   - gtk_widget_set_vexpand(scrolled,TRUE);
372   - gtk_widget_set_hexpand(scrolled,TRUE);
373   -
374   -#if GTK_CHECK_VERSION(3,12,0)
375   - if(header)
376   - {
377   - debug("Dialog %s header bar","have");
378   -
379   - GtkWidget * frame = v3270_dialog_create_frame(scrolled,_("Transfer queue"));
380   - gtk_box_pack_start(GTK_BOX(container),frame,TRUE,TRUE,0);
381   -
382   - widget->button.begin = gtk_button_new_from_icon_name("network-transmit",GTK_ICON_SIZE_SMALL_TOOLBAR);
383   -
384   - g_object_set(G_OBJECT(widget->button.begin),"margin-end",12,NULL);
385   - g_signal_connect(widget->button.begin,"clicked",G_CALLBACK(begin_clicked),widget);
386   -
387   - gtk_header_bar_pack_start(header,widget->button.begin);
388   - gtk_header_bar_pack_start(header,widget->queue.load);
389   - gtk_header_bar_pack_start(header,widget->queue.save);
390   - gtk_header_bar_pack_start(header,widget->queue.saveAs);
391   -
392   - }
393   - else
394   - {
395   - debug("Dialog %s header bar","don't have");
396   -
397   - GtkWidget * hBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,6);
398   - GtkWidget * frame = v3270_dialog_create_frame(hBox,_("Transfer queue"));
399   - gtk_box_pack_start(GTK_BOX(container),frame,TRUE,TRUE,0);
400   -
401   - GtkBox * box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL,6));
402   - gtk_box_pack_start(GTK_BOX(hBox),GTK_WIDGET(box),FALSE,FALSE,0);
403   -
404   - gtk_box_pack_start(box,widget->queue.load,FALSE,FALSE,0);
405   - gtk_box_pack_start(box,widget->queue.save,FALSE,FALSE,0);
406   - gtk_box_pack_start(box,widget->queue.saveAs,FALSE,FALSE,0);
407   -
408   - gtk_box_pack_start(GTK_BOX(hBox),GTK_WIDGET(scrolled),TRUE,TRUE,0);
409   -
410   - gtk_dialog_add_button(GTK_DIALOG (widget),_("_Cancel"),GTK_RESPONSE_CANCEL);
411   - widget->button.begin = gtk_dialog_add_button(GTK_DIALOG (widget),_("B_egin transfer"),GTK_RESPONSE_ACCEPT);
412   -
413   - }
414   -#else
415   -
416   - GtkWidget * hBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,6);
417   - GtkWidget * frame = v3270_dialog_create_frame(hBox,_("Transfer queue"));
418   - gtk_box_pack_start(GTK_BOX(container),frame,TRUE,TRUE,0);
419   -
420   - GtkBox * box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL,6));
421   - gtk_box_pack_start(GTK_BOX(hBox),GTK_WIDGET(box),FALSE,FALSE,0);
422   -
423   - gtk_box_pack_start(box,widget->queue.load,FALSE,FALSE,0);
424   - gtk_box_pack_start(box,widget->queue.save,FALSE,FALSE,0);
425   - gtk_box_pack_start(box,widget->queue.saveAs,FALSE,FALSE,0);
426   -
427   - gtk_box_pack_start(GTK_BOX(hBox),GTK_WIDGET(scrolled),TRUE,TRUE,0);
428   -
429   - gtk_dialog_add_button(GTK_DIALOG (widget),_("_Cancel"),GTK_RESPONSE_CANCEL);
430   - widget->button.begin = gtk_dialog_add_button(GTK_DIALOG (widget),_("B_egin transfer"),GTK_RESPONSE_ACCEPT);
431   -
432   -#endif // GTK_CHECK_VERSION(3,12,0)
433   -
434   - // gtk_widget_set_sensitive(widget->button.begin,FALSE);
435   - gtk_widget_set_tooltip_markup(widget->button.begin,_("Start transfer"));
436   - gtk_widget_set_sensitive(widget->button.begin,FALSE);
437   -
438   -/*
439   -#ifdef DEBUG
440   - GObject * activity = v3270_ft_activity_new();
441   -
442   - v3270_ft_activity_set_local_filename(activity,"local---");
443   - v3270_ft_activity_set_remote_filename(activity,"remote---");
444   - v3270_ft_activity_set_options(activity,LIB3270_FT_OPTION_SEND|LIB3270_FT_OPTION_ASCII|LIB3270_FT_OPTION_CRLF|LIB3270_FT_OPTION_REMAP|LIB3270_FT_OPTION_APPEND|LIB3270_FT_RECORD_FORMAT_VARIABLE);
445   -
446   - v3270_activity_list_append(widget->queue.view,activity,FALSE);
447   -#endif // DEBUG
448   -*/
449   -
450   - }
451   -
452   -
453   -}
454   -
455   -LIB3270_EXPORT GtkWidget * v3270_ft_settings_dialog_new(GtkWidget *parent)
456   -{
457   - gboolean use_header;
458   - g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL);
459   -
460   - GtkWidget * dialog =
461   - GTK_WIDGET(g_object_new(
462   - GTK_TYPE_V3270_FT_DIALOG,
463   - "use-header-bar", (use_header ? 1 : 0),
464   - NULL
465   - ));
466   -
467   - if(parent)
468   - {
469   - gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gtk_widget_get_toplevel(parent)));
470   - gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
471   - gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE);
472   - }
473   -
474   - if(GTK_IS_V3270(parent))
475   - v3270_ft_settings_dialog_set_session(dialog,v3270_get_session(parent));
476   -
477   - return dialog;
478   -}
479   -
480   -static void connect_changed(H3270 G_GNUC_UNUSED(*hSession), int state, void *widget)
481   -{
482   - V3270FTSettingsDialog * dialog = GTK_V3270_FT_DIALOG( ((GtkWidget *) widget) );
483   - gtk_widget_set_sensitive(dialog->button.begin,state ? TRUE : FALSE);
484   -}
485   -
486   -LIB3270_EXPORT void v3270_ft_settings_dialog_set_session(GtkWidget *widget, H3270 *hSession)
487   -{
488   - V3270FTSettingsDialog * dialog = GTK_V3270_FT_DIALOG(widget);
489   -
490   - if(dialog->hSession && dialog->stHandle)
491   - {
492   - lib3270_unregister_schange(dialog->hSession,LIB3270_STATE_CONNECT,dialog->stHandle);
493   - dialog->stHandle = NULL;
494   - }
495   -
496   - dialog->hSession = hSession;
497   - dialog->stHandle = lib3270_register_schange(hSession,LIB3270_STATE_CONNECT,connect_changed,(void *) widget);
498   -
499   - gtk_widget_set_sensitive(dialog->button.begin,lib3270_is_connected(hSession) ? TRUE : FALSE);
500   -
501   - v3270_ft_settings_set_tso(dialog->settings,lib3270_is_tso(hSession));
502   -
503   -}
src/include/v3270/colorscheme.h
... ... @@ -65,8 +65,8 @@
65 65 LIB3270_EXPORT gchar * v3270_color_scheme_get_text(GtkWidget *widget);
66 66 LIB3270_EXPORT void v3270_color_scheme_set_text(GtkWidget *widget, const gchar *colors);
67 67  
68   - LIB3270_EXPORT GtkWidget * v3270_color_selection_new(GtkWidget *widget);
69   - LIB3270_EXPORT void v3270_color_selection_reset(GtkWidget *widget);
  68 + LIB3270_EXPORT GtkWidget * v3270_color_selection_new();
  69 + LIB3270_EXPORT void v3270_edit_color_table(GtkWidget *terminal);
70 70  
71 71 G_END_DECLS
72 72  
... ...
src/terminal/font.c
... ... @@ -107,6 +107,7 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, unsigned int width,
107 107 cairo_set_font_size(cr,s);
108 108 cairo_font_extents(cr,&extents);
109 109  
  110 + /*
110 111 debug("font_size=%lf x_advance=%lf y_advance=%lf font_extents=%u+%u font_height=%u view_height=%u view_width=%u",
111 112 s,
112 113 extents.max_x_advance,
... ... @@ -116,6 +117,7 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, unsigned int width,
116 117 height,
117 118 VIEW_WIDTH_FROM_FONT(extents.max_x_advance)
118 119 );
  120 + */
119 121  
120 122 } while( (VIEW_HEIGTH_FROM_FONT( (extents.height+extents.descent) ) < height) && (VIEW_WIDTH_FROM_FONT(extents.max_x_advance) < width) );
121 123  
... ... @@ -171,6 +173,7 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, unsigned int width,
171 173 terminal->minimum_height = ((rows+1) * (extents.height + extents.descent)) + (OIA_TOP_MARGIN+2);
172 174 }
173 175  
  176 + /*
174 177 debug("font_size=%d x_advance=%lf y_advance=%lf font_extents=%u+%u font_height=%u view_height=%u view_width=%u",
175 178 font_size[f],
176 179 extents.max_x_advance,
... ... @@ -180,6 +183,7 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, unsigned int width,
180 183 height,
181 184 VIEW_WIDTH_FROM_FONT(extents.max_x_advance)
182 185 );
  186 + */
183 187  
184 188 if( VIEW_HEIGTH_FROM_FONT((extents.height + extents.descent)) < height && VIEW_WIDTH_FROM_FONT(extents.max_x_advance) < width)
185 189 size = font_size[f];
... ...
src/testprogram/toolbar.c
... ... @@ -153,6 +153,9 @@
153 153  
154 154 static void color_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal)
155 155 {
  156 + v3270_edit_color_table(terminal);
  157 +
  158 + /*
156 159 GtkWidget * dialog = v3270_dialog_new(terminal, _("Color setup"), _("_Save"));
157 160 GtkWidget * colors = v3270_color_selection_new(terminal);
158 161  
... ... @@ -171,7 +174,7 @@
171 174 }
172 175  
173 176 gtk_widget_destroy(dialog);
174   -
  177 + */
175 178  
176 179 }
177 180  
... ...
v3270.cbp
... ... @@ -79,6 +79,9 @@
79 79 <Unit filename="src/dialogs/print/settings.c">
80 80 <Option compilerVar="CC" />
81 81 </Unit>
  82 + <Unit filename="src/dialogs/print/settingsdialog.c">
  83 + <Option compilerVar="CC" />
  84 + </Unit>
82 85 <Unit filename="src/dialogs/private.h" />
83 86 <Unit filename="src/dialogs/save/convenience.c">
84 87 <Option compilerVar="CC" />
... ... @@ -93,9 +96,6 @@
93 96 <Unit filename="src/dialogs/settings.c">
94 97 <Option compilerVar="CC" />
95 98 </Unit>
96   - <Unit filename="src/dialogs/settingsdialog.c">
97   - <Option compilerVar="CC" />
98   - </Unit>
99 99 <Unit filename="src/dialogs/togglebutton.c">
100 100 <Option compilerVar="CC" />
101 101 </Unit>
... ...