Browse code

implement CUA92-style copy/cut/paste

Dario Rodriguez authored on 23/11/2020 22:59:53
Showing 1 changed files
... ...
@@ -699,6 +699,44 @@ fprintf(stderr,"re_processkey(): received Control+'-'\n");
699 699
 fprintf(stderr,"re_processkey(): received Control+'0'\n");
700 700
                 re_changefontsize(re, 0);
701 701
                 re->ignorenkeys++;
702
+        } else if((event->key.keysym.sym==SDLK_c || event->key.keysym.sym==SDLK_x) && (SDL_GetModState()&KMOD_CTRL)!=0) {
703
+                long frompos,topos,coldone;
704
+                int is_cut=(event->key.keysym.sym==SDLK_x)?1:0;
705
+fprintf(stderr,"re_processkey(): received Control+%c\n",is_cut?'x':'c');
706
+                /* CUA92-style copy (ctrl+c) / cut (ctrl+x) */
707
+                if(re->selactive
708
+                  && redata_linecol2pos(re->data,re->sellinefrom,re->selcolfrom,&frompos,NULL)==0
709
+                  && redata_linecol2pos(re->data,re->sellineto,re->selcolto,&topos,&coldone)==0) {
710
+                        re_selectbuf_fill(re,frompos,topos-frompos,re->selcolto-coldone);
711
+                        if(is_cut) {
712
+                                redata_undo_groupinit(re->data,NULL);
713
+                                redata_op_del(re->data,frompos,topos-frompos,NULL);
714
+                                redata_undo_groupcommit(re->data,NULL);
715
+                                re->cursorpos=frompos;
716
+                                redata_pos2linecol(re->data,re->cursorpos,&(re->curline),&(re->curcol));
717
+                                re_fixorigin(re);
718
+                                re->headerdirty=1;
719
+                        }
720
+                        re_sel_toggle(re);
721
+                        re->contentsdirty=1;
722
+                }
723
+                re->ignorenkeys++;
724
+        } else if(event->key.keysym.sym==SDLK_v && (SDL_GetModState()&KMOD_CTRL)!=0) {
725
+fprintf(stderr,"re_processkey(): received Control+v\n");
726
+                /* CUA92-style paste (ctrl+v)*/
727
+                if(re->selactive)
728
+                        re_sel_toggle(re);
729
+                if(re->usedselectbuf>0) {
730
+                        redata_undo_groupinit(re->data,NULL);
731
+                        redata_op_add(re->data,re->cursorpos,re->selectbuf,re->usedselectbuf,NULL);
732
+                        redata_undo_groupcommit(re->data,NULL);
733
+                        re->cursorpos+=re->usedselectbuf;
734
+                        redata_pos2linecol(re->data,re->cursorpos,&(re->curline),&(re->curcol));
735
+                        re_fixorigin(re);
736
+                        re->headerdirty=1;
737
+                        re->contentsdirty=1;
738
+                }
739
+                re->ignorenkeys++;
702 740
         }
703 741
         return(0);
704 742
 }