shell_command-make-input-parameter-optional.patch: add changes to help.etx
[nedit-bw.git] / remove_zero_sized_files.patch
blobd29eb3404578dce62efd7f695568e52ce8dd04bd
1 If a window will be closed, check the file size and never/prompt/always
2 remove the file if the size is 0.
4 ---
6 doc/help.etx | 3 +++
7 source/file.c | 28 ++++++++++++++++++++++++++++
8 source/menu.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
9 source/nedit.h | 4 ++++
10 source/preferences.c | 22 +++++++++++++++++++++-
11 source/preferences.h | 2 ++
12 6 files changed, 106 insertions(+), 1 deletion(-)
14 diff --quilt old/source/file.c new/source/file.c
15 --- old/source/file.c
16 +++ new/source/file.c
17 @@ -772,10 +772,35 @@ int CloseAllFilesAndWindows(void)
20 return TRUE;
23 +static void removeZeroSizedFile(WindowInfo *window)
25 + int response;
26 + struct stat statbuf;
27 + char fullname[MAXPATHLEN + 1];
29 + /* Get the full name of the file */
30 + strcpy(fullname, window->path);
31 + strcat(fullname, window->filename);
33 + if (GetPrefZeroSizedMode() == ZEROSIZED_NEVER)
34 + return;
36 + if (stat(fullname, &statbuf) == 0 && statbuf.st_size == 0) {
37 + if (GetPrefZeroSizedMode() == ZEROSIZED_PROMPT) {
38 + response = DialogF(DF_QUES, window->shell, 2, "Zero Sized File",
39 + "%s has a file size of 0.\nDo you want to remove this file?",
40 + "Yes", "No", fullname);
41 + if (response == 2)
42 + return;
43 + }
44 + remove(fullname);
45 + }
48 int CloseFileAndWindow(WindowInfo *window, int preResponse)
50 int response, stat;
52 /* Make sure that the window is not in iconified state */
53 @@ -792,10 +817,11 @@ int CloseFileAndWindow(WindowInfo *windo
54 /* New document, unchanged yet */
55 || (window->fileMissing && window->lastModTime == 0)
56 /* File deleted/modified externally, ignored by user. */
57 || !GetPrefWarnFileMods())))
59 + removeZeroSizedFile(window);
60 RemoveBackupFile(window);
61 CloseWindow(window);
62 /* up-to-date windows don't have outstanding backup files to close */
63 } else
65 @@ -812,17 +838,19 @@ int CloseFileAndWindow(WindowInfo *windo
67 /* Save */
68 stat = SaveWindow(window);
69 if (stat)
71 + removeZeroSizedFile(window);
72 CloseWindow(window);
73 } else
75 return FALSE;
77 } else if (response == NO_SBC_DIALOG_RESPONSE)
79 + removeZeroSizedFile(window);
80 /* Don't Save */
81 RemoveBackupFile(window);
82 CloseWindow(window);
83 } else /* 3 == Cancel */
85 diff --quilt old/source/menu.c new/source/menu.c
86 --- old/source/menu.c
87 +++ new/source/menu.c
88 @@ -142,10 +142,13 @@ static void smartIndentDefCB(Widget w, W
89 static void autoSaveDefCB(Widget w, WindowInfo *window, caddr_t callData);
90 static void preserveDefCB(Widget w, WindowInfo *window, caddr_t callData);
91 static void ignoreHardlinkDefCB(Widget w, WindowInfo *window, caddr_t callData);
92 static void promptHardlinkDefCB(Widget w, WindowInfo *window, caddr_t callData);
93 static void unlinkHardlinkDefCB(Widget w, WindowInfo *window, caddr_t callData);
94 +static void neverZeroSizedDefCB(Widget w, WindowInfo *window, caddr_t callData);
95 +static void promptZeroSizedDefCB(Widget w, WindowInfo *window, caddr_t callData);
96 +static void alwaysZeroSizedDefCB(Widget w, WindowInfo *window, caddr_t callData);
97 static void noWrapDefCB(Widget w, WindowInfo *window, caddr_t callData);
98 static void newlineWrapDefCB(Widget w, WindowInfo *window, caddr_t callData);
99 static void contWrapDefCB(Widget w, WindowInfo *window, caddr_t callData);
100 static void wrapMarginDefCB(Widget w, WindowInfo *window, caddr_t callData);
101 static void shellSelDefCB(Widget widget, WindowInfo* window, caddr_t callData);
102 @@ -1035,10 +1038,23 @@ Widget CreateMenuBar(Widget parent, Wind
103 GetPrefHardlinkMode() == HARDLINK_PROMPT, SHORT);
104 window->hardlinkDefItem[HARDLINK_UNLINK] = createMenuRadioToggle(
105 subSubPane, "unlink", "Unlink", 'U', unlinkHardlinkDefCB, window,
106 GetPrefHardlinkMode() == HARDLINK_UNLINK, SHORT);
108 + /* zero sized mode default sub menu */
109 + subSubPane = createMenu(subPane, "zeroSizedMode", "Remove Zero Sized Files", 'Z',
110 + NULL, FULL);
111 + window->zeroSizedDefItem[ZEROSIZED_NEVER] = createMenuRadioToggle(
112 + subSubPane, "never", "Never", 'N', neverZeroSizedDefCB, window,
113 + GetPrefZeroSizedMode() == ZEROSIZED_NEVER, SHORT);
114 + window->zeroSizedDefItem[ZEROSIZED_PROMPT] = createMenuRadioToggle(
115 + subSubPane, "prompt", "Prompt", 'P', promptZeroSizedDefCB, window,
116 + GetPrefZeroSizedMode() == ZEROSIZED_PROMPT, SHORT);
117 + window->zeroSizedDefItem[ZEROSIZED_ALWAYS] = createMenuRadioToggle(
118 + subSubPane, "always", "Always", 'A', alwaysZeroSizedDefCB, window,
119 + GetPrefZeroSizedMode() == ZEROSIZED_ALWAYS, SHORT);
121 /* Show Matching sub menu */
122 subSubPane = createMenu(subPane, "showMatching", "Show Matching (..)", 'M',
123 NULL, FULL);
124 window->showMatchingOffDefItem = createMenuRadioToggle(subSubPane, "off",
125 "Off", 'O', showMatchingOffDefCB, window,
126 @@ -1915,10 +1931,42 @@ static void promptHardlinkDefCB(Widget w
127 static void unlinkHardlinkDefCB(Widget w, WindowInfo *window, caddr_t callData)
129 setHardlinkModeMenu(HARDLINK_UNLINK);
132 +static void setZeroSizedModeMenu(enum zeroSizedMode mode)
134 + WindowInfo *win;
135 + int i;
137 + if (mode >= N_ZEROSIZED_MODES)
138 + return;
140 + /* Set the preference and make the other windows' menus agree */
141 + SetPrefZeroSizedMode(mode);
142 + for (win = WindowList; win != NULL; win = win->next) {
143 + for (i = 0; i < N_ZEROSIZED_MODES; i++)
144 + XmToggleButtonSetState(win->zeroSizedDefItem[i],
145 + mode == i ? True : False, False);
149 +static void neverZeroSizedDefCB(Widget w, WindowInfo *window, caddr_t callData)
151 + setZeroSizedModeMenu(ZEROSIZED_NEVER);
154 +static void promptZeroSizedDefCB(Widget w, WindowInfo *window, caddr_t callData)
156 + setZeroSizedModeMenu(ZEROSIZED_PROMPT);
159 +static void alwaysZeroSizedDefCB(Widget w, WindowInfo *window, caddr_t callData)
161 + setZeroSizedModeMenu(ZEROSIZED_ALWAYS);
164 static void fontDefCB(Widget w, WindowInfo *window, caddr_t callData)
166 HidePointerOnKeyedEvent(WidgetToWindow(MENU_WIDGET(w))->lastFocus,
167 ((XmAnyCallbackStruct *)callData)->event);
168 ChooseFonts(WidgetToWindow(MENU_WIDGET(w)), False);
169 diff --quilt old/source/nedit.h new/source/nedit.h
170 --- old/source/nedit.h
171 +++ new/source/nedit.h
172 @@ -114,10 +114,13 @@ enum showWrapMarginEnums {SHOW_WRAP_MARG
173 enum truncSubstitution {TRUNCSUBST_SILENT, TRUNCSUBST_FAIL, TRUNCSUBST_WARN, TRUNCSUBST_IGNORE};
175 /* This enum must be kept in sync with HardlinkModes[] in in preferences.c */
176 enum hardlinkMode {HARDLINK_IGNORE, HARDLINK_PROMPT, HARDLINK_UNLINK, N_HARDLINK_MODES};
178 +/* This enum must be kept in sync with ZeroSizedModes[] in in preferences.c */
179 +enum zeroSizedMode {ZEROSIZED_NEVER = 0, ZEROSIZED_PROMPT, ZEROSIZED_ALWAYS, N_ZEROSIZED_MODES};
181 #define NO_FLASH_STRING "off"
182 #define FLASH_DELIMIT_STRING "delimiter"
183 #define FLASH_RANGE_STRING "range"
185 #define CHARSET (XmStringCharSet)XmSTRING_DEFAULT_CHARSET
186 @@ -572,10 +575,11 @@ typedef struct _WindowInfo {
187 "tabbed" documents, while each document
188 has its own background menu. */
189 Boolean transient;
190 Widget hardlinkDefItem[N_HARDLINK_MODES];
191 Bool HLdontpromptagain;
192 + Widget zeroSizedDefItem[N_ZEROSIZED_MODES];
193 } WindowInfo;
195 extern WindowInfo *WindowList;
196 extern Display *TheDisplay;
197 extern Widget TheAppShell;
198 diff --quilt old/source/preferences.c new/source/preferences.c
199 --- old/source/preferences.c
200 +++ new/source/preferences.c
201 @@ -173,10 +173,17 @@ static char *HardlinkModes[] = {
202 "Prompt",
203 "Unlink",
204 NULL
207 +static char *ZeroSizedModes[] = {
208 + "Never",
209 + "Prompt",
210 + "Always",
211 + NULL
214 /* list of available language modes and language specific preferences */
215 static int NLanguageModes = 0;
216 typedef struct {
217 char *name;
218 int nExtensions;
219 @@ -345,10 +352,11 @@ static struct prefData {
220 Boolean showScrolltip;
221 Boolean honorSymlinks;
222 int truncSubstitution;
223 Boolean forceOSConversion;
224 int hardlinkMode;
225 + int zeroSizedMode;
226 } PrefData;
228 /* Temporary storage for preferences strings which are discarded after being
229 read */
230 static struct {
231 @@ -1178,11 +1186,13 @@ static PrefDescripRec PrefDescrip[] = {
232 {"showScrolltip", "ShowScrolltip", PREF_BOOLEAN, "True",
233 &PrefData.showScrolltip, NULL, False},
234 {"honorSymlinks", "HonorSymlinks", PREF_BOOLEAN, "True",
235 &PrefData.honorSymlinks, NULL, False},
236 {"hardlinkMode", "HardlinkMode", PREF_ENUM, "Ignore",
237 - &PrefData.hardlinkMode, HardlinkModes, True}
238 + &PrefData.hardlinkMode, HardlinkModes, True},
239 + {"zeroSizedMode", "ZeroSizedMode", PREF_ENUM, "Never",
240 + &PrefData.zeroSizedMode, ZeroSizedModes, True}
243 static XrmOptionDescRec OpTable[] = {
244 {"-wrap", ".autoWrap", XrmoptionNoArg, (caddr_t)"Continuous"},
245 {"-nowrap", ".autoWrap", XrmoptionNoArg, (caddr_t)"None"},
246 @@ -2348,10 +2358,20 @@ int GetPrefHardlinkMode(void)
247 void SetPrefHardlinkMode(int mode)
249 setIntPref(&PrefData.hardlinkMode, mode);
252 +int GetPrefZeroSizedMode(void)
254 + return PrefData.zeroSizedMode;
257 +void SetPrefZeroSizedMode(int mode)
259 + setIntPref(&PrefData.zeroSizedMode, mode);
263 ** If preferences don't get saved, ask the user on exit whether to save
265 void MarkPrefsChanged(void)
267 diff --quilt old/source/preferences.h new/source/preferences.h
268 --- old/source/preferences.h
269 +++ new/source/preferences.h
270 @@ -217,7 +217,9 @@ void SetPrefFocusOnRaise(Boolean);
271 void SetPrefShowCursorline(Boolean value);
272 Boolean GetPrefShowCursorline(void);
273 Boolean GetPrefShowScrolltip(void);
274 int GetPrefHardlinkMode(void);
275 void SetPrefHardlinkMode(int mode);
276 +int GetPrefZeroSizedMode(void);
277 +void SetPrefZeroSizedMode(int mode);
279 #endif /* NEDIT_PREFERENCES_H_INCLUDED */
280 diff --quilt old/doc/help.etx new/doc/help.etx
281 --- old/doc/help.etx
282 +++ new/doc/help.etx
283 @@ -3989,10 +3989,13 @@ Preferences
284 name but a new destine file or ignore it.
286 ~Unlink~
287 Always make a destine copy of the file.
289 +**Remove Zero Sized Files**
290 + NEdit can delete files after close, that have a size of 0.
292 **Show Hidden Files**
293 Show hidden files by default in file selection boxes.
295 **Show Cursorline**
296 Background the current line with a colored bar.