Esempio n. 1
0
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;
}