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 191 GtkEntry * entry[G_N_ELEMENTS(entryfields)]; ///< @brief Entry fields for host & service name
192 192 GtkToggleButton * ssl; ///< @brief SSL Connection?
193 193 GtkComboBox * combos[G_N_ELEMENTS(combos)]; ///< @brief Combo-boxes
  194 + GtkComboBox * charset; ///< @brief Charset combo box
194 195  
195 196 } input;
196 197  
... ... @@ -201,130 +202,13 @@
201 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 208 G_DEFINE_TYPE(V3270HostSelectWidget, V3270HostSelectWidget, GTK_TYPE_V3270_SETTINGS);
206 209  
207 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 212 static void update_message(GtkWidget *widget, GtkWidget *terminal)
329 213 {
330 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 226  
343 227 static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget)
344 228 {
  229 + // Cell renderer
  230 + GtkCellRenderer * text_renderer = gtk_cell_renderer_text_new();
  231 +
345 232 // Connection properties
346 233 GtkWidget * connection = gtk_grid_new();
347 234 gtk_grid_set_row_spacing(GTK_GRID(connection),6);
... ... @@ -398,8 +285,6 @@ static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget)
398 285  
399 286 // Create combo boxes
400 287 {
401   - GtkCellRenderer * renderer = gtk_cell_renderer_text_new();
402   -
403 288 size_t combo, item;
404 289  
405 290 for(combo = 0; combo < G_N_ELEMENTS(combos); combo++) {
... ... @@ -411,8 +296,8 @@ static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget)
411 296 if(combos[combo].tooltip)
412 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 302 for(item = 0; combos[combo].labels[item]; item++)
418 303 {
... ... @@ -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 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 371 g_return_if_fail(GTK_IS_V3270(widget));
447 372  
448 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 379 gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(gtk_widget_get_toplevel(widget)));
454 380 gtk_window_set_modal(GTK_WINDOW(dialog),TRUE);
... ... @@ -483,3 +409,173 @@ LIB3270_EXPORT void v3270_select_host(GtkWidget *widget)
483 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 +
... ...