public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] repo/gentoo:master commit in: x11-wm/fvwm3/, x11-wm/fvwm3/files/
@ 2022-06-02  5:38 Sam James
  0 siblings, 0 replies; 4+ messages in thread
From: Sam James @ 2022-06-02  5:38 UTC (permalink / raw
  To: gentoo-commits

commit:     441413d3e25f69a370edd41ce25aad07f6803b86
Author:     Matt Jolly <Matt.Jolly <AT> footclan <DOT> ninja>
AuthorDate: Fri May 20 13:02:46 2022 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Thu Jun  2 05:23:07 2022 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=441413d3

x11-wm/fvwm3: new package, add 1.0.4, 9999

Closes: https://bugs.gentoo.org/760012

Signed-off-by: Matt Jolly <Matt.Jolly <AT> footclan.ninja>
Closes: https://github.com/gentoo/gentoo/pull/25609
Signed-off-by: Sam James <sam <AT> gentoo.org>

 x11-wm/fvwm3/Manifest                              |   3 +
 x11-wm/fvwm3/files/README.translucency             |  94 ++++
 x11-wm/fvwm3/files/fvwm3-1.0.4-htmldoc.patch       |  70 +++
 .../files/fvwm3-1.0.4-translucent-menus.patch      | 487 ++++++++++++++++++++
 x11-wm/fvwm3/files/fvwm3-9999-goflags.patch        |  11 +
 x11-wm/fvwm3/files/fvwm3-9999-htmldoc.patch        |  43 ++
 .../fvwm3/files/fvwm3-9999-translucent-menus.patch | 489 +++++++++++++++++++++
 x11-wm/fvwm3/fvwm3-1.0.4.ebuild                    | 200 +++++++++
 x11-wm/fvwm3/fvwm3-9999.ebuild                     | 200 +++++++++
 x11-wm/fvwm3/metadata.xml                          |  27 ++
 10 files changed, 1624 insertions(+)

diff --git a/x11-wm/fvwm3/Manifest b/x11-wm/fvwm3/Manifest
new file mode 100644
index 000000000000..6ba89565ed08
--- /dev/null
+++ b/x11-wm/fvwm3/Manifest
@@ -0,0 +1,3 @@
+DIST fvwm3-1.0.4-deps.tar.xz 2847880 BLAKE2B 245a5fa7846ffd74679ecd280b7f31cdcc58dfb765923750b22905caecdea0a1b2a322eeecc8133996414be37026de9f859222b78d93ed6c974005456ee953d1 SHA512 c93e5d4706a6261d8ebafcb5d2576377d79dfb693cc2b4a7608c3657b1c612b7c17a2554a6cef30c80ed5ffc9d0efd16f9adc33b2a9b906ece812fdf4fa8ab86
+DIST fvwm3-1.0.4.tar.gz 4691719 BLAKE2B 4ce93b1a2d110b570b5fc8b253f9ff8ea1f44e5470c6e1bc136a53ebe53a23abe3d075bf351fca54ac110ea5731f9b44c59c83186d320e7509bf26e5144436ca SHA512 b72a1ebeba7c55214603fd43ea439f7283b3c79e39d2671a67b9512c67dcea111377eab2131ed0b18a72f6b772b0d048abe08f52565708367465ed9bb14e85f6
+DIST fvwm3-9999-deps.tar.xz 3712984 BLAKE2B 389f70dbadbe2fe6accd4793ed71e17cb2ff2f72e318e1744204344902145e5050ace5379f4de89991907199b7b354a9690e6546382d1eedfcdb676b28f1ff13 SHA512 444b1ea17b31d477ae12b4ef84a9f5fb85aae1158aead1bc3a4d8e96a18dde6a13e41e3e3552bd652eb58fe42958ad45791a1d4ef70242e9d6d80060067cef86

diff --git a/x11-wm/fvwm3/files/README.translucency b/x11-wm/fvwm3/files/README.translucency
new file mode 100644
index 000000000000..a60b5f668acd
--- /dev/null
+++ b/x11-wm/fvwm3/files/README.translucency
@@ -0,0 +1,94 @@
+From owner-fvwm@hpc.uh.edu  Sun Aug 31 22:52:59 2003
+Received: from sina.hpc.uh.edu ([129.7.128.10] ident=lists)
+	by malifon.math.uh.edu with esmtp (Exim 3.20 #1)
+	id 19tb0F-0006NY-00; Sun, 31 Aug 2003 17:48:59 -0500
+Received: by sina.hpc.uh.edu (TLB v0.09a (1.20 tibbs 1996/10/09 22:03:07)); Sun, 31 Aug 2003 17:50:31 -0500 (CDT)
+Received: from epithumia.math.uh.edu (epithumia.math.uh.edu [129.7.128.2])
+	by sina.hpc.uh.edu (8.9.3/8.9.3) with ESMTP id RAA16575
+	for <fvwm@hpc.uh.edu>; Sun, 31 Aug 2003 17:50:24 -0500 (CDT)
+Received: from epithumia.math.uh.edu (epithumia.math.uh.edu [127.0.0.1])
+	by epithumia.math.uh.edu (8.12.8/8.12.5) with ESMTP id h7VMml6M025095
+	for <fvwm@hpc.uh.edu>; Sun, 31 Aug 2003 17:48:47 -0500
+Received: (from tibbs@localhost)
+	by epithumia.math.uh.edu (8.12.8/8.12.8/Submit) id h7VMmlVC025093
+	for fvwm@hpc.uh.edu; Sun, 31 Aug 2003 17:48:47 -0500
+Received: from util2.math.uh.edu (util2.math.uh.edu [129.7.128.23])
+	by sina.hpc.uh.edu (8.9.3/8.9.3) with ESMTP id QAA16418
+	for <fvwm@hpc.uh.edu>; Sun, 31 Aug 2003 16:02:07 -0500 (CDT)
+Received: from postfix4-2.free.fr ([213.228.0.176])
+	by util2.math.uh.edu with esmtp (Exim 4.20)
+	id 19tZIm-00079F-6t
+	for fvwm@fvwm.org; Sun, 31 Aug 2003 16:00:00 -0500
+Received: from snoopy.folie (nas-p19-3-62-147-221-172.dial.proxad.net [62.147.221.172])
+	by postfix4-2.free.fr (Postfix) with ESMTP id 59DE6C386
+	for <fvwm@fvwm.org>; Sun, 31 Aug 2003 22:59:34 +0200 (CEST)
+Received: by snoopy.folie (Postfix, from userid 501)
+	id A4D1D48784; Sun, 31 Aug 2003 22:39:19 +0200 (CEST)
+Date: Sun, 31 Aug 2003 22:39:19 +0200
+From: Olivier Chapuis <olivier.chapuis@free.fr>
+To: fvwm@fvwm.org
+Subject: Re: FVWM: Transparency/Translucency revisited...
+Message-ID: <20030831203919.GA6205@snoopy.folie>
+Mail-Followup-To: fvwm@fvwm.org
+References: <Pine.LNX.4.44.0308251817370.1980-100000@atlantis.ssw.krakow.pl>
+Mime-Version: 1.0
+Content-Type: multipart/mixed; boundary="Nq2Wo0NMKNjxTN9z"
+Content-Disposition: inline
+In-Reply-To: <Pine.LNX.4.44.0308251817370.1980-100000@atlantis.ssw.krakow.pl>
+User-Agent: Mutt/1.4i
+X-Spam-Score: -9.3 (---------)
+Sender: owner-fvwm@hpc.uh.edu
+Precedence: list
+X-Majordomo: 1.94.jlt7
+Status: RO
+Content-Length: 6519
+Lines: 122
+
+
+--Nq2Wo0NMKNjxTN9z
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline
+
+On Mon, Aug 25, 2003 at 09:00:32PM +0200, Dawid Kuroczko wrote:
+> Hello. :-)
+> 
+> I did manage to make pseudo-transparent menus, but now I'd like
+> to make something more "real".  What I'd like to do is to have
+> something like there is in KDE.
+> 
+> It should work like this:
+>  1. user clicks thus calling a Menu.
+>  2. current screen dump is taken (with all the windows, but
+>     without a menu just as yet).
+>  3. this screen dump is made available to Menu as
+>     root background pixmap.
+>  4. Menu is displayed with tinted real background.
+> 
+> This way it's pretty easy to make an illusion of real
+> transparency (and looks "l33t", as some may say).
+>
+
+Here a new version of the patch for current cvs/snapshot.
+This patch add a new options to Colorset: Translucent/NoTranslucent.
+These options has effects only with (non tear-off) menu.
+Also menu animation is "handled".
+
+For example with:
+
+  Colorset 5 fg yellow, bg blue, HGradient 200 lightblue darkblue, \
+	  Translucent blue 60
+  Style * MenuColorset 5, PopupOffset 0 100, AnimationOff
+
+you get translucent menus (with a 60% blue tint) and if you tear-off
+a menu the menu use the gradient.
+
+Regards, Olivier
+
+<snip patch>
+
+--
+Visit the official FVWM web page at <URL: http://www.fvwm.org/>.
+To unsubscribe from the list, send "unsubscribe fvwm" in the body of a
+message to majordomo@fvwm.org.
+To report problems, send mail to fvwm-owner@fvwm.org.
+

diff --git a/x11-wm/fvwm3/files/fvwm3-1.0.4-htmldoc.patch b/x11-wm/fvwm3/files/fvwm3-1.0.4-htmldoc.patch
new file mode 100644
index 000000000000..67abc9febfa4
--- /dev/null
+++ b/x11-wm/fvwm3/files/fvwm3-1.0.4-htmldoc.patch
@@ -0,0 +1,70 @@
+This patch enables HTML documentation output
+--- a/doc/Makefile.am
++++ b/doc/Makefile.am
+@@ -1,29 +1,39 @@
+ docdir = @FVWM_DOCDIR@
+-MODULE_ADOCS = $(wildcard fvwm3/fvwm3.adoc bin/*.adoc modules/*.adoc)
++DOC_SRC = $(wildcard fvwm3/fvwm3.adoc bin/*.adoc modules/*.adoc)
+ 
+-EXTRA_DIST = $(MODULE_ADOCS)
++EXTRA_DIST = $(DOC_SRC)
+ 
+ if FVWM_BUILD_MANDOC
+-BUILD_MANS = $(patsubst %.adoc,%, $(MODULE_ADOCS))
++BUILD_MANS = $(DOC_SRC:.adoc=.1)
++BUILD_HTML = $(DOC_SRC:.adoc=.html)
+ else
+ BUILD_MANS =
+ endif
+ 
+-all: docs
+-docs: $(BUILD_MANS)
++all: man html
++
++man: $(BUILD_MANS) 
++
++html: $(BUILD_HTML)
+ 
+ clean:
+ 	rm -fr man1/
++	rm -fr html/
+ 
+ distclean-local: clean
+ 
+ if FVWM_BUILD_MANDOC
+ QUIET_ASCIIDOC = @echo '  ' DOC '    ' $@'.1';
+ 
+-%: %.adoc
++%.1: %.adoc
+ 	$(QUIET_ASCIIDOC) \
+ 	NAME=`basename "$@" | "$(SED)" -e "${transform}"`; \
+-	$(ASCIIDOC) -b manpage $< -o "man1/$$NAME.1"
++	$(ASCIIDOC) -b manpage $^ -o "man1/$$NAME"
++
++%.html: %.adoc
++	$(QUIET_ASCIIDOC:.1=.html) \
++	NAME=`basename "$@" | "$(SED)" -e "${transform}"`; \
++	$(ASCIIDOC) -b html5 $^ -o "html/$$NAME"
+ 
+ install-data-local:
+ 	install -d -m 755 $(DESTDIR)$(mandir)/man1/
+@@ -31,10 +41,19 @@ install-data-local:
+ 		NAME=`basename "$$i" | "$(SED)" -e "${transform}"`; \
+ 		install -m 644 "man1/$$NAME.1" $(DESTDIR)$(mandir)/man1/; \
+ 	done
++	install -d -m 755 $(DESTDIR)$(mandir)/html/
++	@for i in $(notdir $(BUILD_HTML)); do \
++		NAME=`basename "$$i" | "$(SED)" -e "${transform}"`; \
++		install -m 644 "html/$$NAME.html" $(DESTDIR)$(mandir)/html/; \
++	done
+ 
+ uninstall-local:
+ 	@for i in $(notdir $(BUILD_MANS)); do \
+ 		NAME=`basename "$$i" | "$(SED)" -e "${transform}"`; \
+ 		rm -f "$(DESTDIR)$(mandir)/man1/$$NAME.1"; \
+ 	done
++	@for i in $(notdir $(BUILD_HTML)); do \
++		NAME=`basename "$$i" | "$(SED)" -e "${transform}"`; \
++		rm -f "$(DESTDIR)$(mandir)/html/$$NAME.html"; \
++	done
+ endif

diff --git a/x11-wm/fvwm3/files/fvwm3-1.0.4-translucent-menus.patch b/x11-wm/fvwm3/files/fvwm3-1.0.4-translucent-menus.patch
new file mode 100644
index 000000000000..5ead9b09aff5
--- /dev/null
+++ b/x11-wm/fvwm3/files/fvwm3-1.0.4-translucent-menus.patch
@@ -0,0 +1,487 @@
+--- a/fvwm/colorset.c
++++ b/fvwm/colorset.c
+@@ -162,6 +162,8 @@ static char *csetopts[] =
+ 	"NoIconTint",
+ 	"IconAlpha",
+ 
++	"Translucent",
++	"NoTranslucent",
+ 	NULL
+ };
+ 
+@@ -620,6 +622,7 @@ void parse_colorset(int n, char *line)
+ 	char *fg_tint = NULL;
+ 	char *bg_tint = NULL;
+ 	char *icon_tint = NULL;
++	char *translucent_tint = NULL;
+ 	Bool have_pixels_changed = False;
+ 	Bool has_icon_pixels_changed = False;
+ 	Bool has_fg_changed = False;
+@@ -632,6 +635,7 @@ void parse_colorset(int n, char *line)
+ 	Bool has_fg_tint_changed = False;
+ 	Bool has_bg_tint_changed = False;
+ 	Bool has_icon_tint_changed = False;
++	Bool has_translucent_tint_changed = False;
+ 	Bool has_pixmap_changed = False;
+ 	Bool has_shape_changed = False;
+ 	Bool has_image_alpha_changed = False;
+@@ -758,6 +762,10 @@ void parse_colorset(int n, char *line)
+ 		case 21: /* Plain */
+ 			has_pixmap_changed = True;
+ 			free_colorset_background(cs, True);
++			cs->is_translucent = False;
++			cs->translucent_tint_percent = 0;
++			cs->color_flags &= ~TRANSLUCENT_TINT_SUPPLIED;
++			has_translucent_tint_changed = True;
+ 			break;
+ 		case 22: /* NoShape */
+ 			has_shape_changed = True;
+@@ -923,6 +931,24 @@ void parse_colorset(int n, char *line)
+ 				cs->icon_alpha_percent = tmp;
+ 			}
+ 			break;
++		case 42: /* Translucent */
++			cs->is_translucent = True;
++			parse_simple_tint(
++				cs, args, &translucent_tint,
++				TRANSLUCENT_TINT_SUPPLIED,
++				&has_translucent_tint_changed, &percent,
++				"Translucent");
++			if (has_translucent_tint_changed)
++			{
++				cs->translucent_tint_percent = percent;
++			}
++			break;
++		case 43: /* NoTranslucent */
++			cs->is_translucent = False;
++			cs->translucent_tint_percent = 0;
++			cs->color_flags &= ~TRANSLUCENT_TINT_SUPPLIED;
++			has_translucent_tint_changed = True;
++			break;
+ 		default:
+ 			/* test for ?Gradient */
+ 			if (option[0] && StrEquals(&option[1], "Gradient"))
+@@ -1624,6 +1650,27 @@ void parse_colorset(int n, char *line)
+ 		}
+ 	}
+ 
++	/*
++	 * ---------- change the translucent tint colour ----------
++	 */
++	if (has_translucent_tint_changed)
++	{
++		/* user specified colour */
++		if (translucent_tint != NULL)
++		{
++			PictureFreeColors(
++				dpy, Pcmap, &cs->translucent_tint, 1, 0, True);
++			cs->translucent_tint = GetColor(translucent_tint);
++		}
++		else
++		{
++			/* default */
++			PictureFreeColors(
++				dpy, Pcmap, &cs->translucent_tint, 1, 0, True);
++			cs->translucent_tint = GetColor(black);
++		}
++	}
++
+ 	/*
+ 	 * ---------- send new colorset to fvwm and clean up ----------
+ 	 */
+@@ -1720,6 +1767,7 @@ void alloc_colorset(int n)
+ 			ncs->fgsh = GetColor(white);
+ 			ncs->tint = GetColor(black);
+ 			ncs->icon_tint = GetColor(black);
++			ncs->translucent_tint = GetColor(black);
+ 			ncs->pixmap = XCreatePixmapFromBitmapData(
+ 				dpy, Scr.NoFocusWin,
+ 				&g_bits[4 * (nColorsets % 3)], 4, 4,
+@@ -1737,6 +1785,7 @@ void alloc_colorset(int n)
+ 			ncs->fgsh = GetForeShadow(ncs->fg, ncs->bg);
+ 			ncs->tint = GetColor(black);
+ 			ncs->icon_tint = GetColor(black);
++			ncs->translucent_tint = GetColor(black);
+ 		}
+ 		ncs->fg_tint = ncs->bg_tint = GetColor(black);
+ 		/* set flags for fg contrast, bg average */
+@@ -1748,6 +1797,7 @@ void alloc_colorset(int n)
+ 		ncs->icon_alpha_percent = 100;
+ 		ncs->tint_percent = 0;
+ 		ncs->icon_tint_percent = 0;
++		ncs->translucent_tint_percent = 0;
+ 		ncs->fg_tint_percent = ncs->bg_tint_percent = 0;
+ 		ncs->dither = (PictureDitherByDefault())? True:False;
+ 		nColorsets++;
+--- a/fvwm/menuroot.h
++++ b/fvwm/menuroot.h
+@@ -147,6 +147,9 @@ typedef struct MenuRootDynamic
+ 		int d_npixels;
+ 	} stored_pixels;
+ 	/* alloc pixels when dithering is used for gradients */
++	/* x,y XMapRaise */
++	int x;
++	int y;
+ } MenuRootDynamic;
+ 
+ /* access macros to dynamic menu members */
+--- a/fvwm/menus.c
++++ b/fvwm/menus.c
+@@ -75,6 +75,18 @@
+ 				 (ctx).menu_root.menu_root = (root))
+ #define SCTX_GET_MR(ctx)	((ctx).type == SCTX_MENU_ROOT ? \
+ 				 (ctx).menu_root.menu_root : NULL)
++#define MENU_IS_TRANSLUCENT(mr,cs) \
++	(!MR_IS_TEAR_OFF_MENU(mr) && CSET_IS_TRANSLUCENT(cs))
++#define MENU_IS_TRANSPARENT(mr,cs) \
++	(MENU_IS_TRANSLUCENT(mr,cs) || CSET_IS_TRANSPARENT(cs))
++#define MR_IS_TRANSLUCENT_MENU(mr)  \
++	(!MR_IS_TEAR_OFF_MENU(mr) && MR_STYLE(mr) && \
++	ST_HAS_MENU_CSET(MR_STYLE(mr)) && CSET_IS_TRANSLUCENT( \
++						ST_CSET_MENU(MR_STYLE(mr))))
++#define MR_IS_TRANSPARENT_MENU(mr) \
++	(MR_IS_TRANSLUCENT_MENU(mr) || (MR_STYLE(mr) && \
++	ST_HAS_MENU_CSET(MR_STYLE(mr)) && CSET_IS_TRANSPARENT( \
++						ST_CSET_MENU(MR_STYLE(mr)))))
+ 
+ /* ---------------------------- imports ------------------------------------ */
+ 
+@@ -218,6 +230,8 @@ typedef struct mloop_static_info_t
+ } mloop_static_info_t;
+ 
+ /* ---------------------------- forward declarations ----------------------- */
++static MenuRoot *seek_submenu_instance(
++	MenuRoot *parent_menu, MenuItem *parent_item);
+ 
+ /* ---------------------------- local variables ---------------------------- */
+ 
+@@ -379,12 +393,22 @@ static void animated_move_back(
+ 		Bool transparent_bg = False;
+ 
+ 		/* move it back */
+-		if (ST_HAS_MENU_CSET(MR_STYLE(mr)) &&
+-		    CSET_IS_TRANSPARENT(ST_CSET_MENU(MR_STYLE(mr))))
++		if (MR_IS_TRANSPARENT_MENU(mr))
+ 		{
+ 			transparent_bg = True;
+ 			get_menu_repaint_transparent_parameters(
+ 				&mrtp, mr, fw);
++			if (MR_IS_TRANSLUCENT_MENU(mr) && MR_SUBMENU_ITEM(mr))
++			{
++				MenuRoot *smr;
++				smr = seek_submenu_instance(
++					mr, MR_SUBMENU_ITEM(mr));
++				if (smr)
++				{
++					/* just unmap it here, popdown later */
++					XUnmapWindow(dpy, MR_WINDOW(smr));
++				}
++			}
+ 		}
+ 		AnimatedMoveOfWindow(
+ 			MR_WINDOW(mr), act_x, act_y, act_x - MR_XANIMATION(mr),
+@@ -1910,6 +1934,7 @@ static void make_menu_window(MenuRoot *mr, Bool is_tear_off)
+ 				/* Doh.  Use the standard display instead. */
+ 				MR_CREATE_DPY(mr) = dpy;
+ 			}
++			MR_IS_TEAR_OFF_MENU(mr) = 1;
+ 		}
+ 		else
+ 		{
+@@ -2714,7 +2739,37 @@ static void paint_menu(
+ 	}
+ 	MR_IS_PAINTED(mr) = 1;
+ 	/* paint the menu background */
+-	if (ms && ST_HAS_MENU_CSET(ms))
++	if (MR_IS_TRANSLUCENT_MENU(mr))
++	{
++		Pixmap trans = None;
++		FvwmRenderAttributes fra;
++		colorset_t *colorset = &Colorset[ST_CSET_MENU(ms)];
++
++		fra.mask = 0;
++		if (colorset->translucent_tint_percent > 0)
++		{
++			fra.mask = FRAM_HAVE_TINT;
++			fra.tint = colorset->translucent_tint;
++			fra.tint_percent = colorset->translucent_tint_percent;
++		}
++		if (MR_IS_BACKGROUND_SET(mr) == False)
++		{
++			trans = PGraphicsCreateTranslucent(
++				dpy, MR_WINDOW(mr), &fra,
++				BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
++				MR_X(mr), MR_Y(mr), MR_WIDTH(mr), MR_HEIGHT(mr));
++			XMapRaised(dpy, MR_WINDOW(mr));
++			if (trans != None)
++			{
++				XSetWindowBackgroundPixmap(
++					dpy, MR_WINDOW(mr), trans);
++				MR_IS_BACKGROUND_SET(mr) = True;
++				clear_expose_menu_area(MR_WINDOW(mr), pevent);
++				XFreePixmap(dpy, trans);
++			}
++		}
++	}
++	else if (ms && ST_HAS_MENU_CSET(ms))
+ 	{
+ 		if (MR_IS_BACKGROUND_SET(mr) == False)
+ 		{
+@@ -3523,10 +3578,7 @@ static int pop_menu_up(
+ 					MR_HAS_POPPED_UP_RIGHT(mr) = 0;
+ 				}
+ 				MR_XANIMATION(parent_menu) += end_x - prev_x;
+-				if (ST_HAS_MENU_CSET(MR_STYLE(parent_menu)) &&
+-				    CSET_IS_TRANSPARENT(
+-					    ST_CSET_MENU(
+-						    MR_STYLE(parent_menu))))
++				if (MR_IS_TRANSPARENT_MENU(parent_menu))
+ 				{
+ 					transparent_bg = True;
+ 					get_menu_repaint_transparent_parameters(
+@@ -3705,10 +3757,21 @@ static int pop_menu_up(
+ 	 */
+ 
+ 	XMoveWindow(dpy, MR_WINDOW(mr), x, y);
++	MR_X(mr) = x;
++	MR_Y(mr) = y;
+ 	XSelectInput(dpy, MR_WINDOW(mr), event_mask);
+-	XMapRaised(dpy, MR_WINDOW(mr));
+-	if (popdown_window)
+-		XUnmapWindow(dpy, popdown_window);
++	if (MR_IS_TRANSLUCENT_MENU(mr))
++	{
++		if (popdown_window)
++			XUnmapWindow(dpy, popdown_window);
++		paint_menu(mr, NULL, fw);
++	}
++	else
++	{
++		XMapRaised(dpy, MR_WINDOW(mr));
++		if (popdown_window)
++			XUnmapWindow(dpy, popdown_window);
++	}
+ 	XFlush(dpy);
+ 	MR_MAPPED_COPIES(mr)++;
+ 	MST_USAGE_COUNT(mr)++;
+@@ -6277,16 +6340,122 @@ void update_transparent_menu_bg(
+ 	{
+ 		last = True;
+ 	}
+-	if (!last && CSET_IS_TRANSPARENT_PR_TINT(ST_CSET_MENU(ms)))
++	if (!last &&
++	    (CSET_IS_TRANSPARENT_PR_TINT(ST_CSET_MENU(ms)) ||
++	     MR_IS_TRANSLUCENT_MENU(mr)))
+ 	{
+ 		/* too slow ... */
+ 		return;
+ 	}
+-	SetWindowBackgroundWithOffset(
+-		dpy, MR_WINDOW(mr), step_x - current_x, step_y - current_y,
+-		MR_WIDTH(mr), MR_HEIGHT(mr),
+-		&Colorset[ST_CSET_MENU(ms)], Pdepth,
+-		FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
++	if (MR_IS_TRANSLUCENT_MENU(mr))
++	{
++		Pixmap trans, tmp;
++		FvwmRenderAttributes fra;
++		colorset_t *colorset = &Colorset[ST_CSET_MENU(ms)];
++
++		fra.mask = 0;
++		if (colorset->translucent_tint_percent > 0)
++		{
++			fra.mask = FRAM_HAVE_TINT;
++			fra.tint = colorset->translucent_tint;
++			fra.tint_percent = colorset->translucent_tint_percent;
++		}
++		if (current_x == step_x)
++		{
++			/* Reuse the old pixmap for the part of the menu
++			 * that has not moved. (This can be extended to get
++			 * two new rectangles, one in each direction)
++			 *
++			 * It saves the unmapping of the window and makes
++			 * Things less flickering.
++			 */
++			GC my_gc;
++			unsigned long valuemask = GCSubwindowMode;
++			XGCValues values;
++			int out_y=0;
++			values.subwindow_mode = IncludeInferiors;
++			if (step_y < 0)
++			{
++				out_y = -step_y;
++			}
++			trans = XCreatePixmap(dpy, MR_WINDOW(mr), MR_WIDTH(mr),
++					      MR_HEIGHT(mr), Pdepth);
++			my_gc = fvwmlib_XCreateGC(dpy,  MR_WINDOW(mr), 0, NULL);
++			XChangeGC(dpy, my_gc, valuemask, &values);
++
++			XClearWindow(dpy, MR_WINDOW(mr));
++
++			if (current_y < step_y)
++			{
++				XCopyArea(dpy, MR_WINDOW(mr), trans, my_gc, 0,
++					  step_y-current_y, MR_WIDTH(mr),
++					  MR_HEIGHT(mr)-(step_y-current_y),
++					  0,0);
++				tmp = PGraphicsCreateTranslucent(
++					dpy, MR_WINDOW(mr), &fra,
++					BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
++					current_x, current_y+MR_HEIGHT(mr),
++					MR_WIDTH(mr), step_y-current_y);
++
++				XCopyArea(dpy, tmp, trans, my_gc, 0, 0,
++					  MR_WIDTH(mr), step_y-current_y,0,
++					  MR_HEIGHT(mr)-(step_y-current_y));
++			}
++			else
++			{
++				XCopyArea(dpy, MR_WINDOW(mr), trans, my_gc, 0,
++					  0, MR_WIDTH(mr),
++					  MR_HEIGHT(mr)-(current_y-step_y), 0,
++					  current_y-step_y);
++				tmp = PGraphicsCreateTranslucent(
++					dpy, MR_WINDOW(mr), &fra,
++					BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
++					current_x,step_y, MR_WIDTH(mr),
++					current_y-step_y);
++				XCopyArea(dpy, tmp, trans, my_gc, 0, 0,
++					  MR_WIDTH(mr), current_y-step_y,0,
++					  out_y);
++			}
++			MR_X(mr) = step_x;
++			MR_Y(mr) = step_y;
++			XFreePixmap(dpy, tmp);
++			XFreeGC(dpy,my_gc);
++		}
++		else
++		{
++			XUnmapWindow(dpy, MR_WINDOW(mr));
++			MR_X(mr) = step_x;
++			MR_Y(mr) = step_y;
++			trans = PGraphicsCreateTranslucent(
++				dpy, MR_WINDOW(mr), &fra,
++				BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
++				step_x, step_y, MR_WIDTH(mr),
++				MR_HEIGHT(mr));
++			XMapRaised(dpy, MR_WINDOW(mr));
++		}
++		XSetWindowBackgroundPixmap(
++			dpy, MR_WINDOW(mr), trans);
++		XFreePixmap(dpy, trans);
++		if (current_x == step_x)
++		{
++			/* Redraw the border */
++			RelieveRectangle(
++				dpy, MR_WINDOW(mr), 0, 0, MR_WIDTH(mr) - 1,
++				MR_HEIGHT(mr) - 1, (Pdepth < 2) ?
++				SHADOW_GC(MST_MENU_INACTIVE_GCS(mr)) :
++				HILIGHT_GC(MST_MENU_INACTIVE_GCS(mr)),
++				SHADOW_GC(MST_MENU_INACTIVE_GCS(mr)),
++				MST_BORDER_WIDTH(mr));
++		}
++	}
++	else
++	{
++		SetWindowBackgroundWithOffset(
++			dpy, MR_WINDOW(mr), step_x - current_x,
++			step_y - current_y, MR_WIDTH(mr), MR_HEIGHT(mr),
++			&Colorset[ST_CSET_MENU(ms)], Pdepth,
++			FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
++	}
+ }
+ 
+ 
+@@ -6327,10 +6496,7 @@ void repaint_transparent_menu(
+ 	}
+ 	if (!is_bg_set)
+ 	{
+-		SetWindowBackground(
+-			dpy, MR_WINDOW(mr), MR_WIDTH(mr), MR_HEIGHT(mr),
+-			&Colorset[ST_CSET_MENU(ms)], Pdepth,
+-			FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
++		update_transparent_menu_bg(prtm, x, y, x, y, end_x, end_y);
+ 	}
+ 	/* redraw the background of non active item */
+ 	for (mi = MR_FIRST_ITEM(mr); mi != NULL; mi = MI_NEXT_ITEM(mi))
+@@ -6969,7 +7135,10 @@ void UpdateMenuColorset(int cset)
+ 					&Colorset[ST_CSET_MENU(ms)],
+ 					Pdepth,
+ 					FORE_GC(MST_MENU_INACTIVE_GCS(mr)),
+-					True);
++					False);
++				XClearArea(
++					dpy, MR_WINDOW(mr), 0, 0, MR_WIDTH(mr),
++					MR_HEIGHT(mr), True);
+ 			}
+ 			else if ((ST_HAS_ACTIVE_CSET(ms) &&
+ 				  ST_CSET_ACTIVE(ms) == cset) ||
+--- a/fvwm/menus.h
++++ b/fvwm/menus.h
+@@ -19,6 +19,9 @@
+ #define IS_MENU_RETURN(x) \
+   ((x)==MENU_DONE || (x)==MENU_ABORTED || (x)==MENU_SUBMENU_TORN_OFF)
+ 
++#define MR_X(m)                     ((m)->d->x)
++#define MR_Y(m)                     ((m)->d->y)
++
+ struct MenuRoot;
+ struct MenuStyle;
+ struct MenuReturn;
+--- a/libs/Colorset.h
++++ b/libs/Colorset.h
+@@ -53,6 +53,10 @@ typedef struct Colorset
+ 	Bool dither;
+ 	Bool allows_buffered_transparency;
+ 	Bool is_maybe_root_transparent;
++	/* only use by fvwm menu (non tear-off) */
++	Bool is_translucent;
++	Pixel translucent_tint;
++	unsigned int translucent_tint_percent : 7;
+ #endif
+ } colorset_t;
+ 
+@@ -80,6 +84,7 @@ typedef struct Colorset
+ #define FG_TINT_SUPPLIED  0x100
+ #define BG_TINT_SUPPLIED  0x200
+ #define ICON_TINT_SUPPLIED 0x400
++#define TRANSLUCENT_TINT_SUPPLIED 0x800
+ #endif
+ 
+ /* colorsets are stored as an array of structs to permit fast dereferencing */
+@@ -154,6 +159,10 @@ extern colorset_t *Colorset;
+ #define CSETS_IS_TRANSPARENT_PR_TINT(cset) \
+     (cset != NULL && cset->pixmap == ParentRelative && \
+      cset->tint_percent > 0)
++#define CSET_IS_TRANSLUCENT(cset) \
++	(cset >= 0 && Colorset[cset].is_translucent)
++#define CSETS_IS_TRANSLUCENT(cset) \
++	(cset && cset->is_translucent)
+ 
+ #ifndef FVWM_COLORSET_PRIVATE
+ /* Create n new colorsets, fvwm/colorset.c does its own thing (different size)
+--- a/libs/PictureGraphics.c
++++ b/libs/PictureGraphics.c
+@@ -1361,7 +1361,7 @@ void PGraphicsTintRectangle(
+ 	}
+ }
+ 
+-#if 0 /* humm... maybe useful one day with menus */
++#if 1 /* humm... maybe useful one day with menus */
+ Pixmap PGraphicsCreateTranslucent(
+ 	Display *dpy, Window win, FvwmRenderAttributes *fra, GC gc,
+ 	int x, int y, int width, int height)
+--- a/libs/PictureGraphics.h
++++ b/libs/PictureGraphics.h
+@@ -124,7 +124,9 @@ void PGraphicsTintRectangle(
+ 	Display *dpy, Window win, Pixel tint, int tint_percent,
+ 	Drawable dest, Bool dest_is_a_window, GC gc, GC mono_gc, GC alpha_gc,
+ 	int dest_x, int dest_y, int dest_w, int dest_h);
+-
++Pixmap PGraphicsCreateTranslucent(
++	Display *dpy, Window win, FvwmRenderAttributes *fra, GC gc,
++	int x, int y, int width, int height);
+ /* never used ! */
+ Pixmap PGraphicsCreateDitherPixmap(
+ 	Display *dpy, Window win, Drawable src, Pixmap mask, int depth, GC gc,

diff --git a/x11-wm/fvwm3/files/fvwm3-9999-goflags.patch b/x11-wm/fvwm3/files/fvwm3-9999-goflags.patch
new file mode 100644
index 000000000000..fa74f6fb734c
--- /dev/null
+++ b/x11-wm/fvwm3/files/fvwm3-9999-goflags.patch
@@ -0,0 +1,11 @@
+--- a/bin/FvwmPrompt/Makefile.am
++++ b/bin/FvwmPrompt/Makefile.am
+@@ -1,7 +1,7 @@
+ if FVWM_BUILD_GOLANG
+ GOCMD=go
+ GOBUILD=$(GOCMD) build
+-GOFLAGS=-ldflags="-s -w"
++GOFLAGS=
+ GOCLEAN=$(GOCMD) clean
+ BINARY_NAME=FvwmPrompt
+ 

diff --git a/x11-wm/fvwm3/files/fvwm3-9999-htmldoc.patch b/x11-wm/fvwm3/files/fvwm3-9999-htmldoc.patch
new file mode 100644
index 000000000000..abf6fadc614e
--- /dev/null
+++ b/x11-wm/fvwm3/files/fvwm3-9999-htmldoc.patch
@@ -0,0 +1,43 @@
+This patch enables html documentation in >= 1.0.5 of fvwm3
+--- a/doc/Makefile.am
++++ b/doc/Makefile.am
+@@ -13,22 +13,27 @@ EXTRA_DIST = $(MODULE_ADOC)
+ nothing:
+ 
+ clean:
+-	rm -f *.1 *.ad
++	rm -f *.1 *.ad *.html
+ 
+ distclean-local: clean
+ 
+ if FVWM_BUILD_MANDOC
+-man1_MANS = $(patsubst %.adoc,%.1, $(MODULE_ADOC))
++man1_MANS = $(MODULE_ADOC:.adoc=.1)
++man1_HTML = $(MODULE_ADOC:.adoc=.html)
+ EXTRACT_SECTIONS = \
+ 	commands \
+ 	menus \
+ 	styles
+ SECTION_FILES = $(patsubst %,fvwm3_%.ad, $(EXTRACT_SECTIONS))
+ 
+-all: docs
++all: docs html
++
+ docs: $(man1_MANS)
+ $(man1_MANS): $(SECTION_FILES)
+ 
++html: $(man1_HTML)
++$(man1_HTML): $(SECTION_FILES)
++
+ %.ad: fvwm3_manpage_source.adoc
+ 	SECTION=$(patsubst fvwm3_%.ad,%,$@); \
+ 	cat "$<" | \
+@@ -38,4 +43,8 @@ $(man1_MANS): $(SECTION_FILES)
+ 
+ %.1: %.adoc
+ 	"$(ASCIIDOC)" -b manpage -a "$(patsubst %.1,%,$@)" "$<" -o "$@"
++
++%.html: %.adoc
++	"$(ASCIIDOC)" -b html5 -a "$(patsubst %.html,%,$@)" "$<" -o "$@"
++
+ endif

diff --git a/x11-wm/fvwm3/files/fvwm3-9999-translucent-menus.patch b/x11-wm/fvwm3/files/fvwm3-9999-translucent-menus.patch
new file mode 100644
index 000000000000..43b5b0a14403
--- /dev/null
+++ b/x11-wm/fvwm3/files/fvwm3-9999-translucent-menus.patch
@@ -0,0 +1,489 @@
+This patch enables some additional translucency "stuff", ported from a series of patches in 2003 (see readme)
+--- a/fvwm/colorset.c
++++ b/fvwm/colorset.c
+@@ -162,6 +162,8 @@ static char *csetopts[] =
+ 	"NoIconTint",
+ 	"IconAlpha",
+ 
++	"Translucent",
++	"NoTranslucent",
+ 	NULL
+ };
+ 
+@@ -620,6 +622,7 @@ void parse_colorset(int n, char *line)
+ 	char *fg_tint = NULL;
+ 	char *bg_tint = NULL;
+ 	char *icon_tint = NULL;
++	char *translucent_tint = NULL;
+ 	Bool have_pixels_changed = False;
+ 	Bool has_icon_pixels_changed = False;
+ 	Bool has_fg_changed = False;
+@@ -632,6 +635,7 @@ void parse_colorset(int n, char *line)
+ 	Bool has_fg_tint_changed = False;
+ 	Bool has_bg_tint_changed = False;
+ 	Bool has_icon_tint_changed = False;
++	Bool has_translucent_tint_changed = False;
+ 	Bool has_pixmap_changed = False;
+ 	Bool has_shape_changed = False;
+ 	Bool has_image_alpha_changed = False;
+@@ -758,6 +762,10 @@ void parse_colorset(int n, char *line)
+ 		case 21: /* Plain */
+ 			has_pixmap_changed = True;
+ 			free_colorset_background(cs, True);
++			cs->is_translucent = False;
++			cs->translucent_tint_percent = 0;
++			cs->color_flags &= ~TRANSLUCENT_TINT_SUPPLIED;
++			has_translucent_tint_changed = True;
+ 			break;
+ 		case 22: /* NoShape */
+ 			has_shape_changed = True;
+@@ -923,6 +931,24 @@ void parse_colorset(int n, char *line)
+ 				cs->icon_alpha_percent = tmp;
+ 			}
+ 			break;
++		case 42: /* Translucent */
++			cs->is_translucent = True;
++			parse_simple_tint(
++				cs, args, &translucent_tint,
++				TRANSLUCENT_TINT_SUPPLIED,
++				&has_translucent_tint_changed, &percent,
++				"Translucent");
++			if (has_translucent_tint_changed)
++			{
++				cs->translucent_tint_percent = percent;
++			}
++			break;
++		case 43: /* NoTranslucent */
++			cs->is_translucent = False;
++			cs->translucent_tint_percent = 0;
++			cs->color_flags &= ~TRANSLUCENT_TINT_SUPPLIED;
++			has_translucent_tint_changed = True;
++			break;
+ 		default:
+ 			/* test for ?Gradient */
+ 			if (option[0] && StrEquals(&option[1], "Gradient"))
+@@ -1624,6 +1650,27 @@ void parse_colorset(int n, char *line)
+ 		}
+ 	}
+ 
++	/*
++	 * ---------- change the translucent tint colour ----------
++	 */
++	if (has_translucent_tint_changed)
++	{
++		/* user specified colour */
++		if (translucent_tint != NULL)
++		{
++			PictureFreeColors(
++				dpy, Pcmap, &cs->translucent_tint, 1, 0, True);
++			cs->translucent_tint = GetColor(translucent_tint);
++		}
++		else
++		{
++			/* default */
++			PictureFreeColors(
++				dpy, Pcmap, &cs->translucent_tint, 1, 0, True);
++			cs->translucent_tint = GetColor(black);
++		}
++	}
++
+ 	/*
+ 	 * ---------- send new colorset to fvwm and clean up ----------
+ 	 */
+@@ -1720,6 +1767,7 @@ void alloc_colorset(int n)
+ 			ncs->fgsh = GetColor(white);
+ 			ncs->tint = GetColor(black);
+ 			ncs->icon_tint = GetColor(black);
++			ncs->translucent_tint = GetColor(black);
+ 			ncs->pixmap = XCreatePixmapFromBitmapData(
+ 				dpy, Scr.NoFocusWin,
+ 				&g_bits[4 * (nColorsets % 3)], 4, 4,
+@@ -1737,6 +1785,7 @@ void alloc_colorset(int n)
+ 			ncs->fgsh = GetForeShadow(ncs->fg, ncs->bg);
+ 			ncs->tint = GetColor(black);
+ 			ncs->icon_tint = GetColor(black);
++			ncs->translucent_tint = GetColor(black);
+ 		}
+ 		ncs->fg_tint = ncs->bg_tint = GetColor(black);
+ 		/* set flags for fg contrast, bg average */
+@@ -1748,6 +1797,7 @@ void alloc_colorset(int n)
+ 		ncs->icon_alpha_percent = 100;
+ 		ncs->tint_percent = 0;
+ 		ncs->icon_tint_percent = 0;
++		ncs->translucent_tint_percent = 0;
+ 		ncs->fg_tint_percent = ncs->bg_tint_percent = 0;
+ 		ncs->dither = (PictureDitherByDefault())? True:False;
+ 		nColorsets++;
+--- a/fvwm/menuroot.h
++++ b/fvwm/menuroot.h
+@@ -147,6 +147,9 @@ typedef struct MenuRootDynamic
+ 		int d_npixels;
+ 	} stored_pixels;
+ 	/* alloc pixels when dithering is used for gradients */
++	/* x,y XMapRaise */
++	int x;
++	int y;
+ } MenuRootDynamic;
+ 
+ /* access macros to dynamic menu members */
+--- a/fvwm/menus.c
++++ b/fvwm/menus.c
+@@ -76,6 +76,18 @@
+ 				 (ctx).menu_root.menu_root = (root))
+ #define SCTX_GET_MR(ctx)	((ctx).type == SCTX_MENU_ROOT ? \
+ 				 (ctx).menu_root.menu_root : NULL)
++#define MENU_IS_TRANSLUCENT(mr,cs) \
++	(!MR_IS_TEAR_OFF_MENU(mr) && CSET_IS_TRANSLUCENT(cs))
++#define MENU_IS_TRANSPARENT(mr,cs) \
++	(MENU_IS_TRANSLUCENT(mr,cs) || CSET_IS_TRANSPARENT(cs))
++#define MR_IS_TRANSLUCENT_MENU(mr)  \
++	(!MR_IS_TEAR_OFF_MENU(mr) && MR_STYLE(mr) && \
++	ST_HAS_MENU_CSET(MR_STYLE(mr)) && CSET_IS_TRANSLUCENT( \
++						ST_CSET_MENU(MR_STYLE(mr))))
++#define MR_IS_TRANSPARENT_MENU(mr) \
++	(MR_IS_TRANSLUCENT_MENU(mr) || (MR_STYLE(mr) && \
++	ST_HAS_MENU_CSET(MR_STYLE(mr)) && CSET_IS_TRANSPARENT( \
++						ST_CSET_MENU(MR_STYLE(mr)))))
+ 
+ /* ---------------------------- imports ------------------------------------ */
+ 
+@@ -219,6 +231,8 @@ typedef struct mloop_static_info_t
+ } mloop_static_info_t;
+ 
+ /* ---------------------------- forward declarations ----------------------- */
++static MenuRoot *seek_submenu_instance(
++	MenuRoot *parent_menu, MenuItem *parent_item);
+ 
+ /* ---------------------------- local variables ---------------------------- */
+ 
+@@ -380,12 +394,22 @@ static void animated_move_back(
+ 		Bool transparent_bg = False;
+ 
+ 		/* move it back */
+-		if (ST_HAS_MENU_CSET(MR_STYLE(mr)) &&
+-		    CSET_IS_TRANSPARENT(ST_CSET_MENU(MR_STYLE(mr))))
++		if (MR_IS_TRANSPARENT_MENU(mr))
+ 		{
+ 			transparent_bg = True;
+ 			get_menu_repaint_transparent_parameters(
+ 				&mrtp, mr, fw);
++			if (MR_IS_TRANSLUCENT_MENU(mr) && MR_SUBMENU_ITEM(mr))
++			{
++				MenuRoot *smr;
++				smr = seek_submenu_instance(
++					mr, MR_SUBMENU_ITEM(mr));
++				if (smr)
++				{
++					/* just unmap it here, popdown later */
++					XUnmapWindow(dpy, MR_WINDOW(smr));
++				}
++			}
+ 		}
+ 		end.x = start.x - MR_XANIMATION(mr);
+ 		end.y = start.y;
+@@ -1914,6 +1938,7 @@ static void make_menu_window(MenuRoot *mr, Bool is_tear_off)
+ 				/* Doh.  Use the standard display instead. */
+ 				MR_CREATE_DPY(mr) = dpy;
+ 			}
++			MR_IS_TEAR_OFF_MENU(mr) = 1;
+ 		}
+ 		else
+ 		{
+@@ -2718,7 +2743,37 @@ static void paint_menu(
+ 	}
+ 	MR_IS_PAINTED(mr) = 1;
+ 	/* paint the menu background */
+-	if (ms && ST_HAS_MENU_CSET(ms))
++	if (MR_IS_TRANSLUCENT_MENU(mr))
++	{
++		Pixmap trans = None;
++		FvwmRenderAttributes fra;
++		colorset_t *colorset = &Colorset[ST_CSET_MENU(ms)];
++
++		fra.mask = 0;
++		if (colorset->translucent_tint_percent > 0)
++		{
++			fra.mask = FRAM_HAVE_TINT;
++			fra.tint = colorset->translucent_tint;
++			fra.tint_percent = colorset->translucent_tint_percent;
++		}
++		if (MR_IS_BACKGROUND_SET(mr) == False)
++		{
++			trans = PGraphicsCreateTranslucent(
++				dpy, MR_WINDOW(mr), &fra,
++				BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
++				MR_X(mr), MR_Y(mr), MR_WIDTH(mr), MR_HEIGHT(mr));
++			XMapRaised(dpy, MR_WINDOW(mr));
++			if (trans != None)
++			{
++				XSetWindowBackgroundPixmap(
++					dpy, MR_WINDOW(mr), trans);
++				MR_IS_BACKGROUND_SET(mr) = True;
++				clear_expose_menu_area(MR_WINDOW(mr), pevent);
++				XFreePixmap(dpy, trans);
++			}
++		}
++	}
++	else if (ms && ST_HAS_MENU_CSET(ms))
+ 	{
+ 		if (MR_IS_BACKGROUND_SET(mr) == False)
+ 		{
+@@ -3527,10 +3582,7 @@ static int pop_menu_up(
+ 					MR_HAS_POPPED_UP_RIGHT(mr) = 0;
+ 				}
+ 				MR_XANIMATION(parent_menu) += end_x - prev_x;
+-				if (ST_HAS_MENU_CSET(MR_STYLE(parent_menu)) &&
+-				    CSET_IS_TRANSPARENT(
+-					    ST_CSET_MENU(
+-						    MR_STYLE(parent_menu))))
++				if (MR_IS_TRANSPARENT_MENU(parent_menu))
+ 				{
+ 					transparent_bg = True;
+ 					get_menu_repaint_transparent_parameters(
+@@ -3713,10 +3765,21 @@ static int pop_menu_up(
+ 	 */
+ 
+ 	XMoveWindow(dpy, MR_WINDOW(mr), x, y);
++	MR_X(mr) = x;
++	MR_Y(mr) = y;
+ 	XSelectInput(dpy, MR_WINDOW(mr), event_mask);
+-	XMapRaised(dpy, MR_WINDOW(mr));
+-	if (popdown_window)
+-		XUnmapWindow(dpy, popdown_window);
++	if (MR_IS_TRANSLUCENT_MENU(mr))
++	{
++		if (popdown_window)
++			XUnmapWindow(dpy, popdown_window);
++		paint_menu(mr, NULL, fw);
++	}
++	else
++	{
++		XMapRaised(dpy, MR_WINDOW(mr));
++		if (popdown_window)
++			XUnmapWindow(dpy, popdown_window);
++	}
+ 	XFlush(dpy);
+ 	MR_MAPPED_COPIES(mr)++;
+ 	MST_USAGE_COUNT(mr)++;
+@@ -6286,16 +6349,122 @@ void update_transparent_menu_bg(
+ 	{
+ 		last = True;
+ 	}
+-	if (!last && CSET_IS_TRANSPARENT_PR_TINT(ST_CSET_MENU(ms)))
++	if (!last &&
++	    (CSET_IS_TRANSPARENT_PR_TINT(ST_CSET_MENU(ms)) ||
++	     MR_IS_TRANSLUCENT_MENU(mr)))
+ 	{
+ 		/* too slow ... */
+ 		return;
+ 	}
+-	SetWindowBackgroundWithOffset(
+-		dpy, MR_WINDOW(mr), step_x - current_x, step_y - current_y,
+-		MR_WIDTH(mr), MR_HEIGHT(mr),
+-		&Colorset[ST_CSET_MENU(ms)], Pdepth,
+-		FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
++	if (MR_IS_TRANSLUCENT_MENU(mr))
++	{
++		Pixmap trans, tmp;
++		FvwmRenderAttributes fra;
++		colorset_t *colorset = &Colorset[ST_CSET_MENU(ms)];
++
++		fra.mask = 0;
++		if (colorset->translucent_tint_percent > 0)
++		{
++			fra.mask = FRAM_HAVE_TINT;
++			fra.tint = colorset->translucent_tint;
++			fra.tint_percent = colorset->translucent_tint_percent;
++		}
++		if (current_x == step_x)
++		{
++			/* Reuse the old pixmap for the part of the menu
++			 * that has not moved. (This can be extended to get
++			 * two new rectangles, one in each direction)
++			 *
++			 * It saves the unmapping of the window and makes
++			 * Things less flickering.
++			 */
++			GC my_gc;
++			unsigned long valuemask = GCSubwindowMode;
++			XGCValues values;
++			int out_y=0;
++			values.subwindow_mode = IncludeInferiors;
++			if (step_y < 0)
++			{
++				out_y = -step_y;
++			}
++			trans = XCreatePixmap(dpy, MR_WINDOW(mr), MR_WIDTH(mr),
++					      MR_HEIGHT(mr), Pdepth);
++			my_gc = fvwmlib_XCreateGC(dpy,  MR_WINDOW(mr), 0, NULL);
++			XChangeGC(dpy, my_gc, valuemask, &values);
++
++			XClearWindow(dpy, MR_WINDOW(mr));
++
++			if (current_y < step_y)
++			{
++				XCopyArea(dpy, MR_WINDOW(mr), trans, my_gc, 0,
++					  step_y-current_y, MR_WIDTH(mr),
++					  MR_HEIGHT(mr)-(step_y-current_y),
++					  0,0);
++				tmp = PGraphicsCreateTranslucent(
++					dpy, MR_WINDOW(mr), &fra,
++					BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
++					current_x, current_y+MR_HEIGHT(mr),
++					MR_WIDTH(mr), step_y-current_y);
++
++				XCopyArea(dpy, tmp, trans, my_gc, 0, 0,
++					  MR_WIDTH(mr), step_y-current_y,0,
++					  MR_HEIGHT(mr)-(step_y-current_y));
++			}
++			else
++			{
++				XCopyArea(dpy, MR_WINDOW(mr), trans, my_gc, 0,
++					  0, MR_WIDTH(mr),
++					  MR_HEIGHT(mr)-(current_y-step_y), 0,
++					  current_y-step_y);
++				tmp = PGraphicsCreateTranslucent(
++					dpy, MR_WINDOW(mr), &fra,
++					BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
++					current_x,step_y, MR_WIDTH(mr),
++					current_y-step_y);
++				XCopyArea(dpy, tmp, trans, my_gc, 0, 0,
++					  MR_WIDTH(mr), current_y-step_y,0,
++					  out_y);
++			}
++			MR_X(mr) = step_x;
++			MR_Y(mr) = step_y;
++			XFreePixmap(dpy, tmp);
++			XFreeGC(dpy,my_gc);
++		}
++		else
++		{
++			XUnmapWindow(dpy, MR_WINDOW(mr));
++			MR_X(mr) = step_x;
++			MR_Y(mr) = step_y;
++			trans = PGraphicsCreateTranslucent(
++				dpy, MR_WINDOW(mr), &fra,
++				BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
++				step_x, step_y, MR_WIDTH(mr),
++				MR_HEIGHT(mr));
++			XMapRaised(dpy, MR_WINDOW(mr));
++		}
++		XSetWindowBackgroundPixmap(
++			dpy, MR_WINDOW(mr), trans);
++		XFreePixmap(dpy, trans);
++		if (current_x == step_x)
++		{
++			/* Redraw the border */
++			RelieveRectangle(
++				dpy, MR_WINDOW(mr), 0, 0, MR_WIDTH(mr) - 1,
++				MR_HEIGHT(mr) - 1, (Pdepth < 2) ?
++				SHADOW_GC(MST_MENU_INACTIVE_GCS(mr)) :
++				HILIGHT_GC(MST_MENU_INACTIVE_GCS(mr)),
++				SHADOW_GC(MST_MENU_INACTIVE_GCS(mr)),
++				MST_BORDER_WIDTH(mr));
++		}
++	}
++	else
++	{
++		SetWindowBackgroundWithOffset(
++			dpy, MR_WINDOW(mr), step_x - current_x,
++			step_y - current_y, MR_WIDTH(mr), MR_HEIGHT(mr),
++			&Colorset[ST_CSET_MENU(ms)], Pdepth,
++			FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
++	}
+ }
+ 
+ 
+@@ -6336,10 +6505,7 @@ void repaint_transparent_menu(
+ 	}
+ 	if (!is_bg_set)
+ 	{
+-		SetWindowBackground(
+-			dpy, MR_WINDOW(mr), MR_WIDTH(mr), MR_HEIGHT(mr),
+-			&Colorset[ST_CSET_MENU(ms)], Pdepth,
+-			FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
++		update_transparent_menu_bg(prtm, x, y, x, y, end_x, end_y);
+ 	}
+ 	/* redraw the background of non active item */
+ 	for (mi = MR_FIRST_ITEM(mr); mi != NULL; mi = MI_NEXT_ITEM(mi))
+@@ -6978,7 +7144,10 @@ void UpdateMenuColorset(int cset)
+ 					&Colorset[ST_CSET_MENU(ms2)],
+ 					Pdepth,
+ 					FORE_GC(MST_MENU_INACTIVE_GCS(mr)),
+-					True);
++					False);
++				XClearArea(
++					dpy, MR_WINDOW(mr), 0, 0, MR_WIDTH(mr),
++					MR_HEIGHT(mr), True);
+ 			}
+ 			else if ((ST_HAS_ACTIVE_CSET(ms2) &&
+ 				  ST_CSET_ACTIVE(ms2) == cset) ||
+--- a/fvwm/menus.h
++++ b/fvwm/menus.h
+@@ -19,6 +19,9 @@
+ #define IS_MENU_RETURN(x) \
+   ((x)==MENU_DONE || (x)==MENU_ABORTED || (x)==MENU_SUBMENU_TORN_OFF)
+ 
++#define MR_X(m)                     ((m)->d->x)
++#define MR_Y(m)                     ((m)->d->y)
++
+ struct MenuRoot;
+ struct MenuStyle;
+ struct MenuReturn;
+--- a/libs/Colorset.h
++++ b/libs/Colorset.h
+@@ -53,6 +53,10 @@ typedef struct Colorset
+ 	Bool dither;
+ 	Bool allows_buffered_transparency;
+ 	Bool is_maybe_root_transparent;
++	/* only use by fvwm menu (non tear-off) */
++	Bool is_translucent;
++	Pixel translucent_tint;
++	unsigned int translucent_tint_percent : 7;
+ #endif
+ } colorset_t;
+ 
+@@ -80,6 +84,7 @@ typedef struct Colorset
+ #define FG_TINT_SUPPLIED  0x100
+ #define BG_TINT_SUPPLIED  0x200
+ #define ICON_TINT_SUPPLIED 0x400
++#define TRANSLUCENT_TINT_SUPPLIED 0x800
+ #endif
+ 
+ /* colorsets are stored as an array of structs to permit fast dereferencing */
+@@ -155,6 +160,11 @@ extern colorset_t *Colorset;
+     (cset != NULL && cset->pixmap == ParentRelative && \
+      cset->tint_percent > 0)
+ 
++#define CSET_IS_TRANSLUCENT(cset) \
++    (cset >= 0 && Colorset[cset].is_translucent)
++#define CSETS_IS_TRANSLUCENT(cset) \
++    (cset && cset->is_translucent)
++
+ #ifndef FVWM_COLORSET_PRIVATE
+ /* Create n new colorsets, fvwm/colorset.c does its own thing (different size)
+  */
+--- a/libs/PictureGraphics.c
++++ b/libs/PictureGraphics.c
+@@ -1361,7 +1361,7 @@ void PGraphicsTintRectangle(
+ 	}
+ }
+ 
+-#if 0 /* humm... maybe useful one day with menus */
++#if 1 /* humm... maybe useful one day with menus */
+ Pixmap PGraphicsCreateTranslucent(
+ 	Display *dpy, Window win, FvwmRenderAttributes *fra, GC gc,
+ 	int x, int y, int width, int height)
+--- a/libs/PictureGraphics.h
++++ b/libs/PictureGraphics.h
+@@ -124,7 +124,9 @@ void PGraphicsTintRectangle(
+ 	Display *dpy, Window win, Pixel tint, int tint_percent,
+ 	Drawable dest, Bool dest_is_a_window, GC gc, GC mono_gc, GC alpha_gc,
+ 	int dest_x, int dest_y, int dest_w, int dest_h);
+-
++Pixmap PGraphicsCreateTranslucent(
++	Display *dpy, Window win, FvwmRenderAttributes *fra, GC gc,
++	int x, int y, int width, int height);
+ /* never used ! */
+ Pixmap PGraphicsCreateDitherPixmap(
+ 	Display *dpy, Window win, Drawable src, Pixmap mask, int depth, GC gc,

diff --git a/x11-wm/fvwm3/fvwm3-1.0.4.ebuild b/x11-wm/fvwm3/fvwm3-1.0.4.ebuild
new file mode 100644
index 000000000000..c396bd24fe70
--- /dev/null
+++ b/x11-wm/fvwm3/fvwm3-1.0.4.ebuild
@@ -0,0 +1,200 @@
+# Copyright 1999-2022 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+PYTHON_COMPAT=( python3_{8..11} )
+GO_OPTIONAL=1
+inherit autotools desktop flag-o-matic go-module python-single-r1
+
+DESCRIPTION="A multiple large virtual desktop window manager derived from fvwm"
+HOMEPAGE="http://www.fvwm.org/"
+
+if [[ ${PV} == 9999 ]]; then
+	inherit git-r3
+	EGIT_REPO_URI="https://github.com/fvwmorg/fvwm3.git"
+	EGIT_BRANCH="master"
+else
+	SRC_URI="https://github.com/fvwmorg/fvwm3/releases/download/${PV}/${P}.tar.gz"
+	KEYWORDS="~amd64"
+fi
+
+SRC_URI+=" https://gitlab.com/Matt.Jolly/fvwm3-go-deps/-/raw/${PV}/${P}-deps.tar.xz?inline=false -> ${P}-deps.tar.xz"
+
+LICENSE="GPL-2+ FVWM
+	go? (
+			Apache-2.0
+			BSD
+			MIT
+		)"
+
+SLOT="0"
+
+IUSE="bidi debug doc go netpbm nls perl png readline rplay stroke svg tk truetype vanilla lock"
+REQUIRED_USE="
+	${PYTHON_REQUIRED_USE}"
+
+DOCS=( NEWS )
+
+if [[ ${PV} == 9999 ]]; then
+	DOCS+=( dev-docs/COMMANDS dev-docs/DEVELOPERS.md dev-docs/INSTALL.md dev-docs/PARSING.md dev-docs/TODO.md dev-docs/NEW-COMMANDS.md )
+fi
+
+BDEPEND="
+	virtual/pkgconfig
+	doc? ( dev-libs/libxslt
+		dev-ruby/asciidoctor )
+	app-arch/unzip
+	go? ( >=dev-lang/go-1.14 )
+"
+
+RDEPEND="${PYTHON_DEPS}
+	${COMMON_DEPEND}
+	!x11-wm/fvwm
+	>=dev-libs/libevent-2.0.0
+	dev-lang/perl
+	sys-libs/zlib
+	x11-libs/libICE
+	x11-libs/libSM
+	x11-libs/libX11
+	x11-libs/libXau
+	x11-libs/libxcb
+	x11-libs/libXcursor
+	x11-libs/libXdmcp
+	x11-libs/libXext
+	x11-libs/libXfixes
+	x11-libs/libXpm
+	x11-libs/libXrandr
+	x11-libs/libXrender
+	bidi? ( dev-libs/fribidi )
+	lock? ( x11-misc/xlockmore )
+	netpbm? ( media-libs/netpbm )
+	perl? ( tk? (
+			dev-lang/tk
+			dev-perl/Tk
+			>=dev-perl/X11-Protocol-0.56
+		)
+	)
+	png? ( media-libs/libpng:= )
+	readline? (
+		sys-libs/ncurses:=
+		sys-libs/readline:=
+	)
+	rplay? ( media-sound/rplay )
+	stroke? ( dev-libs/libstroke )
+	svg? ( gnome-base/librsvg:2 )
+	truetype? (
+		media-libs/fontconfig
+		x11-libs/libXft
+	)
+	userland_GNU? ( sys-apps/debianutils )"
+
+DEPEND="${COMMON_DEPEND}
+	x11-base/xorg-proto"
+
+PATCHES=(
+	"${FILESDIR}/${P}-translucent-menus.patch"
+)
+
+if [[ ${PV} == 9999 ]]; then
+	PATCHES+=(
+		"${FILESDIR}/${P}-goflags.patch"
+	)
+fi
+
+src_unpack() {
+	if [[ ${PV} == 9999 ]]; then
+		einfo "The branch ${EGIT_BRANCH} will be installed."
+		git-r3_src_unpack
+	else
+		unpack "${P}".tar.gz
+	fi
+	unpack "${P}"-deps.tar.xz
+	mv go-mod ${P}/bin/FvwmPrompt/ || die
+}
+
+src_prepare() {
+	default
+	if use doc; then
+		eapply "${FILESDIR}/${P}-htmldoc.patch"
+	fi
+
+	sed -i '/^@FVWM_BUILD_GOLANG_TRUE@GOBUILD = $(GOCMD) build/s/$/ -mod=mod/' \
+		bin/FvwmPrompt/Makefile.in || die "Updating go build paramaters failed."
+
+	eautoreconf
+}
+
+src_configure() {
+	# Non-upstream email where bugs should be sent; used in fvwm-bug.
+	export FVWM_BUGADDR="desktop-wm@nogentoo.org"
+
+	# Recommended by upstream for release. Doesn't really matter for live ebuilds.
+	append-flags -fno-strict-aliasing
+
+	# Signed chars are required.
+	for arch in arm arm64 ppc ppc64; do
+		use $arch && append-flags -fsigned-chars
+	done
+
+	local myconf=(
+		--prefix=/usr
+		--with-imagepath=/usr/include/X11/bitmaps:/usr/include/X11/pixmaps:/usr/share/icons/fvwm
+		--enable-package-subdirs
+		$(use_enable bidi)
+		$(use_enable doc mandoc)
+		$(use_enable go golang)
+		$(use_enable nls)
+		$(use_enable nls iconv)
+		$(use_enable perl perllib)
+		$(use_enable png)
+		$(use_with readline readline-library)
+		$(use_enable svg rsvg)
+		$(use_enable truetype xft)
+		--docdir=/usr/share/doc/${P}
+	)
+
+	use readline && myconf+=( --without-termcap-library )
+
+	econf ${myconf[@]}
+}
+
+src_compile() {
+	PREFIX="/usr" emake
+	if [[ ${PV} == *9999 ]]; then
+		use doc && emake -C doc html
+	fi
+}
+
+src_install() {
+	emake DESTDIR="${ED}" prefix="/usr" exec_prefix="/usr" datarootdir="/usr/share" install
+
+	dodir /etc/X11/Sessions
+	echo "/usr/bin/fvwm3" > "${ED}/etc/X11/Sessions/${PN}" || die
+	fperms a+x /etc/X11/Sessions/${PN} || die
+
+	python_scriptinto "/usr/bin"
+	python_doscript "${ED}/usr/bin/FvwmCommand" "${ED}/usr/bin/fvwm-menu-desktop"
+	if use doc; then
+		if [[ ${PV} == *9999 ]]; then
+			HTML_DOCS=( doc/*.html )
+		else
+			HTML_DOCS=( doc/html/*.html )
+		fi
+	fi
+	einstalldocs
+
+	make_session_desktop fvwm3 /usr/bin/fvwm3
+}
+
+pkg_postinst() {
+	if use go; then
+		ewarn "FvwmPrompt has been installed, it provides the functionality of both FvwmCommand and FvwmConsole."
+		ewarn "For compatibility with the existing fvwm2 configurations, the ebuild will install a FvwmCommand wrapper script."
+		ewarn "If you need FvwmConsole, install ${PN} with USE=\"-go\", but FvwmPrompt and FvwmCommnd will not be installed."
+	else
+		ewarn "Fvwmconsole has been installed, but FvwmCommand and FvwmPrompt are no longer included in this ebuild."
+		ewarn "If you need FvwmPrompt or FvwmCommand, install ${PN} with USE=\"go\"."
+		ewarn "In that case, FvwmPrompt will replace FvwmConsole and provide the same functionality in a more flexible way."
+	fi
+}

diff --git a/x11-wm/fvwm3/fvwm3-9999.ebuild b/x11-wm/fvwm3/fvwm3-9999.ebuild
new file mode 100644
index 000000000000..c396bd24fe70
--- /dev/null
+++ b/x11-wm/fvwm3/fvwm3-9999.ebuild
@@ -0,0 +1,200 @@
+# Copyright 1999-2022 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+PYTHON_COMPAT=( python3_{8..11} )
+GO_OPTIONAL=1
+inherit autotools desktop flag-o-matic go-module python-single-r1
+
+DESCRIPTION="A multiple large virtual desktop window manager derived from fvwm"
+HOMEPAGE="http://www.fvwm.org/"
+
+if [[ ${PV} == 9999 ]]; then
+	inherit git-r3
+	EGIT_REPO_URI="https://github.com/fvwmorg/fvwm3.git"
+	EGIT_BRANCH="master"
+else
+	SRC_URI="https://github.com/fvwmorg/fvwm3/releases/download/${PV}/${P}.tar.gz"
+	KEYWORDS="~amd64"
+fi
+
+SRC_URI+=" https://gitlab.com/Matt.Jolly/fvwm3-go-deps/-/raw/${PV}/${P}-deps.tar.xz?inline=false -> ${P}-deps.tar.xz"
+
+LICENSE="GPL-2+ FVWM
+	go? (
+			Apache-2.0
+			BSD
+			MIT
+		)"
+
+SLOT="0"
+
+IUSE="bidi debug doc go netpbm nls perl png readline rplay stroke svg tk truetype vanilla lock"
+REQUIRED_USE="
+	${PYTHON_REQUIRED_USE}"
+
+DOCS=( NEWS )
+
+if [[ ${PV} == 9999 ]]; then
+	DOCS+=( dev-docs/COMMANDS dev-docs/DEVELOPERS.md dev-docs/INSTALL.md dev-docs/PARSING.md dev-docs/TODO.md dev-docs/NEW-COMMANDS.md )
+fi
+
+BDEPEND="
+	virtual/pkgconfig
+	doc? ( dev-libs/libxslt
+		dev-ruby/asciidoctor )
+	app-arch/unzip
+	go? ( >=dev-lang/go-1.14 )
+"
+
+RDEPEND="${PYTHON_DEPS}
+	${COMMON_DEPEND}
+	!x11-wm/fvwm
+	>=dev-libs/libevent-2.0.0
+	dev-lang/perl
+	sys-libs/zlib
+	x11-libs/libICE
+	x11-libs/libSM
+	x11-libs/libX11
+	x11-libs/libXau
+	x11-libs/libxcb
+	x11-libs/libXcursor
+	x11-libs/libXdmcp
+	x11-libs/libXext
+	x11-libs/libXfixes
+	x11-libs/libXpm
+	x11-libs/libXrandr
+	x11-libs/libXrender
+	bidi? ( dev-libs/fribidi )
+	lock? ( x11-misc/xlockmore )
+	netpbm? ( media-libs/netpbm )
+	perl? ( tk? (
+			dev-lang/tk
+			dev-perl/Tk
+			>=dev-perl/X11-Protocol-0.56
+		)
+	)
+	png? ( media-libs/libpng:= )
+	readline? (
+		sys-libs/ncurses:=
+		sys-libs/readline:=
+	)
+	rplay? ( media-sound/rplay )
+	stroke? ( dev-libs/libstroke )
+	svg? ( gnome-base/librsvg:2 )
+	truetype? (
+		media-libs/fontconfig
+		x11-libs/libXft
+	)
+	userland_GNU? ( sys-apps/debianutils )"
+
+DEPEND="${COMMON_DEPEND}
+	x11-base/xorg-proto"
+
+PATCHES=(
+	"${FILESDIR}/${P}-translucent-menus.patch"
+)
+
+if [[ ${PV} == 9999 ]]; then
+	PATCHES+=(
+		"${FILESDIR}/${P}-goflags.patch"
+	)
+fi
+
+src_unpack() {
+	if [[ ${PV} == 9999 ]]; then
+		einfo "The branch ${EGIT_BRANCH} will be installed."
+		git-r3_src_unpack
+	else
+		unpack "${P}".tar.gz
+	fi
+	unpack "${P}"-deps.tar.xz
+	mv go-mod ${P}/bin/FvwmPrompt/ || die
+}
+
+src_prepare() {
+	default
+	if use doc; then
+		eapply "${FILESDIR}/${P}-htmldoc.patch"
+	fi
+
+	sed -i '/^@FVWM_BUILD_GOLANG_TRUE@GOBUILD = $(GOCMD) build/s/$/ -mod=mod/' \
+		bin/FvwmPrompt/Makefile.in || die "Updating go build paramaters failed."
+
+	eautoreconf
+}
+
+src_configure() {
+	# Non-upstream email where bugs should be sent; used in fvwm-bug.
+	export FVWM_BUGADDR="desktop-wm@nogentoo.org"
+
+	# Recommended by upstream for release. Doesn't really matter for live ebuilds.
+	append-flags -fno-strict-aliasing
+
+	# Signed chars are required.
+	for arch in arm arm64 ppc ppc64; do
+		use $arch && append-flags -fsigned-chars
+	done
+
+	local myconf=(
+		--prefix=/usr
+		--with-imagepath=/usr/include/X11/bitmaps:/usr/include/X11/pixmaps:/usr/share/icons/fvwm
+		--enable-package-subdirs
+		$(use_enable bidi)
+		$(use_enable doc mandoc)
+		$(use_enable go golang)
+		$(use_enable nls)
+		$(use_enable nls iconv)
+		$(use_enable perl perllib)
+		$(use_enable png)
+		$(use_with readline readline-library)
+		$(use_enable svg rsvg)
+		$(use_enable truetype xft)
+		--docdir=/usr/share/doc/${P}
+	)
+
+	use readline && myconf+=( --without-termcap-library )
+
+	econf ${myconf[@]}
+}
+
+src_compile() {
+	PREFIX="/usr" emake
+	if [[ ${PV} == *9999 ]]; then
+		use doc && emake -C doc html
+	fi
+}
+
+src_install() {
+	emake DESTDIR="${ED}" prefix="/usr" exec_prefix="/usr" datarootdir="/usr/share" install
+
+	dodir /etc/X11/Sessions
+	echo "/usr/bin/fvwm3" > "${ED}/etc/X11/Sessions/${PN}" || die
+	fperms a+x /etc/X11/Sessions/${PN} || die
+
+	python_scriptinto "/usr/bin"
+	python_doscript "${ED}/usr/bin/FvwmCommand" "${ED}/usr/bin/fvwm-menu-desktop"
+	if use doc; then
+		if [[ ${PV} == *9999 ]]; then
+			HTML_DOCS=( doc/*.html )
+		else
+			HTML_DOCS=( doc/html/*.html )
+		fi
+	fi
+	einstalldocs
+
+	make_session_desktop fvwm3 /usr/bin/fvwm3
+}
+
+pkg_postinst() {
+	if use go; then
+		ewarn "FvwmPrompt has been installed, it provides the functionality of both FvwmCommand and FvwmConsole."
+		ewarn "For compatibility with the existing fvwm2 configurations, the ebuild will install a FvwmCommand wrapper script."
+		ewarn "If you need FvwmConsole, install ${PN} with USE=\"-go\", but FvwmPrompt and FvwmCommnd will not be installed."
+	else
+		ewarn "Fvwmconsole has been installed, but FvwmCommand and FvwmPrompt are no longer included in this ebuild."
+		ewarn "If you need FvwmPrompt or FvwmCommand, install ${PN} with USE=\"go\"."
+		ewarn "In that case, FvwmPrompt will replace FvwmConsole and provide the same functionality in a more flexible way."
+	fi
+}

diff --git a/x11-wm/fvwm3/metadata.xml b/x11-wm/fvwm3/metadata.xml
new file mode 100644
index 000000000000..3711144d46ea
--- /dev/null
+++ b/x11-wm/fvwm3/metadata.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+	<longdescription lang="en">
+		fvwm3 is a multiple large virtual desktop window manager.
+		The successor to fvwm-2.6, Fvwm3 is intended to be extremely customizable and extendible while consuming a relatively small amount of resources.
+	</longdescription>
+	<maintainer type="person" proxied="yes">
+		<email>Matt.Jolly@footclan.ninja</email>
+		<name>Matthew Jolly</name>
+	</maintainer>
+	<maintainer type="project" proxied="proxy">
+		<email>proxy-maint@gentoo.org</email>
+		<name>Proxy Maintainers</name>
+	</maintainer>
+	<use>
+		<flag name="go">Enable building <pkg>dev-lang/go</pkg> code (FvwmPrompt)</flag>
+		<flag name="lock">Enable screen locking</flag>
+		<flag name="netpbm">Enable NetPBM support (used by FvwmScript-ScreenDump)</flag>
+		<flag name="rplay">Enable rplay support</flag>
+		<flag name="stroke">Mouse Gesture support</flag>
+	</use>
+	<upstream>
+		<bugs-to>https://github.com/fvwmorg/fvwm3/issues</bugs-to>
+		<changelog>https://raw.githubusercontent.com/fvwmorg/fvwm3/master/CHANGELOG.md</changelog>
+	</upstream>
+</pkgmetadata>


^ permalink raw reply related	[flat|nested] 4+ messages in thread
* [gentoo-commits] repo/gentoo:master commit in: x11-wm/fvwm3/, x11-wm/fvwm3/files/
@ 2022-06-04  2:19 Sam James
  0 siblings, 0 replies; 4+ messages in thread
From: Sam James @ 2022-06-04  2:19 UTC (permalink / raw
  To: gentoo-commits

commit:     e0676d323821ce5660feec809a9f8018a2ab58c3
Author:     Matt Jolly <Matt.Jolly <AT> footclan <DOT> ninja>
AuthorDate: Fri May 20 13:02:46 2022 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Sat Jun  4 02:19:19 2022 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=e0676d32

x11-wm/fvwm3: new package, add 1.0.4, 9999

Closes: https://bugs.gentoo.org/760012

Signed-off-by: Matt Jolly <Matt.Jolly <AT> footclan.ninja>
Signed-off-by: Sam James <sam <AT> gentoo.org>

 x11-wm/fvwm3/Manifest                              |   3 +
 x11-wm/fvwm3/files/README.translucency             |  94 ++++
 x11-wm/fvwm3/files/fvwm3-1.0.4-htmldoc.patch       |  70 +++
 .../files/fvwm3-1.0.4-translucent-menus.patch      | 487 ++++++++++++++++++++
 x11-wm/fvwm3/files/fvwm3-9999-goflags.patch        |  11 +
 x11-wm/fvwm3/files/fvwm3-9999-htmldoc.patch        |  43 ++
 .../fvwm3/files/fvwm3-9999-translucent-menus.patch | 489 +++++++++++++++++++++
 x11-wm/fvwm3/fvwm3-1.0.4.ebuild                    | 204 +++++++++
 x11-wm/fvwm3/fvwm3-9999.ebuild                     | 204 +++++++++
 x11-wm/fvwm3/metadata.xml                          |  27 ++
 10 files changed, 1632 insertions(+)

diff --git a/x11-wm/fvwm3/Manifest b/x11-wm/fvwm3/Manifest
new file mode 100644
index 000000000000..6ba89565ed08
--- /dev/null
+++ b/x11-wm/fvwm3/Manifest
@@ -0,0 +1,3 @@
+DIST fvwm3-1.0.4-deps.tar.xz 2847880 BLAKE2B 245a5fa7846ffd74679ecd280b7f31cdcc58dfb765923750b22905caecdea0a1b2a322eeecc8133996414be37026de9f859222b78d93ed6c974005456ee953d1 SHA512 c93e5d4706a6261d8ebafcb5d2576377d79dfb693cc2b4a7608c3657b1c612b7c17a2554a6cef30c80ed5ffc9d0efd16f9adc33b2a9b906ece812fdf4fa8ab86
+DIST fvwm3-1.0.4.tar.gz 4691719 BLAKE2B 4ce93b1a2d110b570b5fc8b253f9ff8ea1f44e5470c6e1bc136a53ebe53a23abe3d075bf351fca54ac110ea5731f9b44c59c83186d320e7509bf26e5144436ca SHA512 b72a1ebeba7c55214603fd43ea439f7283b3c79e39d2671a67b9512c67dcea111377eab2131ed0b18a72f6b772b0d048abe08f52565708367465ed9bb14e85f6
+DIST fvwm3-9999-deps.tar.xz 3712984 BLAKE2B 389f70dbadbe2fe6accd4793ed71e17cb2ff2f72e318e1744204344902145e5050ace5379f4de89991907199b7b354a9690e6546382d1eedfcdb676b28f1ff13 SHA512 444b1ea17b31d477ae12b4ef84a9f5fb85aae1158aead1bc3a4d8e96a18dde6a13e41e3e3552bd652eb58fe42958ad45791a1d4ef70242e9d6d80060067cef86

diff --git a/x11-wm/fvwm3/files/README.translucency b/x11-wm/fvwm3/files/README.translucency
new file mode 100644
index 000000000000..a60b5f668acd
--- /dev/null
+++ b/x11-wm/fvwm3/files/README.translucency
@@ -0,0 +1,94 @@
+From owner-fvwm@hpc.uh.edu  Sun Aug 31 22:52:59 2003
+Received: from sina.hpc.uh.edu ([129.7.128.10] ident=lists)
+	by malifon.math.uh.edu with esmtp (Exim 3.20 #1)
+	id 19tb0F-0006NY-00; Sun, 31 Aug 2003 17:48:59 -0500
+Received: by sina.hpc.uh.edu (TLB v0.09a (1.20 tibbs 1996/10/09 22:03:07)); Sun, 31 Aug 2003 17:50:31 -0500 (CDT)
+Received: from epithumia.math.uh.edu (epithumia.math.uh.edu [129.7.128.2])
+	by sina.hpc.uh.edu (8.9.3/8.9.3) with ESMTP id RAA16575
+	for <fvwm@hpc.uh.edu>; Sun, 31 Aug 2003 17:50:24 -0500 (CDT)
+Received: from epithumia.math.uh.edu (epithumia.math.uh.edu [127.0.0.1])
+	by epithumia.math.uh.edu (8.12.8/8.12.5) with ESMTP id h7VMml6M025095
+	for <fvwm@hpc.uh.edu>; Sun, 31 Aug 2003 17:48:47 -0500
+Received: (from tibbs@localhost)
+	by epithumia.math.uh.edu (8.12.8/8.12.8/Submit) id h7VMmlVC025093
+	for fvwm@hpc.uh.edu; Sun, 31 Aug 2003 17:48:47 -0500
+Received: from util2.math.uh.edu (util2.math.uh.edu [129.7.128.23])
+	by sina.hpc.uh.edu (8.9.3/8.9.3) with ESMTP id QAA16418
+	for <fvwm@hpc.uh.edu>; Sun, 31 Aug 2003 16:02:07 -0500 (CDT)
+Received: from postfix4-2.free.fr ([213.228.0.176])
+	by util2.math.uh.edu with esmtp (Exim 4.20)
+	id 19tZIm-00079F-6t
+	for fvwm@fvwm.org; Sun, 31 Aug 2003 16:00:00 -0500
+Received: from snoopy.folie (nas-p19-3-62-147-221-172.dial.proxad.net [62.147.221.172])
+	by postfix4-2.free.fr (Postfix) with ESMTP id 59DE6C386
+	for <fvwm@fvwm.org>; Sun, 31 Aug 2003 22:59:34 +0200 (CEST)
+Received: by snoopy.folie (Postfix, from userid 501)
+	id A4D1D48784; Sun, 31 Aug 2003 22:39:19 +0200 (CEST)
+Date: Sun, 31 Aug 2003 22:39:19 +0200
+From: Olivier Chapuis <olivier.chapuis@free.fr>
+To: fvwm@fvwm.org
+Subject: Re: FVWM: Transparency/Translucency revisited...
+Message-ID: <20030831203919.GA6205@snoopy.folie>
+Mail-Followup-To: fvwm@fvwm.org
+References: <Pine.LNX.4.44.0308251817370.1980-100000@atlantis.ssw.krakow.pl>
+Mime-Version: 1.0
+Content-Type: multipart/mixed; boundary="Nq2Wo0NMKNjxTN9z"
+Content-Disposition: inline
+In-Reply-To: <Pine.LNX.4.44.0308251817370.1980-100000@atlantis.ssw.krakow.pl>
+User-Agent: Mutt/1.4i
+X-Spam-Score: -9.3 (---------)
+Sender: owner-fvwm@hpc.uh.edu
+Precedence: list
+X-Majordomo: 1.94.jlt7
+Status: RO
+Content-Length: 6519
+Lines: 122
+
+
+--Nq2Wo0NMKNjxTN9z
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline
+
+On Mon, Aug 25, 2003 at 09:00:32PM +0200, Dawid Kuroczko wrote:
+> Hello. :-)
+> 
+> I did manage to make pseudo-transparent menus, but now I'd like
+> to make something more "real".  What I'd like to do is to have
+> something like there is in KDE.
+> 
+> It should work like this:
+>  1. user clicks thus calling a Menu.
+>  2. current screen dump is taken (with all the windows, but
+>     without a menu just as yet).
+>  3. this screen dump is made available to Menu as
+>     root background pixmap.
+>  4. Menu is displayed with tinted real background.
+> 
+> This way it's pretty easy to make an illusion of real
+> transparency (and looks "l33t", as some may say).
+>
+
+Here a new version of the patch for current cvs/snapshot.
+This patch add a new options to Colorset: Translucent/NoTranslucent.
+These options has effects only with (non tear-off) menu.
+Also menu animation is "handled".
+
+For example with:
+
+  Colorset 5 fg yellow, bg blue, HGradient 200 lightblue darkblue, \
+	  Translucent blue 60
+  Style * MenuColorset 5, PopupOffset 0 100, AnimationOff
+
+you get translucent menus (with a 60% blue tint) and if you tear-off
+a menu the menu use the gradient.
+
+Regards, Olivier
+
+<snip patch>
+
+--
+Visit the official FVWM web page at <URL: http://www.fvwm.org/>.
+To unsubscribe from the list, send "unsubscribe fvwm" in the body of a
+message to majordomo@fvwm.org.
+To report problems, send mail to fvwm-owner@fvwm.org.
+

diff --git a/x11-wm/fvwm3/files/fvwm3-1.0.4-htmldoc.patch b/x11-wm/fvwm3/files/fvwm3-1.0.4-htmldoc.patch
new file mode 100644
index 000000000000..67abc9febfa4
--- /dev/null
+++ b/x11-wm/fvwm3/files/fvwm3-1.0.4-htmldoc.patch
@@ -0,0 +1,70 @@
+This patch enables HTML documentation output
+--- a/doc/Makefile.am
++++ b/doc/Makefile.am
+@@ -1,29 +1,39 @@
+ docdir = @FVWM_DOCDIR@
+-MODULE_ADOCS = $(wildcard fvwm3/fvwm3.adoc bin/*.adoc modules/*.adoc)
++DOC_SRC = $(wildcard fvwm3/fvwm3.adoc bin/*.adoc modules/*.adoc)
+ 
+-EXTRA_DIST = $(MODULE_ADOCS)
++EXTRA_DIST = $(DOC_SRC)
+ 
+ if FVWM_BUILD_MANDOC
+-BUILD_MANS = $(patsubst %.adoc,%, $(MODULE_ADOCS))
++BUILD_MANS = $(DOC_SRC:.adoc=.1)
++BUILD_HTML = $(DOC_SRC:.adoc=.html)
+ else
+ BUILD_MANS =
+ endif
+ 
+-all: docs
+-docs: $(BUILD_MANS)
++all: man html
++
++man: $(BUILD_MANS) 
++
++html: $(BUILD_HTML)
+ 
+ clean:
+ 	rm -fr man1/
++	rm -fr html/
+ 
+ distclean-local: clean
+ 
+ if FVWM_BUILD_MANDOC
+ QUIET_ASCIIDOC = @echo '  ' DOC '    ' $@'.1';
+ 
+-%: %.adoc
++%.1: %.adoc
+ 	$(QUIET_ASCIIDOC) \
+ 	NAME=`basename "$@" | "$(SED)" -e "${transform}"`; \
+-	$(ASCIIDOC) -b manpage $< -o "man1/$$NAME.1"
++	$(ASCIIDOC) -b manpage $^ -o "man1/$$NAME"
++
++%.html: %.adoc
++	$(QUIET_ASCIIDOC:.1=.html) \
++	NAME=`basename "$@" | "$(SED)" -e "${transform}"`; \
++	$(ASCIIDOC) -b html5 $^ -o "html/$$NAME"
+ 
+ install-data-local:
+ 	install -d -m 755 $(DESTDIR)$(mandir)/man1/
+@@ -31,10 +41,19 @@ install-data-local:
+ 		NAME=`basename "$$i" | "$(SED)" -e "${transform}"`; \
+ 		install -m 644 "man1/$$NAME.1" $(DESTDIR)$(mandir)/man1/; \
+ 	done
++	install -d -m 755 $(DESTDIR)$(mandir)/html/
++	@for i in $(notdir $(BUILD_HTML)); do \
++		NAME=`basename "$$i" | "$(SED)" -e "${transform}"`; \
++		install -m 644 "html/$$NAME.html" $(DESTDIR)$(mandir)/html/; \
++	done
+ 
+ uninstall-local:
+ 	@for i in $(notdir $(BUILD_MANS)); do \
+ 		NAME=`basename "$$i" | "$(SED)" -e "${transform}"`; \
+ 		rm -f "$(DESTDIR)$(mandir)/man1/$$NAME.1"; \
+ 	done
++	@for i in $(notdir $(BUILD_HTML)); do \
++		NAME=`basename "$$i" | "$(SED)" -e "${transform}"`; \
++		rm -f "$(DESTDIR)$(mandir)/html/$$NAME.html"; \
++	done
+ endif

diff --git a/x11-wm/fvwm3/files/fvwm3-1.0.4-translucent-menus.patch b/x11-wm/fvwm3/files/fvwm3-1.0.4-translucent-menus.patch
new file mode 100644
index 000000000000..5ead9b09aff5
--- /dev/null
+++ b/x11-wm/fvwm3/files/fvwm3-1.0.4-translucent-menus.patch
@@ -0,0 +1,487 @@
+--- a/fvwm/colorset.c
++++ b/fvwm/colorset.c
+@@ -162,6 +162,8 @@ static char *csetopts[] =
+ 	"NoIconTint",
+ 	"IconAlpha",
+ 
++	"Translucent",
++	"NoTranslucent",
+ 	NULL
+ };
+ 
+@@ -620,6 +622,7 @@ void parse_colorset(int n, char *line)
+ 	char *fg_tint = NULL;
+ 	char *bg_tint = NULL;
+ 	char *icon_tint = NULL;
++	char *translucent_tint = NULL;
+ 	Bool have_pixels_changed = False;
+ 	Bool has_icon_pixels_changed = False;
+ 	Bool has_fg_changed = False;
+@@ -632,6 +635,7 @@ void parse_colorset(int n, char *line)
+ 	Bool has_fg_tint_changed = False;
+ 	Bool has_bg_tint_changed = False;
+ 	Bool has_icon_tint_changed = False;
++	Bool has_translucent_tint_changed = False;
+ 	Bool has_pixmap_changed = False;
+ 	Bool has_shape_changed = False;
+ 	Bool has_image_alpha_changed = False;
+@@ -758,6 +762,10 @@ void parse_colorset(int n, char *line)
+ 		case 21: /* Plain */
+ 			has_pixmap_changed = True;
+ 			free_colorset_background(cs, True);
++			cs->is_translucent = False;
++			cs->translucent_tint_percent = 0;
++			cs->color_flags &= ~TRANSLUCENT_TINT_SUPPLIED;
++			has_translucent_tint_changed = True;
+ 			break;
+ 		case 22: /* NoShape */
+ 			has_shape_changed = True;
+@@ -923,6 +931,24 @@ void parse_colorset(int n, char *line)
+ 				cs->icon_alpha_percent = tmp;
+ 			}
+ 			break;
++		case 42: /* Translucent */
++			cs->is_translucent = True;
++			parse_simple_tint(
++				cs, args, &translucent_tint,
++				TRANSLUCENT_TINT_SUPPLIED,
++				&has_translucent_tint_changed, &percent,
++				"Translucent");
++			if (has_translucent_tint_changed)
++			{
++				cs->translucent_tint_percent = percent;
++			}
++			break;
++		case 43: /* NoTranslucent */
++			cs->is_translucent = False;
++			cs->translucent_tint_percent = 0;
++			cs->color_flags &= ~TRANSLUCENT_TINT_SUPPLIED;
++			has_translucent_tint_changed = True;
++			break;
+ 		default:
+ 			/* test for ?Gradient */
+ 			if (option[0] && StrEquals(&option[1], "Gradient"))
+@@ -1624,6 +1650,27 @@ void parse_colorset(int n, char *line)
+ 		}
+ 	}
+ 
++	/*
++	 * ---------- change the translucent tint colour ----------
++	 */
++	if (has_translucent_tint_changed)
++	{
++		/* user specified colour */
++		if (translucent_tint != NULL)
++		{
++			PictureFreeColors(
++				dpy, Pcmap, &cs->translucent_tint, 1, 0, True);
++			cs->translucent_tint = GetColor(translucent_tint);
++		}
++		else
++		{
++			/* default */
++			PictureFreeColors(
++				dpy, Pcmap, &cs->translucent_tint, 1, 0, True);
++			cs->translucent_tint = GetColor(black);
++		}
++	}
++
+ 	/*
+ 	 * ---------- send new colorset to fvwm and clean up ----------
+ 	 */
+@@ -1720,6 +1767,7 @@ void alloc_colorset(int n)
+ 			ncs->fgsh = GetColor(white);
+ 			ncs->tint = GetColor(black);
+ 			ncs->icon_tint = GetColor(black);
++			ncs->translucent_tint = GetColor(black);
+ 			ncs->pixmap = XCreatePixmapFromBitmapData(
+ 				dpy, Scr.NoFocusWin,
+ 				&g_bits[4 * (nColorsets % 3)], 4, 4,
+@@ -1737,6 +1785,7 @@ void alloc_colorset(int n)
+ 			ncs->fgsh = GetForeShadow(ncs->fg, ncs->bg);
+ 			ncs->tint = GetColor(black);
+ 			ncs->icon_tint = GetColor(black);
++			ncs->translucent_tint = GetColor(black);
+ 		}
+ 		ncs->fg_tint = ncs->bg_tint = GetColor(black);
+ 		/* set flags for fg contrast, bg average */
+@@ -1748,6 +1797,7 @@ void alloc_colorset(int n)
+ 		ncs->icon_alpha_percent = 100;
+ 		ncs->tint_percent = 0;
+ 		ncs->icon_tint_percent = 0;
++		ncs->translucent_tint_percent = 0;
+ 		ncs->fg_tint_percent = ncs->bg_tint_percent = 0;
+ 		ncs->dither = (PictureDitherByDefault())? True:False;
+ 		nColorsets++;
+--- a/fvwm/menuroot.h
++++ b/fvwm/menuroot.h
+@@ -147,6 +147,9 @@ typedef struct MenuRootDynamic
+ 		int d_npixels;
+ 	} stored_pixels;
+ 	/* alloc pixels when dithering is used for gradients */
++	/* x,y XMapRaise */
++	int x;
++	int y;
+ } MenuRootDynamic;
+ 
+ /* access macros to dynamic menu members */
+--- a/fvwm/menus.c
++++ b/fvwm/menus.c
+@@ -75,6 +75,18 @@
+ 				 (ctx).menu_root.menu_root = (root))
+ #define SCTX_GET_MR(ctx)	((ctx).type == SCTX_MENU_ROOT ? \
+ 				 (ctx).menu_root.menu_root : NULL)
++#define MENU_IS_TRANSLUCENT(mr,cs) \
++	(!MR_IS_TEAR_OFF_MENU(mr) && CSET_IS_TRANSLUCENT(cs))
++#define MENU_IS_TRANSPARENT(mr,cs) \
++	(MENU_IS_TRANSLUCENT(mr,cs) || CSET_IS_TRANSPARENT(cs))
++#define MR_IS_TRANSLUCENT_MENU(mr)  \
++	(!MR_IS_TEAR_OFF_MENU(mr) && MR_STYLE(mr) && \
++	ST_HAS_MENU_CSET(MR_STYLE(mr)) && CSET_IS_TRANSLUCENT( \
++						ST_CSET_MENU(MR_STYLE(mr))))
++#define MR_IS_TRANSPARENT_MENU(mr) \
++	(MR_IS_TRANSLUCENT_MENU(mr) || (MR_STYLE(mr) && \
++	ST_HAS_MENU_CSET(MR_STYLE(mr)) && CSET_IS_TRANSPARENT( \
++						ST_CSET_MENU(MR_STYLE(mr)))))
+ 
+ /* ---------------------------- imports ------------------------------------ */
+ 
+@@ -218,6 +230,8 @@ typedef struct mloop_static_info_t
+ } mloop_static_info_t;
+ 
+ /* ---------------------------- forward declarations ----------------------- */
++static MenuRoot *seek_submenu_instance(
++	MenuRoot *parent_menu, MenuItem *parent_item);
+ 
+ /* ---------------------------- local variables ---------------------------- */
+ 
+@@ -379,12 +393,22 @@ static void animated_move_back(
+ 		Bool transparent_bg = False;
+ 
+ 		/* move it back */
+-		if (ST_HAS_MENU_CSET(MR_STYLE(mr)) &&
+-		    CSET_IS_TRANSPARENT(ST_CSET_MENU(MR_STYLE(mr))))
++		if (MR_IS_TRANSPARENT_MENU(mr))
+ 		{
+ 			transparent_bg = True;
+ 			get_menu_repaint_transparent_parameters(
+ 				&mrtp, mr, fw);
++			if (MR_IS_TRANSLUCENT_MENU(mr) && MR_SUBMENU_ITEM(mr))
++			{
++				MenuRoot *smr;
++				smr = seek_submenu_instance(
++					mr, MR_SUBMENU_ITEM(mr));
++				if (smr)
++				{
++					/* just unmap it here, popdown later */
++					XUnmapWindow(dpy, MR_WINDOW(smr));
++				}
++			}
+ 		}
+ 		AnimatedMoveOfWindow(
+ 			MR_WINDOW(mr), act_x, act_y, act_x - MR_XANIMATION(mr),
+@@ -1910,6 +1934,7 @@ static void make_menu_window(MenuRoot *mr, Bool is_tear_off)
+ 				/* Doh.  Use the standard display instead. */
+ 				MR_CREATE_DPY(mr) = dpy;
+ 			}
++			MR_IS_TEAR_OFF_MENU(mr) = 1;
+ 		}
+ 		else
+ 		{
+@@ -2714,7 +2739,37 @@ static void paint_menu(
+ 	}
+ 	MR_IS_PAINTED(mr) = 1;
+ 	/* paint the menu background */
+-	if (ms && ST_HAS_MENU_CSET(ms))
++	if (MR_IS_TRANSLUCENT_MENU(mr))
++	{
++		Pixmap trans = None;
++		FvwmRenderAttributes fra;
++		colorset_t *colorset = &Colorset[ST_CSET_MENU(ms)];
++
++		fra.mask = 0;
++		if (colorset->translucent_tint_percent > 0)
++		{
++			fra.mask = FRAM_HAVE_TINT;
++			fra.tint = colorset->translucent_tint;
++			fra.tint_percent = colorset->translucent_tint_percent;
++		}
++		if (MR_IS_BACKGROUND_SET(mr) == False)
++		{
++			trans = PGraphicsCreateTranslucent(
++				dpy, MR_WINDOW(mr), &fra,
++				BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
++				MR_X(mr), MR_Y(mr), MR_WIDTH(mr), MR_HEIGHT(mr));
++			XMapRaised(dpy, MR_WINDOW(mr));
++			if (trans != None)
++			{
++				XSetWindowBackgroundPixmap(
++					dpy, MR_WINDOW(mr), trans);
++				MR_IS_BACKGROUND_SET(mr) = True;
++				clear_expose_menu_area(MR_WINDOW(mr), pevent);
++				XFreePixmap(dpy, trans);
++			}
++		}
++	}
++	else if (ms && ST_HAS_MENU_CSET(ms))
+ 	{
+ 		if (MR_IS_BACKGROUND_SET(mr) == False)
+ 		{
+@@ -3523,10 +3578,7 @@ static int pop_menu_up(
+ 					MR_HAS_POPPED_UP_RIGHT(mr) = 0;
+ 				}
+ 				MR_XANIMATION(parent_menu) += end_x - prev_x;
+-				if (ST_HAS_MENU_CSET(MR_STYLE(parent_menu)) &&
+-				    CSET_IS_TRANSPARENT(
+-					    ST_CSET_MENU(
+-						    MR_STYLE(parent_menu))))
++				if (MR_IS_TRANSPARENT_MENU(parent_menu))
+ 				{
+ 					transparent_bg = True;
+ 					get_menu_repaint_transparent_parameters(
+@@ -3705,10 +3757,21 @@ static int pop_menu_up(
+ 	 */
+ 
+ 	XMoveWindow(dpy, MR_WINDOW(mr), x, y);
++	MR_X(mr) = x;
++	MR_Y(mr) = y;
+ 	XSelectInput(dpy, MR_WINDOW(mr), event_mask);
+-	XMapRaised(dpy, MR_WINDOW(mr));
+-	if (popdown_window)
+-		XUnmapWindow(dpy, popdown_window);
++	if (MR_IS_TRANSLUCENT_MENU(mr))
++	{
++		if (popdown_window)
++			XUnmapWindow(dpy, popdown_window);
++		paint_menu(mr, NULL, fw);
++	}
++	else
++	{
++		XMapRaised(dpy, MR_WINDOW(mr));
++		if (popdown_window)
++			XUnmapWindow(dpy, popdown_window);
++	}
+ 	XFlush(dpy);
+ 	MR_MAPPED_COPIES(mr)++;
+ 	MST_USAGE_COUNT(mr)++;
+@@ -6277,16 +6340,122 @@ void update_transparent_menu_bg(
+ 	{
+ 		last = True;
+ 	}
+-	if (!last && CSET_IS_TRANSPARENT_PR_TINT(ST_CSET_MENU(ms)))
++	if (!last &&
++	    (CSET_IS_TRANSPARENT_PR_TINT(ST_CSET_MENU(ms)) ||
++	     MR_IS_TRANSLUCENT_MENU(mr)))
+ 	{
+ 		/* too slow ... */
+ 		return;
+ 	}
+-	SetWindowBackgroundWithOffset(
+-		dpy, MR_WINDOW(mr), step_x - current_x, step_y - current_y,
+-		MR_WIDTH(mr), MR_HEIGHT(mr),
+-		&Colorset[ST_CSET_MENU(ms)], Pdepth,
+-		FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
++	if (MR_IS_TRANSLUCENT_MENU(mr))
++	{
++		Pixmap trans, tmp;
++		FvwmRenderAttributes fra;
++		colorset_t *colorset = &Colorset[ST_CSET_MENU(ms)];
++
++		fra.mask = 0;
++		if (colorset->translucent_tint_percent > 0)
++		{
++			fra.mask = FRAM_HAVE_TINT;
++			fra.tint = colorset->translucent_tint;
++			fra.tint_percent = colorset->translucent_tint_percent;
++		}
++		if (current_x == step_x)
++		{
++			/* Reuse the old pixmap for the part of the menu
++			 * that has not moved. (This can be extended to get
++			 * two new rectangles, one in each direction)
++			 *
++			 * It saves the unmapping of the window and makes
++			 * Things less flickering.
++			 */
++			GC my_gc;
++			unsigned long valuemask = GCSubwindowMode;
++			XGCValues values;
++			int out_y=0;
++			values.subwindow_mode = IncludeInferiors;
++			if (step_y < 0)
++			{
++				out_y = -step_y;
++			}
++			trans = XCreatePixmap(dpy, MR_WINDOW(mr), MR_WIDTH(mr),
++					      MR_HEIGHT(mr), Pdepth);
++			my_gc = fvwmlib_XCreateGC(dpy,  MR_WINDOW(mr), 0, NULL);
++			XChangeGC(dpy, my_gc, valuemask, &values);
++
++			XClearWindow(dpy, MR_WINDOW(mr));
++
++			if (current_y < step_y)
++			{
++				XCopyArea(dpy, MR_WINDOW(mr), trans, my_gc, 0,
++					  step_y-current_y, MR_WIDTH(mr),
++					  MR_HEIGHT(mr)-(step_y-current_y),
++					  0,0);
++				tmp = PGraphicsCreateTranslucent(
++					dpy, MR_WINDOW(mr), &fra,
++					BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
++					current_x, current_y+MR_HEIGHT(mr),
++					MR_WIDTH(mr), step_y-current_y);
++
++				XCopyArea(dpy, tmp, trans, my_gc, 0, 0,
++					  MR_WIDTH(mr), step_y-current_y,0,
++					  MR_HEIGHT(mr)-(step_y-current_y));
++			}
++			else
++			{
++				XCopyArea(dpy, MR_WINDOW(mr), trans, my_gc, 0,
++					  0, MR_WIDTH(mr),
++					  MR_HEIGHT(mr)-(current_y-step_y), 0,
++					  current_y-step_y);
++				tmp = PGraphicsCreateTranslucent(
++					dpy, MR_WINDOW(mr), &fra,
++					BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
++					current_x,step_y, MR_WIDTH(mr),
++					current_y-step_y);
++				XCopyArea(dpy, tmp, trans, my_gc, 0, 0,
++					  MR_WIDTH(mr), current_y-step_y,0,
++					  out_y);
++			}
++			MR_X(mr) = step_x;
++			MR_Y(mr) = step_y;
++			XFreePixmap(dpy, tmp);
++			XFreeGC(dpy,my_gc);
++		}
++		else
++		{
++			XUnmapWindow(dpy, MR_WINDOW(mr));
++			MR_X(mr) = step_x;
++			MR_Y(mr) = step_y;
++			trans = PGraphicsCreateTranslucent(
++				dpy, MR_WINDOW(mr), &fra,
++				BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
++				step_x, step_y, MR_WIDTH(mr),
++				MR_HEIGHT(mr));
++			XMapRaised(dpy, MR_WINDOW(mr));
++		}
++		XSetWindowBackgroundPixmap(
++			dpy, MR_WINDOW(mr), trans);
++		XFreePixmap(dpy, trans);
++		if (current_x == step_x)
++		{
++			/* Redraw the border */
++			RelieveRectangle(
++				dpy, MR_WINDOW(mr), 0, 0, MR_WIDTH(mr) - 1,
++				MR_HEIGHT(mr) - 1, (Pdepth < 2) ?
++				SHADOW_GC(MST_MENU_INACTIVE_GCS(mr)) :
++				HILIGHT_GC(MST_MENU_INACTIVE_GCS(mr)),
++				SHADOW_GC(MST_MENU_INACTIVE_GCS(mr)),
++				MST_BORDER_WIDTH(mr));
++		}
++	}
++	else
++	{
++		SetWindowBackgroundWithOffset(
++			dpy, MR_WINDOW(mr), step_x - current_x,
++			step_y - current_y, MR_WIDTH(mr), MR_HEIGHT(mr),
++			&Colorset[ST_CSET_MENU(ms)], Pdepth,
++			FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
++	}
+ }
+ 
+ 
+@@ -6327,10 +6496,7 @@ void repaint_transparent_menu(
+ 	}
+ 	if (!is_bg_set)
+ 	{
+-		SetWindowBackground(
+-			dpy, MR_WINDOW(mr), MR_WIDTH(mr), MR_HEIGHT(mr),
+-			&Colorset[ST_CSET_MENU(ms)], Pdepth,
+-			FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
++		update_transparent_menu_bg(prtm, x, y, x, y, end_x, end_y);
+ 	}
+ 	/* redraw the background of non active item */
+ 	for (mi = MR_FIRST_ITEM(mr); mi != NULL; mi = MI_NEXT_ITEM(mi))
+@@ -6969,7 +7135,10 @@ void UpdateMenuColorset(int cset)
+ 					&Colorset[ST_CSET_MENU(ms)],
+ 					Pdepth,
+ 					FORE_GC(MST_MENU_INACTIVE_GCS(mr)),
+-					True);
++					False);
++				XClearArea(
++					dpy, MR_WINDOW(mr), 0, 0, MR_WIDTH(mr),
++					MR_HEIGHT(mr), True);
+ 			}
+ 			else if ((ST_HAS_ACTIVE_CSET(ms) &&
+ 				  ST_CSET_ACTIVE(ms) == cset) ||
+--- a/fvwm/menus.h
++++ b/fvwm/menus.h
+@@ -19,6 +19,9 @@
+ #define IS_MENU_RETURN(x) \
+   ((x)==MENU_DONE || (x)==MENU_ABORTED || (x)==MENU_SUBMENU_TORN_OFF)
+ 
++#define MR_X(m)                     ((m)->d->x)
++#define MR_Y(m)                     ((m)->d->y)
++
+ struct MenuRoot;
+ struct MenuStyle;
+ struct MenuReturn;
+--- a/libs/Colorset.h
++++ b/libs/Colorset.h
+@@ -53,6 +53,10 @@ typedef struct Colorset
+ 	Bool dither;
+ 	Bool allows_buffered_transparency;
+ 	Bool is_maybe_root_transparent;
++	/* only use by fvwm menu (non tear-off) */
++	Bool is_translucent;
++	Pixel translucent_tint;
++	unsigned int translucent_tint_percent : 7;
+ #endif
+ } colorset_t;
+ 
+@@ -80,6 +84,7 @@ typedef struct Colorset
+ #define FG_TINT_SUPPLIED  0x100
+ #define BG_TINT_SUPPLIED  0x200
+ #define ICON_TINT_SUPPLIED 0x400
++#define TRANSLUCENT_TINT_SUPPLIED 0x800
+ #endif
+ 
+ /* colorsets are stored as an array of structs to permit fast dereferencing */
+@@ -154,6 +159,10 @@ extern colorset_t *Colorset;
+ #define CSETS_IS_TRANSPARENT_PR_TINT(cset) \
+     (cset != NULL && cset->pixmap == ParentRelative && \
+      cset->tint_percent > 0)
++#define CSET_IS_TRANSLUCENT(cset) \
++	(cset >= 0 && Colorset[cset].is_translucent)
++#define CSETS_IS_TRANSLUCENT(cset) \
++	(cset && cset->is_translucent)
+ 
+ #ifndef FVWM_COLORSET_PRIVATE
+ /* Create n new colorsets, fvwm/colorset.c does its own thing (different size)
+--- a/libs/PictureGraphics.c
++++ b/libs/PictureGraphics.c
+@@ -1361,7 +1361,7 @@ void PGraphicsTintRectangle(
+ 	}
+ }
+ 
+-#if 0 /* humm... maybe useful one day with menus */
++#if 1 /* humm... maybe useful one day with menus */
+ Pixmap PGraphicsCreateTranslucent(
+ 	Display *dpy, Window win, FvwmRenderAttributes *fra, GC gc,
+ 	int x, int y, int width, int height)
+--- a/libs/PictureGraphics.h
++++ b/libs/PictureGraphics.h
+@@ -124,7 +124,9 @@ void PGraphicsTintRectangle(
+ 	Display *dpy, Window win, Pixel tint, int tint_percent,
+ 	Drawable dest, Bool dest_is_a_window, GC gc, GC mono_gc, GC alpha_gc,
+ 	int dest_x, int dest_y, int dest_w, int dest_h);
+-
++Pixmap PGraphicsCreateTranslucent(
++	Display *dpy, Window win, FvwmRenderAttributes *fra, GC gc,
++	int x, int y, int width, int height);
+ /* never used ! */
+ Pixmap PGraphicsCreateDitherPixmap(
+ 	Display *dpy, Window win, Drawable src, Pixmap mask, int depth, GC gc,

diff --git a/x11-wm/fvwm3/files/fvwm3-9999-goflags.patch b/x11-wm/fvwm3/files/fvwm3-9999-goflags.patch
new file mode 100644
index 000000000000..fa74f6fb734c
--- /dev/null
+++ b/x11-wm/fvwm3/files/fvwm3-9999-goflags.patch
@@ -0,0 +1,11 @@
+--- a/bin/FvwmPrompt/Makefile.am
++++ b/bin/FvwmPrompt/Makefile.am
+@@ -1,7 +1,7 @@
+ if FVWM_BUILD_GOLANG
+ GOCMD=go
+ GOBUILD=$(GOCMD) build
+-GOFLAGS=-ldflags="-s -w"
++GOFLAGS=
+ GOCLEAN=$(GOCMD) clean
+ BINARY_NAME=FvwmPrompt
+ 

diff --git a/x11-wm/fvwm3/files/fvwm3-9999-htmldoc.patch b/x11-wm/fvwm3/files/fvwm3-9999-htmldoc.patch
new file mode 100644
index 000000000000..abf6fadc614e
--- /dev/null
+++ b/x11-wm/fvwm3/files/fvwm3-9999-htmldoc.patch
@@ -0,0 +1,43 @@
+This patch enables html documentation in >= 1.0.5 of fvwm3
+--- a/doc/Makefile.am
++++ b/doc/Makefile.am
+@@ -13,22 +13,27 @@ EXTRA_DIST = $(MODULE_ADOC)
+ nothing:
+ 
+ clean:
+-	rm -f *.1 *.ad
++	rm -f *.1 *.ad *.html
+ 
+ distclean-local: clean
+ 
+ if FVWM_BUILD_MANDOC
+-man1_MANS = $(patsubst %.adoc,%.1, $(MODULE_ADOC))
++man1_MANS = $(MODULE_ADOC:.adoc=.1)
++man1_HTML = $(MODULE_ADOC:.adoc=.html)
+ EXTRACT_SECTIONS = \
+ 	commands \
+ 	menus \
+ 	styles
+ SECTION_FILES = $(patsubst %,fvwm3_%.ad, $(EXTRACT_SECTIONS))
+ 
+-all: docs
++all: docs html
++
+ docs: $(man1_MANS)
+ $(man1_MANS): $(SECTION_FILES)
+ 
++html: $(man1_HTML)
++$(man1_HTML): $(SECTION_FILES)
++
+ %.ad: fvwm3_manpage_source.adoc
+ 	SECTION=$(patsubst fvwm3_%.ad,%,$@); \
+ 	cat "$<" | \
+@@ -38,4 +43,8 @@ $(man1_MANS): $(SECTION_FILES)
+ 
+ %.1: %.adoc
+ 	"$(ASCIIDOC)" -b manpage -a "$(patsubst %.1,%,$@)" "$<" -o "$@"
++
++%.html: %.adoc
++	"$(ASCIIDOC)" -b html5 -a "$(patsubst %.html,%,$@)" "$<" -o "$@"
++
+ endif

diff --git a/x11-wm/fvwm3/files/fvwm3-9999-translucent-menus.patch b/x11-wm/fvwm3/files/fvwm3-9999-translucent-menus.patch
new file mode 100644
index 000000000000..43b5b0a14403
--- /dev/null
+++ b/x11-wm/fvwm3/files/fvwm3-9999-translucent-menus.patch
@@ -0,0 +1,489 @@
+This patch enables some additional translucency "stuff", ported from a series of patches in 2003 (see readme)
+--- a/fvwm/colorset.c
++++ b/fvwm/colorset.c
+@@ -162,6 +162,8 @@ static char *csetopts[] =
+ 	"NoIconTint",
+ 	"IconAlpha",
+ 
++	"Translucent",
++	"NoTranslucent",
+ 	NULL
+ };
+ 
+@@ -620,6 +622,7 @@ void parse_colorset(int n, char *line)
+ 	char *fg_tint = NULL;
+ 	char *bg_tint = NULL;
+ 	char *icon_tint = NULL;
++	char *translucent_tint = NULL;
+ 	Bool have_pixels_changed = False;
+ 	Bool has_icon_pixels_changed = False;
+ 	Bool has_fg_changed = False;
+@@ -632,6 +635,7 @@ void parse_colorset(int n, char *line)
+ 	Bool has_fg_tint_changed = False;
+ 	Bool has_bg_tint_changed = False;
+ 	Bool has_icon_tint_changed = False;
++	Bool has_translucent_tint_changed = False;
+ 	Bool has_pixmap_changed = False;
+ 	Bool has_shape_changed = False;
+ 	Bool has_image_alpha_changed = False;
+@@ -758,6 +762,10 @@ void parse_colorset(int n, char *line)
+ 		case 21: /* Plain */
+ 			has_pixmap_changed = True;
+ 			free_colorset_background(cs, True);
++			cs->is_translucent = False;
++			cs->translucent_tint_percent = 0;
++			cs->color_flags &= ~TRANSLUCENT_TINT_SUPPLIED;
++			has_translucent_tint_changed = True;
+ 			break;
+ 		case 22: /* NoShape */
+ 			has_shape_changed = True;
+@@ -923,6 +931,24 @@ void parse_colorset(int n, char *line)
+ 				cs->icon_alpha_percent = tmp;
+ 			}
+ 			break;
++		case 42: /* Translucent */
++			cs->is_translucent = True;
++			parse_simple_tint(
++				cs, args, &translucent_tint,
++				TRANSLUCENT_TINT_SUPPLIED,
++				&has_translucent_tint_changed, &percent,
++				"Translucent");
++			if (has_translucent_tint_changed)
++			{
++				cs->translucent_tint_percent = percent;
++			}
++			break;
++		case 43: /* NoTranslucent */
++			cs->is_translucent = False;
++			cs->translucent_tint_percent = 0;
++			cs->color_flags &= ~TRANSLUCENT_TINT_SUPPLIED;
++			has_translucent_tint_changed = True;
++			break;
+ 		default:
+ 			/* test for ?Gradient */
+ 			if (option[0] && StrEquals(&option[1], "Gradient"))
+@@ -1624,6 +1650,27 @@ void parse_colorset(int n, char *line)
+ 		}
+ 	}
+ 
++	/*
++	 * ---------- change the translucent tint colour ----------
++	 */
++	if (has_translucent_tint_changed)
++	{
++		/* user specified colour */
++		if (translucent_tint != NULL)
++		{
++			PictureFreeColors(
++				dpy, Pcmap, &cs->translucent_tint, 1, 0, True);
++			cs->translucent_tint = GetColor(translucent_tint);
++		}
++		else
++		{
++			/* default */
++			PictureFreeColors(
++				dpy, Pcmap, &cs->translucent_tint, 1, 0, True);
++			cs->translucent_tint = GetColor(black);
++		}
++	}
++
+ 	/*
+ 	 * ---------- send new colorset to fvwm and clean up ----------
+ 	 */
+@@ -1720,6 +1767,7 @@ void alloc_colorset(int n)
+ 			ncs->fgsh = GetColor(white);
+ 			ncs->tint = GetColor(black);
+ 			ncs->icon_tint = GetColor(black);
++			ncs->translucent_tint = GetColor(black);
+ 			ncs->pixmap = XCreatePixmapFromBitmapData(
+ 				dpy, Scr.NoFocusWin,
+ 				&g_bits[4 * (nColorsets % 3)], 4, 4,
+@@ -1737,6 +1785,7 @@ void alloc_colorset(int n)
+ 			ncs->fgsh = GetForeShadow(ncs->fg, ncs->bg);
+ 			ncs->tint = GetColor(black);
+ 			ncs->icon_tint = GetColor(black);
++			ncs->translucent_tint = GetColor(black);
+ 		}
+ 		ncs->fg_tint = ncs->bg_tint = GetColor(black);
+ 		/* set flags for fg contrast, bg average */
+@@ -1748,6 +1797,7 @@ void alloc_colorset(int n)
+ 		ncs->icon_alpha_percent = 100;
+ 		ncs->tint_percent = 0;
+ 		ncs->icon_tint_percent = 0;
++		ncs->translucent_tint_percent = 0;
+ 		ncs->fg_tint_percent = ncs->bg_tint_percent = 0;
+ 		ncs->dither = (PictureDitherByDefault())? True:False;
+ 		nColorsets++;
+--- a/fvwm/menuroot.h
++++ b/fvwm/menuroot.h
+@@ -147,6 +147,9 @@ typedef struct MenuRootDynamic
+ 		int d_npixels;
+ 	} stored_pixels;
+ 	/* alloc pixels when dithering is used for gradients */
++	/* x,y XMapRaise */
++	int x;
++	int y;
+ } MenuRootDynamic;
+ 
+ /* access macros to dynamic menu members */
+--- a/fvwm/menus.c
++++ b/fvwm/menus.c
+@@ -76,6 +76,18 @@
+ 				 (ctx).menu_root.menu_root = (root))
+ #define SCTX_GET_MR(ctx)	((ctx).type == SCTX_MENU_ROOT ? \
+ 				 (ctx).menu_root.menu_root : NULL)
++#define MENU_IS_TRANSLUCENT(mr,cs) \
++	(!MR_IS_TEAR_OFF_MENU(mr) && CSET_IS_TRANSLUCENT(cs))
++#define MENU_IS_TRANSPARENT(mr,cs) \
++	(MENU_IS_TRANSLUCENT(mr,cs) || CSET_IS_TRANSPARENT(cs))
++#define MR_IS_TRANSLUCENT_MENU(mr)  \
++	(!MR_IS_TEAR_OFF_MENU(mr) && MR_STYLE(mr) && \
++	ST_HAS_MENU_CSET(MR_STYLE(mr)) && CSET_IS_TRANSLUCENT( \
++						ST_CSET_MENU(MR_STYLE(mr))))
++#define MR_IS_TRANSPARENT_MENU(mr) \
++	(MR_IS_TRANSLUCENT_MENU(mr) || (MR_STYLE(mr) && \
++	ST_HAS_MENU_CSET(MR_STYLE(mr)) && CSET_IS_TRANSPARENT( \
++						ST_CSET_MENU(MR_STYLE(mr)))))
+ 
+ /* ---------------------------- imports ------------------------------------ */
+ 
+@@ -219,6 +231,8 @@ typedef struct mloop_static_info_t
+ } mloop_static_info_t;
+ 
+ /* ---------------------------- forward declarations ----------------------- */
++static MenuRoot *seek_submenu_instance(
++	MenuRoot *parent_menu, MenuItem *parent_item);
+ 
+ /* ---------------------------- local variables ---------------------------- */
+ 
+@@ -380,12 +394,22 @@ static void animated_move_back(
+ 		Bool transparent_bg = False;
+ 
+ 		/* move it back */
+-		if (ST_HAS_MENU_CSET(MR_STYLE(mr)) &&
+-		    CSET_IS_TRANSPARENT(ST_CSET_MENU(MR_STYLE(mr))))
++		if (MR_IS_TRANSPARENT_MENU(mr))
+ 		{
+ 			transparent_bg = True;
+ 			get_menu_repaint_transparent_parameters(
+ 				&mrtp, mr, fw);
++			if (MR_IS_TRANSLUCENT_MENU(mr) && MR_SUBMENU_ITEM(mr))
++			{
++				MenuRoot *smr;
++				smr = seek_submenu_instance(
++					mr, MR_SUBMENU_ITEM(mr));
++				if (smr)
++				{
++					/* just unmap it here, popdown later */
++					XUnmapWindow(dpy, MR_WINDOW(smr));
++				}
++			}
+ 		}
+ 		end.x = start.x - MR_XANIMATION(mr);
+ 		end.y = start.y;
+@@ -1914,6 +1938,7 @@ static void make_menu_window(MenuRoot *mr, Bool is_tear_off)
+ 				/* Doh.  Use the standard display instead. */
+ 				MR_CREATE_DPY(mr) = dpy;
+ 			}
++			MR_IS_TEAR_OFF_MENU(mr) = 1;
+ 		}
+ 		else
+ 		{
+@@ -2718,7 +2743,37 @@ static void paint_menu(
+ 	}
+ 	MR_IS_PAINTED(mr) = 1;
+ 	/* paint the menu background */
+-	if (ms && ST_HAS_MENU_CSET(ms))
++	if (MR_IS_TRANSLUCENT_MENU(mr))
++	{
++		Pixmap trans = None;
++		FvwmRenderAttributes fra;
++		colorset_t *colorset = &Colorset[ST_CSET_MENU(ms)];
++
++		fra.mask = 0;
++		if (colorset->translucent_tint_percent > 0)
++		{
++			fra.mask = FRAM_HAVE_TINT;
++			fra.tint = colorset->translucent_tint;
++			fra.tint_percent = colorset->translucent_tint_percent;
++		}
++		if (MR_IS_BACKGROUND_SET(mr) == False)
++		{
++			trans = PGraphicsCreateTranslucent(
++				dpy, MR_WINDOW(mr), &fra,
++				BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
++				MR_X(mr), MR_Y(mr), MR_WIDTH(mr), MR_HEIGHT(mr));
++			XMapRaised(dpy, MR_WINDOW(mr));
++			if (trans != None)
++			{
++				XSetWindowBackgroundPixmap(
++					dpy, MR_WINDOW(mr), trans);
++				MR_IS_BACKGROUND_SET(mr) = True;
++				clear_expose_menu_area(MR_WINDOW(mr), pevent);
++				XFreePixmap(dpy, trans);
++			}
++		}
++	}
++	else if (ms && ST_HAS_MENU_CSET(ms))
+ 	{
+ 		if (MR_IS_BACKGROUND_SET(mr) == False)
+ 		{
+@@ -3527,10 +3582,7 @@ static int pop_menu_up(
+ 					MR_HAS_POPPED_UP_RIGHT(mr) = 0;
+ 				}
+ 				MR_XANIMATION(parent_menu) += end_x - prev_x;
+-				if (ST_HAS_MENU_CSET(MR_STYLE(parent_menu)) &&
+-				    CSET_IS_TRANSPARENT(
+-					    ST_CSET_MENU(
+-						    MR_STYLE(parent_menu))))
++				if (MR_IS_TRANSPARENT_MENU(parent_menu))
+ 				{
+ 					transparent_bg = True;
+ 					get_menu_repaint_transparent_parameters(
+@@ -3713,10 +3765,21 @@ static int pop_menu_up(
+ 	 */
+ 
+ 	XMoveWindow(dpy, MR_WINDOW(mr), x, y);
++	MR_X(mr) = x;
++	MR_Y(mr) = y;
+ 	XSelectInput(dpy, MR_WINDOW(mr), event_mask);
+-	XMapRaised(dpy, MR_WINDOW(mr));
+-	if (popdown_window)
+-		XUnmapWindow(dpy, popdown_window);
++	if (MR_IS_TRANSLUCENT_MENU(mr))
++	{
++		if (popdown_window)
++			XUnmapWindow(dpy, popdown_window);
++		paint_menu(mr, NULL, fw);
++	}
++	else
++	{
++		XMapRaised(dpy, MR_WINDOW(mr));
++		if (popdown_window)
++			XUnmapWindow(dpy, popdown_window);
++	}
+ 	XFlush(dpy);
+ 	MR_MAPPED_COPIES(mr)++;
+ 	MST_USAGE_COUNT(mr)++;
+@@ -6286,16 +6349,122 @@ void update_transparent_menu_bg(
+ 	{
+ 		last = True;
+ 	}
+-	if (!last && CSET_IS_TRANSPARENT_PR_TINT(ST_CSET_MENU(ms)))
++	if (!last &&
++	    (CSET_IS_TRANSPARENT_PR_TINT(ST_CSET_MENU(ms)) ||
++	     MR_IS_TRANSLUCENT_MENU(mr)))
+ 	{
+ 		/* too slow ... */
+ 		return;
+ 	}
+-	SetWindowBackgroundWithOffset(
+-		dpy, MR_WINDOW(mr), step_x - current_x, step_y - current_y,
+-		MR_WIDTH(mr), MR_HEIGHT(mr),
+-		&Colorset[ST_CSET_MENU(ms)], Pdepth,
+-		FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
++	if (MR_IS_TRANSLUCENT_MENU(mr))
++	{
++		Pixmap trans, tmp;
++		FvwmRenderAttributes fra;
++		colorset_t *colorset = &Colorset[ST_CSET_MENU(ms)];
++
++		fra.mask = 0;
++		if (colorset->translucent_tint_percent > 0)
++		{
++			fra.mask = FRAM_HAVE_TINT;
++			fra.tint = colorset->translucent_tint;
++			fra.tint_percent = colorset->translucent_tint_percent;
++		}
++		if (current_x == step_x)
++		{
++			/* Reuse the old pixmap for the part of the menu
++			 * that has not moved. (This can be extended to get
++			 * two new rectangles, one in each direction)
++			 *
++			 * It saves the unmapping of the window and makes
++			 * Things less flickering.
++			 */
++			GC my_gc;
++			unsigned long valuemask = GCSubwindowMode;
++			XGCValues values;
++			int out_y=0;
++			values.subwindow_mode = IncludeInferiors;
++			if (step_y < 0)
++			{
++				out_y = -step_y;
++			}
++			trans = XCreatePixmap(dpy, MR_WINDOW(mr), MR_WIDTH(mr),
++					      MR_HEIGHT(mr), Pdepth);
++			my_gc = fvwmlib_XCreateGC(dpy,  MR_WINDOW(mr), 0, NULL);
++			XChangeGC(dpy, my_gc, valuemask, &values);
++
++			XClearWindow(dpy, MR_WINDOW(mr));
++
++			if (current_y < step_y)
++			{
++				XCopyArea(dpy, MR_WINDOW(mr), trans, my_gc, 0,
++					  step_y-current_y, MR_WIDTH(mr),
++					  MR_HEIGHT(mr)-(step_y-current_y),
++					  0,0);
++				tmp = PGraphicsCreateTranslucent(
++					dpy, MR_WINDOW(mr), &fra,
++					BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
++					current_x, current_y+MR_HEIGHT(mr),
++					MR_WIDTH(mr), step_y-current_y);
++
++				XCopyArea(dpy, tmp, trans, my_gc, 0, 0,
++					  MR_WIDTH(mr), step_y-current_y,0,
++					  MR_HEIGHT(mr)-(step_y-current_y));
++			}
++			else
++			{
++				XCopyArea(dpy, MR_WINDOW(mr), trans, my_gc, 0,
++					  0, MR_WIDTH(mr),
++					  MR_HEIGHT(mr)-(current_y-step_y), 0,
++					  current_y-step_y);
++				tmp = PGraphicsCreateTranslucent(
++					dpy, MR_WINDOW(mr), &fra,
++					BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
++					current_x,step_y, MR_WIDTH(mr),
++					current_y-step_y);
++				XCopyArea(dpy, tmp, trans, my_gc, 0, 0,
++					  MR_WIDTH(mr), current_y-step_y,0,
++					  out_y);
++			}
++			MR_X(mr) = step_x;
++			MR_Y(mr) = step_y;
++			XFreePixmap(dpy, tmp);
++			XFreeGC(dpy,my_gc);
++		}
++		else
++		{
++			XUnmapWindow(dpy, MR_WINDOW(mr));
++			MR_X(mr) = step_x;
++			MR_Y(mr) = step_y;
++			trans = PGraphicsCreateTranslucent(
++				dpy, MR_WINDOW(mr), &fra,
++				BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
++				step_x, step_y, MR_WIDTH(mr),
++				MR_HEIGHT(mr));
++			XMapRaised(dpy, MR_WINDOW(mr));
++		}
++		XSetWindowBackgroundPixmap(
++			dpy, MR_WINDOW(mr), trans);
++		XFreePixmap(dpy, trans);
++		if (current_x == step_x)
++		{
++			/* Redraw the border */
++			RelieveRectangle(
++				dpy, MR_WINDOW(mr), 0, 0, MR_WIDTH(mr) - 1,
++				MR_HEIGHT(mr) - 1, (Pdepth < 2) ?
++				SHADOW_GC(MST_MENU_INACTIVE_GCS(mr)) :
++				HILIGHT_GC(MST_MENU_INACTIVE_GCS(mr)),
++				SHADOW_GC(MST_MENU_INACTIVE_GCS(mr)),
++				MST_BORDER_WIDTH(mr));
++		}
++	}
++	else
++	{
++		SetWindowBackgroundWithOffset(
++			dpy, MR_WINDOW(mr), step_x - current_x,
++			step_y - current_y, MR_WIDTH(mr), MR_HEIGHT(mr),
++			&Colorset[ST_CSET_MENU(ms)], Pdepth,
++			FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
++	}
+ }
+ 
+ 
+@@ -6336,10 +6505,7 @@ void repaint_transparent_menu(
+ 	}
+ 	if (!is_bg_set)
+ 	{
+-		SetWindowBackground(
+-			dpy, MR_WINDOW(mr), MR_WIDTH(mr), MR_HEIGHT(mr),
+-			&Colorset[ST_CSET_MENU(ms)], Pdepth,
+-			FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
++		update_transparent_menu_bg(prtm, x, y, x, y, end_x, end_y);
+ 	}
+ 	/* redraw the background of non active item */
+ 	for (mi = MR_FIRST_ITEM(mr); mi != NULL; mi = MI_NEXT_ITEM(mi))
+@@ -6978,7 +7144,10 @@ void UpdateMenuColorset(int cset)
+ 					&Colorset[ST_CSET_MENU(ms2)],
+ 					Pdepth,
+ 					FORE_GC(MST_MENU_INACTIVE_GCS(mr)),
+-					True);
++					False);
++				XClearArea(
++					dpy, MR_WINDOW(mr), 0, 0, MR_WIDTH(mr),
++					MR_HEIGHT(mr), True);
+ 			}
+ 			else if ((ST_HAS_ACTIVE_CSET(ms2) &&
+ 				  ST_CSET_ACTIVE(ms2) == cset) ||
+--- a/fvwm/menus.h
++++ b/fvwm/menus.h
+@@ -19,6 +19,9 @@
+ #define IS_MENU_RETURN(x) \
+   ((x)==MENU_DONE || (x)==MENU_ABORTED || (x)==MENU_SUBMENU_TORN_OFF)
+ 
++#define MR_X(m)                     ((m)->d->x)
++#define MR_Y(m)                     ((m)->d->y)
++
+ struct MenuRoot;
+ struct MenuStyle;
+ struct MenuReturn;
+--- a/libs/Colorset.h
++++ b/libs/Colorset.h
+@@ -53,6 +53,10 @@ typedef struct Colorset
+ 	Bool dither;
+ 	Bool allows_buffered_transparency;
+ 	Bool is_maybe_root_transparent;
++	/* only use by fvwm menu (non tear-off) */
++	Bool is_translucent;
++	Pixel translucent_tint;
++	unsigned int translucent_tint_percent : 7;
+ #endif
+ } colorset_t;
+ 
+@@ -80,6 +84,7 @@ typedef struct Colorset
+ #define FG_TINT_SUPPLIED  0x100
+ #define BG_TINT_SUPPLIED  0x200
+ #define ICON_TINT_SUPPLIED 0x400
++#define TRANSLUCENT_TINT_SUPPLIED 0x800
+ #endif
+ 
+ /* colorsets are stored as an array of structs to permit fast dereferencing */
+@@ -155,6 +160,11 @@ extern colorset_t *Colorset;
+     (cset != NULL && cset->pixmap == ParentRelative && \
+      cset->tint_percent > 0)
+ 
++#define CSET_IS_TRANSLUCENT(cset) \
++    (cset >= 0 && Colorset[cset].is_translucent)
++#define CSETS_IS_TRANSLUCENT(cset) \
++    (cset && cset->is_translucent)
++
+ #ifndef FVWM_COLORSET_PRIVATE
+ /* Create n new colorsets, fvwm/colorset.c does its own thing (different size)
+  */
+--- a/libs/PictureGraphics.c
++++ b/libs/PictureGraphics.c
+@@ -1361,7 +1361,7 @@ void PGraphicsTintRectangle(
+ 	}
+ }
+ 
+-#if 0 /* humm... maybe useful one day with menus */
++#if 1 /* humm... maybe useful one day with menus */
+ Pixmap PGraphicsCreateTranslucent(
+ 	Display *dpy, Window win, FvwmRenderAttributes *fra, GC gc,
+ 	int x, int y, int width, int height)
+--- a/libs/PictureGraphics.h
++++ b/libs/PictureGraphics.h
+@@ -124,7 +124,9 @@ void PGraphicsTintRectangle(
+ 	Display *dpy, Window win, Pixel tint, int tint_percent,
+ 	Drawable dest, Bool dest_is_a_window, GC gc, GC mono_gc, GC alpha_gc,
+ 	int dest_x, int dest_y, int dest_w, int dest_h);
+-
++Pixmap PGraphicsCreateTranslucent(
++	Display *dpy, Window win, FvwmRenderAttributes *fra, GC gc,
++	int x, int y, int width, int height);
+ /* never used ! */
+ Pixmap PGraphicsCreateDitherPixmap(
+ 	Display *dpy, Window win, Drawable src, Pixmap mask, int depth, GC gc,

diff --git a/x11-wm/fvwm3/fvwm3-1.0.4.ebuild b/x11-wm/fvwm3/fvwm3-1.0.4.ebuild
new file mode 100644
index 000000000000..cbafa1cafe1d
--- /dev/null
+++ b/x11-wm/fvwm3/fvwm3-1.0.4.ebuild
@@ -0,0 +1,204 @@
+# Copyright 1999-2022 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+PYTHON_COMPAT=( python3_{8..11} )
+GO_OPTIONAL=1
+inherit autotools desktop flag-o-matic go-module python-single-r1
+
+DESCRIPTION="A multiple large virtual desktop window manager derived from fvwm"
+HOMEPAGE="http://www.fvwm.org/"
+
+if [[ ${PV} == 9999 ]]; then
+	inherit git-r3
+	EGIT_REPO_URI="https://github.com/fvwmorg/fvwm3.git"
+	EGIT_BRANCH="master"
+else
+	SRC_URI="https://github.com/fvwmorg/fvwm3/releases/download/${PV}/${P}.tar.gz"
+	KEYWORDS="~amd64"
+fi
+
+SRC_URI+=" https://gitlab.com/Matt.Jolly/fvwm3-go-deps/-/raw/${PV}/${P}-deps.tar.xz?inline=false -> ${P}-deps.tar.xz"
+
+LICENSE="GPL-2+ FVWM
+	go? (
+			Apache-2.0
+			BSD
+			MIT
+		)"
+
+SLOT="0"
+
+IUSE="bidi debug doc go netpbm nls perl png readline rplay stroke svg tk truetype vanilla lock"
+REQUIRED_USE="
+	${PYTHON_REQUIRED_USE}"
+
+DOCS=( NEWS )
+
+if [[ ${PV} == 9999 ]]; then
+	DOCS+=( dev-docs/COMMANDS dev-docs/DEVELOPERS.md dev-docs/INSTALL.md dev-docs/PARSING.md dev-docs/TODO.md dev-docs/NEW-COMMANDS.md )
+fi
+
+BDEPEND="
+	virtual/pkgconfig
+	doc? ( dev-libs/libxslt
+		dev-ruby/asciidoctor )
+	app-arch/unzip
+	go? ( >=dev-lang/go-1.14 )
+"
+
+RDEPEND="${PYTHON_DEPS}
+	${COMMON_DEPEND}
+	!x11-wm/fvwm
+	dev-libs/glib:2
+	dev-libs/libevent:=
+	dev-lang/perl
+	sys-libs/zlib
+	x11-libs/libICE
+	x11-libs/libSM
+	x11-libs/libX11
+	x11-libs/libXau
+	x11-libs/libxcb
+	x11-libs/libXcursor
+	x11-libs/libXdmcp
+	x11-libs/libXext
+	x11-libs/libXfixes
+	x11-libs/libXpm
+	x11-libs/libXrandr
+	x11-libs/libXrender
+	bidi? ( dev-libs/fribidi )
+	lock? ( x11-misc/xlockmore )
+	netpbm? ( media-libs/netpbm )
+	perl? ( tk? (
+			dev-lang/tk
+			dev-perl/Tk
+			>=dev-perl/X11-Protocol-0.56
+		)
+	)
+	png? ( media-libs/libpng:= )
+	readline? (
+		sys-libs/ncurses:=
+		sys-libs/readline:=
+	)
+	rplay? ( media-sound/rplay )
+	stroke? ( dev-libs/libstroke )
+	svg? (
+		gnome-base/librsvg:2
+		x11-libs/cairo
+	)
+	truetype? (
+		media-libs/fontconfig
+		x11-libs/libXft
+	)
+	userland_GNU? ( sys-apps/debianutils )"
+
+DEPEND="${COMMON_DEPEND}
+	x11-base/xorg-proto"
+
+PATCHES=(
+	"${FILESDIR}/${P}-translucent-menus.patch"
+)
+
+if [[ ${PV} == 9999 ]]; then
+	PATCHES+=(
+		"${FILESDIR}/${P}-goflags.patch"
+	)
+fi
+
+src_unpack() {
+	if [[ ${PV} == 9999 ]]; then
+		einfo "The branch ${EGIT_BRANCH} will be installed."
+		git-r3_src_unpack
+	else
+		unpack "${P}".tar.gz
+	fi
+	unpack "${P}"-deps.tar.xz
+	mv go-mod ${P}/bin/FvwmPrompt/ || die
+}
+
+src_prepare() {
+	default
+	if use doc; then
+		eapply "${FILESDIR}/${P}-htmldoc.patch"
+	fi
+
+	sed -i '/^@FVWM_BUILD_GOLANG_TRUE@GOBUILD = $(GOCMD) build/s/$/ -mod=mod/' \
+		bin/FvwmPrompt/Makefile.in || die "Updating go build paramaters failed."
+
+	eautoreconf
+}
+
+src_configure() {
+	# Non-upstream email where bugs should be sent; used in fvwm-bug.
+	export FVWM_BUGADDR="desktop-wm@nogentoo.org"
+
+	# Recommended by upstream for release. Doesn't really matter for live ebuilds.
+	append-flags -fno-strict-aliasing
+
+	# Signed chars are required.
+	for arch in arm arm64 ppc ppc64; do
+		use $arch && append-flags -fsigned-chars
+	done
+
+	local myconf=(
+		--prefix=/usr
+		--with-imagepath=/usr/include/X11/bitmaps:/usr/include/X11/pixmaps:/usr/share/icons/fvwm
+		--enable-package-subdirs
+		$(use_enable bidi)
+		$(use_enable doc mandoc)
+		$(use_enable go golang)
+		$(use_enable nls)
+		$(use_enable nls iconv)
+		$(use_enable perl perllib)
+		$(use_enable png)
+		$(use_with readline readline-library)
+		$(use_enable svg rsvg)
+		$(use_enable truetype xft)
+		--docdir=/usr/share/doc/${P}
+	)
+
+	use readline && myconf+=( --without-termcap-library )
+
+	econf ${myconf[@]}
+}
+
+src_compile() {
+	PREFIX="/usr" emake
+	if [[ ${PV} == *9999 ]]; then
+		use doc && emake -C doc html
+	fi
+}
+
+src_install() {
+	emake DESTDIR="${ED}" prefix="/usr" exec_prefix="/usr" datarootdir="/usr/share" install
+
+	dodir /etc/X11/Sessions
+	echo "/usr/bin/fvwm3" > "${ED}/etc/X11/Sessions/${PN}" || die
+	fperms a+x /etc/X11/Sessions/${PN} || die
+
+	python_scriptinto "/usr/bin"
+	python_doscript "${ED}/usr/bin/FvwmCommand" "${ED}/usr/bin/fvwm-menu-desktop"
+	if use doc; then
+		if [[ ${PV} == *9999 ]]; then
+			HTML_DOCS=( doc/*.html )
+		else
+			HTML_DOCS=( doc/html/*.html )
+		fi
+	fi
+	einstalldocs
+
+	make_session_desktop fvwm3 /usr/bin/fvwm3
+}
+
+pkg_postinst() {
+	if use go; then
+		ewarn "FvwmPrompt has been installed, it provides the functionality of both FvwmCommand and FvwmConsole."
+		ewarn "For compatibility with the existing fvwm2 configurations, the ebuild will install a FvwmCommand wrapper script."
+		ewarn "If you need FvwmConsole, install ${PN} with USE=\"-go\", but FvwmPrompt and FvwmCommnd will not be installed."
+	else
+		ewarn "Fvwmconsole has been installed, but FvwmCommand and FvwmPrompt are no longer included in this ebuild."
+		ewarn "If you need FvwmPrompt or FvwmCommand, install ${PN} with USE=\"go\"."
+		ewarn "In that case, FvwmPrompt will replace FvwmConsole and provide the same functionality in a more flexible way."
+	fi
+}

diff --git a/x11-wm/fvwm3/fvwm3-9999.ebuild b/x11-wm/fvwm3/fvwm3-9999.ebuild
new file mode 100644
index 000000000000..cbafa1cafe1d
--- /dev/null
+++ b/x11-wm/fvwm3/fvwm3-9999.ebuild
@@ -0,0 +1,204 @@
+# Copyright 1999-2022 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+PYTHON_COMPAT=( python3_{8..11} )
+GO_OPTIONAL=1
+inherit autotools desktop flag-o-matic go-module python-single-r1
+
+DESCRIPTION="A multiple large virtual desktop window manager derived from fvwm"
+HOMEPAGE="http://www.fvwm.org/"
+
+if [[ ${PV} == 9999 ]]; then
+	inherit git-r3
+	EGIT_REPO_URI="https://github.com/fvwmorg/fvwm3.git"
+	EGIT_BRANCH="master"
+else
+	SRC_URI="https://github.com/fvwmorg/fvwm3/releases/download/${PV}/${P}.tar.gz"
+	KEYWORDS="~amd64"
+fi
+
+SRC_URI+=" https://gitlab.com/Matt.Jolly/fvwm3-go-deps/-/raw/${PV}/${P}-deps.tar.xz?inline=false -> ${P}-deps.tar.xz"
+
+LICENSE="GPL-2+ FVWM
+	go? (
+			Apache-2.0
+			BSD
+			MIT
+		)"
+
+SLOT="0"
+
+IUSE="bidi debug doc go netpbm nls perl png readline rplay stroke svg tk truetype vanilla lock"
+REQUIRED_USE="
+	${PYTHON_REQUIRED_USE}"
+
+DOCS=( NEWS )
+
+if [[ ${PV} == 9999 ]]; then
+	DOCS+=( dev-docs/COMMANDS dev-docs/DEVELOPERS.md dev-docs/INSTALL.md dev-docs/PARSING.md dev-docs/TODO.md dev-docs/NEW-COMMANDS.md )
+fi
+
+BDEPEND="
+	virtual/pkgconfig
+	doc? ( dev-libs/libxslt
+		dev-ruby/asciidoctor )
+	app-arch/unzip
+	go? ( >=dev-lang/go-1.14 )
+"
+
+RDEPEND="${PYTHON_DEPS}
+	${COMMON_DEPEND}
+	!x11-wm/fvwm
+	dev-libs/glib:2
+	dev-libs/libevent:=
+	dev-lang/perl
+	sys-libs/zlib
+	x11-libs/libICE
+	x11-libs/libSM
+	x11-libs/libX11
+	x11-libs/libXau
+	x11-libs/libxcb
+	x11-libs/libXcursor
+	x11-libs/libXdmcp
+	x11-libs/libXext
+	x11-libs/libXfixes
+	x11-libs/libXpm
+	x11-libs/libXrandr
+	x11-libs/libXrender
+	bidi? ( dev-libs/fribidi )
+	lock? ( x11-misc/xlockmore )
+	netpbm? ( media-libs/netpbm )
+	perl? ( tk? (
+			dev-lang/tk
+			dev-perl/Tk
+			>=dev-perl/X11-Protocol-0.56
+		)
+	)
+	png? ( media-libs/libpng:= )
+	readline? (
+		sys-libs/ncurses:=
+		sys-libs/readline:=
+	)
+	rplay? ( media-sound/rplay )
+	stroke? ( dev-libs/libstroke )
+	svg? (
+		gnome-base/librsvg:2
+		x11-libs/cairo
+	)
+	truetype? (
+		media-libs/fontconfig
+		x11-libs/libXft
+	)
+	userland_GNU? ( sys-apps/debianutils )"
+
+DEPEND="${COMMON_DEPEND}
+	x11-base/xorg-proto"
+
+PATCHES=(
+	"${FILESDIR}/${P}-translucent-menus.patch"
+)
+
+if [[ ${PV} == 9999 ]]; then
+	PATCHES+=(
+		"${FILESDIR}/${P}-goflags.patch"
+	)
+fi
+
+src_unpack() {
+	if [[ ${PV} == 9999 ]]; then
+		einfo "The branch ${EGIT_BRANCH} will be installed."
+		git-r3_src_unpack
+	else
+		unpack "${P}".tar.gz
+	fi
+	unpack "${P}"-deps.tar.xz
+	mv go-mod ${P}/bin/FvwmPrompt/ || die
+}
+
+src_prepare() {
+	default
+	if use doc; then
+		eapply "${FILESDIR}/${P}-htmldoc.patch"
+	fi
+
+	sed -i '/^@FVWM_BUILD_GOLANG_TRUE@GOBUILD = $(GOCMD) build/s/$/ -mod=mod/' \
+		bin/FvwmPrompt/Makefile.in || die "Updating go build paramaters failed."
+
+	eautoreconf
+}
+
+src_configure() {
+	# Non-upstream email where bugs should be sent; used in fvwm-bug.
+	export FVWM_BUGADDR="desktop-wm@nogentoo.org"
+
+	# Recommended by upstream for release. Doesn't really matter for live ebuilds.
+	append-flags -fno-strict-aliasing
+
+	# Signed chars are required.
+	for arch in arm arm64 ppc ppc64; do
+		use $arch && append-flags -fsigned-chars
+	done
+
+	local myconf=(
+		--prefix=/usr
+		--with-imagepath=/usr/include/X11/bitmaps:/usr/include/X11/pixmaps:/usr/share/icons/fvwm
+		--enable-package-subdirs
+		$(use_enable bidi)
+		$(use_enable doc mandoc)
+		$(use_enable go golang)
+		$(use_enable nls)
+		$(use_enable nls iconv)
+		$(use_enable perl perllib)
+		$(use_enable png)
+		$(use_with readline readline-library)
+		$(use_enable svg rsvg)
+		$(use_enable truetype xft)
+		--docdir=/usr/share/doc/${P}
+	)
+
+	use readline && myconf+=( --without-termcap-library )
+
+	econf ${myconf[@]}
+}
+
+src_compile() {
+	PREFIX="/usr" emake
+	if [[ ${PV} == *9999 ]]; then
+		use doc && emake -C doc html
+	fi
+}
+
+src_install() {
+	emake DESTDIR="${ED}" prefix="/usr" exec_prefix="/usr" datarootdir="/usr/share" install
+
+	dodir /etc/X11/Sessions
+	echo "/usr/bin/fvwm3" > "${ED}/etc/X11/Sessions/${PN}" || die
+	fperms a+x /etc/X11/Sessions/${PN} || die
+
+	python_scriptinto "/usr/bin"
+	python_doscript "${ED}/usr/bin/FvwmCommand" "${ED}/usr/bin/fvwm-menu-desktop"
+	if use doc; then
+		if [[ ${PV} == *9999 ]]; then
+			HTML_DOCS=( doc/*.html )
+		else
+			HTML_DOCS=( doc/html/*.html )
+		fi
+	fi
+	einstalldocs
+
+	make_session_desktop fvwm3 /usr/bin/fvwm3
+}
+
+pkg_postinst() {
+	if use go; then
+		ewarn "FvwmPrompt has been installed, it provides the functionality of both FvwmCommand and FvwmConsole."
+		ewarn "For compatibility with the existing fvwm2 configurations, the ebuild will install a FvwmCommand wrapper script."
+		ewarn "If you need FvwmConsole, install ${PN} with USE=\"-go\", but FvwmPrompt and FvwmCommnd will not be installed."
+	else
+		ewarn "Fvwmconsole has been installed, but FvwmCommand and FvwmPrompt are no longer included in this ebuild."
+		ewarn "If you need FvwmPrompt or FvwmCommand, install ${PN} with USE=\"go\"."
+		ewarn "In that case, FvwmPrompt will replace FvwmConsole and provide the same functionality in a more flexible way."
+	fi
+}

diff --git a/x11-wm/fvwm3/metadata.xml b/x11-wm/fvwm3/metadata.xml
new file mode 100644
index 000000000000..3711144d46ea
--- /dev/null
+++ b/x11-wm/fvwm3/metadata.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+	<longdescription lang="en">
+		fvwm3 is a multiple large virtual desktop window manager.
+		The successor to fvwm-2.6, Fvwm3 is intended to be extremely customizable and extendible while consuming a relatively small amount of resources.
+	</longdescription>
+	<maintainer type="person" proxied="yes">
+		<email>Matt.Jolly@footclan.ninja</email>
+		<name>Matthew Jolly</name>
+	</maintainer>
+	<maintainer type="project" proxied="proxy">
+		<email>proxy-maint@gentoo.org</email>
+		<name>Proxy Maintainers</name>
+	</maintainer>
+	<use>
+		<flag name="go">Enable building <pkg>dev-lang/go</pkg> code (FvwmPrompt)</flag>
+		<flag name="lock">Enable screen locking</flag>
+		<flag name="netpbm">Enable NetPBM support (used by FvwmScript-ScreenDump)</flag>
+		<flag name="rplay">Enable rplay support</flag>
+		<flag name="stroke">Mouse Gesture support</flag>
+	</use>
+	<upstream>
+		<bugs-to>https://github.com/fvwmorg/fvwm3/issues</bugs-to>
+		<changelog>https://raw.githubusercontent.com/fvwmorg/fvwm3/master/CHANGELOG.md</changelog>
+	</upstream>
+</pkgmetadata>


^ permalink raw reply related	[flat|nested] 4+ messages in thread
* [gentoo-commits] repo/gentoo:master commit in: x11-wm/fvwm3/, x11-wm/fvwm3/files/
@ 2023-03-15  5:05 Sam James
  0 siblings, 0 replies; 4+ messages in thread
From: Sam James @ 2023-03-15  5:05 UTC (permalink / raw
  To: gentoo-commits

commit:     48a2217b5bc9205569152461cccaac20e20306d5
Author:     Matt Jolly <Matt.Jolly <AT> footclan <DOT> ninja>
AuthorDate: Sun Mar 12 04:28:51 2023 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Wed Mar 15 05:04:16 2023 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=48a2217b

x11-wm/fvwm3: add 1.0.6a, update 9999

- Drop translucent menu patch; after 20 years it was upstreamed!
- Drop htmldoc patch
- Drop vanilla USE; superfluous

Closes: https://bugs.gentoo.org/877487
Closes: https://bugs.gentoo.org/879877

Signed-off-by: Matt Jolly <Matt.Jolly <AT> footclan.ninja>
Closes: https://github.com/gentoo/gentoo/pull/30066
Signed-off-by: Sam James <sam <AT> gentoo.org>

 x11-wm/fvwm3/Manifest                              |   1 +
 x11-wm/fvwm3/files/fvwm3-9999-goflags.patch        |  11 -
 x11-wm/fvwm3/files/fvwm3-9999-htmldoc.patch        |  43 --
 .../fvwm3/files/fvwm3-9999-translucent-menus.patch | 489 ---------------------
 .../{fvwm3-9999.ebuild => fvwm3-1.0.6a.ebuild}     |  46 +-
 x11-wm/fvwm3/fvwm3-9999.ebuild                     |  44 +-
 x11-wm/fvwm3/metadata.xml                          |   1 +
 7 files changed, 36 insertions(+), 599 deletions(-)

diff --git a/x11-wm/fvwm3/Manifest b/x11-wm/fvwm3/Manifest
index 8fbcc853d95b..3469d010d753 100644
--- a/x11-wm/fvwm3/Manifest
+++ b/x11-wm/fvwm3/Manifest
@@ -1 +1,2 @@
 DIST fvwm3-1.0.4.tar.gz 4691719 BLAKE2B 4ce93b1a2d110b570b5fc8b253f9ff8ea1f44e5470c6e1bc136a53ebe53a23abe3d075bf351fca54ac110ea5731f9b44c59c83186d320e7509bf26e5144436ca SHA512 b72a1ebeba7c55214603fd43ea439f7283b3c79e39d2671a67b9512c67dcea111377eab2131ed0b18a72f6b772b0d048abe08f52565708367465ed9bb14e85f6
+DIST fvwm3-1.0.6a.tar.gz 4538100 BLAKE2B c71087eb09a17760ff5754060c4639228f268a0f3640ce0d92d7d8f807aa0df36eac998da0ed943787f1bb369ac90b7b2ca65d922120d41ed81a940be7756f4f SHA512 7577e0dde1f7c5c54024207cf48ab5b816c87fc163735e44eb72e66561c67c08f6a06e7fbf5c89fa6180b692ce25e5121845476d0d1dcfb8273b0aa7321d28f9

diff --git a/x11-wm/fvwm3/files/fvwm3-9999-goflags.patch b/x11-wm/fvwm3/files/fvwm3-9999-goflags.patch
deleted file mode 100644
index fa74f6fb734c..000000000000
--- a/x11-wm/fvwm3/files/fvwm3-9999-goflags.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/bin/FvwmPrompt/Makefile.am
-+++ b/bin/FvwmPrompt/Makefile.am
-@@ -1,7 +1,7 @@
- if FVWM_BUILD_GOLANG
- GOCMD=go
- GOBUILD=$(GOCMD) build
--GOFLAGS=-ldflags="-s -w"
-+GOFLAGS=
- GOCLEAN=$(GOCMD) clean
- BINARY_NAME=FvwmPrompt
- 

diff --git a/x11-wm/fvwm3/files/fvwm3-9999-htmldoc.patch b/x11-wm/fvwm3/files/fvwm3-9999-htmldoc.patch
deleted file mode 100644
index abf6fadc614e..000000000000
--- a/x11-wm/fvwm3/files/fvwm3-9999-htmldoc.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-This patch enables html documentation in >= 1.0.5 of fvwm3
---- a/doc/Makefile.am
-+++ b/doc/Makefile.am
-@@ -13,22 +13,27 @@ EXTRA_DIST = $(MODULE_ADOC)
- nothing:
- 
- clean:
--	rm -f *.1 *.ad
-+	rm -f *.1 *.ad *.html
- 
- distclean-local: clean
- 
- if FVWM_BUILD_MANDOC
--man1_MANS = $(patsubst %.adoc,%.1, $(MODULE_ADOC))
-+man1_MANS = $(MODULE_ADOC:.adoc=.1)
-+man1_HTML = $(MODULE_ADOC:.adoc=.html)
- EXTRACT_SECTIONS = \
- 	commands \
- 	menus \
- 	styles
- SECTION_FILES = $(patsubst %,fvwm3_%.ad, $(EXTRACT_SECTIONS))
- 
--all: docs
-+all: docs html
-+
- docs: $(man1_MANS)
- $(man1_MANS): $(SECTION_FILES)
- 
-+html: $(man1_HTML)
-+$(man1_HTML): $(SECTION_FILES)
-+
- %.ad: fvwm3_manpage_source.adoc
- 	SECTION=$(patsubst fvwm3_%.ad,%,$@); \
- 	cat "$<" | \
-@@ -38,4 +43,8 @@ $(man1_MANS): $(SECTION_FILES)
- 
- %.1: %.adoc
- 	"$(ASCIIDOC)" -b manpage -a "$(patsubst %.1,%,$@)" "$<" -o "$@"
-+
-+%.html: %.adoc
-+	"$(ASCIIDOC)" -b html5 -a "$(patsubst %.html,%,$@)" "$<" -o "$@"
-+
- endif

diff --git a/x11-wm/fvwm3/files/fvwm3-9999-translucent-menus.patch b/x11-wm/fvwm3/files/fvwm3-9999-translucent-menus.patch
deleted file mode 100644
index 43b5b0a14403..000000000000
--- a/x11-wm/fvwm3/files/fvwm3-9999-translucent-menus.patch
+++ /dev/null
@@ -1,489 +0,0 @@
-This patch enables some additional translucency "stuff", ported from a series of patches in 2003 (see readme)
---- a/fvwm/colorset.c
-+++ b/fvwm/colorset.c
-@@ -162,6 +162,8 @@ static char *csetopts[] =
- 	"NoIconTint",
- 	"IconAlpha",
- 
-+	"Translucent",
-+	"NoTranslucent",
- 	NULL
- };
- 
-@@ -620,6 +622,7 @@ void parse_colorset(int n, char *line)
- 	char *fg_tint = NULL;
- 	char *bg_tint = NULL;
- 	char *icon_tint = NULL;
-+	char *translucent_tint = NULL;
- 	Bool have_pixels_changed = False;
- 	Bool has_icon_pixels_changed = False;
- 	Bool has_fg_changed = False;
-@@ -632,6 +635,7 @@ void parse_colorset(int n, char *line)
- 	Bool has_fg_tint_changed = False;
- 	Bool has_bg_tint_changed = False;
- 	Bool has_icon_tint_changed = False;
-+	Bool has_translucent_tint_changed = False;
- 	Bool has_pixmap_changed = False;
- 	Bool has_shape_changed = False;
- 	Bool has_image_alpha_changed = False;
-@@ -758,6 +762,10 @@ void parse_colorset(int n, char *line)
- 		case 21: /* Plain */
- 			has_pixmap_changed = True;
- 			free_colorset_background(cs, True);
-+			cs->is_translucent = False;
-+			cs->translucent_tint_percent = 0;
-+			cs->color_flags &= ~TRANSLUCENT_TINT_SUPPLIED;
-+			has_translucent_tint_changed = True;
- 			break;
- 		case 22: /* NoShape */
- 			has_shape_changed = True;
-@@ -923,6 +931,24 @@ void parse_colorset(int n, char *line)
- 				cs->icon_alpha_percent = tmp;
- 			}
- 			break;
-+		case 42: /* Translucent */
-+			cs->is_translucent = True;
-+			parse_simple_tint(
-+				cs, args, &translucent_tint,
-+				TRANSLUCENT_TINT_SUPPLIED,
-+				&has_translucent_tint_changed, &percent,
-+				"Translucent");
-+			if (has_translucent_tint_changed)
-+			{
-+				cs->translucent_tint_percent = percent;
-+			}
-+			break;
-+		case 43: /* NoTranslucent */
-+			cs->is_translucent = False;
-+			cs->translucent_tint_percent = 0;
-+			cs->color_flags &= ~TRANSLUCENT_TINT_SUPPLIED;
-+			has_translucent_tint_changed = True;
-+			break;
- 		default:
- 			/* test for ?Gradient */
- 			if (option[0] && StrEquals(&option[1], "Gradient"))
-@@ -1624,6 +1650,27 @@ void parse_colorset(int n, char *line)
- 		}
- 	}
- 
-+	/*
-+	 * ---------- change the translucent tint colour ----------
-+	 */
-+	if (has_translucent_tint_changed)
-+	{
-+		/* user specified colour */
-+		if (translucent_tint != NULL)
-+		{
-+			PictureFreeColors(
-+				dpy, Pcmap, &cs->translucent_tint, 1, 0, True);
-+			cs->translucent_tint = GetColor(translucent_tint);
-+		}
-+		else
-+		{
-+			/* default */
-+			PictureFreeColors(
-+				dpy, Pcmap, &cs->translucent_tint, 1, 0, True);
-+			cs->translucent_tint = GetColor(black);
-+		}
-+	}
-+
- 	/*
- 	 * ---------- send new colorset to fvwm and clean up ----------
- 	 */
-@@ -1720,6 +1767,7 @@ void alloc_colorset(int n)
- 			ncs->fgsh = GetColor(white);
- 			ncs->tint = GetColor(black);
- 			ncs->icon_tint = GetColor(black);
-+			ncs->translucent_tint = GetColor(black);
- 			ncs->pixmap = XCreatePixmapFromBitmapData(
- 				dpy, Scr.NoFocusWin,
- 				&g_bits[4 * (nColorsets % 3)], 4, 4,
-@@ -1737,6 +1785,7 @@ void alloc_colorset(int n)
- 			ncs->fgsh = GetForeShadow(ncs->fg, ncs->bg);
- 			ncs->tint = GetColor(black);
- 			ncs->icon_tint = GetColor(black);
-+			ncs->translucent_tint = GetColor(black);
- 		}
- 		ncs->fg_tint = ncs->bg_tint = GetColor(black);
- 		/* set flags for fg contrast, bg average */
-@@ -1748,6 +1797,7 @@ void alloc_colorset(int n)
- 		ncs->icon_alpha_percent = 100;
- 		ncs->tint_percent = 0;
- 		ncs->icon_tint_percent = 0;
-+		ncs->translucent_tint_percent = 0;
- 		ncs->fg_tint_percent = ncs->bg_tint_percent = 0;
- 		ncs->dither = (PictureDitherByDefault())? True:False;
- 		nColorsets++;
---- a/fvwm/menuroot.h
-+++ b/fvwm/menuroot.h
-@@ -147,6 +147,9 @@ typedef struct MenuRootDynamic
- 		int d_npixels;
- 	} stored_pixels;
- 	/* alloc pixels when dithering is used for gradients */
-+	/* x,y XMapRaise */
-+	int x;
-+	int y;
- } MenuRootDynamic;
- 
- /* access macros to dynamic menu members */
---- a/fvwm/menus.c
-+++ b/fvwm/menus.c
-@@ -76,6 +76,18 @@
- 				 (ctx).menu_root.menu_root = (root))
- #define SCTX_GET_MR(ctx)	((ctx).type == SCTX_MENU_ROOT ? \
- 				 (ctx).menu_root.menu_root : NULL)
-+#define MENU_IS_TRANSLUCENT(mr,cs) \
-+	(!MR_IS_TEAR_OFF_MENU(mr) && CSET_IS_TRANSLUCENT(cs))
-+#define MENU_IS_TRANSPARENT(mr,cs) \
-+	(MENU_IS_TRANSLUCENT(mr,cs) || CSET_IS_TRANSPARENT(cs))
-+#define MR_IS_TRANSLUCENT_MENU(mr)  \
-+	(!MR_IS_TEAR_OFF_MENU(mr) && MR_STYLE(mr) && \
-+	ST_HAS_MENU_CSET(MR_STYLE(mr)) && CSET_IS_TRANSLUCENT( \
-+						ST_CSET_MENU(MR_STYLE(mr))))
-+#define MR_IS_TRANSPARENT_MENU(mr) \
-+	(MR_IS_TRANSLUCENT_MENU(mr) || (MR_STYLE(mr) && \
-+	ST_HAS_MENU_CSET(MR_STYLE(mr)) && CSET_IS_TRANSPARENT( \
-+						ST_CSET_MENU(MR_STYLE(mr)))))
- 
- /* ---------------------------- imports ------------------------------------ */
- 
-@@ -219,6 +231,8 @@ typedef struct mloop_static_info_t
- } mloop_static_info_t;
- 
- /* ---------------------------- forward declarations ----------------------- */
-+static MenuRoot *seek_submenu_instance(
-+	MenuRoot *parent_menu, MenuItem *parent_item);
- 
- /* ---------------------------- local variables ---------------------------- */
- 
-@@ -380,12 +394,22 @@ static void animated_move_back(
- 		Bool transparent_bg = False;
- 
- 		/* move it back */
--		if (ST_HAS_MENU_CSET(MR_STYLE(mr)) &&
--		    CSET_IS_TRANSPARENT(ST_CSET_MENU(MR_STYLE(mr))))
-+		if (MR_IS_TRANSPARENT_MENU(mr))
- 		{
- 			transparent_bg = True;
- 			get_menu_repaint_transparent_parameters(
- 				&mrtp, mr, fw);
-+			if (MR_IS_TRANSLUCENT_MENU(mr) && MR_SUBMENU_ITEM(mr))
-+			{
-+				MenuRoot *smr;
-+				smr = seek_submenu_instance(
-+					mr, MR_SUBMENU_ITEM(mr));
-+				if (smr)
-+				{
-+					/* just unmap it here, popdown later */
-+					XUnmapWindow(dpy, MR_WINDOW(smr));
-+				}
-+			}
- 		}
- 		end.x = start.x - MR_XANIMATION(mr);
- 		end.y = start.y;
-@@ -1914,6 +1938,7 @@ static void make_menu_window(MenuRoot *mr, Bool is_tear_off)
- 				/* Doh.  Use the standard display instead. */
- 				MR_CREATE_DPY(mr) = dpy;
- 			}
-+			MR_IS_TEAR_OFF_MENU(mr) = 1;
- 		}
- 		else
- 		{
-@@ -2718,7 +2743,37 @@ static void paint_menu(
- 	}
- 	MR_IS_PAINTED(mr) = 1;
- 	/* paint the menu background */
--	if (ms && ST_HAS_MENU_CSET(ms))
-+	if (MR_IS_TRANSLUCENT_MENU(mr))
-+	{
-+		Pixmap trans = None;
-+		FvwmRenderAttributes fra;
-+		colorset_t *colorset = &Colorset[ST_CSET_MENU(ms)];
-+
-+		fra.mask = 0;
-+		if (colorset->translucent_tint_percent > 0)
-+		{
-+			fra.mask = FRAM_HAVE_TINT;
-+			fra.tint = colorset->translucent_tint;
-+			fra.tint_percent = colorset->translucent_tint_percent;
-+		}
-+		if (MR_IS_BACKGROUND_SET(mr) == False)
-+		{
-+			trans = PGraphicsCreateTranslucent(
-+				dpy, MR_WINDOW(mr), &fra,
-+				BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
-+				MR_X(mr), MR_Y(mr), MR_WIDTH(mr), MR_HEIGHT(mr));
-+			XMapRaised(dpy, MR_WINDOW(mr));
-+			if (trans != None)
-+			{
-+				XSetWindowBackgroundPixmap(
-+					dpy, MR_WINDOW(mr), trans);
-+				MR_IS_BACKGROUND_SET(mr) = True;
-+				clear_expose_menu_area(MR_WINDOW(mr), pevent);
-+				XFreePixmap(dpy, trans);
-+			}
-+		}
-+	}
-+	else if (ms && ST_HAS_MENU_CSET(ms))
- 	{
- 		if (MR_IS_BACKGROUND_SET(mr) == False)
- 		{
-@@ -3527,10 +3582,7 @@ static int pop_menu_up(
- 					MR_HAS_POPPED_UP_RIGHT(mr) = 0;
- 				}
- 				MR_XANIMATION(parent_menu) += end_x - prev_x;
--				if (ST_HAS_MENU_CSET(MR_STYLE(parent_menu)) &&
--				    CSET_IS_TRANSPARENT(
--					    ST_CSET_MENU(
--						    MR_STYLE(parent_menu))))
-+				if (MR_IS_TRANSPARENT_MENU(parent_menu))
- 				{
- 					transparent_bg = True;
- 					get_menu_repaint_transparent_parameters(
-@@ -3713,10 +3765,21 @@ static int pop_menu_up(
- 	 */
- 
- 	XMoveWindow(dpy, MR_WINDOW(mr), x, y);
-+	MR_X(mr) = x;
-+	MR_Y(mr) = y;
- 	XSelectInput(dpy, MR_WINDOW(mr), event_mask);
--	XMapRaised(dpy, MR_WINDOW(mr));
--	if (popdown_window)
--		XUnmapWindow(dpy, popdown_window);
-+	if (MR_IS_TRANSLUCENT_MENU(mr))
-+	{
-+		if (popdown_window)
-+			XUnmapWindow(dpy, popdown_window);
-+		paint_menu(mr, NULL, fw);
-+	}
-+	else
-+	{
-+		XMapRaised(dpy, MR_WINDOW(mr));
-+		if (popdown_window)
-+			XUnmapWindow(dpy, popdown_window);
-+	}
- 	XFlush(dpy);
- 	MR_MAPPED_COPIES(mr)++;
- 	MST_USAGE_COUNT(mr)++;
-@@ -6286,16 +6349,122 @@ void update_transparent_menu_bg(
- 	{
- 		last = True;
- 	}
--	if (!last && CSET_IS_TRANSPARENT_PR_TINT(ST_CSET_MENU(ms)))
-+	if (!last &&
-+	    (CSET_IS_TRANSPARENT_PR_TINT(ST_CSET_MENU(ms)) ||
-+	     MR_IS_TRANSLUCENT_MENU(mr)))
- 	{
- 		/* too slow ... */
- 		return;
- 	}
--	SetWindowBackgroundWithOffset(
--		dpy, MR_WINDOW(mr), step_x - current_x, step_y - current_y,
--		MR_WIDTH(mr), MR_HEIGHT(mr),
--		&Colorset[ST_CSET_MENU(ms)], Pdepth,
--		FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
-+	if (MR_IS_TRANSLUCENT_MENU(mr))
-+	{
-+		Pixmap trans, tmp;
-+		FvwmRenderAttributes fra;
-+		colorset_t *colorset = &Colorset[ST_CSET_MENU(ms)];
-+
-+		fra.mask = 0;
-+		if (colorset->translucent_tint_percent > 0)
-+		{
-+			fra.mask = FRAM_HAVE_TINT;
-+			fra.tint = colorset->translucent_tint;
-+			fra.tint_percent = colorset->translucent_tint_percent;
-+		}
-+		if (current_x == step_x)
-+		{
-+			/* Reuse the old pixmap for the part of the menu
-+			 * that has not moved. (This can be extended to get
-+			 * two new rectangles, one in each direction)
-+			 *
-+			 * It saves the unmapping of the window and makes
-+			 * Things less flickering.
-+			 */
-+			GC my_gc;
-+			unsigned long valuemask = GCSubwindowMode;
-+			XGCValues values;
-+			int out_y=0;
-+			values.subwindow_mode = IncludeInferiors;
-+			if (step_y < 0)
-+			{
-+				out_y = -step_y;
-+			}
-+			trans = XCreatePixmap(dpy, MR_WINDOW(mr), MR_WIDTH(mr),
-+					      MR_HEIGHT(mr), Pdepth);
-+			my_gc = fvwmlib_XCreateGC(dpy,  MR_WINDOW(mr), 0, NULL);
-+			XChangeGC(dpy, my_gc, valuemask, &values);
-+
-+			XClearWindow(dpy, MR_WINDOW(mr));
-+
-+			if (current_y < step_y)
-+			{
-+				XCopyArea(dpy, MR_WINDOW(mr), trans, my_gc, 0,
-+					  step_y-current_y, MR_WIDTH(mr),
-+					  MR_HEIGHT(mr)-(step_y-current_y),
-+					  0,0);
-+				tmp = PGraphicsCreateTranslucent(
-+					dpy, MR_WINDOW(mr), &fra,
-+					BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
-+					current_x, current_y+MR_HEIGHT(mr),
-+					MR_WIDTH(mr), step_y-current_y);
-+
-+				XCopyArea(dpy, tmp, trans, my_gc, 0, 0,
-+					  MR_WIDTH(mr), step_y-current_y,0,
-+					  MR_HEIGHT(mr)-(step_y-current_y));
-+			}
-+			else
-+			{
-+				XCopyArea(dpy, MR_WINDOW(mr), trans, my_gc, 0,
-+					  0, MR_WIDTH(mr),
-+					  MR_HEIGHT(mr)-(current_y-step_y), 0,
-+					  current_y-step_y);
-+				tmp = PGraphicsCreateTranslucent(
-+					dpy, MR_WINDOW(mr), &fra,
-+					BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
-+					current_x,step_y, MR_WIDTH(mr),
-+					current_y-step_y);
-+				XCopyArea(dpy, tmp, trans, my_gc, 0, 0,
-+					  MR_WIDTH(mr), current_y-step_y,0,
-+					  out_y);
-+			}
-+			MR_X(mr) = step_x;
-+			MR_Y(mr) = step_y;
-+			XFreePixmap(dpy, tmp);
-+			XFreeGC(dpy,my_gc);
-+		}
-+		else
-+		{
-+			XUnmapWindow(dpy, MR_WINDOW(mr));
-+			MR_X(mr) = step_x;
-+			MR_Y(mr) = step_y;
-+			trans = PGraphicsCreateTranslucent(
-+				dpy, MR_WINDOW(mr), &fra,
-+				BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
-+				step_x, step_y, MR_WIDTH(mr),
-+				MR_HEIGHT(mr));
-+			XMapRaised(dpy, MR_WINDOW(mr));
-+		}
-+		XSetWindowBackgroundPixmap(
-+			dpy, MR_WINDOW(mr), trans);
-+		XFreePixmap(dpy, trans);
-+		if (current_x == step_x)
-+		{
-+			/* Redraw the border */
-+			RelieveRectangle(
-+				dpy, MR_WINDOW(mr), 0, 0, MR_WIDTH(mr) - 1,
-+				MR_HEIGHT(mr) - 1, (Pdepth < 2) ?
-+				SHADOW_GC(MST_MENU_INACTIVE_GCS(mr)) :
-+				HILIGHT_GC(MST_MENU_INACTIVE_GCS(mr)),
-+				SHADOW_GC(MST_MENU_INACTIVE_GCS(mr)),
-+				MST_BORDER_WIDTH(mr));
-+		}
-+	}
-+	else
-+	{
-+		SetWindowBackgroundWithOffset(
-+			dpy, MR_WINDOW(mr), step_x - current_x,
-+			step_y - current_y, MR_WIDTH(mr), MR_HEIGHT(mr),
-+			&Colorset[ST_CSET_MENU(ms)], Pdepth,
-+			FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
-+	}
- }
- 
- 
-@@ -6336,10 +6505,7 @@ void repaint_transparent_menu(
- 	}
- 	if (!is_bg_set)
- 	{
--		SetWindowBackground(
--			dpy, MR_WINDOW(mr), MR_WIDTH(mr), MR_HEIGHT(mr),
--			&Colorset[ST_CSET_MENU(ms)], Pdepth,
--			FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
-+		update_transparent_menu_bg(prtm, x, y, x, y, end_x, end_y);
- 	}
- 	/* redraw the background of non active item */
- 	for (mi = MR_FIRST_ITEM(mr); mi != NULL; mi = MI_NEXT_ITEM(mi))
-@@ -6978,7 +7144,10 @@ void UpdateMenuColorset(int cset)
- 					&Colorset[ST_CSET_MENU(ms2)],
- 					Pdepth,
- 					FORE_GC(MST_MENU_INACTIVE_GCS(mr)),
--					True);
-+					False);
-+				XClearArea(
-+					dpy, MR_WINDOW(mr), 0, 0, MR_WIDTH(mr),
-+					MR_HEIGHT(mr), True);
- 			}
- 			else if ((ST_HAS_ACTIVE_CSET(ms2) &&
- 				  ST_CSET_ACTIVE(ms2) == cset) ||
---- a/fvwm/menus.h
-+++ b/fvwm/menus.h
-@@ -19,6 +19,9 @@
- #define IS_MENU_RETURN(x) \
-   ((x)==MENU_DONE || (x)==MENU_ABORTED || (x)==MENU_SUBMENU_TORN_OFF)
- 
-+#define MR_X(m)                     ((m)->d->x)
-+#define MR_Y(m)                     ((m)->d->y)
-+
- struct MenuRoot;
- struct MenuStyle;
- struct MenuReturn;
---- a/libs/Colorset.h
-+++ b/libs/Colorset.h
-@@ -53,6 +53,10 @@ typedef struct Colorset
- 	Bool dither;
- 	Bool allows_buffered_transparency;
- 	Bool is_maybe_root_transparent;
-+	/* only use by fvwm menu (non tear-off) */
-+	Bool is_translucent;
-+	Pixel translucent_tint;
-+	unsigned int translucent_tint_percent : 7;
- #endif
- } colorset_t;
- 
-@@ -80,6 +84,7 @@ typedef struct Colorset
- #define FG_TINT_SUPPLIED  0x100
- #define BG_TINT_SUPPLIED  0x200
- #define ICON_TINT_SUPPLIED 0x400
-+#define TRANSLUCENT_TINT_SUPPLIED 0x800
- #endif
- 
- /* colorsets are stored as an array of structs to permit fast dereferencing */
-@@ -155,6 +160,11 @@ extern colorset_t *Colorset;
-     (cset != NULL && cset->pixmap == ParentRelative && \
-      cset->tint_percent > 0)
- 
-+#define CSET_IS_TRANSLUCENT(cset) \
-+    (cset >= 0 && Colorset[cset].is_translucent)
-+#define CSETS_IS_TRANSLUCENT(cset) \
-+    (cset && cset->is_translucent)
-+
- #ifndef FVWM_COLORSET_PRIVATE
- /* Create n new colorsets, fvwm/colorset.c does its own thing (different size)
-  */
---- a/libs/PictureGraphics.c
-+++ b/libs/PictureGraphics.c
-@@ -1361,7 +1361,7 @@ void PGraphicsTintRectangle(
- 	}
- }
- 
--#if 0 /* humm... maybe useful one day with menus */
-+#if 1 /* humm... maybe useful one day with menus */
- Pixmap PGraphicsCreateTranslucent(
- 	Display *dpy, Window win, FvwmRenderAttributes *fra, GC gc,
- 	int x, int y, int width, int height)
---- a/libs/PictureGraphics.h
-+++ b/libs/PictureGraphics.h
-@@ -124,7 +124,9 @@ void PGraphicsTintRectangle(
- 	Display *dpy, Window win, Pixel tint, int tint_percent,
- 	Drawable dest, Bool dest_is_a_window, GC gc, GC mono_gc, GC alpha_gc,
- 	int dest_x, int dest_y, int dest_w, int dest_h);
--
-+Pixmap PGraphicsCreateTranslucent(
-+	Display *dpy, Window win, FvwmRenderAttributes *fra, GC gc,
-+	int x, int y, int width, int height);
- /* never used ! */
- Pixmap PGraphicsCreateDitherPixmap(
- 	Display *dpy, Window win, Drawable src, Pixmap mask, int depth, GC gc,

diff --git a/x11-wm/fvwm3/fvwm3-9999.ebuild b/x11-wm/fvwm3/fvwm3-1.0.6a.ebuild
similarity index 82%
copy from x11-wm/fvwm3/fvwm3-9999.ebuild
copy to x11-wm/fvwm3/fvwm3-1.0.6a.ebuild
index 1d502d3e87c8..cc412650d214 100644
--- a/x11-wm/fvwm3/fvwm3-9999.ebuild
+++ b/x11-wm/fvwm3/fvwm3-1.0.6a.ebuild
@@ -22,14 +22,21 @@ fi
 LICENSE="GPL-2+ FVWM
 	go? ( Apache-2.0 BSD MIT )"
 SLOT="0"
-IUSE="bidi debug doc go netpbm nls perl readline stroke svg tk vanilla lock"
+IUSE="bidi debug doc +go netpbm nls perl readline stroke svg tk lock"
 REQUIRED_USE="
 	${PYTHON_REQUIRED_USE}"
 
 DOCS=( NEWS )
 
 if [[ ${PV} == 9999 ]]; then
-	DOCS+=( dev-docs/COMMANDS dev-docs/DEVELOPERS.md dev-docs/INSTALL.md dev-docs/PARSING.md dev-docs/TODO.md dev-docs/NEW-COMMANDS.md )
+	DOCS+=(
+		dev-docs/COMMANDS
+		dev-docs/DEVELOPERS.md
+		dev-docs/INSTALL.md
+		dev-docs/PARSING.md
+		dev-docs/TODO.md
+		dev-docs/NEW-COMMANDS.md
+	)
 fi
 
 BDEPEND="
@@ -72,7 +79,6 @@ RDEPEND="${PYTHON_DEPS}
 			>=dev-perl/X11-Protocol-0.56
 		)
 	)
-	media-libs/libpng:=
 	readline? (
 		sys-libs/ncurses:=
 		sys-libs/readline:=
@@ -86,21 +92,12 @@ RDEPEND="${PYTHON_DEPS}
 DEPEND="${COMMON_DEPEND}
 	x11-base/xorg-proto"
 
-PATCHES=(
-	"${FILESDIR}/${P}-translucent-menus.patch"
-)
-
-if [[ ${PV} == 9999 ]]; then
-	PATCHES+=(
-		"${FILESDIR}/${P}-goflags.patch"
-	)
-fi
-
 src_prepare() {
 	default
-	if use doc; then
-		eapply "${FILESDIR}/${P}-htmldoc.patch"
-	fi
+	use go && ( sed -e 's/GOFLAGS=-ldflags="-s -w"/GOFLAGS=/' \
+		-i bin/FvwmPrompt/Makefile.am || die )
+	# Patch configure to allow later go versions
+	sed -e 's/1.19\*)$/1.19*|1.20*|1.21*)/' -i configure.ac || die
 
 	eautoreconf
 }
@@ -133,13 +130,13 @@ src_configure() {
 
 	use readline && myconf+=( --without-termcap-library )
 
-	econf ${myconf[@]}
+	econf "${myconf[@]}"
 }
 
 src_compile() {
 	PREFIX="${EPREFIX}/usr" emake AR="$(tc-getAR)"
 	if [[ ${PV} == *9999 ]]; then
-		use doc && emake -C doc html
+		use doc && emake -C doc
 	fi
 }
 
@@ -148,17 +145,10 @@ src_install() {
 
 	dodir /etc/X11/Sessions
 	echo "/usr/bin/fvwm3" > "${ED}/etc/X11/Sessions/${PN}" || die
-	fperms a+x /etc/X11/Sessions/${PN} || die
+	fperms a+x "/etc/X11/Sessions/${PN}" || die
 
 	python_scriptinto "/usr/bin"
 	python_doscript "${ED}/usr/bin/FvwmCommand" "${ED}/usr/bin/fvwm-menu-desktop"
-	if use doc; then
-		if [[ ${PV} == *9999 ]]; then
-			HTML_DOCS=( doc/*.html )
-		else
-			HTML_DOCS=( doc/html/*.html )
-		fi
-	fi
 	einstalldocs
 
 	make_session_desktop fvwm3 /usr/bin/fvwm3
@@ -168,9 +158,9 @@ pkg_postinst() {
 	if use go; then
 		ewarn "FvwmPrompt has been installed, it provides the functionality of both FvwmCommand and FvwmConsole."
 		ewarn "For compatibility with the existing fvwm2 configurations, the ebuild will install a FvwmCommand wrapper script."
-		ewarn "If you need FvwmConsole, install ${PN} with USE=\"-go\", but FvwmPrompt and FvwmCommnd will not be installed."
+		ewarn "If you need FvwmConsole, install ${PN} with USE=\"-go\", but FvwmPrompt and FvwmCommand will not be installed."
 	else
-		ewarn "Fvwmconsole has been installed, but FvwmCommand and FvwmPrompt are no longer included in this ebuild."
+		ewarn "FvwmConsole has been installed, but FvwmCommand and FvwmPrompt are no longer included in this ebuild."
 		ewarn "If you need FvwmPrompt or FvwmCommand, install ${PN} with USE=\"go\"."
 		ewarn "In that case, FvwmPrompt will replace FvwmConsole and provide the same functionality in a more flexible way."
 	fi

diff --git a/x11-wm/fvwm3/fvwm3-9999.ebuild b/x11-wm/fvwm3/fvwm3-9999.ebuild
index 1d502d3e87c8..958bb6e0c085 100644
--- a/x11-wm/fvwm3/fvwm3-9999.ebuild
+++ b/x11-wm/fvwm3/fvwm3-9999.ebuild
@@ -22,14 +22,21 @@ fi
 LICENSE="GPL-2+ FVWM
 	go? ( Apache-2.0 BSD MIT )"
 SLOT="0"
-IUSE="bidi debug doc go netpbm nls perl readline stroke svg tk vanilla lock"
+IUSE="bidi debug doc +go netpbm nls perl readline stroke svg tk lock"
 REQUIRED_USE="
 	${PYTHON_REQUIRED_USE}"
 
 DOCS=( NEWS )
 
 if [[ ${PV} == 9999 ]]; then
-	DOCS+=( dev-docs/COMMANDS dev-docs/DEVELOPERS.md dev-docs/INSTALL.md dev-docs/PARSING.md dev-docs/TODO.md dev-docs/NEW-COMMANDS.md )
+	DOCS+=(
+		dev-docs/COMMANDS
+		dev-docs/DEVELOPERS.md
+		dev-docs/INSTALL.md
+		dev-docs/PARSING.md
+		dev-docs/TODO.md
+		dev-docs/NEW-COMMANDS.md
+	)
 fi
 
 BDEPEND="
@@ -72,7 +79,6 @@ RDEPEND="${PYTHON_DEPS}
 			>=dev-perl/X11-Protocol-0.56
 		)
 	)
-	media-libs/libpng:=
 	readline? (
 		sys-libs/ncurses:=
 		sys-libs/readline:=
@@ -86,21 +92,10 @@ RDEPEND="${PYTHON_DEPS}
 DEPEND="${COMMON_DEPEND}
 	x11-base/xorg-proto"
 
-PATCHES=(
-	"${FILESDIR}/${P}-translucent-menus.patch"
-)
-
-if [[ ${PV} == 9999 ]]; then
-	PATCHES+=(
-		"${FILESDIR}/${P}-goflags.patch"
-	)
-fi
-
 src_prepare() {
 	default
-	if use doc; then
-		eapply "${FILESDIR}/${P}-htmldoc.patch"
-	fi
+	use go && ( sed -e 's/GOFLAGS=-ldflags="-s -w"/GOFLAGS=/' \
+		-i bin/FvwmPrompt/Makefile.am || die )
 
 	eautoreconf
 }
@@ -133,13 +128,13 @@ src_configure() {
 
 	use readline && myconf+=( --without-termcap-library )
 
-	econf ${myconf[@]}
+	econf "${myconf[@]}"
 }
 
 src_compile() {
 	PREFIX="${EPREFIX}/usr" emake AR="$(tc-getAR)"
 	if [[ ${PV} == *9999 ]]; then
-		use doc && emake -C doc html
+		use doc && emake -C doc
 	fi
 }
 
@@ -148,17 +143,10 @@ src_install() {
 
 	dodir /etc/X11/Sessions
 	echo "/usr/bin/fvwm3" > "${ED}/etc/X11/Sessions/${PN}" || die
-	fperms a+x /etc/X11/Sessions/${PN} || die
+	fperms a+x "/etc/X11/Sessions/${PN}" || die
 
 	python_scriptinto "/usr/bin"
 	python_doscript "${ED}/usr/bin/FvwmCommand" "${ED}/usr/bin/fvwm-menu-desktop"
-	if use doc; then
-		if [[ ${PV} == *9999 ]]; then
-			HTML_DOCS=( doc/*.html )
-		else
-			HTML_DOCS=( doc/html/*.html )
-		fi
-	fi
 	einstalldocs
 
 	make_session_desktop fvwm3 /usr/bin/fvwm3
@@ -168,9 +156,9 @@ pkg_postinst() {
 	if use go; then
 		ewarn "FvwmPrompt has been installed, it provides the functionality of both FvwmCommand and FvwmConsole."
 		ewarn "For compatibility with the existing fvwm2 configurations, the ebuild will install a FvwmCommand wrapper script."
-		ewarn "If you need FvwmConsole, install ${PN} with USE=\"-go\", but FvwmPrompt and FvwmCommnd will not be installed."
+		ewarn "If you need FvwmConsole, install ${PN} with USE=\"-go\", but FvwmPrompt and FvwmCommand will not be installed."
 	else
-		ewarn "Fvwmconsole has been installed, but FvwmCommand and FvwmPrompt are no longer included in this ebuild."
+		ewarn "FvwmConsole has been installed, but FvwmCommand and FvwmPrompt are no longer included in this ebuild."
 		ewarn "If you need FvwmPrompt or FvwmCommand, install ${PN} with USE=\"go\"."
 		ewarn "In that case, FvwmPrompt will replace FvwmConsole and provide the same functionality in a more flexible way."
 	fi

diff --git a/x11-wm/fvwm3/metadata.xml b/x11-wm/fvwm3/metadata.xml
index 569ae86d8fb1..41f1d6eda8d2 100644
--- a/x11-wm/fvwm3/metadata.xml
+++ b/x11-wm/fvwm3/metadata.xml
@@ -20,6 +20,7 @@
 		<flag name="stroke">Mouse Gesture support</flag>
 	</use>
 	<upstream>
+		<remote-id type="github">fvwmorg/fvwm3</remote-id>
 		<bugs-to>https://github.com/fvwmorg/fvwm3/issues</bugs-to>
 		<changelog>https://raw.githubusercontent.com/fvwmorg/fvwm3/master/CHANGELOG.md</changelog>
 	</upstream>


^ permalink raw reply related	[flat|nested] 4+ messages in thread
* [gentoo-commits] repo/gentoo:master commit in: x11-wm/fvwm3/, x11-wm/fvwm3/files/
@ 2024-12-01  3:20 Matt Jolly
  0 siblings, 0 replies; 4+ messages in thread
From: Matt Jolly @ 2024-12-01  3:20 UTC (permalink / raw
  To: gentoo-commits

commit:     2e5fd6875a959b56b5f82568a06ab1cd1f31fa14
Author:     Matt Jolly <kangie <AT> gentoo <DOT> org>
AuthorDate: Sun Dec  1 02:23:40 2024 +0000
Commit:     Matt Jolly <kangie <AT> gentoo <DOT> org>
CommitDate: Sun Dec  1 03:18:15 2024 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=2e5fd687

x11-wm/fvwm3: add 1.1.1, sync live

This update brings the meson build sytem among other improvements!

Bug: https://bugs.gentoo.org/864959
Bug: https://bugs.gentoo.org/939531
Bug: https://bugs.gentoo.org/919163
Closes: https://bugs.gentoo.org/944780
Signed-off-by: Matt Jolly <kangie <AT> gentoo.org>

 x11-wm/fvwm3/Manifest                              |  2 +
 x11-wm/fvwm3/files/fvwm3-1.1.1-desk-init.patch     | 32 ++++++++++++++
 .../{fvwm3-9999.ebuild => fvwm3-1.1.1.ebuild}      | 51 +++++++++++++---------
 x11-wm/fvwm3/fvwm3-9999.ebuild                     | 47 +++++++++++---------
 x11-wm/fvwm3/metadata.xml                          |  3 --
 5 files changed, 92 insertions(+), 43 deletions(-)

diff --git a/x11-wm/fvwm3/Manifest b/x11-wm/fvwm3/Manifest
index ef274f6d0468..519c1518d411 100644
--- a/x11-wm/fvwm3/Manifest
+++ b/x11-wm/fvwm3/Manifest
@@ -2,3 +2,5 @@ DIST fvwm3-1.0.9-docs.tar.xz 234884 BLAKE2B f52da9eb2486f7a212ead77ccc190c57076e
 DIST fvwm3-1.0.9.tar.gz 4525552 BLAKE2B cb58181adb42f5b8d491c6413277eb1f4a5d89637d9c6bb323223925c719d808e84ed0f72a1d0ffc822ddb8295ebf2bb89c2351ebd591916b50ebc69728e59fa SHA512 de71d74b76da8e0cf1560d51ef916857e3f825b272d786d9b6b93aef9a82c399f580b9b941a47aff1f327b097d12e1ce05860924e792206e4150ff19a5c39ee3
 DIST fvwm3-1.1.0-docs.tar.xz 230964 BLAKE2B f431011a63a8d190e01e34301e74fd40750deb51c947b055474888379b7364910351c923ac637968948a094b89f49d8be5758429a85cd66107b8696b526b0004 SHA512 629794d0aef9ef2d9ce9a8e1ff3bc63fe2ef30f9f593938e2892e4e04bd960f51d2a90aaf5c95328495bccea6b1dbfd6fdeb76f18bb9a8bc6eb2649359023df8
 DIST fvwm3-1.1.0.tar.gz 4527424 BLAKE2B ee9a3f190ae7fa1f1dd703e17b0e12f04da63212cade30facdbc8339ded7f598de143d18f17dde39d3af8e24ff2b34855ad3e5b2b6c5ffe466072a7353895cd8 SHA512 47eea05cbdecf4da3313b9183fa938544b451b9f133d7a68062feb222c3c1af3873402f80b60485d603afe8cd23a03f3e86a503fc1f2070e1ad2e6e64d012341
+DIST fvwm3-1.1.1-docs.tar.xz 241608 BLAKE2B fbdc789dce9e36a94a4b6c2541b4474548bd961e333d14507788a70e1e4103f0ae5df8223259670cd2aeaec43d3088f1b600b371d03543c2bbb4bce47c37815c SHA512 92385ff188269f85dfda0f079135d651973b1556ac13112cff087a2294256edd7dc2b99aa2c220f9f361df6a3a4d820c56e061dd5d818e58755b1f94df9b4e03
+DIST fvwm3-1.1.1.tar.gz 4016926 BLAKE2B 5654554d8bd6593f30cb5bdd05e424abd7fd3f298d12073d419d18967f17d2df58de797392af0b15a0bcf05d09c8fe7b3c273734d17cb97b617dcb9a5e7f4091 SHA512 66b044a2c463d56573c68f4cdd222a39a667a4acf3425d448c7e1c105e67a9d00abafff1e94c066f0781b4546d1b2b84bc9c20798a0b9ef4b0f673e743a2d4d0

diff --git a/x11-wm/fvwm3/files/fvwm3-1.1.1-desk-init.patch b/x11-wm/fvwm3/files/fvwm3-1.1.1-desk-init.patch
new file mode 100644
index 000000000000..34b824f79dd2
--- /dev/null
+++ b/x11-wm/fvwm3/files/fvwm3-1.1.1-desk-init.patch
@@ -0,0 +1,32 @@
+From efef84cf5fcd2c4747ef75dd522605450efd278a Mon Sep 17 00:00:00 2001
+From: Jaimos Skriletz <jaimosskriletz@gmail.com>
+Date: Sat, 30 Nov 2024 16:40:21 -0700
+Subject: [PATCH] FvwmPager: Update current desk correctly during init.
+
+When FvwmPager is tracking the current desk and is run on any desk
+except desk 0, the current desk isn't updated during initialization
+because the monitor update is sent before the desk update, so the
+pager didn't realize the desk has changed.
+
+This ensures that the pager updates the current desk if either
+the desk changes or the new desk is not the same as the current
+desk to also catch updates during pager initialization.
+
+Fixes #1122
+---
+ modules/FvwmPager/messages.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/modules/FvwmPager/messages.c b/modules/FvwmPager/messages.c
+index c93ed3056..86cd32e70 100644
+--- a/modules/FvwmPager/messages.c
++++ b/modules/FvwmPager/messages.c
+@@ -454,7 +454,7 @@ void process_new_desk(unsigned long *body)
+ 		monitor_assign_virtual(fp->m);
+ 
+ 	/* If always tracking current desk. Update Desks[0]. */
+-	if (fAlwaysCurrentDesk && oldDesk != newDesk)
++	if (fAlwaysCurrentDesk && (oldDesk != newDesk || desk1 != newDesk))
+ 	{
+ 		PagerWindow *t;
+ 

diff --git a/x11-wm/fvwm3/fvwm3-9999.ebuild b/x11-wm/fvwm3/fvwm3-1.1.1.ebuild
similarity index 82%
copy from x11-wm/fvwm3/fvwm3-9999.ebuild
copy to x11-wm/fvwm3/fvwm3-1.1.1.ebuild
index b1eb858ae80b..227108110a88 100644
--- a/x11-wm/fvwm3/fvwm3-9999.ebuild
+++ b/x11-wm/fvwm3/fvwm3-1.1.1.ebuild
@@ -10,7 +10,7 @@ EAPI=8
 
 PYTHON_COMPAT=( python3_{10..13} )
 GO_OPTIONAL=1
-inherit flag-o-matic go-module meson python-single-r1
+inherit flag-o-matic go-module meson optfeature python-single-r1
 
 DESCRIPTION="A multiple large virtual desktop window manager derived from fvwm"
 HOMEPAGE="https://www.fvwm.org/"
@@ -31,8 +31,10 @@ fi
 LICENSE="GPL-2+ FVWM
 	go? ( Apache-2.0 BSD MIT )"
 SLOT="0"
-IUSE="bidi +go netpbm nls perl readline svg"
-REQUIRED_USE="${PYTHON_REQUIRED_USE}"
+IUSE="bidi +go nls readline svg"
+# Strictly speaking readline is not required for go,
+# but as most systems already have it installed we don't users to stub their toe on REQUIRED_USE
+REQUIRED_USE="${PYTHON_REQUIRED_USE} !go? ( readline )"
 
 DOCS=( NEWS )
 
@@ -50,54 +52,58 @@ fi
 BDEPEND="
 	virtual/pkgconfig
 	app-arch/unzip
-	go? ( >=dev-lang/go-1.14 )
+	go? ( >=dev-lang/go-1.20 )
 "
 
-if [[ ${FVWM3_DOCS_PREBUILT} == 0 ]]; then
+if [[ ${FVWM3_DOCS_PREBUILT} -ne 1 ]]; then
 	BDEPEND+="
 		dev-libs/libxslt
 		dev-ruby/asciidoctor
 	"
 fi
 
-RDEPEND="${PYTHON_DEPS}
-	${COMMON_DEPEND}
-	!x11-wm/fvwm
+COMMON_DEPEND="
 	dev-lang/perl
 	dev-libs/glib:2
 	dev-libs/libevent:=
 	media-libs/fontconfig
 	media-libs/libpng:=
-	sys-libs/zlib
+	x11-base/xorg-proto
 	x11-libs/libICE
 	x11-libs/libSM
 	x11-libs/libX11
-	x11-libs/libXau
 	x11-libs/libxcb
 	x11-libs/libXcursor
-	x11-libs/libXdmcp
 	x11-libs/libXext
 	x11-libs/libXfixes
 	x11-libs/libXft
+	x11-libs/libxkbcommon
 	x11-libs/libXpm
 	x11-libs/libXrandr
 	x11-libs/libXrender
-	x11-misc/xlockmore
-	dev-lang/tk
-	dev-perl/Tk
-	>=dev-perl/X11-Protocol-0.56
+	x11-libs/xtrans
+	x11-libs/libXfixes
 	bidi? ( dev-libs/fribidi )
 	readline? (
-		sys-libs/ncurses:=
 		sys-libs/readline:=
 	)
 	svg? (
 		gnome-base/librsvg:2
 		x11-libs/cairo
-	)"
+	)
+"
 
-DEPEND="${COMMON_DEPEND}
-	x11-base/xorg-proto"
+RDEPEND="
+	${COMMON_DEPEND}
+	${PYTHON_DEPS}
+	!x11-wm/fvwm
+"
+
+DEPEND="${COMMON_DEPEND}"
+
+PATCHES=(
+	"${FILESDIR}"/${P}-desk-init.patch
+)
 
 src_configure() {
 	# Recommended by upstream for release. Doesn't really matter for live ebuilds.
@@ -112,6 +118,7 @@ src_configure() {
 		"-Dpng=enabled"
 		"-Dsm=enabled"
 		"-Dxcursor=enabled"
+		"-Dxfixes=enabled"
 		"-Dxpm=enabled"
 		"-Dxrender=enabled"
 		$(meson_feature bidi)
@@ -126,7 +133,7 @@ src_configure() {
 		"-Ddocdir=${EPREFIX}/usr/share/doc/${PF}"
 	)
 
-	if [[ ${FVWM3_DOCS_PREBUILT} == 0 ]]; then
+	if [[ ${FVWM3_DOCS_PREBUILT} -ne 1 ]]; then
 		emesonargs+=(
 			"-Dhtmldoc=true"
 			"-Dmandoc=true"
@@ -171,4 +178,8 @@ pkg_postinst() {
 		ewarn "If you need FvwmPrompt or FvwmCommand, install ${PN} with USE=\"go\"."
 		ewarn "In that case, FvwmPrompt will replace FvwmConsole and provide the same functionality in a more flexible way."
 	fi
+
+	optfeature_header "Useful optional features:"
+	optfeature "Screen locking" x11-misc/xlockmore
+	optfeature "NetPBM support (used by FvwmScript-ScreenDump)" media-libs/netpbm
 }

diff --git a/x11-wm/fvwm3/fvwm3-9999.ebuild b/x11-wm/fvwm3/fvwm3-9999.ebuild
index b1eb858ae80b..20ea4b1d2fd7 100644
--- a/x11-wm/fvwm3/fvwm3-9999.ebuild
+++ b/x11-wm/fvwm3/fvwm3-9999.ebuild
@@ -10,7 +10,7 @@ EAPI=8
 
 PYTHON_COMPAT=( python3_{10..13} )
 GO_OPTIONAL=1
-inherit flag-o-matic go-module meson python-single-r1
+inherit flag-o-matic go-module meson optfeature python-single-r1
 
 DESCRIPTION="A multiple large virtual desktop window manager derived from fvwm"
 HOMEPAGE="https://www.fvwm.org/"
@@ -31,8 +31,10 @@ fi
 LICENSE="GPL-2+ FVWM
 	go? ( Apache-2.0 BSD MIT )"
 SLOT="0"
-IUSE="bidi +go netpbm nls perl readline svg"
-REQUIRED_USE="${PYTHON_REQUIRED_USE}"
+IUSE="bidi +go nls readline svg"
+# Strictly speaking readline is not required for go,
+# but as most systems already have it installed we don't users to stub their toe on REQUIRED_USE
+REQUIRED_USE="${PYTHON_REQUIRED_USE} !go? ( readline )"
 
 DOCS=( NEWS )
 
@@ -50,54 +52,54 @@ fi
 BDEPEND="
 	virtual/pkgconfig
 	app-arch/unzip
-	go? ( >=dev-lang/go-1.14 )
+	go? ( >=dev-lang/go-1.20 )
 "
 
-if [[ ${FVWM3_DOCS_PREBUILT} == 0 ]]; then
+if [[ ${FVWM3_DOCS_PREBUILT} -ne 1 ]]; then
 	BDEPEND+="
 		dev-libs/libxslt
 		dev-ruby/asciidoctor
 	"
 fi
 
-RDEPEND="${PYTHON_DEPS}
-	${COMMON_DEPEND}
-	!x11-wm/fvwm
+COMMON_DEPEND="
 	dev-lang/perl
 	dev-libs/glib:2
 	dev-libs/libevent:=
 	media-libs/fontconfig
 	media-libs/libpng:=
-	sys-libs/zlib
+	x11-base/xorg-proto
 	x11-libs/libICE
 	x11-libs/libSM
 	x11-libs/libX11
-	x11-libs/libXau
 	x11-libs/libxcb
 	x11-libs/libXcursor
-	x11-libs/libXdmcp
 	x11-libs/libXext
 	x11-libs/libXfixes
 	x11-libs/libXft
+	x11-libs/libxkbcommon
 	x11-libs/libXpm
 	x11-libs/libXrandr
 	x11-libs/libXrender
-	x11-misc/xlockmore
-	dev-lang/tk
-	dev-perl/Tk
-	>=dev-perl/X11-Protocol-0.56
+	x11-libs/xtrans
+	x11-libs/libXfixes
 	bidi? ( dev-libs/fribidi )
 	readline? (
-		sys-libs/ncurses:=
 		sys-libs/readline:=
 	)
 	svg? (
 		gnome-base/librsvg:2
 		x11-libs/cairo
-	)"
+	)
+"
 
-DEPEND="${COMMON_DEPEND}
-	x11-base/xorg-proto"
+RDEPEND="
+	${COMMON_DEPEND}
+	${PYTHON_DEPS}
+	!x11-wm/fvwm
+"
+
+DEPEND="${COMMON_DEPEND}"
 
 src_configure() {
 	# Recommended by upstream for release. Doesn't really matter for live ebuilds.
@@ -112,6 +114,7 @@ src_configure() {
 		"-Dpng=enabled"
 		"-Dsm=enabled"
 		"-Dxcursor=enabled"
+		"-Dxfixes=enabled"
 		"-Dxpm=enabled"
 		"-Dxrender=enabled"
 		$(meson_feature bidi)
@@ -126,7 +129,7 @@ src_configure() {
 		"-Ddocdir=${EPREFIX}/usr/share/doc/${PF}"
 	)
 
-	if [[ ${FVWM3_DOCS_PREBUILT} == 0 ]]; then
+	if [[ ${FVWM3_DOCS_PREBUILT} -ne 1 ]]; then
 		emesonargs+=(
 			"-Dhtmldoc=true"
 			"-Dmandoc=true"
@@ -171,4 +174,8 @@ pkg_postinst() {
 		ewarn "If you need FvwmPrompt or FvwmCommand, install ${PN} with USE=\"go\"."
 		ewarn "In that case, FvwmPrompt will replace FvwmConsole and provide the same functionality in a more flexible way."
 	fi
+
+	optfeature_header "Useful optional features:"
+	optfeature "Screen locking" x11-misc/xlockmore
+	optfeature "NetPBM support (used by FvwmScript-ScreenDump)" media-libs/netpbm
 }

diff --git a/x11-wm/fvwm3/metadata.xml b/x11-wm/fvwm3/metadata.xml
index 278a0067ac68..13311dfc28e1 100644
--- a/x11-wm/fvwm3/metadata.xml
+++ b/x11-wm/fvwm3/metadata.xml
@@ -11,9 +11,6 @@
 	</maintainer>
 	<use>
 		<flag name="go">Enable building <pkg>dev-lang/go</pkg> code (FvwmPrompt)</flag>
-		<flag name="lock">Enable screen locking</flag>
-		<flag name="netpbm">Enable NetPBM support (used by FvwmScript-ScreenDump)</flag>
-		<flag name="stroke">Mouse Gesture support</flag>
 	</use>
 	<upstream>
 		<remote-id type="github">fvwmorg/fvwm3</remote-id>


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2024-12-01  3:20 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-06-02  5:38 [gentoo-commits] repo/gentoo:master commit in: x11-wm/fvwm3/, x11-wm/fvwm3/files/ Sam James
  -- strict thread matches above, loose matches on Subject: below --
2022-06-04  2:19 Sam James
2023-03-15  5:05 Sam James
2024-12-01  3:20 Matt Jolly

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox