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 [email protected]  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 <[email protected]>; 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 <[email protected]>; 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 [email protected]; 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 <[email protected]>; 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 [email protected]; 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 <[email protected]>; 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 <[email protected]>
+To: [email protected]
+Subject: Re: FVWM: Transparency/Translucency revisited...
+Message-ID: <[email protected]>
+Mail-Followup-To: [email protected]
+References: <[email protected]>
+Mime-Version: 1.0
+Content-Type: multipart/mixed; boundary="Nq2Wo0NMKNjxTN9z"
+Content-Disposition: inline
+In-Reply-To: <[email protected]>
+User-Agent: Mutt/1.4i
+X-Spam-Score: -9.3 (---------)
+Sender: [email protected]
+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 [email protected].
+To report problems, send mail to [email protected].
+

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="[email protected]"
+
+       # 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="[email protected]"
+
+       # 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>[email protected]</email>
+               <name>Matthew Jolly</name>
+       </maintainer>
+       <maintainer type="project" proxied="proxy">
+               <email>[email protected]</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>

Reply via email to