+/**
+ * gtk_label_get_selection_bounds:
+ * @label: a #GtkLabel
+ * @start: return location for start of selection, as a character offset
+ * @end: return location for end of selection, as a character offset
+ *
+ * Gets the selected range of characters in the label, returning %TRUE
+ * if there's a selection.
+ *
+ * Return value: %TRUE if selection is non-empty
+ **/
+gboolean
+gtk_label_get_selection_bounds (GtkLabel *label,
+ gint *start,
+ gint *end)
+{
+ g_return_val_if_fail (GTK_IS_LABEL (label), FALSE);
+
+ if (label->select_info == NULL)
+ {
+ /* not a selectable label */
+ if (start)
+ *start = 0;
+ if (end)
+ *end = 0;
+
+ return FALSE;
+ }
+ else
+ {
+ gint start_index, end_index;
+ gint start_offset, end_offset;
+ gint len;
+
+ start_index = MIN (label->select_info->selection_anchor,
+ label->select_info->selection_end);
+ end_index = MAX (label->select_info->selection_anchor,
+ label->select_info->selection_end);
+
+ len = strlen (label->text);
+
+ if (end_index > len)
+ end_index = len;
+
+ if (start_index > len)
+ start_index = len;
+
+ start_offset = g_utf8_strlen (label->text, start_index);
+ end_offset = g_utf8_strlen (label->text, end_index);
+
+ if (start_offset > end_offset)
+ {
+ gint tmp = start_offset;
+ start_offset = end_offset;
+ end_offset = tmp;
+ }
+
+ if (start)
+ *start = start_offset;
+
+ if (end)
+ *end = end_offset;
+
+ return start_offset != end_offset;
+ }
+}
+