Browse code

Added 'Exit without saving?' confirmation dialog

Dario Rodriguez authored on 30/11/2020 21:40:46
Showing 3 changed files
... ...
@@ -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) {