From d9f1168d6aece7c96a0516de25ccbec9135613a7 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Tue, 21 Sep 2021 16:30:41 +0200 Subject: remmina_file_editor.c: RENAMING SETTING_TYPE_NUMBER -> SETTING_TYPE_INT and introducing SETTING_TYPE_DOUBLE --- src/remmina_file_editor.c | 82 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 73 insertions(+), 9 deletions(-) (limited to 'src/remmina_file_editor.c') diff --git a/src/remmina_file_editor.c b/src/remmina_file_editor.c index d82b5a31a..da60a0365 100644 --- a/src/remmina_file_editor.c +++ b/src/remmina_file_editor.c @@ -679,8 +679,8 @@ remmina_file_editor_create_chooser(RemminaFileEditor *gfe, GtkWidget *grid, gint return widget; } -void remmina_file_editor_number_insert_text_event(GtkEditable *editable, const gchar *text, - gint length, gint *position, gpointer data) +void remmina_file_editor_int_setting_filter(GtkEditable *editable, const gchar *text, + gint length, gint *position, gpointer data) { for (int i = 0; i < length; i++) { if (!isdigit(text[i]) && text[i] != '-') { @@ -690,7 +690,18 @@ void remmina_file_editor_number_insert_text_event(GtkEditable *editable, const g } } -static GtkWidget *remmina_file_editor_create_number(RemminaFileEditor *gfe, GtkWidget *grid, +void remmina_file_editor_double_setting_filter(GtkEditable *editable, const gchar *text, + gint length, gint *position, gpointer data) +{ + for (int i = 0; i < length; i++) { + if (!isdigit(text[i]) && text[i] != '-' && text[i] != '.' && text[i] != ',') { + g_signal_stop_emission_by_name(G_OBJECT(editable), "insert-text"); + return; + } + } +} + +static GtkWidget *remmina_file_editor_create_int(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gint value, gint left, gint right) { TRACE_CALL(__func__); @@ -724,11 +735,54 @@ static GtkWidget *remmina_file_editor_create_number(RemminaFileEditor *gfe, GtkW free(str); g_signal_connect(G_OBJECT(widget), "insert-text", - G_CALLBACK(remmina_file_editor_number_insert_text_event), NULL); + G_CALLBACK(remmina_file_editor_int_setting_filter), NULL); + + return widget; +} + +static GtkWidget *remmina_file_editor_create_double(RemminaFileEditor *gfe, GtkWidget *grid, + gint row, gint col, const gchar *label, gdouble value, gint left, gint right) +{ + TRACE_CALL(__func__); + GtkWidget *widget; + + widget = gtk_label_new(label); + gtk_widget_show(widget); +#if GTK_CHECK_VERSION(3, 12, 0) + gtk_widget_set_margin_start(widget, left); + gtk_widget_set_margin_end(widget, right); +#else + gtk_widget_set_margin_left(widget, left); + gtk_widget_set_margin_right(widget, right); +#endif + gtk_widget_set_valign(widget, GTK_ALIGN_START); + gtk_widget_set_halign(widget, GTK_ALIGN_START); + gtk_grid_attach(GTK_GRID(grid), widget, col, row, 1, 1); + + widget = gtk_entry_new(); + gtk_widget_show(widget); + gtk_grid_attach(GTK_GRID(grid), widget, col + 1, row, 1, 1); + gtk_entry_set_max_length(GTK_ENTRY(widget), 300); + gtk_widget_set_hexpand(widget, TRUE); + + // Convert double to str. + int length = snprintf(NULL, 0, "%.8g", value) + 1; // +1 '\0' byte + char* str = malloc(length); + snprintf(str, length, "%f", value); + + gtk_entry_set_text(GTK_ENTRY(widget), str); + free(str); + + g_signal_connect(G_OBJECT(widget), "insert-text", + G_CALLBACK(remmina_file_editor_double_setting_filter), NULL); return widget; } +gdouble remmina_file_get_double(RemminaFile *remminafile, + const gchar *setting, + gfloat default_value); + static void remmina_file_editor_create_settings(RemminaFileEditor *gfe, GtkWidget *grid, const RemminaProtocolSetting *settings) { @@ -838,11 +892,21 @@ static void remmina_file_editor_create_settings(RemminaFileEditor *gfe, GtkWidge if (settings->opt2) gtk_widget_set_tooltip_text(widget, (const gchar *)settings->opt2); break; - case REMMINA_PROTOCOL_SETTING_TYPE_NUMBER: - widget = remmina_file_editor_create_number(gfe, grid, grid_row, 0, - g_dgettext(priv->plugin->domain, settings->label), - remmina_file_get_int(priv->remmina_file, setting_name, 0), - 0, 40); + case REMMINA_PROTOCOL_SETTING_TYPE_INT: + widget = remmina_file_editor_create_int(gfe, grid, grid_row, 0, + g_dgettext(priv->plugin->domain, settings->label), + remmina_file_get_int(priv->remmina_file, setting_name, 0), + 0, 40); + g_hash_table_insert(priv->setting_widgets, setting_name, widget); + if (settings->opt2) + gtk_widget_set_tooltip_text(widget, (const gchar *)settings->opt2); + grid_row++; + break; + case REMMINA_PROTOCOL_SETTING_TYPE_DOUBLE: + widget = remmina_file_editor_create_double(gfe, grid, grid_row, 0, + g_dgettext(priv->plugin->domain, settings->label), + remmina_file_get_double(priv->remmina_file,setting_name, 0.0f), + 0, 40); g_hash_table_insert(priv->setting_widgets, setting_name, widget); if (settings->opt2) gtk_widget_set_tooltip_text(widget, (const gchar *)settings->opt2); -- cgit v1.2.3