Commit 11b02b6b55f91e802a81d38c4e8d29dd56a64ec9

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

Host select widget is now a V3270Settings object.

src/dialogs/commondialog.c
@@ -28,6 +28,7 @@ @@ -28,6 +28,7 @@
28 */ 28 */
29 29
30 #include "private.h" 30 #include "private.h"
  31 + #include <v3270/dialogs.h>
31 32
32 /*--[ Implement ]------------------------------------------------------------------------------------*/ 33 /*--[ Implement ]------------------------------------------------------------------------------------*/
33 34
@@ -84,12 +85,25 @@ LIB3270_EXPORT GtkWidget * v3270_dialog_new(GtkWidget *widget, const gchar *titl @@ -84,12 +85,25 @@ LIB3270_EXPORT GtkWidget * v3270_dialog_new(GtkWidget *widget, const gchar *titl
84 gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); 85 gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE);
85 } 86 }
86 87
  88 + gtk_box_set_spacing(
  89 + GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
  90 + 18
  91 + );
  92 +
  93 + v3270_dialog_setup(dialog,title,apply);
  94 +
  95 + return dialog;
  96 +}
  97 +
  98 +LIB3270_EXPORT void v3270_dialog_setup(GtkWidget *dialog, const gchar *title, const gchar *apply)
  99 +{
  100 +
87 #if GTK_CHECK_VERSION(3,12,0) 101 #if GTK_CHECK_VERSION(3,12,0)
88 102
89 - if(use_header)  
90 - {  
91 - GtkWidget * header = gtk_dialog_get_header_bar(GTK_DIALOG(dialog)); 103 + GtkWidget * header = gtk_dialog_get_header_bar(GTK_DIALOG(dialog));
92 104
  105 + if(header)
  106 + {
93 gtk_header_bar_set_title(GTK_HEADER_BAR(header),title); 107 gtk_header_bar_set_title(GTK_HEADER_BAR(header),title);
94 gtk_header_bar_pack_start(GTK_HEADER_BAR(header),v3270_dialog_button_new(dialog,_("_Cancel"),G_CALLBACK(v3270_dialog_cancel))); 108 gtk_header_bar_pack_start(GTK_HEADER_BAR(header),v3270_dialog_button_new(dialog,_("_Cancel"),G_CALLBACK(v3270_dialog_cancel)));
95 gtk_header_bar_pack_end(GTK_HEADER_BAR(header),v3270_dialog_button_new(dialog,apply,G_CALLBACK(v3270_dialog_apply))); 109 gtk_header_bar_pack_end(GTK_HEADER_BAR(header),v3270_dialog_button_new(dialog,apply,G_CALLBACK(v3270_dialog_apply)));
@@ -98,11 +112,6 @@ LIB3270_EXPORT GtkWidget * v3270_dialog_new(GtkWidget *widget, const gchar *titl @@ -98,11 +112,6 @@ LIB3270_EXPORT GtkWidget * v3270_dialog_new(GtkWidget *widget, const gchar *titl
98 { 112 {
99 gtk_window_set_title(GTK_WINDOW(dialog), title); 113 gtk_window_set_title(GTK_WINDOW(dialog), title);
100 114
101 - gtk_box_set_spacing(  
102 - GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),  
103 - 18  
104 - );  
105 -  
106 gtk_dialog_add_buttons( 115 gtk_dialog_add_buttons(
107 GTK_DIALOG (dialog), 116 GTK_DIALOG (dialog),
108 _("_Cancel"), GTK_RESPONSE_CANCEL, 117 _("_Cancel"), GTK_RESPONSE_CANCEL,
@@ -129,7 +138,6 @@ LIB3270_EXPORT GtkWidget * v3270_dialog_new(GtkWidget *widget, const gchar *titl @@ -129,7 +138,6 @@ LIB3270_EXPORT GtkWidget * v3270_dialog_new(GtkWidget *widget, const gchar *titl
129 138
130 #endif // GTK 3.12 139 #endif // GTK 3.12
131 140
132 - return dialog;  
133 } 141 }
134 142
135 #if GTK_CHECK_VERSION(3,12,0) 143 #if GTK_CHECK_VERSION(3,12,0)
src/dialogs/hostselect.c
@@ -30,6 +30,7 @@ @@ -30,6 +30,7 @@
30 #include "private.h" 30 #include "private.h"
31 #include <hostselect.h> 31 #include <hostselect.h>
32 #include <v3270/dialogs.h> 32 #include <v3270/dialogs.h>
  33 + #include <v3270/settings.h>
33 #include <lib3270/log.h> 34 #include <lib3270/log.h>
34 35
35 /*--[ Widget definition ]----------------------------------------------------------------------------*/ 36 /*--[ Widget definition ]----------------------------------------------------------------------------*/
@@ -57,9 +58,7 @@ @@ -57,9 +58,7 @@
57 58
58 struct _V3270HostSelectWidget 59 struct _V3270HostSelectWidget
59 { 60 {
60 - GtkGrid parent;  
61 -  
62 - LIB3270_HOST_TYPE type; /**< @brief Connect option */ 61 + V3270Settings parent;
63 62
64 struct 63 struct
65 { 64 {
@@ -69,180 +68,86 @@ @@ -69,180 +68,86 @@
69 68
70 } input; 69 } input;
71 70
72 - unsigned short colors; /**< @brief Number of colors */  
73 - H3270 * hSession; /**< @brief lib3270's session handle */  
74 -  
75 }; 71 };
76 72
77 struct _V3270HostSelectWidgetClass 73 struct _V3270HostSelectWidgetClass
78 { 74 {
79 - GtkGridClass parent_class; 75 + V3270SettingsClass parent_class;
80 }; 76 };
81 77
82 78
83 - G_DEFINE_TYPE(V3270HostSelectWidget, V3270HostSelectWidget, GTK_TYPE_GRID); 79 + G_DEFINE_TYPE(V3270HostSelectWidget, V3270HostSelectWidget, GTK_TYPE_V3270_SETTINGS);
84 80
85 /*--[ Implement ]------------------------------------------------------------------------------------*/ 81 /*--[ Implement ]------------------------------------------------------------------------------------*/
86 82
87 -static void V3270HostSelectWidget_class_init(G_GNUC_UNUSED V3270HostSelectWidgetClass *klass)  
88 -{  
89 -}  
90 -  
91 -static void systype_changed(GtkComboBox *widget, V3270HostSelectWidget *dialog) 83 +static void apply(GtkWidget *w, GtkWidget *terminal)
92 { 84 {
93 - GValue value = { 0, };  
94 - GtkTreeIter iter;  
95 -  
96 - if(!gtk_combo_box_get_active_iter(widget,&iter))  
97 - return; 85 + debug("V3270HostSelectWidget::%s",__FUNCTION__);
98 86
99 - gtk_tree_model_get_value(gtk_combo_box_get_model(widget),&iter,1,&value);  
100 -  
101 - dialog->type = g_value_get_int(&value);  
102 -  
103 -}  
104 -  
105 -static void colortable_changed(GtkComboBox *widget, V3270HostSelectWidget *dialog)  
106 -{  
107 - GValue value = { 0, };  
108 - GtkTreeIter iter;  
109 -  
110 - if(!gtk_combo_box_get_active_iter(widget,&iter))  
111 - return;  
112 -  
113 - gtk_tree_model_get_value(gtk_combo_box_get_model(widget),&iter,1,&value);  
114 -  
115 - dialog->colors = g_value_get_int(&value);  
116 -  
117 -}  
118 -  
119 -static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget)  
120 -{  
121 - int f;  
122 -  
123 - // https://developer.gnome.org/hig/stable/visual-layout.html.en  
124 - gtk_grid_set_row_spacing(GTK_GRID(widget),6);  
125 - gtk_grid_set_column_spacing(GTK_GRID(widget),12); 87 + V3270HostSelectWidget *widget = GTK_V3270HostSelectWidget(w);
  88 + H3270 *hSession = v3270_get_session(terminal);
126 89
127 - // Entry fields  
128 - GtkWidget * label[ENTRY_COUNT] = 90 + // Apply URL
129 { 91 {
130 - gtk_label_new_with_mnemonic( _( "_Host" ) ),  
131 - gtk_label_new_with_mnemonic( _( "_Service" ) )  
132 - }; 92 + g_autofree gchar * url =
  93 + g_strconcat(
  94 + (gtk_toggle_button_get_active(widget->input.ssl) ? "tn3270s://" : "tn3270://"),
  95 + gtk_entry_get_text(widget->input.entry[ENTRY_HOSTNAME]),
  96 + ":",
  97 + gtk_entry_get_text(widget->input.entry[ENTRY_SRVCNAME]),
  98 + NULL
  99 + );
  100 +
  101 + debug("URL=[%s]",url);
  102 + lib3270_set_url(hSession,url);
133 103
134 - for(f=0;f<ENTRY_COUNT;f++)  
135 - {  
136 - widget->input.entry[f] = GTK_ENTRY(gtk_entry_new());  
137 - gtk_widget_set_halign(label[f],GTK_ALIGN_END);  
138 - gtk_label_set_mnemonic_widget(GTK_LABEL(label[f]),GTK_WIDGET(widget->input.entry[f]));  
139 } 104 }
140 105
141 - gtk_widget_set_tooltip_text(GTK_WIDGET(widget->input.entry[ENTRY_HOSTNAME]),_("Address or name of the host to connect.") );  
142 - gtk_widget_set_tooltip_text(GTK_WIDGET(widget->input.entry[ENTRY_SRVCNAME]),_("Port or service name (empty for \"telnet\").") );  
143 -  
144 - gtk_entry_set_max_length(widget->input.entry[ENTRY_HOSTNAME],0xFF);  
145 - gtk_entry_set_width_chars(widget->input.entry[ENTRY_HOSTNAME],50);  
146 -  
147 - gtk_entry_set_max_length(widget->input.entry[ENTRY_SRVCNAME],6);  
148 - gtk_entry_set_width_chars(widget->input.entry[ENTRY_SRVCNAME],7);  
149 -  
150 - gtk_entry_set_placeholder_text(widget->input.entry[ENTRY_SRVCNAME],"telnet");  
151 -  
152 - gtk_widget_set_hexpand(GTK_WIDGET(widget->input.entry[ENTRY_HOSTNAME]),TRUE);  
153 -  
154 - gtk_grid_attach(GTK_GRID(widget),label[0],0,0,1,1);  
155 - gtk_grid_attach(GTK_GRID(widget),GTK_WIDGET(widget->input.entry[ENTRY_HOSTNAME]),1,0,5,1);  
156 -  
157 - gtk_grid_attach(GTK_GRID(widget),label[1],0,1,1,1);  
158 - gtk_grid_attach(GTK_GRID(widget),GTK_WIDGET(widget->input.entry[ENTRY_SRVCNAME]),1,1,1,1);  
159 -  
160 - // gtk_widget_set_hexpand(GTK_WIDGET(widget->input.ssl),TRUE);  
161 -  
162 - // SSL checkbox 106 + // Apply Host type
163 { 107 {
164 - widget->input.ssl = GTK_TOGGLE_BUTTON(gtk_check_button_new_with_mnemonic(_( "_Secure connection." )));  
165 - gtk_widget_set_tooltip_text(GTK_WIDGET(widget->input.ssl),_( "Check for SSL secure connection." ));  
166 -  
167 - gtk_grid_attach(GTK_GRID(widget),GTK_WIDGET(widget->input.ssl),3,1,1,1);  
168 - } 108 + GtkTreeIter iter;
169 109
170 - // Host type  
171 - {  
172 - GtkTreeModel * model = (GtkTreeModel *) gtk_list_store_new(2,G_TYPE_STRING,G_TYPE_INT);  
173 - GtkCellRenderer * renderer = gtk_cell_renderer_text_new(); 110 + if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget->input.combo[0]), &iter))
  111 + {
  112 + GValue value = { 0, };
  113 + gtk_tree_model_get_value(gtk_combo_box_get_model(GTK_COMBO_BOX(widget->input.combo[0])),&iter,1,&value);
174 114
175 - widget->input.combo[0] = GTK_COMBO_BOX(gtk_combo_box_new_with_model(model)); 115 + lib3270_set_host_type(hSession,g_value_get_int(&value));
176 116
177 - gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget->input.combo[0]), renderer, TRUE);  
178 - gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(widget->input.combo[0]), renderer, "text", 0, NULL); 117 + g_value_unset(&value);
179 118
180 - const LIB3270_HOST_TYPE_ENTRY *entry = lib3270_get_option_list();  
181 - for(f=0;entry[f].name != NULL;f++)  
182 - {  
183 - GtkTreeIter iter;  
184 - gtk_list_store_append((GtkListStore *) model,&iter);  
185 - gtk_list_store_set((GtkListStore *) model, &iter, 0, gettext(entry[f].description), 1, entry[f].type, -1);  
186 } 119 }
187 120
188 - g_signal_connect(G_OBJECT(widget->input.combo[0]),"changed",G_CALLBACK(systype_changed),widget);  
189 -  
190 } 121 }
191 122
192 - // Color table 123 + // Apply color type
193 { 124 {
194 - GtkTreeModel * model = (GtkTreeModel *) gtk_list_store_new(2,G_TYPE_STRING,G_TYPE_INT);  
195 - GtkCellRenderer * renderer = gtk_cell_renderer_text_new();  
196 -  
197 - widget->input.combo[1] = GTK_COMBO_BOX(gtk_combo_box_new_with_model(model)); 125 + GtkTreeIter iter;
198 126
199 - gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget->input.combo[1]), renderer, TRUE);  
200 - gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(widget->input.combo[1]), renderer, "text", 0, NULL);  
201 -  
202 - for(f=0;f< (int) G_N_ELEMENTS(colortable);f++) 127 + if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget->input.combo[1]), &iter))
203 { 128 {
204 - GtkTreeIter iter;  
205 - gtk_list_store_append((GtkListStore *) model,&iter);  
206 - gtk_list_store_set((GtkListStore *) model, &iter, 0, gettext(colortable[f].description), 1, colortable[f].colors, -1);  
207 - }  
208 -  
209 - g_signal_connect(G_OBJECT(widget->input.combo[1]),"changed",G_CALLBACK(colortable_changed),widget);  
210 -  
211 - }  
212 -  
213 - // Host options  
214 - for(f=0;f< (int) G_N_ELEMENTS(comboLabel);f++)  
215 - {  
216 - GtkWidget *label = gtk_label_new_with_mnemonic(gettext(comboLabel[f]));  
217 - gtk_widget_set_halign(label,GTK_ALIGN_END);  
218 - gtk_grid_attach(GTK_GRID(widget),label,0,f+2,1,1);  
219 - gtk_grid_attach(GTK_GRID(widget),GTK_WIDGET(widget->input.combo[f]),1,f+2,2,1);  
220 - } 129 + GValue value = { 0, };
221 130
222 - gtk_widget_show_all(GTK_WIDGET(widget)); 131 + gtk_tree_model_get_value(gtk_combo_box_get_model(GTK_COMBO_BOX(widget->input.combo[1])),&iter,1,&value);
223 132
224 -} 133 + lib3270_set_color_type(hSession,g_value_get_int(&value));
225 134
226 -LIB3270_EXPORT GtkWidget * v3270_host_select_new(GtkWidget *widget)  
227 -{  
228 - g_return_val_if_fail(GTK_IS_V3270(widget),NULL); 135 + g_value_unset(&value);
229 136
230 - GtkWidget * selector = GTK_WIDGET(g_object_new(GTK_TYPE_V3270HostSelectWidget, NULL)); 137 + }
231 138
232 - v3270_host_select_set_session(selector,widget); 139 + }
233 140
234 - return selector;  
235 } 141 }
236 142
237 -LIB3270_EXPORT void v3270_host_select_set_session(GtkWidget *w, GtkWidget *session) 143 +static void load(GtkWidget *w, GtkWidget *terminal)
238 { 144 {
239 - g_return_if_fail(GTK_IS_V3270(session));  
240 - g_return_if_fail(GTK_IS_V3270HostSelectWidget(w)); 145 + debug("V3270HostSelectWidget::%s",__FUNCTION__);
241 146
  147 + H3270 *hSession = v3270_get_session(terminal);
242 V3270HostSelectWidget *widget = GTK_V3270HostSelectWidget(w); 148 V3270HostSelectWidget *widget = GTK_V3270HostSelectWidget(w);
243 - widget->hSession = v3270_get_session(session);  
244 149
245 - const gchar * u = lib3270_get_url(widget->hSession); 150 + const gchar * u = lib3270_get_url(hSession);
246 151
247 if(u) 152 if(u)
248 { 153 {
@@ -250,6 +155,8 @@ LIB3270_EXPORT void v3270_host_select_set_session(GtkWidget *w, GtkWidget *sessi @@ -250,6 +155,8 @@ LIB3270_EXPORT void v3270_host_select_set_session(GtkWidget *w, GtkWidget *sessi
250 g_autofree gchar * url = g_strdup(u); 155 g_autofree gchar * url = g_strdup(u);
251 debug("URL=[%s]",url); 156 debug("URL=[%s]",url);
252 157
  158 + gtk_toggle_button_set_active(widget->input.ssl,g_str_has_prefix(u,"tn3270s"));
  159 +
253 gchar *hostname = strstr(url,"://"); 160 gchar *hostname = strstr(url,"://");
254 if(!hostname) 161 if(!hostname)
255 { 162 {
@@ -277,9 +184,7 @@ LIB3270_EXPORT void v3270_host_select_set_session(GtkWidget *w, GtkWidget *sessi @@ -277,9 +184,7 @@ LIB3270_EXPORT void v3270_host_select_set_session(GtkWidget *w, GtkWidget *sessi
277 184
278 } 185 }
279 186
280 - LIB3270_HOST_TYPE type = lib3270_get_host_type(widget->hSession);  
281 -  
282 - gtk_toggle_button_set_active(widget->input.ssl,lib3270_get_secure_host(widget->hSession) != 0); 187 + LIB3270_HOST_TYPE type = lib3270_get_host_type(hSession);
283 188
284 // Set host type 189 // Set host type
285 { 190 {
@@ -308,7 +213,7 @@ LIB3270_EXPORT void v3270_host_select_set_session(GtkWidget *w, GtkWidget *sessi @@ -308,7 +213,7 @@ LIB3270_EXPORT void v3270_host_select_set_session(GtkWidget *w, GtkWidget *sessi
308 { 213 {
309 GtkTreeModel * model = gtk_combo_box_get_model(widget->input.combo[1]); 214 GtkTreeModel * model = gtk_combo_box_get_model(widget->input.combo[1]);
310 GtkTreeIter iter; 215 GtkTreeIter iter;
311 - int colors = (int) lib3270_get_color_type(widget->hSession); 216 + int colors = (int) lib3270_get_color_type(hSession);
312 217
313 if(gtk_tree_model_get_iter_first(model,&iter)) 218 if(gtk_tree_model_get_iter_first(model,&iter))
314 { 219 {
@@ -328,9 +233,115 @@ LIB3270_EXPORT void v3270_host_select_set_session(GtkWidget *w, GtkWidget *sessi @@ -328,9 +233,115 @@ LIB3270_EXPORT void v3270_host_select_set_session(GtkWidget *w, GtkWidget *sessi
328 } 233 }
329 } 234 }
330 235
331 - // Just in case  
332 - widget->type = type; 236 +}
  237 +
333 238
  239 +static void V3270HostSelectWidget_class_init(G_GNUC_UNUSED V3270HostSelectWidgetClass *klass)
  240 +{
  241 + GTK_V3270_SETTINGS_CLASS(klass)->apply = apply;
  242 + GTK_V3270_SETTINGS_CLASS(klass)->load = load;
  243 +}
  244 +
  245 +static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget)
  246 +{
  247 + int f;
  248 +
  249 + // Entry fields
  250 + GtkWidget * label[ENTRY_COUNT] =
  251 + {
  252 + gtk_label_new_with_mnemonic( _( "_Host" ) ),
  253 + gtk_label_new_with_mnemonic( _( "_Service" ) )
  254 + };
  255 +
  256 + for(f=0;f<ENTRY_COUNT;f++)
  257 + {
  258 + widget->input.entry[f] = GTK_ENTRY(gtk_entry_new());
  259 + gtk_widget_set_halign(label[f],GTK_ALIGN_END);
  260 + gtk_label_set_mnemonic_widget(GTK_LABEL(label[f]),GTK_WIDGET(widget->input.entry[f]));
  261 + }
  262 +
  263 + gtk_widget_set_tooltip_text(GTK_WIDGET(widget->input.entry[ENTRY_HOSTNAME]),_("Address or name of the host to connect.") );
  264 + gtk_widget_set_tooltip_text(GTK_WIDGET(widget->input.entry[ENTRY_SRVCNAME]),_("Port or service name (empty for \"telnet\").") );
  265 +
  266 + gtk_entry_set_max_length(widget->input.entry[ENTRY_HOSTNAME],0xFF);
  267 + gtk_entry_set_width_chars(widget->input.entry[ENTRY_HOSTNAME],50);
  268 +
  269 + gtk_entry_set_max_length(widget->input.entry[ENTRY_SRVCNAME],6);
  270 + gtk_entry_set_width_chars(widget->input.entry[ENTRY_SRVCNAME],7);
  271 +
  272 + gtk_entry_set_placeholder_text(widget->input.entry[ENTRY_SRVCNAME],"telnet");
  273 +
  274 + gtk_widget_set_hexpand(GTK_WIDGET(widget->input.entry[ENTRY_HOSTNAME]),TRUE);
  275 +
  276 + gtk_grid_attach(GTK_GRID(widget),label[0],0,0,1,1);
  277 + gtk_grid_attach(GTK_GRID(widget),GTK_WIDGET(widget->input.entry[ENTRY_HOSTNAME]),1,0,5,1);
  278 +
  279 + gtk_grid_attach(GTK_GRID(widget),label[1],0,1,1,1);
  280 + gtk_grid_attach(GTK_GRID(widget),GTK_WIDGET(widget->input.entry[ENTRY_SRVCNAME]),1,1,1,1);
  281 +
  282 + // SSL checkbox
  283 + {
  284 + widget->input.ssl = GTK_TOGGLE_BUTTON(gtk_check_button_new_with_mnemonic(_( "_Secure connection." )));
  285 + gtk_widget_set_tooltip_text(GTK_WIDGET(widget->input.ssl),_( "Check for SSL secure connection." ));
  286 +
  287 + gtk_grid_attach(GTK_GRID(widget),GTK_WIDGET(widget->input.ssl),3,1,1,1);
  288 + }
  289 +
  290 + // Host type
  291 + {
  292 + GtkTreeModel * model = (GtkTreeModel *) gtk_list_store_new(2,G_TYPE_STRING,G_TYPE_INT);
  293 + GtkCellRenderer * renderer = gtk_cell_renderer_text_new();
  294 +
  295 + widget->input.combo[0] = GTK_COMBO_BOX(gtk_combo_box_new_with_model(model));
  296 +
  297 + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget->input.combo[0]), renderer, TRUE);
  298 + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(widget->input.combo[0]), renderer, "text", 0, NULL);
  299 +
  300 + const LIB3270_HOST_TYPE_ENTRY *entry = lib3270_get_option_list();
  301 + for(f=0;entry[f].name != NULL;f++)
  302 + {
  303 + GtkTreeIter iter;
  304 + gtk_list_store_append((GtkListStore *) model,&iter);
  305 + gtk_list_store_set((GtkListStore *) model, &iter, 0, gettext(entry[f].description), 1, entry[f].type, -1);
  306 + }
  307 +
  308 + }
  309 +
  310 + // Color table
  311 + {
  312 + GtkTreeModel * model = (GtkTreeModel *) gtk_list_store_new(2,G_TYPE_STRING,G_TYPE_INT);
  313 + GtkCellRenderer * renderer = gtk_cell_renderer_text_new();
  314 +
  315 + widget->input.combo[1] = GTK_COMBO_BOX(gtk_combo_box_new_with_model(model));
  316 +
  317 + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget->input.combo[1]), renderer, TRUE);
  318 + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(widget->input.combo[1]), renderer, "text", 0, NULL);
  319 +
  320 + for(f=0;f< (int) G_N_ELEMENTS(colortable);f++)
  321 + {
  322 + GtkTreeIter iter;
  323 + gtk_list_store_append((GtkListStore *) model,&iter);
  324 + gtk_list_store_set((GtkListStore *) model, &iter, 0, gettext(colortable[f].description), 1, colortable[f].colors, -1);
  325 + }
  326 +
  327 + }
  328 +
  329 + // Host options
  330 + for(f=0;f< (int) G_N_ELEMENTS(comboLabel);f++)
  331 + {
  332 + GtkWidget *label = gtk_label_new_with_mnemonic(gettext(comboLabel[f]));
  333 + gtk_widget_set_halign(label,GTK_ALIGN_END);
  334 + gtk_grid_attach(GTK_GRID(widget),label,0,f+2,1,1);
  335 + gtk_grid_attach(GTK_GRID(widget),GTK_WIDGET(widget->input.combo[f]),1,f+2,2,1);
  336 + }
  337 +
  338 + gtk_widget_show_all(GTK_WIDGET(widget));
  339 +
  340 +}
  341 +
  342 +LIB3270_EXPORT GtkWidget * v3270_host_select_new()
  343 +{
  344 + return GTK_WIDGET(g_object_new(GTK_TYPE_V3270HostSelectWidget, NULL));
334 } 345 }
335 346
336 LIB3270_EXPORT void v3270_select_host(GtkWidget *widget) 347 LIB3270_EXPORT void v3270_select_host(GtkWidget *widget)
@@ -343,64 +354,36 @@ LIB3270_EXPORT void v3270_select_host(GtkWidget *widget) @@ -343,64 +354,36 @@ LIB3270_EXPORT void v3270_select_host(GtkWidget *widget)
343 return; 354 return;
344 } 355 }
345 356
346 - GtkWidget * dialog = v3270_host_select_new(widget);  
347 - GtkWidget * win = v3270_dialog_new(widget, _("Setup host"), _("C_onnect")); 357 + debug("V3270HostSelectWidget::%s",__FUNCTION__);
  358 +
  359 + GtkWidget * dialog = v3270_settings_dialog_new(widget, v3270_host_select_new());
348 360
349 - gtk_window_set_default_size(GTK_WINDOW(win), 700, 150); 361 + v3270_dialog_setup(dialog,_("Setup host"),_("C_onnect"));
350 362
351 - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(win))),dialog,FALSE,FALSE,2); 363 + gtk_window_set_default_size(GTK_WINDOW(dialog), 700, 150);
352 gtk_widget_show_all(dialog); 364 gtk_widget_show_all(dialog);
353 365
354 gboolean again = TRUE; 366 gboolean again = TRUE;
355 while(again) 367 while(again)
356 { 368 {
357 - gtk_widget_set_sensitive(win,TRUE); 369 + gtk_widget_set_sensitive(dialog,TRUE);
  370 + gtk_widget_set_visible(dialog,TRUE);
358 371
359 - gtk_widget_set_visible(win,TRUE);  
360 -  
361 - switch(gtk_dialog_run(GTK_DIALOG(win))) 372 + switch(gtk_dialog_run(GTK_DIALOG(dialog)))
362 { 373 {
363 case GTK_RESPONSE_APPLY: 374 case GTK_RESPONSE_APPLY:
364 - gtk_widget_set_visible(win,FALSE);  
365 - gtk_widget_set_sensitive(win,FALSE);  
366 - again = v3270_host_select_apply(dialog) != 0; 375 + debug("V3270HostSelectWidget::%s=%s",__FUNCTION__,"GTK_RESPONSE_APPLY");
  376 + again = lib3270_reconnect(v3270_get_session(widget),0);
367 break; 377 break;
368 378
369 case GTK_RESPONSE_CANCEL: 379 case GTK_RESPONSE_CANCEL:
370 again = FALSE; 380 again = FALSE;
  381 + debug("V3270HostSelectWidget::%s=%s",__FUNCTION__,"GTK_RESPONSE_CANCEL");
371 break; 382 break;
372 } 383 }
373 } 384 }
374 385
375 - gtk_widget_destroy(win);  
376 -  
377 -}  
378 -  
379 -int v3270_host_select_apply(GtkWidget *w)  
380 -{  
381 - g_return_val_if_fail(GTK_IS_V3270HostSelectWidget(w),EINVAL);  
382 -  
383 - V3270HostSelectWidget *widget = GTK_V3270HostSelectWidget(w);  
384 -  
385 - g_autofree gchar * url =  
386 - g_strconcat(  
387 - (gtk_toggle_button_get_active(widget->input.ssl) ? "tn3270s://" : "tn3270://"),  
388 - gtk_entry_get_text(widget->input.entry[ENTRY_HOSTNAME]),  
389 - ":",  
390 - gtk_entry_get_text(widget->input.entry[ENTRY_SRVCNAME]),  
391 - NULL  
392 - );  
393 -  
394 - debug("URL=[%s]",url);  
395 - lib3270_set_url(widget->hSession,url);  
396 -  
397 - /*  
398 - lib3270_set_hostname(widget->hSession,gtk_entry_get_text(widget->input.entry[ENTRY_HOSTNAME]));  
399 - lib3270_set_srvcname(widget->hSession,gtk_entry_get_text(widget->input.entry[ENTRY_SRVCNAME]));  
400 - */  
401 -  
402 - lib3270_set_host_type(widget->hSession,widget->type);  
403 - return lib3270_reconnect(widget->hSession,0); 386 + debug("%s end",__FUNCTION__);
  387 + gtk_widget_destroy(dialog);
404 388
405 } 389 }
406 -  
src/dialogs/settings.c
@@ -37,23 +37,34 @@ @@ -37,23 +37,34 @@
37 37
38 static void apply(GtkWidget G_GNUC_UNUSED(*widget), GtkWidget G_GNUC_UNUSED(*terminal)) 38 static void apply(GtkWidget G_GNUC_UNUSED(*widget), GtkWidget G_GNUC_UNUSED(*terminal))
39 { 39 {
40 - 40 + debug("V3270Settings::%s",__FUNCTION__);
41 } 41 }
42 42
43 -static void revert(GtkWidget G_GNUC_UNUSED(*widget), GtkWidget G_GNUC_UNUSED(*terminal)) 43 +static void cancel(GtkWidget G_GNUC_UNUSED(*widget), GtkWidget G_GNUC_UNUSED(*terminal))
44 { 44 {
  45 + debug("V3270Settings::%s",__FUNCTION__);
  46 +}
45 47
  48 +static void load(GtkWidget G_GNUC_UNUSED(*widget), GtkWidget G_GNUC_UNUSED(*terminal))
  49 +{
  50 + debug("V3270Settings::%s",__FUNCTION__);
46 } 51 }
47 52
48 static void V3270Settings_class_init(V3270SettingsClass *klass) 53 static void V3270Settings_class_init(V3270SettingsClass *klass)
49 { 54 {
50 klass->apply = apply; 55 klass->apply = apply;
51 - klass->revert = revert; 56 + klass->cancel = cancel;
  57 + klass->load = load;
52 } 58 }
53 59
54 static void V3270Settings_init(V3270Settings *widget) 60 static void V3270Settings_init(V3270Settings *widget)
55 { 61 {
56 widget->terminal = NULL; 62 widget->terminal = NULL;
  63 +
  64 + // https://developer.gnome.org/hig/stable/visual-layout.html.en
  65 + gtk_grid_set_row_spacing(GTK_GRID(widget),6);
  66 + gtk_grid_set_column_spacing(GTK_GRID(widget),12);
  67 +
57 } 68 }
58 69
59 LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWidget *terminal) 70 LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWidget *terminal)
@@ -71,13 +82,13 @@ LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWid @@ -71,13 +82,13 @@ LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWid
71 GTK_V3270_SETTINGS_GET_CLASS(widget)->apply(widget,GTK_V3270_SETTINGS(widget)->terminal); 82 GTK_V3270_SETTINGS_GET_CLASS(widget)->apply(widget,GTK_V3270_SETTINGS(widget)->terminal);
72 } 83 }
73 84
74 - LIB3270_EXPORT void v3270_settings_revert(GtkWidget *widget) 85 + LIB3270_EXPORT void v3270_settings_cancel(GtkWidget *widget)
75 { 86 {
76 g_return_if_fail(GTK_IS_V3270_SETTINGS(widget)); 87 g_return_if_fail(GTK_IS_V3270_SETTINGS(widget));
77 - GTK_V3270_SETTINGS_GET_CLASS(widget)->revert(widget,GTK_V3270_SETTINGS(widget)->terminal); 88 + GTK_V3270_SETTINGS_GET_CLASS(widget)->cancel(widget,GTK_V3270_SETTINGS(widget)->terminal);
78 } 89 }
79 90
80 - void on_response(GtkDialog G_GNUC_UNUSED(*dialog), gint response_id, GtkWidget *settings) 91 + LIB3270_EXPORT void v3270_settings_on_dialog_response(GtkDialog G_GNUC_UNUSED(*dialog), gint response_id, GtkWidget *settings)
81 { 92 {
82 switch(response_id) 93 switch(response_id)
83 { 94 {
@@ -86,14 +97,13 @@ LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWid @@ -86,14 +97,13 @@ LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWid
86 break; 97 break;
87 98
88 case GTK_RESPONSE_CANCEL: 99 case GTK_RESPONSE_CANCEL:
89 - v3270_settings_revert(settings); 100 + v3270_settings_cancel(settings);
90 break; 101 break;
91 102
92 } 103 }
93 -  
94 } 104 }
95 105
96 - LIB3270_EXPORT GtkWidget * v3270_settings_dialog_nwidgetew(GtkWidget *terminal, GtkWidget *settings) 106 + LIB3270_EXPORT GtkWidget * v3270_settings_dialog_new(GtkWidget *terminal, GtkWidget *settings)
97 { 107 {
98 #if GTK_CHECK_VERSION(3,12,0) 108 #if GTK_CHECK_VERSION(3,12,0)
99 109
@@ -113,10 +123,18 @@ LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWid @@ -113,10 +123,18 @@ LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWid
113 123
114 #endif // GTK 3.12 124 #endif // GTK 3.12
115 125
116 - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),settings,FALSE,FALSE,2); 126 + GtkWidget * content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
  127 +
  128 + // https://developer.gnome.org/hig/stable/visual-layout.html.en
  129 + gtk_box_set_spacing(
  130 + GTK_BOX(content_area),
  131 + 18
  132 + );
  133 +
  134 + gtk_box_pack_start(GTK_BOX(content_area),settings,FALSE,FALSE,2);
117 v3270_settings_set_terminal_widget(settings,terminal); 135 v3270_settings_set_terminal_widget(settings,terminal);
118 136
119 - g_signal_connect(G_OBJECT(dialog),"response",G_CALLBACK(on_response),settings); 137 + g_signal_connect(G_OBJECT(dialog),"response",G_CALLBACK(v3270_settings_on_dialog_response),settings);
120 138
121 gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE); 139 gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE);
122 140
@@ -127,6 +145,5 @@ LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWid @@ -127,6 +145,5 @@ LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWid
127 gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); 145 gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
128 gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); 146 gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE);
129 147
130 -  
131 return dialog; 148 return dialog;
132 } 149 }
src/include/v3270/dialogs.h
@@ -35,9 +35,10 @@ @@ -35,9 +35,10 @@
35 35
36 G_BEGIN_DECLS 36 G_BEGIN_DECLS
37 37
38 - LIB3270_EXPORT GtkWidget * v3270_host_select_new(GtkWidget *widget); 38 + LIB3270_EXPORT GtkWidget * v3270_host_select_new();
39 LIB3270_EXPORT GtkWidget * v3270_dialog_new(GtkWidget *widget, const gchar *title, const gchar *apply); 39 LIB3270_EXPORT GtkWidget * v3270_dialog_new(GtkWidget *widget, const gchar *title, const gchar *apply);
40 LIB3270_EXPORT void v3270_error_popup(GtkWidget *widget, const gchar *title, const gchar *summary, const gchar *body); 40 LIB3270_EXPORT void v3270_error_popup(GtkWidget *widget, const gchar *title, const gchar *summary, const gchar *body);
  41 + LIB3270_EXPORT void v3270_dialog_setup(GtkWidget *dialog, const gchar *title, const gchar *apply);
41 42
42 LIB3270_EXPORT GtkWidget * v3270_save_dialog_new(GtkWidget *widget, LIB3270_CONTENT_OPTION mode, const gchar *filename); 43 LIB3270_EXPORT GtkWidget * v3270_save_dialog_new(GtkWidget *widget, LIB3270_CONTENT_OPTION mode, const gchar *filename);
43 LIB3270_EXPORT void v3270_save_dialog_run(GtkWidget *widget); 44 LIB3270_EXPORT void v3270_save_dialog_run(GtkWidget *widget);
src/include/v3270/settings.h
@@ -37,7 +37,7 @@ @@ -37,7 +37,7 @@
37 37
38 /*--[ Progress widget ]------------------------------------------------------------------------------*/ 38 /*--[ Progress widget ]------------------------------------------------------------------------------*/
39 39
40 - #define GTK_TYPE_V3270_SETTINGS (V3270Settings_get_type ()) 40 + #define GTK_TYPE_V3270_SETTINGS (V3270Settings_get_type())
41 #define GTK_V3270_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270_SETTINGS, V3270Settings)) 41 #define GTK_V3270_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270_SETTINGS, V3270Settings))
42 #define GTK_V3270_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_V3270_SETTINGS, V3270SettingsClass)) 42 #define GTK_V3270_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_V3270_SETTINGS, V3270SettingsClass))
43 #define GTK_IS_V3270_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_V3270_SETTINGS)) 43 #define GTK_IS_V3270_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_V3270_SETTINGS))
@@ -52,17 +52,21 @@ @@ -52,17 +52,21 @@
52 typedef struct _V3270SettingsClass { 52 typedef struct _V3270SettingsClass {
53 GtkGridClass parent_class; 53 GtkGridClass parent_class;
54 54
55 - void (*load)(GtkWidget *widget, GtkWidget *terminal);  
56 - void (*apply)(GtkWidget *widget, GtkWidget *terminal);  
57 - void (*revert)(GtkWidget *widget, GtkWidget *terminal); 55 + void (*load)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method to load the properties from terminal widget
  56 + void (*apply)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method for GTK_RESPONSE_APPLY
  57 + void (*cancel)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method for GTK_RESPONSE_CANCEL
58 58
59 } V3270SettingsClass; 59 } V3270SettingsClass;
60 60
61 /*--[ Prototypes ]-----------------------------------------------------------------------------------*/ 61 /*--[ Prototypes ]-----------------------------------------------------------------------------------*/
62 62
63 LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWidget *terminal); 63 LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWidget *terminal);
  64 + LIB3270_EXPORT GType V3270Settings_get_type(void);
64 LIB3270_EXPORT void v3270_settings_apply(GtkWidget *widget); 65 LIB3270_EXPORT void v3270_settings_apply(GtkWidget *widget);
65 - LIB3270_EXPORT void v3270_settings_revert(GtkWidget *widget); 66 + LIB3270_EXPORT void v3270_settings_cancel(GtkWidget *widget);
  67 +
  68 + /// @brief Callback for GtkDialog's "response" signal.
  69 + LIB3270_EXPORT void v3270_settings_on_dialog_response(GtkDialog *dialog, gint response_id, GtkWidget *settings);
66 70
67 LIB3270_EXPORT GtkWidget * v3270_settings_dialog_new(GtkWidget *terminal, GtkWidget *settings); 71 LIB3270_EXPORT GtkWidget * v3270_settings_dialog_new(GtkWidget *terminal, GtkWidget *settings);
68 // LIB3270_EXPORT gint v3270_settings_dialog_run(GtkWidget *widget, GtkWidget *terminal); 72 // LIB3270_EXPORT gint v3270_settings_dialog_run(GtkWidget *widget, GtkWidget *terminal);