Commit b97d36d378a49dd3428d034cbd33998d8b8b4918

Authored by Perry Werneck
1 parent 3ceaedc5
Exists in master and in 1 other branch develop

Refactoring settings dialog, adding more gtk doc stuff.

src/dialogs/settingsdialog.c 0 → 100644
... ... @@ -0,0 +1,465 @@
  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(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn G_GNUC_UNUSED(*column), V3270FTSettingsDialog *widget)
  104 +{
  105 + GtkTreeIter iter;
  106 + GtkTreeModel * model = gtk_tree_view_get_model(view);
  107 +
  108 + if(gtk_tree_model_get_iter(model, &iter, path))
  109 + {
  110 + GObject * activity = NULL;
  111 + gtk_tree_model_get(model, &iter, 0, &activity, -1);
  112 + v3270_ft_settings_set_activity(widget->settings,activity);
  113 +
  114 + gtk_widget_set_sensitive(widget->button.update,TRUE);
  115 + gtk_widget_set_sensitive(widget->button.remove,TRUE);
  116 + gtk_widget_set_sensitive(widget->button.reset,TRUE);
  117 +
  118 + }
  119 +
  120 +}
  121 +
  122 +static void validity_changed(GtkWidget G_GNUC_UNUSED(*settings), gboolean valid, V3270FTSettingsDialog *widget)
  123 +{
  124 + debug("The file transfer settings are now %s",valid ? "valid" : "invalid");
  125 + gtk_widget_set_sensitive(widget->button.insert,valid);
  126 + gtk_widget_set_sensitive(widget->button.update,valid);
  127 +}
  128 +
  129 +static void has_activity_changed(GtkWidget G_GNUC_UNUSED(*settings), gboolean have_activity, V3270FTSettingsDialog *widget)
  130 +{
  131 + gtk_widget_set_sensitive(widget->button.reset,have_activity);
  132 + gtk_widget_set_sensitive(widget->button.update,have_activity);
  133 + gtk_widget_set_sensitive(widget->button.remove,have_activity);
  134 +}
  135 +
  136 +static void reset_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
  137 +{
  138 + v3270_ft_settings_reset(widget->settings);
  139 +}
  140 +
  141 +static void update_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
  142 +{
  143 + v3270_ft_settings_update(widget->settings);
  144 + gtk_tree_view_columns_autosize(GTK_TREE_VIEW(widget->queue.view));
  145 +}
  146 +
  147 +static void load_queue_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
  148 +{
  149 + v3270_activity_list_load(widget->queue.view);
  150 +}
  151 +
  152 +static void save_queue_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
  153 +{
  154 + debug("%s",__FUNCTION__);
  155 + v3270_activity_list_save(widget->queue.view);
  156 +}
  157 +
  158 +static void save_queue_as_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
  159 +{
  160 + v3270_activity_list_save_as(widget->queue.view);
  161 +}
  162 +
  163 +static void begin_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
  164 +{
  165 + gtk_dialog_response(GTK_DIALOG(widget),GTK_RESPONSE_ACCEPT);
  166 +}
  167 +
  168 +static gboolean v3270_activity_compare_filenames(const GObject *a, const GObject *b)
  169 +{
  170 + if(strcmp(v3270_ft_activity_get_local_filename(a),v3270_ft_activity_get_local_filename(b)))
  171 + return FALSE;
  172 +
  173 + if(strcmp(v3270_ft_activity_get_remote_filename(a),v3270_ft_activity_get_remote_filename(b)))
  174 + return FALSE;
  175 +
  176 + return TRUE;
  177 +}
  178 +
  179 +int v3270_ft_settings_dialog_append_activity(GtkWidget *widget, GObject *activity, GError **error)
  180 +{
  181 + V3270FTSettingsDialog *dialog = GTK_V3270_FT_DIALOG(widget);
  182 +
  183 + GtkTreeIter iter;
  184 + GtkTreeModel * model = gtk_tree_view_get_model(GTK_TREE_VIEW(dialog->queue.view));
  185 +
  186 + if(gtk_tree_model_get_iter_first(model,&iter))
  187 + {
  188 + do
  189 + {
  190 + GObject * a = NULL;
  191 + gtk_tree_model_get(model, &iter, 0, &a, -1);
  192 +
  193 + if(a && v3270_activity_compare_filenames(activity, a))
  194 + {
  195 + // Activity already exist
  196 + if(error && !*error)
  197 + *error = g_error_new_literal(g_quark_from_static_string(PACKAGE_NAME),EPERM,_("Activity already on the queue"));
  198 +
  199 + return -1;
  200 + }
  201 +
  202 + }
  203 + while(gtk_tree_model_iter_next(model,&iter));
  204 + }
  205 +
  206 + // Not found, insert it.
  207 + v3270_activity_list_append(dialog->queue.view,activity);
  208 +
  209 + return 0;
  210 +}
  211 +
  212 +static void insert_clicked(GtkWidget *button, V3270FTSettingsDialog *widget)
  213 +{
  214 + GtkTreeIter iter;
  215 + GtkTreeModel * model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget->queue.view));
  216 +
  217 + if(gtk_tree_model_get_iter_first(model,&iter))
  218 + {
  219 + do
  220 + {
  221 + GObject * activity = NULL;
  222 + gtk_tree_model_get(model, &iter, 0, &activity, -1);
  223 +
  224 + if(activity && v3270_ft_settings_equals(widget->settings,activity))
  225 + {
  226 + // Activity already exist
  227 + GtkWidget * dialog =
  228 + gtk_message_dialog_new(
  229 + GTK_WINDOW(gtk_widget_get_toplevel(button)),
  230 + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
  231 + GTK_MESSAGE_ERROR,
  232 + GTK_BUTTONS_CLOSE,
  233 + _("Activity already on the queue")
  234 + );
  235 +
  236 + gtk_message_dialog_format_secondary_text(
  237 + GTK_MESSAGE_DIALOG(dialog),
  238 + _( "You can't add more than one acitivity with the same files.")
  239 + );
  240 +
  241 + gtk_window_set_title(GTK_WINDOW(dialog),_("Can't add activity"));
  242 +
  243 + gtk_dialog_run(GTK_DIALOG(dialog));
  244 + gtk_widget_destroy(dialog);
  245 +
  246 + return;
  247 + }
  248 +
  249 + }
  250 + while(gtk_tree_model_iter_next(model,&iter));
  251 + }
  252 +
  253 + // Not found, insert it.
  254 + v3270_activity_list_append(widget->queue.view,v3270_ft_settings_create_activity(widget->settings));
  255 +
  256 +}
  257 +
  258 +static void remove_clicked(GtkWidget G_GNUC_UNUSED(*button), V3270FTSettingsDialog *widget)
  259 +{
  260 + v3270_activity_list_remove(widget->queue.view,v3270_ft_settings_get_activity(widget->settings));
  261 + v3270_ft_settings_set_activity(widget->settings,NULL);
  262 +}
  263 +
  264 +static void enable_queue_save(GtkWidget G_GNUC_UNUSED(*save), gboolean enabled, V3270FTSettingsDialog *widget)
  265 +{
  266 + debug("%s: %s",__FUNCTION__,(enabled ? "Enable" : "Disable"));
  267 + gtk_widget_set_sensitive(widget->queue.save,enabled);
  268 +}
  269 +
  270 +static void V3270FTSettingsDialog_init(V3270FTSettingsDialog *widget)
  271 +{
  272 + widget->settings = v3270_ft_settings_new();
  273 + g_signal_connect(G_OBJECT(widget->settings),"validity",G_CALLBACK(validity_changed),widget);
  274 + g_signal_connect(G_OBJECT(widget->settings),"has-activity",G_CALLBACK(has_activity_changed),widget);
  275 +
  276 + // Does the dialog have header bar?
  277 + GtkHeaderBar * header = v3270_dialog_get_header_bar(GTK_WIDGET(widget));
  278 +
  279 + if(header)
  280 + gtk_header_bar_set_title(header,_( "3270 File transfer"));
  281 + else
  282 + gtk_window_set_title(GTK_WINDOW(widget),_( "3270 File transfer"));
  283 +
  284 + // https://developer.gnome.org/hig/stable/visual-layout.html.en
  285 + gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(widget))),18);
  286 +
  287 + // Create box
  288 + GtkWidget * container = gtk_box_new(GTK_ORIENTATION_VERTICAL,6);
  289 + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(widget))),container,TRUE,TRUE,0);
  290 +
  291 + // Pack settings widget
  292 + gtk_widget_set_halign(GTK_WIDGET(widget->settings),GTK_ALIGN_START);
  293 + gtk_widget_set_hexpand(GTK_WIDGET(widget->settings),FALSE);
  294 + gtk_widget_set_vexpand(GTK_WIDGET(widget->settings),FALSE);
  295 + gtk_box_pack_start(GTK_BOX(container),widget->settings,FALSE,FALSE,0);
  296 +
  297 + // Create action buttons
  298 + {
  299 + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,6);
  300 +
  301 + g_object_set(G_OBJECT(box),"margin-top",6,NULL);
  302 + g_object_set(G_OBJECT(box),"margin-end",6,NULL);
  303 +
  304 + widget->button.reset = v3270_box_pack_end(box,gtk_button_new_with_mnemonic("_Reset"),FALSE,FALSE,0);
  305 + g_signal_connect(widget->button.reset,"clicked",G_CALLBACK(reset_clicked),widget);
  306 +
  307 + widget->button.update = v3270_box_pack_end(box,gtk_button_new_with_mnemonic("_Update"),FALSE,FALSE,0);
  308 + g_signal_connect(widget->button.update,"clicked",G_CALLBACK(update_clicked),widget);
  309 +
  310 + widget->button.remove = v3270_box_pack_end(box,gtk_button_new_with_mnemonic("_Delete"),FALSE,FALSE,0);
  311 + g_signal_connect(widget->button.remove,"clicked",G_CALLBACK(remove_clicked),widget);
  312 +
  313 + widget->button.insert = v3270_box_pack_end(box,gtk_button_new_with_mnemonic("_Insert"),FALSE,FALSE,0);
  314 + g_signal_connect(widget->button.insert,"clicked",G_CALLBACK(insert_clicked),widget);
  315 +
  316 + gtk_widget_set_sensitive(widget->button.update,FALSE);
  317 + gtk_widget_set_sensitive(widget->button.remove,FALSE);
  318 + gtk_widget_set_sensitive(widget->button.insert,FALSE);
  319 + gtk_widget_set_sensitive(widget->button.reset,FALSE);
  320 +
  321 + gtk_box_pack_start(GTK_BOX(container),box,FALSE,FALSE,0);
  322 +
  323 + }
  324 +
  325 + // Create Transfer queue buttons
  326 + {
  327 + // https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html
  328 + widget->queue.load = gtk_button_new_from_icon_name("document-open",GTK_ICON_SIZE_SMALL_TOOLBAR);
  329 + gtk_widget_set_tooltip_markup(widget->queue.load,_("Get transfer queue from file"));
  330 + g_signal_connect(widget->queue.load,"clicked",G_CALLBACK(load_queue_clicked),widget);
  331 +
  332 + widget->queue.save = gtk_button_new_from_icon_name("document-save",GTK_ICON_SIZE_SMALL_TOOLBAR);
  333 + gtk_widget_set_tooltip_markup(widget->queue.save,_("Save transfer queue"));
  334 + g_signal_connect(widget->queue.save,"clicked",G_CALLBACK(save_queue_clicked),widget);
  335 + gtk_widget_set_sensitive(widget->queue.save,FALSE);
  336 +
  337 + widget->queue.saveAs = gtk_button_new_from_icon_name("document-save-as",GTK_ICON_SIZE_SMALL_TOOLBAR);
  338 + gtk_widget_set_tooltip_markup(widget->queue.saveAs,_("Save transfer queue to file"));
  339 + g_signal_connect(widget->queue.saveAs,"clicked",G_CALLBACK(save_queue_as_clicked),widget);
  340 +
  341 + }
  342 +
  343 + // Create file list view
  344 + {
  345 + widget->queue.view = v3270_activity_list_new();
  346 + gtk_widget_set_tooltip_markup(widget->queue.view,_("Files to transfer"));
  347 + g_signal_connect(G_OBJECT(widget->queue.view),"row-activated",G_CALLBACK(activity_selected),widget);
  348 + g_signal_connect(G_OBJECT(widget->queue.view),"has-file",G_CALLBACK(enable_queue_save),widget);
  349 +
  350 + // Put the view inside a scrolled window.
  351 + GtkWidget * scrolled = gtk_scrolled_window_new(NULL,NULL);
  352 + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
  353 + gtk_container_add(GTK_CONTAINER(scrolled),widget->queue.view);
  354 + gtk_widget_set_size_request(scrolled,50,150);
  355 +
  356 + gtk_widget_set_vexpand(scrolled,TRUE);
  357 + gtk_widget_set_hexpand(scrolled,TRUE);
  358 +
  359 + if(header)
  360 + {
  361 + debug("Dialog %s header bar","have");
  362 +
  363 + GtkWidget * frame = v3270_dialog_create_frame(scrolled,_("Transfer queue"));
  364 + gtk_box_pack_start(GTK_BOX(container),frame,TRUE,TRUE,0);
  365 +
  366 + widget->button.begin = gtk_button_new_from_icon_name("network-transmit",GTK_ICON_SIZE_SMALL_TOOLBAR);
  367 + g_object_set(G_OBJECT(widget->button.begin),"margin-end",12,NULL);
  368 + g_signal_connect(widget->button.begin,"clicked",G_CALLBACK(begin_clicked),widget);
  369 +
  370 + gtk_header_bar_pack_start(header,widget->button.begin);
  371 + gtk_header_bar_pack_start(header,widget->queue.load);
  372 + gtk_header_bar_pack_start(header,widget->queue.save);
  373 + gtk_header_bar_pack_start(header,widget->queue.saveAs);
  374 +
  375 + }
  376 + else
  377 + {
  378 + debug("Dialog %s header bar","don't have");
  379 +
  380 + GtkWidget * hBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,6);
  381 + GtkWidget * frame = v3270_dialog_create_frame(hBox,_("Transfer queue"));
  382 + gtk_box_pack_start(GTK_BOX(container),frame,TRUE,TRUE,0);
  383 +
  384 + GtkBox * box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL,6));
  385 + gtk_box_pack_start(GTK_BOX(hBox),GTK_WIDGET(box),FALSE,FALSE,0);
  386 +
  387 + gtk_box_pack_start(box,widget->queue.load,FALSE,FALSE,0);
  388 + gtk_box_pack_start(box,widget->queue.save,FALSE,FALSE,0);
  389 + gtk_box_pack_start(box,widget->queue.saveAs,FALSE,FALSE,0);
  390 +
  391 + gtk_box_pack_start(GTK_BOX(hBox),GTK_WIDGET(scrolled),TRUE,TRUE,0);
  392 +
  393 + gtk_dialog_add_button(GTK_DIALOG (widget),_("_Cancel"),GTK_RESPONSE_CANCEL);
  394 + widget->button.begin = gtk_dialog_add_button(GTK_DIALOG (widget),_("B_egin transfer"),GTK_RESPONSE_ACCEPT);
  395 +
  396 + }
  397 +
  398 + // gtk_widget_set_sensitive(widget->button.begin,FALSE);
  399 + gtk_widget_set_tooltip_markup(widget->button.begin,_("Start transfer"));
  400 + gtk_widget_set_sensitive(widget->button.begin,FALSE);
  401 +
  402 +/*
  403 +#ifdef DEBUG
  404 + GObject * activity = v3270_ft_activity_new();
  405 +
  406 + v3270_ft_activity_set_local_filename(activity,"local---");
  407 + v3270_ft_activity_set_remote_filename(activity,"remote---");
  408 + 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);
  409 +
  410 + v3270_activity_list_append(widget->queue.view,activity);
  411 +#endif // DEBUG
  412 +*/
  413 +
  414 + }
  415 +
  416 +
  417 +}
  418 +
  419 +LIB3270_EXPORT GtkWidget * v3270_ft_settings_dialog_new(GtkWidget *parent)
  420 +{
  421 + gboolean use_header;
  422 + g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL);
  423 +
  424 + GtkWidget * dialog =
  425 + GTK_WIDGET(g_object_new(
  426 + GTK_TYPE_V3270_FT_DIALOG,
  427 + "use-header-bar", (use_header ? 1 : 0),
  428 + NULL
  429 + ));
  430 +
  431 + if(parent)
  432 + {
  433 + gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gtk_widget_get_toplevel(parent)));
  434 + gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
  435 + gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE);
  436 + }
  437 +
  438 + if(GTK_IS_V3270(parent))
  439 + v3270_ft_settings_dialog_set_session(dialog,v3270_get_session(parent));
  440 +
  441 + return dialog;
  442 +}
  443 +
  444 +static void connect_changed(H3270 G_GNUC_UNUSED(*hSession), int state, void *widget)
  445 +{
  446 + V3270FTSettingsDialog * dialog = GTK_V3270_FT_DIALOG( ((GtkWidget *) widget) );
  447 + gtk_widget_set_sensitive(dialog->button.begin,state ? TRUE : FALSE);
  448 +}
  449 +
  450 +LIB3270_EXPORT void v3270_ft_settings_dialog_set_session(GtkWidget *widget, H3270 *hSession)
  451 +{
  452 + V3270FTSettingsDialog * dialog = GTK_V3270_FT_DIALOG(widget);
  453 +
  454 + if(dialog->hSession && dialog->stHandle)
  455 + {
  456 + lib3270_unregister_schange(dialog->hSession,LIB3270_STATE_CONNECT,dialog->stHandle);
  457 + dialog->stHandle = NULL;
  458 + }
  459 +
  460 + dialog->hSession = hSession;
  461 + dialog->stHandle = lib3270_register_schange(hSession,LIB3270_STATE_CONNECT,connect_changed,(void *) widget);
  462 +
  463 + gtk_widget_set_sensitive(dialog->button.begin,lib3270_is_connected(hSession) ? TRUE : FALSE);
  464 +
  465 +}
... ...
src/filetransfer/dialog.c
... ... @@ -1,455 +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 <internals.h>
31   - #include <v3270/filetransfer.h>
32   - #include "private.h"
33   -
34   -/*--[ Widget definition ]----------------------------------------------------------------------------*/
35   -
36   - struct _V3270FTDialog
37   - {
38   - GtkDialog parent;
39   -
40   - GtkWidget * settings;
41   -
42   - H3270 * hSession;
43   - const void * stHandle;
44   -
45   - struct
46   - {
47   - GtkWidget * insert;
48   - GtkWidget * update;
49   - GtkWidget * remove;
50   - GtkWidget * reset;
51   - GtkWidget * begin;
52   - } button;
53   -
54   - struct
55   - {
56   - GtkWidget * view;
57   - GtkWidget * load;
58   - GtkWidget * save;
59   - GtkWidget * saveAs;
60   - } queue;
61   -
62   - };
63   -
64   - struct _V3270FTDialogClass
65   - {
66   - GtkDialogClass parent_class;
67   - };
68   -
69   - G_DEFINE_TYPE(V3270FTDialog, V3270FTDialog, GTK_TYPE_DIALOG);
70   -
71   -/*--[ Implement ]------------------------------------------------------------------------------------*/
72   -
73   -static void finalize(GObject *object)
74   -{
75   - debug("%s",__FUNCTION__);
76   -
77   - V3270FTDialog * dialog = GTK_V3270_FT_DIALOG(object);
78   -
79   - if(dialog->hSession && dialog->stHandle)
80   - {
81   - lib3270_unregister_schange(dialog->hSession,LIB3270_STATE_CONNECT,dialog->stHandle);
82   - dialog->stHandle = NULL;
83   - }
84   -
85   - G_OBJECT_CLASS(V3270FTDialog_parent_class)->finalize(object);
86   -}
87   -
88   -static void V3270FTDialog_class_init(G_GNUC_UNUSED V3270FTDialogClass *klass)
89   -{
90   - G_OBJECT_CLASS(klass)->finalize = finalize;
91   -}
92   -
93   -void activity_selected(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn G_GNUC_UNUSED(*column), V3270FTDialog *widget)
94   -{
95   - GtkTreeIter iter;
96   - GtkTreeModel * model = gtk_tree_view_get_model(view);
97   -
98   - if(gtk_tree_model_get_iter(model, &iter, path))
99   - {
100   - GObject * activity = NULL;
101   - gtk_tree_model_get(model, &iter, 0, &activity, -1);
102   - v3270_ft_settings_set_activity(widget->settings,activity);
103   -
104   - gtk_widget_set_sensitive(widget->button.update,TRUE);
105   - gtk_widget_set_sensitive(widget->button.remove,TRUE);
106   - gtk_widget_set_sensitive(widget->button.reset,TRUE);
107   -
108   - }
109   -
110   -}
111   -
112   -static void validity_changed(GtkWidget G_GNUC_UNUSED(*settings), gboolean valid, V3270FTDialog *widget)
113   -{
114   - debug("The file transfer settings are now %s",valid ? "valid" : "invalid");
115   - gtk_widget_set_sensitive(widget->button.insert,valid);
116   - gtk_widget_set_sensitive(widget->button.update,valid);
117   -}
118   -
119   -static void has_activity_changed(GtkWidget G_GNUC_UNUSED(*settings), gboolean have_activity, V3270FTDialog *widget)
120   -{
121   - gtk_widget_set_sensitive(widget->button.reset,have_activity);
122   - gtk_widget_set_sensitive(widget->button.update,have_activity);
123   - gtk_widget_set_sensitive(widget->button.remove,have_activity);
124   -}
125   -
126   -static void reset_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTDialog *widget)
127   -{
128   - v3270_ft_settings_reset(widget->settings);
129   -}
130   -
131   -static void update_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTDialog *widget)
132   -{
133   - v3270_ft_settings_update(widget->settings);
134   - gtk_tree_view_columns_autosize(GTK_TREE_VIEW(widget->queue.view));
135   -}
136   -
137   -static void load_queue_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTDialog *widget)
138   -{
139   - v3270_activity_list_load(widget->queue.view);
140   -}
141   -
142   -static void save_queue_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTDialog *widget)
143   -{
144   - debug("%s",__FUNCTION__);
145   - v3270_activity_list_save(widget->queue.view);
146   -}
147   -
148   -static void save_queue_as_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTDialog *widget)
149   -{
150   - v3270_activity_list_save_as(widget->queue.view);
151   -}
152   -
153   -static void begin_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTDialog *widget)
154   -{
155   - gtk_dialog_response(GTK_DIALOG(widget),GTK_RESPONSE_ACCEPT);
156   -}
157   -
158   -static gboolean v3270_activity_compare_filenames(const GObject *a, const GObject *b)
159   -{
160   - if(strcmp(v3270_ft_activity_get_local_filename(a),v3270_ft_activity_get_local_filename(b)))
161   - return FALSE;
162   -
163   - if(strcmp(v3270_ft_activity_get_remote_filename(a),v3270_ft_activity_get_remote_filename(b)))
164   - return FALSE;
165   -
166   - return TRUE;
167   -}
168   -
169   -int v3270_ft_dialog_append_activity(GtkWidget *widget, GObject *activity, GError **error)
170   -{
171   - V3270FTDialog *dialog = GTK_V3270_FT_DIALOG(widget);
172   -
173   - GtkTreeIter iter;
174   - GtkTreeModel * model = gtk_tree_view_get_model(GTK_TREE_VIEW(dialog->queue.view));
175   -
176   - if(gtk_tree_model_get_iter_first(model,&iter))
177   - {
178   - do
179   - {
180   - GObject * a = NULL;
181   - gtk_tree_model_get(model, &iter, 0, &a, -1);
182   -
183   - if(a && v3270_activity_compare_filenames(activity, a))
184   - {
185   - // Activity already exist
186   - if(error && !*error)
187   - *error = g_error_new_literal(g_quark_from_static_string(PACKAGE_NAME),EPERM,_("Activity already on the queue"));
188   -
189   - return -1;
190   - }
191   -
192   - }
193   - while(gtk_tree_model_iter_next(model,&iter));
194   - }
195   -
196   - // Not found, insert it.
197   - v3270_activity_list_append(dialog->queue.view,activity);
198   -
199   - return 0;
200   -}
201   -
202   -static void insert_clicked(GtkWidget *button, V3270FTDialog *widget)
203   -{
204   - GtkTreeIter iter;
205   - GtkTreeModel * model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget->queue.view));
206   -
207   - if(gtk_tree_model_get_iter_first(model,&iter))
208   - {
209   - do
210   - {
211   - GObject * activity = NULL;
212   - gtk_tree_model_get(model, &iter, 0, &activity, -1);
213   -
214   - if(activity && v3270_ft_settings_equals(widget->settings,activity))
215   - {
216   - // Activity already exist
217   - GtkWidget * dialog =
218   - gtk_message_dialog_new(
219   - GTK_WINDOW(gtk_widget_get_toplevel(button)),
220   - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
221   - GTK_MESSAGE_ERROR,
222   - GTK_BUTTONS_CLOSE,
223   - _("Activity already on the queue")
224   - );
225   -
226   - gtk_message_dialog_format_secondary_text(
227   - GTK_MESSAGE_DIALOG(dialog),
228   - _( "You can't add more than one acitivity with the same files.")
229   - );
230   -
231   - gtk_window_set_title(GTK_WINDOW(dialog),_("Can't add activity"));
232   -
233   - gtk_dialog_run(GTK_DIALOG(dialog));
234   - gtk_widget_destroy(dialog);
235   -
236   - return;
237   - }
238   -
239   - }
240   - while(gtk_tree_model_iter_next(model,&iter));
241   - }
242   -
243   - // Not found, insert it.
244   - v3270_activity_list_append(widget->queue.view,v3270_ft_settings_create_activity(widget->settings));
245   -
246   -}
247   -
248   -static void remove_clicked(GtkWidget G_GNUC_UNUSED(*button), V3270FTDialog *widget)
249   -{
250   - v3270_activity_list_remove(widget->queue.view,v3270_ft_settings_get_activity(widget->settings));
251   - v3270_ft_settings_set_activity(widget->settings,NULL);
252   -}
253   -
254   -static void enable_queue_save(GtkWidget G_GNUC_UNUSED(*save), gboolean enabled, V3270FTDialog *widget)
255   -{
256   - debug("%s: %s",__FUNCTION__,(enabled ? "Enable" : "Disable"));
257   - gtk_widget_set_sensitive(widget->queue.save,enabled);
258   -}
259   -
260   -static void V3270FTDialog_init(V3270FTDialog *widget)
261   -{
262   - widget->settings = v3270_ft_settings_new();
263   - g_signal_connect(G_OBJECT(widget->settings),"validity",G_CALLBACK(validity_changed),widget);
264   - g_signal_connect(G_OBJECT(widget->settings),"has-activity",G_CALLBACK(has_activity_changed),widget);
265   -
266   - // Does the dialog have header bar?
267   - GtkHeaderBar * header = v3270_dialog_get_header_bar(GTK_WIDGET(widget));
268   -
269   - if(header)
270   - gtk_header_bar_set_title(header,_( "3270 File transfer"));
271   - else
272   - gtk_window_set_title(GTK_WINDOW(widget),_( "3270 File transfer"));
273   -
274   - // https://developer.gnome.org/hig/stable/visual-layout.html.en
275   - gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(widget))),18);
276   -
277   - // Create box
278   - GtkWidget * container = gtk_box_new(GTK_ORIENTATION_VERTICAL,6);
279   - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(widget))),container,TRUE,TRUE,0);
280   -
281   - // Pack settings widget
282   - gtk_widget_set_halign(GTK_WIDGET(widget->settings),GTK_ALIGN_START);
283   - gtk_widget_set_hexpand(GTK_WIDGET(widget->settings),FALSE);
284   - gtk_widget_set_vexpand(GTK_WIDGET(widget->settings),FALSE);
285   - gtk_box_pack_start(GTK_BOX(container),widget->settings,FALSE,FALSE,0);
286   -
287   - // Create action buttons
288   - {
289   - GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,6);
290   -
291   - g_object_set(G_OBJECT(box),"margin-top",6,NULL);
292   - g_object_set(G_OBJECT(box),"margin-end",6,NULL);
293   -
294   - widget->button.reset = v3270_box_pack_end(box,gtk_button_new_with_mnemonic("_Reset"),FALSE,FALSE,0);
295   - g_signal_connect(widget->button.reset,"clicked",G_CALLBACK(reset_clicked),widget);
296   -
297   - widget->button.update = v3270_box_pack_end(box,gtk_button_new_with_mnemonic("_Update"),FALSE,FALSE,0);
298   - g_signal_connect(widget->button.update,"clicked",G_CALLBACK(update_clicked),widget);
299   -
300   - widget->button.remove = v3270_box_pack_end(box,gtk_button_new_with_mnemonic("_Delete"),FALSE,FALSE,0);
301   - g_signal_connect(widget->button.remove,"clicked",G_CALLBACK(remove_clicked),widget);
302   -
303   - widget->button.insert = v3270_box_pack_end(box,gtk_button_new_with_mnemonic("_Insert"),FALSE,FALSE,0);
304   - g_signal_connect(widget->button.insert,"clicked",G_CALLBACK(insert_clicked),widget);
305   -
306   - gtk_widget_set_sensitive(widget->button.update,FALSE);
307   - gtk_widget_set_sensitive(widget->button.remove,FALSE);
308   - gtk_widget_set_sensitive(widget->button.insert,FALSE);
309   - gtk_widget_set_sensitive(widget->button.reset,FALSE);
310   -
311   - gtk_box_pack_start(GTK_BOX(container),box,FALSE,FALSE,0);
312   -
313   - }
314   -
315   - // Create Transfer queue buttons
316   - {
317   - // https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html
318   - widget->queue.load = gtk_button_new_from_icon_name("document-open",GTK_ICON_SIZE_SMALL_TOOLBAR);
319   - gtk_widget_set_tooltip_markup(widget->queue.load,_("Get transfer queue from file"));
320   - g_signal_connect(widget->queue.load,"clicked",G_CALLBACK(load_queue_clicked),widget);
321   -
322   - widget->queue.save = gtk_button_new_from_icon_name("document-save",GTK_ICON_SIZE_SMALL_TOOLBAR);
323   - gtk_widget_set_tooltip_markup(widget->queue.save,_("Save transfer queue"));
324   - g_signal_connect(widget->queue.save,"clicked",G_CALLBACK(save_queue_clicked),widget);
325   - gtk_widget_set_sensitive(widget->queue.save,FALSE);
326   -
327   - widget->queue.saveAs = gtk_button_new_from_icon_name("document-save-as",GTK_ICON_SIZE_SMALL_TOOLBAR);
328   - gtk_widget_set_tooltip_markup(widget->queue.saveAs,_("Save transfer queue to file"));
329   - g_signal_connect(widget->queue.saveAs,"clicked",G_CALLBACK(save_queue_as_clicked),widget);
330   -
331   - }
332   -
333   - // Create file list view
334   - {
335   - widget->queue.view = v3270_activity_list_new();
336   - gtk_widget_set_tooltip_markup(widget->queue.view,_("Files to transfer"));
337   - g_signal_connect(G_OBJECT(widget->queue.view),"row-activated",G_CALLBACK(activity_selected),widget);
338   - g_signal_connect(G_OBJECT(widget->queue.view),"has-file",G_CALLBACK(enable_queue_save),widget);
339   -
340   - // Put the view inside a scrolled window.
341   - GtkWidget * scrolled = gtk_scrolled_window_new(NULL,NULL);
342   - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
343   - gtk_container_add(GTK_CONTAINER(scrolled),widget->queue.view);
344   - gtk_widget_set_size_request(scrolled,50,150);
345   -
346   - gtk_widget_set_vexpand(scrolled,TRUE);
347   - gtk_widget_set_hexpand(scrolled,TRUE);
348   -
349   - if(header)
350   - {
351   - debug("Dialog %s header bar","have");
352   -
353   - GtkWidget * frame = v3270_dialog_create_frame(scrolled,_("Transfer queue"));
354   - gtk_box_pack_start(GTK_BOX(container),frame,TRUE,TRUE,0);
355   -
356   - widget->button.begin = gtk_button_new_from_icon_name("network-transmit",GTK_ICON_SIZE_SMALL_TOOLBAR);
357   - g_object_set(G_OBJECT(widget->button.begin),"margin-end",12,NULL);
358   - g_signal_connect(widget->button.begin,"clicked",G_CALLBACK(begin_clicked),widget);
359   -
360   - gtk_header_bar_pack_start(header,widget->button.begin);
361   - gtk_header_bar_pack_start(header,widget->queue.load);
362   - gtk_header_bar_pack_start(header,widget->queue.save);
363   - gtk_header_bar_pack_start(header,widget->queue.saveAs);
364   -
365   - }
366   - else
367   - {
368   - debug("Dialog %s header bar","don't have");
369   -
370   - GtkWidget * hBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,6);
371   - GtkWidget * frame = v3270_dialog_create_frame(hBox,_("Transfer queue"));
372   - gtk_box_pack_start(GTK_BOX(container),frame,TRUE,TRUE,0);
373   -
374   - GtkBox * box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL,6));
375   - gtk_box_pack_start(GTK_BOX(hBox),GTK_WIDGET(box),FALSE,FALSE,0);
376   -
377   - gtk_box_pack_start(box,widget->queue.load,FALSE,FALSE,0);
378   - gtk_box_pack_start(box,widget->queue.save,FALSE,FALSE,0);
379   - gtk_box_pack_start(box,widget->queue.saveAs,FALSE,FALSE,0);
380   -
381   - gtk_box_pack_start(GTK_BOX(hBox),GTK_WIDGET(scrolled),TRUE,TRUE,0);
382   -
383   - gtk_dialog_add_button(GTK_DIALOG (widget),_("_Cancel"),GTK_RESPONSE_CANCEL);
384   - widget->button.begin = gtk_dialog_add_button(GTK_DIALOG (widget),_("B_egin transfer"),GTK_RESPONSE_ACCEPT);
385   -
386   - }
387   -
388   - // gtk_widget_set_sensitive(widget->button.begin,FALSE);
389   - gtk_widget_set_tooltip_markup(widget->button.begin,_("Start transfer"));
390   - gtk_widget_set_sensitive(widget->button.begin,FALSE);
391   -
392   -/*
393   -#ifdef DEBUG
394   - GObject * activity = v3270_ft_activity_new();
395   -
396   - v3270_ft_activity_set_local_filename(activity,"local---");
397   - v3270_ft_activity_set_remote_filename(activity,"remote---");
398   - 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);
399   -
400   - v3270_activity_list_append(widget->queue.view,activity);
401   -#endif // DEBUG
402   -*/
403   -
404   - }
405   -
406   -
407   -}
408   -
409   -LIB3270_EXPORT GtkWidget * v3270_ft_dialog_new(GtkWidget *parent)
410   -{
411   - gboolean use_header;
412   - g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL);
413   -
414   - GtkWidget * dialog =
415   - GTK_WIDGET(g_object_new(
416   - GTK_TYPE_V3270_FT_DIALOG,
417   - "use-header-bar", (use_header ? 1 : 0),
418   - NULL
419   - ));
420   -
421   - if(parent)
422   - {
423   - gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gtk_widget_get_toplevel(parent)));
424   - gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
425   - gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE);
426   - }
427   -
428   - if(GTK_IS_V3270(parent))
429   - v3270_ft_dialog_set_session(dialog,v3270_get_session(parent));
430   -
431   - return dialog;
432   -}
433   -
434   -static void connect_changed(H3270 G_GNUC_UNUSED(*hSession), int state, void *widget)
435   -{
436   - V3270FTDialog * dialog = GTK_V3270_FT_DIALOG( ((GtkWidget *) widget) );
437   - gtk_widget_set_sensitive(dialog->button.begin,state ? TRUE : FALSE);
438   -}
439   -
440   -LIB3270_EXPORT void v3270_ft_dialog_set_session(GtkWidget *widget, H3270 *hSession)
441   -{
442   - V3270FTDialog * dialog = GTK_V3270_FT_DIALOG(widget);
443   -
444   - if(dialog->hSession && dialog->stHandle)
445   - {
446   - lib3270_unregister_schange(dialog->hSession,LIB3270_STATE_CONNECT,dialog->stHandle);
447   - dialog->stHandle = NULL;
448   - }
449   -
450   - dialog->hSession = hSession;
451   - dialog->stHandle = lib3270_register_schange(hSession,LIB3270_STATE_CONNECT,connect_changed,(void *) widget);
452   -
453   - gtk_widget_set_sensitive(dialog->button.begin,lib3270_is_connected(hSession) ? TRUE : FALSE);
454   -
455   -}
src/include/v3270/filetransfer.h
... ... @@ -132,19 +132,19 @@
132 132 LIB3270_EXPORT H3270FT * v3270_ft_activity_begin_transfer(GObject * object, H3270 *hSession, const char **message);
133 133  
134 134 // FT Dialog widget
135   - #define GTK_TYPE_V3270_FT_DIALOG (V3270FTDialog_get_type ())
136   - #define GTK_V3270_FT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270_FT_DIALOG, V3270FTDialog))
137   - #define GTK_V3270_FT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_V3270_FT_DIALOG, V3270FTDialogClass))
  135 + #define GTK_TYPE_V3270_FT_DIALOG (V3270FTSettingsDialog_get_type ())
  136 + #define GTK_V3270_FT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270_FT_DIALOG, V3270FTSettingsDialog))
  137 + #define GTK_v3270_ft_settings_dialog_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_V3270_FT_DIALOG, V3270FTSettingsDialogClass))
138 138 #define GTK_IS_V3270_FT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_V3270_FT_DIALOG))
139   - #define GTK_IS_V3270_FT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_V3270_FT_DIALOG))
140   - #define GTK_V3270_FT_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_V3270_FT_DIALOG, V3270FTDialogClass))
  139 + #define GTK_IS_v3270_ft_settings_dialog_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_V3270_FT_DIALOG))
  140 + #define GTK_v3270_ft_settings_dialog_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_V3270_FT_DIALOG, V3270FTSettingsDialogClass))
141 141  
142   - typedef struct _V3270FTDialog V3270FTDialog;
143   - typedef struct _V3270FTDialogClass V3270FTDialogClass;
  142 + typedef struct _V3270FTSettingsDialog V3270FTSettingsDialog;
  143 + typedef struct _V3270FTSettingsDialogClass V3270FTSettingsDialogClass;
144 144  
145   - LIB3270_EXPORT GtkWidget * v3270_ft_dialog_new(GtkWidget *parent);
146   - LIB3270_EXPORT void v3270_ft_dialog_set_session(GtkWidget *widget, H3270 *hSession);
147   - LIB3270_EXPORT int v3270_ft_dialog_append_activity(GtkWidget *widget, GObject *activity, GError **error);
  145 + LIB3270_EXPORT GtkWidget * v3270_ft_settings_dialog_new(GtkWidget *parent);
  146 + LIB3270_EXPORT void v3270_ft_settings_dialog_set_session(GtkWidget *widget, H3270 *hSession);
  147 + LIB3270_EXPORT int v3270_ft_settings_dialog_append_activity(GtkWidget *widget, GObject *activity, GError **error);
148 148  
149 149 G_END_DECLS
150 150  
... ...
src/testprogram/testprogram.c
... ... @@ -162,8 +162,8 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal)
162 162 //
163 163 // Test settings dialog
164 164 //
165   - GtkWidget * dialog = v3270_ft_dialog_new(terminal);
166   - v3270_ft_dialog_append_activity(dialog,activity,NULL);
  165 + GtkWidget * dialog = v3270_ft_settings_dialog_new(terminal);
  166 + v3270_ft_settings_dialog_append_activity(dialog,activity,NULL);
167 167 */
168 168  
169 169 //
... ...
v3270.cbp
... ... @@ -72,6 +72,9 @@
72 72 <Unit filename="src/dialogs/security.c">
73 73 <Option compilerVar="CC" />
74 74 </Unit>
  75 + <Unit filename="src/dialogs/settingsdialog.c">
  76 + <Option compilerVar="CC" />
  77 + </Unit>
75 78 <Unit filename="src/dialogs/tools.c">
76 79 <Option compilerVar="CC" />
77 80 </Unit>
... ... @@ -81,9 +84,6 @@
81 84 <Unit filename="src/filetransfer/activitylist.c">
82 85 <Option compilerVar="CC" />
83 86 </Unit>
84   - <Unit filename="src/filetransfer/dialog.c">
85   - <Option compilerVar="CC" />
86   - </Unit>
87 87 <Unit filename="src/filetransfer/filelist.c">
88 88 <Option compilerVar="CC" />
89 89 </Unit>
... ...