Commit ba685fa9ff8b15829de4af61b604785cc209ff80
1 parent
f6d29955
Exists in
master
and in
1 other branch
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 | + |