Commit ba685fa9ff8b15829de4af61b604785cc209ff80

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

Still refactoring the host properties dialog widget.

Showing 1 changed file with 221 additions and 125 deletions   Show diff stats
src/dialogs/hostselect.c
@@ -191,6 +191,7 @@ @@ -191,6 +191,7 @@
191 GtkEntry * entry[G_N_ELEMENTS(entryfields)]; ///< @brief Entry fields for host & service name 191 GtkEntry * entry[G_N_ELEMENTS(entryfields)]; ///< @brief Entry fields for host & service name
192 GtkToggleButton * ssl; ///< @brief SSL Connection? 192 GtkToggleButton * ssl; ///< @brief SSL Connection?
193 GtkComboBox * combos[G_N_ELEMENTS(combos)]; ///< @brief Combo-boxes 193 GtkComboBox * combos[G_N_ELEMENTS(combos)]; ///< @brief Combo-boxes
  194 + GtkComboBox * charset; ///< @brief Charset combo box
194 195
195 } input; 196 } input;
196 197
@@ -201,130 +202,13 @@ @@ -201,130 +202,13 @@
201 V3270SettingsClass parent_class; 202 V3270SettingsClass parent_class;
202 }; 203 };
203 204
  205 + static void load(GtkWidget *w, GtkWidget *terminal);
  206 + static void apply(GtkWidget *w, GtkWidget *terminal);
204 207
205 G_DEFINE_TYPE(V3270HostSelectWidget, V3270HostSelectWidget, GTK_TYPE_V3270_SETTINGS); 208 G_DEFINE_TYPE(V3270HostSelectWidget, V3270HostSelectWidget, GTK_TYPE_V3270_SETTINGS);
206 209
207 /*--[ Implement ]------------------------------------------------------------------------------------*/ 210 /*--[ Implement ]------------------------------------------------------------------------------------*/
208 211
209 -static void apply(GtkWidget *w, GtkWidget *terminal)  
210 -{  
211 - debug("V3270HostSelectWidget::%s",__FUNCTION__);  
212 -  
213 - V3270HostSelectWidget *widget = GTK_V3270HostSelectWidget(w);  
214 - H3270 *hSession = v3270_get_session(terminal);  
215 -  
216 - // Apply URL  
217 - {  
218 - g_autofree gchar * url =  
219 - g_strconcat(  
220 - (gtk_toggle_button_get_active(widget->input.ssl) ? "tn3270s://" : "tn3270://"),  
221 - gtk_entry_get_text(widget->input.entry[ENTRY_HOSTNAME]),  
222 - ":",  
223 - gtk_entry_get_text(widget->input.entry[ENTRY_SRVCNAME]),  
224 - NULL  
225 - );  
226 -  
227 - debug("URL=[%s]",url);  
228 - lib3270_set_url(hSession,url);  
229 -  
230 - }  
231 -  
232 - // Apply combos.  
233 - size_t combo;  
234 - for(combo = 0; combo < G_N_ELEMENTS(combos); combo++)  
235 - {  
236 - GtkTreeIter iter;  
237 -  
238 - if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget->input.combos[combo]), &iter))  
239 - {  
240 - GValue value = { 0, };  
241 - gtk_tree_model_get_value(gtk_combo_box_get_model(GTK_COMBO_BOX(widget->input.combos[combo])),&iter,1,&value);  
242 -  
243 - combos[combo].set(hSession,g_value_get_uint(&value));  
244 -  
245 - g_value_unset(&value);  
246 -  
247 - }  
248 - }  
249 -  
250 -}  
251 -  
252 -static void load(GtkWidget *w, GtkWidget *terminal)  
253 -{  
254 - debug("V3270HostSelectWidget::%s",__FUNCTION__);  
255 -  
256 - H3270 *hSession = v3270_get_session(terminal);  
257 - V3270HostSelectWidget *widget = GTK_V3270HostSelectWidget(w);  
258 -  
259 - const gchar * u = lib3270_get_url(hSession);  
260 -  
261 - if(u)  
262 - {  
263 -  
264 - g_autofree gchar * url = g_strdup(u);  
265 - debug("URL=[%s]",url);  
266 -  
267 - gtk_toggle_button_set_active(widget->input.ssl,g_str_has_prefix(u,"tn3270s"));  
268 -  
269 - gchar *hostname = strstr(url,"://");  
270 - if(!hostname)  
271 - {  
272 - g_message("Invalid URL: \"%s\" (no scheme)",url);  
273 - }  
274 - else  
275 - {  
276 - hostname += 3;  
277 -  
278 - gchar *srvcname = strchr(hostname,':');  
279 -  
280 - if(srvcname)  
281 - {  
282 - *(srvcname++) = 0;  
283 - }  
284 - else  
285 - {  
286 - srvcname = "telnet";  
287 - }  
288 -  
289 - gtk_entry_set_text(widget->input.entry[ENTRY_HOSTNAME],hostname);  
290 - gtk_entry_set_text(widget->input.entry[ENTRY_SRVCNAME],srvcname);  
291 -  
292 - }  
293 -  
294 - }  
295 -  
296 - size_t combo;  
297 - for(combo = 0; combo < G_N_ELEMENTS(combos); combo++)  
298 - {  
299 -  
300 - GtkTreeModel * model = gtk_combo_box_get_model(widget->input.combos[combo]);  
301 - GtkTreeIter iter;  
302 - unsigned int value = combos[combo].get(hSession);  
303 -  
304 - if(gtk_tree_model_get_iter_first(model,&iter))  
305 - {  
306 - do  
307 - {  
308 - GValue gVal = { 0, };  
309 - gtk_tree_model_get_value(model,&iter,1,&gVal);  
310 - guint iVal = g_value_get_uint(&gVal);  
311 - g_value_unset(&gVal);  
312 -  
313 - if(iVal == value)  
314 - {  
315 - gtk_combo_box_set_active_iter(widget->input.combos[combo],&iter);  
316 - break;  
317 - }  
318 -  
319 - } while(gtk_tree_model_iter_next(model,&iter));  
320 -  
321 -  
322 - }  
323 -  
324 - }  
325 -  
326 -}  
327 -  
328 static void update_message(GtkWidget *widget, GtkWidget *terminal) 212 static void update_message(GtkWidget *widget, GtkWidget *terminal)
329 { 213 {
330 gtk_widget_set_sensitive(widget, lib3270_is_disconnected(v3270_get_session(terminal))); 214 gtk_widget_set_sensitive(widget, lib3270_is_disconnected(v3270_get_session(terminal)));
@@ -342,6 +226,9 @@ static void V3270HostSelectWidget_class_init(G_GNUC_UNUSED V3270HostSelectWidget @@ -342,6 +226,9 @@ static void V3270HostSelectWidget_class_init(G_GNUC_UNUSED V3270HostSelectWidget
342 226
343 static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget) 227 static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget)
344 { 228 {
  229 + // Cell renderer
  230 + GtkCellRenderer * text_renderer = gtk_cell_renderer_text_new();
  231 +
345 // Connection properties 232 // Connection properties
346 GtkWidget * connection = gtk_grid_new(); 233 GtkWidget * connection = gtk_grid_new();
347 gtk_grid_set_row_spacing(GTK_GRID(connection),6); 234 gtk_grid_set_row_spacing(GTK_GRID(connection),6);
@@ -398,8 +285,6 @@ static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget) @@ -398,8 +285,6 @@ static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget)
398 285
399 // Create combo boxes 286 // Create combo boxes
400 { 287 {
401 - GtkCellRenderer * renderer = gtk_cell_renderer_text_new();  
402 -  
403 size_t combo, item; 288 size_t combo, item;
404 289
405 for(combo = 0; combo < G_N_ELEMENTS(combos); combo++) { 290 for(combo = 0; combo < G_N_ELEMENTS(combos); combo++) {
@@ -411,8 +296,8 @@ static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget) @@ -411,8 +296,8 @@ static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget)
411 if(combos[combo].tooltip) 296 if(combos[combo].tooltip)
412 gtk_widget_set_tooltip_markup(GTK_WIDGET(widget->input.combos[combo]),combos[combo].tooltip); 297 gtk_widget_set_tooltip_markup(GTK_WIDGET(widget->input.combos[combo]),combos[combo].tooltip);
413 298
414 - gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget->input.combos[combo]), renderer, TRUE);  
415 - gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(widget->input.combos[combo]), renderer, "text", 0, NULL); 299 + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget->input.combos[combo]), text_renderer, TRUE);
  300 + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(widget->input.combos[combo]), text_renderer, "text", 0, NULL);
416 301
417 for(item = 0; combos[combo].labels[item]; item++) 302 for(item = 0; combos[combo].labels[item]; item++)
418 { 303 {
@@ -427,6 +312,46 @@ static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget) @@ -427,6 +312,46 @@ static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget)
427 312
428 } 313 }
429 314
  315 + // Create Charset Combo
  316 + {
  317 + GtkTreeModel * model = (GtkTreeModel *) gtk_list_store_new(1,G_TYPE_STRING);
  318 +
  319 + widget->input.charset = GTK_COMBO_BOX(gtk_combo_box_new_with_model(model));
  320 +
  321 + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget->input.charset), text_renderer, TRUE);
  322 + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(widget->input.charset), text_renderer, "text", 0, NULL);
  323 +
  324 + static const gchar * charsets[] =
  325 + {
  326 + "us",
  327 + "bracket",
  328 + "cp500"
  329 + };
  330 +
  331 + size_t charset;
  332 + for(charset = 0; charset < G_N_ELEMENTS(charsets); charset++)
  333 + {
  334 + GtkTreeIter iter;
  335 + gtk_list_store_append((GtkListStore *) model, &iter);
  336 + gtk_list_store_set((GtkListStore *) model, &iter, 0, charsets[charset], -1);
  337 + };
  338 +
  339 + static const struct v3270_entry_field descriptor =
  340 + {
  341 + .top = 1,
  342 + .left = 0,
  343 + .width = 2,
  344 + .height = 1,
  345 +
  346 + .label = N_("_Charset"),
  347 + .tooltip = N_("The EBCDIC host character set. "),
  348 +
  349 + };
  350 +
  351 + v3270_grid_attach(GTK_GRID(emulation), &descriptor, GTK_WIDGET(widget->input.charset));
  352 +
  353 + }
  354 +
430 gtk_widget_show_all(GTK_WIDGET(widget)); 355 gtk_widget_show_all(GTK_WIDGET(widget));
431 356
432 } 357 }
@@ -446,9 +371,10 @@ LIB3270_EXPORT void v3270_select_host(GtkWidget *widget) @@ -446,9 +371,10 @@ LIB3270_EXPORT void v3270_select_host(GtkWidget *widget)
446 g_return_if_fail(GTK_IS_V3270(widget)); 371 g_return_if_fail(GTK_IS_V3270(widget));
447 372
448 GtkWidget * dialog = v3270_settings_dialog_new(); 373 GtkWidget * dialog = v3270_settings_dialog_new();
  374 + GtkWidget * settings = v3270_host_select_new();
449 375
450 - gtk_window_set_title(GTK_WINDOW(dialog), _("Host definition"));  
451 - gtk_container_add(GTK_CONTAINER(dialog), v3270_host_select_new()); 376 + gtk_window_set_title(GTK_WINDOW(dialog), v3270_settings_get_title(settings));
  377 + gtk_container_add(GTK_CONTAINER(dialog), settings);
452 378
453 gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(gtk_widget_get_toplevel(widget))); 379 gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(gtk_widget_get_toplevel(widget)));
454 gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); 380 gtk_window_set_modal(GTK_WINDOW(dialog),TRUE);
@@ -483,3 +409,173 @@ LIB3270_EXPORT void v3270_select_host(GtkWidget *widget) @@ -483,3 +409,173 @@ LIB3270_EXPORT void v3270_select_host(GtkWidget *widget)
483 gtk_widget_destroy(dialog); 409 gtk_widget_destroy(dialog);
484 410
485 } 411 }
  412 +
  413 +static void apply(GtkWidget *w, GtkWidget *terminal)
  414 +{
  415 + debug("V3270HostSelectWidget::%s",__FUNCTION__);
  416 +
  417 + V3270HostSelectWidget *widget = GTK_V3270HostSelectWidget(w);
  418 + H3270 *hSession = v3270_get_session(terminal);
  419 +
  420 + // Apply URL
  421 + {
  422 + g_autofree gchar * url =
  423 + g_strconcat(
  424 + (gtk_toggle_button_get_active(widget->input.ssl) ? "tn3270s://" : "tn3270://"),
  425 + gtk_entry_get_text(widget->input.entry[ENTRY_HOSTNAME]),
  426 + ":",
  427 + gtk_entry_get_text(widget->input.entry[ENTRY_SRVCNAME]),
  428 + NULL
  429 + );
  430 +
  431 + debug("URL=[%s]",url);
  432 + lib3270_set_url(hSession,url);
  433 +
  434 + }
  435 +
  436 + // Apply combos.
  437 + size_t combo;
  438 + for(combo = 0; combo < G_N_ELEMENTS(combos); combo++)
  439 + {
  440 + GtkTreeIter iter;
  441 +
  442 + if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget->input.combos[combo]), &iter))
  443 + {
  444 + GValue value = { 0, };
  445 + gtk_tree_model_get_value(gtk_combo_box_get_model(GTK_COMBO_BOX(widget->input.combos[combo])),&iter,1,&value);
  446 +
  447 + combos[combo].set(hSession,g_value_get_uint(&value));
  448 +
  449 + g_value_unset(&value);
  450 +
  451 + }
  452 + }
  453 +
  454 + // Apply charset
  455 + {
  456 + GtkTreeIter iter;
  457 +
  458 + if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget->input.charset), &iter))
  459 + {
  460 + GValue value = { 0, };
  461 + gtk_tree_model_get_value(gtk_combo_box_get_model(GTK_COMBO_BOX(widget->input.charset)),&iter,0,&value);
  462 +
  463 + lib3270_set_host_charset(hSession,g_value_get_string(&value));
  464 +
  465 + g_value_unset(&value);
  466 +
  467 + }
  468 + }
  469 +
  470 +}
  471 +
  472 +static void load(GtkWidget *w, GtkWidget *terminal)
  473 +{
  474 + debug("V3270HostSelectWidget::%s",__FUNCTION__);
  475 +
  476 + H3270 *hSession = v3270_get_session(terminal);
  477 + V3270HostSelectWidget *widget = GTK_V3270HostSelectWidget(w);
  478 +
  479 + const gchar * u = lib3270_get_url(hSession);
  480 +
  481 + if(u)
  482 + {
  483 +
  484 + g_autofree gchar * url = g_strdup(u);
  485 + debug("URL=[%s]",url);
  486 +
  487 + gtk_toggle_button_set_active(widget->input.ssl,g_str_has_prefix(u,"tn3270s"));
  488 +
  489 + gchar *hostname = strstr(url,"://");
  490 + if(!hostname)
  491 + {
  492 + g_message("Invalid URL: \"%s\" (no scheme)",url);
  493 + }
  494 + else
  495 + {
  496 + hostname += 3;
  497 +
  498 + gchar *srvcname = strchr(hostname,':');
  499 +
  500 + if(srvcname)
  501 + {
  502 + *(srvcname++) = 0;
  503 + }
  504 + else
  505 + {
  506 + srvcname = "telnet";
  507 + }
  508 +
  509 + gtk_entry_set_text(widget->input.entry[ENTRY_HOSTNAME],hostname);
  510 + gtk_entry_set_text(widget->input.entry[ENTRY_SRVCNAME],srvcname);
  511 +
  512 + }
  513 +
  514 + }
  515 +
  516 + // Load unsigned int combos
  517 + size_t combo;
  518 + for(combo = 0; combo < G_N_ELEMENTS(combos); combo++)
  519 + {
  520 +
  521 + GtkTreeModel * model = gtk_combo_box_get_model(widget->input.combos[combo]);
  522 + GtkTreeIter iter;
  523 + unsigned int value = combos[combo].get(hSession);
  524 +
  525 + if(gtk_tree_model_get_iter_first(model,&iter))
  526 + {
  527 + do
  528 + {
  529 + GValue gVal = { 0, };
  530 + gtk_tree_model_get_value(model,&iter,1,&gVal);
  531 + guint iVal = g_value_get_uint(&gVal);
  532 + g_value_unset(&gVal);
  533 +
  534 + if(iVal == value)
  535 + {
  536 + gtk_combo_box_set_active_iter(widget->input.combos[combo],&iter);
  537 + break;
  538 + }
  539 +
  540 + } while(gtk_tree_model_iter_next(model,&iter));
  541 +
  542 +
  543 + }
  544 +
  545 + }
  546 +
  547 + // Load charset
  548 + {
  549 + const char * charset = lib3270_get_host_charset(hSession);
  550 +
  551 + if(charset)
  552 + {
  553 + GtkTreeModel * model = gtk_combo_box_get_model(widget->input.charset);
  554 + GtkTreeIter iter;
  555 +
  556 + if(gtk_tree_model_get_iter_first(model,&iter))
  557 + {
  558 + do
  559 + {
  560 + GValue gVal = { 0, };
  561 + gtk_tree_model_get_value(model,&iter,0,&gVal);
  562 +
  563 + if(!g_ascii_strcasecmp(charset,g_value_get_string(&gVal)))
  564 + {
  565 + gtk_combo_box_set_active_iter(widget->input.charset,&iter);
  566 + g_value_unset(&gVal);
  567 + break;
  568 + }
  569 +
  570 + g_value_unset(&gVal);
  571 +
  572 + } while(gtk_tree_model_iter_next(model,&iter));
  573 +
  574 + }
  575 +
  576 + }
  577 +
  578 + }
  579 +
  580 +}
  581 +