2014-12-16 3 views
1

Я пытаюсь реализовать текстовое представление, в котором будет выбран весь текст, когда пользователь нажмет на него. Однако, когда я пробовал следующее, текст не выбирается при щелчке текстового представления, хотя он выбирается после перетаскивания окна.GtkTextView выделить весь текст при фокусировке

Рассмотрим минимальный пример:

#include <gtk/gtk.h> 
gboolean cb(GtkWidget *tv, GdkEvent *event, gpointer user_data) { 
    GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(tv)); 
    GtkTextIter start, end; 
    gtk_text_buffer_get_start_iter(buf, &start); 
    gtk_text_buffer_get_end_iter(buf, &end); 
    gtk_text_buffer_select_range(buf, &start, &end); 
    return FALSE; 
} 

int main(int argc, char *argv[]) { 
    gtk_init(&argc, &argv); 
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    GtkWidget *box1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); 
    gtk_container_add(GTK_CONTAINER(window), box1); 

    GtkWidget *tv1 = gtk_text_view_new(); 
    GtkWidget *tv2 = gtk_text_view_new(); 
    gtk_box_pack_start(GTK_BOX(box1), tv1, TRUE, TRUE, 0); 
    gtk_box_pack_start(GTK_BOX(box1), tv2, TRUE, TRUE, 0); 

    GtkTextBuffer *buf1 = gtk_text_view_get_buffer(GTK_TEXT_VIEW(tv1)); 
    GtkTextBuffer *buf2 = gtk_text_view_get_buffer(GTK_TEXT_VIEW(tv2)); 
    gtk_text_buffer_set_text(buf1, "asdf", -1); 
    gtk_text_buffer_set_text(buf2, "ghjkl", -1); 

    g_signal_connect(tv2, "focus-in-event", G_CALLBACK(cb), NULL); 

    gtk_widget_show(tv1); 
    gtk_widget_show(tv2); 
    gtk_widget_show(box1); 
    gtk_widget_show(window); 
    gtk_main(); 
    return 0; 
} 

Что нужно изменить, чтобы получить желаемый результат?

ответ

1

Вместо этого подключите функцию обратного вызова к button-release-event.

0

Я ожидаю, что focus-in-event не срабатывает, когда вы нажимаете на текстовое представление, когда оно уже имеет фокус ввода. Вместо этого попробуйте использовать button-press-event.

+0

False. Это вызвано, о чем свидетельствует оператор 'g_print()', который я добавил в обратном вызове. – ace

+0

Возможно, вам нужно вернуть TRUE из обработчика, чтобы остановить событие; поскольку обработчик по умолчанию все еще вызван, возможно, это удаляет выделение. – ptomato

+0

Пробовал возвращать 'TRUE', но это не помогает. Пробовал 'button-press-event', но это тоже не работает. Затем я попробовал 'button-release-event', а затем он работает. Поэтому, если вы отредактируете это в своем ответе, я буду рад отметить его как принятый. – ace

Смежные вопросы