diff -r 012418e7dc90 -r bcf880b29bc3 ui/gtk/text.c --- a/ui/gtk/text.c Thu Apr 03 11:12:22 2014 +0200 +++ b/ui/gtk/text.c Thu Apr 03 14:16:41 2014 +0200 @@ -33,14 +33,47 @@ #include "text.h" #include "container.h" +static void selection_handler( + GtkTextBuffer *buf, + GtkTextIter *location, + GtkTextMark *mark, + UiTextArea *textview) +{ + const char *mname = gtk_text_mark_get_name(mark); + if(mname) { + GtkTextIter begin; + GtkTextIter end; + int sel = gtk_text_buffer_get_selection_bounds (buf, &begin, &end); + if(sel != textview->last_selection_state) { + if(sel) { + ui_set_group(textview->ctx, UI_GROUP_SELECTION); + } else { + ui_unset_group(textview->ctx, UI_GROUP_SELECTION); + } + } + textview->last_selection_state = sel; + } +} + UIWIDGET ui_textarea(UiObject *obj, UiText *value) { GtkWidget *text_area = gtk_text_view_new(); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text_area), GTK_WRAP_WORD_CHAR); g_signal_connect( - text_area, - "realize", - G_CALLBACK(ui_textarea_realize_event), - NULL); + text_area, + "realize", + G_CALLBACK(ui_textarea_realize_event), + NULL); + g_signal_connect( + text_area, + "selection-clear-event", + G_CALLBACK(selection_handler), + NULL); + + UiTextArea *uitext = ucx_mempool_malloc( + obj->ctx->mempool, + sizeof(UiTextArea)); + uitext->ctx = obj->ctx; + uitext->last_selection_state = 0; GtkWidget *scroll_area = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy( @@ -86,6 +119,12 @@ "delete-range", G_CALLBACK(ui_textbuf_delete), value); + + g_signal_connect( + buf, + "mark-set", + G_CALLBACK(selection_handler), + uitext); } return scroll_area;