@@ -340,6 +340,58 @@ char* ctr_internal_gui_copytext(char* src, uint32_t pos, uint32_t len) {
340
340
return buffer ;
341
341
}
342
342
343
+ void ctr_internal_gui_copy (lv_obj_t * obj ) {
344
+ int issel = lv_textarea_text_is_selected (obj );
345
+ if (!issel ) return ;
346
+ lv_obj_t * txt = lv_textarea_get_label (obj );
347
+ uint32_t selstart = lv_label_get_text_selection_start (txt );
348
+ uint32_t selend = lv_label_get_text_selection_end (txt );
349
+ char * oldbuf = lv_textarea_get_text (obj );
350
+ uint32_t sellen = selend - selstart ;
351
+ char * selbuf ;
352
+ selbuf = ctr_internal_gui_copytext (oldbuf , selstart , sellen );
353
+ SDL_SetClipboardText (selbuf );
354
+ ctr_heap_free (selbuf );
355
+ }
356
+
357
+ void ctr_internal_gui_paste (lv_obj_t * obj ) {
358
+ lv_obj_t * txt = lv_textarea_get_label (obj );
359
+ uint32_t selstart = lv_label_get_text_selection_start (txt );
360
+ uint32_t selend = lv_label_get_text_selection_end (txt );
361
+ char * oldbuf = lv_textarea_get_text (obj );
362
+ uint32_t sellen = selend - selstart ;
363
+ char * selbuf ;
364
+ int issel = lv_textarea_text_is_selected (obj );
365
+ uint32_t pos = lv_textarea_get_cursor_pos (obj );
366
+ if (SDL_HasClipboardText ()) {
367
+ if (issel ) lv_label_cut_text (txt , selstart , sellen );
368
+ selbuf = SDL_GetClipboardText ();
369
+ lv_label_ins_text (txt , pos , selbuf );
370
+ if (issel ) {
371
+ lv_textarea_set_cursor_pos (obj , pos + sellen );
372
+ lv_textarea_clear_selection (obj );
373
+ }
374
+ SDL_free (selbuf );
375
+ }
376
+ }
377
+
378
+ void ctr_internal_gui_cut (lv_obj_t * obj ) {
379
+ int issel = lv_textarea_text_is_selected (obj );
380
+ if (!issel ) return ;
381
+ lv_obj_t * txt = lv_textarea_get_label (obj );
382
+ uint32_t selstart = lv_label_get_text_selection_start (txt );
383
+ uint32_t selend = lv_label_get_text_selection_end (txt );
384
+ char * oldbuf = lv_textarea_get_text (obj );
385
+ uint32_t sellen = abs (selend - selstart );
386
+ char * selbuf ;
387
+ selbuf = ctr_internal_gui_copytext (oldbuf , selstart , sellen );
388
+ lv_label_cut_text (txt , selstart , sellen );
389
+ SDL_SetClipboardText (selbuf );
390
+ lv_textarea_set_cursor_pos (obj , selstart );
391
+ ctr_heap_free (selbuf );
392
+ lv_textarea_clear_selection (obj );
393
+ }
394
+
343
395
void ctr_internal_gui_context_menu_close () {
344
396
if (CtrGUIContextMenu ) {
345
397
lv_obj_del (CtrGUIContextMenu );
@@ -352,41 +404,18 @@ void ctr_internal_gui_context_actions(lv_event_t * e) {
352
404
ctr_internal_gui_context_menu_close ();
353
405
return ;
354
406
}
355
- int issel = lv_textarea_text_is_selected (CtrGUIContextFocus );
356
407
lv_obj_t * obj = lv_event_get_target_obj (e );
357
- lv_obj_t * txt = lv_textarea_get_label (CtrGUIContextFocus );
358
- uint32_t selstart = lv_label_get_text_selection_start (txt );
359
- uint32_t selend = lv_label_get_text_selection_end (txt );
360
- char * oldbuf = lv_textarea_get_text (CtrGUIContextFocus );
361
- uint32_t sellen = selend - selstart ;
362
- char * selbuf ;
363
408
int close = 1 ;
364
- uint32_t pos = lv_textarea_get_cursor_pos (CtrGUIContextFocus );
365
409
if ((obj == CtrGUIContextMenuItemSelAll || obj == CtrGUIContextMenuLabelSelAll )) {
366
410
lv_textarea_selection_all (CtrGUIContextFocus );
367
411
close = 0 ;
368
- } else if (issel && (obj == CtrGUIContextMenuItemCopy || obj == CtrGUIContextMenuLabelCopy )) {
369
- selbuf = ctr_internal_gui_copytext (oldbuf , selstart , sellen );
370
- SDL_SetClipboardText (selbuf );
371
- ctr_heap_free (selbuf );
372
- } else if (issel && (obj == CtrGUIContextMenuItemCut || obj == CtrGUIContextMenuLabelCut )) {
373
- selbuf = ctr_internal_gui_copytext (oldbuf , selstart , sellen );
374
- lv_label_cut_text (txt , selstart , sellen );
375
- SDL_SetClipboardText (selbuf );
376
- lv_textarea_set_cursor_pos (CtrGUIContextFocus , selstart );
377
- ctr_heap_free (selbuf );
412
+ } else if ((obj == CtrGUIContextMenuItemCopy || obj == CtrGUIContextMenuLabelCopy )) {
413
+ ctr_internal_gui_copy (CtrGUIContextFocus );
414
+ } else if ((obj == CtrGUIContextMenuItemCut || obj == CtrGUIContextMenuLabelCut )) {
415
+ ctr_internal_gui_cut (CtrGUIContextFocus );
378
416
}
379
417
else if (obj == CtrGUIContextMenuItemPaste || obj == CtrGUIContextMenuLabelPaste ) {
380
- if (SDL_HasClipboardText ()) {
381
- if (issel ) lv_label_cut_text (txt , selstart , sellen );
382
- selbuf = SDL_GetClipboardText ();
383
- lv_label_ins_text (txt , pos , selbuf );
384
- if (issel ) {
385
- lv_textarea_set_cursor_pos (CtrGUIContextFocus , pos + sellen );
386
- lv_textarea_clear_selection (CtrGUIContextFocus );
387
- }
388
- SDL_free (selbuf );
389
- }
418
+ ctr_internal_gui_paste (CtrGUIContextFocus );
390
419
}
391
420
if (close ) ctr_internal_gui_context_menu_close ();
392
421
}
@@ -498,6 +527,9 @@ ctr_object* ctr_gui_xml_at_set(ctr_object* myself, ctr_argument* argumentList) {
498
527
lv_obj_t * child = root ;
499
528
if (CtrEventHandler == NULL ) {
500
529
CtrEventHandler = lv_obj_add_event_cb (root , & ctr_gui_internal_event_handler , LV_EVENT_ALL , NULL );
530
+ lv_textarea_set_copy_handler ((LV_TEXTAREA_HANDLER ) ctr_internal_gui_copy );
531
+ lv_textarea_set_paste_handler ((LV_TEXTAREA_HANDLER ) ctr_internal_gui_paste );
532
+ lv_textarea_set_cut_handler ((LV_TEXTAREA_HANDLER ) ctr_internal_gui_cut );
501
533
}
502
534
if (argumentList -> next -> next -> object != CtrStdNil ) {
503
535
id = ctr_tonum (argumentList -> next -> next -> object );
0 commit comments