enhanced-hooks-fix: call SafeGC() at the end and fix return bug
[nedit-bw.git] / enhanced-fix-file_name_hook.patch
blob1b1867127a94fdea1545da1c3e265bb569f299fc
1 ---
3 source/macro.c | 8 ++++++--
4 source/macro.h | 2 +-
5 source/menu.c | 16 +++++++++++++---
6 source/selection.c | 14 ++++++++++++--
7 4 files changed, 32 insertions(+), 8 deletions(-)
9 diff --quilt old/source/macro.c new/source/macro.c
10 --- old/source/macro.c
11 +++ new/source/macro.c
12 @@ -6047,14 +6047,15 @@ static int readStringArg(DataValue dv, c
13 *errMsg = "%s called with unknown object";
14 return False;
17 /* rough hack */
18 -void MacroApplyHook(WindowInfo* document, const char* hook, int argc,
19 +Boolean MacroApplyHook(WindowInfo* document, const char* hook, int argc,
20 DataValue* argv, DataValue* resultDV)
22 Symbol* hookSymbol;
23 + Boolean succ = False;
25 hookSymbol = LookupSymbol(hook);
26 if (NULL != hookSymbol && MACRO_FUNCTION_SYM == hookSymbol->type) {
27 Program* hookProg = hookSymbol->value.val.prog;
28 RestartData* restartData;
29 @@ -6084,12 +6085,15 @@ void MacroApplyHook(WindowInfo* document
32 if (MACRO_PREEMPT == status || MACRO_ERROR == status) {
33 fprintf(stderr, "nedit: \"%s\" error: %s\n", hook, (MACRO_ERROR == status) ? errMsg : "No dialogs");
34 } else {
35 - /* Macro is done here */
36 + /* Macro is done here without errors */
37 + succ = True;
40 document->inMacroHook = False;
41 SafeGC();
44 + return succ;
46 diff --quilt old/source/macro.h new/source/macro.h
47 --- old/source/macro.h
48 +++ new/source/macro.h
49 @@ -72,9 +72,9 @@ int CheckMacroString(Widget dialogParent
50 char **errPos);
51 char *GetReplayMacro(void);
52 void ReadMacroInitFile(WindowInfo *window);
53 void ReturnShellCommandOutput(WindowInfo *window, const char *outText, int status);
54 struct DataValueTag;
55 -void MacroApplyHook(WindowInfo* document, const char *hook, int argc,
56 +Boolean MacroApplyHook(WindowInfo* document, const char *hook, int argc,
57 struct DataValueTag* argv, struct DataValueTag* resultDV);
59 #endif /* NEDIT_MACRO_H_INCLUDED */
60 diff --quilt old/source/menu.c new/source/menu.c
61 --- old/source/menu.c
62 +++ new/source/menu.c
63 @@ -2884,25 +2884,35 @@ static void openAP(Widget w, XEvent *eve
65 WindowInfo *window = WidgetToWindow(w);
66 char filename[MAXPATHLEN], pathname[MAXPATHLEN];
67 DataValue* fileNameArg = (DataValue*) XtMalloc(sizeof(DataValue));
68 DataValue* resultDV = (DataValue*) XtMalloc(sizeof(DataValue));
69 + Boolean hook_successful = False;
70 + char *fileNameToOpen;
72 if (*nArgs == 0) {
73 fprintf(stderr, "nedit: open action requires file argument\n");
74 return;
77 + resultDV->tag = NO_TAG;
78 fileNameArg->tag = STRING_TAG;
79 AllocNStringNCpy(&fileNameArg->val.str, args[0], MAXPATHLEN);
80 - MacroApplyHook(window, "file_name_hook", 1, fileNameArg, resultDV);
81 + hook_successful = MacroApplyHook(window, "file_name_hook",
82 + 1, fileNameArg, resultDV);
83 XtFree((char*) fileNameArg);
85 - if (0 != ParseFilename(resultDV->val.str.rep, filename, pathname)
86 + if (hook_successful && resultDV->tag == STRING_TAG) {
87 + fileNameToOpen = resultDV->val.str.rep;
88 + } else {
89 + fileNameToOpen = args[0];
90 + }
92 + if (0 != ParseFilename(fileNameToOpen, filename, pathname)
93 || strlen(filename) + strlen(pathname) > MAXPATHLEN - 1) {
94 fprintf(stderr, "nedit: invalid file name for open action: %s\n",
95 - args[0]);
96 + fileNameToOpen);
97 return;
99 XtFree((char*) resultDV);
101 EditExistingFile(window, filename, pathname, 0, NULL, False,
102 diff --quilt old/source/selection.c new/source/selection.c
103 --- old/source/selection.c
104 +++ new/source/selection.c
105 @@ -359,17 +359,27 @@ static void fileCB(Widget widget, Window
107 glob(nameText, GLOB_NOCHECK, NULL, &globbuf);
108 for (i = 0; i < (int) globbuf.gl_pathc; i++) {
109 DataValue* fileNameArg = (DataValue*) XtMalloc(sizeof(DataValue));
110 DataValue* resultDV = (DataValue*) XtMalloc(sizeof(DataValue));
111 + Boolean hook_successful = False;
112 + char *fileNameToOpen;
114 + resultDV->tag = NO_TAG;
115 fileNameArg->tag = STRING_TAG;
116 AllocNStringNCpy(&fileNameArg->val.str, globbuf.gl_pathv[i], MAXPATHLEN);
117 - MacroApplyHook(window, "file_name_hook", 1, fileNameArg, resultDV);
118 + hook_successful = MacroApplyHook(window, "file_name_hook",
119 + 1, fileNameArg, resultDV);
120 XtFree((char*) fileNameArg);
122 - if (ParseFilename(resultDV->val.str.rep, filename, pathname) != 0) {
123 + if (hook_successful && resultDV->tag == STRING_TAG) {
124 + fileNameToOpen = resultDV->val.str.rep;
125 + } else {
126 + fileNameToOpen = globbuf.gl_pathv[i];
129 + if (ParseFilename(fileNameToOpen, filename, pathname) != 0) {
130 XBell(TheDisplay, 0);
131 } else {
132 EditExistingFile(GetPrefOpenInTab() ? window : NULL, filename,
133 pathname, 0, NULL, False, NULL, GetPrefOpenInTab(),
134 False);