From 00c5d44b96aa0f23ab0ae8c469d0a227c9882391 Mon Sep 17 00:00:00 2001 From: William Kendrick Date: Tue, 14 Sep 2004 06:39:51 +0000 Subject: [PATCH] Added lockfile feature, to prevent multiple launches within 30 seconds (due to over-clicking, for example). --- docs/CHANGES.txt | 10 +++++- docs/README.txt | 23 ++++++++++++- docs/html/README.html | 20 ++++++++++- src/manpage/tuxpaint.1 | 27 ++++++++++++--- src/tuxpaint.c | 75 +++++++++++++++++++++++++++++++++++++++--- 5 files changed, 144 insertions(+), 11 deletions(-) diff --git a/docs/CHANGES.txt b/docs/CHANGES.txt index 19f3c7abe..321c02299 100644 --- a/docs/CHANGES.txt +++ b/docs/CHANGES.txt @@ -7,7 +7,15 @@ bill@newbreedsoftware.com http://www.newbreedsoftware.com/tuxpaint/ -2004.September.04 (0.9.14) [cvs] +2004.September.13 (0.9.14) [cvs] + * Added lockfile support, to prevent Tux Paint from being launched more + than once every 30 seconds. (Disable with "--nolockfile" command-line + argument.) Thanks to Darci Lindgren for suggestion the feature, and + Mark K. Kim for suggesting it be time-based. + + (Lockfile is "lockfile.dat" in "~/.tuxpaint/" on Linux/Unix, and + "userdata\" on Windows.) + * Updated Catalan translation. Pere Pujal Carabantes diff --git a/docs/README.txt b/docs/README.txt index 88d52d7e0..701c7a915 100644 --- a/docs/README.txt +++ b/docs/README.txt @@ -9,7 +9,7 @@ [2]bill@newbreedsoftware.com [3]http://www.newbreedsoftware.com/tuxpaint/ - June 14, 2002 - June 20, 2004 + June 14, 2002 - September 13, 2004 --------------------------------------------------------------------------- @@ -384,6 +384,8 @@ Options |----------------------+--------------------+-----------| |british-english |british | | |----------------------+--------------------+-----------| + |bulgarian | | | + |----------------------+--------------------+-----------| |catalan |catala | | |----------------------+--------------------+-----------| |chinese |simplified-chinese | | @@ -553,6 +555,23 @@ Options Only your own configuration file, "~/.tuxpaintrc", if it exists, will be used. + --nolockfile + + By default, Tux Paint uses what's known as a 'lockfile' to + prevent it from being launched more than once in + 30 seconds. (This is to avoid accidentally running + multiple copies; for example, by double-clicking a + single-click launcher, or simply impatiently clicking the + icon multiple times.) + + To make Tux Paint ignore the lockfile, allowing it to run + again, even if it was just launched less than 30 seconds + ago, run Tux Paint with the '--nolockfile' option on the + command-line. + + By default, the lockfile is stored in "~/.tuxpaint/" under + Linux and Unix, and "userdata\" under Windows. + --------------------------------------------------------------------------- Command-Line Informational Options @@ -606,6 +625,8 @@ Options |---------------+-------------------+---------------------| |be_BY |Bielaruskaja |Belarusian | |---------------+-------------------+---------------------| + |bg_BG | |Bulgarian | + |---------------+-------------------+---------------------| |br_FR |Brezhoneg |Breton | |---------------+-------------------+---------------------| |ca_ES |Catal`a |Catalan | diff --git a/docs/html/README.html b/docs/html/README.html index a547add40..18e6f6497 100644 --- a/docs/html/README.html +++ b/docs/html/README.html @@ -23,7 +23,7 @@ New Breed Software

bill@newbreedsoftware.com
http://www.newbreedsoftware.com/tuxpaint/

-

June 14, 2002 - August 19, 2004

+

June 14, 2002 - September 13, 2004


@@ -820,6 +820,24 @@ New Breed Software

Only your own configuration file, "~/.tuxpaintrc", if it exists, will be used.

+ +
--nolockfile
+
+

By default, Tux Paint uses what's known as a 'lockfile' + to prevent it from being launched more than once in 30 seconds. + (This is to avoid accidentally running multiple copies; for example, + by double-clicking a single-click launcher, or simply + impatiently clicking the icon multiple times.)

+ +

To make Tux Paint ignore the lockfile, allowing it to + run again, even if it was just launched less than 30 seconds + ago, run Tux Paint with the '--nolockfile' option + on the command-line.

+ +

By default, the lockfile is stored in + "~/.tuxpaint/" under Linux and Unix, + and "userdata\" under Windows.

+
diff --git a/src/manpage/tuxpaint.1 b/src/manpage/tuxpaint.1 index cf97f99e9..43783b777 100644 --- a/src/manpage/tuxpaint.1 +++ b/src/manpage/tuxpaint.1 @@ -1,5 +1,5 @@ -.\" tuxpaint.1 - 2004.08.19 -.TH TUXPAINT 1 "19 Aug 2004" "0.9.14" "Tux Paint" +.\" tuxpaint.1 - 2004.09.13 +.TH TUXPAINT 1 "13 Sep 2004" "0.9.14" "Tux Paint" .SH NAME tuxpaint -- A drawing program for young children. @@ -65,7 +65,7 @@ tuxpaint -- A drawing program for young children. .TP 9 .B tuxpaint -[\-\-nosysconfig] +[\-\-nosysconfig] [\-\-nolockfile] .SH DESCRIPTION .PP @@ -403,6 +403,14 @@ Display a lists of all supported languages. With this option, \fITux Paint\fP will not attempt to read the system-wide configuration file (typically \fI/etc/tuxpaint/tuxpaint.conf\fP). +.TP 8 +.B \-\-nolockfile +By default, \fITux Paint\fP uses a lockfile (stored in the user's +local Tux Paint directory) which prevents it from being launched more than +once in 30 seconds. (Sometimes children get too eager, or user interfaces +only require one click, but users think they need to double-click.) +This option makes \fITux Paint\fP ignore the current lockfile. + .SH ENVIRONMENT .l While \fITux Paint\fP may refer to a number of environment variables indirectly @@ -435,7 +443,8 @@ User's configuration file. It can be used to set default options override any settings in the system-wide configuration file. .RS .PP -(Not created or edited automatically; must be created manually.) +(Not created or edited automatically; must be created manually. +You can do this by hand, or use '\fITux Paint Config.\fP.') .RE .TP 8 .B $HOME/.tuxpaint/saved/ @@ -455,6 +464,16 @@ is re-run.) .PP (Created when \fITux Paint\fP is \fIQuit\fP.) .RE +.TP 8 +.B $HOME/.tuxpaint/lockfile.dat +A lockfile that prevents \fITux Paint\fP from being launched more than once +every 30 seconds. Disable checking the lockfile by using the +'\-\-nolockfile' command-line argument. +.RS +.PP +(There's no reason to delete the lockfile, as it contains a timestamp +inside which causes it to expire after 30 seconds.) +.RE .SH COPYRIGHT This program is free software; you can redistribute it and/or modify diff --git a/src/tuxpaint.c b/src/tuxpaint.c index 05ff01e8b..05203f232 100644 --- a/src/tuxpaint.c +++ b/src/tuxpaint.c @@ -21,12 +21,12 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - June 14, 2002 - September 4, 2004 + June 14, 2002 - September 13, 2004 */ #define VER_VERSION "0.9.14" -#define VER_DATE "2004-09-04" +#define VER_DATE "2004-09-13" /* #define DEBUG */ @@ -3746,7 +3746,7 @@ void show_usage(FILE * f, char * prg) #endif " %s [--printdelay=SECONDS]\n" " %s [--lang LANGUAGE | --locale LOCALE | --lang help]\n" - " %s [--nosysconfig]\n" + " %s [--nosysconfig] [--nolockfile]\n" /* " %s [--record FILE | --playback FILE]\n" */ "\n", prg, prg, @@ -3903,7 +3903,7 @@ const char *getfilename(const char* path) void setup(int argc, char * argv[]) { - int i, ok_to_use_sysconfig; + int i, ok_to_use_sysconfig, ok_to_use_lockfile; char str[128]; char * upstr; SDL_Color black = {0, 0, 0, 0}; @@ -3961,6 +3961,7 @@ void setup(int argc, char * argv[]) playfile = NULL; recording = 0; playing = 0; + ok_to_use_lockfile = 1; #ifdef __BEOS__ @@ -3979,6 +3980,7 @@ void setup(int argc, char * argv[]) #endif + /* Load options from global config file: */ #ifndef WIN32 @@ -4370,6 +4372,11 @@ void setup(int argc, char * argv[]) { debug("Not using system config."); } + else if (strcmp(argv[i], "--nolockfile") == 0) + { + debug("Not using lockfile"); + ok_to_use_lockfile = 0; + } else { show_usage(stderr, (char *) getfilename(argv[0])); @@ -4690,6 +4697,66 @@ void setup(int argc, char * argv[]) putenv("SDL_VIDEO_X11_WMCLASS=TuxPaint.TuxPaint"); #endif + + /* Test for lockfile, if we're using one: */ + + if (ok_to_use_lockfile) + { + char * lock_fname; + FILE * fi; + time_t time_lock, time_now; + + + /* Get the current time: */ + + time_now = time(NULL); + + + /* Look for the lockfile... */ + + lock_fname = get_fname("lockfile.dat"); + + fi = fopen(lock_fname, "r"); + if (fi != NULL) + { + /* If it exists, read its contents: */ + + if (fread(&time_lock, sizeof(time_t), 1, fi) > 0) + { + /* Has it not been 30 seconds yet? */ + + if (time_now < time_lock + 30) + { + /* FIXME: Wrap in gettext() */ + printf("\nYou're already running a copy of Tux Paint!\n\n"); + + fclose(fi); + exit(0); + } + } + + fclose(fi); + } + + + /* Okay to run; create/update the lockfile */ + + fi = fopen(lock_fname, "w"); + if (fi != NULL) + { + /* If we can write to it, do so! */ + + fwrite(&time_now, sizeof(time_t), 1, fi); + fclose(fi); + } + else + { + fprintf(stderr, + "\nWarning: I couldn't create the lockfile (%s)\n" + "The error that occurred was:\n" + "%s\n\n", lock_fname, strerror(errno)); + } + } /* Init SDL Video: */