ui/gtk/text.c

changeset 22
bcf880b29bc3
parent 12
fe94e0fb9ef3
child 27
77b09bb52ca0
--- 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;

mercurial