+ if (GTK_IS_TEXT_VIEW (focused)) {
+ GtkTextIter start, end;
+ GtkTextBuffer *buffer = NULL;
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
+ if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) {
+ selection = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
+ }
+ } else if (GTK_IS_LABEL (focused)) {
+ gint start, end;
+ if (gtk_label_get_selection_bounds (GTK_LABEL (focused), &start, &end)) {
+ const gchar *start_offset;
+ start_offset = gtk_label_get_text (GTK_LABEL (focused));
+ start_offset = g_utf8_offset_to_pointer (start_offset, start);
+ selection = g_new0 (gchar, end - start + 1);
+ g_utf8_strncpy (selection, start_offset, end - start);
+ }
+ } else {
+ GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
+ selection = gtk_clipboard_wait_for_text (clipboard);
+ }