... | ... |
@@ -675,6 +675,8 @@ redata_load(redata_t *redata, char *filename, char **errordesc) |
675 | 675 |
} |
676 | 676 |
redata_loadquestions_wipe(redata); |
677 | 677 |
#warning TODO: IMPLEMENT POSTLOADQUESTIONS (call now loadquestion_postload). |
678 |
+ /* mark as not modified */ |
|
679 |
+ redata->needs_saving=0; |
|
678 | 680 |
/* all done */ |
679 | 681 |
return(0); |
680 | 682 |
} |
... | ... |
@@ -724,9 +726,20 @@ redata_save(redata_t *redata, char *filename, char **errordesc) |
724 | 726 |
} |
725 | 727 |
strncpy(redata->filename,filename,sizeof(redata->filename)); |
726 | 728 |
redata->filename[sizeof(redata->filename)-1]='\0'; |
729 |
+ /* mark as not modified */ |
|
730 |
+ redata->needs_saving=0; |
|
727 | 731 |
return(0); |
728 | 732 |
} |
729 | 733 |
|
734 |
+int |
|
735 |
+redata_needs_saving(redata_t *redata) |
|
736 |
+{ |
|
737 |
+ if(redata==NULL) |
|
738 |
+ return(0); |
|
739 |
+ return( (redata->needs_saving)?1:0 ); |
|
740 |
+} |
|
741 |
+ |
|
742 |
+ |
|
730 | 743 |
int |
731 | 744 |
redata_undobuf_reserve(redata_t *redata, undostack_t *stack, int minavail) |
732 | 745 |
{ |
... | ... |
@@ -1032,6 +1045,8 @@ redata_op_add(redata_t *redata, long insertpos, char *buf, long buflen, undostac |
1032 | 1045 |
/* compact if needed */ |
1033 | 1046 |
if(redata_getsize(redata)>(redata->chunkdatasize) && redata_getavailable(redata)>(redata_getsize(redata)/2)) |
1034 | 1047 |
redata_compact(redata); |
1048 |
+ /* mark as modified */ |
|
1049 |
+ redata->needs_saving=1; |
|
1035 | 1050 |
return(0); |
1036 | 1051 |
} |
1037 | 1052 |
|
... | ... |
@@ -1122,6 +1137,8 @@ redata_op_del(redata_t *redata, long delpos, long size, undostack_t *fromhere) |
1122 | 1137 |
/* compact if needed */ |
1123 | 1138 |
if(redata_getsize(redata)>(redata->chunkdatasize) && redata_getavailable(redata)>(redata_getsize(redata)/2)) |
1124 | 1139 |
redata_compact(redata); |
1140 |
+ /* mark as modified */ |
|
1141 |
+ redata->needs_saving=1; |
|
1125 | 1142 |
return(0); |
1126 | 1143 |
} |
1127 | 1144 |
|
... | ... |
@@ -1261,6 +1278,8 @@ redata_op_move(redata_t *redata, long posorig, long size, long posdest, undostac |
1261 | 1278 |
/* compact if needed */ |
1262 | 1279 |
if(redata_getsize(redata)>(redata->chunkdatasize) && redata_getavailable(redata)>(redata_getsize(redata)/2)) |
1263 | 1280 |
redata_compact(redata); |
1281 |
+ /* mark as modified */ |
|
1282 |
+ redata->needs_saving=1; |
|
1264 | 1283 |
return(0); |
1265 | 1284 |
} |
1266 | 1285 |
|
... | ... |
@@ -1289,7 +1308,8 @@ redata_op_undo(redata_t *redata, long *newcursorpos) |
1289 | 1308 |
return(-1); /* unknown operation */ |
1290 | 1309 |
if(newcursorpos!=NULL) |
1291 | 1310 |
*newcursorpos=newpos; |
1292 |
-#warning TODO: Is it neccessary to do an unadd to the plugins? |
|
1311 |
+ /* mark as modified */ |
|
1312 |
+ redata->needs_saving=1; |
|
1293 | 1313 |
return(0); |
1294 | 1314 |
} |
1295 | 1315 |
|
... | ... |
@@ -1316,6 +1336,8 @@ redata_op_redo(redata_t *redata, long *newcursorpos) |
1316 | 1336 |
#warning TODO: Is it neccessary to do an unadd to the plugins? |
1317 | 1337 |
if(newcursorpos!=NULL) |
1318 | 1338 |
*newcursorpos=newpos; |
1339 |
+ /* mark as modified */ |
|
1340 |
+ redata->needs_saving=1; |
|
1319 | 1341 |
return(0); |
1320 | 1342 |
} |
1321 | 1343 |
|
... | ... |
@@ -82,6 +82,7 @@ typedef struct redata_plugin_t { |
82 | 82 |
|
83 | 83 |
typedef struct redata_t { |
84 | 84 |
char filename[PATH_MAX]; |
85 |
+ int needs_saving; |
|
85 | 86 |
/* data */ |
86 | 87 |
long chunkdatasize; |
87 | 88 |
int sizechunks; |
... | ... |
@@ -145,6 +146,9 @@ int redata_loadquestions_wipe(redata_t *redata); |
145 | 146 |
int redata_load(redata_t *redata, char *filename, char **errordesc); |
146 | 147 |
int redata_save(redata_t *redata, char *filename, char **errordesc); |
147 | 148 |
|
149 |
+int redata_needs_saving(redata_t *redata); |
|
150 |
+ |
|
151 |
+ |
|
148 | 152 |
int redata_op_add(redata_t *redata, long pos, char *buf, long buflen, undostack_t *fromhere); |
149 | 153 |
int redata_op_addn(redata_t *redata, long pos, char character, long n, undostack_t *fromhere); |
150 | 154 |
int redata_op_del(redata_t *redata, long pos, long size, undostack_t *fromhere); |
... | ... |
@@ -38,6 +38,7 @@ |
38 | 38 |
#define COMMAND_REPLACEWHAT "Search for:" |
39 | 39 |
#define COMMAND_REPLACEWITH "Replace with:" |
40 | 40 |
#define COMMAND_REPLACEHOW "Replace options (Igncase Selected Backwards Entire All Noconfirm):" |
41 |
+#define COMMAND_CONFIRMEXIT "There is unsaved data. Please confirm exit with y+ENTER:" |
|
41 | 42 |
#define COMMAND_QUESTION "(?)" |
42 | 43 |
#define COMMAND_EXIT "Exit" |
43 | 44 |
|
... | ... |
@@ -236,7 +237,13 @@ fprintf(stderr,"RENDER\n"); |
236 | 237 |
flag_had_events=10; |
237 | 238 |
switch(event.type) { |
238 | 239 |
case SDL_QUIT: |
239 |
- do_exit=1; |
|
240 |
+ if(redata_needs_saving(re->data)) { |
|
241 |
+ re->command=COMMAND_CONFIRMEXIT; |
|
242 |
+ re->commandbuf[0]='\0'; |
|
243 |
+ re->headerdirty=1; |
|
244 |
+ } else { |
|
245 |
+ do_exit=1; |
|
246 |
+ } |
|
240 | 247 |
break; |
241 | 248 |
case SDL_KEYDOWN: |
242 | 249 |
case SDL_TEXTINPUT: |
... | ... |
@@ -812,8 +819,13 @@ re_processkey_commandwait(re_t *re, SDL_Event *event) |
812 | 819 |
re->commandbuf[sizeof(re->commandbuf)-1]='\0'; |
813 | 820 |
re->headerdirty=1; |
814 | 821 |
} else if(re->command_first_key=='k' && event->key.keysym.sym==SDLK_q) { |
815 |
- re->command=COMMAND_EXIT; |
|
816 |
- re->commandbuf[0]='\0'; |
|
822 |
+ if(redata_needs_saving(re->data)) { |
|
823 |
+ re->command=COMMAND_CONFIRMEXIT; |
|
824 |
+ re->commandbuf[0]='\0'; |
|
825 |
+ } else { |
|
826 |
+ re->command=COMMAND_EXIT; |
|
827 |
+ re->commandbuf[0]='\0'; |
|
828 |
+ } |
|
817 | 829 |
re->headerdirty=1; |
818 | 830 |
} else if(re->command_first_key=='k' && event->key.keysym.sym==SDLK_h) { |
819 | 831 |
re_sel_toggle(re); |
... | ... |
@@ -956,7 +968,15 @@ re_processcommand(re_t *re) |
956 | 968 |
if(re==NULL || re->command==NULL) |
957 | 969 |
return(-1); |
958 | 970 |
re->commandbuf[sizeof(re->commandbuf)-1]='\0'; |
959 |
- if(strcmp(re->command,COMMAND_GOTOLINE)==0) { |
|
971 |
+ if(strcmp(re->command,COMMAND_CONFIRMEXIT)==0) { |
|
972 |
+ if(strcmp(re->commandbuf,"y")==0) { |
|
973 |
+ re->command=COMMAND_EXIT; |
|
974 |
+ re->commandbuf[0]='\0'; |
|
975 |
+ re->headerdirty=1; |
|
976 |
+ return(0); |
|
977 |
+ } |
|
978 |
+ re->headerdirty=1; |
|
979 |
+ } else if(strcmp(re->command,COMMAND_GOTOLINE)==0) { |
|
960 | 980 |
int line; |
961 | 981 |
long pos; |
962 | 982 |
line=atoi(re->commandbuf)-1; |
... | ... |
@@ -1566,7 +1586,7 @@ re_drawheader_command(re_t *re) |
1566 | 1586 |
if(re->command[0]=='\0') { |
1567 | 1587 |
reui_fill(re->ui,0,0,re->ui->w,re->ui->fontheight,COLOR_QUERYBG); |
1568 | 1588 |
reui_printf(re->ui,0,0,COLOR_QUERYFG,"Command:"); |
1569 |
- } else if(strcmp(re->command,COMMAND_WARNING)==0) { |
|
1589 |
+ } else if(strcmp(re->command,COMMAND_WARNING)==0 || strcmp(re->command,COMMAND_CONFIRMEXIT)==0) { |
|
1570 | 1590 |
reui_fill(re->ui,0,0,re->ui->w,re->ui->fontheight,COLOR_WARNINGBG); |
1571 | 1591 |
reui_printf(re->ui,0,0,COLOR_WARNINGFG,"%s %s",re->command,re->commandbuf); |
1572 | 1592 |
} else if(strcmp(re->command,COMMAND_INFO)==0) { |