2014-12-16 2 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

거짓. 이 함수는 콜백에서 추가 한'g_print()'문에 의해 트리거됩니다. – ace

+0

아마도 처리기에서 'TRUE'를 반환하여 이벤트를 중지해야합니다. 디폴트의 ​​핸들러가 아직 불려 가고 있기 (위해) 때문에, 선택을 삭제할 가능성이 있습니다. – ptomato

+0

'TRUE'를 반환하려고했으나 도움이되지 않습니다. 'button-press-event'를 시도했으나 작동하지 않습니다. 나는'button-release-event'를 시도한 다음 작동합니다. 그래서 당신이 그것을 당신의 대답으로 편집한다면 나는 그것을 받아 들인 것으로 표시하게되어 기쁩니다. – ace

관련 문제