| 95 #endif |
95 #endif |
| 96 |
96 |
| 97 static GtkTextBuffer* create_textbuffer(UiTextArea *textarea) { |
97 static GtkTextBuffer* create_textbuffer(UiTextArea *textarea) { |
| 98 GtkTextBuffer *buf = gtk_text_buffer_new(NULL); |
98 GtkTextBuffer *buf = gtk_text_buffer_new(NULL); |
| 99 if(textarea) { |
99 if(textarea) { |
| |
100 /* |
| 100 g_signal_connect( |
101 g_signal_connect( |
| 101 buf, |
102 buf, |
| 102 "changed", |
103 "changed", |
| 103 G_CALLBACK(ui_textbuf_changed), |
104 G_CALLBACK(ui_textbuf_changed), |
| 104 textarea); |
105 textarea); |
| |
106 */ |
| |
107 |
| |
108 g_signal_connect( |
| |
109 buf, |
| |
110 "insert-text", |
| |
111 G_CALLBACK(ui_textbuf_changed_insert), |
| |
112 textarea); |
| |
113 g_signal_connect( |
| |
114 buf, |
| |
115 "delete-range", |
| |
116 G_CALLBACK(ui_textbuf_changed_delete), |
| |
117 textarea); |
| 105 } else { |
118 } else { |
| 106 fprintf(stderr, "Error: create_textbuffer: textarea == NULL\n"); |
119 fprintf(stderr, "Error: create_textbuffer: textarea == NULL\n"); |
| 107 } |
120 } |
| 108 return buf; |
121 return buf; |
| 109 } |
122 } |
| 448 void ui_textarea_realize_event(GtkWidget *widget, gpointer data) { |
461 void ui_textarea_realize_event(GtkWidget *widget, gpointer data) { |
| 449 gtk_widget_grab_focus(widget); |
462 gtk_widget_grab_focus(widget); |
| 450 } |
463 } |
| 451 |
464 |
| 452 |
465 |
| 453 |
466 void ui_textbuf_changed_insert( |
| 454 void ui_textbuf_changed(GtkTextBuffer *textbuffer, UiTextArea *textarea) { |
467 GtkTextBuffer *textbuffer, |
| |
468 GtkTextIter *location, |
| |
469 char *text, |
| |
470 int length, |
| |
471 UiTextArea *textarea) |
| |
472 { |
| |
473 UiTextChangeEventData event; |
| |
474 event.type = UI_TEXT_INSERT; |
| |
475 event.begin = gtk_text_iter_get_offset(location); |
| |
476 event.end = event.begin + length; |
| |
477 event.text = text; |
| |
478 event.length = length; |
| |
479 ui_textbuf_changed(textarea, &event); |
| |
480 } |
| |
481 |
| |
482 void ui_textbuf_changed_delete( |
| |
483 GtkTextBuffer *self, |
| |
484 const GtkTextIter *start, |
| |
485 const GtkTextIter *end, |
| |
486 UiTextArea *textarea) |
| |
487 { |
| |
488 UiTextChangeEventData event; |
| |
489 event.type = UI_TEXT_DELETE; |
| |
490 event.begin = gtk_text_iter_get_offset(start); |
| |
491 event.end = gtk_text_iter_get_offset(end); |
| |
492 event.text = NULL; |
| |
493 event.length = 0; |
| |
494 ui_textbuf_changed(textarea, &event); |
| |
495 } |
| |
496 |
| |
497 |
| |
498 // void ui_textbuf_changed(GtkTextBuffer *textbuffer, UiTextArea *textarea) |
| |
499 |
| |
500 void ui_textbuf_changed(UiTextArea *textarea, UiTextChangeEventData *data) { |
| 455 if(!ui_onchange_events_is_enabled()) { |
501 if(!ui_onchange_events_is_enabled()) { |
| 456 return; |
502 return; |
| 457 } |
503 } |
| 458 |
504 |
| 459 UiText *value = textarea->var->value; |
505 UiText *value = textarea->var->value; |
| 460 |
506 |
| 461 UiEvent e; |
507 UiEvent e; |
| 462 e.obj = textarea->obj; |
508 e.obj = textarea->obj; |
| 463 e.window = e.obj->window; |
509 e.window = e.obj->window; |
| 464 e.document = textarea->ctx->document; |
510 e.document = textarea->ctx->document; |
| 465 e.eventdata = value; |
511 e.eventdata = data; |
| 466 e.eventdatatype = UI_EVENT_DATA_TEXT_VALUE; |
512 e.eventdatatype = UI_EVENT_DATA_TEXT_CHANGED; |
| 467 e.intval = 0; |
513 e.intval = 0; |
| 468 e.set = ui_get_setop(); |
514 e.set = ui_get_setop(); |
| 469 |
515 |
| 470 if(textarea->onchange) { |
516 if(textarea->onchange) { |
| 471 textarea->onchange(&e, textarea->onchangedata); |
517 textarea->onchange(&e, textarea->onchangedata); |