Gentoo Archives: gentoo-commits

From: Sam James <sam@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] repo/gentoo:master commit in: x11-wm/fvwm3/, x11-wm/fvwm3/files/
Date: Sat, 04 Jun 2022 02:19:33
Message-Id: 1654309159.e0676d323821ce5660feec809a9f8018a2ab58c3.sam@gentoo
1 commit: e0676d323821ce5660feec809a9f8018a2ab58c3
2 Author: Matt Jolly <Matt.Jolly <AT> footclan <DOT> ninja>
3 AuthorDate: Fri May 20 13:02:46 2022 +0000
4 Commit: Sam James <sam <AT> gentoo <DOT> org>
5 CommitDate: Sat Jun 4 02:19:19 2022 +0000
6 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=e0676d32
7
8 x11-wm/fvwm3: new package, add 1.0.4, 9999
9
10 Closes: https://bugs.gentoo.org/760012
11
12 Signed-off-by: Matt Jolly <Matt.Jolly <AT> footclan.ninja>
13 Signed-off-by: Sam James <sam <AT> gentoo.org>
14
15 x11-wm/fvwm3/Manifest | 3 +
16 x11-wm/fvwm3/files/README.translucency | 94 ++++
17 x11-wm/fvwm3/files/fvwm3-1.0.4-htmldoc.patch | 70 +++
18 .../files/fvwm3-1.0.4-translucent-menus.patch | 487 ++++++++++++++++++++
19 x11-wm/fvwm3/files/fvwm3-9999-goflags.patch | 11 +
20 x11-wm/fvwm3/files/fvwm3-9999-htmldoc.patch | 43 ++
21 .../fvwm3/files/fvwm3-9999-translucent-menus.patch | 489 +++++++++++++++++++++
22 x11-wm/fvwm3/fvwm3-1.0.4.ebuild | 204 +++++++++
23 x11-wm/fvwm3/fvwm3-9999.ebuild | 204 +++++++++
24 x11-wm/fvwm3/metadata.xml | 27 ++
25 10 files changed, 1632 insertions(+)
26
27 diff --git a/x11-wm/fvwm3/Manifest b/x11-wm/fvwm3/Manifest
28 new file mode 100644
29 index 000000000000..6ba89565ed08
30 --- /dev/null
31 +++ b/x11-wm/fvwm3/Manifest
32 @@ -0,0 +1,3 @@
33 +DIST fvwm3-1.0.4-deps.tar.xz 2847880 BLAKE2B 245a5fa7846ffd74679ecd280b7f31cdcc58dfb765923750b22905caecdea0a1b2a322eeecc8133996414be37026de9f859222b78d93ed6c974005456ee953d1 SHA512 c93e5d4706a6261d8ebafcb5d2576377d79dfb693cc2b4a7608c3657b1c612b7c17a2554a6cef30c80ed5ffc9d0efd16f9adc33b2a9b906ece812fdf4fa8ab86
34 +DIST fvwm3-1.0.4.tar.gz 4691719 BLAKE2B 4ce93b1a2d110b570b5fc8b253f9ff8ea1f44e5470c6e1bc136a53ebe53a23abe3d075bf351fca54ac110ea5731f9b44c59c83186d320e7509bf26e5144436ca SHA512 b72a1ebeba7c55214603fd43ea439f7283b3c79e39d2671a67b9512c67dcea111377eab2131ed0b18a72f6b772b0d048abe08f52565708367465ed9bb14e85f6
35 +DIST fvwm3-9999-deps.tar.xz 3712984 BLAKE2B 389f70dbadbe2fe6accd4793ed71e17cb2ff2f72e318e1744204344902145e5050ace5379f4de89991907199b7b354a9690e6546382d1eedfcdb676b28f1ff13 SHA512 444b1ea17b31d477ae12b4ef84a9f5fb85aae1158aead1bc3a4d8e96a18dde6a13e41e3e3552bd652eb58fe42958ad45791a1d4ef70242e9d6d80060067cef86
36
37 diff --git a/x11-wm/fvwm3/files/README.translucency b/x11-wm/fvwm3/files/README.translucency
38 new file mode 100644
39 index 000000000000..a60b5f668acd
40 --- /dev/null
41 +++ b/x11-wm/fvwm3/files/README.translucency
42 @@ -0,0 +1,94 @@
43 +From owner-fvwm@××××××.edu Sun Aug 31 22:52:59 2003
44 +Received: from sina.hpc.uh.edu ([129.7.128.10] ident=lists)
45 + by malifon.math.uh.edu with esmtp (Exim 3.20 #1)
46 + id 19tb0F-0006NY-00; Sun, 31 Aug 2003 17:48:59 -0500
47 +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)
48 +Received: from epithumia.math.uh.edu (epithumia.math.uh.edu [129.7.128.2])
49 + by sina.hpc.uh.edu (8.9.3/8.9.3) with ESMTP id RAA16575
50 + for <fvwm@××××××.edu>; Sun, 31 Aug 2003 17:50:24 -0500 (CDT)
51 +Received: from epithumia.math.uh.edu (epithumia.math.uh.edu [127.0.0.1])
52 + by epithumia.math.uh.edu (8.12.8/8.12.5) with ESMTP id h7VMml6M025095
53 + for <fvwm@××××××.edu>; Sun, 31 Aug 2003 17:48:47 -0500
54 +Received: (from tibbs@localhost)
55 + by epithumia.math.uh.edu (8.12.8/8.12.8/Submit) id h7VMmlVC025093
56 + for fvwm@××××××.edu; Sun, 31 Aug 2003 17:48:47 -0500
57 +Received: from util2.math.uh.edu (util2.math.uh.edu [129.7.128.23])
58 + by sina.hpc.uh.edu (8.9.3/8.9.3) with ESMTP id QAA16418
59 + for <fvwm@××××××.edu>; Sun, 31 Aug 2003 16:02:07 -0500 (CDT)
60 +Received: from postfix4-2.free.fr ([213.228.0.176])
61 + by util2.math.uh.edu with esmtp (Exim 4.20)
62 + id 19tZIm-00079F-6t
63 + for fvwm@××××.org; Sun, 31 Aug 2003 16:00:00 -0500
64 +Received: from snoopy.folie (nas-p19-3-62-147-221-172.dial.proxad.net [62.147.221.172])
65 + by postfix4-2.free.fr (Postfix) with ESMTP id 59DE6C386
66 + for <fvwm@××××.org>; Sun, 31 Aug 2003 22:59:34 +0200 (CEST)
67 +Received: by snoopy.folie (Postfix, from userid 501)
68 + id A4D1D48784; Sun, 31 Aug 2003 22:39:19 +0200 (CEST)
69 +Date: Sun, 31 Aug 2003 22:39:19 +0200
70 +From: Olivier Chapuis <olivier.chapuis@××××.fr>
71 +To: fvwm@××××.org
72 +Subject: Re: FVWM: Transparency/Translucency revisited...
73 +Message-ID: <20030831203919.GA6205@××××××.folie>
74 +Mail-Followup-To: fvwm@××××.org
75 +References: <Pine.LNX.4.44.0308251817370.1980-100000@×××××××××××××××××××.pl>
76 +Mime-Version: 1.0
77 +Content-Type: multipart/mixed; boundary="Nq2Wo0NMKNjxTN9z"
78 +Content-Disposition: inline
79 +In-Reply-To: <Pine.LNX.4.44.0308251817370.1980-100000@×××××××××××××××××××.pl>
80 +User-Agent: Mutt/1.4i
81 +X-Spam-Score: -9.3 (---------)
82 +Sender: owner-fvwm@××××××.edu
83 +Precedence: list
84 +X-Majordomo: 1.94.jlt7
85 +Status: RO
86 +Content-Length: 6519
87 +Lines: 122
88 +
89 +
90 +--Nq2Wo0NMKNjxTN9z
91 +Content-Type: text/plain; charset=us-ascii
92 +Content-Disposition: inline
93 +
94 +On Mon, Aug 25, 2003 at 09:00:32PM +0200, Dawid Kuroczko wrote:
95 +> Hello. :-)
96 +>
97 +> I did manage to make pseudo-transparent menus, but now I'd like
98 +> to make something more "real". What I'd like to do is to have
99 +> something like there is in KDE.
100 +>
101 +> It should work like this:
102 +> 1. user clicks thus calling a Menu.
103 +> 2. current screen dump is taken (with all the windows, but
104 +> without a menu just as yet).
105 +> 3. this screen dump is made available to Menu as
106 +> root background pixmap.
107 +> 4. Menu is displayed with tinted real background.
108 +>
109 +> This way it's pretty easy to make an illusion of real
110 +> transparency (and looks "l33t", as some may say).
111 +>
112 +
113 +Here a new version of the patch for current cvs/snapshot.
114 +This patch add a new options to Colorset: Translucent/NoTranslucent.
115 +These options has effects only with (non tear-off) menu.
116 +Also menu animation is "handled".
117 +
118 +For example with:
119 +
120 + Colorset 5 fg yellow, bg blue, HGradient 200 lightblue darkblue, \
121 + Translucent blue 60
122 + Style * MenuColorset 5, PopupOffset 0 100, AnimationOff
123 +
124 +you get translucent menus (with a 60% blue tint) and if you tear-off
125 +a menu the menu use the gradient.
126 +
127 +Regards, Olivier
128 +
129 +<snip patch>
130 +
131 +--
132 +Visit the official FVWM web page at <URL: http://www.fvwm.org/>.
133 +To unsubscribe from the list, send "unsubscribe fvwm" in the body of a
134 +message to majordomo@××××.org.
135 +To report problems, send mail to fvwm-owner@××××.org.
136 +
137
138 diff --git a/x11-wm/fvwm3/files/fvwm3-1.0.4-htmldoc.patch b/x11-wm/fvwm3/files/fvwm3-1.0.4-htmldoc.patch
139 new file mode 100644
140 index 000000000000..67abc9febfa4
141 --- /dev/null
142 +++ b/x11-wm/fvwm3/files/fvwm3-1.0.4-htmldoc.patch
143 @@ -0,0 +1,70 @@
144 +This patch enables HTML documentation output
145 +--- a/doc/Makefile.am
146 ++++ b/doc/Makefile.am
147 +@@ -1,29 +1,39 @@
148 + docdir = @FVWM_DOCDIR@
149 +-MODULE_ADOCS = $(wildcard fvwm3/fvwm3.adoc bin/*.adoc modules/*.adoc)
150 ++DOC_SRC = $(wildcard fvwm3/fvwm3.adoc bin/*.adoc modules/*.adoc)
151 +
152 +-EXTRA_DIST = $(MODULE_ADOCS)
153 ++EXTRA_DIST = $(DOC_SRC)
154 +
155 + if FVWM_BUILD_MANDOC
156 +-BUILD_MANS = $(patsubst %.adoc,%, $(MODULE_ADOCS))
157 ++BUILD_MANS = $(DOC_SRC:.adoc=.1)
158 ++BUILD_HTML = $(DOC_SRC:.adoc=.html)
159 + else
160 + BUILD_MANS =
161 + endif
162 +
163 +-all: docs
164 +-docs: $(BUILD_MANS)
165 ++all: man html
166 ++
167 ++man: $(BUILD_MANS)
168 ++
169 ++html: $(BUILD_HTML)
170 +
171 + clean:
172 + rm -fr man1/
173 ++ rm -fr html/
174 +
175 + distclean-local: clean
176 +
177 + if FVWM_BUILD_MANDOC
178 + QUIET_ASCIIDOC = @echo ' ' DOC ' ' $@'.1';
179 +
180 +-%: %.adoc
181 ++%.1: %.adoc
182 + $(QUIET_ASCIIDOC) \
183 + NAME=`basename "$@" | "$(SED)" -e "${transform}"`; \
184 +- $(ASCIIDOC) -b manpage $< -o "man1/$$NAME.1"
185 ++ $(ASCIIDOC) -b manpage $^ -o "man1/$$NAME"
186 ++
187 ++%.html: %.adoc
188 ++ $(QUIET_ASCIIDOC:.1=.html) \
189 ++ NAME=`basename "$@" | "$(SED)" -e "${transform}"`; \
190 ++ $(ASCIIDOC) -b html5 $^ -o "html/$$NAME"
191 +
192 + install-data-local:
193 + install -d -m 755 $(DESTDIR)$(mandir)/man1/
194 +@@ -31,10 +41,19 @@ install-data-local:
195 + NAME=`basename "$$i" | "$(SED)" -e "${transform}"`; \
196 + install -m 644 "man1/$$NAME.1" $(DESTDIR)$(mandir)/man1/; \
197 + done
198 ++ install -d -m 755 $(DESTDIR)$(mandir)/html/
199 ++ @for i in $(notdir $(BUILD_HTML)); do \
200 ++ NAME=`basename "$$i" | "$(SED)" -e "${transform}"`; \
201 ++ install -m 644 "html/$$NAME.html" $(DESTDIR)$(mandir)/html/; \
202 ++ done
203 +
204 + uninstall-local:
205 + @for i in $(notdir $(BUILD_MANS)); do \
206 + NAME=`basename "$$i" | "$(SED)" -e "${transform}"`; \
207 + rm -f "$(DESTDIR)$(mandir)/man1/$$NAME.1"; \
208 + done
209 ++ @for i in $(notdir $(BUILD_HTML)); do \
210 ++ NAME=`basename "$$i" | "$(SED)" -e "${transform}"`; \
211 ++ rm -f "$(DESTDIR)$(mandir)/html/$$NAME.html"; \
212 ++ done
213 + endif
214
215 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
216 new file mode 100644
217 index 000000000000..5ead9b09aff5
218 --- /dev/null
219 +++ b/x11-wm/fvwm3/files/fvwm3-1.0.4-translucent-menus.patch
220 @@ -0,0 +1,487 @@
221 +--- a/fvwm/colorset.c
222 ++++ b/fvwm/colorset.c
223 +@@ -162,6 +162,8 @@ static char *csetopts[] =
224 + "NoIconTint",
225 + "IconAlpha",
226 +
227 ++ "Translucent",
228 ++ "NoTranslucent",
229 + NULL
230 + };
231 +
232 +@@ -620,6 +622,7 @@ void parse_colorset(int n, char *line)
233 + char *fg_tint = NULL;
234 + char *bg_tint = NULL;
235 + char *icon_tint = NULL;
236 ++ char *translucent_tint = NULL;
237 + Bool have_pixels_changed = False;
238 + Bool has_icon_pixels_changed = False;
239 + Bool has_fg_changed = False;
240 +@@ -632,6 +635,7 @@ void parse_colorset(int n, char *line)
241 + Bool has_fg_tint_changed = False;
242 + Bool has_bg_tint_changed = False;
243 + Bool has_icon_tint_changed = False;
244 ++ Bool has_translucent_tint_changed = False;
245 + Bool has_pixmap_changed = False;
246 + Bool has_shape_changed = False;
247 + Bool has_image_alpha_changed = False;
248 +@@ -758,6 +762,10 @@ void parse_colorset(int n, char *line)
249 + case 21: /* Plain */
250 + has_pixmap_changed = True;
251 + free_colorset_background(cs, True);
252 ++ cs->is_translucent = False;
253 ++ cs->translucent_tint_percent = 0;
254 ++ cs->color_flags &= ~TRANSLUCENT_TINT_SUPPLIED;
255 ++ has_translucent_tint_changed = True;
256 + break;
257 + case 22: /* NoShape */
258 + has_shape_changed = True;
259 +@@ -923,6 +931,24 @@ void parse_colorset(int n, char *line)
260 + cs->icon_alpha_percent = tmp;
261 + }
262 + break;
263 ++ case 42: /* Translucent */
264 ++ cs->is_translucent = True;
265 ++ parse_simple_tint(
266 ++ cs, args, &translucent_tint,
267 ++ TRANSLUCENT_TINT_SUPPLIED,
268 ++ &has_translucent_tint_changed, &percent,
269 ++ "Translucent");
270 ++ if (has_translucent_tint_changed)
271 ++ {
272 ++ cs->translucent_tint_percent = percent;
273 ++ }
274 ++ break;
275 ++ case 43: /* NoTranslucent */
276 ++ cs->is_translucent = False;
277 ++ cs->translucent_tint_percent = 0;
278 ++ cs->color_flags &= ~TRANSLUCENT_TINT_SUPPLIED;
279 ++ has_translucent_tint_changed = True;
280 ++ break;
281 + default:
282 + /* test for ?Gradient */
283 + if (option[0] && StrEquals(&option[1], "Gradient"))
284 +@@ -1624,6 +1650,27 @@ void parse_colorset(int n, char *line)
285 + }
286 + }
287 +
288 ++ /*
289 ++ * ---------- change the translucent tint colour ----------
290 ++ */
291 ++ if (has_translucent_tint_changed)
292 ++ {
293 ++ /* user specified colour */
294 ++ if (translucent_tint != NULL)
295 ++ {
296 ++ PictureFreeColors(
297 ++ dpy, Pcmap, &cs->translucent_tint, 1, 0, True);
298 ++ cs->translucent_tint = GetColor(translucent_tint);
299 ++ }
300 ++ else
301 ++ {
302 ++ /* default */
303 ++ PictureFreeColors(
304 ++ dpy, Pcmap, &cs->translucent_tint, 1, 0, True);
305 ++ cs->translucent_tint = GetColor(black);
306 ++ }
307 ++ }
308 ++
309 + /*
310 + * ---------- send new colorset to fvwm and clean up ----------
311 + */
312 +@@ -1720,6 +1767,7 @@ void alloc_colorset(int n)
313 + ncs->fgsh = GetColor(white);
314 + ncs->tint = GetColor(black);
315 + ncs->icon_tint = GetColor(black);
316 ++ ncs->translucent_tint = GetColor(black);
317 + ncs->pixmap = XCreatePixmapFromBitmapData(
318 + dpy, Scr.NoFocusWin,
319 + &g_bits[4 * (nColorsets % 3)], 4, 4,
320 +@@ -1737,6 +1785,7 @@ void alloc_colorset(int n)
321 + ncs->fgsh = GetForeShadow(ncs->fg, ncs->bg);
322 + ncs->tint = GetColor(black);
323 + ncs->icon_tint = GetColor(black);
324 ++ ncs->translucent_tint = GetColor(black);
325 + }
326 + ncs->fg_tint = ncs->bg_tint = GetColor(black);
327 + /* set flags for fg contrast, bg average */
328 +@@ -1748,6 +1797,7 @@ void alloc_colorset(int n)
329 + ncs->icon_alpha_percent = 100;
330 + ncs->tint_percent = 0;
331 + ncs->icon_tint_percent = 0;
332 ++ ncs->translucent_tint_percent = 0;
333 + ncs->fg_tint_percent = ncs->bg_tint_percent = 0;
334 + ncs->dither = (PictureDitherByDefault())? True:False;
335 + nColorsets++;
336 +--- a/fvwm/menuroot.h
337 ++++ b/fvwm/menuroot.h
338 +@@ -147,6 +147,9 @@ typedef struct MenuRootDynamic
339 + int d_npixels;
340 + } stored_pixels;
341 + /* alloc pixels when dithering is used for gradients */
342 ++ /* x,y XMapRaise */
343 ++ int x;
344 ++ int y;
345 + } MenuRootDynamic;
346 +
347 + /* access macros to dynamic menu members */
348 +--- a/fvwm/menus.c
349 ++++ b/fvwm/menus.c
350 +@@ -75,6 +75,18 @@
351 + (ctx).menu_root.menu_root = (root))
352 + #define SCTX_GET_MR(ctx) ((ctx).type == SCTX_MENU_ROOT ? \
353 + (ctx).menu_root.menu_root : NULL)
354 ++#define MENU_IS_TRANSLUCENT(mr,cs) \
355 ++ (!MR_IS_TEAR_OFF_MENU(mr) && CSET_IS_TRANSLUCENT(cs))
356 ++#define MENU_IS_TRANSPARENT(mr,cs) \
357 ++ (MENU_IS_TRANSLUCENT(mr,cs) || CSET_IS_TRANSPARENT(cs))
358 ++#define MR_IS_TRANSLUCENT_MENU(mr) \
359 ++ (!MR_IS_TEAR_OFF_MENU(mr) && MR_STYLE(mr) && \
360 ++ ST_HAS_MENU_CSET(MR_STYLE(mr)) && CSET_IS_TRANSLUCENT( \
361 ++ ST_CSET_MENU(MR_STYLE(mr))))
362 ++#define MR_IS_TRANSPARENT_MENU(mr) \
363 ++ (MR_IS_TRANSLUCENT_MENU(mr) || (MR_STYLE(mr) && \
364 ++ ST_HAS_MENU_CSET(MR_STYLE(mr)) && CSET_IS_TRANSPARENT( \
365 ++ ST_CSET_MENU(MR_STYLE(mr)))))
366 +
367 + /* ---------------------------- imports ------------------------------------ */
368 +
369 +@@ -218,6 +230,8 @@ typedef struct mloop_static_info_t
370 + } mloop_static_info_t;
371 +
372 + /* ---------------------------- forward declarations ----------------------- */
373 ++static MenuRoot *seek_submenu_instance(
374 ++ MenuRoot *parent_menu, MenuItem *parent_item);
375 +
376 + /* ---------------------------- local variables ---------------------------- */
377 +
378 +@@ -379,12 +393,22 @@ static void animated_move_back(
379 + Bool transparent_bg = False;
380 +
381 + /* move it back */
382 +- if (ST_HAS_MENU_CSET(MR_STYLE(mr)) &&
383 +- CSET_IS_TRANSPARENT(ST_CSET_MENU(MR_STYLE(mr))))
384 ++ if (MR_IS_TRANSPARENT_MENU(mr))
385 + {
386 + transparent_bg = True;
387 + get_menu_repaint_transparent_parameters(
388 + &mrtp, mr, fw);
389 ++ if (MR_IS_TRANSLUCENT_MENU(mr) && MR_SUBMENU_ITEM(mr))
390 ++ {
391 ++ MenuRoot *smr;
392 ++ smr = seek_submenu_instance(
393 ++ mr, MR_SUBMENU_ITEM(mr));
394 ++ if (smr)
395 ++ {
396 ++ /* just unmap it here, popdown later */
397 ++ XUnmapWindow(dpy, MR_WINDOW(smr));
398 ++ }
399 ++ }
400 + }
401 + AnimatedMoveOfWindow(
402 + MR_WINDOW(mr), act_x, act_y, act_x - MR_XANIMATION(mr),
403 +@@ -1910,6 +1934,7 @@ static void make_menu_window(MenuRoot *mr, Bool is_tear_off)
404 + /* Doh. Use the standard display instead. */
405 + MR_CREATE_DPY(mr) = dpy;
406 + }
407 ++ MR_IS_TEAR_OFF_MENU(mr) = 1;
408 + }
409 + else
410 + {
411 +@@ -2714,7 +2739,37 @@ static void paint_menu(
412 + }
413 + MR_IS_PAINTED(mr) = 1;
414 + /* paint the menu background */
415 +- if (ms && ST_HAS_MENU_CSET(ms))
416 ++ if (MR_IS_TRANSLUCENT_MENU(mr))
417 ++ {
418 ++ Pixmap trans = None;
419 ++ FvwmRenderAttributes fra;
420 ++ colorset_t *colorset = &Colorset[ST_CSET_MENU(ms)];
421 ++
422 ++ fra.mask = 0;
423 ++ if (colorset->translucent_tint_percent > 0)
424 ++ {
425 ++ fra.mask = FRAM_HAVE_TINT;
426 ++ fra.tint = colorset->translucent_tint;
427 ++ fra.tint_percent = colorset->translucent_tint_percent;
428 ++ }
429 ++ if (MR_IS_BACKGROUND_SET(mr) == False)
430 ++ {
431 ++ trans = PGraphicsCreateTranslucent(
432 ++ dpy, MR_WINDOW(mr), &fra,
433 ++ BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
434 ++ MR_X(mr), MR_Y(mr), MR_WIDTH(mr), MR_HEIGHT(mr));
435 ++ XMapRaised(dpy, MR_WINDOW(mr));
436 ++ if (trans != None)
437 ++ {
438 ++ XSetWindowBackgroundPixmap(
439 ++ dpy, MR_WINDOW(mr), trans);
440 ++ MR_IS_BACKGROUND_SET(mr) = True;
441 ++ clear_expose_menu_area(MR_WINDOW(mr), pevent);
442 ++ XFreePixmap(dpy, trans);
443 ++ }
444 ++ }
445 ++ }
446 ++ else if (ms && ST_HAS_MENU_CSET(ms))
447 + {
448 + if (MR_IS_BACKGROUND_SET(mr) == False)
449 + {
450 +@@ -3523,10 +3578,7 @@ static int pop_menu_up(
451 + MR_HAS_POPPED_UP_RIGHT(mr) = 0;
452 + }
453 + MR_XANIMATION(parent_menu) += end_x - prev_x;
454 +- if (ST_HAS_MENU_CSET(MR_STYLE(parent_menu)) &&
455 +- CSET_IS_TRANSPARENT(
456 +- ST_CSET_MENU(
457 +- MR_STYLE(parent_menu))))
458 ++ if (MR_IS_TRANSPARENT_MENU(parent_menu))
459 + {
460 + transparent_bg = True;
461 + get_menu_repaint_transparent_parameters(
462 +@@ -3705,10 +3757,21 @@ static int pop_menu_up(
463 + */
464 +
465 + XMoveWindow(dpy, MR_WINDOW(mr), x, y);
466 ++ MR_X(mr) = x;
467 ++ MR_Y(mr) = y;
468 + XSelectInput(dpy, MR_WINDOW(mr), event_mask);
469 +- XMapRaised(dpy, MR_WINDOW(mr));
470 +- if (popdown_window)
471 +- XUnmapWindow(dpy, popdown_window);
472 ++ if (MR_IS_TRANSLUCENT_MENU(mr))
473 ++ {
474 ++ if (popdown_window)
475 ++ XUnmapWindow(dpy, popdown_window);
476 ++ paint_menu(mr, NULL, fw);
477 ++ }
478 ++ else
479 ++ {
480 ++ XMapRaised(dpy, MR_WINDOW(mr));
481 ++ if (popdown_window)
482 ++ XUnmapWindow(dpy, popdown_window);
483 ++ }
484 + XFlush(dpy);
485 + MR_MAPPED_COPIES(mr)++;
486 + MST_USAGE_COUNT(mr)++;
487 +@@ -6277,16 +6340,122 @@ void update_transparent_menu_bg(
488 + {
489 + last = True;
490 + }
491 +- if (!last && CSET_IS_TRANSPARENT_PR_TINT(ST_CSET_MENU(ms)))
492 ++ if (!last &&
493 ++ (CSET_IS_TRANSPARENT_PR_TINT(ST_CSET_MENU(ms)) ||
494 ++ MR_IS_TRANSLUCENT_MENU(mr)))
495 + {
496 + /* too slow ... */
497 + return;
498 + }
499 +- SetWindowBackgroundWithOffset(
500 +- dpy, MR_WINDOW(mr), step_x - current_x, step_y - current_y,
501 +- MR_WIDTH(mr), MR_HEIGHT(mr),
502 +- &Colorset[ST_CSET_MENU(ms)], Pdepth,
503 +- FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
504 ++ if (MR_IS_TRANSLUCENT_MENU(mr))
505 ++ {
506 ++ Pixmap trans, tmp;
507 ++ FvwmRenderAttributes fra;
508 ++ colorset_t *colorset = &Colorset[ST_CSET_MENU(ms)];
509 ++
510 ++ fra.mask = 0;
511 ++ if (colorset->translucent_tint_percent > 0)
512 ++ {
513 ++ fra.mask = FRAM_HAVE_TINT;
514 ++ fra.tint = colorset->translucent_tint;
515 ++ fra.tint_percent = colorset->translucent_tint_percent;
516 ++ }
517 ++ if (current_x == step_x)
518 ++ {
519 ++ /* Reuse the old pixmap for the part of the menu
520 ++ * that has not moved. (This can be extended to get
521 ++ * two new rectangles, one in each direction)
522 ++ *
523 ++ * It saves the unmapping of the window and makes
524 ++ * Things less flickering.
525 ++ */
526 ++ GC my_gc;
527 ++ unsigned long valuemask = GCSubwindowMode;
528 ++ XGCValues values;
529 ++ int out_y=0;
530 ++ values.subwindow_mode = IncludeInferiors;
531 ++ if (step_y < 0)
532 ++ {
533 ++ out_y = -step_y;
534 ++ }
535 ++ trans = XCreatePixmap(dpy, MR_WINDOW(mr), MR_WIDTH(mr),
536 ++ MR_HEIGHT(mr), Pdepth);
537 ++ my_gc = fvwmlib_XCreateGC(dpy, MR_WINDOW(mr), 0, NULL);
538 ++ XChangeGC(dpy, my_gc, valuemask, &values);
539 ++
540 ++ XClearWindow(dpy, MR_WINDOW(mr));
541 ++
542 ++ if (current_y < step_y)
543 ++ {
544 ++ XCopyArea(dpy, MR_WINDOW(mr), trans, my_gc, 0,
545 ++ step_y-current_y, MR_WIDTH(mr),
546 ++ MR_HEIGHT(mr)-(step_y-current_y),
547 ++ 0,0);
548 ++ tmp = PGraphicsCreateTranslucent(
549 ++ dpy, MR_WINDOW(mr), &fra,
550 ++ BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
551 ++ current_x, current_y+MR_HEIGHT(mr),
552 ++ MR_WIDTH(mr), step_y-current_y);
553 ++
554 ++ XCopyArea(dpy, tmp, trans, my_gc, 0, 0,
555 ++ MR_WIDTH(mr), step_y-current_y,0,
556 ++ MR_HEIGHT(mr)-(step_y-current_y));
557 ++ }
558 ++ else
559 ++ {
560 ++ XCopyArea(dpy, MR_WINDOW(mr), trans, my_gc, 0,
561 ++ 0, MR_WIDTH(mr),
562 ++ MR_HEIGHT(mr)-(current_y-step_y), 0,
563 ++ current_y-step_y);
564 ++ tmp = PGraphicsCreateTranslucent(
565 ++ dpy, MR_WINDOW(mr), &fra,
566 ++ BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
567 ++ current_x,step_y, MR_WIDTH(mr),
568 ++ current_y-step_y);
569 ++ XCopyArea(dpy, tmp, trans, my_gc, 0, 0,
570 ++ MR_WIDTH(mr), current_y-step_y,0,
571 ++ out_y);
572 ++ }
573 ++ MR_X(mr) = step_x;
574 ++ MR_Y(mr) = step_y;
575 ++ XFreePixmap(dpy, tmp);
576 ++ XFreeGC(dpy,my_gc);
577 ++ }
578 ++ else
579 ++ {
580 ++ XUnmapWindow(dpy, MR_WINDOW(mr));
581 ++ MR_X(mr) = step_x;
582 ++ MR_Y(mr) = step_y;
583 ++ trans = PGraphicsCreateTranslucent(
584 ++ dpy, MR_WINDOW(mr), &fra,
585 ++ BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
586 ++ step_x, step_y, MR_WIDTH(mr),
587 ++ MR_HEIGHT(mr));
588 ++ XMapRaised(dpy, MR_WINDOW(mr));
589 ++ }
590 ++ XSetWindowBackgroundPixmap(
591 ++ dpy, MR_WINDOW(mr), trans);
592 ++ XFreePixmap(dpy, trans);
593 ++ if (current_x == step_x)
594 ++ {
595 ++ /* Redraw the border */
596 ++ RelieveRectangle(
597 ++ dpy, MR_WINDOW(mr), 0, 0, MR_WIDTH(mr) - 1,
598 ++ MR_HEIGHT(mr) - 1, (Pdepth < 2) ?
599 ++ SHADOW_GC(MST_MENU_INACTIVE_GCS(mr)) :
600 ++ HILIGHT_GC(MST_MENU_INACTIVE_GCS(mr)),
601 ++ SHADOW_GC(MST_MENU_INACTIVE_GCS(mr)),
602 ++ MST_BORDER_WIDTH(mr));
603 ++ }
604 ++ }
605 ++ else
606 ++ {
607 ++ SetWindowBackgroundWithOffset(
608 ++ dpy, MR_WINDOW(mr), step_x - current_x,
609 ++ step_y - current_y, MR_WIDTH(mr), MR_HEIGHT(mr),
610 ++ &Colorset[ST_CSET_MENU(ms)], Pdepth,
611 ++ FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
612 ++ }
613 + }
614 +
615 +
616 +@@ -6327,10 +6496,7 @@ void repaint_transparent_menu(
617 + }
618 + if (!is_bg_set)
619 + {
620 +- SetWindowBackground(
621 +- dpy, MR_WINDOW(mr), MR_WIDTH(mr), MR_HEIGHT(mr),
622 +- &Colorset[ST_CSET_MENU(ms)], Pdepth,
623 +- FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
624 ++ update_transparent_menu_bg(prtm, x, y, x, y, end_x, end_y);
625 + }
626 + /* redraw the background of non active item */
627 + for (mi = MR_FIRST_ITEM(mr); mi != NULL; mi = MI_NEXT_ITEM(mi))
628 +@@ -6969,7 +7135,10 @@ void UpdateMenuColorset(int cset)
629 + &Colorset[ST_CSET_MENU(ms)],
630 + Pdepth,
631 + FORE_GC(MST_MENU_INACTIVE_GCS(mr)),
632 +- True);
633 ++ False);
634 ++ XClearArea(
635 ++ dpy, MR_WINDOW(mr), 0, 0, MR_WIDTH(mr),
636 ++ MR_HEIGHT(mr), True);
637 + }
638 + else if ((ST_HAS_ACTIVE_CSET(ms) &&
639 + ST_CSET_ACTIVE(ms) == cset) ||
640 +--- a/fvwm/menus.h
641 ++++ b/fvwm/menus.h
642 +@@ -19,6 +19,9 @@
643 + #define IS_MENU_RETURN(x) \
644 + ((x)==MENU_DONE || (x)==MENU_ABORTED || (x)==MENU_SUBMENU_TORN_OFF)
645 +
646 ++#define MR_X(m) ((m)->d->x)
647 ++#define MR_Y(m) ((m)->d->y)
648 ++
649 + struct MenuRoot;
650 + struct MenuStyle;
651 + struct MenuReturn;
652 +--- a/libs/Colorset.h
653 ++++ b/libs/Colorset.h
654 +@@ -53,6 +53,10 @@ typedef struct Colorset
655 + Bool dither;
656 + Bool allows_buffered_transparency;
657 + Bool is_maybe_root_transparent;
658 ++ /* only use by fvwm menu (non tear-off) */
659 ++ Bool is_translucent;
660 ++ Pixel translucent_tint;
661 ++ unsigned int translucent_tint_percent : 7;
662 + #endif
663 + } colorset_t;
664 +
665 +@@ -80,6 +84,7 @@ typedef struct Colorset
666 + #define FG_TINT_SUPPLIED 0x100
667 + #define BG_TINT_SUPPLIED 0x200
668 + #define ICON_TINT_SUPPLIED 0x400
669 ++#define TRANSLUCENT_TINT_SUPPLIED 0x800
670 + #endif
671 +
672 + /* colorsets are stored as an array of structs to permit fast dereferencing */
673 +@@ -154,6 +159,10 @@ extern colorset_t *Colorset;
674 + #define CSETS_IS_TRANSPARENT_PR_TINT(cset) \
675 + (cset != NULL && cset->pixmap == ParentRelative && \
676 + cset->tint_percent > 0)
677 ++#define CSET_IS_TRANSLUCENT(cset) \
678 ++ (cset >= 0 && Colorset[cset].is_translucent)
679 ++#define CSETS_IS_TRANSLUCENT(cset) \
680 ++ (cset && cset->is_translucent)
681 +
682 + #ifndef FVWM_COLORSET_PRIVATE
683 + /* Create n new colorsets, fvwm/colorset.c does its own thing (different size)
684 +--- a/libs/PictureGraphics.c
685 ++++ b/libs/PictureGraphics.c
686 +@@ -1361,7 +1361,7 @@ void PGraphicsTintRectangle(
687 + }
688 + }
689 +
690 +-#if 0 /* humm... maybe useful one day with menus */
691 ++#if 1 /* humm... maybe useful one day with menus */
692 + Pixmap PGraphicsCreateTranslucent(
693 + Display *dpy, Window win, FvwmRenderAttributes *fra, GC gc,
694 + int x, int y, int width, int height)
695 +--- a/libs/PictureGraphics.h
696 ++++ b/libs/PictureGraphics.h
697 +@@ -124,7 +124,9 @@ void PGraphicsTintRectangle(
698 + Display *dpy, Window win, Pixel tint, int tint_percent,
699 + Drawable dest, Bool dest_is_a_window, GC gc, GC mono_gc, GC alpha_gc,
700 + int dest_x, int dest_y, int dest_w, int dest_h);
701 +-
702 ++Pixmap PGraphicsCreateTranslucent(
703 ++ Display *dpy, Window win, FvwmRenderAttributes *fra, GC gc,
704 ++ int x, int y, int width, int height);
705 + /* never used ! */
706 + Pixmap PGraphicsCreateDitherPixmap(
707 + Display *dpy, Window win, Drawable src, Pixmap mask, int depth, GC gc,
708
709 diff --git a/x11-wm/fvwm3/files/fvwm3-9999-goflags.patch b/x11-wm/fvwm3/files/fvwm3-9999-goflags.patch
710 new file mode 100644
711 index 000000000000..fa74f6fb734c
712 --- /dev/null
713 +++ b/x11-wm/fvwm3/files/fvwm3-9999-goflags.patch
714 @@ -0,0 +1,11 @@
715 +--- a/bin/FvwmPrompt/Makefile.am
716 ++++ b/bin/FvwmPrompt/Makefile.am
717 +@@ -1,7 +1,7 @@
718 + if FVWM_BUILD_GOLANG
719 + GOCMD=go
720 + GOBUILD=$(GOCMD) build
721 +-GOFLAGS=-ldflags="-s -w"
722 ++GOFLAGS=
723 + GOCLEAN=$(GOCMD) clean
724 + BINARY_NAME=FvwmPrompt
725 +
726
727 diff --git a/x11-wm/fvwm3/files/fvwm3-9999-htmldoc.patch b/x11-wm/fvwm3/files/fvwm3-9999-htmldoc.patch
728 new file mode 100644
729 index 000000000000..abf6fadc614e
730 --- /dev/null
731 +++ b/x11-wm/fvwm3/files/fvwm3-9999-htmldoc.patch
732 @@ -0,0 +1,43 @@
733 +This patch enables html documentation in >= 1.0.5 of fvwm3
734 +--- a/doc/Makefile.am
735 ++++ b/doc/Makefile.am
736 +@@ -13,22 +13,27 @@ EXTRA_DIST = $(MODULE_ADOC)
737 + nothing:
738 +
739 + clean:
740 +- rm -f *.1 *.ad
741 ++ rm -f *.1 *.ad *.html
742 +
743 + distclean-local: clean
744 +
745 + if FVWM_BUILD_MANDOC
746 +-man1_MANS = $(patsubst %.adoc,%.1, $(MODULE_ADOC))
747 ++man1_MANS = $(MODULE_ADOC:.adoc=.1)
748 ++man1_HTML = $(MODULE_ADOC:.adoc=.html)
749 + EXTRACT_SECTIONS = \
750 + commands \
751 + menus \
752 + styles
753 + SECTION_FILES = $(patsubst %,fvwm3_%.ad, $(EXTRACT_SECTIONS))
754 +
755 +-all: docs
756 ++all: docs html
757 ++
758 + docs: $(man1_MANS)
759 + $(man1_MANS): $(SECTION_FILES)
760 +
761 ++html: $(man1_HTML)
762 ++$(man1_HTML): $(SECTION_FILES)
763 ++
764 + %.ad: fvwm3_manpage_source.adoc
765 + SECTION=$(patsubst fvwm3_%.ad,%,$@); \
766 + cat "$<" | \
767 +@@ -38,4 +43,8 @@ $(man1_MANS): $(SECTION_FILES)
768 +
769 + %.1: %.adoc
770 + "$(ASCIIDOC)" -b manpage -a "$(patsubst %.1,%,$@)" "$<" -o "$@"
771 ++
772 ++%.html: %.adoc
773 ++ "$(ASCIIDOC)" -b html5 -a "$(patsubst %.html,%,$@)" "$<" -o "$@"
774 ++
775 + endif
776
777 diff --git a/x11-wm/fvwm3/files/fvwm3-9999-translucent-menus.patch b/x11-wm/fvwm3/files/fvwm3-9999-translucent-menus.patch
778 new file mode 100644
779 index 000000000000..43b5b0a14403
780 --- /dev/null
781 +++ b/x11-wm/fvwm3/files/fvwm3-9999-translucent-menus.patch
782 @@ -0,0 +1,489 @@
783 +This patch enables some additional translucency "stuff", ported from a series of patches in 2003 (see readme)
784 +--- a/fvwm/colorset.c
785 ++++ b/fvwm/colorset.c
786 +@@ -162,6 +162,8 @@ static char *csetopts[] =
787 + "NoIconTint",
788 + "IconAlpha",
789 +
790 ++ "Translucent",
791 ++ "NoTranslucent",
792 + NULL
793 + };
794 +
795 +@@ -620,6 +622,7 @@ void parse_colorset(int n, char *line)
796 + char *fg_tint = NULL;
797 + char *bg_tint = NULL;
798 + char *icon_tint = NULL;
799 ++ char *translucent_tint = NULL;
800 + Bool have_pixels_changed = False;
801 + Bool has_icon_pixels_changed = False;
802 + Bool has_fg_changed = False;
803 +@@ -632,6 +635,7 @@ void parse_colorset(int n, char *line)
804 + Bool has_fg_tint_changed = False;
805 + Bool has_bg_tint_changed = False;
806 + Bool has_icon_tint_changed = False;
807 ++ Bool has_translucent_tint_changed = False;
808 + Bool has_pixmap_changed = False;
809 + Bool has_shape_changed = False;
810 + Bool has_image_alpha_changed = False;
811 +@@ -758,6 +762,10 @@ void parse_colorset(int n, char *line)
812 + case 21: /* Plain */
813 + has_pixmap_changed = True;
814 + free_colorset_background(cs, True);
815 ++ cs->is_translucent = False;
816 ++ cs->translucent_tint_percent = 0;
817 ++ cs->color_flags &= ~TRANSLUCENT_TINT_SUPPLIED;
818 ++ has_translucent_tint_changed = True;
819 + break;
820 + case 22: /* NoShape */
821 + has_shape_changed = True;
822 +@@ -923,6 +931,24 @@ void parse_colorset(int n, char *line)
823 + cs->icon_alpha_percent = tmp;
824 + }
825 + break;
826 ++ case 42: /* Translucent */
827 ++ cs->is_translucent = True;
828 ++ parse_simple_tint(
829 ++ cs, args, &translucent_tint,
830 ++ TRANSLUCENT_TINT_SUPPLIED,
831 ++ &has_translucent_tint_changed, &percent,
832 ++ "Translucent");
833 ++ if (has_translucent_tint_changed)
834 ++ {
835 ++ cs->translucent_tint_percent = percent;
836 ++ }
837 ++ break;
838 ++ case 43: /* NoTranslucent */
839 ++ cs->is_translucent = False;
840 ++ cs->translucent_tint_percent = 0;
841 ++ cs->color_flags &= ~TRANSLUCENT_TINT_SUPPLIED;
842 ++ has_translucent_tint_changed = True;
843 ++ break;
844 + default:
845 + /* test for ?Gradient */
846 + if (option[0] && StrEquals(&option[1], "Gradient"))
847 +@@ -1624,6 +1650,27 @@ void parse_colorset(int n, char *line)
848 + }
849 + }
850 +
851 ++ /*
852 ++ * ---------- change the translucent tint colour ----------
853 ++ */
854 ++ if (has_translucent_tint_changed)
855 ++ {
856 ++ /* user specified colour */
857 ++ if (translucent_tint != NULL)
858 ++ {
859 ++ PictureFreeColors(
860 ++ dpy, Pcmap, &cs->translucent_tint, 1, 0, True);
861 ++ cs->translucent_tint = GetColor(translucent_tint);
862 ++ }
863 ++ else
864 ++ {
865 ++ /* default */
866 ++ PictureFreeColors(
867 ++ dpy, Pcmap, &cs->translucent_tint, 1, 0, True);
868 ++ cs->translucent_tint = GetColor(black);
869 ++ }
870 ++ }
871 ++
872 + /*
873 + * ---------- send new colorset to fvwm and clean up ----------
874 + */
875 +@@ -1720,6 +1767,7 @@ void alloc_colorset(int n)
876 + ncs->fgsh = GetColor(white);
877 + ncs->tint = GetColor(black);
878 + ncs->icon_tint = GetColor(black);
879 ++ ncs->translucent_tint = GetColor(black);
880 + ncs->pixmap = XCreatePixmapFromBitmapData(
881 + dpy, Scr.NoFocusWin,
882 + &g_bits[4 * (nColorsets % 3)], 4, 4,
883 +@@ -1737,6 +1785,7 @@ void alloc_colorset(int n)
884 + ncs->fgsh = GetForeShadow(ncs->fg, ncs->bg);
885 + ncs->tint = GetColor(black);
886 + ncs->icon_tint = GetColor(black);
887 ++ ncs->translucent_tint = GetColor(black);
888 + }
889 + ncs->fg_tint = ncs->bg_tint = GetColor(black);
890 + /* set flags for fg contrast, bg average */
891 +@@ -1748,6 +1797,7 @@ void alloc_colorset(int n)
892 + ncs->icon_alpha_percent = 100;
893 + ncs->tint_percent = 0;
894 + ncs->icon_tint_percent = 0;
895 ++ ncs->translucent_tint_percent = 0;
896 + ncs->fg_tint_percent = ncs->bg_tint_percent = 0;
897 + ncs->dither = (PictureDitherByDefault())? True:False;
898 + nColorsets++;
899 +--- a/fvwm/menuroot.h
900 ++++ b/fvwm/menuroot.h
901 +@@ -147,6 +147,9 @@ typedef struct MenuRootDynamic
902 + int d_npixels;
903 + } stored_pixels;
904 + /* alloc pixels when dithering is used for gradients */
905 ++ /* x,y XMapRaise */
906 ++ int x;
907 ++ int y;
908 + } MenuRootDynamic;
909 +
910 + /* access macros to dynamic menu members */
911 +--- a/fvwm/menus.c
912 ++++ b/fvwm/menus.c
913 +@@ -76,6 +76,18 @@
914 + (ctx).menu_root.menu_root = (root))
915 + #define SCTX_GET_MR(ctx) ((ctx).type == SCTX_MENU_ROOT ? \
916 + (ctx).menu_root.menu_root : NULL)
917 ++#define MENU_IS_TRANSLUCENT(mr,cs) \
918 ++ (!MR_IS_TEAR_OFF_MENU(mr) && CSET_IS_TRANSLUCENT(cs))
919 ++#define MENU_IS_TRANSPARENT(mr,cs) \
920 ++ (MENU_IS_TRANSLUCENT(mr,cs) || CSET_IS_TRANSPARENT(cs))
921 ++#define MR_IS_TRANSLUCENT_MENU(mr) \
922 ++ (!MR_IS_TEAR_OFF_MENU(mr) && MR_STYLE(mr) && \
923 ++ ST_HAS_MENU_CSET(MR_STYLE(mr)) && CSET_IS_TRANSLUCENT( \
924 ++ ST_CSET_MENU(MR_STYLE(mr))))
925 ++#define MR_IS_TRANSPARENT_MENU(mr) \
926 ++ (MR_IS_TRANSLUCENT_MENU(mr) || (MR_STYLE(mr) && \
927 ++ ST_HAS_MENU_CSET(MR_STYLE(mr)) && CSET_IS_TRANSPARENT( \
928 ++ ST_CSET_MENU(MR_STYLE(mr)))))
929 +
930 + /* ---------------------------- imports ------------------------------------ */
931 +
932 +@@ -219,6 +231,8 @@ typedef struct mloop_static_info_t
933 + } mloop_static_info_t;
934 +
935 + /* ---------------------------- forward declarations ----------------------- */
936 ++static MenuRoot *seek_submenu_instance(
937 ++ MenuRoot *parent_menu, MenuItem *parent_item);
938 +
939 + /* ---------------------------- local variables ---------------------------- */
940 +
941 +@@ -380,12 +394,22 @@ static void animated_move_back(
942 + Bool transparent_bg = False;
943 +
944 + /* move it back */
945 +- if (ST_HAS_MENU_CSET(MR_STYLE(mr)) &&
946 +- CSET_IS_TRANSPARENT(ST_CSET_MENU(MR_STYLE(mr))))
947 ++ if (MR_IS_TRANSPARENT_MENU(mr))
948 + {
949 + transparent_bg = True;
950 + get_menu_repaint_transparent_parameters(
951 + &mrtp, mr, fw);
952 ++ if (MR_IS_TRANSLUCENT_MENU(mr) && MR_SUBMENU_ITEM(mr))
953 ++ {
954 ++ MenuRoot *smr;
955 ++ smr = seek_submenu_instance(
956 ++ mr, MR_SUBMENU_ITEM(mr));
957 ++ if (smr)
958 ++ {
959 ++ /* just unmap it here, popdown later */
960 ++ XUnmapWindow(dpy, MR_WINDOW(smr));
961 ++ }
962 ++ }
963 + }
964 + end.x = start.x - MR_XANIMATION(mr);
965 + end.y = start.y;
966 +@@ -1914,6 +1938,7 @@ static void make_menu_window(MenuRoot *mr, Bool is_tear_off)
967 + /* Doh. Use the standard display instead. */
968 + MR_CREATE_DPY(mr) = dpy;
969 + }
970 ++ MR_IS_TEAR_OFF_MENU(mr) = 1;
971 + }
972 + else
973 + {
974 +@@ -2718,7 +2743,37 @@ static void paint_menu(
975 + }
976 + MR_IS_PAINTED(mr) = 1;
977 + /* paint the menu background */
978 +- if (ms && ST_HAS_MENU_CSET(ms))
979 ++ if (MR_IS_TRANSLUCENT_MENU(mr))
980 ++ {
981 ++ Pixmap trans = None;
982 ++ FvwmRenderAttributes fra;
983 ++ colorset_t *colorset = &Colorset[ST_CSET_MENU(ms)];
984 ++
985 ++ fra.mask = 0;
986 ++ if (colorset->translucent_tint_percent > 0)
987 ++ {
988 ++ fra.mask = FRAM_HAVE_TINT;
989 ++ fra.tint = colorset->translucent_tint;
990 ++ fra.tint_percent = colorset->translucent_tint_percent;
991 ++ }
992 ++ if (MR_IS_BACKGROUND_SET(mr) == False)
993 ++ {
994 ++ trans = PGraphicsCreateTranslucent(
995 ++ dpy, MR_WINDOW(mr), &fra,
996 ++ BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
997 ++ MR_X(mr), MR_Y(mr), MR_WIDTH(mr), MR_HEIGHT(mr));
998 ++ XMapRaised(dpy, MR_WINDOW(mr));
999 ++ if (trans != None)
1000 ++ {
1001 ++ XSetWindowBackgroundPixmap(
1002 ++ dpy, MR_WINDOW(mr), trans);
1003 ++ MR_IS_BACKGROUND_SET(mr) = True;
1004 ++ clear_expose_menu_area(MR_WINDOW(mr), pevent);
1005 ++ XFreePixmap(dpy, trans);
1006 ++ }
1007 ++ }
1008 ++ }
1009 ++ else if (ms && ST_HAS_MENU_CSET(ms))
1010 + {
1011 + if (MR_IS_BACKGROUND_SET(mr) == False)
1012 + {
1013 +@@ -3527,10 +3582,7 @@ static int pop_menu_up(
1014 + MR_HAS_POPPED_UP_RIGHT(mr) = 0;
1015 + }
1016 + MR_XANIMATION(parent_menu) += end_x - prev_x;
1017 +- if (ST_HAS_MENU_CSET(MR_STYLE(parent_menu)) &&
1018 +- CSET_IS_TRANSPARENT(
1019 +- ST_CSET_MENU(
1020 +- MR_STYLE(parent_menu))))
1021 ++ if (MR_IS_TRANSPARENT_MENU(parent_menu))
1022 + {
1023 + transparent_bg = True;
1024 + get_menu_repaint_transparent_parameters(
1025 +@@ -3713,10 +3765,21 @@ static int pop_menu_up(
1026 + */
1027 +
1028 + XMoveWindow(dpy, MR_WINDOW(mr), x, y);
1029 ++ MR_X(mr) = x;
1030 ++ MR_Y(mr) = y;
1031 + XSelectInput(dpy, MR_WINDOW(mr), event_mask);
1032 +- XMapRaised(dpy, MR_WINDOW(mr));
1033 +- if (popdown_window)
1034 +- XUnmapWindow(dpy, popdown_window);
1035 ++ if (MR_IS_TRANSLUCENT_MENU(mr))
1036 ++ {
1037 ++ if (popdown_window)
1038 ++ XUnmapWindow(dpy, popdown_window);
1039 ++ paint_menu(mr, NULL, fw);
1040 ++ }
1041 ++ else
1042 ++ {
1043 ++ XMapRaised(dpy, MR_WINDOW(mr));
1044 ++ if (popdown_window)
1045 ++ XUnmapWindow(dpy, popdown_window);
1046 ++ }
1047 + XFlush(dpy);
1048 + MR_MAPPED_COPIES(mr)++;
1049 + MST_USAGE_COUNT(mr)++;
1050 +@@ -6286,16 +6349,122 @@ void update_transparent_menu_bg(
1051 + {
1052 + last = True;
1053 + }
1054 +- if (!last && CSET_IS_TRANSPARENT_PR_TINT(ST_CSET_MENU(ms)))
1055 ++ if (!last &&
1056 ++ (CSET_IS_TRANSPARENT_PR_TINT(ST_CSET_MENU(ms)) ||
1057 ++ MR_IS_TRANSLUCENT_MENU(mr)))
1058 + {
1059 + /* too slow ... */
1060 + return;
1061 + }
1062 +- SetWindowBackgroundWithOffset(
1063 +- dpy, MR_WINDOW(mr), step_x - current_x, step_y - current_y,
1064 +- MR_WIDTH(mr), MR_HEIGHT(mr),
1065 +- &Colorset[ST_CSET_MENU(ms)], Pdepth,
1066 +- FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
1067 ++ if (MR_IS_TRANSLUCENT_MENU(mr))
1068 ++ {
1069 ++ Pixmap trans, tmp;
1070 ++ FvwmRenderAttributes fra;
1071 ++ colorset_t *colorset = &Colorset[ST_CSET_MENU(ms)];
1072 ++
1073 ++ fra.mask = 0;
1074 ++ if (colorset->translucent_tint_percent > 0)
1075 ++ {
1076 ++ fra.mask = FRAM_HAVE_TINT;
1077 ++ fra.tint = colorset->translucent_tint;
1078 ++ fra.tint_percent = colorset->translucent_tint_percent;
1079 ++ }
1080 ++ if (current_x == step_x)
1081 ++ {
1082 ++ /* Reuse the old pixmap for the part of the menu
1083 ++ * that has not moved. (This can be extended to get
1084 ++ * two new rectangles, one in each direction)
1085 ++ *
1086 ++ * It saves the unmapping of the window and makes
1087 ++ * Things less flickering.
1088 ++ */
1089 ++ GC my_gc;
1090 ++ unsigned long valuemask = GCSubwindowMode;
1091 ++ XGCValues values;
1092 ++ int out_y=0;
1093 ++ values.subwindow_mode = IncludeInferiors;
1094 ++ if (step_y < 0)
1095 ++ {
1096 ++ out_y = -step_y;
1097 ++ }
1098 ++ trans = XCreatePixmap(dpy, MR_WINDOW(mr), MR_WIDTH(mr),
1099 ++ MR_HEIGHT(mr), Pdepth);
1100 ++ my_gc = fvwmlib_XCreateGC(dpy, MR_WINDOW(mr), 0, NULL);
1101 ++ XChangeGC(dpy, my_gc, valuemask, &values);
1102 ++
1103 ++ XClearWindow(dpy, MR_WINDOW(mr));
1104 ++
1105 ++ if (current_y < step_y)
1106 ++ {
1107 ++ XCopyArea(dpy, MR_WINDOW(mr), trans, my_gc, 0,
1108 ++ step_y-current_y, MR_WIDTH(mr),
1109 ++ MR_HEIGHT(mr)-(step_y-current_y),
1110 ++ 0,0);
1111 ++ tmp = PGraphicsCreateTranslucent(
1112 ++ dpy, MR_WINDOW(mr), &fra,
1113 ++ BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
1114 ++ current_x, current_y+MR_HEIGHT(mr),
1115 ++ MR_WIDTH(mr), step_y-current_y);
1116 ++
1117 ++ XCopyArea(dpy, tmp, trans, my_gc, 0, 0,
1118 ++ MR_WIDTH(mr), step_y-current_y,0,
1119 ++ MR_HEIGHT(mr)-(step_y-current_y));
1120 ++ }
1121 ++ else
1122 ++ {
1123 ++ XCopyArea(dpy, MR_WINDOW(mr), trans, my_gc, 0,
1124 ++ 0, MR_WIDTH(mr),
1125 ++ MR_HEIGHT(mr)-(current_y-step_y), 0,
1126 ++ current_y-step_y);
1127 ++ tmp = PGraphicsCreateTranslucent(
1128 ++ dpy, MR_WINDOW(mr), &fra,
1129 ++ BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
1130 ++ current_x,step_y, MR_WIDTH(mr),
1131 ++ current_y-step_y);
1132 ++ XCopyArea(dpy, tmp, trans, my_gc, 0, 0,
1133 ++ MR_WIDTH(mr), current_y-step_y,0,
1134 ++ out_y);
1135 ++ }
1136 ++ MR_X(mr) = step_x;
1137 ++ MR_Y(mr) = step_y;
1138 ++ XFreePixmap(dpy, tmp);
1139 ++ XFreeGC(dpy,my_gc);
1140 ++ }
1141 ++ else
1142 ++ {
1143 ++ XUnmapWindow(dpy, MR_WINDOW(mr));
1144 ++ MR_X(mr) = step_x;
1145 ++ MR_Y(mr) = step_y;
1146 ++ trans = PGraphicsCreateTranslucent(
1147 ++ dpy, MR_WINDOW(mr), &fra,
1148 ++ BACK_GC(ST_MENU_INACTIVE_GCS(ms)),
1149 ++ step_x, step_y, MR_WIDTH(mr),
1150 ++ MR_HEIGHT(mr));
1151 ++ XMapRaised(dpy, MR_WINDOW(mr));
1152 ++ }
1153 ++ XSetWindowBackgroundPixmap(
1154 ++ dpy, MR_WINDOW(mr), trans);
1155 ++ XFreePixmap(dpy, trans);
1156 ++ if (current_x == step_x)
1157 ++ {
1158 ++ /* Redraw the border */
1159 ++ RelieveRectangle(
1160 ++ dpy, MR_WINDOW(mr), 0, 0, MR_WIDTH(mr) - 1,
1161 ++ MR_HEIGHT(mr) - 1, (Pdepth < 2) ?
1162 ++ SHADOW_GC(MST_MENU_INACTIVE_GCS(mr)) :
1163 ++ HILIGHT_GC(MST_MENU_INACTIVE_GCS(mr)),
1164 ++ SHADOW_GC(MST_MENU_INACTIVE_GCS(mr)),
1165 ++ MST_BORDER_WIDTH(mr));
1166 ++ }
1167 ++ }
1168 ++ else
1169 ++ {
1170 ++ SetWindowBackgroundWithOffset(
1171 ++ dpy, MR_WINDOW(mr), step_x - current_x,
1172 ++ step_y - current_y, MR_WIDTH(mr), MR_HEIGHT(mr),
1173 ++ &Colorset[ST_CSET_MENU(ms)], Pdepth,
1174 ++ FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
1175 ++ }
1176 + }
1177 +
1178 +
1179 +@@ -6336,10 +6505,7 @@ void repaint_transparent_menu(
1180 + }
1181 + if (!is_bg_set)
1182 + {
1183 +- SetWindowBackground(
1184 +- dpy, MR_WINDOW(mr), MR_WIDTH(mr), MR_HEIGHT(mr),
1185 +- &Colorset[ST_CSET_MENU(ms)], Pdepth,
1186 +- FORE_GC(MST_MENU_INACTIVE_GCS(mr)), False);
1187 ++ update_transparent_menu_bg(prtm, x, y, x, y, end_x, end_y);
1188 + }
1189 + /* redraw the background of non active item */
1190 + for (mi = MR_FIRST_ITEM(mr); mi != NULL; mi = MI_NEXT_ITEM(mi))
1191 +@@ -6978,7 +7144,10 @@ void UpdateMenuColorset(int cset)
1192 + &Colorset[ST_CSET_MENU(ms2)],
1193 + Pdepth,
1194 + FORE_GC(MST_MENU_INACTIVE_GCS(mr)),
1195 +- True);
1196 ++ False);
1197 ++ XClearArea(
1198 ++ dpy, MR_WINDOW(mr), 0, 0, MR_WIDTH(mr),
1199 ++ MR_HEIGHT(mr), True);
1200 + }
1201 + else if ((ST_HAS_ACTIVE_CSET(ms2) &&
1202 + ST_CSET_ACTIVE(ms2) == cset) ||
1203 +--- a/fvwm/menus.h
1204 ++++ b/fvwm/menus.h
1205 +@@ -19,6 +19,9 @@
1206 + #define IS_MENU_RETURN(x) \
1207 + ((x)==MENU_DONE || (x)==MENU_ABORTED || (x)==MENU_SUBMENU_TORN_OFF)
1208 +
1209 ++#define MR_X(m) ((m)->d->x)
1210 ++#define MR_Y(m) ((m)->d->y)
1211 ++
1212 + struct MenuRoot;
1213 + struct MenuStyle;
1214 + struct MenuReturn;
1215 +--- a/libs/Colorset.h
1216 ++++ b/libs/Colorset.h
1217 +@@ -53,6 +53,10 @@ typedef struct Colorset
1218 + Bool dither;
1219 + Bool allows_buffered_transparency;
1220 + Bool is_maybe_root_transparent;
1221 ++ /* only use by fvwm menu (non tear-off) */
1222 ++ Bool is_translucent;
1223 ++ Pixel translucent_tint;
1224 ++ unsigned int translucent_tint_percent : 7;
1225 + #endif
1226 + } colorset_t;
1227 +
1228 +@@ -80,6 +84,7 @@ typedef struct Colorset
1229 + #define FG_TINT_SUPPLIED 0x100
1230 + #define BG_TINT_SUPPLIED 0x200
1231 + #define ICON_TINT_SUPPLIED 0x400
1232 ++#define TRANSLUCENT_TINT_SUPPLIED 0x800
1233 + #endif
1234 +
1235 + /* colorsets are stored as an array of structs to permit fast dereferencing */
1236 +@@ -155,6 +160,11 @@ extern colorset_t *Colorset;
1237 + (cset != NULL && cset->pixmap == ParentRelative && \
1238 + cset->tint_percent > 0)
1239 +
1240 ++#define CSET_IS_TRANSLUCENT(cset) \
1241 ++ (cset >= 0 && Colorset[cset].is_translucent)
1242 ++#define CSETS_IS_TRANSLUCENT(cset) \
1243 ++ (cset && cset->is_translucent)
1244 ++
1245 + #ifndef FVWM_COLORSET_PRIVATE
1246 + /* Create n new colorsets, fvwm/colorset.c does its own thing (different size)
1247 + */
1248 +--- a/libs/PictureGraphics.c
1249 ++++ b/libs/PictureGraphics.c
1250 +@@ -1361,7 +1361,7 @@ void PGraphicsTintRectangle(
1251 + }
1252 + }
1253 +
1254 +-#if 0 /* humm... maybe useful one day with menus */
1255 ++#if 1 /* humm... maybe useful one day with menus */
1256 + Pixmap PGraphicsCreateTranslucent(
1257 + Display *dpy, Window win, FvwmRenderAttributes *fra, GC gc,
1258 + int x, int y, int width, int height)
1259 +--- a/libs/PictureGraphics.h
1260 ++++ b/libs/PictureGraphics.h
1261 +@@ -124,7 +124,9 @@ void PGraphicsTintRectangle(
1262 + Display *dpy, Window win, Pixel tint, int tint_percent,
1263 + Drawable dest, Bool dest_is_a_window, GC gc, GC mono_gc, GC alpha_gc,
1264 + int dest_x, int dest_y, int dest_w, int dest_h);
1265 +-
1266 ++Pixmap PGraphicsCreateTranslucent(
1267 ++ Display *dpy, Window win, FvwmRenderAttributes *fra, GC gc,
1268 ++ int x, int y, int width, int height);
1269 + /* never used ! */
1270 + Pixmap PGraphicsCreateDitherPixmap(
1271 + Display *dpy, Window win, Drawable src, Pixmap mask, int depth, GC gc,
1272
1273 diff --git a/x11-wm/fvwm3/fvwm3-1.0.4.ebuild b/x11-wm/fvwm3/fvwm3-1.0.4.ebuild
1274 new file mode 100644
1275 index 000000000000..cbafa1cafe1d
1276 --- /dev/null
1277 +++ b/x11-wm/fvwm3/fvwm3-1.0.4.ebuild
1278 @@ -0,0 +1,204 @@
1279 +# Copyright 1999-2022 Gentoo Authors
1280 +# Distributed under the terms of the GNU General Public License v2
1281 +
1282 +EAPI=8
1283 +
1284 +PYTHON_COMPAT=( python3_{8..11} )
1285 +GO_OPTIONAL=1
1286 +inherit autotools desktop flag-o-matic go-module python-single-r1
1287 +
1288 +DESCRIPTION="A multiple large virtual desktop window manager derived from fvwm"
1289 +HOMEPAGE="http://www.fvwm.org/"
1290 +
1291 +if [[ ${PV} == 9999 ]]; then
1292 + inherit git-r3
1293 + EGIT_REPO_URI="https://github.com/fvwmorg/fvwm3.git"
1294 + EGIT_BRANCH="master"
1295 +else
1296 + SRC_URI="https://github.com/fvwmorg/fvwm3/releases/download/${PV}/${P}.tar.gz"
1297 + KEYWORDS="~amd64"
1298 +fi
1299 +
1300 +SRC_URI+=" https://gitlab.com/Matt.Jolly/fvwm3-go-deps/-/raw/${PV}/${P}-deps.tar.xz?inline=false -> ${P}-deps.tar.xz"
1301 +
1302 +LICENSE="GPL-2+ FVWM
1303 + go? (
1304 + Apache-2.0
1305 + BSD
1306 + MIT
1307 + )"
1308 +
1309 +SLOT="0"
1310 +
1311 +IUSE="bidi debug doc go netpbm nls perl png readline rplay stroke svg tk truetype vanilla lock"
1312 +REQUIRED_USE="
1313 + ${PYTHON_REQUIRED_USE}"
1314 +
1315 +DOCS=( NEWS )
1316 +
1317 +if [[ ${PV} == 9999 ]]; then
1318 + 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 )
1319 +fi
1320 +
1321 +BDEPEND="
1322 + virtual/pkgconfig
1323 + doc? ( dev-libs/libxslt
1324 + dev-ruby/asciidoctor )
1325 + app-arch/unzip
1326 + go? ( >=dev-lang/go-1.14 )
1327 +"
1328 +
1329 +RDEPEND="${PYTHON_DEPS}
1330 + ${COMMON_DEPEND}
1331 + !x11-wm/fvwm
1332 + dev-libs/glib:2
1333 + dev-libs/libevent:=
1334 + dev-lang/perl
1335 + sys-libs/zlib
1336 + x11-libs/libICE
1337 + x11-libs/libSM
1338 + x11-libs/libX11
1339 + x11-libs/libXau
1340 + x11-libs/libxcb
1341 + x11-libs/libXcursor
1342 + x11-libs/libXdmcp
1343 + x11-libs/libXext
1344 + x11-libs/libXfixes
1345 + x11-libs/libXpm
1346 + x11-libs/libXrandr
1347 + x11-libs/libXrender
1348 + bidi? ( dev-libs/fribidi )
1349 + lock? ( x11-misc/xlockmore )
1350 + netpbm? ( media-libs/netpbm )
1351 + perl? ( tk? (
1352 + dev-lang/tk
1353 + dev-perl/Tk
1354 + >=dev-perl/X11-Protocol-0.56
1355 + )
1356 + )
1357 + png? ( media-libs/libpng:= )
1358 + readline? (
1359 + sys-libs/ncurses:=
1360 + sys-libs/readline:=
1361 + )
1362 + rplay? ( media-sound/rplay )
1363 + stroke? ( dev-libs/libstroke )
1364 + svg? (
1365 + gnome-base/librsvg:2
1366 + x11-libs/cairo
1367 + )
1368 + truetype? (
1369 + media-libs/fontconfig
1370 + x11-libs/libXft
1371 + )
1372 + userland_GNU? ( sys-apps/debianutils )"
1373 +
1374 +DEPEND="${COMMON_DEPEND}
1375 + x11-base/xorg-proto"
1376 +
1377 +PATCHES=(
1378 + "${FILESDIR}/${P}-translucent-menus.patch"
1379 +)
1380 +
1381 +if [[ ${PV} == 9999 ]]; then
1382 + PATCHES+=(
1383 + "${FILESDIR}/${P}-goflags.patch"
1384 + )
1385 +fi
1386 +
1387 +src_unpack() {
1388 + if [[ ${PV} == 9999 ]]; then
1389 + einfo "The branch ${EGIT_BRANCH} will be installed."
1390 + git-r3_src_unpack
1391 + else
1392 + unpack "${P}".tar.gz
1393 + fi
1394 + unpack "${P}"-deps.tar.xz
1395 + mv go-mod ${P}/bin/FvwmPrompt/ || die
1396 +}
1397 +
1398 +src_prepare() {
1399 + default
1400 + if use doc; then
1401 + eapply "${FILESDIR}/${P}-htmldoc.patch"
1402 + fi
1403 +
1404 + sed -i '/^@FVWM_BUILD_GOLANG_TRUE@GOBUILD = $(GOCMD) build/s/$/ -mod=mod/' \
1405 + bin/FvwmPrompt/Makefile.in || die "Updating go build paramaters failed."
1406 +
1407 + eautoreconf
1408 +}
1409 +
1410 +src_configure() {
1411 + # Non-upstream email where bugs should be sent; used in fvwm-bug.
1412 + export FVWM_BUGADDR="desktop-wm@××××××××.org"
1413 +
1414 + # Recommended by upstream for release. Doesn't really matter for live ebuilds.
1415 + append-flags -fno-strict-aliasing
1416 +
1417 + # Signed chars are required.
1418 + for arch in arm arm64 ppc ppc64; do
1419 + use $arch && append-flags -fsigned-chars
1420 + done
1421 +
1422 + local myconf=(
1423 + --prefix=/usr
1424 + --with-imagepath=/usr/include/X11/bitmaps:/usr/include/X11/pixmaps:/usr/share/icons/fvwm
1425 + --enable-package-subdirs
1426 + $(use_enable bidi)
1427 + $(use_enable doc mandoc)
1428 + $(use_enable go golang)
1429 + $(use_enable nls)
1430 + $(use_enable nls iconv)
1431 + $(use_enable perl perllib)
1432 + $(use_enable png)
1433 + $(use_with readline readline-library)
1434 + $(use_enable svg rsvg)
1435 + $(use_enable truetype xft)
1436 + --docdir=/usr/share/doc/${P}
1437 + )
1438 +
1439 + use readline && myconf+=( --without-termcap-library )
1440 +
1441 + econf ${myconf[@]}
1442 +}
1443 +
1444 +src_compile() {
1445 + PREFIX="/usr" emake
1446 + if [[ ${PV} == *9999 ]]; then
1447 + use doc && emake -C doc html
1448 + fi
1449 +}
1450 +
1451 +src_install() {
1452 + emake DESTDIR="${ED}" prefix="/usr" exec_prefix="/usr" datarootdir="/usr/share" install
1453 +
1454 + dodir /etc/X11/Sessions
1455 + echo "/usr/bin/fvwm3" > "${ED}/etc/X11/Sessions/${PN}" || die
1456 + fperms a+x /etc/X11/Sessions/${PN} || die
1457 +
1458 + python_scriptinto "/usr/bin"
1459 + python_doscript "${ED}/usr/bin/FvwmCommand" "${ED}/usr/bin/fvwm-menu-desktop"
1460 + if use doc; then
1461 + if [[ ${PV} == *9999 ]]; then
1462 + HTML_DOCS=( doc/*.html )
1463 + else
1464 + HTML_DOCS=( doc/html/*.html )
1465 + fi
1466 + fi
1467 + einstalldocs
1468 +
1469 + make_session_desktop fvwm3 /usr/bin/fvwm3
1470 +}
1471 +
1472 +pkg_postinst() {
1473 + if use go; then
1474 + ewarn "FvwmPrompt has been installed, it provides the functionality of both FvwmCommand and FvwmConsole."
1475 + ewarn "For compatibility with the existing fvwm2 configurations, the ebuild will install a FvwmCommand wrapper script."
1476 + ewarn "If you need FvwmConsole, install ${PN} with USE=\"-go\", but FvwmPrompt and FvwmCommnd will not be installed."
1477 + else
1478 + ewarn "Fvwmconsole has been installed, but FvwmCommand and FvwmPrompt are no longer included in this ebuild."
1479 + ewarn "If you need FvwmPrompt or FvwmCommand, install ${PN} with USE=\"go\"."
1480 + ewarn "In that case, FvwmPrompt will replace FvwmConsole and provide the same functionality in a more flexible way."
1481 + fi
1482 +}
1483
1484 diff --git a/x11-wm/fvwm3/fvwm3-9999.ebuild b/x11-wm/fvwm3/fvwm3-9999.ebuild
1485 new file mode 100644
1486 index 000000000000..cbafa1cafe1d
1487 --- /dev/null
1488 +++ b/x11-wm/fvwm3/fvwm3-9999.ebuild
1489 @@ -0,0 +1,204 @@
1490 +# Copyright 1999-2022 Gentoo Authors
1491 +# Distributed under the terms of the GNU General Public License v2
1492 +
1493 +EAPI=8
1494 +
1495 +PYTHON_COMPAT=( python3_{8..11} )
1496 +GO_OPTIONAL=1
1497 +inherit autotools desktop flag-o-matic go-module python-single-r1
1498 +
1499 +DESCRIPTION="A multiple large virtual desktop window manager derived from fvwm"
1500 +HOMEPAGE="http://www.fvwm.org/"
1501 +
1502 +if [[ ${PV} == 9999 ]]; then
1503 + inherit git-r3
1504 + EGIT_REPO_URI="https://github.com/fvwmorg/fvwm3.git"
1505 + EGIT_BRANCH="master"
1506 +else
1507 + SRC_URI="https://github.com/fvwmorg/fvwm3/releases/download/${PV}/${P}.tar.gz"
1508 + KEYWORDS="~amd64"
1509 +fi
1510 +
1511 +SRC_URI+=" https://gitlab.com/Matt.Jolly/fvwm3-go-deps/-/raw/${PV}/${P}-deps.tar.xz?inline=false -> ${P}-deps.tar.xz"
1512 +
1513 +LICENSE="GPL-2+ FVWM
1514 + go? (
1515 + Apache-2.0
1516 + BSD
1517 + MIT
1518 + )"
1519 +
1520 +SLOT="0"
1521 +
1522 +IUSE="bidi debug doc go netpbm nls perl png readline rplay stroke svg tk truetype vanilla lock"
1523 +REQUIRED_USE="
1524 + ${PYTHON_REQUIRED_USE}"
1525 +
1526 +DOCS=( NEWS )
1527 +
1528 +if [[ ${PV} == 9999 ]]; then
1529 + 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 )
1530 +fi
1531 +
1532 +BDEPEND="
1533 + virtual/pkgconfig
1534 + doc? ( dev-libs/libxslt
1535 + dev-ruby/asciidoctor )
1536 + app-arch/unzip
1537 + go? ( >=dev-lang/go-1.14 )
1538 +"
1539 +
1540 +RDEPEND="${PYTHON_DEPS}
1541 + ${COMMON_DEPEND}
1542 + !x11-wm/fvwm
1543 + dev-libs/glib:2
1544 + dev-libs/libevent:=
1545 + dev-lang/perl
1546 + sys-libs/zlib
1547 + x11-libs/libICE
1548 + x11-libs/libSM
1549 + x11-libs/libX11
1550 + x11-libs/libXau
1551 + x11-libs/libxcb
1552 + x11-libs/libXcursor
1553 + x11-libs/libXdmcp
1554 + x11-libs/libXext
1555 + x11-libs/libXfixes
1556 + x11-libs/libXpm
1557 + x11-libs/libXrandr
1558 + x11-libs/libXrender
1559 + bidi? ( dev-libs/fribidi )
1560 + lock? ( x11-misc/xlockmore )
1561 + netpbm? ( media-libs/netpbm )
1562 + perl? ( tk? (
1563 + dev-lang/tk
1564 + dev-perl/Tk
1565 + >=dev-perl/X11-Protocol-0.56
1566 + )
1567 + )
1568 + png? ( media-libs/libpng:= )
1569 + readline? (
1570 + sys-libs/ncurses:=
1571 + sys-libs/readline:=
1572 + )
1573 + rplay? ( media-sound/rplay )
1574 + stroke? ( dev-libs/libstroke )
1575 + svg? (
1576 + gnome-base/librsvg:2
1577 + x11-libs/cairo
1578 + )
1579 + truetype? (
1580 + media-libs/fontconfig
1581 + x11-libs/libXft
1582 + )
1583 + userland_GNU? ( sys-apps/debianutils )"
1584 +
1585 +DEPEND="${COMMON_DEPEND}
1586 + x11-base/xorg-proto"
1587 +
1588 +PATCHES=(
1589 + "${FILESDIR}/${P}-translucent-menus.patch"
1590 +)
1591 +
1592 +if [[ ${PV} == 9999 ]]; then
1593 + PATCHES+=(
1594 + "${FILESDIR}/${P}-goflags.patch"
1595 + )
1596 +fi
1597 +
1598 +src_unpack() {
1599 + if [[ ${PV} == 9999 ]]; then
1600 + einfo "The branch ${EGIT_BRANCH} will be installed."
1601 + git-r3_src_unpack
1602 + else
1603 + unpack "${P}".tar.gz
1604 + fi
1605 + unpack "${P}"-deps.tar.xz
1606 + mv go-mod ${P}/bin/FvwmPrompt/ || die
1607 +}
1608 +
1609 +src_prepare() {
1610 + default
1611 + if use doc; then
1612 + eapply "${FILESDIR}/${P}-htmldoc.patch"
1613 + fi
1614 +
1615 + sed -i '/^@FVWM_BUILD_GOLANG_TRUE@GOBUILD = $(GOCMD) build/s/$/ -mod=mod/' \
1616 + bin/FvwmPrompt/Makefile.in || die "Updating go build paramaters failed."
1617 +
1618 + eautoreconf
1619 +}
1620 +
1621 +src_configure() {
1622 + # Non-upstream email where bugs should be sent; used in fvwm-bug.
1623 + export FVWM_BUGADDR="desktop-wm@××××××××.org"
1624 +
1625 + # Recommended by upstream for release. Doesn't really matter for live ebuilds.
1626 + append-flags -fno-strict-aliasing
1627 +
1628 + # Signed chars are required.
1629 + for arch in arm arm64 ppc ppc64; do
1630 + use $arch && append-flags -fsigned-chars
1631 + done
1632 +
1633 + local myconf=(
1634 + --prefix=/usr
1635 + --with-imagepath=/usr/include/X11/bitmaps:/usr/include/X11/pixmaps:/usr/share/icons/fvwm
1636 + --enable-package-subdirs
1637 + $(use_enable bidi)
1638 + $(use_enable doc mandoc)
1639 + $(use_enable go golang)
1640 + $(use_enable nls)
1641 + $(use_enable nls iconv)
1642 + $(use_enable perl perllib)
1643 + $(use_enable png)
1644 + $(use_with readline readline-library)
1645 + $(use_enable svg rsvg)
1646 + $(use_enable truetype xft)
1647 + --docdir=/usr/share/doc/${P}
1648 + )
1649 +
1650 + use readline && myconf+=( --without-termcap-library )
1651 +
1652 + econf ${myconf[@]}
1653 +}
1654 +
1655 +src_compile() {
1656 + PREFIX="/usr" emake
1657 + if [[ ${PV} == *9999 ]]; then
1658 + use doc && emake -C doc html
1659 + fi
1660 +}
1661 +
1662 +src_install() {
1663 + emake DESTDIR="${ED}" prefix="/usr" exec_prefix="/usr" datarootdir="/usr/share" install
1664 +
1665 + dodir /etc/X11/Sessions
1666 + echo "/usr/bin/fvwm3" > "${ED}/etc/X11/Sessions/${PN}" || die
1667 + fperms a+x /etc/X11/Sessions/${PN} || die
1668 +
1669 + python_scriptinto "/usr/bin"
1670 + python_doscript "${ED}/usr/bin/FvwmCommand" "${ED}/usr/bin/fvwm-menu-desktop"
1671 + if use doc; then
1672 + if [[ ${PV} == *9999 ]]; then
1673 + HTML_DOCS=( doc/*.html )
1674 + else
1675 + HTML_DOCS=( doc/html/*.html )
1676 + fi
1677 + fi
1678 + einstalldocs
1679 +
1680 + make_session_desktop fvwm3 /usr/bin/fvwm3
1681 +}
1682 +
1683 +pkg_postinst() {
1684 + if use go; then
1685 + ewarn "FvwmPrompt has been installed, it provides the functionality of both FvwmCommand and FvwmConsole."
1686 + ewarn "For compatibility with the existing fvwm2 configurations, the ebuild will install a FvwmCommand wrapper script."
1687 + ewarn "If you need FvwmConsole, install ${PN} with USE=\"-go\", but FvwmPrompt and FvwmCommnd will not be installed."
1688 + else
1689 + ewarn "Fvwmconsole has been installed, but FvwmCommand and FvwmPrompt are no longer included in this ebuild."
1690 + ewarn "If you need FvwmPrompt or FvwmCommand, install ${PN} with USE=\"go\"."
1691 + ewarn "In that case, FvwmPrompt will replace FvwmConsole and provide the same functionality in a more flexible way."
1692 + fi
1693 +}
1694
1695 diff --git a/x11-wm/fvwm3/metadata.xml b/x11-wm/fvwm3/metadata.xml
1696 new file mode 100644
1697 index 000000000000..3711144d46ea
1698 --- /dev/null
1699 +++ b/x11-wm/fvwm3/metadata.xml
1700 @@ -0,0 +1,27 @@
1701 +<?xml version="1.0" encoding="UTF-8"?>
1702 +<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
1703 +<pkgmetadata>
1704 + <longdescription lang="en">
1705 + fvwm3 is a multiple large virtual desktop window manager.
1706 + The successor to fvwm-2.6, Fvwm3 is intended to be extremely customizable and extendible while consuming a relatively small amount of resources.
1707 + </longdescription>
1708 + <maintainer type="person" proxied="yes">
1709 + <email>Matt.Jolly@××××××××.ninja</email>
1710 + <name>Matthew Jolly</name>
1711 + </maintainer>
1712 + <maintainer type="project" proxied="proxy">
1713 + <email>proxy-maint@g.o</email>
1714 + <name>Proxy Maintainers</name>
1715 + </maintainer>
1716 + <use>
1717 + <flag name="go">Enable building <pkg>dev-lang/go</pkg> code (FvwmPrompt)</flag>
1718 + <flag name="lock">Enable screen locking</flag>
1719 + <flag name="netpbm">Enable NetPBM support (used by FvwmScript-ScreenDump)</flag>
1720 + <flag name="rplay">Enable rplay support</flag>
1721 + <flag name="stroke">Mouse Gesture support</flag>
1722 + </use>
1723 + <upstream>
1724 + <bugs-to>https://github.com/fvwmorg/fvwm3/issues</bugs-to>
1725 + <changelog>https://raw.githubusercontent.com/fvwmorg/fvwm3/master/CHANGELOG.md</changelog>
1726 + </upstream>
1727 +</pkgmetadata>