static gboolean uint_entries_validate (GtkBuilder *builder, const char *fmt, gint max, gboolean sum) { long int num; GtkEntry *entry; char *tmp; const char *text; guint i, total = 0; gboolean valid = TRUE; GdkRGBA bgcolor; gdk_rgba_parse (&bgcolor, "red3"); for (i = 0; i < 8; i++) { tmp = _strdup_printf_uint (fmt, i); entry = GTK_ENTRY (gtk_builder_get_object (builder, tmp)); g_free (tmp); g_assert (entry); text = gtk_entry_get_text (entry); if (text) { errno = 0; num = strtol (text, NULL, 10); if (errno || num < 0 || num > max) { /* FIXME: only sets highlight color? */ utils_override_bg_color (GTK_WIDGET (entry), &bgcolor); valid = FALSE; } else utils_override_bg_color (GTK_WIDGET (entry), NULL); total += (guint) num; if (sum && total > 100) utils_override_bg_color (GTK_WIDGET (entry), &bgcolor); } } if (sum && total != 100) { utils_override_bg_color (GTK_WIDGET (entry), &bgcolor); valid = FALSE; } return valid; }
static gboolean cell_changed_cb (GtkEditable *editable, gpointer user_data) { AddressLineInfo *info = (AddressLineInfo *) user_data; char *cell_text; GdkRGBA rgba; gboolean value_valid = FALSE; const char *colorname = NULL; cell_text = gtk_editable_get_chars (editable, 0, -1); /* The COL_PREFIX can contain IP address or prefix */ if (info->column == COL_PREFIX) { guint32 tmp_prefix; value_valid = parse_netmask (cell_text, &tmp_prefix); } else { struct in_addr tmp_addr; if (inet_pton (AF_INET, cell_text, &tmp_addr) > 0) value_valid = TRUE; /* 0.0.0.0 is not accepted for address */ if (info->column == COL_ADDRESS && tmp_addr.s_addr == 0) value_valid = FALSE; /* Consider empty gateway as valid */ if (!*cell_text && info->column == COL_GATEWAY) value_valid = TRUE; } /* Change cell's background color while editing */ colorname = value_valid ? "lightgreen" : "red"; /* Check gateway against address and prefix */ if ( info->column == COL_GATEWAY && value_valid && possibly_wrong_gateway (info->model, &info->iter, cell_text)) colorname = "yellow"; gdk_rgba_parse (&rgba, colorname); utils_override_bg_color (GTK_WIDGET (editable), &rgba); g_free (cell_text); return FALSE; }
static gboolean cell_changed_cb (GtkEditable *editable, gpointer user_data) { char *cell_text; guint column; GdkRGBA rgba; gboolean value_valid = FALSE; const char *colorname = NULL; cell_text = gtk_editable_get_chars (editable, 0, -1); /* The Netmask column can also contain prefix */ column = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (user_data), "column")); if (column == COL_PREFIX) { /* The COL_PREFIX can contain IP address or prefix */ guint32 tmp_prefix; errno = 0; /* Is it a prefix? */ if (!strchr (cell_text, '.')) { tmp_prefix = strtol (cell_text, NULL, 10); if (*cell_text && !errno && tmp_prefix > 0 && tmp_prefix <= 32) value_valid = TRUE; } else { struct in_addr tmp_addr; /* Is it a netmask? */ if (inet_pton (AF_INET, cell_text, &tmp_addr) > 0) value_valid = TRUE; } } else if (column == COL_METRIC) { long int tmp_int; errno = 0; tmp_int = strtol (cell_text, NULL, 10); if (errno || tmp_int < 0 || tmp_int > G_MAXUINT32) value_valid = FALSE; else value_valid = TRUE; } else { struct in_addr tmp_addr = { 0 }; if (inet_pton (AF_INET, cell_text, &tmp_addr) > 0) value_valid = TRUE; /* 0.0.0.0 is not accepted for address */ if (column == COL_ADDRESS && tmp_addr.s_addr == 0) value_valid = FALSE; /* Consider empty next_hop as valid */ if (!*cell_text && column == COL_NEXT_HOP) value_valid = TRUE; } /* Change cell's background color while editing */ colorname = value_valid ? "lightgreen" : "red"; gdk_rgba_parse (&rgba, colorname); utils_override_bg_color (GTK_WIDGET (editable), &rgba); g_free (cell_text); return FALSE; }