... | ... |
@@ -1152,46 +1152,58 @@ redata_op_move(redata_t *redata, long posorig, long size, long posdest, undostac |
1152 | 1152 |
} |
1153 | 1153 |
|
1154 | 1154 |
int |
1155 |
-redata_op_undo(redata_t *redata) |
|
1155 |
+redata_op_undo(redata_t *redata, long *newcursorpos) |
|
1156 | 1156 |
{ |
1157 | 1157 |
undo_t *undo; |
1158 |
+ long newpos=0; |
|
1158 | 1159 |
if(redata==NULL |
1159 | 1160 |
|| redata->undostack.usedundo<1) |
1160 | 1161 |
return(-1); /* sanity check failed */ |
1161 | 1162 |
undo=redata->undostack.undo+redata->undostack.usedundo-1; |
1162 | 1163 |
if(undo->type=='A') { /* ADD */ |
1164 |
+ newpos=undo->posorig; |
|
1163 | 1165 |
redata_op_del(redata,undo->posorig,undo->len,&(redata->undostack)); |
1164 | 1166 |
} else if(undo->type=='D') { /* DEL */ |
1167 |
+ newpos=undo->posorig+undo->len; |
|
1165 | 1168 |
redata_op_add(redata,undo->posorig,redata->undostack.buf+undo->off,undo->len,&(redata->undostack)); |
1166 | 1169 |
} else if(undo->type=='M') { /* MOVE */ |
1170 |
+ newpos=undo->posorig+undo->len; |
|
1167 | 1171 |
if(undo->posorig<undo->posdest) |
1168 | 1172 |
redata_op_move(redata,undo->posdest-undo->len, undo->len, undo->posorig,&(redata->undostack)); |
1169 | 1173 |
else |
1170 | 1174 |
redata_op_move(redata,undo->posdest, undo->len, undo->posorig+undo->len,&(redata->undostack)); |
1171 | 1175 |
} else |
1172 | 1176 |
return(-1); /* unknown operation */ |
1177 |
+ if(newcursorpos!=NULL) |
|
1178 |
+ *newcursorpos=newpos; |
|
1173 | 1179 |
#warning TODO: Is it neccessary to do an unadd to the plugins? |
1174 |
- return(-1); |
|
1180 |
+ return(0); |
|
1175 | 1181 |
} |
1176 | 1182 |
|
1177 | 1183 |
int |
1178 |
-redata_op_redo(redata_t *redata) |
|
1184 |
+redata_op_redo(redata_t *redata, long *newcursorpos) |
|
1179 | 1185 |
{ |
1180 | 1186 |
undo_t *undo; |
1187 |
+ long newpos; |
|
1181 | 1188 |
if(redata==NULL |
1182 | 1189 |
|| redata->redostack.usedundo<1) |
1183 | 1190 |
return(-1); /* sanity check failed */ |
1184 | 1191 |
undo=redata->redostack.undo+redata->redostack.usedundo-1; |
1185 | 1192 |
if(undo->type=='A') { /* ADD */ |
1193 |
+ newpos=undo->posorig+undo->len; |
|
1186 | 1194 |
redata_op_add(redata,undo->posorig,redata->redostack.buf+undo->off,undo->len,&(redata->redostack)); |
1187 | 1195 |
} else if(undo->type=='D') { /* DEL */ |
1196 |
+ newpos=undo->posorig; |
|
1188 | 1197 |
redata_op_del(redata,undo->posorig,undo->len,&(redata->redostack)); |
1189 | 1198 |
} else if(undo->type=='M') { /* MOVE */ |
1199 |
+ newpos=undo->posorig+undo->len; |
|
1190 | 1200 |
redata_op_move(redata,undo->posorig, undo->len, undo->posdest,&(redata->redostack)); |
1191 | 1201 |
} else |
1192 | 1202 |
return(-1); /* unknown operation */ |
1193 | 1203 |
#warning TODO: Is it neccessary to do an unadd to the plugins? |
1194 |
- return(-1); |
|
1204 |
+ if(newcursorpos!=NULL) |
|
1205 |
+ *newcursorpos=newpos; |
|
1206 |
+ return(0); |
|
1195 | 1207 |
} |
1196 | 1208 |
|
1197 | 1209 |
int |
... | ... |
@@ -1679,7 +1691,7 @@ redata_pos2linecol(redata_t *redata, long pos, int *resline, int *rescol) |
1679 | 1691 |
int |
1680 | 1692 |
redata_linecol2pos(redata_t *redata, int line, int colrequest, long *pos, int *coldone) |
1681 | 1693 |
{ |
1682 |
- long chunkpos,realstart,newpos,curpos,startpos; |
|
1694 |
+ long chunkpos,realstart,curpos,startpos; |
|
1683 | 1695 |
int startline; |
1684 | 1696 |
int nchunk; |
1685 | 1697 |
rechunk_t *chunk; |
... | ... |
@@ -126,8 +126,8 @@ int redata_op_add(redata_t *redata, long pos, char *buf, long buflen, undostack_ |
126 | 126 |
int redata_op_addn(redata_t *redata, long pos, char character, long n, undostack_t *fromhere); |
127 | 127 |
int redata_op_del(redata_t *redata, long pos, long size, undostack_t *fromhere); |
128 | 128 |
int redata_op_move(redata_t *redata, long posorig, long size, long posdest, undostack_t *fromhere); |
129 |
-int redata_op_undo(redata_t *redata); |
|
130 |
-int redata_op_redo(redata_t *redata); |
|
129 |
+int redata_op_undo(redata_t *redata, long *newcursorpos); |
|
130 |
+int redata_op_redo(redata_t *redata, long *newcursorpos); |
|
131 | 131 |
|
132 | 132 |
int redata_data_compare(redata_t *redata, long pos, char *buf, long buflen); |
133 | 133 |
|
... | ... |
@@ -329,7 +329,7 @@ if(k!=0) redata_save(redata,"test.post"); |
329 | 329 |
errorbuf[sizeof(errorbuf)-1]='\0'; |
330 | 330 |
return(errorbuf); |
331 | 331 |
} |
332 |
- redata_op_undo(redata); |
|
332 |
+ redata_op_undo(redata,NULL); |
|
333 | 333 |
redata_save(redata,"test.undo"); |
334 | 334 |
redata_hash(redata,hash129_redata); |
335 | 335 |
if(strcmp(hash129_redata,hash129_memold)!=0) { |
... | ... |
@@ -340,7 +340,7 @@ redata_save(redata,"test.undo"); |
340 | 340 |
errorbuf[sizeof(errorbuf)-1]='\0'; |
341 | 341 |
return(errorbuf); |
342 | 342 |
} |
343 |
- redata_op_redo(redata); |
|
343 |
+ redata_op_redo(redata,NULL); |
|
344 | 344 |
redata_save(redata,"test.redo"); |
345 | 345 |
redata_hash(redata,hash129_redata); |
346 | 346 |
if(strcmp(hash129_redata,hash129_mem)!=0) { |
... | ... |
@@ -412,6 +412,21 @@ fprintf(stderr,"SDL_KEYDOWN: sym:%i\n",event->key.keysym.sym); |
412 | 412 |
fprintf(stderr,"re_processkey(): received Control+q\n"); |
413 | 413 |
re->command=""; |
414 | 414 |
re->headerdirty=1; |
415 |
+ } else if(event->key.keysym.sym==SDLK_z && (SDL_GetModState()&KMOD_CTRL)!=0) { |
|
416 |
+ long newpos; |
|
417 |
+ int oldline; |
|
418 |
+fprintf(stderr,"re_processkey(): received Control+z\n"); |
|
419 |
+ if(redata_op_undo(re->data,&newpos)) |
|
420 |
+ return(-1); |
|
421 |
+ re->cursorpos=newpos; |
|
422 |
+ redata_pos2linecol(re->data,re->cursorpos,&(re->curline),&(re->curcol)); |
|
423 |
+ if(re->curline<re->originline || re->curline>=(re->originline+re->maxrow)) { |
|
424 |
+ re->originline=re->curline-(re->maxrow/2); |
|
425 |
+ re->originline=(re->originline<0)?0:re->originline; |
|
426 |
+ } |
|
427 |
+ re->origincol=(re->curcol>(re->maxcol-COLFORCESCROLL))?(re->curcol-(re->maxcol-COLFORCESCROLL)):0; |
|
428 |
+ re->headerdirty=1; |
|
429 |
+ re->contentsdirty=1; |
|
415 | 430 |
} |
416 | 431 |
return(0); |
417 | 432 |
} |