git: 8548b1e5ed54 - main - x11/xfishtank: upgrade to 2.5

From: Rodrigo Osorio <rodrigo_at_FreeBSD.org>
Date: Mon, 30 Sep 2024 13:31:40 UTC
The branch main has been updated by rodrigo:

URL: https://cgit.FreeBSD.org/ports/commit/?id=8548b1e5ed548946a3e380b63330bd236e03d97f

commit 8548b1e5ed548946a3e380b63330bd236e03d97f
Author:     Rodrigo Osorio <rodrigo@FreeBSD.org>
AuthorDate: 2024-09-12 12:31:53 +0000
Commit:     Rodrigo Osorio <rodrigo@FreeBSD.org>
CommitDate: 2024-09-30 13:28:53 +0000

    x11/xfishtank: upgrade to 2.5
    
    Change upstream to use sources from debian package.
    
    Add configuration to use xfishtank with xscreensaver
    and made a hard link of xfishtank into xcreensaver hack dir.
    
    PR:                 281458
    Approved by:    <kidon@posteo.de> (maintainer)
---
 x11/xfishtank/Makefile               |  28 ++-
 x11/xfishtank/distinfo               |   5 +-
 x11/xfishtank/files/patch-Imakefile  |  22 +--
 x11/xfishtank/files/patch-makeh.c    |  11 ++
 x11/xfishtank/files/patch-medcut.c   | 166 ++++++++++++++++++
 x11/xfishtank/files/patch-medcut.h   |  12 ++
 x11/xfishtank/files/patch-xfish.c    | 323 -----------------------------------
 x11/xfishtank/files/xfishtank.xml.in |  24 +++
 x11/xfishtank/pkg-plist              |   6 +
 9 files changed, 250 insertions(+), 347 deletions(-)

diff --git a/x11/xfishtank/Makefile b/x11/xfishtank/Makefile
index a99561d21b2c..b4dd79c938c5 100644
--- a/x11/xfishtank/Makefile
+++ b/x11/xfishtank/Makefile
@@ -1,18 +1,32 @@
 PORTNAME=	xfishtank
-PORTVERSION=	2.2
-PORTREVISION=	2
+PORTVERSION=	2.5
 CATEGORIES=	x11
-MASTER_SITES=	http://cyber.dabamos.de/pub/distfiles/
+MASTER_SITES=	DEBIAN
+MASTER_SITE_SUBDIR=	pool/main/x/xfishtank/
+DISTNAME=	xfishtank_2.5.orig
 
 MAINTAINER=	kidon@posteo.de
 COMMENT=	Make fish swim in the background of your screen
+WWW=	https://sources.debian.org/src/xfishtank/2.5-1/README
+
+LICENSE=	BSD3CLAUSE
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+LIB_DEPENDS=	libImlib2.so:graphics/imlib2
 
-PLIST_FILES=	bin/xfishtank
 USES=		imake xorg
 USE_XORG=	x11 xext
-WRKSRC=		${WRKDIR}/xfishtank2.0
+WRKSRC=		${WRKDIR}/xfishtank-2.5
+
+XSSHACKSDIR=    bin/xscreensaver-hacks
+XSSCONFDIR=     share/xscreensaver/config
+
+pre-build:
+	${CC} ${WRKSRC}/makeh.c -o ${WRKSRC}/makeh
 
-post-patch:
-	cd  ${WRKDIR}/xfishtank2.0; make clean
+post-install:
+	${MKDIR} ${STAGEDIR}/${PREFIX}/${XSSHACKSDIR} ${STAGEDIR}/${PREFIX}/${XSSCONFDIR}
+	${CP} ${PATCHDIR}/${PORTNAME}.xml.in ${STAGEDIR}/${PREFIX}/${XSSCONFDIR}/${PORTNAME}.xml
+	(cd ${STAGEDIR}/${PREFIX}/${XSSHACKSDIR} ; ${LN} -f ${STAGEDIR}/${PREFIX}/bin/${PORTNAME} ${STAGEDIR}/${PREFIX}/${XSSHACKSDIR}/)
 
 .include <bsd.port.mk>
diff --git a/x11/xfishtank/distinfo b/x11/xfishtank/distinfo
index a59a8729a7f5..69a550299e53 100644
--- a/x11/xfishtank/distinfo
+++ b/x11/xfishtank/distinfo
@@ -1,2 +1,3 @@
-SHA256 (xfishtank-2.2.tar.gz) = 4391228c074fccd73a9ea8332e090e92d79ba27f9e63693035f392387d03122c
-SIZE (xfishtank-2.2.tar.gz) = 360031
+TIMESTAMP = 1726130557
+SHA256 (xfishtank_2.5.orig.tar.gz) = bd8ce3c4e7adb0e62b294de307972c0d5e2a442b094c178a3be084e3e26a08e0
+SIZE (xfishtank_2.5.orig.tar.gz) = 153554
diff --git a/x11/xfishtank/files/patch-Imakefile b/x11/xfishtank/files/patch-Imakefile
index a9221720b1f4..db6f6e8f04ac 100644
--- a/x11/xfishtank/files/patch-Imakefile
+++ b/x11/xfishtank/files/patch-Imakefile
@@ -1,17 +1,9 @@
---- Imakefile.orig	1992-12-16 00:04:35 UTC
+--- Imakefile.orig	2024-09-12 10:01:24 UTC
 +++ Imakefile
-@@ -2,12 +2,12 @@
- LOCAL_LIBRARIES = $(XLIB)
+@@ -1,5 +1,5 @@
+  EXTRA_INCLUDES = -I./fishmaps
+-LOCAL_LIBRARIES = $(XLIB)
++LOCAL_LIBRARIES = $(XLIB) -L /usr/local/lib
          DEPLIBS = $(DEPXLIB)
-   SYS_LIBRARIES = -lm
--    CDEBUGFLAGS = -g
-+XCOMM    CDEBUGFLAGS = -g
- 
-            SRCS = xfish.c medcut.c read.c gifread.c
-            OBJS = xfish.o medcut.o read.o gifread.o
- 
--ComplexProgramTarget(xfishtank)
-+ComplexProgramTargetNoMan(xfishtank)
- 
- xfishy.h: makeh FishList
- 	./makeh > xfishy.h
+   SYS_LIBRARIES = -lImlib2 -lm
+    MANSRCSUFFIX = 1x
diff --git a/x11/xfishtank/files/patch-makeh.c b/x11/xfishtank/files/patch-makeh.c
new file mode 100644
index 000000000000..d9340a12e5f3
--- /dev/null
+++ b/x11/xfishtank/files/patch-makeh.c
@@ -0,0 +1,11 @@
+--- makeh.c.orig	2024-09-12 09:44:33 UTC
++++ makeh.c
+@@ -16,7 +16,7 @@
+     printf("};\n\n");
+ }
+ 
+-main()
++int main()
+ {
+     FILE *fp;
+     char prefix[BUFSIZ];
diff --git a/x11/xfishtank/files/patch-medcut.c b/x11/xfishtank/files/patch-medcut.c
new file mode 100644
index 000000000000..e958b7c739fa
--- /dev/null
+++ b/x11/xfishtank/files/patch-medcut.c
@@ -0,0 +1,166 @@
+--- medcut.c.orig	2013-08-09 11:59:28 UTC
++++ medcut.c
+@@ -40,10 +40,8 @@
+ int NCells;
+ struct color_rec *Tptr;
+ 
+-
+ void
+-InitMinMax(boxnum)
+-int boxnum;
++InitMinMax(int boxnum)
+ {
+     C_boxes[boxnum].min_pix[RED] = 256;
+     C_boxes[boxnum].max_pix[RED] = 0;
+@@ -55,8 +53,7 @@
+ 
+ 
+ struct color_rec *
+-AddHash(red, green, blue)
+-int red, green, blue;
++AddHash(int red, int green, int blue)
+ {
+     int lum;
+ 
+@@ -78,9 +75,7 @@
+ 
+ 
+ void
+-AddColor(cptr, boxnum)
+-struct color_rec *cptr;
+-int boxnum;
++AddColor(struct color_rec *cptr, int boxnum)
+ {
+     struct color_rec *ptr;
+ 
+@@ -107,9 +102,7 @@
+ 
+ 
+ void
+-CountColors(data, colrs)
+-unsigned char *data;
+-struct colr_data *colrs;
++CountColors(unsigned char *data, struct colr_data *colrs)
+ {
+     unsigned char *dptr;
+     register int i, j;
+@@ -142,8 +135,7 @@
+ 
+ 
+ int
+-FindTarget(tptr)
+-int *tptr;
++FindTarget(int *tptr)
+ {
+     int range, i, indx;
+ 
+@@ -175,8 +167,7 @@
+ 
+ 
+ void
+-SplitBox(boxnum, color_indx)
+-int boxnum, color_indx;
++SplitBox(int boxnum,int color_indx)
+ {
+     struct color_rec *low, *high;
+     struct color_rec *data;
+@@ -245,8 +236,7 @@
+ 
+ 
+ void
+-SplitColors(e_cnt)
+-int e_cnt;
++SplitColors(int e_cnt)
+ {
+     if (ColorCnt < e_cnt) {
+ 	int i;
+@@ -279,8 +269,7 @@
+  * Colors passed in 0-65535, internally are 0-255
+  */
+ void
+-ConvertColor(rp, gp, bp)
+-int *rp, *gp, *bp;
++ConvertColor(int *rp, int *gp, int *bp)
+ {
+     struct color_rec *cptr;
+     register struct color_rec *hash_ptr;
+@@ -321,9 +310,7 @@
+ 
+ 
+ void
+-ConvertData(data, colrs)
+-unsigned char *data;
+-struct colr_data *colrs;
++ConvertData( unsigned char *data, struct colr_data *colrs)
+ {
+     unsigned char *dptr;
+     register int i, j;
+@@ -349,9 +336,7 @@
+ 
+ 
+ void
+-PrintColormap(e_cnt, colrs)
+-int e_cnt;
+-struct colr_data *colrs;
++PrintColormap( int e_cnt, struct colr_data *colrs)
+ {
+     int i;
+ 
+@@ -382,11 +367,7 @@
+ 
+ 
+ void
+-MedianCut(data, w, h, colrs, start_cnt, end_cnt)
+-unsigned char *data;
+-int *w, *h;
+-struct colr_data *colrs;
+-int start_cnt, end_cnt;
++MedianCut(unsigned char *data, int *w, int *h, struct colr_data *colrs, int start_cnt, int end_cnt)
+ {
+     int i;
+ 
+@@ -440,10 +421,7 @@
+  * 0-255.
+  */
+ void
+-MedianCount(data, w, h, colrs)
+-unsigned char *data;
+-int w, h;
+-struct colr_data *colrs;
++MedianCount( unsigned char *data, int w, int h, struct colr_data *colrs)
+ {
+     unsigned char *dptr;
+     register int i, j;
+@@ -472,8 +450,7 @@
+ 
+ 
+ void
+-MedianSplit(end_cnt)
+-int end_cnt;
++MedianSplit(int end_cnt)
+ {
+     C_boxes[0].count = ColorCnt;
+     SplitColors(end_cnt);
+@@ -481,10 +458,7 @@
+ 
+ 
+ void
+-MedianConvert(data, w, h, colrs)
+-unsigned char *data;
+-int w, h;
+-struct colr_data *colrs;
++MedianConvert(unsigned char *data, int w, int h, struct colr_data *colrs)
+ {
+     Width = w;
+     Height = h;
+@@ -493,9 +467,7 @@
+ 
+ 
+ void
+-MedianMerge(colrs, end_cnt)
+-struct colr_data *colrs;
+-int end_cnt;
++MedianMerge(struct colr_data *colrs, int end_cnt)
+ {
+     int i;
+ 
diff --git a/x11/xfishtank/files/patch-medcut.h b/x11/xfishtank/files/patch-medcut.h
new file mode 100644
index 000000000000..a4f1b66bf6c4
--- /dev/null
+++ b/x11/xfishtank/files/patch-medcut.h
@@ -0,0 +1,12 @@
+--- medcut.h.orig	2013-08-09 11:59:28 UTC
++++ medcut.h
+@@ -4,6 +4,6 @@
+ };
+ 
+ extern void MedianInit();
+-extern void MedianCount();
+-extern void MedianSplit();
+-extern void ConvertColor();
++extern void MedianCount( unsigned char *data, int w, int h, struct colr_data *colrs);
++extern void MedianSplit(int end_cnt);
++extern void ConvertColor(int *rp, int *gp, int *bp);
diff --git a/x11/xfishtank/files/patch-xfish.c b/x11/xfishtank/files/patch-xfish.c
deleted file mode 100644
index 0b1d735df38c..000000000000
--- a/x11/xfishtank/files/patch-xfish.c
+++ /dev/null
@@ -1,323 +0,0 @@
---- xfish.c.orig	1992-12-17 21:26:17 UTC
-+++ xfish.c
-@@ -11,6 +11,8 @@
- 
-   *	Ported to monocrome by Jonathan Greenblatt (jonnyg@rover.umd.edu)
- 
-+  *     05/02/1996 Added TrueColor support by TJ Phan (phan@aur.alcatel.com)
-+
-   TODO:
- 
- 	Parameter parsing needs to be redone.
-@@ -46,13 +48,24 @@
- 
- /* constants are based on rand(3C) returning an integer between 0 and 32767 */
- 
--#if defined(ultrix) || defined(sun) || defined(linux)
-+#if defined(ultrix) || defined(sun)
- #define  RAND_I_1_16   134217728
- #define  RAND_F_1_8    268435455.875
- #define  RAND_I_1_4    536870911
- #define  RAND_I_1_2   1073741823
- #define  RAND_I_3_4   1610612735
- #define  RAND_F_MAX   2147483647.0
-+#else     
-+#if defined(__FreeBSD__) || defined(__OpenBSD__)
-+#include <stdlib.h>
-+#include <unistd.h>
-+
-+#define  RAND_I_1_16   (RAND_MAX>>4)
-+#define  RAND_F_1_8    ((float)(RAND_MAX>>3))
-+#define  RAND_I_1_4    (RAND_MAX>>2)
-+#define  RAND_I_1_2    (RAND_MAX>>1)
-+#define  RAND_I_3_4    ((RAND_MAX>>2)*3)
-+#define  RAND_F_MAX    ((float)RAND_MAX)
- #else
- #define  RAND_I_1_16   2048
- #define  RAND_F_1_8    4096.0
-@@ -61,8 +74,8 @@
- #define  RAND_I_3_4   24575
- #define  RAND_F_MAX   32767.0
- #endif
-+#endif
- 
--
- extern unsigned char *ReadBitmap();
- 
- 
-@@ -850,6 +863,10 @@ putbubble(b, s, c)
-  * Find the closest color by allocating it, or picking an already allocated
-  * color
-  */
-+Visual (*visual_info) = NULL;
-+int r_mask, g_mask, b_mask;
-+int r_shift=0, g_shift=0, b_shift=0;
-+int r_bits=0, g_bits=0, b_bits=0;
- void
- FindColor(Dpy, colormap, colr)
- 	Display *Dpy;
-@@ -862,6 +879,58 @@ FindColor(Dpy, colormap, colr)
- 	XColor def_colrs[256];
- 	int NumCells;
- 
-+	if( visual_info == NULL &&  DefaultDepth(Dpy, DefaultScreen(Dpy)) >= 16 )
-+	{
-+	   visual_info = DefaultVisual(Dpy, DefaultScreen(Dpy));
-+	   r_mask = visual_info->red_mask;
-+	   while( !(r_mask & 1) )
-+	   {
-+	      r_mask >>= 1;
-+	      r_shift++;
-+	   }
-+	   while( r_mask & 1 )
-+	   {
-+	      r_mask >>= 1;
-+	      r_bits++;
-+	   }
-+
-+	   g_mask = visual_info->green_mask;
-+	   while( !(g_mask & 1) )
-+	   {
-+	      g_mask >>= 1;
-+	      g_shift++;
-+	   }
-+	   while( g_mask & 1 )
-+	   {
-+	      g_mask >>= 1;
-+	      g_bits++;
-+	   }
-+
-+	   b_mask = visual_info->blue_mask;
-+	   while( !(b_mask &1) )
-+	   {
-+	      b_mask >>= 1;
-+	      b_shift++;
-+	   }
-+	   while( b_mask & 1 )
-+	   {
-+	      b_mask >>= 1;
-+	      b_bits++;
-+	   }
-+	}
-+
-+	if( DefaultDepth(Dpy, DefaultScreen(Dpy)) > 8 )
-+	{
-+	   colr->red >>= 16 - r_bits;
-+	   colr->green >>= 16 - g_bits;
-+	   colr->blue >>= 16 - b_bits;
-+
-+	   colr->pixel = ((colr->red << r_shift) & visual_info->red_mask) |
-+	      ((colr->green << g_shift) & visual_info->green_mask) |
-+	      ((colr->blue << b_shift) & visual_info->blue_mask);
-+	   return;
-+	}
-+
- 	if (AllocCnt < climit)
- 	{
- 		match = XAllocColor(Dpy, colormap, colr);
-@@ -982,7 +1051,6 @@ init_colormap()
- 	XColor hdef, edef;
- 	struct colr_data *cdp;
- 	struct colr_data colrs[256];
--	extern char *malloc();
- 
- 	colormap = XDefaultColormap(Dpy, screen);
- 
-@@ -1151,6 +1219,7 @@ MakeImage(data, width, height)
- 		fprintf(stderr, "Don't know how to format image for display of depth %d\n", depth);
- 		exit(1);
- 	}
-+
- 	if (BitmapBitOrder(Dpy) == LSBFirst)
- 	{
- 		shiftstart = 0;
-@@ -1194,7 +1263,8 @@ MakeImage(data, width, height)
- 			}
- 		}
- 	}
--	bytesperline = (width + linepad) * depth / 8;
-+
-+	bytesperline = (width  * depth / 8 + linepad);
- 	newimage = XCreateImage(Dpy, DefaultVisual(Dpy, screen), depth,
- 		ZPixmap, 0, (char *)bit_data,
- 		(width + linepad), height, 8, bytesperline);
-@@ -1218,7 +1288,6 @@ init_pixmap()
- 	unsigned char *data;
- 	register int i, j, k;
- 	int cnt, wcnt;
--	extern char *malloc();
- 
- 	cnt = 1;
- 	cnt += Pcnt;
-@@ -1341,9 +1410,14 @@ init_pixmap()
- 		free((char *)data);
- 	}
- 
-+	if( DisplayPlanes(Dpy, screen) < 8 )
-+	{
-+
- 		j = rwidth[k] * rheight[k];
- 		x1A = (caddrt) malloc(rwidth[k] * rheight[k]);
- 		p = (caddrt) xfishRasterA[k];
-+
-+
- 		q = x1A;
- 		for (i = 0; i < j; i++)
- 		{
-@@ -1389,8 +1463,69 @@ init_pixmap()
- 		xfishB[k][2] = MakeImage(x1B, rwidth[k], rheight[k]);
- 		xfishB[k][1] = MakeImage(x2B, rwidth[k], rheight[k]);
- 
-+		free((char *)x1A);
-+		free((char *)x2A);
-+		free((char *)x1B);
-+		free((char *)x2B);
-+
-+	}
-+	else
-+	{
- 		i = DisplayPlanes(Dpy, screen);
- 
-+		xfishA[k][2] = XGetImage(Dpy, DefaultRootWindow(Dpy), 0, 0, rwidth[k], rheight[k], 0, ZPixmap);
-+
-+		p = (caddrt) xfishRasterA[k];
-+
-+		for (j = 0; j < rheight[k]; j++)
-+		{
-+		   for( i = 0; i < rwidth[k]; i++ )
-+		   {
-+		      XPutPixel(xfishA[k][2], i, j, cmap[cnt + (int)(*p)]);
-+		      p++;
-+		   }
-+		}
-+
-+		xfishB[k][2] = XGetImage(Dpy, DefaultRootWindow(Dpy), 0, 0, rwidth[k], rheight[k], 0, ZPixmap);
-+
-+		p = (caddrt) xfishRasterB[k];
-+
-+		for (j = 0; j < rheight[k]; j++)
-+		{
-+		   for( i = 0; i < rwidth[k]; i++ )
-+		   {
-+		      XPutPixel(xfishB[k][2], i, j, cmap[cnt + (int)(*p)]);
-+		      p++;
-+		   }
-+		}
-+
-+		xfishA[k][1] = XGetImage(Dpy, DefaultRootWindow(Dpy), 0, 0, rwidth[k], rheight[k], 0, ZPixmap);
-+
-+		for (j = 0; j < rheight[k]; j++)
-+		{
-+		   for( i = 0; i < rwidth[k]; i++ )
-+		   {
-+		      XPutPixel(xfishA[k][1], i, j,
-+				XGetPixel(xfishA[k][2], rwidth[k] - i -1, j));
-+		   }
-+		}
-+
-+		xfishB[k][1] = XGetImage(Dpy, DefaultRootWindow(Dpy), 0, 0, rwidth[k], rheight[k], 0, ZPixmap);
-+
-+		for (j = 0; j < rheight[k]; j++)
-+		{
-+		   for( i = 0; i < rwidth[k]; i++ )
-+		   {
-+		      XPutPixel(xfishB[k][1], i, j,
-+				XGetPixel(xfishB[k][2], rwidth[k] - i - 1, j));
-+		   }
-+		}
-+
-+	}
-+
-+
-+		i = DisplayPlanes(Dpy, screen);
-+
- 		pfishA[k][1] = XCreatePixmap(Dpy, wid,
- 			rwidth[k], rheight[k], i);
- 		pfishA[k][2] = XCreatePixmap(Dpy, wid,
-@@ -1400,11 +1535,6 @@ init_pixmap()
- 		pfishB[k][2] = XCreatePixmap(Dpy, wid,
- 			rwidth[k], rheight[k], i);
- 
--		free((char *)x1A);
--		free((char *)x2A);
--		free((char *)x1B);
--		free((char *)x2B);
--
- 		if (pfishA[k][1])
- 		{
- 			XPutImage(Dpy, pfishA[k][1], gc, xfishA[k][1], 0, 0,
-@@ -1465,34 +1595,6 @@ Initialize signal so that SIGUSR1 causes secure mode t
- void 
- init_signals()
- {
--	int ret;
--#ifdef linux
--	signal(SIGUSR1, toggle_secure);
--#else			
--#if defined(MOTOROLA) || defined(SCO)
--    sigset(SIGUSR1, toggle_secure);
--#else
--    struct sigvec vec;
--
--    vec.sv_handler = toggle_secure;
--    vec.sv_mask = 0;
--    vec.sv_onstack = 0;
--
--#ifndef hpux
--    ret = sigvec(SIGUSR1, &vec, &vec);
--	if (ret != 0)
--	{
--		fprintf(stderr, "sigvec call failed\n");
--	}
--	else
--	{
--		fprintf(stderr, "sigvec call OK\n");
--	}
--#else
--    sigvector(SIGUSR1, &vec, &vec);
--#endif
--#endif /* MOTOROLA */
--#endif /* LINUX */
- }
- 
- 
-@@ -1505,7 +1607,6 @@ initialize()
-     XWindowAttributes winfo;
-     XSetWindowAttributes attr;
-     XGCValues   vals;
--    extern char *malloc();
-     XSizeHints  xsh;
-     XImage *pimage;
-     int i, size, cnt;
-@@ -1613,13 +1714,12 @@ if ((!DoClipping)||(picname[0] != '\0'))
-     xsh.height = height;
-     XSetNormalHints(Dpy, wid, &xsh);
- 
-+    XMapWindow(Dpy, wid);
-     if (picname[0] != '\0')
-     {
- 	XPutImage(Dpy, PicMap, gc, pimage, 0, 0, 0, 0, Pwidth, Pheight);
- 	XSetWindowBackgroundPixmap(Dpy, wid, PicMap);
-     }
--
--    XMapWindow(Dpy, wid);
- }
- 
-     binfo = (bubble *) malloc(blimit * sizeof(bubble));
-@@ -1965,9 +2065,15 @@ void 
- high_res_sleep(seconds)
-     double      seconds;
- {
-+#ifndef __FreeBSD__
-     int         fds = 0;
-+#endif
-     struct timeval timeout;
--
-+#ifdef __FreeBSD__
-+    fd_set fds;
-+    FD_ZERO(&fds);
-+#endif    
-+    
-     timeout.tv_sec = seconds;
-     timeout.tv_usec = (seconds - timeout.tv_sec) * 1000000.0;
-     select(0, &fds, &fds, &fds, &timeout);
diff --git a/x11/xfishtank/files/xfishtank.xml.in b/x11/xfishtank/files/xfishtank.xml.in
new file mode 100644
index 000000000000..5c171697cc36
--- /dev/null
+++ b/x11/xfishtank/files/xfishtank.xml.in
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<screensaver name="xfishtank" _label="XFishtank">
+  <video href="https://www.youtube.com/watch?v=6Q8ZTxsopYA"/>
+
+  <file id="bgfile" _label="Background image" arg="-p %"/>
+
+  <string id="bgcolor" _arg="-c %"
+          _label="Background color (eg. red, MediumAquamarine, #ff0000)"/>
+
+  <number id="nbubbles" _label="Number of bubbles" arg="-b %"
+          high="100" low="0" step="1" default="32"/>
+
+  <number _id="nfishes" _label="Number of fishes" arg="-f %"
+          high="100" low="0" step="1" default="10"/>
+
+  <xscreensaver-updater />
+
+  <_description>
+XFish Tank.
+
+Eric Bina (Original author), Dave Black (Linux port),
+TJ Phan (TrueColor Support), Vincent Renardias (man page, Debian packaging)
+  </_description>
+</screensaver>
diff --git a/x11/xfishtank/pkg-plist b/x11/xfishtank/pkg-plist
new file mode 100644
index 000000000000..e6192ebcb22d
--- /dev/null
+++ b/x11/xfishtank/pkg-plist
@@ -0,0 +1,6 @@
+bin/xfishtank
+bin/xscreensaver-hacks/xfishtank
+share/man/man1/xfishtank.1.gz
+share/xscreensaver/config/xfishtank.xml
+@dir share/xscreensaver/config
+@dir bin/xscreensaver-hacks