38 #include <freerdp/locale/keyboard.h> 47 #if FREERDP_CHECK_VERSION(2, 3, 0) 64 if (value && value[0])
78 #define REMMINA_TYPE_PLUGIN_RDPSET_GRID (remmina_rdp_settings_grid_get_type()) 79 #define REMMINA_RDPSET_GRID(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), REMMINA_TYPE_PLUGIN_RDPSET_GRID, RemminaPluginRdpsetGrid)) 80 #define REMMINA_RDPSET_GRID_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), REMMINA_TYPE_PLUGIN_RDPSET_GRID, RemminaPluginRdpsetGridClass)) 81 #define REMMINA_IS_PLUGIN_RDPSET_GRID(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), REMMINA_TYPE_PLUGIN_RDPSET_GRID)) 82 #define REMMINA_IS_PLUGIN_RDPSET_GRID_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), REMMINA_TYPE_PLUGIN_RDPSET_GRID)) 83 #define REMMINA_RDPSET_GRID_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), REMMINA_TYPE_PLUGIN_RDPSET_GRID, RemminaPluginRdpsetGridClass)) 129 TRACE_CALL(__func__);
134 TRACE_CALL(__func__);
141 grid = REMMINA_RDPSET_GRID(widget);
148 s = g_strdup_printf(
"%X", new_layout);
166 gtk_entry_get_text(GTK_ENTRY(grid->
kbd_remap)));
188 s = g_strdup_printf(
"%d", val);
193 s = g_strdup_printf(
"%d", val);
201 s = g_strdup_printf(
"%d", val);
208 TRACE_CALL(__func__);
212 RDP_KEYBOARD_LAYOUT *layouts;
222 layouts = freerdp_keyboard_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_VARIANT);
224 for (i = 0; layouts[i].code; i++) {
225 s = g_strdup_printf(
"%08X - %s", layouts[i].code, layouts[i].name);
238 freerdp_keyboard_layouts_free(layouts);
243 TRACE_CALL(__func__);
258 TRACE_CALL(__func__);
273 TRACE_CALL(__func__);
278 gtk_list_store_set(grid->
quality_store, &iter, 0, -1, 1, _(
"<Choose a quality level to edit…>"), -1);
280 gtk_list_store_set(grid->
quality_store, &iter, 0, 0, 1, _(
"Poor (fastest)"), -1);
282 gtk_list_store_set(grid->
quality_store, &iter, 0, 1, 1, _(
"Medium"), -1);
284 gtk_list_store_set(grid->
quality_store, &iter, 0, 2, 1, _(
"Good"), -1);
286 gtk_list_store_set(grid->
quality_store, &iter, 0, 9, 1, _(
"Best (slowest)"), -1);
291 grid->
quality_values[0] = (value && value[0] ? strtoul(value, NULL, 16) : DEFAULT_QUALITY_0);
295 grid->
quality_values[1] = (value && value[0] ? strtoul(value, NULL, 16) : DEFAULT_QUALITY_1);
299 grid->
quality_values[2] = (value && value[0] ? strtoul(value, NULL, 16) : DEFAULT_QUALITY_2);
303 grid->
quality_values[9] = (value && value[0] ? strtoul(value, NULL, 16) : DEFAULT_QUALITY_9);
309 TRACE_CALL(__func__);
328 TRACE_CALL(__func__);
334 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(grid->
quality_combo), &iter)) {
335 gtk_tree_model_get(GTK_TREE_MODEL(grid->
quality_store), &iter, 0, &i, -1);
336 sensitive = (i != -1);
343 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(grid->
wallpaper_check), (v & 1) == 0);
344 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(grid->
windowdrag_check), (v & 2) == 0);
346 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(grid->
theme_check), (v & 8) == 0);
347 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(grid->
cursorshadow_check), (v & 0x20) == 0);
349 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(grid->
fontsmoothing_check), (v & 0x80) != 0);
350 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(grid->
composition_check), (v & 0x100) != 0);
353 gtk_widget_set_sensitive(GTK_WIDGET(grid->
wallpaper_check), sensitive);
356 gtk_widget_set_sensitive(GTK_WIDGET(grid->
theme_check), sensitive);
366 TRACE_CALL(__func__);
371 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(grid->
quality_combo), &iter)) {
372 gtk_tree_model_get(GTK_TREE_MODEL(grid->
quality_store), &iter, 0, &i, -1);
375 v |= (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(grid->
wallpaper_check)) ? 0 : 1);
376 v |= (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(grid->
windowdrag_check)) ? 0 : 2);
378 v |= (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(grid->
theme_check)) ? 0 : 8);
379 v |= (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(grid->
cursorshadow_check)) ? 0 : 0x20);
381 v |= (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(grid->
fontsmoothing_check)) ? 0x80 : 0);
382 v |= (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(grid->
composition_check)) ? 0x100 : 0);
395 m = gtk_combo_box_get_model(combo);
399 valid = gtk_tree_model_get_iter_first(m, &iter);
401 gtk_tree_model_get(m, &iter, 0, &i, -1);
403 gtk_combo_box_set_active_iter(combo, &iter);
404 valid = gtk_tree_model_iter_next(m, &iter);
410 TRACE_CALL(__func__);
413 GtkCellRenderer *renderer;
414 int desktopOrientation, desktopScaleFactor, deviceScaleFactor;
418 gtk_grid_set_row_homogeneous(GTK_GRID(grid), FALSE);
419 gtk_grid_set_column_homogeneous(GTK_GRID(grid), FALSE);
420 gtk_container_set_border_width(GTK_CONTAINER(grid), 8);
421 gtk_grid_set_row_spacing(GTK_GRID(grid), 4);
422 gtk_grid_set_column_spacing(GTK_GRID(grid), 4);
425 widget = gtk_label_new(_(
"Keyboard layout"));
426 gtk_widget_show(widget);
427 gtk_widget_set_halign(GTK_WIDGET(widget), GTK_ALIGN_START);
428 gtk_widget_set_valign(GTK_WIDGET(widget), GTK_ALIGN_CENTER);
429 gtk_widget_set_margin_end(GTK_WIDGET(widget), 6);
430 gtk_widget_set_margin_start(GTK_WIDGET(widget), 18);
431 gtk_widget_set_margin_top(GTK_WIDGET(widget), 18);
432 gtk_grid_attach(GTK_GRID(grid), widget, 0, 0, 1, 1);
436 gtk_widget_show(widget);
437 gtk_widget_set_margin_start(GTK_WIDGET(widget), 6);
438 gtk_grid_attach(GTK_GRID(grid), widget, 1, 0, 2, 1);
440 renderer = gtk_cell_renderer_text_new();
441 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget), renderer, TRUE);
442 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(widget), renderer,
"text", 1);
445 widget = gtk_label_new(
"-");
446 gtk_widget_show(widget);
447 gtk_widget_set_halign(GTK_WIDGET(widget), GTK_ALIGN_START);
448 gtk_widget_set_valign(GTK_WIDGET(widget), GTK_ALIGN_CENTER);
449 gtk_widget_set_margin_start(GTK_WIDGET(widget), 6);
450 gtk_grid_attach(GTK_GRID(grid), widget, 1, 1, 2, 1);
455 widget = gtk_check_button_new_with_label(_(
"Use client keyboard mapping"));
456 gtk_widget_show(widget);
457 gtk_widget_set_margin_start(GTK_WIDGET(widget), 6);
458 gtk_grid_attach(GTK_GRID(grid), widget, 1, 2, 1, 1);
462 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
463 s && s[0] ==
'1' ? TRUE : FALSE);
466 widget = gtk_label_new(_(
"Keyboard scancode remapping"));
467 gtk_widget_show(widget);
468 gtk_widget_set_margin_start(GTK_WIDGET(widget), 6);
469 gtk_grid_attach(GTK_GRID(grid), widget, 1, 3, 1, 1);
470 gtk_widget_set_halign(GTK_WIDGET(widget), GTK_ALIGN_START);
471 gtk_widget_set_valign(GTK_WIDGET(widget), GTK_ALIGN_CENTER);
472 widget = gtk_entry_new();
473 gtk_widget_show(widget);
474 gtk_widget_set_halign(GTK_WIDGET(widget), GTK_ALIGN_END);
475 gtk_widget_set_valign(GTK_WIDGET(widget), GTK_ALIGN_CENTER);
476 gtk_grid_attach(GTK_GRID(grid), widget, 2, 3, 1, 1);
477 gtk_entry_set_width_chars(GTK_ENTRY(widget), 32);
478 #if FREERDP_CHECK_VERSION(2, 3, 0) 480 gtk_widget_set_sensitive (widget, TRUE);
481 gtk_widget_set_tooltip_text(widget, _(
"List of key=value,… pairs to remap scancodes. E.g. 0x56=0x29,0x29=0x56"));
483 gtk_widget_set_sensitive (widget, FALSE);
484 gtk_widget_set_tooltip_text(widget, _(
"FreeRDP > 2.3.0 is required to map scancodes"));
488 gtk_entry_set_text(GTK_ENTRY(widget), s);
492 widget = gtk_label_new(_(
"Quality settings"));
493 gtk_widget_show(widget);
494 gtk_widget_set_halign(GTK_WIDGET(widget), GTK_ALIGN_START);
495 gtk_widget_set_valign(GTK_WIDGET(widget), GTK_ALIGN_CENTER);
496 gtk_widget_set_margin_end(GTK_WIDGET(widget), 6);
497 gtk_widget_set_margin_start(GTK_WIDGET(widget), 18);
498 gtk_grid_attach(GTK_GRID(grid), widget, 0, 4, 1, 1);
500 grid->
quality_store = gtk_list_store_new(2, G_TYPE_UINT, G_TYPE_STRING);
501 widget = gtk_combo_box_new_with_model(GTK_TREE_MODEL(grid->
quality_store));
502 gtk_widget_show(widget);
503 gtk_widget_set_margin_start(GTK_WIDGET(widget), 6);
504 gtk_grid_attach(GTK_GRID(grid), widget, 1, 4, 2, 1);
506 renderer = gtk_cell_renderer_text_new();
507 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget), renderer, TRUE);
508 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(widget), renderer,
"text", 1);
509 g_signal_connect(G_OBJECT(widget),
"changed",
515 widget = gtk_check_button_new_with_label(_(
"Wallpaper"));
516 gtk_widget_show(widget);
517 gtk_widget_set_margin_start(GTK_WIDGET(widget), 6);
518 gtk_grid_attach(GTK_GRID(grid), widget, 1, 5, 1, 1);
519 g_signal_connect(G_OBJECT(widget),
"toggled",
523 widget = gtk_check_button_new_with_label(_(
"Window drag"));
524 gtk_widget_show(widget);
525 gtk_grid_attach(GTK_GRID(grid), widget, 2, 5, 1, 1);
526 g_signal_connect(G_OBJECT(widget),
"toggled",
530 widget = gtk_check_button_new_with_label(_(
"Menu animation"));
531 gtk_widget_show(widget);
532 gtk_widget_set_margin_start(GTK_WIDGET(widget), 6);
533 gtk_grid_attach(GTK_GRID(grid), widget, 1, 6, 1, 1);
534 g_signal_connect(G_OBJECT(widget),
"toggled",
538 widget = gtk_check_button_new_with_label(_(
"Theme"));
539 gtk_widget_show(widget);
540 gtk_grid_attach(GTK_GRID(grid), widget, 2, 6, 1, 1);
541 g_signal_connect(G_OBJECT(widget),
"toggled",
545 widget = gtk_check_button_new_with_label(_(
"Cursor shadow"));
546 gtk_widget_show(widget);
547 gtk_widget_set_margin_start(GTK_WIDGET(widget), 6);
548 gtk_grid_attach(GTK_GRID(grid), widget, 1, 7, 1, 1);
549 g_signal_connect(G_OBJECT(widget),
"toggled",
553 widget = gtk_check_button_new_with_label(_(
"Cursor blinking"));
554 gtk_widget_show(widget);
555 gtk_grid_attach(GTK_GRID(grid), widget, 2, 7, 1, 1);
556 g_signal_connect(G_OBJECT(widget),
"toggled",
560 widget = gtk_check_button_new_with_label(_(
"Font smoothing"));
561 gtk_widget_show(widget);
562 gtk_widget_set_margin_start(GTK_WIDGET(widget), 6);
563 gtk_grid_attach(GTK_GRID(grid), widget, 1, 8, 1, 1);
564 g_signal_connect(G_OBJECT(widget),
"toggled",
568 widget = gtk_check_button_new_with_label(_(
"Composition"));
569 gtk_widget_show(widget);
570 gtk_grid_attach(GTK_GRID(grid), widget, 2, 8, 1, 1);
571 g_signal_connect(G_OBJECT(widget),
"toggled",
575 gtk_combo_box_set_active(GTK_COMBO_BOX(grid->
quality_combo), 0);
578 widget = gtk_label_new(_(
"Remote scale factor"));
579 gtk_widget_show(widget);
580 gtk_widget_set_halign(GTK_WIDGET(widget), GTK_ALIGN_START);
581 gtk_widget_set_valign(GTK_WIDGET(widget), GTK_ALIGN_CENTER);
582 gtk_widget_set_margin_end(GTK_WIDGET(widget), 6);
583 gtk_widget_set_margin_start(GTK_WIDGET(widget), 18);
584 gtk_grid_attach(GTK_GRID(grid), widget, 0, 9, 1, 1);
593 widget = gtk_label_new(_(
"Desktop scale factor %"));
594 gtk_widget_show(widget);
595 gtk_widget_set_halign(GTK_WIDGET(widget), GTK_ALIGN_START);
596 gtk_widget_set_valign(GTK_WIDGET(widget), GTK_ALIGN_CENTER);
597 gtk_widget_set_margin_start(GTK_WIDGET(widget), 6);
598 gtk_grid_attach(GTK_GRID(grid), widget, 1, 9, 1, 1);
600 widget = gtk_spin_button_new_with_range(0, 10000, 1);
601 gtk_widget_show(widget);
602 gtk_grid_attach(GTK_GRID(grid), widget, 2, 9, 1, 1);
605 widget = gtk_label_new(_(
"Device scale factor %"));
606 gtk_widget_show(widget);
607 gtk_widget_set_halign(GTK_WIDGET(widget), GTK_ALIGN_START);
608 gtk_widget_set_valign(GTK_WIDGET(widget), GTK_ALIGN_CENTER);
609 gtk_widget_set_margin_start(GTK_WIDGET(widget), 6);
610 gtk_grid_attach(GTK_GRID(grid), widget, 1, 10, 1, 1);
613 gtk_widget_show(widget);
614 gtk_grid_attach(GTK_GRID(grid), widget, 2, 10, 1, 1);
616 renderer = gtk_cell_renderer_text_new();
617 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget), renderer, TRUE);
618 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(widget), renderer,
"text", 1);
624 g_signal_connect(G_OBJECT(widget),
"changed",
628 widget = gtk_label_new(_(
"Desktop orientation"));
629 gtk_widget_show(widget);
630 gtk_widget_set_halign(GTK_WIDGET(widget), GTK_ALIGN_START);
631 gtk_widget_set_valign(GTK_WIDGET(widget), GTK_ALIGN_CENTER);
632 gtk_widget_set_margin_end(GTK_WIDGET(widget), 6);
633 gtk_widget_set_margin_start(GTK_WIDGET(widget), 18);
634 gtk_grid_attach(GTK_GRID(grid), widget, 0, 11, 1, 1);
637 gtk_widget_show(widget);
638 gtk_widget_set_margin_start(GTK_WIDGET(widget), 6);
639 gtk_grid_attach(GTK_GRID(grid), widget, 1, 11, 2, 1);
641 renderer = gtk_cell_renderer_text_new();
642 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget), renderer, TRUE);
643 gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(widget), renderer,
"text", 1);
648 widget = gtk_label_new(_(
"Input device settings"));
649 gtk_widget_show(widget);
650 gtk_widget_set_halign(GTK_WIDGET(widget), GTK_ALIGN_START);
651 gtk_widget_set_valign(GTK_WIDGET(widget), GTK_ALIGN_CENTER);
652 gtk_widget_set_margin_end(GTK_WIDGET(widget), 6);
653 gtk_widget_set_margin_start(GTK_WIDGET(widget), 18);
654 gtk_grid_attach(GTK_GRID(grid), widget, 0, 12, 1, 1);
656 widget = gtk_check_button_new_with_label(_(
"Disable smooth scrolling"));
657 gtk_widget_show(widget);
658 gtk_widget_set_margin_start(GTK_WIDGET(widget), 6);
659 gtk_grid_attach(GTK_GRID(grid), widget, 1, 12, 2, 1);
663 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
664 s && s[0] ==
'1' ? TRUE : FALSE);
667 widget = gtk_label_new(_(
"General settings"));
668 gtk_widget_show(widget);
669 gtk_widget_set_halign(GTK_WIDGET(widget), GTK_ALIGN_START);
670 gtk_widget_set_valign(GTK_WIDGET(widget), GTK_ALIGN_CENTER);
671 gtk_widget_set_margin_end(GTK_WIDGET(widget), 6);
672 gtk_widget_set_margin_start(GTK_WIDGET(widget), 18);
673 gtk_grid_attach(GTK_GRID(grid), widget, 0, 13, 1, 1);
674 widget = gtk_label_new(_(
"Reconnect attempts number"));
675 gtk_widget_show(widget);
676 gtk_widget_set_halign(GTK_WIDGET(widget), GTK_ALIGN_START);
677 gtk_widget_set_valign(GTK_WIDGET(widget), GTK_ALIGN_CENTER);
678 gtk_widget_set_margin_start(GTK_WIDGET(widget), 6);
679 gtk_grid_attach(GTK_GRID(grid), widget, 1, 13, 1, 1);
680 widget = gtk_entry_new();
681 gtk_widget_show(widget);
682 gtk_widget_set_halign(GTK_WIDGET(widget), GTK_ALIGN_END);
683 gtk_widget_set_valign(GTK_WIDGET(widget), GTK_ALIGN_CENTER);
684 gtk_grid_attach(GTK_GRID(grid), widget, 2, 13, 1, 1);
685 gtk_entry_set_input_purpose(GTK_ENTRY(widget), GTK_INPUT_PURPOSE_NUMBER);
686 gtk_entry_set_input_hints(GTK_ENTRY(widget), GTK_INPUT_HINT_NONE);
687 gtk_widget_set_tooltip_text(widget, _(
"The maximum number of reconnect attempts upon an RDP disconnect (default: 20)"));
690 gtk_entry_set_text(GTK_ENTRY(widget), s);
698 TRACE_CALL(__func__);
701 widget = GTK_WIDGET(g_object_new(REMMINA_TYPE_PLUGIN_RDPSET_GRID, NULL));
702 gtk_widget_show(widget);
709 TRACE_CALL(__func__);
713 int orientation, dpsf, desf;
716 *desktopOrientation = *desktopScaleFactor = *deviceScaleFactor = 0;
719 orientation = s ? atoi(s) : 0;
721 if (orientation != 90 && orientation != 180 && orientation != 270)
723 *desktopOrientation = orientation;
726 dpsf = s ? atoi(s) : 0;
728 if (dpsf < 100 || dpsf > 500)
732 desf = s ? atoi(s) : 0;
734 if (desf != 100 && desf != 140 && desf != 180)
737 *desktopScaleFactor = dpsf;
738 *deviceScaleFactor = desf;
GtkListStore * device_scale_factor_store
GtkWidget * composition_check
GtkWidget * keyboard_layout_label
static void remmina_rdp_settings_grid_load_devicescalefactor_combo(RemminaPluginRdpsetGrid *grid)
static guint keyboard_layout
GtkListStore * desktop_orientation_store
GtkWidget * reconnect_attempts
GtkWidget * fontsmoothing_check
static guint rdp_keyboard_layout
GtkListStore * quality_store
static void remmina_rdp_settings_grid_init(RemminaPluginRdpsetGrid *grid)
GtkWidget * disable_smooth_scrolling_check
GType remmina_rdp_settings_grid_get_type(void)
GtkWidget * cursorblinking_check
static void remmina_rdp_settings_grid_load_layout(RemminaPluginRdpsetGrid *grid)
GtkWidget * wallpaper_check
void remmina_rdp_settings_get_orientation_scale_prefs(int *desktopOrientation, int *desktopScaleFactor, int *deviceScaleFactor)
static void remmina_rdp_settings_quality_option_on_toggled(GtkToggleButton *togglebutton, RemminaPluginRdpsetGrid *grid)
GtkWidget * menuanimation_check
void remmina_rdp_settings_init(void)
struct _RemminaPluginRdpsetGridClass RemminaPluginRdpsetGridClass
static void remmina_rdp_settings_grid_load_quality(RemminaPluginRdpsetGrid *grid)
GtkWidget * desktop_scale_factor_spin
void(* pref_set_value)(const gchar *key, const gchar *value)
struct _RemminaPluginRdpsetGrid RemminaPluginRdpsetGrid
GtkWidget * use_client_keymap_check
G_DEFINE_TYPE(RemminaConnectionWindow, rcw, GTK_TYPE_WINDOW)
GtkWidget * quality_combo
static RemminaPluginService * remmina_plugin_service
static void remmina_rdp_settings_kbd_init(void)
gchar *(* pref_get_value)(const gchar *key)
static gchar * rdp_keyboard_remapping_list
GtkWidget * cursorshadow_check
GtkWidget * remmina_rdp_settings_new(RemminaPrefPlugin *plugin)
GtkWidget * desktop_orientation_combo
static void remmina_rdp_settings_set_combo_active_item(GtkComboBox *combo, int itemval)
static void remmina_rdp_settings_appscale_on_changed(GtkComboBox *widget, RemminaPluginRdpsetGrid *grid)
static void remmina_rdp_settings_grid_destroy(GtkWidget *widget, gpointer data)
GtkWidget * windowdrag_check
GtkWidget * device_scale_factor_combo
GtkWidget * keyboard_layout_combo
static void remmina_rdp_settings_grid_load_desktoporientation_combo(RemminaPluginRdpsetGrid *grid)
GtkGridClass parent_class
static void remmina_rdp_settings_quality_on_changed(GtkComboBox *widget, RemminaPluginRdpsetGrid *grid)
GtkListStore * keyboard_layout_store
guint remmina_rdp_settings_get_keyboard_layout(void)