mirror of
https://github.com/fltk/fltk.git
synced 2026-06-04 23:42:15 +08:00
Bringing over fix [11878+11879] from 1.3 current to the porting branch.
Solves STR #3318: options for how to handle external editors on fluid quit git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11880 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
@@ -54,7 +54,7 @@ ExternalCodeEditor::~ExternalCodeEditor() {
|
|||||||
if ( G_debug )
|
if ( G_debug )
|
||||||
printf("ExternalCodeEditor() DTOR CALLED (this=%p, pid=%ld)\n",
|
printf("ExternalCodeEditor() DTOR CALLED (this=%p, pid=%ld)\n",
|
||||||
(void*)this, (long)pid_);
|
(void*)this, (long)pid_);
|
||||||
kill_editor(); // Kill open editor, deletes tmp file
|
close_editor(); // close editor, delete tmp file
|
||||||
set_filename(0); // free()s filename
|
set_filename(0); // free()s filename
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,6 +71,35 @@ int ExternalCodeEditor::is_editing() {
|
|||||||
return( (pid_ != -1) ? 1 : 0 );
|
return( (pid_ != -1) ? 1 : 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// [Protected] Wait for editor to close
|
||||||
|
void ExternalCodeEditor::close_editor() {
|
||||||
|
if ( G_debug ) printf("close_editor() called: pid=%ld\n", long(pid_));
|
||||||
|
// Wait until editor is closed + reaped
|
||||||
|
while ( is_editing() ) {
|
||||||
|
switch ( reap_editor() ) {
|
||||||
|
case -1: // error
|
||||||
|
fl_alert("Error reaping external editor\n"
|
||||||
|
"pid=%ld file=%s", long(pid_), filename());
|
||||||
|
break;
|
||||||
|
case 0: // process still running
|
||||||
|
switch ( fl_choice("Please close external editor\npid=%ld file=%s",
|
||||||
|
"Force Close", // button 0
|
||||||
|
"Closed", // button 1
|
||||||
|
0, // button 2
|
||||||
|
long(pid_), filename() ) ) {
|
||||||
|
case 0: // Force Close
|
||||||
|
kill_editor();
|
||||||
|
continue;
|
||||||
|
case 1: // Closed? try to reap
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default: // process reaped
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// [Protected] Kill the running editor (if any)
|
// [Protected] Kill the running editor (if any)
|
||||||
// Kills the editor, reaps the process, and removes the tmp file.
|
// Kills the editor, reaps the process, and removes the tmp file.
|
||||||
// The dtor calls this to ensure no editors remain running when fluid exits.
|
// The dtor calls this to ensure no editors remain running when fluid exits.
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ public:
|
|||||||
~ExternalCodeEditor();
|
~ExternalCodeEditor();
|
||||||
int is_editing();
|
int is_editing();
|
||||||
pid_t reap_editor();
|
pid_t reap_editor();
|
||||||
|
void close_editor();
|
||||||
const char *filename() { return filename_; }
|
const char *filename() { return filename_; }
|
||||||
int open_editor(const char *editor_cmd, const char *code);
|
int open_editor(const char *editor_cmd, const char *code);
|
||||||
int handle_changes(const char **code, int force=0);
|
int handle_changes(const char **code, int force=0);
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ ExternalCodeEditor::ExternalCodeEditor() {
|
|||||||
|
|
||||||
// DTOR
|
// DTOR
|
||||||
ExternalCodeEditor::~ExternalCodeEditor() {
|
ExternalCodeEditor::~ExternalCodeEditor() {
|
||||||
kill_editor(); // Kill any open editors, deletes tmp file
|
close_editor(); // close editor, delete tmp file
|
||||||
set_filename(0); // free()s filename
|
set_filename(0); // free()s filename
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,6 +132,35 @@ static int terminate_app(DWORD pid, DWORD msecTimeout) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// [Protected] Wait for editor to close
|
||||||
|
void ExternalCodeEditor::close_editor() {
|
||||||
|
if ( G_debug ) printf("close_editor() called: pid=%ld\n", long(pinfo_.dwProcessId));
|
||||||
|
// Wait until editor is closed + reaped
|
||||||
|
while ( is_editing() ) {
|
||||||
|
switch ( reap_editor() ) {
|
||||||
|
case -1: // error
|
||||||
|
fl_alert("Error reaping external editor\n"
|
||||||
|
"pid=%ld file=%s", long(pinfo_.dwProcessId), filename());
|
||||||
|
break;
|
||||||
|
case 0: // process still running
|
||||||
|
switch ( fl_choice("Please close external editor\npid=%ld file=%s",
|
||||||
|
"Force Close", // button 0
|
||||||
|
"Closed", // button 1
|
||||||
|
0, // button 2
|
||||||
|
long(pinfo_.dwProcessId), filename() ) ) {
|
||||||
|
case 0: // Force Close
|
||||||
|
kill_editor();
|
||||||
|
continue;
|
||||||
|
case 1: // Closed? try to reap
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default: // process reaped
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// [Protected] Kill the running editor (if any) and cleanup
|
// [Protected] Kill the running editor (if any) and cleanup
|
||||||
// Kills the editor, reaps the process, and removes the tmp file.
|
// Kills the editor, reaps the process, and removes the tmp file.
|
||||||
// The dtor calls this to ensure no editors remain running when fluid exits.
|
// The dtor calls this to ensure no editors remain running when fluid exits.
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ public:
|
|||||||
~ExternalCodeEditor();
|
~ExternalCodeEditor();
|
||||||
int is_editing();
|
int is_editing();
|
||||||
DWORD reap_editor();
|
DWORD reap_editor();
|
||||||
|
void close_editor();
|
||||||
const char *filename() { return filename_; }
|
const char *filename() { return filename_; }
|
||||||
int open_editor(const char *editor_cmd, const char *code);
|
int open_editor(const char *editor_cmd, const char *code);
|
||||||
int handle_changes(const char **code, int force=0);
|
int handle_changes(const char **code, int force=0);
|
||||||
|
|||||||
Reference in New Issue
Block a user