Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwkendrick <wkendrick>2011-04-17 06:54:38 (GMT)
committer wkendrick <wkendrick>2011-04-17 06:54:38 (GMT)
commite3db348f371757eb531de825cc2bfe63cc95edf0 (patch)
tree9221c38c896587a0c8c0993a123d2c6d45317bb8
parent4ae89846ac6aaed9af169920ad57bda146a075df (diff)
Deleting files from Tux Paint's 'Open' dialog now moves them to the user's Trash folder. FIXME: Only on freedesktop.org systems (e.g., Linux) (SourceForge.net Feature #3101084)
-rw-r--r--docs/CHANGES.txt7
-rw-r--r--src/tuxpaint.c122
2 files changed, 117 insertions, 12 deletions
diff --git a/docs/CHANGES.txt b/docs/CHANGES.txt
index 07a249a..b92c1ee 100644
--- a/docs/CHANGES.txt
+++ b/docs/CHANGES.txt
@@ -6,7 +6,7 @@ Copyright (c) 2002-2011 by Bill Kendrick and others
bill@newbreedsoftware.com
http://www.tuxpaint.org/
-$Id: CHANGES.txt,v 1.768 2011/04/16 01:41:26 wkendrick Exp $
+$Id: CHANGES.txt,v 1.769 2011/04/17 06:54:39 wkendrick Exp $
2011.April.15 (0.9.22)
* New Tools:
@@ -119,6 +119,11 @@ $Id: CHANGES.txt,v 1.768 2011/04/16 01:41:26 wkendrick Exp $
-------------------
* Quicker prompt window pop-up animation.
+ * Deleting files from Tux Paint's 'Open' dialog now moves them to
+ the user's Trash folder.
+ FIXME: Only on freedesktop.org systems (e.g., Linux)
+ (SourceForge.net Feature #3101084)
+
* Tux Paint (in windowed mode) now only centers itself if
no specific positioning has been provided via
the SDL_VIDEO_WINDOW_POS environment variable.
diff --git a/src/tuxpaint.c b/src/tuxpaint.c
index 3f8acb9..7ff16d1 100644
--- a/src/tuxpaint.c
+++ b/src/tuxpaint.c
@@ -22,7 +22,7 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
(See COPYING.txt)
- June 14, 2002 - April 15, 2011
+ June 14, 2002 - April 16, 2011
*/
@@ -1812,6 +1812,8 @@ static float pick_best_scape(unsigned int orig_w, unsigned int orig_h,
unsigned int max_w, unsigned int max_h);
#endif
static SDL_Surface * myIMG_Load(char * file);
+static int trash(char * path);
+int file_exists(char * path);
#define MAX_UTF8_CHAR_LENGTH 6
@@ -1986,7 +1988,7 @@ void keybd_finish(void);
void apply_surface (int x, int y, SDL_Surface *source, SDL_Surface *destination, SDL_Rect *clip);
void drawkeybd(void );
int regionhit(int x, int y, int w, int h);
-int button(int id, int x, int y);
+void button(int id, int x, int y);
void on_screen_keyboard(void );
SDL_Surface *messager = NULL;
#define initial_x (2 * button_w + 80)
@@ -14341,9 +14343,8 @@ static int do_open(void)
d_names[which], d_exts[which]);
rfname = get_fname(fname, DIR_SAVE);
- debug(rfname);
- if (unlink(rfname) == 0)
+ if (trash(rfname) == 0)
{
update_list = 1;
@@ -14355,33 +14356,28 @@ static int do_open(void)
free(rfname);
rfname = get_fname(fname, DIR_SAVE);
- debug(rfname);
unlink(rfname);
/* Try deleting old-style thumbnail, too: */
- unlink(rfname);
snprintf(fname, sizeof(fname), "saved/%s-t.png", d_names[which]);
free(rfname);
rfname = get_fname(fname, DIR_SAVE);
- debug(rfname);
unlink(rfname);
/* Delete .dat file, if any: */
- unlink(rfname);
snprintf(fname, sizeof(fname), "saved/%s.dat", d_names[which]);
free(rfname);
rfname = get_fname(fname, DIR_SAVE);
- debug(rfname);
- unlink(rfname);
+ trash(rfname);
@@ -22669,7 +22665,7 @@ int regionhit(int x, int y, int w, int h)
return 1;
}
-int button(int id, int x, int y)
+void button(int id, int x, int y)
{
SDL_Rect dest,desti;
SDL_Surface *tmp_imgup;
@@ -23687,3 +23683,107 @@ void on_screen_keyboard(void )
keybd_flag = 1;
}
+
+
+/* Moves a file to the trashcan (or deletes it) */
+
+static int trash(char * path) {
+ char fname[MAX_PATH], trashpath[MAX_PATH],
+ dest[MAX_PATH], infoname[MAX_PATH],
+ bname[MAX_PATH], ext[MAX_PATH];
+ char deldate[32];
+ struct tm tim;
+ time_t now;
+ int cnt;
+ FILE * fo;
+
+ debug(path);
+
+
+ /* FIXME: This is Freedesktop.org-centric -bjk 2011.04.16 */
+
+ if (basename(path) == NULL) {
+ debug("Can't get basename! Deleting instead.");
+ return(unlink(path));
+ }
+ strcpy(fname, basename(path));
+
+
+ /* Move file into Trash folder */
+
+ if (getenv("XDG_DATA_HOME") != NULL) {
+ sprintf(trashpath, "%s/Trash/", getenv("XDG_DATA_HOME"));
+ } else if (getenv("HOME") != NULL) {
+ sprintf(trashpath, "%s/.local/share/Trash/", getenv("HOME"));
+ } else {
+ debug("Can't move to trash! Deleting instead.");
+ return(unlink(path));
+ }
+
+ mkdir(trashpath, 0x777);
+ sprintf(dest, "%s/files", trashpath);
+ mkdir(dest, 0x777);
+ sprintf(dest, "%s/info", trashpath);
+ mkdir(dest, 0x777);
+
+ sprintf(dest, "%s/files/%s", trashpath, fname);
+
+ strcpy(bname, fname);
+ if (strstr(bname, ".") != NULL) {
+ strcpy(strstr(bname, "."), "\0");
+ strcpy(ext, strstr(fname, ".") + 1);
+ } else {
+ debug("Filename format unfamiliar! Deleting instead.");
+ return(unlink(path));
+ }
+
+ sprintf(infoname, "%s/info/%s.trashinfo", trashpath, fname);
+
+ cnt = 1;
+ while (file_exists(dest) && cnt < 100) {
+ sprintf(fname, "%s_%d.%s", bname, cnt, ext);
+
+ sprintf(dest, "%s/files/%s", trashpath, fname);
+ sprintf(infoname, "%s/info/%s.trashinfo", trashpath, fname);
+ cnt++;
+ }
+
+ if (cnt >= 100) {
+ debug("Too many identically-named files! Deleting instead.");
+ return(unlink(path));
+ }
+
+ debug(dest);
+
+ if (rename(path, dest) == -1) {
+ debug("Could not move to trash. Deleting instead.");
+ return(unlink(path));
+ }
+
+ /* Create info file */
+ fo = fopen(infoname, "w");
+ if (fo == NULL) {
+ debug("Error: Couldn't create info file!");
+ return(1);
+ }
+
+ now = time(NULL);
+ tim = *(localtime(&now));
+ strftime(deldate, sizeof(deldate), "%FT%T", &tim);
+
+ fprintf(fo, "[Trash Info]\n");
+ fprintf(fo, "Path=%s\n", path);
+ fprintf(fo, "DeletionDate=%s\n", deldate);
+ fclose(fo);
+
+ return(0);
+}
+
+int file_exists(char * path) {
+ struct stat buf;
+ int res;
+
+ res = stat(path, &buf);
+ return(res == 0);
+}
+