Support SIGUSR1/2 for immediate(ish) quit-and-save

Respond to a SIGUSR1 or SIGUSR2 signal by configuring itself
for autosave, saving a new file, or overwriting the current,
respectively, and sending itself a SIGTERM (which _generally_
causes Tux Paint to quit, depending on where you are in the UI).

Closes https://sourceforge.net/p/tuxpaint/feature-requests/188/
This commit is contained in:
Bill Kendrick 2019-04-03 22:49:04 -07:00
parent d70c587077
commit 99b566ae26
5 changed files with 109 additions and 24 deletions

View file

@ -2,13 +2,13 @@ CHANGES.txt for Tux Paint
Tux Paint - A simple drawing program for children.
Copyright (c) 2002-2018
Copyright (c) 2002-2019
Various contributors (see below, and AUTHORS.txt)
http://www.tuxpaint.org/
$Id$
2018.Dec.18 (0.9.24)
2019.Apr.3 (0.9.24)
* Bug Fixes
---------
* Correct issue that prevented Tux Paint from lauching on Mac OS X 10.7.
@ -34,6 +34,14 @@ $Id$
Use "--newcolorslast" option.
(Suggested by Bernard Verhaeghe)
* Recognize signals (SIGUSR1 and SIGUSR2) on POSIX systems,
which causes Tux Paint to quit, first saving the current drawing
(if unsaved) (like "--autosave"), either saving a new image
(like "--saveovernew") (via SIGUSR1), or overwritting the current
drawing (like "--saveover") (via SIGUSR2).
(Thanks to Flavio Airundo for the idea; closes
https://sourceforge.net/p/tuxpaint/feature-requests/188/)
* Documentation updates
---------------------
* Mended link to MinGW/MSYS instructions at John Popplewell's website.
@ -41,6 +49,10 @@ $Id$
* Improved and expanded usage info (e.g., "tuxpaint --help" output)
* Documentation on POSIX signals recognized by Tux Paint (e.g.,
the new "SIGUSR1" & "SIGUSR2") added to a new doc file,
"SIGNALS.txt".
* Misc
----
* Verbose debugging, and "DEBUG_PRINTF()" macro now available;

View file

@ -3,22 +3,22 @@
A simple drawing program for children
Copyright 2002-2018 by various contributors; see AUTHORS.txt
Copyright 2002-2019 by various contributors; see AUTHORS.txt
http://www.tuxpaint.org/
June 14, 2002 - December 18, 2018
June 14, 2002 - April 3, 2019
----------------------------------------------------------------------
+------------------------------------------------------------------------+
|Table of Contents |
|------------------------------------------------------------------------|
| * About |
| * Using Tux Paint |
| * Loading Other Pictures into Tux Paint |
| * Further Reading |
| * How to Get Help |
+------------------------------------------------------------------------+
+-------------------------------------------+
|Table of Contents |
|-------------------------------------------|
| * About |
| * Using Tux Paint |
| * Loading Other Pictures into Tux Paint |
| * Further Reading |
| * How to Get Help |
+-------------------------------------------+
----------------------------------------------------------------------
@ -97,8 +97,8 @@ Loading Tux Paint
Windows Users
[Icon]
Tux Paint
[Icon]
Tux Paint
If you installed Tux Paint on your computer using the
'Tux Paint Installer,' it will have asked you whether you wanted a
@ -876,6 +876,8 @@ Doing it Manually
Notes on creating PNG format bitmapped images for use in Tux Paint.
* SVG.txt
Notes on creating SVG format vector images for use in Tux Paint.
* SIGNALS.txt
Information about POSIX signals Tux Paint responds to.
----------------------------------------------------------------------

50
docs/en/SIGNALS.txt Normal file
View file

@ -0,0 +1,50 @@
SIGNALS.txt for Tux Paint
Tux Paint - A simple drawing program for children.
Copyright 2019 by Bill Kendrick and others
bill@newbreedsoftware.com
http://www.tuxpaint.org/
April 3, 2019
Tux Paint responds to the following signals (which can be
sent to the program's process via `kill` or `killall`, for
example).
* SIGTERM (also, [Ctrl]+[C] from a terminal running "tuxpaint")
Tux Paint responds as if the "Quit" button were pressed,
or the desktop environment was told to close Tux Paint
(e.g., by clicking a window close button, or pressing
[Alt]+[F4] on most systems).
From the main interface, Tux Paint will prompt whether or
not you wish to quit, and (unless overridden by "--autosave")
if you'd like to save the current drawing (if unsaved),
and if so, and it's a modified version of an existing drawing
(unless overridden by "--saveover" or "--saveovernew"),
whether or not to overwrite the existing drawing, or save
to a new file.
From other parts of the interface, the signal is currently
interpreted as a request to go back (e.g., from the
"New" dialog back to the main interface), as if a "Back"
button in Tux Paint were clicked, or the [Esc] key pressed.
* SIGUSR1 & SIGUSR2
Tux Paint responds by setting its "--autosave" option, and either
"--saveovernew" (for SIGUSR1) or "--saveover" (for SIGUSR2),
and sending itself a SIGTERM signal.
So, from the main interface, Tux Paint should quit almost immediately,
with no questions asked.
From other parts of the interface, unfortunately, Tux Paint
will go back one level in the interface. Therefore, at this time,
it may be necessary to send this signal to Tux Paint a few times,
for it to quit completely.
e.g., `killall -s SIGUSR1 tuxpaint`

View file

@ -17,12 +17,12 @@ version
</h1>
<h3>A simple drawing program for children</h3>
<p>Copyright 2002-2018 by various contributors; see AUTHORS.txt<br>
<p>Copyright 2002-2019 by various contributors; see AUTHORS.txt<br>
<a href="http://www.tuxpaint.org/">http://www.tuxpaint.org/</a></p>
<p>June 14, 2002 -
December 18, 2018</p>
April 3, 2019</p>
</center>
@ -1159,6 +1159,9 @@ version
<li><a href="../SVG.txt">SVG.txt</a><br>
Notes on creating SVG format vector images for use in Tux&nbsp;Paint.
<li><a href="../SIGNALS.txt">SIGNALS.txt</a><br>
Information about POSIX signals Tux&nbsp;Paint responds to.
</ul>
</blockquote>

View file

@ -1197,6 +1197,7 @@ static int disable_save;
static int ok_to_use_lockfile = 1;
static int start_blank;
static int autosave_on_quit;
static int no_prompt_on_quit = 0;
static int dont_do_xor;
static int dont_load_stamps;
@ -7732,13 +7733,19 @@ static int generate_fontconfig_cache(void *vp)
((c) >= 'a' && (c) <= 'f') ? ((c) - 'a' + 10) : 0)
#ifndef WIN32
/**
* FIXME
*/
static void signal_handler(int sig)
{
(void)sig;
// It is not legal to call printf or most other functions here!
if (sig == SIGUSR1 || sig == SIGUSR2) {
autosave_on_quit = 1;
no_prompt_on_quit = 1;
if (sig == SIGUSR1) {
promptless_save = SAVE_OVER_NO;
} else {
promptless_save = SAVE_OVER_ALWAYS;
}
raise(SIGTERM);
}
}
#endif
@ -13808,9 +13815,16 @@ static int do_quit(int tool)
{
int done, tmp_tool;
done = do_prompt_snd(PROMPT_QUIT_TXT,
PROMPT_QUIT_YES, PROMPT_QUIT_NO, SND_AREYOUSURE,
(TOOL_QUIT % 2) * 48 + 24, (TOOL_QUIT / 2) * 48 + 40 + 24);
if (!no_prompt_on_quit)
{
done = do_prompt_snd(PROMPT_QUIT_TXT,
PROMPT_QUIT_YES, PROMPT_QUIT_NO, SND_AREYOUSURE,
(TOOL_QUIT % 2) * 48 + 24, (TOOL_QUIT / 2) * 48 + 40 + 24);
}
else
{
done = 1;
}
if (done && !been_saved && !disable_save)
{
@ -24209,6 +24223,10 @@ static void setup(void)
instead of 'Ok') */
signal(SIGPIPE, signal_handler);
/* Set up signal for no-questions-asked remote closing of app */
signal(SIGUSR1, signal_handler);
signal(SIGUSR2, signal_handler);
#endif
}