From unknown Sat Aug 16 15:58:41 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#56538 <56538@debbugs.gnu.org> To: bug#56538 <56538@debbugs.gnu.org> Subject: Status: 29.0.50; [PATCH] Colored highlight in Lucid backend Reply-To: bug#56538 <56538@debbugs.gnu.org> Date: Sat, 16 Aug 2025 22:58:41 +0000 retitle 56538 29.0.50; [PATCH] Colored highlight in Lucid backend reassign 56538 emacs submitter 56538 Manuel Giraud severity 56538 wishlist tag 56538 patch thanks From debbugs-submit-bounces@debbugs.gnu.org Wed Jul 13 09:38:47 2022 Received: (at submit) by debbugs.gnu.org; 13 Jul 2022 13:38:47 +0000 Received: from localhost ([127.0.0.1]:45123 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oBcZj-0007m2-LJ for submit@debbugs.gnu.org; Wed, 13 Jul 2022 09:38:47 -0400 Received: from lists.gnu.org ([209.51.188.17]:36380) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oBcZi-0007lv-9x for submit@debbugs.gnu.org; Wed, 13 Jul 2022 09:38:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53220) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oBcZi-0001fs-32 for bug-gnu-emacs@gnu.org; Wed, 13 Jul 2022 09:38:46 -0400 Received: from ledu-giraud.fr ([51.159.28.247]:16781) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oBcZd-00013C-LF for bug-gnu-emacs@gnu.org; Wed, 13 Jul 2022 09:38:45 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; s=rsa; bh=7nsgmZ3wfJBLeeAJ gkewVJ6QrgqwKRlBu9rFa0ulfZg=; h=date:subject:to:from; d=ledu-giraud.fr; b=XuN0bAczUZrIWofb8mEg2L4LnuOCRQeLb3TgjtQsWZjOtHOKT3 pfWrvQBp7/2zlL1CJFVVm6mWiZJeRru13cWa9lmvN8sePY5RbksLlPJolLokQB9FIaH0Db FpUmp+ZA5XjL/JTbUgodL/dJRkYj7PPu0VrAxIBwP3kIA4j91y9nRya9YeCCPRU6Tp177V dI3l2aWGSqFuHH/gJ0IEQ1PpIUljDtE40eyx4HInZFXvxnmYCI79Ok9ljabLDsXy6fibuY igWwo9PtRMRoaXjLdxWExgcDupdt66jnJRNa6b09pTLOUEjPgAxR62TaQvyPNbwtFhpkj9 7vj5zdqLbg1Q== Received: from elite.giraud ( [10.1.1.1]) by ledu-giraud.fr (OpenSMTPD) with ESMTPSA id b8bd4f27 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO) for ; Wed, 13 Jul 2022 15:38:36 +0200 (CEST) From: Manuel Giraud To: bug-gnu-emacs@gnu.org Subject: 29.0.50; [PATCH] Colored highlight in Lucid backend Date: Wed, 13 Jul 2022 15:38:35 +0200 Message-ID: <87wnch16as.fsf@elite.giraud> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Received-SPF: pass client-ip=51.159.28.247; envelope-from=manuel@ledu-giraud.fr; helo=ledu-giraud.fr X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" --=-=-= Content-Type: text/plain Hi, Here is a patch that add a X resource to color the highlighted menu entry in the Lucid backend. There is much going on here because I needed to understand this code and end up needed to refactor some part to implement this feature. This was about ten clunky patches that I finally squashed into this one. I have tested that it works with the 2 following configuration - --with-x-toolkit=athena - --with-x-toolkit=athena --without-xft --without-cairo Here is how it looks like: --=-=-= Content-Type: image/png Content-Disposition: inline; filename=sshot.png Content-Transfer-Encoding: base64 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 KmZDUNrKL76/lOPs3TEyKnpUgCsj1IqINNnHP1/+6f4zGYVuzcPGv9PmxLiFGWN3bn6zoYyo4J9D G1b+93DatQeci1erHkMmTxnc8gWJf7HgMrePH7Qqp0079R+/a1u/NbvvP+v/88OTFm8tW/Z6s2qC EfJ5lw98umbbkXMZj9lavu36jJo2oU/DarqJyv1j3+rV2368mPWYd/Fs0S1y2ttlj1CpVBIVarQW JkogDMNLl/vrqrFTE2nI2k3T27ow1p95q5wyAABUPGwKDo6L55/+u574pJItWwEAQFWFBJbD0bDN OrRM+vqXmxHs2ewW/ZqxZ3Wfa6/8d9aMjXdaDBz1biv3osxT+xMWTb6t2LE0rDYRERVdTNjkMmjM 4v5MetLKVeveW+G7e0GIC2O+Fau9tmv+vPhLdbu9Pj3UW3v50KptmVq+OhERcXeSF46POeneZ+Tb Iz2ZrNTdW5ZNucYnrBuisrQ2kOcK857k5hYXjcmcajgriv82wufV6jFvcvUP/7P+Y+dp8yblL122 afupQYu6K81HyN39ftG0D4+59Bg5Y5Sn+u//270zevIDpx0Lurky/MOjS2Ys/cm978iZ4xqwN88k bVn29oPqu5a9XKcs9WrqK+l/a2sE1q/JCEyvUBgGfXF3f4yL2XGzxdRNk9u6MELXS+LMW+eUAQAA 4DnBMIwuQ6R/YZHIr1ViKwAAqMKQwHI0vKaoWuv2TT45dewYc6Vx+wDny0U8ERF350qmU4th8/8z I9iFIaLwLjWyB6z99kRO3/4vEBHx8qCxUYNbKoha+dfM/n3M3uTTUSE9qwm0un40+by21dSVcSO9 ZUT9QhvFDZ1yuToRkTYzeVdKftC8NYv612aIKKxrnceDF+9LvjroLT8LGSztHxte77Gh+I0iMOqr DUM9dPkVedOu4Z2D2EarfqJOYcF93fxX/HjrZg7HkdkIXTOTd/74qOWUzxeP9JYRUb8Ozm8M35x0 bEZIxIuai8dTc3yGrl44zl9GRH3b1WWXfn/zhpYsZnN4vijvcW6uUvP4nxPxH++/5dn/lbZOxN2U FIa+V821vQs/PFQUsnDRcD+lpeslbeY5yacMAAB2Qr8ujN8zW/fasFbLcNWYcQ2XYVuTn5tsJSEM c2Mxg5frv2/ykLm3kkk7ZXOtSn3H5MzrTlB/SD855s7aZBgCsyEwhyIjtxZ9uZNAFsk47WXLVgAA 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 c8Bh9znuuPscdsC864AlV8RY8y4EGE5lik1lH+6m101dTTRhJzBWS/Um4U2pAhU2Tb+assL2rVqO 1b6G8JVt+mn/3egmv+H5z+gL0jTfBgsAemcG1mLZc8OeZNeum35rOw7/gZ/66SRJkmTvF9/09Ce9 6c6//cHfOjEPjXZf9uuPfPEVz7z4zc+4y44k+9Zn//i8897yoc9c9T/ZrQ4/9hFPPu2XV+/9vWn2 zfc876SzPro7SZIkOe/xP3BekiQ77/nciy945l13JEmSXH/FZX/0uj/6s098/r+S2939YY992rOf fvxRByb7rnzrz5/y6mvv96Ddn/3k3vv+3NpJX3rdKz7w7WN/7txzf+b7b5F89/0vOvH0D1yfJEmy 4+hnvPkdpx27P17b+8U3Pf1Jr/3nPTf7QDdtWfXdL/3F61/1h++//Mtf33erI+9zwhOe+4ur9/7e jv8HKFxhsvc//+4t573hXR//569+e+Xgo+77qFOf95wfO+aWaZIkSfad//ee3z3/LZf+0xX/s3LI XR/06Ked9guPvku+xVjDPexWIfTLbCxYLPWUYWyTysyXQE5R2bS7/qy9KXWYgxMuvnedZwk1bRlW 9FY/2+bO1z9yU4fh31e3sQJ3I/C5msziGwUALaVWqvdo5n863vDRl530K5970oUX/fwx1UlXoQBr 5RsfOOMJp//1oSed+tM/eMTKV//uXRf86Vce8NK3n/ujt9939T995DNfu/5Tbznrbd941Aue84jb ryQrB9/tIQ+6yy3TJPvvy1566oven93/J095xNHpVz78rj/+h30/cs5FLz/xNle99edPedXVJ7zo 9Pv+zW+84q9Xjj/t9Ad/6pxzP/GA33nv2ccftPeaT334U9fs3fuFd5/zpqse/6abAqzsO1/++098 /tp9+wve99UPnH/epbsfvXHJ2ScenP3n+37tqWd+/NBHn7r6g4enV33sHRe8/6p7rV302iccFZpc tvuDv3bi6Vc8/Q9f++SjbpySduAtD9qV5gFWU4UHfP4PnvGM3/vPYx//lMfe59AbrvzEuy/6i/94 yMvfds5jbrey72vv//WnnvHhW51w6lOOO3z3v/3VOy7+yHcfde7bXvqIg9Os8R6axciA2kRUba65 5JJLzjzzzP7qAqo2NjbW19fnXQXLI5L1lfX9tmKoCoBtwgys7WDPZz7ysWuPftZYrecAACAASURB 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 BQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAA RE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgA AAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDU BFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAA AEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2A BQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAA RE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgA AAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDU BFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAA AEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2A BQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAA RE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgA AAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDU BFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAA AEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2A BQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAARE2ABQAAAEDUBFgAAAAA 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 AIDQ/gdutqmFGB5L6gAAAABJRU5ErkJggg== --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-Colored-menu-highlight-in-Lucid-backend.patch >From f51e1dbd3174d727a12e673e0b820b4cf35e7046 Mon Sep 17 00:00:00 2001 From: Manuel Giraud Date: Mon, 11 Jul 2022 11:14:08 +0200 Subject: [PATCH] Colored menu highlight in Lucid backend * lwlib/xlwmenuP.h: * lwlib/xlwmenu.h: * lwlib/xlwmenu.c: Introduce resources to handle colored highlighting of menu entries. * doc/emacs/xresources.texi (Lucid Resources): Documentation. --- doc/emacs/xresources.texi | 4 + etc/NEWS | 4 + lwlib/xlwmenu.c | 341 ++++++++++++++++++++++++++++---------- lwlib/xlwmenu.h | 14 ++ lwlib/xlwmenuP.h | 18 +- 5 files changed, 293 insertions(+), 88 deletions(-) diff --git a/doc/emacs/xresources.texi b/doc/emacs/xresources.texi index 2c2700bc15..f8be06b5e7 100644 --- a/doc/emacs/xresources.texi +++ b/doc/emacs/xresources.texi @@ -449,6 +449,10 @@ Lucid Resources Foreground color. @item disabledForeground Foreground color for a disabled menu item. +@item highlightForeground +Foreground color for a highlighted menu item. +@item highlightBackground +Background color for a highlighted menu item. @ifnottex @item horizontalSpacing Horizontal spacing in pixels between items. Default is 3. diff --git a/etc/NEWS b/etc/NEWS index bf36316890..b33d604a6f 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -544,6 +544,10 @@ and pop-up menus. This controls the style of the pre-edit and status areas of X input methods. ++++ +** New X resources: "highlightForeground" and "highlightBackground" +This controls colors used for highlighted menu item. + +++ ** On X11, Emacs now tries to synchronize window resize with the window manager. This leads to less flicker and empty areas of a frame being displayed diff --git a/lwlib/xlwmenu.c b/lwlib/xlwmenu.c index 68f49e646d..32310e18ef 100644 --- a/lwlib/xlwmenu.c +++ b/lwlib/xlwmenu.c @@ -121,6 +121,10 @@ #define DEFAULT_FONTNAME "XtDefaultFont" offset(menu.disabled_foreground), XtRString, (XtPointer)NULL}, {XtNbuttonForeground, XtCButtonForeground, XtRPixel, sizeof(Pixel), offset(menu.button_foreground), XtRString, "XtDefaultForeground"}, + {XtNhighlightForeground, XtCHighlightForeground, XtRPixel, sizeof(Pixel), + offset(menu.highlight_foreground), XtRString, "XtDefaultForeground"}, + {XtNhighlightBackground, XtCHighlightBackground, XtRPixel, sizeof(Pixel), + offset(menu.highlight_background), XtRImmediate, (XtPointer)-1}, {XtNmargin, XtCMargin, XtRDimension, sizeof(Dimension), offset(menu.margin), XtRImmediate, (XtPointer)1}, {XtNhorizontalSpacing, XtCMargin, XtRDimension, sizeof(Dimension), @@ -142,6 +146,19 @@ #define DEFAULT_FONTNAME "XtDefaultFont" {XmNbottomShadowPixmap, XmCBottomShadowPixmap, XtRPixmap, sizeof (Pixmap), offset (menu.bottom_shadow_pixmap), XtRImmediate, (XtPointer)None}, + {XmNtopHighlightShadowColor, XmCTopHighlightShadowColor, XtRPixel, + sizeof (Pixel), offset (menu.top_highlight_shadow_color), + XtRImmediate, (XtPointer)-1}, + {XmNbottomHighlightShadowColor, XmCBottomHighlightShadowColor, XtRPixel, + sizeof (Pixel), offset (menu.bottom_highlight_shadow_color), + XtRImmediate, (XtPointer)-1}, + {XmNtopHighlightShadowPixmap, XmCTopHighlightShadowPixmap, XtRPixmap, + sizeof (Pixmap), offset (menu.top_highlight_shadow_pixmap),XtRImmediate, + (XtPointer)None}, + {XmNbottomHighlightShadowPixmap, XmCBottomHighlightShadowPixmap, XtRPixmap, + sizeof (Pixmap), offset (menu.bottom_highlight_shadow_pixmap),XtRImmediate, + (XtPointer)None}, + {XtNopen, XtCCallback, XtRCallback, sizeof(XtPointer), offset(menu.open), XtRCallback, (XtPointer)NULL}, {XtNselect, XtCCallback, XtRCallback, sizeof(XtPointer), @@ -570,8 +587,7 @@ draw_arrow (XlwMenuWidget mw, int down_p) { Display *dpy = XtDisplay (mw); - GC top_gc = mw->menu.shadow_top_gc; - GC bottom_gc = mw->menu.shadow_bottom_gc; + GC top_gc, bottom_gc; int thickness = mw->menu.shadow_thickness; int height = width; XPoint pt[10]; @@ -584,10 +600,14 @@ draw_arrow (XlwMenuWidget mw, if (down_p) { - GC temp; - temp = top_gc; - top_gc = bottom_gc; - bottom_gc = temp; + /* XXX the following permutation is on purpose */ + top_gc = mw->menu.highlight_shadow_bottom_gc; + bottom_gc = mw->menu.highlight_shadow_top_gc; + } + else + { + top_gc = mw->menu.shadow_top_gc; + bottom_gc = mw->menu.shadow_bottom_gc; } pt[0].x = x; @@ -621,8 +641,12 @@ draw_arrow (XlwMenuWidget mw, XFillPolygon (dpy, window, bottom_gc, pt, 4, Convex, CoordModeOrigin); } - - +/* + * Generic draw shadow rectangle function. It is used to draw menus, menu items + * and also toggle buttons. When ERASE_P is true, it clears shadows. DOWN_P is + * true when a menu item is pushed or a button toggled. TOP_GC and BOTTOM_GC + * are the graphic contexts used to draw the top and bottom shadow respectively. + */ static void draw_shadow_rectangle (XlwMenuWidget mw, Window window, @@ -631,14 +655,28 @@ draw_shadow_rectangle (XlwMenuWidget mw, int width, int height, int erase_p, - int down_p) + int down_p, + GC top_gc, + GC bottom_gc) { Display *dpy = XtDisplay (mw); - GC top_gc = !erase_p ? mw->menu.shadow_top_gc : mw->menu.background_gc; - GC bottom_gc = !erase_p ? mw->menu.shadow_bottom_gc : mw->menu.background_gc; int thickness = !x && !y ? mw->menu.border_thickness : mw->menu.shadow_thickness; XPoint points [4]; + /* Choose correct GC with a standard default if NULL */ + if (erase_p) + { + top_gc = mw->menu.background_gc; + bottom_gc = mw->menu.background_gc; + } + else + { + if (top_gc == NULL) + top_gc = mw->menu.shadow_top_gc; + if (bottom_gc == NULL) + bottom_gc = mw->menu.shadow_bottom_gc; + } + if (!erase_p && width == height && width == toggle_button_width (mw)) { points [0].x = x; @@ -654,6 +692,7 @@ draw_shadow_rectangle (XlwMenuWidget mw, points, 4, Convex, CoordModeOrigin); } + if (!erase_p && down_p) { GC temp; @@ -662,6 +701,7 @@ draw_shadow_rectangle (XlwMenuWidget mw, bottom_gc = temp; } + /* Do draw (or erase) shadows */ points [0].x = x; points [0].y = y; points [1].x = x + width; @@ -709,14 +749,28 @@ draw_shadow_rhombus (XlwMenuWidget mw, int width, int height, int erase_p, - int down_p) + int down_p, + GC top_gc, + GC bottom_gc) { Display *dpy = XtDisplay (mw); - GC top_gc = !erase_p ? mw->menu.shadow_top_gc : mw->menu.background_gc; - GC bottom_gc = !erase_p ? mw->menu.shadow_bottom_gc : mw->menu.background_gc; int thickness = mw->menu.shadow_thickness; XPoint points [4]; + /* Choose correct GC with a standard default if NULL */ + if (erase_p) + { + top_gc = mw->menu.background_gc; + bottom_gc = mw->menu.background_gc; + } + else + { + if (top_gc == NULL) + top_gc = mw->menu.shadow_top_gc; + if (bottom_gc == NULL) + top_gc = mw->menu.shadow_bottom_gc; + } + if (!erase_p && width == height && width == radio_button_width (mw)) { points [0].x = x; @@ -784,15 +838,29 @@ draw_shadow_rhombus (XlwMenuWidget mw, toggle button is selected. */ static void -draw_toggle (XlwMenuWidget mw, Window window, int x, int y, int selected_p) +draw_toggle (XlwMenuWidget mw, Window window, int x, int y, int selected_p, + int highlighted_p) { int width, height; + GC top_gc, bottom_gc; + + if (highlighted_p) + { + top_gc = mw->menu.highlight_shadow_top_gc; + bottom_gc = mw->menu.highlight_shadow_bottom_gc; + } + else + { + top_gc = mw->menu.shadow_top_gc; + bottom_gc = mw->menu.shadow_bottom_gc; + } width = toggle_button_width (mw); height = width; x += mw->menu.horizontal_spacing; y += (MENU_FONT_ASCENT (mw) - height) / 2; - draw_shadow_rectangle (mw, window, x, y, width, height, False, selected_p); + draw_shadow_rectangle (mw, window, x, y, width, height, False, + selected_p, top_gc, bottom_gc); } @@ -801,15 +869,29 @@ draw_toggle (XlwMenuWidget mw, Window window, int x, int y, int selected_p) toggle button is selected. */ static void -draw_radio (XlwMenuWidget mw, Window window, int x, int y, int selected_p) +draw_radio (XlwMenuWidget mw, Window window, int x, int y, int selected_p, + int highlighted_p) { int width, height; + GC top_gc, bottom_gc; + + if (highlighted_p) + { + top_gc = mw->menu.highlight_shadow_top_gc; + bottom_gc = mw->menu.highlight_shadow_bottom_gc; + } + else + { + top_gc = mw->menu.shadow_top_gc; + bottom_gc = mw->menu.shadow_bottom_gc; + } width = radio_button_width (mw); height = width; x += mw->menu.horizontal_spacing; y += (MENU_FONT_ASCENT (mw) - height) / 2; - draw_shadow_rhombus (mw, window, x, y, width, height, False, selected_p); + draw_shadow_rhombus (mw, window, x, y, width, height, False, selected_p, + top_gc, bottom_gc); } @@ -968,6 +1050,33 @@ separator_height (enum menu_separator separator) } } +static void +draw_highlight (XlwMenuWidget mw, + Window window, + int x, + int y, + int width, + int height) +{ + Display *dpy = XtDisplay (mw); + XPoint points [4]; + + points [0].x = x; + points [0].y = y; + points [1].x = x + width; + points [1].y = y; + points [2].x = x + width; + points [2].y = y + height; + points [3].x = x; + points [3].y = y + height; + XFillPolygon (dpy, window, + mw->menu.highlight_background_gc, + points, 4, Convex, CoordModeOrigin); + + draw_shadow_rectangle(mw, window, x, y, width, height, False, False, + mw->menu.highlight_shadow_top_gc, + mw->menu.highlight_shadow_bottom_gc); +} /* Display the menu item and increment where.x and where.y to show how large the menu item was. */ @@ -983,7 +1092,6 @@ display_menu_item (XlwMenuWidget mw, { GC deco_gc; GC text_gc; - int font_height = MENU_FONT_HEIGHT (mw); int font_ascent = MENU_FONT_ASCENT (mw); int shadow = mw->menu.shadow_thickness; int margin = mw->menu.margin; @@ -1032,12 +1140,21 @@ display_menu_item (XlwMenuWidget mw, /* pick the foreground and background GC. */ if (val->enabled) - text_gc = mw->menu.foreground_gc; + if (highlighted_p) + text_gc = mw->menu.highlight_foreground_gc; + else + text_gc = mw->menu.foreground_gc; else text_gc = mw->menu.disabled_gc; deco_gc = mw->menu.foreground_gc; #if defined USE_CAIRO || defined HAVE_XFT - xftfg = val->enabled ? &mw->menu.xft_fg : &mw->menu.xft_disabled_fg; + if (val->enabled) + if (highlighted_p) + xftfg = &mw->menu.xft_highlight_fg; + else + xftfg = &mw->menu.xft_fg; + else + xftfg = &mw->menu.xft_disabled_fg; #endif if (separator_p) @@ -1048,8 +1165,11 @@ display_menu_item (XlwMenuWidget mw, { int x_offset = x + h_spacing + shadow; char* display_string = resource_widget_value (mw, val); - draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, True, - False); + /* Clears shadows and maybe highlight */ + draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, + True, False, NULL, NULL); + if (highlighted_p) + draw_highlight (mw, ws->pixmap, x, y, width, height); /* Deal with centering a menu title. */ if (!horizontal_p && !val->contents && !val->call_data) @@ -1095,10 +1215,10 @@ display_menu_item (XlwMenuWidget mw, { if (val->button_type == BUTTON_TYPE_TOGGLE) draw_toggle (mw, ws->pixmap, x, y + v_spacing + shadow, - val->selected); + val->selected, highlighted_p); else if (val->button_type == BUTTON_TYPE_RADIO) draw_radio (mw, ws->pixmap, x, y + v_spacing + shadow, - val->selected); + val->selected, highlighted_p); if (val->contents) { @@ -1145,25 +1265,18 @@ display_menu_item (XlwMenuWidget mw, } else { - XDrawRectangle (XtDisplay (mw), ws->pixmap, - mw->menu.background_gc, - x + shadow, y + shadow, - label_width + h_spacing - 1, - font_height + 2 * v_spacing - 1); - draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, - True, False); + /* If not highlighted, clears shadows for horizontal + menu item */ + if (!highlighted_p) + draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, + True, False, NULL, NULL); } #ifdef USE_CAIRO if (ws->xft_draw) cairo_surface_flush (cairo_get_target (ws->xft_draw)); #endif - - if (highlighted_p) - draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, False, - False); } } - where->x += width; where->y += height; } @@ -1257,7 +1370,7 @@ display_menu (XlwMenuWidget mw, if (!just_compute_p) { draw_shadow_rectangle (mw, ws->pixmap, 0, 0, ws->width, ws->height, - False, False); + False, False, NULL, NULL); XCopyArea (XtDisplay (mw), ws->pixmap, ws->window, mw->menu.foreground_gc, 0, 0, ws->width, ws->height, 0, 0); } @@ -1714,6 +1827,16 @@ #define BRIGHTNESS(color) (((color) & 0xff) + (((color) >> 8) & 0xff) + (((color xgcv.foreground = mw->core.background_pixel; xgcv.background = mw->menu.foreground; mw->menu.background_gc = XtGetGC ((Widget)mw, mask, &xgcv); + + xgcv.foreground = mw->menu.highlight_foreground; + xgcv.background = (mw->menu.highlight_background == -1) ? + mw->core.background_pixel : mw->menu.highlight_background; + mw->menu.highlight_foreground_gc = XtGetGC ((Widget)mw, mask, &xgcv); + + xgcv.foreground = (mw->menu.highlight_background == -1) ? + mw->core.background_pixel : mw->menu.highlight_background; + xgcv.background = mw->menu.foreground; + mw->menu.highlight_background_gc = XtGetGC ((Widget)mw, mask, &xgcv); } static void @@ -1724,12 +1847,16 @@ release_drawing_gcs (XlwMenuWidget mw) XtReleaseGC ((Widget) mw, mw->menu.disabled_gc); XtReleaseGC ((Widget) mw, mw->menu.inactive_button_gc); XtReleaseGC ((Widget) mw, mw->menu.background_gc); + XtReleaseGC ((Widget) mw, mw->menu.highlight_foreground_gc); + XtReleaseGC ((Widget) mw, mw->menu.highlight_background_gc); /* let's get some segvs if we try to use these... */ mw->menu.foreground_gc = (GC) -1; mw->menu.button_gc = (GC) -1; mw->menu.disabled_gc = (GC) -1; mw->menu.inactive_button_gc = (GC) -1; mw->menu.background_gc = (GC) -1; + mw->menu.highlight_foreground_gc = (GC) -1; + mw->menu.highlight_background_gc = (GC) -1; } #ifndef emacs @@ -1738,29 +1865,34 @@ #define MINL(x,y) ((((unsigned long) (x)) < ((unsigned long) (y))) \ #endif static void -make_shadow_gcs (XlwMenuWidget mw) +compute_shadow_colors(XlwMenuWidget mw, + Pixel *top_color, + Pixel *bottom_color, + Boolean *free_top_p, + Boolean *free_bottom_p, + Pixmap *top_pixmap, + Pixmap *bottom_pixmap, + Pixel fore_color, + Pixel back_color) { - XGCValues xgcv; - unsigned long pm = 0; Display *dpy = XtDisplay ((Widget) mw); Screen *screen = XtScreen ((Widget) mw); Colormap cmap = mw->core.colormap; XColor topc, botc; int top_frobbed = 0, bottom_frobbed = 0; - mw->menu.free_top_shadow_color_p = 0; - mw->menu.free_bottom_shadow_color_p = 0; + *free_top_p = False; + *free_bottom_p = False; - if (mw->menu.top_shadow_color == -1) - mw->menu.top_shadow_color = mw->core.background_pixel; + if (*top_color == -1) + *top_color = back_color; - if (mw->menu.bottom_shadow_color == -1) - mw->menu.bottom_shadow_color = mw->menu.foreground; + if (*bottom_color == -1) + *bottom_color = fore_color; - if (mw->menu.top_shadow_color == mw->core.background_pixel || - mw->menu.top_shadow_color == mw->menu.foreground) + if (*top_color == back_color || *top_color == fore_color) { - topc.pixel = mw->core.background_pixel; + topc.pixel = back_color; #ifdef emacs if (x_alloc_lighter_color_for_widget ((Widget) mw, dpy, cmap, &topc.pixel, @@ -1774,15 +1906,14 @@ make_shadow_gcs (XlwMenuWidget mw) if (XAllocColor (dpy, cmap, &topc)) #endif { - mw->menu.top_shadow_color = topc.pixel; - mw->menu.free_top_shadow_color_p = 1; + *top_color = topc.pixel; + *free_top_p = True; top_frobbed = 1; } } - if (mw->menu.bottom_shadow_color == mw->menu.foreground || - mw->menu.bottom_shadow_color == mw->core.background_pixel) + if (*bottom_color == fore_color || *bottom_color == back_color) { - botc.pixel = mw->core.background_pixel; + botc.pixel = back_color; #ifdef emacs if (x_alloc_lighter_color_for_widget ((Widget) mw, dpy, cmap, &botc.pixel, @@ -1795,8 +1926,8 @@ make_shadow_gcs (XlwMenuWidget mw) if (XAllocColor (dpy, cmap, &botc)) #endif { - mw->menu.bottom_shadow_color = botc.pixel; - mw->menu.free_bottom_shadow_color_p = 1; + *bottom_color = botc.pixel; + *free_bottom_p = True; bottom_frobbed = 1; } } @@ -1805,52 +1936,76 @@ make_shadow_gcs (XlwMenuWidget mw) { if (topc.pixel == botc.pixel) { - if (botc.pixel == mw->menu.foreground) + if (botc.pixel == fore_color) { - if (mw->menu.free_top_shadow_color_p) + if (*free_top_p) { - x_free_dpy_colors (dpy, screen, cmap, - &mw->menu.top_shadow_color, 1); - mw->menu.free_top_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, top_color, 1); + *free_top_p = False; } - mw->menu.top_shadow_color = mw->core.background_pixel; + *top_color = back_color; } else { - if (mw->menu.free_bottom_shadow_color_p) + if (*free_bottom_p) { - x_free_dpy_colors (dpy, screen, cmap, - &mw->menu.bottom_shadow_color, 1); - mw->menu.free_bottom_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, bottom_color, 1); + *free_bottom_p = False; } - mw->menu.bottom_shadow_color = mw->menu.foreground; + *bottom_color = fore_color; } } } - if (!mw->menu.top_shadow_pixmap - && mw->menu.top_shadow_color == mw->core.background_pixel) + if (!*top_pixmap && *top_color == back_color) { - mw->menu.top_shadow_pixmap = mw->menu.gray_pixmap; - if (mw->menu.free_top_shadow_color_p) + *top_pixmap = mw->menu.gray_pixmap; + if (*free_top_p) { - x_free_dpy_colors (dpy, screen, cmap, &mw->menu.top_shadow_color, 1); - mw->menu.free_top_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, top_color, 1); + *free_top_p = False; } - mw->menu.top_shadow_color = mw->menu.foreground; + *top_color = fore_color; } - if (!mw->menu.bottom_shadow_pixmap - && mw->menu.bottom_shadow_color == mw->core.background_pixel) + if (!*bottom_pixmap && *bottom_color == back_color) { - mw->menu.bottom_shadow_pixmap = mw->menu.gray_pixmap; - if (mw->menu.free_bottom_shadow_color_p) + *bottom_pixmap = mw->menu.gray_pixmap; + if (*free_bottom_p) { - x_free_dpy_colors (dpy, screen, cmap, - &mw->menu.bottom_shadow_color, 1); - mw->menu.free_bottom_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, bottom_color, 1); + *free_bottom_p = False; } - mw->menu.bottom_shadow_color = mw->menu.foreground; + *bottom_color = fore_color; } +} + +static void +make_shadow_gcs (XlwMenuWidget mw) +{ + XGCValues xgcv; + unsigned long pm = 0; + + /* Normal shadows */ + compute_shadow_colors(mw, + &(mw->menu.top_shadow_color), + &(mw->menu.bottom_shadow_color), + &(mw->menu.free_top_shadow_color_p), + &(mw->menu.free_bottom_shadow_color_p), + &(mw->menu.top_shadow_pixmap), + &(mw->menu.bottom_shadow_pixmap), + mw->menu.foreground, + mw->core.background_pixel); + + /* Highlight shadows */ + compute_shadow_colors(mw, + &(mw->menu.top_highlight_shadow_color), + &(mw->menu.bottom_highlight_shadow_color), + &(mw->menu.free_top_highlight_shadow_color_p), + &(mw->menu.free_bottom_highlight_shadow_color_p), + &(mw->menu.top_highlight_shadow_pixmap), + &(mw->menu.bottom_highlight_shadow_pixmap), + mw->menu.highlight_foreground, + mw->menu.highlight_background); xgcv.fill_style = FillStippled; xgcv.foreground = mw->menu.top_shadow_color; @@ -1862,6 +2017,16 @@ make_shadow_gcs (XlwMenuWidget mw) xgcv.stipple = mw->menu.bottom_shadow_pixmap; pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0); mw->menu.shadow_bottom_gc = XtGetGC ((Widget)mw, GCForeground | pm, &xgcv); + + xgcv.foreground = mw->menu.top_highlight_shadow_color; + xgcv.stipple = mw->menu.top_highlight_shadow_pixmap; + pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0); + mw->menu.highlight_shadow_top_gc = XtGetGC ((Widget)mw, GCForeground | pm, &xgcv); + + xgcv.foreground = mw->menu.bottom_highlight_shadow_color; + xgcv.stipple = mw->menu.bottom_highlight_shadow_pixmap; + pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0); + mw->menu.highlight_shadow_bottom_gc = XtGetGC ((Widget)mw, GCForeground | pm, &xgcv); } @@ -2038,12 +2203,14 @@ XlwMenuRealize (Widget w, Mask *valueMask, XSetWindowAttributes *attributes) #if defined USE_CAIRO || defined HAVE_XFT if (mw->menu.xft_font) { - XColor colors[3]; + XColor colors[4]; colors[0].pixel = mw->menu.xft_fg.pixel = mw->menu.foreground; colors[1].pixel = mw->menu.xft_bg.pixel = mw->core.background_pixel; colors[2].pixel = mw->menu.xft_disabled_fg.pixel = mw->menu.disabled_foreground; - XQueryColors (XtDisplay (mw), mw->core.colormap, colors, 3); + colors[3].pixel = mw->menu.xft_highlight_fg.pixel + = mw->menu.highlight_foreground; + XQueryColors (XtDisplay (mw), mw->core.colormap, colors, 4); mw->menu.xft_fg.color.alpha = 0xFFFF; mw->menu.xft_fg.color.red = colors[0].red; mw->menu.xft_fg.color.green = colors[0].green; @@ -2056,6 +2223,10 @@ XlwMenuRealize (Widget w, Mask *valueMask, XSetWindowAttributes *attributes) mw->menu.xft_disabled_fg.color.red = colors[2].red; mw->menu.xft_disabled_fg.color.green = colors[2].green; mw->menu.xft_disabled_fg.color.blue = colors[2].blue; + mw->menu.xft_highlight_fg.color.alpha = 0xFFFF; + mw->menu.xft_highlight_fg.color.red = colors[3].red; + mw->menu.xft_highlight_fg.color.green = colors[3].green; + mw->menu.xft_highlight_fg.color.blue = colors[3].blue; } #endif } diff --git a/lwlib/xlwmenu.h b/lwlib/xlwmenu.h index 7f4bf35939..f68d913b5a 100644 --- a/lwlib/xlwmenu.h +++ b/lwlib/xlwmenu.h @@ -58,6 +58,10 @@ #define XtNallowResize "allowResize" #define XtCAllowResize "AllowResize" #define XtNborderThickness "borderThickness" #define XtCBorderThickness "BorderThickness" +#define XtNhighlightForeground "highlightForeground" +#define XtCHighlightForeground "HighlightForeground" +#define XtNhighlightBackground "highlightBackground" +#define XtCHighlightBackground "HighlightBackground" /* Motif-compatible resource names */ #define XmNshadowThickness "shadowThickness" @@ -70,6 +74,16 @@ #define XmNtopShadowPixmap "topShadowPixmap" #define XmCTopShadowPixmap "TopShadowPixmap" #define XmNbottomShadowPixmap "bottomShadowPixmap" #define XmCBottomShadowPixmap "BottomShadowPixmap" + +#define XmNtopHighlightShadowColor "topHighlightShadowColor" +#define XmCTopHighlightShadowColor "TopHighlightShadowColor" +#define XmNbottomHighlightShadowColor "bottomHighlightShadowColor" +#define XmCBottomHighlightShadowColor "BottomHighlightShadowColor" +#define XmNtopHighlightShadowPixmap "topHighlightShadowPixmap" +#define XmCTopHighlightShadowPixmap "TopHighlightShadowPixmap" +#define XmNbottomHighlightShadowPixmap "bottomHighlightShadowPixmap" +#define XmCBottomHighlightShadowPixmap "BottomHighlightShadowPixmap" + #define XmRHorizontalDimension "HorizontalDimension" typedef struct _XlwMenuRec *XlwMenuWidget; diff --git a/lwlib/xlwmenuP.h b/lwlib/xlwmenuP.h index 455ecdbce0..c314eb3e91 100644 --- a/lwlib/xlwmenuP.h +++ b/lwlib/xlwmenuP.h @@ -63,13 +63,15 @@ #define _XlwMenuP_h #if defined USE_CAIRO || defined HAVE_XFT int default_face; XftFont* xft_font; - XftColor xft_fg, xft_bg, xft_disabled_fg; + XftColor xft_fg, xft_bg, xft_disabled_fg, xft_highlight_fg; #endif String fontName; XFontStruct* font; Pixel foreground; Pixel disabled_foreground; Pixel button_foreground; + Pixel highlight_foreground; + Pixel highlight_background; Dimension margin; Dimension horizontal_spacing; Dimension vertical_spacing; @@ -80,6 +82,10 @@ #define _XlwMenuP_h Pixel bottom_shadow_color; Pixmap top_shadow_pixmap; Pixmap bottom_shadow_pixmap; + Pixel top_highlight_shadow_color; + Pixel bottom_highlight_shadow_color; + Pixmap top_highlight_shadow_pixmap; + Pixmap bottom_highlight_shadow_pixmap; Cursor cursor_shape; XtCallbackList open; XtCallbackList select, highlight; @@ -88,8 +94,10 @@ #define _XlwMenuP_h int horizontal; /* True means top_shadow_color and/or bottom_shadow_color must be freed. */ - bool_bf free_top_shadow_color_p : 1; - bool_bf free_bottom_shadow_color_p : 1; + Boolean free_top_shadow_color_p; + Boolean free_bottom_shadow_color_p; + Boolean free_top_highlight_shadow_color_p; + Boolean free_bottom_highlight_shadow_color_p; /* State of the XlwMenu */ int top_depth; @@ -112,9 +120,13 @@ #define _XlwMenuP_h GC button_gc; GC background_gc; GC disabled_gc; + GC highlight_foreground_gc; + GC highlight_background_gc; GC inactive_button_gc; GC shadow_top_gc; GC shadow_bottom_gc; + GC highlight_shadow_top_gc; + GC highlight_shadow_bottom_gc; Cursor cursor; Boolean popped_up; Pixmap gray_pixmap; -- 2.36.1 --=-=-= Content-Type: text/plain In GNU Emacs 29.0.50 (build 1, x86_64-unknown-openbsd7.1, X toolkit, cairo version 1.17.6, Xaw scroll bars) of 2022-07-13 built on elite.giraud Repository revision: f51e1dbd3174d727a12e673e0b820b4cf35e7046 Repository branch: mgi/ui3 Windowing system distributor 'The X.Org Foundation', version 11.0.12101003 System Description: OpenBSD elite.giraud 7.1 GENERIC.MP#579 amd64 Configured using: 'configure --prefix=/home/manuel/emacs --bindir=/home/manuel/bin --with-x-toolkit=athena --without-sound --without-compress-install CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib' Configured features: CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GSETTINGS HARFBUZZ JPEG JSON LCMS2 LIBOTF LIBXML2 MODULES NOTIFY KQUEUE PDUMPER PNG RSVG SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS WEBP X11 XDBE XIM XINPUT2 XPM LUCID ZLIB Important settings: value of $LC_ALL: en_US.UTF-8 locale-coding-system: utf-8-unix Major mode: Lisp Interaction Minor modes in effect: global-git-commit-mode: t magit-auto-revert-mode: t paredit-mode: t icomplete-mode: t display-time-mode: t shell-dirtrack-mode: t global-so-long-mode: t repeat-mode: t global-eldoc-mode: t eldoc-mode: t show-paren-mode: t electric-indent-mode: t mouse-wheel-mode: t menu-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t line-number-mode: t indent-tabs-mode: t transient-mark-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t Load-path shadows: /home/manuel/.emacs.d/elpa/transient-20220527.2213/transient hides /home/manuel/emacs/share/emacs/29.0.50/lisp/transient Features: (shadow sort mail-extr emacsbug vc-git whitespace magit-patch magit-extras face-remap magit-bookmark magit-submodule magit-obsolete magit-blame magit-stash magit-reflog magit-bisect magit-push magit-pull magit-fetch magit-clone magit-remote magit-commit magit-sequence magit-notes magit-worktree magit-tag magit-merge magit-branch magit-reset magit-files magit-refs magit-status magit magit-repos magit-apply magit-wip magit-log which-func imenu magit-diff smerge-mode diff git-commit log-edit pcvs-util add-log magit-core magit-autorevert autorevert magit-margin magit-transient magit-process with-editor magit-mode transient magit-git magit-base magit-section dash compat-27 compat-26 compat pulse vc-hg diff-mode vc-dispatcher vc-svn conf-mode facemenu paredit edmacro icomplete time battery exwm-randr xcb-randr exwm-config exwm exwm-input xcb-keysyms xcb-xkb exwm-manage exwm-floating xcb-cursor xcb-render exwm-layout exwm-workspace exwm-core xcb-ewmh xcb-icccm xcb xcb-xproto xcb-types xcb-debug kmacro server stimmung-themes modus-operandi-theme modus-themes osm bookmark mingus libmpdee transmission diary-lib diary-loaddefs color calc-bin calc-ext calc calc-loaddefs rect calc-macs w3m-load mu4e mu4e-org mu4e-main mu4e-view mu4e-view-gnus mu4e-view-common mu4e-headers mu4e-compose mu4e-context mu4e-draft mu4e-actions ido rfc2368 smtpmail mu4e-mark mu4e-proc mu4e-utils doc-view filenotify jka-compr image-mode exif mu4e-lists mu4e-message flow-fill mule-util hl-line mu4e-vars mu4e-meta supercite regi ebdb-message ebdb-gnus gnus-msg gnus-art mm-uu mml2015 mm-view mml-smime smime gnutls dig gnus-sum shr pixel-fill kinsoku url-file url-dired svg dom gnus-group gnus-undo gnus-start gnus-dbus gnus-cloud nnimap nnmail mail-source utf7 netrc nnoo gnus-spec gnus-int gnus-range message sendmail yank-media puny rfc822 mml mml-sec epa derived epg rfc6068 epg-config mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045 ietf-drums gmm-utils mailheader gnus-win gnus nnheader gnus-util mail-utils range mm-util mail-prsvr ebdb-mua ebdb-com crm ebdb-format ebdb mailabbrev eieio-opt cl-extra help-mode speedbar ezimage dframe eieio-base pcase timezone org ob ob-tangle ob-ref ob-lob ob-table ob-exp org-macro org-footnote org-src ob-comint org-pcomplete org-list org-faces org-entities org-version ob-emacs-lisp ob-core ob-eval org-table oc-basic bibtex ol rx org-keys oc org-compat org-macs org-loaddefs find-func cal-menu calendar cal-loaddefs visual-basic-mode cl web-mode disp-table erlang-start smart-tabs-mode skeleton cc-mode cc-fonts cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars cc-defs slime-asdf grep slime-tramp tramp tramp-loaddefs trampver tramp-integration cus-edit cus-load wid-edit files-x tramp-compat shell pcomplete parse-time iso8601 time-date ls-lisp format-spec slime-fancy slime-indentation slime-cl-indent cl-indent slime-trace-dialog slime-fontifying-fu slime-package-fu slime-references slime-compiler-notes-tree advice slime-scratch slime-presentations bridge slime-macrostep macrostep slime-mdot-fu slime-enclosing-context slime-fuzzy slime-fancy-trace slime-fancy-inspector slime-c-p-c slime-editing-commands slime-autodoc slime-repl slime-parse slime compile text-property-search etags fileloop generator xref project arc-mode archive-mode noutline outline pp comint ansi-color ring hyperspec thingatpt slime-autoloads dired-aux dired-x dired dired-loaddefs so-long notifications dbus xml repeat easy-mmode tex-site hyperbole-autoloads magit-autoloads git-commit-autoloads magit-section-autoloads dash-autoloads rust-mode-autoloads stimmung-themes-autoloads with-editor-autoloads info compat-autoloads package browse-url url url-proxy url-privacy url-expand url-methods url-history url-cookie generate-lisp-file url-domsuf url-util mailcap url-handlers url-parse auth-source cl-seq eieio eieio-core cl-macs password-cache json subr-x map byte-opt gv bytecomp byte-compile cconv url-vars cl-loaddefs cl-lib rmc iso-transl tooltip eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic indonesian philippine cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite emoji-zwj charscript charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs faces cus-face macroexp files window text-properties overlay sha1 md5 base64 format env code-pages mule custom widget keymap hashtable-print-readable backquote threads dbusbind kqueue lcms2 dynamic-setting system-font-setting font-render-setting cairo x-toolkit xinput2 x multi-tty make-network-process emacs) Memory information: ((conses 16 563139 59476) (symbols 48 54905 4) (strings 32 171200 8786) (string-bytes 1 5703800) (vectors 16 99692) (vector-slots 8 1289985 58168) (floats 8 522 566) (intervals 56 2981 2094) (buffers 992 16)) -- Manuel Giraud --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Wed Jul 13 20:54:08 2022 Received: (at 56538) by debbugs.gnu.org; 14 Jul 2022 00:54:08 +0000 Received: from localhost ([127.0.0.1]:48004 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oBn7A-0006RC-13 for submit@debbugs.gnu.org; Wed, 13 Jul 2022 20:54:07 -0400 Received: from sonic305-22.consmr.mail.ne1.yahoo.com ([66.163.185.148]:42634) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oBn77-0006Qr-PV for 56538@debbugs.gnu.org; Wed, 13 Jul 2022 20:53:58 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1657760031; bh=uS3rGGvANJxBwPLB57hcTHmSUE1hNjcdUKZwDovtpGQ=; h=From:To:Cc:Subject:References:Date:In-Reply-To:From:Subject:Reply-To; b=i/gqH49wCGmzmPOb1BCldpVQKzPRsj6YqEbZQkpHyBi+RWQn6VGtHWZke4/uo9QRw3DxtdvZSAI62CzrDBI0VooAsAAWrxg5I2I00SJU5600mm2C0WLvY4PolKAQatXruoTKTs9b87QqnYzwZNJrbKEGA+s9ZfRMb7QkGbPorpXhw67xNxVE39jrmt94gq0VUWvk+TRHpZFLHGdFO9jsWqol3bvhezJQUUFGteoJGODyilMvbfOKZvls9nVlMoi+EE33JwMrsaHlAWel3DvDPOwgwHy1MtoRVerlfXA0C4z1+zuD6AX3FYaUJQG+m3raMc/h8z94ga/SPmLPo7xu3w== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1657760031; bh=45hfLvcfGHnQgzo0upnNhJN+tL9rO+zmMHztsHrE9x3=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=IdzJho94XtVvR2R6HN1fqQ+ZSAc9RNv3rEdknFMqoiKa/Bi0xrnLR9BlrRI8qUisH9Sln5hdYCrmOAF0TANGC2PUtV6AyxwmwbRZwTAY0GiEFDPqW7VXiKS5XVDaXiXgmzK2AQdqIkB0oOg6QjjE7U8idrEERXO9yC86n5t9qnUrvt1JdqZkOa2yRhubj3lGh1797J1wYcjYYdEWPMi1PccBF6ltZJw5WcmWYy8tbCsHZSbdlJ2WPgv4/Kkjd5qFkpoyIqr1UG1bI0YqoU1eAYqZ7oLBf3IP6cwper+90WdZRkh+glATwf2zIgqPP0is+T6dp+qxcyJXSnedcSl0uw== X-YMail-OSG: dPnebAkVM1n9bS6aWRuA0jB6SyhUOIrVEDRIkCwI7YFNAKdjNXRZsjWQmrdr8re In0W0G0qbkvBYf4zLacsNchNi4vj8rFYv2JZ9i8T8tKm1cVxANS4CLyEiOPqoFfgzQV51nwVN2By NG3QmEIJE6RjVbRvWDHUx5hwO2x2eeKhr8ZM602Cnw7fFFX8SQF2aPX.2xcDhm8cnowPNPJChL_V oZ6_Lfa_.Q.XdobFzLMTIRo7QfvxB06shjYqpYl2iO3noHYUbWe6zzgURO4ya8AIqFHvfscuYLK3 b1wbLg_QY0NU.fU.LH7h4HtZydhJ2ucFTaqT8.Tv_LwZR6PphZJAoEY6C0Jlet0IC56e5ve0vNQQ T9B.t33rq_hYXr0D9Uyy5s0NikkO1v_NQRSOKjL6shq8ga9BTmxegV00bem1stVyNU3Px2EC1M7E U3OlNpW2n7XFUKnlzOiMoXX9n84hr9yKo1Ies7Nl31WWfYi8sv.V9WQNjwG.tVjMwYFA3BHjm2ZY rr72GMW.ARllnSI59aS5dvoNmQlLnYHVSjJQX2lHhrTrRHb9EkWBHLweKMNrIoUczSmZgvkOX1nN h63VYkJPceMsUBVJwMmtYLG.LJ4u4czgcbdT19Pa9bkQQdrBLCNHxachikTonzsDmUITho.MkIUU .yIKrXq2ttu66UPVB6BOTYKnqpB4i8i9bZky4VWftZupRx3hdlPw1NFwwyByQuwfSUHGs98glLXb xEwCzOYlyP6hbA3DClM5B9SjER3qs448pHWhzZrE.cz_L8kkKyHaXQkb3ljZjN3xLKwSBek0JsJp eXl4Ca1F.9EZwaszHe4XAYKMb97uMM8MsEYSzhggtWVPSwVyAIjW27mKiXmqaJ36iIFo3nh2Q3aX e2XQK8wEZxN.rwacMo7eOyPNrP1rEKfmIMm6pRVPTpaHPjxVsn67uQw2zNyi2Uem9DmIyWb7pC8O n82SKTi32F_JaNsQyDwA9UV5Uy3q.NUMZjRlnNo5nABtfHuIbASP3z5vpSuQlT5KVqdpXfvhyLgw ghOM6fYQaOObxPJgs.JGTL2GxLwau98_85y8SAfZsNJ4I31gUGXqsfJwzwrNWkkJ3G2K7QjaNlyW dvRp6uEKkxtpfzI9toHtr7mnh.EH3e0K.aUqrIYsz0UuA8GNckKwEetOy2hL4_MPfgwVHO5i0DK7 ZyI3hciRx7dzlwBz3stDYAyh7XP5ASfEFSrM0SLJNLswBbvoj4.pEZxH3z2P9YPH51tNcd6bkGRi OVVuL1DNOSCDPCTaYaNJRc5QjGfOvV.BbyuKBYVK1tqpwmoW_aTCJOTAn31fwuMKUCtZxl7A6I50 2K7NIv4T4GdALT3QrT19bLj5TMClJsdKrugrIaZjhQYfrxe11KBPr16fJlOb3qps3TWe0Jv7C8rT td2x4ull_wLGjKzs82bNabXadnhrdBFSo0cmAs1CyfB8nP09z14a2L.FGRupqjsOkwGfjZ9jiqVo NalAIdLvPSLdwK1gqHmMcHzTK_drzFD35mxl9lZsABQdWO2pvKOp17J2w351ZLQsryIkmD3ACczT WDyzLW9Afkk5N9z1osrfFaJUXu6KlVsuo4bAxafNlz_rFflQkuVYDTzcoRMlnOsf4hEZf2b15Wzr S3R.9hDYaRlvbe9qjmVgHbTmMqIvOkujkEMGTeLNTpv7cS6VZh5W2A9CTJEHnf2g5ng_m7V7STgB yvAntHewBO.tSX6pWrMZZNWvoyvu3DY4EFgo9HtrH6BWfsPDiUnaW0FjgoCca6AoGzrYW1QgN.A7 TZdx.7w6y6xSNizD87efzgh8eRpEFBfeTYAURzSVuJWHnStHd.UQJPnk5gVaIhJA_I2nrbIGkDvY vd7M5xTk315jnsYfJftoHhJHNACV2UMQOPjAFHAYd6R9a97URgOLhHFRoja19WxrEmpFgGm5EI3A _rVdQPuWfTbapm.iNVadJcLe_kRGfh0vKxPUkUCSC3Yi3av2zGGExSymzOxFpfhg0jJvg9Mb.IDk SghFuSkgra.mMgXSuouW4KSBI7OQ0tB7PxOep39oIZRdwaLOXtmW7PlPhciVcxCNyqC1.UXfCrjY g4A7Ztf.kKdLvfID0CfXIYIGyGWAa..vbqT4OOnFVrFl_OgDiK1ZG8wOI32gslyaHN1lohYGziiH Ss4AE2X3YDtOozf..kjXmmbg_dMT6OtlM1RCwYyojRwpL9GGN4edm8Y3rqnZdx60Lo2Cmj4Gw5rV zrl4QFWuPmxoVa7OEmIsf3e1GyPu.Lp9l8r8DNE5Cb6YUvBaOkniglUtLSZln5Q-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic305.consmr.mail.ne1.yahoo.com with HTTP; Thu, 14 Jul 2022 00:53:51 +0000 Received: by hermes--canary-production-sg3-67975bbd4b-hh5lh (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 56b2da1c32d6a378a41d257583198b90; Thu, 14 Jul 2022 00:53:44 +0000 (UTC) From: Po Lu To: Manuel Giraud Subject: Re: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend References: <87wnch16as.fsf@elite.giraud> Date: Thu, 14 Jul 2022 08:53:39 +0800 In-Reply-To: <87wnch16as.fsf@elite.giraud> (Manuel Giraud's message of "Wed, 13 Jul 2022 15:38:35 +0200") Message-ID: <87k08gtsz0.fsf@yahoo.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.91 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Mailer: WebService/1.1.20407 mail.backend.jedi.jws.acl:role.jedi.acl.token.atz.jws.hermes.yahoo Content-Length: 11220 X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 56538 Cc: 56538@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Manuel Giraud writes: > ++++ > +** New X resources: "highlightForeground" and "highlightBackground" > +This controls colors used for highlighted menu item. This should say which widget it applies to, and that it only applies under the Lucid build. > + {XmNtopHighlightShadowColor, XmCTopHighlightShadowColor, XtRPixel, > + sizeof (Pixel), offset (menu.top_highlight_shadow_color), > + XtRImmediate, (XtPointer)-1}, > + {XmNbottomHighlightShadowColor, XmCBottomHighlightShadowColor, XtRPixel, > + sizeof (Pixel), offset (menu.bottom_highlight_shadow_color), > + XtRImmediate, (XtPointer)-1}, > + {XmNtopHighlightShadowPixmap, XmCTopHighlightShadowPixmap, XtRPixmap, > + sizeof (Pixmap), offset (menu.top_highlight_shadow_pixmap),XtRImmediate, > + (XtPointer)None}, > + {XmNbottomHighlightShadowPixmap, XmCBottomHighlightShadowPixmap, XtRPixmap, > + sizeof (Pixmap), offset (menu.bottom_highlight_shadow_pixmap),XtRImmediate, > + (XtPointer)None}, Please fix the coding style here so that there is at least a space between casts and what is being casted. I know the rest of xlwmenu.c doesn't follow that coding style strictly, but there is no excuse to add even more incorrectly formatted code. > + /* XXX the following permutation is on purpose */ This comment seems redundant. > +/* > + * Generic draw shadow rectangle function. It is used to draw menus, menu items > + * and also toggle buttons. When ERASE_P is true, it clears shadows. DOWN_P is > + * true when a menu item is pushed or a button toggled. TOP_GC and BOTTOM_GC > + * are the graphic contexts used to draw the top and bottom shadow respectively. > + */ Please fix and re-fill the comment. We write comments like this: /* Take BAR and BAZ, and call foo_1 if appropriate. Otherwise, return false. */ > + xgcv.foreground = mw->menu.highlight_foreground; > + xgcv.background = (mw->menu.highlight_background == -1) ? > + mw->core.background_pixel : mw->menu.highlight_background; > + mw->menu.highlight_foreground_gc = XtGetGC ((Widget)mw, mask, &xgcv); > + > + xgcv.foreground = (mw->menu.highlight_background == -1) ? > + mw->core.background_pixel : mw->menu.highlight_background; > + xgcv.background = mw->menu.foreground; > + mw->menu.highlight_background_gc = XtGetGC ((Widget)mw, mask, &xgcv); What I said about coding style also applies here. Also, don't write: abc = foo_1_2 () ? mw->core.background_pixel : foo_1 (); but write: abc = (foo_1_2 () ? mw->core.background_pixel : foo_1 ()); > static void > @@ -1724,12 +1847,16 @@ release_drawing_gcs (XlwMenuWidget mw) > XtReleaseGC ((Widget) mw, mw->menu.disabled_gc); > XtReleaseGC ((Widget) mw, mw->menu.inactive_button_gc); > XtReleaseGC ((Widget) mw, mw->menu.background_gc); > + XtReleaseGC ((Widget) mw, mw->menu.highlight_foreground_gc); > + XtReleaseGC ((Widget) mw, mw->menu.highlight_background_gc); > /* let's get some segvs if we try to use these... */ > mw->menu.foreground_gc = (GC) -1; > mw->menu.button_gc = (GC) -1; > mw->menu.disabled_gc = (GC) -1; > mw->menu.inactive_button_gc = (GC) -1; > mw->menu.background_gc = (GC) -1; > + mw->menu.highlight_foreground_gc = (GC) -1; > + mw->menu.highlight_background_gc = (GC) -1; > } > > #ifndef emacs > @@ -1738,29 +1865,34 @@ #define MINL(x,y) ((((unsigned long) (x)) < ((unsigned long) (y))) \ > #endif > > static void > -make_shadow_gcs (XlwMenuWidget mw) > +compute_shadow_colors(XlwMenuWidget mw, > + Pixel *top_color, > + Pixel *bottom_color, > + Boolean *free_top_p, > + Boolean *free_bottom_p, > + Pixmap *top_pixmap, > + Pixmap *bottom_pixmap, > + Pixel fore_color, > + Pixel back_color) There should be a space after "compute_shadow_colors". > +static void > +make_shadow_gcs (XlwMenuWidget mw) > +{ > + XGCValues xgcv; > + unsigned long pm = 0; > + > + /* Normal shadows */ > + compute_shadow_colors(mw, > + &(mw->menu.top_shadow_color), > + &(mw->menu.bottom_shadow_color), > + &(mw->menu.free_top_shadow_color_p), > + &(mw->menu.free_bottom_shadow_color_p), > + &(mw->menu.top_shadow_pixmap), > + &(mw->menu.bottom_shadow_pixmap), > + mw->menu.foreground, > + mw->core.background_pixel); > + > + /* Highlight shadows */ > + compute_shadow_colors(mw, > + &(mw->menu.top_highlight_shadow_color), > + &(mw->menu.bottom_highlight_shadow_color), > + &(mw->menu.free_top_highlight_shadow_color_p), > + &(mw->menu.free_bottom_highlight_shadow_color_p), > + &(mw->menu.top_highlight_shadow_pixmap), > + &(mw->menu.bottom_highlight_shadow_pixmap), > + mw->menu.highlight_foreground, > + mw->menu.highlight_background); > > xgcv.fill_style = FillStippled; > xgcv.foreground = mw->menu.top_shadow_color; > @@ -1862,6 +2017,16 @@ make_shadow_gcs (XlwMenuWidget mw) > xgcv.stipple = mw->menu.bottom_shadow_pixmap; > pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0); Please put spaces between "GCStipple", "|", and "GCFillStyle". Also, place a space after "compute_shadow_colors". > mw->menu.shadow_bottom_gc = XtGetGC ((Widget)mw, GCForeground | pm, &xgcv); > + > + xgcv.foreground = mw->menu.top_highlight_shadow_color; > + xgcv.stipple = mw->menu.top_highlight_shadow_pixmap; > + pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0); > + mw->menu.highlight_shadow_top_gc = XtGetGC ((Widget)mw, GCForeground | pm, &xgcv); > + > + xgcv.foreground = mw->menu.bottom_highlight_shadow_color; > + xgcv.stipple = mw->menu.bottom_highlight_shadow_pixmap; > + pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0); > + mw->menu.highlight_shadow_bottom_gc = XtGetGC ((Widget)mw, GCForeground | pm, &xgcv); > } What was said about casts also applies here. > @@ -2038,12 +2203,14 @@ XlwMenuRealize (Widget w, Mask *valueMask, XSetWindowAttributes *attributes) > #if defined USE_CAIRO || defined HAVE_XFT > if (mw->menu.xft_font) > { > - XColor colors[3]; > + XColor colors[4]; > colors[0].pixel = mw->menu.xft_fg.pixel = mw->menu.foreground; > colors[1].pixel = mw->menu.xft_bg.pixel = mw->core.background_pixel; > colors[2].pixel = mw->menu.xft_disabled_fg.pixel > = mw->menu.disabled_foreground; > - XQueryColors (XtDisplay (mw), mw->core.colormap, colors, 3); > + colors[3].pixel = mw->menu.xft_highlight_fg.pixel > + = mw->menu.highlight_foreground; > + XQueryColors (XtDisplay (mw), mw->core.colormap, colors, 4); > mw->menu.xft_fg.color.alpha = 0xFFFF; > mw->menu.xft_fg.color.red = colors[0].red; > mw->menu.xft_fg.color.green = colors[0].green; > @@ -2056,6 +2223,10 @@ XlwMenuRealize (Widget w, Mask *valueMask, XSetWindowAttributes *attributes) > mw->menu.xft_disabled_fg.color.red = colors[2].red; > mw->menu.xft_disabled_fg.color.green = colors[2].green; > mw->menu.xft_disabled_fg.color.blue = colors[2].blue; > + mw->menu.xft_highlight_fg.color.alpha = 0xFFFF; > + mw->menu.xft_highlight_fg.color.red = colors[3].red; > + mw->menu.xft_highlight_fg.color.green = colors[3].green; > + mw->menu.xft_highlight_fg.color.blue = colors[3].blue; > } > #endif > } > diff --git a/lwlib/xlwmenu.h b/lwlib/xlwmenu.h > index 7f4bf35939..f68d913b5a 100644 > --- a/lwlib/xlwmenu.h > +++ b/lwlib/xlwmenu.h > @@ -58,6 +58,10 @@ #define XtNallowResize "allowResize" > #define XtCAllowResize "AllowResize" > #define XtNborderThickness "borderThickness" > #define XtCBorderThickness "BorderThickness" > +#define XtNhighlightForeground "highlightForeground" > +#define XtCHighlightForeground "HighlightForeground" > +#define XtNhighlightBackground "highlightBackground" > +#define XtCHighlightBackground "HighlightBackground" > > /* Motif-compatible resource names */ > #define XmNshadowThickness "shadowThickness" > @@ -70,6 +74,16 @@ #define XmNtopShadowPixmap "topShadowPixmap" > #define XmCTopShadowPixmap "TopShadowPixmap" > #define XmNbottomShadowPixmap "bottomShadowPixmap" > #define XmCBottomShadowPixmap "BottomShadowPixmap" > +#define XmNtopHighlightShadowColor "topHighlightShadowColor" > +#define XmCTopHighlightShadowColor "TopHighlightShadowColor" > +#define XmNbottomHighlightShadowColor "bottomHighlightShadowColor" > +#define XmCBottomHighlightShadowColor "BottomHighlightShadowColor" > +#define XmNtopHighlightShadowPixmap "topHighlightShadowPixmap" > +#define XmCTopHighlightShadowPixmap "TopHighlightShadowPixmap" > +#define XmNbottomHighlightShadowPixmap "bottomHighlightShadowPixmap" > +#define XmCBottomHighlightShadowPixmap "BottomHighlightShadowPixmap" Motif doesn't have widget resources named topHighlightShadowColor, bottomHighlightShadowColor, topHighlightShadowPixmap or bottomHighlightShadowPixmap. So please delete these. > #define XmRHorizontalDimension "HorizontalDimension" > > typedef struct _XlwMenuRec *XlwMenuWidget; > diff --git a/lwlib/xlwmenuP.h b/lwlib/xlwmenuP.h > index 455ecdbce0..c314eb3e91 100644 > --- a/lwlib/xlwmenuP.h > +++ b/lwlib/xlwmenuP.h > @@ -63,13 +63,15 @@ #define _XlwMenuP_h > #if defined USE_CAIRO || defined HAVE_XFT > int default_face; > XftFont* xft_font; > - XftColor xft_fg, xft_bg, xft_disabled_fg; > + XftColor xft_fg, xft_bg, xft_disabled_fg, xft_highlight_fg; > #endif > String fontName; > XFontStruct* font; > Pixel foreground; > Pixel disabled_foreground; > Pixel button_foreground; > + Pixel highlight_foreground; > + Pixel highlight_background; > Dimension margin; > Dimension horizontal_spacing; > Dimension vertical_spacing; > @@ -80,6 +82,10 @@ #define _XlwMenuP_h > Pixel bottom_shadow_color; > Pixmap top_shadow_pixmap; > Pixmap bottom_shadow_pixmap; > + Pixel top_highlight_shadow_color; > + Pixel bottom_highlight_shadow_color; > + Pixmap top_highlight_shadow_pixmap; > + Pixmap bottom_highlight_shadow_pixmap; > Cursor cursor_shape; > XtCallbackList open; > XtCallbackList select, highlight; > @@ -88,8 +94,10 @@ #define _XlwMenuP_h > int horizontal; > > /* True means top_shadow_color and/or bottom_shadow_color must be freed. */ > - bool_bf free_top_shadow_color_p : 1; > - bool_bf free_bottom_shadow_color_p : 1; > + Boolean free_top_shadow_color_p; > + Boolean free_bottom_shadow_color_p; > + Boolean free_top_highlight_shadow_color_p; > + Boolean free_bottom_highlight_shadow_color_p; > > /* State of the XlwMenu */ > int top_depth; > @@ -112,9 +120,13 @@ #define _XlwMenuP_h > GC button_gc; > GC background_gc; > GC disabled_gc; > + GC highlight_foreground_gc; > + GC highlight_background_gc; > GC inactive_button_gc; > GC shadow_top_gc; > GC shadow_bottom_gc; > + GC highlight_shadow_top_gc; > + GC highlight_shadow_bottom_gc; > Cursor cursor; > Boolean popped_up; > Pixmap gray_pixmap; I haven't looked at the code here in much detail yet, but please verify that it builds and works correctly under Xft, Cairo, and without either of the two, and under a pseudo-color visual. (To get an X server with a pseudo color visual, run "Xephyr -screen 800x800x8".) Thanks. From debbugs-submit-bounces@debbugs.gnu.org Thu Jul 14 05:42:19 2022 Received: (at 56538) by debbugs.gnu.org; 14 Jul 2022 09:42:19 +0000 Received: from localhost ([127.0.0.1]:48886 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oBvMQ-0002a3-1n for submit@debbugs.gnu.org; Thu, 14 Jul 2022 05:42:19 -0400 Received: from ledu-giraud.fr ([51.159.28.247]:10964) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oBvMN-0002Zu-D7 for 56538@debbugs.gnu.org; Thu, 14 Jul 2022 05:42:17 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; s=rsa; bh=jlscrrsdYP0gS3eP HeI+/83vE5jDf3ICWlmfPHyKAoQ=; h=date:references:in-reply-to:subject: cc:to:from; d=ledu-giraud.fr; b=RvvYasV5xJ68/EV0iXZniU710SNjpDaj63zSTl YH2aN9/v3MHJeOyfN3UgKegzcbBUiMdHpHJHjE0gaeLGoaN7E2oVPwpd6bvUXNXkZqcImn NITuxf0+VTEBvwAvidfi9dakREeaodEM9ZxSTO9K71ZVs0mwxm9lNI9yeBQr1aO1FzFSnN frvNOLQ1nvJ2cl2iKSbjsMRJfhdGOug+BDFDOrnKUJmQd6yuZdh8n5nXxOOsrqDbDoqZoN WGC1qayPkk9YjB15mdrXPA3SRP4OcCFSFuiw6+XM7UgD/X3T8omt2YJ0v+lU2FVoyNlsDP BYiUf3QSNaADMOmniZ6uSkfA== Received: from elite.giraud ( [10.1.1.1]) by ledu-giraud.fr (OpenSMTPD) with ESMTPSA id 1865ba40 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Thu, 14 Jul 2022 11:42:12 +0200 (CEST) From: Manuel Giraud To: Po Lu Subject: Re: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend In-Reply-To: <87k08gtsz0.fsf@yahoo.com> (Po Lu's message of "Thu, 14 Jul 2022 08:53:39 +0800") References: <87wnch16as.fsf@elite.giraud> <87k08gtsz0.fsf@yahoo.com> Date: Thu, 14 Jul 2022 11:42:06 +0200 Message-ID: <87cze8t4i9.fsf@elite.giraud> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (berkeley-unix) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 56538 Cc: 56538@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain Po Lu writes: Hi Po and thanks for your comments, [...] >> + /* XXX the following permutation is on purpose */ > > This comment seems redundant. I have attached a new version of my patch taking your remarks into account but I did not remove this comment. I think it could be useful to understand that "top_gc = something_bottom_gc" is not a typo here. I have also done the following testing with Xft/cairo/PseudoColor combinations: |-------------+-----------------+-----------------+-----------------+---------------------| | | Xft + cairo | Xft only | cairo only | None | |-------------+-----------------+-----------------+-----------------+---------------------| | X Truecolor | ok | ok | ok | ok but with a | | | | | | default tiny face | |-------------+-----------------+-----------------+-----------------+---------------------| | Xephyr | ok but color | ok but color | ok but color | ok, colors ok, but | | Pseudocolor | not quite right | not quite right | not quite right | with a default tiny | | | around each | around menu | around each | face [fn:2] | | | glyph [fn:1] | labels [fn:2] | glyph [fn:1] | | |-------------+-----------------+-----------------+-----------------+---------------------| * Footnotes [fn:1] Aside from the Lucid widget, the emacs buffer is completly blank. [fn:2] This time the emacs buffer is here. tool-bar icons are ugly. --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-Colored-menu-highlight-in-Lucid-backend.patch >From e0fb799bc55367c08b2511fda78f98570bda6fdc Mon Sep 17 00:00:00 2001 From: Manuel Giraud Date: Mon, 11 Jul 2022 11:14:08 +0200 Subject: [PATCH] Colored menu highlight in Lucid backend * lwlib/xlwmenuP.h: * lwlib/xlwmenu.h: * lwlib/xlwmenu.c: Introduce resources to handle colored highlighting of menu entries. * doc/emacs/xresources.texi (Lucid Resources): Documentation. --- doc/emacs/xresources.texi | 4 + etc/NEWS | 5 + lwlib/xlwmenu.c | 342 ++++++++++++++++++++++++++++---------- lwlib/xlwmenu.h | 4 + lwlib/xlwmenuP.h | 18 +- 5 files changed, 281 insertions(+), 92 deletions(-) diff --git a/doc/emacs/xresources.texi b/doc/emacs/xresources.texi index 2c2700bc15..f8be06b5e7 100644 --- a/doc/emacs/xresources.texi +++ b/doc/emacs/xresources.texi @@ -449,6 +449,10 @@ Lucid Resources Foreground color. @item disabledForeground Foreground color for a disabled menu item. +@item highlightForeground +Foreground color for a highlighted menu item. +@item highlightBackground +Background color for a highlighted menu item. @ifnottex @item horizontalSpacing Horizontal spacing in pixels between items. Default is 3. diff --git a/etc/NEWS b/etc/NEWS index bf36316890..e1c708ca9d 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -544,6 +544,11 @@ and pop-up menus. This controls the style of the pre-edit and status areas of X input methods. ++++ +** New X resources: "highlightForeground" and "highlightBackground" +Only in the Lucid build, this controls colors used for highlighted +menu item widget. + +++ ** On X11, Emacs now tries to synchronize window resize with the window manager. This leads to less flicker and empty areas of a frame being displayed diff --git a/lwlib/xlwmenu.c b/lwlib/xlwmenu.c index 68f49e646d..a15803cfc3 100644 --- a/lwlib/xlwmenu.c +++ b/lwlib/xlwmenu.c @@ -121,6 +121,10 @@ #define DEFAULT_FONTNAME "XtDefaultFont" offset(menu.disabled_foreground), XtRString, (XtPointer)NULL}, {XtNbuttonForeground, XtCButtonForeground, XtRPixel, sizeof(Pixel), offset(menu.button_foreground), XtRString, "XtDefaultForeground"}, + {XtNhighlightForeground, XtCHighlightForeground, XtRPixel, sizeof(Pixel), + offset(menu.highlight_foreground), XtRString, "XtDefaultForeground"}, + {XtNhighlightBackground, XtCHighlightBackground, XtRPixel, sizeof(Pixel), + offset(menu.highlight_background), XtRImmediate, (XtPointer)-1}, {XtNmargin, XtCMargin, XtRDimension, sizeof(Dimension), offset(menu.margin), XtRImmediate, (XtPointer)1}, {XtNhorizontalSpacing, XtCMargin, XtRDimension, sizeof(Dimension), @@ -570,8 +574,7 @@ draw_arrow (XlwMenuWidget mw, int down_p) { Display *dpy = XtDisplay (mw); - GC top_gc = mw->menu.shadow_top_gc; - GC bottom_gc = mw->menu.shadow_bottom_gc; + GC top_gc, bottom_gc; int thickness = mw->menu.shadow_thickness; int height = width; XPoint pt[10]; @@ -584,10 +587,14 @@ draw_arrow (XlwMenuWidget mw, if (down_p) { - GC temp; - temp = top_gc; - top_gc = bottom_gc; - bottom_gc = temp; + /* XXX the following permutation is on purpose */ + top_gc = mw->menu.highlight_shadow_bottom_gc; + bottom_gc = mw->menu.highlight_shadow_top_gc; + } + else + { + top_gc = mw->menu.shadow_top_gc; + bottom_gc = mw->menu.shadow_bottom_gc; } pt[0].x = x; @@ -621,8 +628,11 @@ draw_arrow (XlwMenuWidget mw, XFillPolygon (dpy, window, bottom_gc, pt, 4, Convex, CoordModeOrigin); } - - +/* Generic draw shadow rectangle function. It is used to draw menus, + menu items and also toggle buttons. When ERASE_P is true, it + clears shadows. DOWN_P is true when a menu item is pushed or a + button toggled. TOP_GC and BOTTOM_GC are the graphic contexts used + to draw the top and bottom shadow respectively. */ static void draw_shadow_rectangle (XlwMenuWidget mw, Window window, @@ -631,14 +641,28 @@ draw_shadow_rectangle (XlwMenuWidget mw, int width, int height, int erase_p, - int down_p) + int down_p, + GC top_gc, + GC bottom_gc) { Display *dpy = XtDisplay (mw); - GC top_gc = !erase_p ? mw->menu.shadow_top_gc : mw->menu.background_gc; - GC bottom_gc = !erase_p ? mw->menu.shadow_bottom_gc : mw->menu.background_gc; int thickness = !x && !y ? mw->menu.border_thickness : mw->menu.shadow_thickness; XPoint points [4]; + /* Choose correct GC with a standard default if NULL. */ + if (erase_p) + { + top_gc = mw->menu.background_gc; + bottom_gc = mw->menu.background_gc; + } + else + { + if (top_gc == NULL) + top_gc = mw->menu.shadow_top_gc; + if (bottom_gc == NULL) + bottom_gc = mw->menu.shadow_bottom_gc; + } + if (!erase_p && width == height && width == toggle_button_width (mw)) { points [0].x = x; @@ -654,6 +678,7 @@ draw_shadow_rectangle (XlwMenuWidget mw, points, 4, Convex, CoordModeOrigin); } + if (!erase_p && down_p) { GC temp; @@ -662,6 +687,7 @@ draw_shadow_rectangle (XlwMenuWidget mw, bottom_gc = temp; } + /* Do draw (or erase) shadows */ points [0].x = x; points [0].y = y; points [1].x = x + width; @@ -709,14 +735,28 @@ draw_shadow_rhombus (XlwMenuWidget mw, int width, int height, int erase_p, - int down_p) + int down_p, + GC top_gc, + GC bottom_gc) { Display *dpy = XtDisplay (mw); - GC top_gc = !erase_p ? mw->menu.shadow_top_gc : mw->menu.background_gc; - GC bottom_gc = !erase_p ? mw->menu.shadow_bottom_gc : mw->menu.background_gc; int thickness = mw->menu.shadow_thickness; XPoint points [4]; + /* Choose correct GC with a standard default if NULL */ + if (erase_p) + { + top_gc = mw->menu.background_gc; + bottom_gc = mw->menu.background_gc; + } + else + { + if (top_gc == NULL) + top_gc = mw->menu.shadow_top_gc; + if (bottom_gc == NULL) + top_gc = mw->menu.shadow_bottom_gc; + } + if (!erase_p && width == height && width == radio_button_width (mw)) { points [0].x = x; @@ -784,15 +824,29 @@ draw_shadow_rhombus (XlwMenuWidget mw, toggle button is selected. */ static void -draw_toggle (XlwMenuWidget mw, Window window, int x, int y, int selected_p) +draw_toggle (XlwMenuWidget mw, Window window, int x, int y, int selected_p, + int highlighted_p) { int width, height; + GC top_gc, bottom_gc; + + if (highlighted_p) + { + top_gc = mw->menu.highlight_shadow_top_gc; + bottom_gc = mw->menu.highlight_shadow_bottom_gc; + } + else + { + top_gc = mw->menu.shadow_top_gc; + bottom_gc = mw->menu.shadow_bottom_gc; + } width = toggle_button_width (mw); height = width; x += mw->menu.horizontal_spacing; y += (MENU_FONT_ASCENT (mw) - height) / 2; - draw_shadow_rectangle (mw, window, x, y, width, height, False, selected_p); + draw_shadow_rectangle (mw, window, x, y, width, height, False, + selected_p, top_gc, bottom_gc); } @@ -801,15 +855,29 @@ draw_toggle (XlwMenuWidget mw, Window window, int x, int y, int selected_p) toggle button is selected. */ static void -draw_radio (XlwMenuWidget mw, Window window, int x, int y, int selected_p) +draw_radio (XlwMenuWidget mw, Window window, int x, int y, int selected_p, + int highlighted_p) { int width, height; + GC top_gc, bottom_gc; + + if (highlighted_p) + { + top_gc = mw->menu.highlight_shadow_top_gc; + bottom_gc = mw->menu.highlight_shadow_bottom_gc; + } + else + { + top_gc = mw->menu.shadow_top_gc; + bottom_gc = mw->menu.shadow_bottom_gc; + } width = radio_button_width (mw); height = width; x += mw->menu.horizontal_spacing; y += (MENU_FONT_ASCENT (mw) - height) / 2; - draw_shadow_rhombus (mw, window, x, y, width, height, False, selected_p); + draw_shadow_rhombus (mw, window, x, y, width, height, False, selected_p, + top_gc, bottom_gc); } @@ -968,6 +1036,33 @@ separator_height (enum menu_separator separator) } } +static void +draw_highlight (XlwMenuWidget mw, + Window window, + int x, + int y, + int width, + int height) +{ + Display *dpy = XtDisplay (mw); + XPoint points [4]; + + points [0].x = x; + points [0].y = y; + points [1].x = x + width; + points [1].y = y; + points [2].x = x + width; + points [2].y = y + height; + points [3].x = x; + points [3].y = y + height; + XFillPolygon (dpy, window, + mw->menu.highlight_background_gc, + points, 4, Convex, CoordModeOrigin); + + draw_shadow_rectangle(mw, window, x, y, width, height, False, False, + mw->menu.highlight_shadow_top_gc, + mw->menu.highlight_shadow_bottom_gc); +} /* Display the menu item and increment where.x and where.y to show how large the menu item was. */ @@ -983,7 +1078,6 @@ display_menu_item (XlwMenuWidget mw, { GC deco_gc; GC text_gc; - int font_height = MENU_FONT_HEIGHT (mw); int font_ascent = MENU_FONT_ASCENT (mw); int shadow = mw->menu.shadow_thickness; int margin = mw->menu.margin; @@ -1032,12 +1126,21 @@ display_menu_item (XlwMenuWidget mw, /* pick the foreground and background GC. */ if (val->enabled) - text_gc = mw->menu.foreground_gc; + if (highlighted_p) + text_gc = mw->menu.highlight_foreground_gc; + else + text_gc = mw->menu.foreground_gc; else text_gc = mw->menu.disabled_gc; deco_gc = mw->menu.foreground_gc; #if defined USE_CAIRO || defined HAVE_XFT - xftfg = val->enabled ? &mw->menu.xft_fg : &mw->menu.xft_disabled_fg; + if (val->enabled) + if (highlighted_p) + xftfg = &mw->menu.xft_highlight_fg; + else + xftfg = &mw->menu.xft_fg; + else + xftfg = &mw->menu.xft_disabled_fg; #endif if (separator_p) @@ -1048,8 +1151,11 @@ display_menu_item (XlwMenuWidget mw, { int x_offset = x + h_spacing + shadow; char* display_string = resource_widget_value (mw, val); - draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, True, - False); + /* Clears shadows and maybe highlight */ + draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, + True, False, NULL, NULL); + if (highlighted_p) + draw_highlight (mw, ws->pixmap, x, y, width, height); /* Deal with centering a menu title. */ if (!horizontal_p && !val->contents && !val->call_data) @@ -1095,10 +1201,10 @@ display_menu_item (XlwMenuWidget mw, { if (val->button_type == BUTTON_TYPE_TOGGLE) draw_toggle (mw, ws->pixmap, x, y + v_spacing + shadow, - val->selected); + val->selected, highlighted_p); else if (val->button_type == BUTTON_TYPE_RADIO) draw_radio (mw, ws->pixmap, x, y + v_spacing + shadow, - val->selected); + val->selected, highlighted_p); if (val->contents) { @@ -1145,25 +1251,18 @@ display_menu_item (XlwMenuWidget mw, } else { - XDrawRectangle (XtDisplay (mw), ws->pixmap, - mw->menu.background_gc, - x + shadow, y + shadow, - label_width + h_spacing - 1, - font_height + 2 * v_spacing - 1); - draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, - True, False); + /* If not highlighted, clears shadows for horizontal + menu item */ + if (!highlighted_p) + draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, + True, False, NULL, NULL); } #ifdef USE_CAIRO if (ws->xft_draw) cairo_surface_flush (cairo_get_target (ws->xft_draw)); #endif - - if (highlighted_p) - draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, False, - False); } } - where->x += width; where->y += height; } @@ -1257,7 +1356,7 @@ display_menu (XlwMenuWidget mw, if (!just_compute_p) { draw_shadow_rectangle (mw, ws->pixmap, 0, 0, ws->width, ws->height, - False, False); + False, False, NULL, NULL); XCopyArea (XtDisplay (mw), ws->pixmap, ws->window, mw->menu.foreground_gc, 0, 0, ws->width, ws->height, 0, 0); } @@ -1714,6 +1813,18 @@ #define BRIGHTNESS(color) (((color) & 0xff) + (((color) >> 8) & 0xff) + (((color xgcv.foreground = mw->core.background_pixel; xgcv.background = mw->menu.foreground; mw->menu.background_gc = XtGetGC ((Widget)mw, mask, &xgcv); + + xgcv.foreground = mw->menu.highlight_foreground; + xgcv.background = ((mw->menu.highlight_background == -1) + ? mw->core.background_pixel + : mw->menu.highlight_background); + mw->menu.highlight_foreground_gc = XtGetGC ((Widget)mw, mask, &xgcv); + + xgcv.foreground = ((mw->menu.highlight_background == -1) + ? mw->core.background_pixel + : mw->menu.highlight_background); + xgcv.background = mw->menu.foreground; + mw->menu.highlight_background_gc = XtGetGC ((Widget)mw, mask, &xgcv); } static void @@ -1724,12 +1835,16 @@ release_drawing_gcs (XlwMenuWidget mw) XtReleaseGC ((Widget) mw, mw->menu.disabled_gc); XtReleaseGC ((Widget) mw, mw->menu.inactive_button_gc); XtReleaseGC ((Widget) mw, mw->menu.background_gc); + XtReleaseGC ((Widget) mw, mw->menu.highlight_foreground_gc); + XtReleaseGC ((Widget) mw, mw->menu.highlight_background_gc); /* let's get some segvs if we try to use these... */ mw->menu.foreground_gc = (GC) -1; mw->menu.button_gc = (GC) -1; mw->menu.disabled_gc = (GC) -1; mw->menu.inactive_button_gc = (GC) -1; mw->menu.background_gc = (GC) -1; + mw->menu.highlight_foreground_gc = (GC) -1; + mw->menu.highlight_background_gc = (GC) -1; } #ifndef emacs @@ -1738,29 +1853,34 @@ #define MINL(x,y) ((((unsigned long) (x)) < ((unsigned long) (y))) \ #endif static void -make_shadow_gcs (XlwMenuWidget mw) +compute_shadow_colors (XlwMenuWidget mw, + Pixel *top_color, + Pixel *bottom_color, + Boolean *free_top_p, + Boolean *free_bottom_p, + Pixmap *top_pixmap, + Pixmap *bottom_pixmap, + Pixel fore_color, + Pixel back_color) { - XGCValues xgcv; - unsigned long pm = 0; Display *dpy = XtDisplay ((Widget) mw); Screen *screen = XtScreen ((Widget) mw); Colormap cmap = mw->core.colormap; XColor topc, botc; int top_frobbed = 0, bottom_frobbed = 0; - mw->menu.free_top_shadow_color_p = 0; - mw->menu.free_bottom_shadow_color_p = 0; + *free_top_p = False; + *free_bottom_p = False; - if (mw->menu.top_shadow_color == -1) - mw->menu.top_shadow_color = mw->core.background_pixel; + if (*top_color == -1) + *top_color = back_color; - if (mw->menu.bottom_shadow_color == -1) - mw->menu.bottom_shadow_color = mw->menu.foreground; + if (*bottom_color == -1) + *bottom_color = fore_color; - if (mw->menu.top_shadow_color == mw->core.background_pixel || - mw->menu.top_shadow_color == mw->menu.foreground) + if (*top_color == back_color || *top_color == fore_color) { - topc.pixel = mw->core.background_pixel; + topc.pixel = back_color; #ifdef emacs if (x_alloc_lighter_color_for_widget ((Widget) mw, dpy, cmap, &topc.pixel, @@ -1774,15 +1894,14 @@ make_shadow_gcs (XlwMenuWidget mw) if (XAllocColor (dpy, cmap, &topc)) #endif { - mw->menu.top_shadow_color = topc.pixel; - mw->menu.free_top_shadow_color_p = 1; + *top_color = topc.pixel; + *free_top_p = True; top_frobbed = 1; } } - if (mw->menu.bottom_shadow_color == mw->menu.foreground || - mw->menu.bottom_shadow_color == mw->core.background_pixel) + if (*bottom_color == fore_color || *bottom_color == back_color) { - botc.pixel = mw->core.background_pixel; + botc.pixel = back_color; #ifdef emacs if (x_alloc_lighter_color_for_widget ((Widget) mw, dpy, cmap, &botc.pixel, @@ -1795,8 +1914,8 @@ make_shadow_gcs (XlwMenuWidget mw) if (XAllocColor (dpy, cmap, &botc)) #endif { - mw->menu.bottom_shadow_color = botc.pixel; - mw->menu.free_bottom_shadow_color_p = 1; + *bottom_color = botc.pixel; + *free_bottom_p = True; bottom_frobbed = 1; } } @@ -1805,63 +1924,97 @@ make_shadow_gcs (XlwMenuWidget mw) { if (topc.pixel == botc.pixel) { - if (botc.pixel == mw->menu.foreground) + if (botc.pixel == fore_color) { - if (mw->menu.free_top_shadow_color_p) + if (*free_top_p) { - x_free_dpy_colors (dpy, screen, cmap, - &mw->menu.top_shadow_color, 1); - mw->menu.free_top_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, top_color, 1); + *free_top_p = False; } - mw->menu.top_shadow_color = mw->core.background_pixel; + *top_color = back_color; } else { - if (mw->menu.free_bottom_shadow_color_p) + if (*free_bottom_p) { - x_free_dpy_colors (dpy, screen, cmap, - &mw->menu.bottom_shadow_color, 1); - mw->menu.free_bottom_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, bottom_color, 1); + *free_bottom_p = False; } - mw->menu.bottom_shadow_color = mw->menu.foreground; + *bottom_color = fore_color; } } } - if (!mw->menu.top_shadow_pixmap - && mw->menu.top_shadow_color == mw->core.background_pixel) + if (!*top_pixmap && *top_color == back_color) { - mw->menu.top_shadow_pixmap = mw->menu.gray_pixmap; - if (mw->menu.free_top_shadow_color_p) + *top_pixmap = mw->menu.gray_pixmap; + if (*free_top_p) { - x_free_dpy_colors (dpy, screen, cmap, &mw->menu.top_shadow_color, 1); - mw->menu.free_top_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, top_color, 1); + *free_top_p = False; } - mw->menu.top_shadow_color = mw->menu.foreground; + *top_color = fore_color; } - if (!mw->menu.bottom_shadow_pixmap - && mw->menu.bottom_shadow_color == mw->core.background_pixel) + if (!*bottom_pixmap && *bottom_color == back_color) { - mw->menu.bottom_shadow_pixmap = mw->menu.gray_pixmap; - if (mw->menu.free_bottom_shadow_color_p) + *bottom_pixmap = mw->menu.gray_pixmap; + if (*free_bottom_p) { - x_free_dpy_colors (dpy, screen, cmap, - &mw->menu.bottom_shadow_color, 1); - mw->menu.free_bottom_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, bottom_color, 1); + *free_bottom_p = False; } - mw->menu.bottom_shadow_color = mw->menu.foreground; + *bottom_color = fore_color; } +} + +static void +make_shadow_gcs (XlwMenuWidget mw) +{ + XGCValues xgcv; + unsigned long pm = 0; + + /* Normal shadows */ + compute_shadow_colors (mw, + &(mw->menu.top_shadow_color), + &(mw->menu.bottom_shadow_color), + &(mw->menu.free_top_shadow_color_p), + &(mw->menu.free_bottom_shadow_color_p), + &(mw->menu.top_shadow_pixmap), + &(mw->menu.bottom_shadow_pixmap), + mw->menu.foreground, + mw->core.background_pixel); + + /* Highlight shadows */ + compute_shadow_colors (mw, + &(mw->menu.top_highlight_shadow_color), + &(mw->menu.bottom_highlight_shadow_color), + &(mw->menu.free_top_highlight_shadow_color_p), + &(mw->menu.free_bottom_highlight_shadow_color_p), + &(mw->menu.top_highlight_shadow_pixmap), + &(mw->menu.bottom_highlight_shadow_pixmap), + mw->menu.highlight_foreground, + mw->menu.highlight_background); xgcv.fill_style = FillStippled; xgcv.foreground = mw->menu.top_shadow_color; xgcv.stipple = mw->menu.top_shadow_pixmap; - pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0); - mw->menu.shadow_top_gc = XtGetGC ((Widget)mw, GCForeground | pm, &xgcv); + pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0); + mw->menu.shadow_top_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv); xgcv.foreground = mw->menu.bottom_shadow_color; xgcv.stipple = mw->menu.bottom_shadow_pixmap; - pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0); - mw->menu.shadow_bottom_gc = XtGetGC ((Widget)mw, GCForeground | pm, &xgcv); + pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0); + mw->menu.shadow_bottom_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv); + + xgcv.foreground = mw->menu.top_highlight_shadow_color; + xgcv.stipple = mw->menu.top_highlight_shadow_pixmap; + pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0); + mw->menu.highlight_shadow_top_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv); + + xgcv.foreground = mw->menu.bottom_highlight_shadow_color; + xgcv.stipple = mw->menu.bottom_highlight_shadow_pixmap; + pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0); + mw->menu.highlight_shadow_bottom_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv); } @@ -1964,6 +2117,11 @@ XlwMenuInitialize (Widget request, Widget w, ArgList args, Cardinal *num_args) mw->menu.font_extents = XExtentsOfFontSet (mw->menu.fontSet); #endif + mw->menu.top_highlight_shadow_color = -1; + mw->menu.bottom_highlight_shadow_color = -1; + mw->menu.top_highlight_shadow_pixmap = None; + mw->menu.bottom_highlight_shadow_pixmap = None; + make_drawing_gcs (mw); make_shadow_gcs (mw); @@ -2038,12 +2196,14 @@ XlwMenuRealize (Widget w, Mask *valueMask, XSetWindowAttributes *attributes) #if defined USE_CAIRO || defined HAVE_XFT if (mw->menu.xft_font) { - XColor colors[3]; + XColor colors[4]; colors[0].pixel = mw->menu.xft_fg.pixel = mw->menu.foreground; colors[1].pixel = mw->menu.xft_bg.pixel = mw->core.background_pixel; colors[2].pixel = mw->menu.xft_disabled_fg.pixel = mw->menu.disabled_foreground; - XQueryColors (XtDisplay (mw), mw->core.colormap, colors, 3); + colors[3].pixel = mw->menu.xft_highlight_fg.pixel + = mw->menu.highlight_foreground; + XQueryColors (XtDisplay (mw), mw->core.colormap, colors, 4); mw->menu.xft_fg.color.alpha = 0xFFFF; mw->menu.xft_fg.color.red = colors[0].red; mw->menu.xft_fg.color.green = colors[0].green; @@ -2056,6 +2216,10 @@ XlwMenuRealize (Widget w, Mask *valueMask, XSetWindowAttributes *attributes) mw->menu.xft_disabled_fg.color.red = colors[2].red; mw->menu.xft_disabled_fg.color.green = colors[2].green; mw->menu.xft_disabled_fg.color.blue = colors[2].blue; + mw->menu.xft_highlight_fg.color.alpha = 0xFFFF; + mw->menu.xft_highlight_fg.color.red = colors[3].red; + mw->menu.xft_highlight_fg.color.green = colors[3].green; + mw->menu.xft_highlight_fg.color.blue = colors[3].blue; } #endif } diff --git a/lwlib/xlwmenu.h b/lwlib/xlwmenu.h index 7f4bf35939..4e36bde3fb 100644 --- a/lwlib/xlwmenu.h +++ b/lwlib/xlwmenu.h @@ -58,6 +58,10 @@ #define XtNallowResize "allowResize" #define XtCAllowResize "AllowResize" #define XtNborderThickness "borderThickness" #define XtCBorderThickness "BorderThickness" +#define XtNhighlightForeground "highlightForeground" +#define XtCHighlightForeground "HighlightForeground" +#define XtNhighlightBackground "highlightBackground" +#define XtCHighlightBackground "HighlightBackground" /* Motif-compatible resource names */ #define XmNshadowThickness "shadowThickness" diff --git a/lwlib/xlwmenuP.h b/lwlib/xlwmenuP.h index 455ecdbce0..c314eb3e91 100644 --- a/lwlib/xlwmenuP.h +++ b/lwlib/xlwmenuP.h @@ -63,13 +63,15 @@ #define _XlwMenuP_h #if defined USE_CAIRO || defined HAVE_XFT int default_face; XftFont* xft_font; - XftColor xft_fg, xft_bg, xft_disabled_fg; + XftColor xft_fg, xft_bg, xft_disabled_fg, xft_highlight_fg; #endif String fontName; XFontStruct* font; Pixel foreground; Pixel disabled_foreground; Pixel button_foreground; + Pixel highlight_foreground; + Pixel highlight_background; Dimension margin; Dimension horizontal_spacing; Dimension vertical_spacing; @@ -80,6 +82,10 @@ #define _XlwMenuP_h Pixel bottom_shadow_color; Pixmap top_shadow_pixmap; Pixmap bottom_shadow_pixmap; + Pixel top_highlight_shadow_color; + Pixel bottom_highlight_shadow_color; + Pixmap top_highlight_shadow_pixmap; + Pixmap bottom_highlight_shadow_pixmap; Cursor cursor_shape; XtCallbackList open; XtCallbackList select, highlight; @@ -88,8 +94,10 @@ #define _XlwMenuP_h int horizontal; /* True means top_shadow_color and/or bottom_shadow_color must be freed. */ - bool_bf free_top_shadow_color_p : 1; - bool_bf free_bottom_shadow_color_p : 1; + Boolean free_top_shadow_color_p; + Boolean free_bottom_shadow_color_p; + Boolean free_top_highlight_shadow_color_p; + Boolean free_bottom_highlight_shadow_color_p; /* State of the XlwMenu */ int top_depth; @@ -112,9 +120,13 @@ #define _XlwMenuP_h GC button_gc; GC background_gc; GC disabled_gc; + GC highlight_foreground_gc; + GC highlight_background_gc; GC inactive_button_gc; GC shadow_top_gc; GC shadow_bottom_gc; + GC highlight_shadow_top_gc; + GC highlight_shadow_bottom_gc; Cursor cursor; Boolean popped_up; Pixmap gray_pixmap; -- 2.36.1 --=-=-= Content-Type: text/plain -- Manuel Giraud --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Thu Jul 14 06:35:06 2022 Received: (at 56538) by debbugs.gnu.org; 14 Jul 2022 10:35:06 +0000 Received: from localhost ([127.0.0.1]:48991 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oBwBV-0004CV-Ux for submit@debbugs.gnu.org; Thu, 14 Jul 2022 06:35:06 -0400 Received: from sonic312-23.consmr.mail.ne1.yahoo.com ([66.163.191.204]:40643) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oBwBS-0004Br-I2 for 56538@debbugs.gnu.org; Thu, 14 Jul 2022 06:35:04 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1657794895; bh=8ujucH3Sr2zfl8Flmek8mqBl/8p6dQLeUpk0X8OmkMs=; h=From:To:Cc:Subject:References:Date:In-Reply-To:From:Subject:Reply-To; b=mnPpX6L3Wq+X5bqGDsW6K0iZFLNjlYq7VXbq+sexwawzxmAL6J8RrWL1z9tpCgHtmYNgbVIVhLwdPy1JzzuNoU0wMd8hKjhZvDh9CsuZ8ypBzjQb4sjgzqToUDDLywzpTzbEM1+d2iIqV8PkzvbxpjK5X1RFweuLPy2c8oI5+SoGq3KXxXrj25QOYPEM8NPqPAxY4dFnbbiwLGnOp7IXkBqsCztqwdfnhkGUJ72Qt9n/T8kXnH5ULaBoDLrl2GQFEWEirkd9AO//qaneadK9q6T16rMKNjDuePPAlkLB9lKQwcGdfegZZfDTICvuessDHT+gW7yEuOs2Em1LBAArzA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1657794895; bh=wnswiQC8PWwQCmoA587Y9n73DrGf03LR/KJcNfz+LGV=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=BAObTwHnLzP+K5uJRaZodJ1Beyk3tw8IatzFwvPRLJlRAVP3/Z6q87yUY1L4xFN6K07bfAEHkzfRpwHRFrnd4CAzuIYd+RZWBTSgZxdxVmWoY4H1gMAhSRl6uarC0RkyWnJEmlvurGfViH7+np+zfO1Q+BauRXMEamkQUcbz/q6ajWBugskfVIko+3eefKFVMmctpgFG8cNZ6JWBSGkzsV+/37TAjvgwFMdHpTiLMDJrEVswpk02Q/z3aOiRzYWF5YpowHGCelEVYvrPfJcyvcK2S9WMTwH4fXympi1wvdu1NV6QT7Qm1lbX3dr0wXj0jeNpxGYDOWomhGPnVjHo8g== X-YMail-OSG: bJwvqA0VM1no_0CnQLSuhKThiJUgQNROtsyvr.T7uP.RkX4Zfv22tYOK0Wpx4MK wZnju.Bfs2hdFK6Q_3FPLPrDTYphFTOJL1a5qfUUoKyRU5m8Rd4M6U0qM9f0ByIpzrLJiKx8Tdbg rJANtfA0K1AUUWg6jsrO.Moti9BcII51ByETIrEeCAzXMe0JVNRfbhKU3_bIrto7e5owaLhsdfNS vTRg.F2UmcPw5ORhYdZ7c5ZlVa_d_wfh2oCDiq1yQMrZu6XjU7ZU1uKMSplFaZPsgHl3lBd0ZEER wOP3Qd1wVxk54hrYmitESpm2Wn7zJ4K6MRKpuO_1fC1ZV7prVabKYbNeEig4OXZAxscfnUDoulaf JAbiyMTx6ZsYeRQzpYFhbaaNNgju5gijOImxzoMcysaKryF0NqCnwtFc.ds2OaDULhRnfnNvgAmg 27cnzIeMSthGfrCoeAzXy1VvRQ3dunthvBwq4USk4HwZALokWSL_agBwtvhQfPxZqV_rFWTRcpDZ RiZTAC_puX5f6B6Kcwskeolf1tXtiaKajlYU9bWJp8zBVEACNhb3i2yGMM1wxLBcswghRnWY6acs P1Uxzo87snlxmw46CW3kZuHX4CMhop0R5Twn4rqvLSpw6gv3KTDeGJ.HZ5G9D2eZz2WxWrx8YGxO bYpZSd6pUKQm98JdFm2d2LwGKDYZJR7AkTKeZE7E89ryQgFR3kQlbkmVH3gkJMhMl2r2rfjvBtgF jb2JvRq7M42f.MSeRF0SlTan7GO8GLjdcg33lm1DuAcOPmNM1ktf7SlB40UvaMC2avhJ4nIE68Uz syRuk3Th.MM1ttYVVunyEXAaF0nVD8fEGNFIdkfwSLhJRN2409UPitFypSAa_vBHDPKfWSv79MUh 8Ql9w7g2y1kidHUdUOtxhQ.smGTxsQEGjWYp3noyPaDUSq.aAtQWq_aTzCjJqSnSGPFWlaAAOO6r SAiRcZwS5MLPF15oGn2RQ8d3lQmXnvicoDuYjX4_Nhn3hrsc70yDOnFN25GtOiQ6sPVwAaibYEWx OruurWhXi1XJmwrMh31updfNYwUvVMSjEFx5wUnt7hYrUfVdAEFl0uC0Fa80lEYhfLPw2QvUS_Wf 9alCvQzq7GY7GliwtdQ.rXfO8DZA2RKkvxZEtx7hmp2eOCbVo_UMBAGRhy7Ewn76bhIFzrhWeV8k ydoIzGiV93G9SI5rngHuSvJruI18l2RNO8ys_e.lRDfp29TErlcohhTaDlmDiNvyrvEOmhAixmZf 3q21fbCa0wnMNpFcJ8U1Fwg96RXLmpVgRqmfcnly76jctEMc4KXjzvIi0Rk6CQSA0wfknVrLO9Kn i_PVLu8yoAifJRXGpf1vFco7eQHI5eaEaj_CJsItGe1ZAMVPUgEImHpvKi6lvQSbfNIEFjA0GVvz SwoJF50wF4v13bhKr5ErQEAcLPPjAv8WFrKENR5klIubr21_bwBwKS1n9VQaZBo30FIoaqLnYPbJ Afhyz0bkHuEpaG9tuqdrd4hbu1098gQwBtOMDGR9dp..sVGbRcK9011onfmc8BBvTCjBR9rYhUTN 6JnygmCdp4nTx5Zz3.bBZvH6CtCZJlBKRwXd1zjSnkNCxzpCmjY32jO1m7jr7XECXN.yeUw8akGT aC1UCoRZ7nIHpFbm0E8cg0F3xeGC3hhNa0RH9v_eEdcJ6edsfQpyLMT5oMGzIGIkoK2VK.NA42Nc LYdoC6ntgeN9KN8YZttYJkL3_47DyDsnaSbCJNlky06l7_1evSv0w867MlUtHbrbA2Vkm.x51pfD I95oaboD8h.VOeuwOX.s2uTo0fMEYSKXr.fmTg2KGBDYf95wBc4KG.Rwc1gyuu34NeTAqU6Bihn5 YbSvsCvXcpE1PsORw5SGRzxfUVuDWJRv0iRD2g9q9tQ.ptbvCicuOHLqyxeufrzFqTPEEf7GuzKq 1Xr28LXVtkN_KzGWgI0o8jeNq.54kXFtrtKWK4jqX0VNmgfdLtyeWbjkUZqPVq8Si2Cd8mImqdlC YXKTO3.zk236UFEwe1lLEHkaNvlyU1kCTP9rJ5rRum5is0PyuUX_HmExCBDptcmrLpZcvtILBreE cnJ1DTmR0idsgxmlkcGbOKOBlnp2DivJ31qjH3Hft7UXUJpBdRZTnZBn.T9pXBzndGswqJbSvUDy q8.yzrrkFEw5mNY7TcIGFtbeQt8NPa2YxHUYGVLzPol61jsRq7q.S0QhrQ3mdBGhpuhnrhgTBN9Q Oq0ZNHQcqi35salj1yU2tLnADmtYUbD4drBTsy48qiMf5B7yKKnbfeTCNsJRwJG9a X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic312.consmr.mail.ne1.yahoo.com with HTTP; Thu, 14 Jul 2022 10:34:55 +0000 Received: by hermes--canary-production-sg3-67975bbd4b-5klrh (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 246a032e3a9212f463373ec0454e39d0; Thu, 14 Jul 2022 10:34:51 +0000 (UTC) From: Po Lu To: Manuel Giraud Subject: Re: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend References: <87wnch16as.fsf@elite.giraud> <87k08gtsz0.fsf@yahoo.com> <87cze8t4i9.fsf@elite.giraud> Date: Thu, 14 Jul 2022 18:34:43 +0800 In-Reply-To: <87cze8t4i9.fsf@elite.giraud> (Manuel Giraud's message of "Thu, 14 Jul 2022 11:42:06 +0200") Message-ID: <87k08goud8.fsf@yahoo.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.91 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Mailer: WebService/1.1.20407 mail.backend.jedi.jws.acl:role.jedi.acl.token.atz.jws.hermes.yahoo Content-Length: 2542 X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 56538 Cc: 56538@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Manuel Giraud writes: > I have attached a new version of my patch taking your remarks into > account but I did not remove this comment. I think it could be useful > to understand that "top_gc = something_bottom_gc" is not a typo here. We have the same general pattern (random_gc = random_opposite_gc) in most of the X code, so it is redundant IMHO. But I won't insist. > I have also done the following testing with Xft/cairo/PseudoColor > combinations: > > |-------------+-----------------+-----------------+-----------------+---------------------| > | | Xft + cairo | Xft only | cairo only | None | > |-------------+-----------------+-----------------+-----------------+---------------------| > | X Truecolor | ok | ok | ok | ok but with a | > | | | | | default tiny face | > |-------------+-----------------+-----------------+-----------------+---------------------| > | Xephyr | ok but color | ok but color | ok but color | ok, colors ok, but | > | Pseudocolor | not quite right | not quite right | not quite right | with a default tiny | > | | around each | around menu | around each | face [fn:2] | > | | glyph [fn:1] | labels [fn:2] | glyph [fn:1] | | > |-------------+-----------------+-----------------+-----------------+---------------------| > > * Footnotes > [fn:1] Aside from the Lucid widget, the emacs buffer is completly > blank. Yes, that isn't expected to work, because Cairo is broken. Also, you can't build Emacs with both Xft and Cairo, since they're mutually exclusive. > [fn:2] This time the emacs buffer is here. tool-bar icons are ugly. Could you please describe how the colors are "not quite right"? One last nit: > +static void > +draw_highlight (XlwMenuWidget mw, > + Window window, > + int x, > + int y, > + int width, > + int height) [...] > static void > -make_shadow_gcs (XlwMenuWidget mw) > +compute_shadow_colors (XlwMenuWidget mw, > + Pixel *top_color, > + Pixel *bottom_color, > + Boolean *free_top_p, > + Boolean *free_bottom_p, > + Pixmap *top_pixmap, > + Pixmap *bottom_pixmap, > + Pixel fore_color, > + Pixel back_color) Here and elsewhere new functions are added, the argument list should be reformatted to not place each argument on its own line. Thanks. From debbugs-submit-bounces@debbugs.gnu.org Thu Jul 14 07:47:55 2022 Received: (at control) by debbugs.gnu.org; 14 Jul 2022 11:47:55 +0000 Received: from localhost ([127.0.0.1]:49032 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oBxJy-0008EC-QO for submit@debbugs.gnu.org; Thu, 14 Jul 2022 07:47:54 -0400 Received: from mail-pf1-f170.google.com ([209.85.210.170]:39619) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oBxJw-0008DI-MZ for control@debbugs.gnu.org; Thu, 14 Jul 2022 07:47:53 -0400 Received: by mail-pf1-f170.google.com with SMTP id j3so1614185pfb.6 for ; Thu, 14 Jul 2022 04:47:52 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:mime-version:date:message-id:subject:to; bh=SEDZoi2wHTAub2OR0ieaueIybaSdb+T4z5uKPxrUSzE=; b=hoiYSIHQkGtewmmV4SmeMDBUtjdJwUKE6ItIjVSKzl+w7u+UBGmxqmKB0Yd5vEP32n BOmvOEZmG6eeMpG0ZhefmmmgH6nVsjYB9rXDLMnsTTyniN3tPo3VIqUWtTWkR2VhfyNQ w77BQXr6D95On2YCQ7nzLMMadbDMHsc7LB9UksMpCls9b1fRcxXmwUhGdJbkboJwW/m5 DANimaLOCGBkmVbZYYpmXpW+gZddKZuiTHNRXlXw6rLxQqms9Rv+0ZaRIb9YSBZ0ap2l ZzmVTTcjEftW+JCjNjCr1ixeoJMMNfd6eESjgTFgLwgJPZkcDvjsGhUZ/qo0Lc11E/iD EzVg== X-Gm-Message-State: AJIora8UFpJhuFZYWBFn6NJTYrbEv7YWebTmJOIJ0vvZ6c//aTD5cyrM 2I+eLFuMrZu+HpnGogQ3zuyU30WNTyJRZSRe/PgqcAOb X-Google-Smtp-Source: AGRyM1tLjJ7dclvkjiP+J14SvNLwaTE4frv+bWojDwIdpzBN6L4T7TA3oNQLei4eLOEj2XG1L0rq+GcelfcR3bHaMFE= X-Received: by 2002:a63:2254:0:b0:40d:d291:7710 with SMTP id t20-20020a632254000000b0040dd2917710mr7206629pgm.269.1657799266355; Thu, 14 Jul 2022 04:47:46 -0700 (PDT) Received: from 753933720722 named unknown by gmailapi.google.com with HTTPREST; Thu, 14 Jul 2022 04:47:45 -0700 From: Stefan Kangas MIME-Version: 1.0 Date: Thu, 14 Jul 2022 04:47:45 -0700 Message-ID: Subject: control message for bug #56538 To: control@debbugs.gnu.org Content-Type: text/plain; charset="UTF-8" X-Spam-Score: 0.5 (/) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.5 (/) severity 56538 wishlist quit From debbugs-submit-bounces@debbugs.gnu.org Thu Jul 14 09:18:04 2022 Received: (at 56538) by debbugs.gnu.org; 14 Jul 2022 13:18:04 +0000 Received: from localhost ([127.0.0.1]:36991 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oByjE-0001Hc-Dt for submit@debbugs.gnu.org; Thu, 14 Jul 2022 09:18:04 -0400 Received: from ledu-giraud.fr ([51.159.28.247]:35694) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oByjA-0001HA-Vl for 56538@debbugs.gnu.org; Thu, 14 Jul 2022 09:18:03 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; s=rsa; bh=+mAkfNjQKiTVz06N b+uMRkSXsZlE1FaDuy1pfN0tPwA=; h=date:references:in-reply-to:subject: cc:to:from; d=ledu-giraud.fr; b=M89dQMT0JzqMFWzK5oR5H76oGdYm1YTHWrrTSG JUcSFX+YViXvyvZzPM7cDhm2p2zSDC/Rxf3BCkxL8mBJr6rRGxoJUIjdUfvWT3iTUkdtiW LxIWKupPbD6pijAvxSJyxEbCmHditesuPp5msgJ+D1/a8FSqDErmBZR/rEoqWUT9GwurZV 8nUMUzuTRKh7Zt6+Mf4ixT6mPJJ/aKNHqsH/rHF/iZZDak02ub4r3+XFwuA7KzC6Sw3WOg KUaOSFyWm+W4MzDzRJ04IKjOGCNkGfHlYzZdSAPOSDoaHC9NI9DMsC2+kRpaT/72+ZiG1K A/w85iHMGBcMa8fDnq2Qv9eQ== Received: from elite.giraud ( [10.1.1.1]) by ledu-giraud.fr (OpenSMTPD) with ESMTPSA id c0caef2b (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Thu, 14 Jul 2022 15:17:57 +0200 (CEST) From: Manuel Giraud To: Po Lu Subject: Re: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend In-Reply-To: <87k08goud8.fsf@yahoo.com> (Po Lu's message of "Thu, 14 Jul 2022 18:34:43 +0800") References: <87wnch16as.fsf@elite.giraud> <87k08gtsz0.fsf@yahoo.com> <87cze8t4i9.fsf@elite.giraud> <87k08goud8.fsf@yahoo.com> Date: Thu, 14 Jul 2022 15:17:54 +0200 Message-ID: <87h73jq1dp.fsf@elite.giraud> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (berkeley-unix) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 56538 Cc: 56538@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Po Lu writes: [...] > We have the same general pattern (random_gc =3D random_opposite_gc) in > most of the X code, so it is redundant IMHO. But I won't insist. Ok. I can remove this comment then. [...] > Yes, that isn't expected to work, because Cairo is broken. Also, you > can't build Emacs with both Xft and Cairo, since they're mutually > exclusive. =F0=9F=98=85 sorry. So then "Xft + cairo" is just "cairo". > Could you please describe how the colors are "not quite right"? Here is how it look here=E2=84=A2 on a PseudoColor Xephyr. This is Cairo w= ith a bitmap font: --=-=-= Content-Type: image/png Content-Disposition: inline; filename=sshot-pseudo-cairo.png Content-Transfer-Encoding: base64 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 --=-=-= Content-Type: text/plain This Xft with the same font: --=-=-= Content-Type: image/png Content-Disposition: inline; filename=sshot-pseudo-xft.png Content-Transfer-Encoding: base64 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 OjAwOjE5KzAwOjAwM8/TtAAAAABJRU5ErkJggg== --=-=-= Content-Type: text/plain And for the record, here are the same with a vector font: --=-=-= Content-Type: image/png Content-Disposition: inline; filename=sshot-pseudo-cairo-vector.png Content-Transfer-Encoding: base64 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 ODoyMiswMDowMMHfal4AAAAASUVORK5CYII= --=-=-= Content-Type: image/png Content-Disposition: inline; filename=sshot-pseudo-xft-vector.png Content-Transfer-Encoding: base64 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 NTc6NTIrMDA6MDD7n+cKAAAAAElFTkSuQmCC --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable [...] > Here and elsewhere new functions are added, the argument list should be > reformatted to not place each argument on its own line. FWIW, draw_shadow_rectangle, draw_shadow_rhombus=E2=80=A6 are already like = that. I'll do it but what are your recommandations? Split at fill-colum + indent? Leave the old ones untouched? --=20 Manuel Giraud --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Thu Jul 14 22:06:46 2022 Received: (at 56538) by debbugs.gnu.org; 15 Jul 2022 02:06:46 +0000 Received: from localhost ([127.0.0.1]:39096 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oCAj7-0005Lj-NL for submit@debbugs.gnu.org; Thu, 14 Jul 2022 22:06:46 -0400 Received: from sonic305-22.consmr.mail.ne1.yahoo.com ([66.163.185.148]:40144) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oCAj3-0005LS-Hk for 56538@debbugs.gnu.org; Thu, 14 Jul 2022 22:06:44 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1657850795; bh=51KjwtKQAOjq8V1Cw0RyqYPkCKeYtTLJ6uGn/TpRCYU=; h=From:To:Cc:Subject:References:Date:In-Reply-To:From:Subject:Reply-To; b=ZZ1+aG0LW1+zTbqS7awkSD2tXAHrqvFf5IaXZPpT6D4L4ZxtL/rp6kGuh1kNxzsvTjZ9X+f5ZycIdrHCVImyDW6dQTqVCi1KDt2OHUWHOYskzCVUMDi71sCUGvY9/AyARzHxZEBzI4/rIbFHf4o9e7yLDulABvwIB0YFTl5kmK3FFej3QSx8e3g28EfizNkcahrdU25D94zJgpWtfn6D6Kltm5Ptj+CYRRMF7wISt9nHFlYibFEYzOj9kN4qZZf/FmMH0LvBNtkxR7+nn9vBuqWZA75u6CLgJ+WJkU0VhgV1dbVuzyFbZd45klH4f3pLRdNob8vPY5BV9peYdwMOsQ== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1657850795; bh=fEyfTtCHC6W7HwJBOp0ihYaAyI6r/BXjhuPH+K13N+z=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=XrhrRX3QQT3vLg6m3E9eaYcKg3pHENgnkTYFq2OixAwQFpLMQpP+4Y8eMcJ0R1musPnS20UQVXxaySnP3W9N49B2XdWsv1e6hYVYKzQgP/0kIkWxeNT6f5kkIxWBIq2pO1XSDHvqhvQcZNTldSteJbt2solL+ROcH/1nVLMyhRT06bGyAPnHAwx+dupmWnSi1pqUMxqB3pEivjEdwbjTfHwDtUJdQpyZXFSeneOtbfu8y4gaqWJMzPbICiQUfE4QOfNIdmlEtIbmwiImTSdTSm234CU39MgWwTyXAauMkcvDPE/TVLkP2BFL7s3ODn5LW6dzRh6htNXLCqYlacOi5A== X-YMail-OSG: LG3gCXIVM1mbCBdImxeWTQSNzMnsPGppgbp0zpzWO5SBAz13_L8sSxGrRS18aCd fsRh4VqNX0Va0EA0XvzNwxIUkJhq2ks7ZL5mh0woH_8p6wioGDAW5kcEvGI1h_CA_LTSRQ76N4YJ P12D6wLVAAlt5LcJNUqAUCLlHA2fMmL83vSHAZqT6scdYuv06O_mtpx8qXs_XFwwdKli.6dn5Nd_ zXpgAEBMG4EzBn6uFIT5HeEWoL.KQzkgcAdr3Qv02xmHRNeD_ULmpoEjnUXtSPzfgHcSFG_ytBEi vfLrRAR12V4l7ph15IBegsyCw54_mPOyXZgklRSvUUMJ1xNKrKatkwB_9naUndTAkNAsuJMZMyw2 1v0IDN4T79XY2IPYcvYWzDZBZl04ng3kprze9ZWKdh65qCYaLlY9QmzM4EnapYnGczcLcaiQxcCV HYLdBZge9KgQ8JryOf0CxtHGYhvZdX1k4_a_0YpyHmyFlN9uOBMDeIU94gVSyusrICvH4DLsmOPs wJtX84xC.ivhALoH3URPcl5F9Sfk2_P4wTBstrlqXF3Yt1UoKepKxhRAFh8jgd.W88batBCt2O_G 0VOP9rc.6_xo0sC3mOOOqOziHsui3XWYtFsyeIYXnkCssWp_XyFSqmnn8572IyETtG0_u.ePLYB8 s3ea.7RiHoT76MJ.E6eaUabHoLr0FSiqlwiT6IYfI5W1Hj7dWHgitmJYZN9Zlffbh0tb73nuect0 RLr9xXWCagPaZsRpIvkfrK5GkTtnA4u0VAJhnt7XsaWTg_qY5TJXbbCCfx1vrcO6KuqKDZF9rG2f mIDwX0pfHeWANXYBuOMnLUbcSsbXAdlZH7RnwoJ4wjeOf1TLl_in.mvSfRzzAG_4i_LuyUimYhmR AG3A_DweWpksLvcGmz7k.OAZKblsrzHQYig5EweAqidRCzEwgFJ_cQV14S6g8RJgnxk2xv9NI3FH Lb5h9CxG0fqNXxbKYyBTOCckhAUdgrBwV73N3Wn6G22cYcQU6PM95sn01vHyXL3h6k0XswJfl7Yd lFHVWR8HduPVLhGptGwQDQj7K6hzIj6ltL1q5BHdZAmoEGk0iWfDPx42ga8Wk2NV2OAy2j.y1_py uJMlNoQyw4fZJQgnbTl0QL.MGEe29pvGZJ2nWJyVASI41Gn3SDEfKPz4n9Ry9r_L24CGt84GvFVG 05gFkoB_rISu7x2NZ80MMYOl0vwJtmdrwxXYeJYXdZcZjQ2M0Dlkuxvqh1D.dbXxZAHRxXqQzZCD aqqK9wRn44rCIjub3y4UjYbxOCsoHsjhPk5yLtqCWUGHQsoPiBcofsHDGhk0gxItljpR1PCxq5V9 0xFTqA6zugyeG4eTBMN9Jyoka.gaiXVKhR17dUqJ0SpH72u8OppK4dRtNx86Jg2XWWNEVadg5Ifn jJ4MZf4JmhkthwQn0t.oPsWlKDS6p93O7vjMeFL.rBGGsJ8g2KjaHY6hLB_xRadYYkzbB2_bKLNi sDSadOE2Sx12nRfF8Ga7FxTbCp4qMQaIeo7gNfCEdI5QM5D1gjMlVDOaX3CTFeEm_nR4hkrrs71N ErmEINQ1U3v_zYFFo94dZgcUEWuzOERO6SNdmrpkJJoAh7J82kX7f20TcnDWgfNkJ6weHCOG7xjk as9DECY64xbgY0GS8THJhoHmgJjKJEbnc21VaMP_bQaTvs5GCpdXbRGplCh59CYldHZRU7X5lWov 3ou.lmkL5kzTggINykqRRSb0IY4OG1cVpMbdTFRVTtCw.gwt7Wbp.xEko9a79gMRqq9NIP0sbPeY zaUJCilw3ejlqWEjLjEexAQy9YYICFC8_IfF7YwhtzkWdytUBDiDWrZBT5ZaQs4zb3eBr9XB7a.g xt7ZwlkS.N89D8zOIJLO.pl9.kmoTurPI2tu5dYz5JAbwr19n2oEFuriB6.VG3n2T3pIdkmRkV6L UVvpyGBecCcPyoqn54Zq2MqLbaWG5tbup35ORCUZyPq5l9Fw7cO9QbZKNonnm8yrz7WNOudD8_s2 qAgZcb5tjshBi797NqUoo2V8NzWFzFcLsrbjiQgCpBiJU8gX3epvlKQGpmQyj.1dHE00_ZHqELex 6_ORc7bAmstoSBBo7rXGjlx6dyni._rtEip9snv5ucdmJLCNtFae7EoBcay0EXPiRdCxE2oqtBVK 7aiNO3D60L0hE1gZ7wi_2eb0bfFMoY3pNKtn9OVh9PW7BVBAUQMjix4VLmGBKQ7X_wmL2W1bqgSD algTxbOzEBvGMRZrHI4k5NAGby8QcgzAdA9gtKrl1s3z.nUHosN9yAJ5fpu8- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic305.consmr.mail.ne1.yahoo.com with HTTP; Fri, 15 Jul 2022 02:06:35 +0000 Received: by hermes--canary-production-sg3-67975bbd4b-5klrh (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 6001c73f687161a20fe73a3a5149b022; Fri, 15 Jul 2022 02:06:32 +0000 (UTC) From: Po Lu To: Manuel Giraud Subject: Re: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend References: <87wnch16as.fsf@elite.giraud> <87k08gtsz0.fsf@yahoo.com> <87cze8t4i9.fsf@elite.giraud> <87k08goud8.fsf@yahoo.com> <87h73jq1dp.fsf@elite.giraud> Date: Fri, 15 Jul 2022 10:06:26 +0800 In-Reply-To: <87h73jq1dp.fsf@elite.giraud> (Manuel Giraud's message of "Thu, 14 Jul 2022 15:17:54 +0200") Message-ID: <874jzjp1st.fsf@yahoo.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.91 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Mailer: WebService/1.1.20407 mail.backend.jedi.jws.acl:role.jedi.acl.token.atz.jws.hermes.yahoo Content-Length: 692 X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 56538 Cc: 56538@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Manuel Giraud writes: > Here is how it look here=E2=84=A2 on a PseudoColor Xephyr. This is Cairo= with a > bitmap font: > > > > > This Xft with the same font: > > > > > And for the record, here are the same with a vector font: > > > > > Right, that's acceptable. I think the problem will go away if you disable the rendering extension on the X server. > FWIW, draw_shadow_rectangle, draw_shadow_rhombus=E2=80=A6 are already lik= e that. > > I'll do it but what are your recommandations? Split at fill-colum + > indent? Leave the old ones untouched? Yes. Looking at functions like `x_dnd_do_unsupported_drop' in xterm.c should help as well. Otherwise, LGTM. From debbugs-submit-bounces@debbugs.gnu.org Fri Jul 15 07:54:28 2022 Received: (at 56538) by debbugs.gnu.org; 15 Jul 2022 11:54:28 +0000 Received: from localhost ([127.0.0.1]:39728 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oCJtq-0002d7-Uk for submit@debbugs.gnu.org; Fri, 15 Jul 2022 07:54:28 -0400 Received: from ledu-giraud.fr ([51.159.28.247]:23824) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oCJtn-0002cw-Ot for 56538@debbugs.gnu.org; Fri, 15 Jul 2022 07:54:25 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; s=rsa; bh=4xPpPQ7/K8t5Rhox KIXm5NZcPWDpvl5wvJ+ief+dl+o=; h=date:references:in-reply-to:subject: cc:to:from; d=ledu-giraud.fr; b=JpOSs/idyeba+7Ij2BTvGFdckVNqOAPywPjsc8 iRjpQzSgmX1Ag6H2iJ+LEnGGz33BlpMUIOv7eSr9yqTmPBnbGfQJ5qSQeoQWsIe1Il2aTl 2LDz5Nyn7megg2J/XdmFFq5vTP1Yw/nRQiMgSOQrD6QjhiKVRy2Kywq6ahKgyyAMhkaEu8 OQdqeSBxTgHX74PesSDT9xqf4zu1BjIhJ4CqEVOYBltuInbV3bvIrJHI51Q3s/tAR4tTNS HyMlijH87xpWdE9KCkmxwmcjmg6jOMWPA2686Gg0nxGIR3PdgnNPNwA98D09fTSToHVAOp RXkBsLdnea6+PCvcZWkH2LmQ== Received: from elite.giraud ( [10.1.1.1]) by ledu-giraud.fr (OpenSMTPD) with ESMTPSA id e9062104 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Fri, 15 Jul 2022 13:52:32 +0200 (CEST) From: Manuel Giraud To: Po Lu Subject: Re: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend In-Reply-To: <874jzjp1st.fsf@yahoo.com> (Po Lu's message of "Fri, 15 Jul 2022 10:06:26 +0800") References: <87wnch16as.fsf@elite.giraud> <87k08gtsz0.fsf@yahoo.com> <87cze8t4i9.fsf@elite.giraud> <87k08goud8.fsf@yahoo.com> <87h73jq1dp.fsf@elite.giraud> <874jzjp1st.fsf@yahoo.com> Date: Fri, 15 Jul 2022 13:50:26 +0200 Message-ID: <87lesusigt.fsf@elite.giraud> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (berkeley-unix) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 56538 Cc: 56538@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain Po Lu writes: [...] > Right, that's acceptable. I think the problem will go away if you > disable the rendering extension on the X server. Ok and I guess that not many people are using a PseudoColor display nowadays. > Yes. Looking at functions like `x_dnd_do_unsupported_drop' in xterm.c > should help as well. > > Otherwise, LGTM. Here is a new version of this patch. What's new: - fix some comments - format arguments list on both new functions and the one I have modified their arguments - add some forgot freeing in `release_shadow_gcs' --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-Colored-menu-highlight-in-Lucid-backend.patch >From d8b7a008163c776756da42dbbb208e9c88ed9b2d Mon Sep 17 00:00:00 2001 From: Manuel Giraud Date: Mon, 11 Jul 2022 11:14:08 +0200 Subject: [PATCH] Colored menu highlight in Lucid backend * lwlib/xlwmenuP.h: * lwlib/xlwmenu.h: * lwlib/xlwmenu.c: Introduce resources to handle colored highlighting of menu entries. * doc/emacs/xresources.texi (Lucid Resources): Documentation. --- doc/emacs/xresources.texi | 4 + etc/NEWS | 5 + lwlib/xlwmenu.c | 352 +++++++++++++++++++++++++++----------- lwlib/xlwmenu.h | 4 + lwlib/xlwmenuP.h | 18 +- 5 files changed, 276 insertions(+), 107 deletions(-) diff --git a/doc/emacs/xresources.texi b/doc/emacs/xresources.texi index 2c2700bc15..f8be06b5e7 100644 --- a/doc/emacs/xresources.texi +++ b/doc/emacs/xresources.texi @@ -449,6 +449,10 @@ Lucid Resources Foreground color. @item disabledForeground Foreground color for a disabled menu item. +@item highlightForeground +Foreground color for a highlighted menu item. +@item highlightBackground +Background color for a highlighted menu item. @ifnottex @item horizontalSpacing Horizontal spacing in pixels between items. Default is 3. diff --git a/etc/NEWS b/etc/NEWS index bf36316890..e1c708ca9d 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -544,6 +544,11 @@ and pop-up menus. This controls the style of the pre-edit and status areas of X input methods. ++++ +** New X resources: "highlightForeground" and "highlightBackground" +Only in the Lucid build, this controls colors used for highlighted +menu item widget. + +++ ** On X11, Emacs now tries to synchronize window resize with the window manager. This leads to less flicker and empty areas of a frame being displayed diff --git a/lwlib/xlwmenu.c b/lwlib/xlwmenu.c index 68f49e646d..2450e718c2 100644 --- a/lwlib/xlwmenu.c +++ b/lwlib/xlwmenu.c @@ -121,6 +121,10 @@ #define DEFAULT_FONTNAME "XtDefaultFont" offset(menu.disabled_foreground), XtRString, (XtPointer)NULL}, {XtNbuttonForeground, XtCButtonForeground, XtRPixel, sizeof(Pixel), offset(menu.button_foreground), XtRString, "XtDefaultForeground"}, + {XtNhighlightForeground, XtCHighlightForeground, XtRPixel, sizeof(Pixel), + offset(menu.highlight_foreground), XtRString, "XtDefaultForeground"}, + {XtNhighlightBackground, XtCHighlightBackground, XtRPixel, sizeof(Pixel), + offset(menu.highlight_background), XtRImmediate, (XtPointer)-1}, {XtNmargin, XtCMargin, XtRDimension, sizeof(Dimension), offset(menu.margin), XtRImmediate, (XtPointer)1}, {XtNhorizontalSpacing, XtCMargin, XtRDimension, sizeof(Dimension), @@ -570,8 +574,7 @@ draw_arrow (XlwMenuWidget mw, int down_p) { Display *dpy = XtDisplay (mw); - GC top_gc = mw->menu.shadow_top_gc; - GC bottom_gc = mw->menu.shadow_bottom_gc; + GC top_gc, bottom_gc; int thickness = mw->menu.shadow_thickness; int height = width; XPoint pt[10]; @@ -584,10 +587,13 @@ draw_arrow (XlwMenuWidget mw, if (down_p) { - GC temp; - temp = top_gc; - top_gc = bottom_gc; - bottom_gc = temp; + top_gc = mw->menu.highlight_shadow_bottom_gc; + bottom_gc = mw->menu.highlight_shadow_top_gc; + } + else + { + top_gc = mw->menu.shadow_top_gc; + bottom_gc = mw->menu.shadow_bottom_gc; } pt[0].x = x; @@ -621,24 +627,34 @@ draw_arrow (XlwMenuWidget mw, XFillPolygon (dpy, window, bottom_gc, pt, 4, Convex, CoordModeOrigin); } - - +/* Generic draw shadow rectangle function. It is used to draw shadows + on menus, menu items and also toggle buttons. When ERASE_P is + true, it clears shadows. DOWN_P is true when a menu item is pushed + or a button toggled. TOP_GC and BOTTOM_GC are the graphic contexts + used to draw the top and bottom shadow respectively. */ static void -draw_shadow_rectangle (XlwMenuWidget mw, - Window window, - int x, - int y, - int width, - int height, - int erase_p, - int down_p) +draw_shadow_rectangle (XlwMenuWidget mw, Window window, int x, int y, + int width, int height, int erase_p, int down_p, + GC top_gc, GC bottom_gc) { Display *dpy = XtDisplay (mw); - GC top_gc = !erase_p ? mw->menu.shadow_top_gc : mw->menu.background_gc; - GC bottom_gc = !erase_p ? mw->menu.shadow_bottom_gc : mw->menu.background_gc; int thickness = !x && !y ? mw->menu.border_thickness : mw->menu.shadow_thickness; XPoint points [4]; + /* Choose correct GC with a standard default if NULL. */ + if (erase_p) + { + top_gc = mw->menu.background_gc; + bottom_gc = mw->menu.background_gc; + } + else + { + if (top_gc == NULL) + top_gc = mw->menu.shadow_top_gc; + if (bottom_gc == NULL) + bottom_gc = mw->menu.shadow_bottom_gc; + } + if (!erase_p && width == height && width == toggle_button_width (mw)) { points [0].x = x; @@ -662,6 +678,7 @@ draw_shadow_rectangle (XlwMenuWidget mw, bottom_gc = temp; } + /* Do draw (or erase) shadows */ points [0].x = x; points [0].y = y; points [1].x = x + width; @@ -702,21 +719,28 @@ draw_shadow_rectangle (XlwMenuWidget mw, static void -draw_shadow_rhombus (XlwMenuWidget mw, - Window window, - int x, - int y, - int width, - int height, - int erase_p, - int down_p) +draw_shadow_rhombus (XlwMenuWidget mw, Window window, int x, int y, + int width, int height, int erase_p, int down_p, + GC top_gc, GC bottom_gc) { Display *dpy = XtDisplay (mw); - GC top_gc = !erase_p ? mw->menu.shadow_top_gc : mw->menu.background_gc; - GC bottom_gc = !erase_p ? mw->menu.shadow_bottom_gc : mw->menu.background_gc; int thickness = mw->menu.shadow_thickness; XPoint points [4]; + /* Choose correct GC with a standard default if NULL */ + if (erase_p) + { + top_gc = mw->menu.background_gc; + bottom_gc = mw->menu.background_gc; + } + else + { + if (top_gc == NULL) + top_gc = mw->menu.shadow_top_gc; + if (bottom_gc == NULL) + top_gc = mw->menu.shadow_bottom_gc; + } + if (!erase_p && width == height && width == radio_button_width (mw)) { points [0].x = x; @@ -784,15 +808,29 @@ draw_shadow_rhombus (XlwMenuWidget mw, toggle button is selected. */ static void -draw_toggle (XlwMenuWidget mw, Window window, int x, int y, int selected_p) +draw_toggle (XlwMenuWidget mw, Window window, int x, int y, int selected_p, + int highlighted_p) { int width, height; + GC top_gc, bottom_gc; + + if (highlighted_p) + { + top_gc = mw->menu.highlight_shadow_top_gc; + bottom_gc = mw->menu.highlight_shadow_bottom_gc; + } + else + { + top_gc = mw->menu.shadow_top_gc; + bottom_gc = mw->menu.shadow_bottom_gc; + } width = toggle_button_width (mw); height = width; x += mw->menu.horizontal_spacing; y += (MENU_FONT_ASCENT (mw) - height) / 2; - draw_shadow_rectangle (mw, window, x, y, width, height, False, selected_p); + draw_shadow_rectangle (mw, window, x, y, width, height, False, + selected_p, top_gc, bottom_gc); } @@ -801,15 +839,29 @@ draw_toggle (XlwMenuWidget mw, Window window, int x, int y, int selected_p) toggle button is selected. */ static void -draw_radio (XlwMenuWidget mw, Window window, int x, int y, int selected_p) +draw_radio (XlwMenuWidget mw, Window window, int x, int y, int selected_p, + int highlighted_p) { int width, height; + GC top_gc, bottom_gc; + + if (highlighted_p) + { + top_gc = mw->menu.highlight_shadow_top_gc; + bottom_gc = mw->menu.highlight_shadow_bottom_gc; + } + else + { + top_gc = mw->menu.shadow_top_gc; + bottom_gc = mw->menu.shadow_bottom_gc; + } width = radio_button_width (mw); height = width; x += mw->menu.horizontal_spacing; y += (MENU_FONT_ASCENT (mw) - height) / 2; - draw_shadow_rhombus (mw, window, x, y, width, height, False, selected_p); + draw_shadow_rhombus (mw, window, x, y, width, height, False, selected_p, + top_gc, bottom_gc); } @@ -968,6 +1020,31 @@ separator_height (enum menu_separator separator) } } +/* Draw the highlighted background and shadows. */ + +static void +draw_highlight (XlwMenuWidget mw, Window window, int x, int y, int width, + int height) +{ + Display *dpy = XtDisplay (mw); + XPoint points [4]; + + points [0].x = x; + points [0].y = y; + points [1].x = x + width; + points [1].y = y; + points [2].x = x + width; + points [2].y = y + height; + points [3].x = x; + points [3].y = y + height; + XFillPolygon (dpy, window, + mw->menu.highlight_background_gc, + points, 4, Convex, CoordModeOrigin); + + draw_shadow_rectangle(mw, window, x, y, width, height, False, False, + mw->menu.highlight_shadow_top_gc, + mw->menu.highlight_shadow_bottom_gc); +} /* Display the menu item and increment where.x and where.y to show how large the menu item was. */ @@ -983,7 +1060,6 @@ display_menu_item (XlwMenuWidget mw, { GC deco_gc; GC text_gc; - int font_height = MENU_FONT_HEIGHT (mw); int font_ascent = MENU_FONT_ASCENT (mw); int shadow = mw->menu.shadow_thickness; int margin = mw->menu.margin; @@ -1032,12 +1108,21 @@ display_menu_item (XlwMenuWidget mw, /* pick the foreground and background GC. */ if (val->enabled) - text_gc = mw->menu.foreground_gc; + if (highlighted_p) + text_gc = mw->menu.highlight_foreground_gc; + else + text_gc = mw->menu.foreground_gc; else text_gc = mw->menu.disabled_gc; deco_gc = mw->menu.foreground_gc; #if defined USE_CAIRO || defined HAVE_XFT - xftfg = val->enabled ? &mw->menu.xft_fg : &mw->menu.xft_disabled_fg; + if (val->enabled) + if (highlighted_p) + xftfg = &mw->menu.xft_highlight_fg; + else + xftfg = &mw->menu.xft_fg; + else + xftfg = &mw->menu.xft_disabled_fg; #endif if (separator_p) @@ -1048,8 +1133,11 @@ display_menu_item (XlwMenuWidget mw, { int x_offset = x + h_spacing + shadow; char* display_string = resource_widget_value (mw, val); - draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, True, - False); + /* Clears shadows and maybe highlight */ + draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, + True, False, NULL, NULL); + if (highlighted_p) + draw_highlight (mw, ws->pixmap, x, y, width, height); /* Deal with centering a menu title. */ if (!horizontal_p && !val->contents && !val->call_data) @@ -1095,10 +1183,10 @@ display_menu_item (XlwMenuWidget mw, { if (val->button_type == BUTTON_TYPE_TOGGLE) draw_toggle (mw, ws->pixmap, x, y + v_spacing + shadow, - val->selected); + val->selected, highlighted_p); else if (val->button_type == BUTTON_TYPE_RADIO) draw_radio (mw, ws->pixmap, x, y + v_spacing + shadow, - val->selected); + val->selected, highlighted_p); if (val->contents) { @@ -1145,25 +1233,18 @@ display_menu_item (XlwMenuWidget mw, } else { - XDrawRectangle (XtDisplay (mw), ws->pixmap, - mw->menu.background_gc, - x + shadow, y + shadow, - label_width + h_spacing - 1, - font_height + 2 * v_spacing - 1); - draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, - True, False); + /* If not highlighted, clears shadows for horizontal + menu item */ + if (!highlighted_p) + draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, + True, False, NULL, NULL); } #ifdef USE_CAIRO if (ws->xft_draw) cairo_surface_flush (cairo_get_target (ws->xft_draw)); #endif - - if (highlighted_p) - draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, False, - False); } } - where->x += width; where->y += height; } @@ -1257,7 +1338,7 @@ display_menu (XlwMenuWidget mw, if (!just_compute_p) { draw_shadow_rectangle (mw, ws->pixmap, 0, 0, ws->width, ws->height, - False, False); + False, False, NULL, NULL); XCopyArea (XtDisplay (mw), ws->pixmap, ws->window, mw->menu.foreground_gc, 0, 0, ws->width, ws->height, 0, 0); } @@ -1714,6 +1795,18 @@ #define BRIGHTNESS(color) (((color) & 0xff) + (((color) >> 8) & 0xff) + (((color xgcv.foreground = mw->core.background_pixel; xgcv.background = mw->menu.foreground; mw->menu.background_gc = XtGetGC ((Widget)mw, mask, &xgcv); + + xgcv.foreground = mw->menu.highlight_foreground; + xgcv.background = ((mw->menu.highlight_background == -1) + ? mw->core.background_pixel + : mw->menu.highlight_background); + mw->menu.highlight_foreground_gc = XtGetGC ((Widget)mw, mask, &xgcv); + + xgcv.foreground = ((mw->menu.highlight_background == -1) + ? mw->core.background_pixel + : mw->menu.highlight_background); + xgcv.background = mw->menu.foreground; + mw->menu.highlight_background_gc = XtGetGC ((Widget)mw, mask, &xgcv); } static void @@ -1724,12 +1817,16 @@ release_drawing_gcs (XlwMenuWidget mw) XtReleaseGC ((Widget) mw, mw->menu.disabled_gc); XtReleaseGC ((Widget) mw, mw->menu.inactive_button_gc); XtReleaseGC ((Widget) mw, mw->menu.background_gc); + XtReleaseGC ((Widget) mw, mw->menu.highlight_foreground_gc); + XtReleaseGC ((Widget) mw, mw->menu.highlight_background_gc); /* let's get some segvs if we try to use these... */ mw->menu.foreground_gc = (GC) -1; mw->menu.button_gc = (GC) -1; mw->menu.disabled_gc = (GC) -1; mw->menu.inactive_button_gc = (GC) -1; mw->menu.background_gc = (GC) -1; + mw->menu.highlight_foreground_gc = (GC) -1; + mw->menu.highlight_background_gc = (GC) -1; } #ifndef emacs @@ -1738,29 +1835,29 @@ #define MINL(x,y) ((((unsigned long) (x)) < ((unsigned long) (y))) \ #endif static void -make_shadow_gcs (XlwMenuWidget mw) +compute_shadow_colors (XlwMenuWidget mw, Pixel *top_color, Pixel *bottom_color, + Boolean *free_top_p, Boolean *free_bottom_p, + Pixmap *top_pixmap, Pixmap *bottom_pixmap, + Pixel fore_color, Pixel back_color) { - XGCValues xgcv; - unsigned long pm = 0; Display *dpy = XtDisplay ((Widget) mw); Screen *screen = XtScreen ((Widget) mw); Colormap cmap = mw->core.colormap; XColor topc, botc; int top_frobbed = 0, bottom_frobbed = 0; - mw->menu.free_top_shadow_color_p = 0; - mw->menu.free_bottom_shadow_color_p = 0; + *free_top_p = False; + *free_bottom_p = False; - if (mw->menu.top_shadow_color == -1) - mw->menu.top_shadow_color = mw->core.background_pixel; + if (*top_color == -1) + *top_color = back_color; - if (mw->menu.bottom_shadow_color == -1) - mw->menu.bottom_shadow_color = mw->menu.foreground; + if (*bottom_color == -1) + *bottom_color = fore_color; - if (mw->menu.top_shadow_color == mw->core.background_pixel || - mw->menu.top_shadow_color == mw->menu.foreground) + if (*top_color == back_color || *top_color == fore_color) { - topc.pixel = mw->core.background_pixel; + topc.pixel = back_color; #ifdef emacs if (x_alloc_lighter_color_for_widget ((Widget) mw, dpy, cmap, &topc.pixel, @@ -1774,15 +1871,14 @@ make_shadow_gcs (XlwMenuWidget mw) if (XAllocColor (dpy, cmap, &topc)) #endif { - mw->menu.top_shadow_color = topc.pixel; - mw->menu.free_top_shadow_color_p = 1; + *top_color = topc.pixel; + *free_top_p = True; top_frobbed = 1; } } - if (mw->menu.bottom_shadow_color == mw->menu.foreground || - mw->menu.bottom_shadow_color == mw->core.background_pixel) + if (*bottom_color == fore_color || *bottom_color == back_color) { - botc.pixel = mw->core.background_pixel; + botc.pixel = back_color; #ifdef emacs if (x_alloc_lighter_color_for_widget ((Widget) mw, dpy, cmap, &botc.pixel, @@ -1795,8 +1891,8 @@ make_shadow_gcs (XlwMenuWidget mw) if (XAllocColor (dpy, cmap, &botc)) #endif { - mw->menu.bottom_shadow_color = botc.pixel; - mw->menu.free_bottom_shadow_color_p = 1; + *bottom_color = botc.pixel; + *free_bottom_p = True; bottom_frobbed = 1; } } @@ -1805,63 +1901,94 @@ make_shadow_gcs (XlwMenuWidget mw) { if (topc.pixel == botc.pixel) { - if (botc.pixel == mw->menu.foreground) + if (botc.pixel == fore_color) { - if (mw->menu.free_top_shadow_color_p) + if (*free_top_p) { - x_free_dpy_colors (dpy, screen, cmap, - &mw->menu.top_shadow_color, 1); - mw->menu.free_top_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, top_color, 1); + *free_top_p = False; } - mw->menu.top_shadow_color = mw->core.background_pixel; + *top_color = back_color; } else { - if (mw->menu.free_bottom_shadow_color_p) + if (*free_bottom_p) { - x_free_dpy_colors (dpy, screen, cmap, - &mw->menu.bottom_shadow_color, 1); - mw->menu.free_bottom_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, bottom_color, 1); + *free_bottom_p = False; } - mw->menu.bottom_shadow_color = mw->menu.foreground; + *bottom_color = fore_color; } } } - if (!mw->menu.top_shadow_pixmap - && mw->menu.top_shadow_color == mw->core.background_pixel) + if (!*top_pixmap && *top_color == back_color) { - mw->menu.top_shadow_pixmap = mw->menu.gray_pixmap; - if (mw->menu.free_top_shadow_color_p) + *top_pixmap = mw->menu.gray_pixmap; + if (*free_top_p) { - x_free_dpy_colors (dpy, screen, cmap, &mw->menu.top_shadow_color, 1); - mw->menu.free_top_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, top_color, 1); + *free_top_p = False; } - mw->menu.top_shadow_color = mw->menu.foreground; + *top_color = fore_color; } - if (!mw->menu.bottom_shadow_pixmap - && mw->menu.bottom_shadow_color == mw->core.background_pixel) + if (!*bottom_pixmap && *bottom_color == back_color) { - mw->menu.bottom_shadow_pixmap = mw->menu.gray_pixmap; - if (mw->menu.free_bottom_shadow_color_p) + *bottom_pixmap = mw->menu.gray_pixmap; + if (*free_bottom_p) { - x_free_dpy_colors (dpy, screen, cmap, - &mw->menu.bottom_shadow_color, 1); - mw->menu.free_bottom_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, bottom_color, 1); + *free_bottom_p = False; } - mw->menu.bottom_shadow_color = mw->menu.foreground; + *bottom_color = fore_color; } +} + +static void +make_shadow_gcs (XlwMenuWidget mw) +{ + XGCValues xgcv; + unsigned long pm = 0; + + /* Normal shadows */ + compute_shadow_colors (mw, &(mw->menu.top_shadow_color), + &(mw->menu.bottom_shadow_color), + &(mw->menu.free_top_shadow_color_p), + &(mw->menu.free_bottom_shadow_color_p), + &(mw->menu.top_shadow_pixmap), + &(mw->menu.bottom_shadow_pixmap), + mw->menu.foreground, mw->core.background_pixel); + + /* Highlight shadows */ + compute_shadow_colors (mw, &(mw->menu.top_highlight_shadow_color), + &(mw->menu.bottom_highlight_shadow_color), + &(mw->menu.free_top_highlight_shadow_color_p), + &(mw->menu.free_bottom_highlight_shadow_color_p), + &(mw->menu.top_highlight_shadow_pixmap), + &(mw->menu.bottom_highlight_shadow_pixmap), + mw->menu.highlight_foreground, + mw->menu.highlight_background); xgcv.fill_style = FillStippled; xgcv.foreground = mw->menu.top_shadow_color; xgcv.stipple = mw->menu.top_shadow_pixmap; - pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0); - mw->menu.shadow_top_gc = XtGetGC ((Widget)mw, GCForeground | pm, &xgcv); + pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0); + mw->menu.shadow_top_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv); xgcv.foreground = mw->menu.bottom_shadow_color; xgcv.stipple = mw->menu.bottom_shadow_pixmap; - pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0); - mw->menu.shadow_bottom_gc = XtGetGC ((Widget)mw, GCForeground | pm, &xgcv); + pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0); + mw->menu.shadow_bottom_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv); + + xgcv.foreground = mw->menu.top_highlight_shadow_color; + xgcv.stipple = mw->menu.top_highlight_shadow_pixmap; + pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0); + mw->menu.highlight_shadow_top_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv); + + xgcv.foreground = mw->menu.bottom_highlight_shadow_color; + xgcv.stipple = mw->menu.bottom_highlight_shadow_pixmap; + pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0); + mw->menu.highlight_shadow_bottom_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv); } @@ -1871,18 +1998,24 @@ release_shadow_gcs (XlwMenuWidget mw) Display *dpy = XtDisplay ((Widget) mw); Screen *screen = XtScreen ((Widget) mw); Colormap cmap = mw->core.colormap; - Pixel px[2]; + Pixel px[4]; int i = 0; if (mw->menu.free_top_shadow_color_p) px[i++] = mw->menu.top_shadow_color; if (mw->menu.free_bottom_shadow_color_p) px[i++] = mw->menu.bottom_shadow_color; + if (mw->menu.free_top_highlight_shadow_color_p) + px[i++] = mw->menu.top_highlight_shadow_color; + if (mw->menu.free_bottom_highlight_shadow_color_p) + px[i++] = mw->menu.bottom_highlight_shadow_color; if (i > 0) x_free_dpy_colors (dpy, screen, cmap, px, i); XtReleaseGC ((Widget) mw, mw->menu.shadow_top_gc); XtReleaseGC ((Widget) mw, mw->menu.shadow_bottom_gc); + XtReleaseGC ((Widget) mw, mw->menu.highlight_shadow_top_gc); + XtReleaseGC ((Widget) mw, mw->menu.highlight_shadow_bottom_gc); } #if defined USE_CAIRO || defined HAVE_XFT @@ -1964,6 +2097,11 @@ XlwMenuInitialize (Widget request, Widget w, ArgList args, Cardinal *num_args) mw->menu.font_extents = XExtentsOfFontSet (mw->menu.fontSet); #endif + mw->menu.top_highlight_shadow_color = -1; + mw->menu.bottom_highlight_shadow_color = -1; + mw->menu.top_highlight_shadow_pixmap = None; + mw->menu.bottom_highlight_shadow_pixmap = None; + make_drawing_gcs (mw); make_shadow_gcs (mw); @@ -2038,12 +2176,14 @@ XlwMenuRealize (Widget w, Mask *valueMask, XSetWindowAttributes *attributes) #if defined USE_CAIRO || defined HAVE_XFT if (mw->menu.xft_font) { - XColor colors[3]; + XColor colors[4]; colors[0].pixel = mw->menu.xft_fg.pixel = mw->menu.foreground; colors[1].pixel = mw->menu.xft_bg.pixel = mw->core.background_pixel; colors[2].pixel = mw->menu.xft_disabled_fg.pixel = mw->menu.disabled_foreground; - XQueryColors (XtDisplay (mw), mw->core.colormap, colors, 3); + colors[3].pixel = mw->menu.xft_highlight_fg.pixel + = mw->menu.highlight_foreground; + XQueryColors (XtDisplay (mw), mw->core.colormap, colors, 4); mw->menu.xft_fg.color.alpha = 0xFFFF; mw->menu.xft_fg.color.red = colors[0].red; mw->menu.xft_fg.color.green = colors[0].green; @@ -2056,6 +2196,10 @@ XlwMenuRealize (Widget w, Mask *valueMask, XSetWindowAttributes *attributes) mw->menu.xft_disabled_fg.color.red = colors[2].red; mw->menu.xft_disabled_fg.color.green = colors[2].green; mw->menu.xft_disabled_fg.color.blue = colors[2].blue; + mw->menu.xft_highlight_fg.color.alpha = 0xFFFF; + mw->menu.xft_highlight_fg.color.red = colors[3].red; + mw->menu.xft_highlight_fg.color.green = colors[3].green; + mw->menu.xft_highlight_fg.color.blue = colors[3].blue; } #endif } diff --git a/lwlib/xlwmenu.h b/lwlib/xlwmenu.h index 7f4bf35939..4e36bde3fb 100644 --- a/lwlib/xlwmenu.h +++ b/lwlib/xlwmenu.h @@ -58,6 +58,10 @@ #define XtNallowResize "allowResize" #define XtCAllowResize "AllowResize" #define XtNborderThickness "borderThickness" #define XtCBorderThickness "BorderThickness" +#define XtNhighlightForeground "highlightForeground" +#define XtCHighlightForeground "HighlightForeground" +#define XtNhighlightBackground "highlightBackground" +#define XtCHighlightBackground "HighlightBackground" /* Motif-compatible resource names */ #define XmNshadowThickness "shadowThickness" diff --git a/lwlib/xlwmenuP.h b/lwlib/xlwmenuP.h index 455ecdbce0..c314eb3e91 100644 --- a/lwlib/xlwmenuP.h +++ b/lwlib/xlwmenuP.h @@ -63,13 +63,15 @@ #define _XlwMenuP_h #if defined USE_CAIRO || defined HAVE_XFT int default_face; XftFont* xft_font; - XftColor xft_fg, xft_bg, xft_disabled_fg; + XftColor xft_fg, xft_bg, xft_disabled_fg, xft_highlight_fg; #endif String fontName; XFontStruct* font; Pixel foreground; Pixel disabled_foreground; Pixel button_foreground; + Pixel highlight_foreground; + Pixel highlight_background; Dimension margin; Dimension horizontal_spacing; Dimension vertical_spacing; @@ -80,6 +82,10 @@ #define _XlwMenuP_h Pixel bottom_shadow_color; Pixmap top_shadow_pixmap; Pixmap bottom_shadow_pixmap; + Pixel top_highlight_shadow_color; + Pixel bottom_highlight_shadow_color; + Pixmap top_highlight_shadow_pixmap; + Pixmap bottom_highlight_shadow_pixmap; Cursor cursor_shape; XtCallbackList open; XtCallbackList select, highlight; @@ -88,8 +94,10 @@ #define _XlwMenuP_h int horizontal; /* True means top_shadow_color and/or bottom_shadow_color must be freed. */ - bool_bf free_top_shadow_color_p : 1; - bool_bf free_bottom_shadow_color_p : 1; + Boolean free_top_shadow_color_p; + Boolean free_bottom_shadow_color_p; + Boolean free_top_highlight_shadow_color_p; + Boolean free_bottom_highlight_shadow_color_p; /* State of the XlwMenu */ int top_depth; @@ -112,9 +120,13 @@ #define _XlwMenuP_h GC button_gc; GC background_gc; GC disabled_gc; + GC highlight_foreground_gc; + GC highlight_background_gc; GC inactive_button_gc; GC shadow_top_gc; GC shadow_bottom_gc; + GC highlight_shadow_top_gc; + GC highlight_shadow_bottom_gc; Cursor cursor; Boolean popped_up; Pixmap gray_pixmap; -- 2.37.0 --=-=-= Content-Type: text/plain -- Manuel Giraud --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Fri Jul 15 07:56:39 2022 Received: (at 56538) by debbugs.gnu.org; 15 Jul 2022 11:56:39 +0000 Received: from localhost ([127.0.0.1]:39744 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oCJvy-0002hk-6D for submit@debbugs.gnu.org; Fri, 15 Jul 2022 07:56:39 -0400 Received: from ledu-giraud.fr ([51.159.28.247]:42867) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oCJvu-0002hY-Oy for 56538@debbugs.gnu.org; Fri, 15 Jul 2022 07:56:36 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; s=rsa; bh=4xPpPQ7/K8t5Rhox KIXm5NZcPWDpvl5wvJ+ief+dl+o=; h=date:references:in-reply-to:subject: cc:to:from; d=ledu-giraud.fr; b=mWGOmTM2Qpwekh/E9YdbggH8/z35zWJoaVK3Ee 0L53Em9AYIuEtv/GrX9XXo2y4igrULmgEO/+N5JOnS6UTxs2Q+/VuLbFy+Urps5ad5gg/d If1HmZETohQq+sec0cCuKJ03gSwqwQk/0AllkRsRrS1seV1jB9q9sGv6S4LwWwXz9UBnsm k7h/8uncCCNt3uw+QDphBSHRgSO1ncBED+mk7xbc5QFaJPBqqNLWhcpxZuMjy8soyhwdtA Z5Rw9kf1x6qAIDyGE17yUOS9ePuQ/sxTccXF+i5BjWevDeiZPZ2pvvsvh3BETuShyidRDv 7gsJHiy+EZPjD6oZkCN8vnVg== Received: from elite.giraud ( [10.1.1.1]) by ledu-giraud.fr (OpenSMTPD) with ESMTPSA id fb7e5110 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Fri, 15 Jul 2022 13:56:25 +0200 (CEST) From: Manuel Giraud To: Po Lu Subject: Re: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend In-Reply-To: <874jzjp1st.fsf@yahoo.com> (Po Lu's message of "Fri, 15 Jul 2022 10:06:26 +0800") References: <87wnch16as.fsf@elite.giraud> <87k08gtsz0.fsf@yahoo.com> <87cze8t4i9.fsf@elite.giraud> <87k08goud8.fsf@yahoo.com> <87h73jq1dp.fsf@elite.giraud> <874jzjp1st.fsf@yahoo.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (berkeley-unix) Date: Fri, 15 Jul 2022 13:56:17 +0200 Message-ID: <87ilnysi72.fsf@elite.giraud> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 56538 Cc: 56538@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain Po Lu writes: [...] > Right, that's acceptable. I think the problem will go away if you > disable the rendering extension on the X server. Ok and I guess that not many people are using a PseudoColor display nowadays. > Yes. Looking at functions like `x_dnd_do_unsupported_drop' in xterm.c > should help as well. > > Otherwise, LGTM. Here is a new version of this patch. What's new: - fix some comments - format arguments list on both new functions and the one I have modified their arguments - add some forgot freeing in `release_shadow_gcs' --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-Colored-menu-highlight-in-Lucid-backend.patch >From d8b7a008163c776756da42dbbb208e9c88ed9b2d Mon Sep 17 00:00:00 2001 From: Manuel Giraud Date: Mon, 11 Jul 2022 11:14:08 +0200 Subject: [PATCH] Colored menu highlight in Lucid backend * lwlib/xlwmenuP.h: * lwlib/xlwmenu.h: * lwlib/xlwmenu.c: Introduce resources to handle colored highlighting of menu entries. * doc/emacs/xresources.texi (Lucid Resources): Documentation. --- doc/emacs/xresources.texi | 4 + etc/NEWS | 5 + lwlib/xlwmenu.c | 352 +++++++++++++++++++++++++++----------- lwlib/xlwmenu.h | 4 + lwlib/xlwmenuP.h | 18 +- 5 files changed, 276 insertions(+), 107 deletions(-) diff --git a/doc/emacs/xresources.texi b/doc/emacs/xresources.texi index 2c2700bc15..f8be06b5e7 100644 --- a/doc/emacs/xresources.texi +++ b/doc/emacs/xresources.texi @@ -449,6 +449,10 @@ Lucid Resources Foreground color. @item disabledForeground Foreground color for a disabled menu item. +@item highlightForeground +Foreground color for a highlighted menu item. +@item highlightBackground +Background color for a highlighted menu item. @ifnottex @item horizontalSpacing Horizontal spacing in pixels between items. Default is 3. diff --git a/etc/NEWS b/etc/NEWS index bf36316890..e1c708ca9d 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -544,6 +544,11 @@ and pop-up menus. This controls the style of the pre-edit and status areas of X input methods. ++++ +** New X resources: "highlightForeground" and "highlightBackground" +Only in the Lucid build, this controls colors used for highlighted +menu item widget. + +++ ** On X11, Emacs now tries to synchronize window resize with the window manager. This leads to less flicker and empty areas of a frame being displayed diff --git a/lwlib/xlwmenu.c b/lwlib/xlwmenu.c index 68f49e646d..2450e718c2 100644 --- a/lwlib/xlwmenu.c +++ b/lwlib/xlwmenu.c @@ -121,6 +121,10 @@ #define DEFAULT_FONTNAME "XtDefaultFont" offset(menu.disabled_foreground), XtRString, (XtPointer)NULL}, {XtNbuttonForeground, XtCButtonForeground, XtRPixel, sizeof(Pixel), offset(menu.button_foreground), XtRString, "XtDefaultForeground"}, + {XtNhighlightForeground, XtCHighlightForeground, XtRPixel, sizeof(Pixel), + offset(menu.highlight_foreground), XtRString, "XtDefaultForeground"}, + {XtNhighlightBackground, XtCHighlightBackground, XtRPixel, sizeof(Pixel), + offset(menu.highlight_background), XtRImmediate, (XtPointer)-1}, {XtNmargin, XtCMargin, XtRDimension, sizeof(Dimension), offset(menu.margin), XtRImmediate, (XtPointer)1}, {XtNhorizontalSpacing, XtCMargin, XtRDimension, sizeof(Dimension), @@ -570,8 +574,7 @@ draw_arrow (XlwMenuWidget mw, int down_p) { Display *dpy = XtDisplay (mw); - GC top_gc = mw->menu.shadow_top_gc; - GC bottom_gc = mw->menu.shadow_bottom_gc; + GC top_gc, bottom_gc; int thickness = mw->menu.shadow_thickness; int height = width; XPoint pt[10]; @@ -584,10 +587,13 @@ draw_arrow (XlwMenuWidget mw, if (down_p) { - GC temp; - temp = top_gc; - top_gc = bottom_gc; - bottom_gc = temp; + top_gc = mw->menu.highlight_shadow_bottom_gc; + bottom_gc = mw->menu.highlight_shadow_top_gc; + } + else + { + top_gc = mw->menu.shadow_top_gc; + bottom_gc = mw->menu.shadow_bottom_gc; } pt[0].x = x; @@ -621,24 +627,34 @@ draw_arrow (XlwMenuWidget mw, XFillPolygon (dpy, window, bottom_gc, pt, 4, Convex, CoordModeOrigin); } - - +/* Generic draw shadow rectangle function. It is used to draw shadows + on menus, menu items and also toggle buttons. When ERASE_P is + true, it clears shadows. DOWN_P is true when a menu item is pushed + or a button toggled. TOP_GC and BOTTOM_GC are the graphic contexts + used to draw the top and bottom shadow respectively. */ static void -draw_shadow_rectangle (XlwMenuWidget mw, - Window window, - int x, - int y, - int width, - int height, - int erase_p, - int down_p) +draw_shadow_rectangle (XlwMenuWidget mw, Window window, int x, int y, + int width, int height, int erase_p, int down_p, + GC top_gc, GC bottom_gc) { Display *dpy = XtDisplay (mw); - GC top_gc = !erase_p ? mw->menu.shadow_top_gc : mw->menu.background_gc; - GC bottom_gc = !erase_p ? mw->menu.shadow_bottom_gc : mw->menu.background_gc; int thickness = !x && !y ? mw->menu.border_thickness : mw->menu.shadow_thickness; XPoint points [4]; + /* Choose correct GC with a standard default if NULL. */ + if (erase_p) + { + top_gc = mw->menu.background_gc; + bottom_gc = mw->menu.background_gc; + } + else + { + if (top_gc == NULL) + top_gc = mw->menu.shadow_top_gc; + if (bottom_gc == NULL) + bottom_gc = mw->menu.shadow_bottom_gc; + } + if (!erase_p && width == height && width == toggle_button_width (mw)) { points [0].x = x; @@ -662,6 +678,7 @@ draw_shadow_rectangle (XlwMenuWidget mw, bottom_gc = temp; } + /* Do draw (or erase) shadows */ points [0].x = x; points [0].y = y; points [1].x = x + width; @@ -702,21 +719,28 @@ draw_shadow_rectangle (XlwMenuWidget mw, static void -draw_shadow_rhombus (XlwMenuWidget mw, - Window window, - int x, - int y, - int width, - int height, - int erase_p, - int down_p) +draw_shadow_rhombus (XlwMenuWidget mw, Window window, int x, int y, + int width, int height, int erase_p, int down_p, + GC top_gc, GC bottom_gc) { Display *dpy = XtDisplay (mw); - GC top_gc = !erase_p ? mw->menu.shadow_top_gc : mw->menu.background_gc; - GC bottom_gc = !erase_p ? mw->menu.shadow_bottom_gc : mw->menu.background_gc; int thickness = mw->menu.shadow_thickness; XPoint points [4]; + /* Choose correct GC with a standard default if NULL */ + if (erase_p) + { + top_gc = mw->menu.background_gc; + bottom_gc = mw->menu.background_gc; + } + else + { + if (top_gc == NULL) + top_gc = mw->menu.shadow_top_gc; + if (bottom_gc == NULL) + top_gc = mw->menu.shadow_bottom_gc; + } + if (!erase_p && width == height && width == radio_button_width (mw)) { points [0].x = x; @@ -784,15 +808,29 @@ draw_shadow_rhombus (XlwMenuWidget mw, toggle button is selected. */ static void -draw_toggle (XlwMenuWidget mw, Window window, int x, int y, int selected_p) +draw_toggle (XlwMenuWidget mw, Window window, int x, int y, int selected_p, + int highlighted_p) { int width, height; + GC top_gc, bottom_gc; + + if (highlighted_p) + { + top_gc = mw->menu.highlight_shadow_top_gc; + bottom_gc = mw->menu.highlight_shadow_bottom_gc; + } + else + { + top_gc = mw->menu.shadow_top_gc; + bottom_gc = mw->menu.shadow_bottom_gc; + } width = toggle_button_width (mw); height = width; x += mw->menu.horizontal_spacing; y += (MENU_FONT_ASCENT (mw) - height) / 2; - draw_shadow_rectangle (mw, window, x, y, width, height, False, selected_p); + draw_shadow_rectangle (mw, window, x, y, width, height, False, + selected_p, top_gc, bottom_gc); } @@ -801,15 +839,29 @@ draw_toggle (XlwMenuWidget mw, Window window, int x, int y, int selected_p) toggle button is selected. */ static void -draw_radio (XlwMenuWidget mw, Window window, int x, int y, int selected_p) +draw_radio (XlwMenuWidget mw, Window window, int x, int y, int selected_p, + int highlighted_p) { int width, height; + GC top_gc, bottom_gc; + + if (highlighted_p) + { + top_gc = mw->menu.highlight_shadow_top_gc; + bottom_gc = mw->menu.highlight_shadow_bottom_gc; + } + else + { + top_gc = mw->menu.shadow_top_gc; + bottom_gc = mw->menu.shadow_bottom_gc; + } width = radio_button_width (mw); height = width; x += mw->menu.horizontal_spacing; y += (MENU_FONT_ASCENT (mw) - height) / 2; - draw_shadow_rhombus (mw, window, x, y, width, height, False, selected_p); + draw_shadow_rhombus (mw, window, x, y, width, height, False, selected_p, + top_gc, bottom_gc); } @@ -968,6 +1020,31 @@ separator_height (enum menu_separator separator) } } +/* Draw the highlighted background and shadows. */ + +static void +draw_highlight (XlwMenuWidget mw, Window window, int x, int y, int width, + int height) +{ + Display *dpy = XtDisplay (mw); + XPoint points [4]; + + points [0].x = x; + points [0].y = y; + points [1].x = x + width; + points [1].y = y; + points [2].x = x + width; + points [2].y = y + height; + points [3].x = x; + points [3].y = y + height; + XFillPolygon (dpy, window, + mw->menu.highlight_background_gc, + points, 4, Convex, CoordModeOrigin); + + draw_shadow_rectangle(mw, window, x, y, width, height, False, False, + mw->menu.highlight_shadow_top_gc, + mw->menu.highlight_shadow_bottom_gc); +} /* Display the menu item and increment where.x and where.y to show how large the menu item was. */ @@ -983,7 +1060,6 @@ display_menu_item (XlwMenuWidget mw, { GC deco_gc; GC text_gc; - int font_height = MENU_FONT_HEIGHT (mw); int font_ascent = MENU_FONT_ASCENT (mw); int shadow = mw->menu.shadow_thickness; int margin = mw->menu.margin; @@ -1032,12 +1108,21 @@ display_menu_item (XlwMenuWidget mw, /* pick the foreground and background GC. */ if (val->enabled) - text_gc = mw->menu.foreground_gc; + if (highlighted_p) + text_gc = mw->menu.highlight_foreground_gc; + else + text_gc = mw->menu.foreground_gc; else text_gc = mw->menu.disabled_gc; deco_gc = mw->menu.foreground_gc; #if defined USE_CAIRO || defined HAVE_XFT - xftfg = val->enabled ? &mw->menu.xft_fg : &mw->menu.xft_disabled_fg; + if (val->enabled) + if (highlighted_p) + xftfg = &mw->menu.xft_highlight_fg; + else + xftfg = &mw->menu.xft_fg; + else + xftfg = &mw->menu.xft_disabled_fg; #endif if (separator_p) @@ -1048,8 +1133,11 @@ display_menu_item (XlwMenuWidget mw, { int x_offset = x + h_spacing + shadow; char* display_string = resource_widget_value (mw, val); - draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, True, - False); + /* Clears shadows and maybe highlight */ + draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, + True, False, NULL, NULL); + if (highlighted_p) + draw_highlight (mw, ws->pixmap, x, y, width, height); /* Deal with centering a menu title. */ if (!horizontal_p && !val->contents && !val->call_data) @@ -1095,10 +1183,10 @@ display_menu_item (XlwMenuWidget mw, { if (val->button_type == BUTTON_TYPE_TOGGLE) draw_toggle (mw, ws->pixmap, x, y + v_spacing + shadow, - val->selected); + val->selected, highlighted_p); else if (val->button_type == BUTTON_TYPE_RADIO) draw_radio (mw, ws->pixmap, x, y + v_spacing + shadow, - val->selected); + val->selected, highlighted_p); if (val->contents) { @@ -1145,25 +1233,18 @@ display_menu_item (XlwMenuWidget mw, } else { - XDrawRectangle (XtDisplay (mw), ws->pixmap, - mw->menu.background_gc, - x + shadow, y + shadow, - label_width + h_spacing - 1, - font_height + 2 * v_spacing - 1); - draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, - True, False); + /* If not highlighted, clears shadows for horizontal + menu item */ + if (!highlighted_p) + draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, + True, False, NULL, NULL); } #ifdef USE_CAIRO if (ws->xft_draw) cairo_surface_flush (cairo_get_target (ws->xft_draw)); #endif - - if (highlighted_p) - draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, False, - False); } } - where->x += width; where->y += height; } @@ -1257,7 +1338,7 @@ display_menu (XlwMenuWidget mw, if (!just_compute_p) { draw_shadow_rectangle (mw, ws->pixmap, 0, 0, ws->width, ws->height, - False, False); + False, False, NULL, NULL); XCopyArea (XtDisplay (mw), ws->pixmap, ws->window, mw->menu.foreground_gc, 0, 0, ws->width, ws->height, 0, 0); } @@ -1714,6 +1795,18 @@ #define BRIGHTNESS(color) (((color) & 0xff) + (((color) >> 8) & 0xff) + (((color xgcv.foreground = mw->core.background_pixel; xgcv.background = mw->menu.foreground; mw->menu.background_gc = XtGetGC ((Widget)mw, mask, &xgcv); + + xgcv.foreground = mw->menu.highlight_foreground; + xgcv.background = ((mw->menu.highlight_background == -1) + ? mw->core.background_pixel + : mw->menu.highlight_background); + mw->menu.highlight_foreground_gc = XtGetGC ((Widget)mw, mask, &xgcv); + + xgcv.foreground = ((mw->menu.highlight_background == -1) + ? mw->core.background_pixel + : mw->menu.highlight_background); + xgcv.background = mw->menu.foreground; + mw->menu.highlight_background_gc = XtGetGC ((Widget)mw, mask, &xgcv); } static void @@ -1724,12 +1817,16 @@ release_drawing_gcs (XlwMenuWidget mw) XtReleaseGC ((Widget) mw, mw->menu.disabled_gc); XtReleaseGC ((Widget) mw, mw->menu.inactive_button_gc); XtReleaseGC ((Widget) mw, mw->menu.background_gc); + XtReleaseGC ((Widget) mw, mw->menu.highlight_foreground_gc); + XtReleaseGC ((Widget) mw, mw->menu.highlight_background_gc); /* let's get some segvs if we try to use these... */ mw->menu.foreground_gc = (GC) -1; mw->menu.button_gc = (GC) -1; mw->menu.disabled_gc = (GC) -1; mw->menu.inactive_button_gc = (GC) -1; mw->menu.background_gc = (GC) -1; + mw->menu.highlight_foreground_gc = (GC) -1; + mw->menu.highlight_background_gc = (GC) -1; } #ifndef emacs @@ -1738,29 +1835,29 @@ #define MINL(x,y) ((((unsigned long) (x)) < ((unsigned long) (y))) \ #endif static void -make_shadow_gcs (XlwMenuWidget mw) +compute_shadow_colors (XlwMenuWidget mw, Pixel *top_color, Pixel *bottom_color, + Boolean *free_top_p, Boolean *free_bottom_p, + Pixmap *top_pixmap, Pixmap *bottom_pixmap, + Pixel fore_color, Pixel back_color) { - XGCValues xgcv; - unsigned long pm = 0; Display *dpy = XtDisplay ((Widget) mw); Screen *screen = XtScreen ((Widget) mw); Colormap cmap = mw->core.colormap; XColor topc, botc; int top_frobbed = 0, bottom_frobbed = 0; - mw->menu.free_top_shadow_color_p = 0; - mw->menu.free_bottom_shadow_color_p = 0; + *free_top_p = False; + *free_bottom_p = False; - if (mw->menu.top_shadow_color == -1) - mw->menu.top_shadow_color = mw->core.background_pixel; + if (*top_color == -1) + *top_color = back_color; - if (mw->menu.bottom_shadow_color == -1) - mw->menu.bottom_shadow_color = mw->menu.foreground; + if (*bottom_color == -1) + *bottom_color = fore_color; - if (mw->menu.top_shadow_color == mw->core.background_pixel || - mw->menu.top_shadow_color == mw->menu.foreground) + if (*top_color == back_color || *top_color == fore_color) { - topc.pixel = mw->core.background_pixel; + topc.pixel = back_color; #ifdef emacs if (x_alloc_lighter_color_for_widget ((Widget) mw, dpy, cmap, &topc.pixel, @@ -1774,15 +1871,14 @@ make_shadow_gcs (XlwMenuWidget mw) if (XAllocColor (dpy, cmap, &topc)) #endif { - mw->menu.top_shadow_color = topc.pixel; - mw->menu.free_top_shadow_color_p = 1; + *top_color = topc.pixel; + *free_top_p = True; top_frobbed = 1; } } - if (mw->menu.bottom_shadow_color == mw->menu.foreground || - mw->menu.bottom_shadow_color == mw->core.background_pixel) + if (*bottom_color == fore_color || *bottom_color == back_color) { - botc.pixel = mw->core.background_pixel; + botc.pixel = back_color; #ifdef emacs if (x_alloc_lighter_color_for_widget ((Widget) mw, dpy, cmap, &botc.pixel, @@ -1795,8 +1891,8 @@ make_shadow_gcs (XlwMenuWidget mw) if (XAllocColor (dpy, cmap, &botc)) #endif { - mw->menu.bottom_shadow_color = botc.pixel; - mw->menu.free_bottom_shadow_color_p = 1; + *bottom_color = botc.pixel; + *free_bottom_p = True; bottom_frobbed = 1; } } @@ -1805,63 +1901,94 @@ make_shadow_gcs (XlwMenuWidget mw) { if (topc.pixel == botc.pixel) { - if (botc.pixel == mw->menu.foreground) + if (botc.pixel == fore_color) { - if (mw->menu.free_top_shadow_color_p) + if (*free_top_p) { - x_free_dpy_colors (dpy, screen, cmap, - &mw->menu.top_shadow_color, 1); - mw->menu.free_top_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, top_color, 1); + *free_top_p = False; } - mw->menu.top_shadow_color = mw->core.background_pixel; + *top_color = back_color; } else { - if (mw->menu.free_bottom_shadow_color_p) + if (*free_bottom_p) { - x_free_dpy_colors (dpy, screen, cmap, - &mw->menu.bottom_shadow_color, 1); - mw->menu.free_bottom_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, bottom_color, 1); + *free_bottom_p = False; } - mw->menu.bottom_shadow_color = mw->menu.foreground; + *bottom_color = fore_color; } } } - if (!mw->menu.top_shadow_pixmap - && mw->menu.top_shadow_color == mw->core.background_pixel) + if (!*top_pixmap && *top_color == back_color) { - mw->menu.top_shadow_pixmap = mw->menu.gray_pixmap; - if (mw->menu.free_top_shadow_color_p) + *top_pixmap = mw->menu.gray_pixmap; + if (*free_top_p) { - x_free_dpy_colors (dpy, screen, cmap, &mw->menu.top_shadow_color, 1); - mw->menu.free_top_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, top_color, 1); + *free_top_p = False; } - mw->menu.top_shadow_color = mw->menu.foreground; + *top_color = fore_color; } - if (!mw->menu.bottom_shadow_pixmap - && mw->menu.bottom_shadow_color == mw->core.background_pixel) + if (!*bottom_pixmap && *bottom_color == back_color) { - mw->menu.bottom_shadow_pixmap = mw->menu.gray_pixmap; - if (mw->menu.free_bottom_shadow_color_p) + *bottom_pixmap = mw->menu.gray_pixmap; + if (*free_bottom_p) { - x_free_dpy_colors (dpy, screen, cmap, - &mw->menu.bottom_shadow_color, 1); - mw->menu.free_bottom_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, bottom_color, 1); + *free_bottom_p = False; } - mw->menu.bottom_shadow_color = mw->menu.foreground; + *bottom_color = fore_color; } +} + +static void +make_shadow_gcs (XlwMenuWidget mw) +{ + XGCValues xgcv; + unsigned long pm = 0; + + /* Normal shadows */ + compute_shadow_colors (mw, &(mw->menu.top_shadow_color), + &(mw->menu.bottom_shadow_color), + &(mw->menu.free_top_shadow_color_p), + &(mw->menu.free_bottom_shadow_color_p), + &(mw->menu.top_shadow_pixmap), + &(mw->menu.bottom_shadow_pixmap), + mw->menu.foreground, mw->core.background_pixel); + + /* Highlight shadows */ + compute_shadow_colors (mw, &(mw->menu.top_highlight_shadow_color), + &(mw->menu.bottom_highlight_shadow_color), + &(mw->menu.free_top_highlight_shadow_color_p), + &(mw->menu.free_bottom_highlight_shadow_color_p), + &(mw->menu.top_highlight_shadow_pixmap), + &(mw->menu.bottom_highlight_shadow_pixmap), + mw->menu.highlight_foreground, + mw->menu.highlight_background); xgcv.fill_style = FillStippled; xgcv.foreground = mw->menu.top_shadow_color; xgcv.stipple = mw->menu.top_shadow_pixmap; - pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0); - mw->menu.shadow_top_gc = XtGetGC ((Widget)mw, GCForeground | pm, &xgcv); + pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0); + mw->menu.shadow_top_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv); xgcv.foreground = mw->menu.bottom_shadow_color; xgcv.stipple = mw->menu.bottom_shadow_pixmap; - pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0); - mw->menu.shadow_bottom_gc = XtGetGC ((Widget)mw, GCForeground | pm, &xgcv); + pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0); + mw->menu.shadow_bottom_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv); + + xgcv.foreground = mw->menu.top_highlight_shadow_color; + xgcv.stipple = mw->menu.top_highlight_shadow_pixmap; + pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0); + mw->menu.highlight_shadow_top_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv); + + xgcv.foreground = mw->menu.bottom_highlight_shadow_color; + xgcv.stipple = mw->menu.bottom_highlight_shadow_pixmap; + pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0); + mw->menu.highlight_shadow_bottom_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv); } @@ -1871,18 +1998,24 @@ release_shadow_gcs (XlwMenuWidget mw) Display *dpy = XtDisplay ((Widget) mw); Screen *screen = XtScreen ((Widget) mw); Colormap cmap = mw->core.colormap; - Pixel px[2]; + Pixel px[4]; int i = 0; if (mw->menu.free_top_shadow_color_p) px[i++] = mw->menu.top_shadow_color; if (mw->menu.free_bottom_shadow_color_p) px[i++] = mw->menu.bottom_shadow_color; + if (mw->menu.free_top_highlight_shadow_color_p) + px[i++] = mw->menu.top_highlight_shadow_color; + if (mw->menu.free_bottom_highlight_shadow_color_p) + px[i++] = mw->menu.bottom_highlight_shadow_color; if (i > 0) x_free_dpy_colors (dpy, screen, cmap, px, i); XtReleaseGC ((Widget) mw, mw->menu.shadow_top_gc); XtReleaseGC ((Widget) mw, mw->menu.shadow_bottom_gc); + XtReleaseGC ((Widget) mw, mw->menu.highlight_shadow_top_gc); + XtReleaseGC ((Widget) mw, mw->menu.highlight_shadow_bottom_gc); } #if defined USE_CAIRO || defined HAVE_XFT @@ -1964,6 +2097,11 @@ XlwMenuInitialize (Widget request, Widget w, ArgList args, Cardinal *num_args) mw->menu.font_extents = XExtentsOfFontSet (mw->menu.fontSet); #endif + mw->menu.top_highlight_shadow_color = -1; + mw->menu.bottom_highlight_shadow_color = -1; + mw->menu.top_highlight_shadow_pixmap = None; + mw->menu.bottom_highlight_shadow_pixmap = None; + make_drawing_gcs (mw); make_shadow_gcs (mw); @@ -2038,12 +2176,14 @@ XlwMenuRealize (Widget w, Mask *valueMask, XSetWindowAttributes *attributes) #if defined USE_CAIRO || defined HAVE_XFT if (mw->menu.xft_font) { - XColor colors[3]; + XColor colors[4]; colors[0].pixel = mw->menu.xft_fg.pixel = mw->menu.foreground; colors[1].pixel = mw->menu.xft_bg.pixel = mw->core.background_pixel; colors[2].pixel = mw->menu.xft_disabled_fg.pixel = mw->menu.disabled_foreground; - XQueryColors (XtDisplay (mw), mw->core.colormap, colors, 3); + colors[3].pixel = mw->menu.xft_highlight_fg.pixel + = mw->menu.highlight_foreground; + XQueryColors (XtDisplay (mw), mw->core.colormap, colors, 4); mw->menu.xft_fg.color.alpha = 0xFFFF; mw->menu.xft_fg.color.red = colors[0].red; mw->menu.xft_fg.color.green = colors[0].green; @@ -2056,6 +2196,10 @@ XlwMenuRealize (Widget w, Mask *valueMask, XSetWindowAttributes *attributes) mw->menu.xft_disabled_fg.color.red = colors[2].red; mw->menu.xft_disabled_fg.color.green = colors[2].green; mw->menu.xft_disabled_fg.color.blue = colors[2].blue; + mw->menu.xft_highlight_fg.color.alpha = 0xFFFF; + mw->menu.xft_highlight_fg.color.red = colors[3].red; + mw->menu.xft_highlight_fg.color.green = colors[3].green; + mw->menu.xft_highlight_fg.color.blue = colors[3].blue; } #endif } diff --git a/lwlib/xlwmenu.h b/lwlib/xlwmenu.h index 7f4bf35939..4e36bde3fb 100644 --- a/lwlib/xlwmenu.h +++ b/lwlib/xlwmenu.h @@ -58,6 +58,10 @@ #define XtNallowResize "allowResize" #define XtCAllowResize "AllowResize" #define XtNborderThickness "borderThickness" #define XtCBorderThickness "BorderThickness" +#define XtNhighlightForeground "highlightForeground" +#define XtCHighlightForeground "HighlightForeground" +#define XtNhighlightBackground "highlightBackground" +#define XtCHighlightBackground "HighlightBackground" /* Motif-compatible resource names */ #define XmNshadowThickness "shadowThickness" diff --git a/lwlib/xlwmenuP.h b/lwlib/xlwmenuP.h index 455ecdbce0..c314eb3e91 100644 --- a/lwlib/xlwmenuP.h +++ b/lwlib/xlwmenuP.h @@ -63,13 +63,15 @@ #define _XlwMenuP_h #if defined USE_CAIRO || defined HAVE_XFT int default_face; XftFont* xft_font; - XftColor xft_fg, xft_bg, xft_disabled_fg; + XftColor xft_fg, xft_bg, xft_disabled_fg, xft_highlight_fg; #endif String fontName; XFontStruct* font; Pixel foreground; Pixel disabled_foreground; Pixel button_foreground; + Pixel highlight_foreground; + Pixel highlight_background; Dimension margin; Dimension horizontal_spacing; Dimension vertical_spacing; @@ -80,6 +82,10 @@ #define _XlwMenuP_h Pixel bottom_shadow_color; Pixmap top_shadow_pixmap; Pixmap bottom_shadow_pixmap; + Pixel top_highlight_shadow_color; + Pixel bottom_highlight_shadow_color; + Pixmap top_highlight_shadow_pixmap; + Pixmap bottom_highlight_shadow_pixmap; Cursor cursor_shape; XtCallbackList open; XtCallbackList select, highlight; @@ -88,8 +94,10 @@ #define _XlwMenuP_h int horizontal; /* True means top_shadow_color and/or bottom_shadow_color must be freed. */ - bool_bf free_top_shadow_color_p : 1; - bool_bf free_bottom_shadow_color_p : 1; + Boolean free_top_shadow_color_p; + Boolean free_bottom_shadow_color_p; + Boolean free_top_highlight_shadow_color_p; + Boolean free_bottom_highlight_shadow_color_p; /* State of the XlwMenu */ int top_depth; @@ -112,9 +120,13 @@ #define _XlwMenuP_h GC button_gc; GC background_gc; GC disabled_gc; + GC highlight_foreground_gc; + GC highlight_background_gc; GC inactive_button_gc; GC shadow_top_gc; GC shadow_bottom_gc; + GC highlight_shadow_top_gc; + GC highlight_shadow_bottom_gc; Cursor cursor; Boolean popped_up; Pixmap gray_pixmap; -- 2.37.0 --=-=-= Content-Type: text/plain -- Manuel Giraud --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Fri Jul 15 08:59:14 2022 Received: (at 56538) by debbugs.gnu.org; 15 Jul 2022 12:59:14 +0000 Received: from localhost ([127.0.0.1]:39795 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oCKuY-0000DP-9v for submit@debbugs.gnu.org; Fri, 15 Jul 2022 08:59:14 -0400 Received: from sonic305-21.consmr.mail.ne1.yahoo.com ([66.163.185.147]:34282) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oCKuL-0000Ci-5j for 56538@debbugs.gnu.org; Fri, 15 Jul 2022 08:59:12 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1657889935; bh=PnkyYCD25i1pBYsHwlGCA9zDAiBhRVeef66n/MAgO/w=; h=From:To:Cc:Subject:References:Date:In-Reply-To:From:Subject:Reply-To; b=myWY4NgGqDTowhbm0GnMuTFjQIwJr9Q2hmXeSCcdqMpPUX3uOHTly1sFbdBQsrLI8XMye6P5/vaOexc20Gm4wfKp+pJhvt77InjL4lxJ2U+q2evP0KUueg6PqHY8RjTHbRRMxqBEhPe/6G8M523IQ7CrEUBH3xoFO1b+Rd9i5RSeoZwPErbTFyxwqw9kx0oI8wnW0I/EFk0RbAkufrB1Zkga5Rcoq1CcBwY7qbCyhpSr9ECdGWq/zzEfiHtEIBlgQgKoWY3XcwioxmXcifpKWHM86fodgtBp6eJynpZbBueoiMv8IogwKk48HMr44FKJdgYUFO7Js8YRKLIcw4w1GA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1657889935; bh=0joNNkW5uiMxLzpMAGWloDiDY3UrYKlXeK9Hxz84YyR=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=apeupy5/R3RphUvBP7FFYeKZwPeIqJuMBDWirdpw6hTNHHD5lj7IpPEjyDJZBJirWU4qpAFwSjCCKp/Ufz1iZOlzsVG6m8h0BYFt/9YJyObGH+HhjnVfcUHp4Y+N5neHkBpOtoNHJaIRE84RS1i01fagJBrm8PwQftm9NuNZyHvVxBV4aVOQGg4M6W12ukbO8SpLAwgPaSnQyeqUOZ/7UKu7I8FCRBYhzIrnCGkrhFAFaHyOwNnYIafho8fo1vg+6YsECC3euZdoMoDaSbT6+CbyN9critof+GTCoJvuTyL9wcOE3BOJWnsaVSr27bJ/ha2PSf16HrM/V6N9+2lDyw== X-YMail-OSG: mO3GQgAVM1nuVz5j6dBDFPAlDvMK12lnD7AI8aW4AARa2JdrPsleOPQXoBo3T2Q 2rhUQOp.HNKG1i7duiVDpaQH7pDubRglqGxTXOFEPh7WNkFuoz0w0WqpmUf9fiKKg_DaalOZnm3b yQcCVSnPhTvRr5pwGT..8gZYMbY.Gbjdzkn_N44Y1mX0N_.4qHQRA9QoUccCAXPT0RlYvZ6UBPZ_ v51lrNOsKS0gk2Tb_Vss5oQzeUBY_WvNo0NEHZk.Ju2pmEiw_7eViK_ufYn4SFYltdnZItlJKS6R AClgWQZ0yAdZ.SbgtWoDCBD.4v9l7Psc2ty7VB2oqS_j1GBbZuzqW8cHfeCkdTfy_n0kt61N2Ne1 n7Qg_YGmsdQy5DGH3aZsYVBMoGYdhp89e7MD5odqrAvbMF1NKYpK9ZeJXvPBPAzcVSM.EbH7Qx2K sHOAJmC7xGDKd3H7AKbbjA0qYu4TUVVWHqm4gCG_HRW4egtKAJdwK8mLFRXSpezJli7cGLlpYUbn 4zZjxymNTSv4p85jKOYBieJFpzEhGAXWrHGV1_yd84PYrRKa8dQHSetpznhT4EFTDdTMWyfX.FCy b5E20ykBICan6G8p7QwuH_yHPPNnraALbMsBA760ZaBqENZM4mnzeSmANyz24KOhTli2uLLW7BVS Y1RvcX0WDmu.RuXDYYo_XEMgys8IgY5EOR7qNdOaSg_i5N2Uzmr_SXb8paor086gad_ZY35kM03u NW9Ozj8epRFTr8Cf3LemCbEfHRXIxWKzpaOaV9Ex4Np9lA_Wd.FWTcPu94g5G5aNc6RIXgTMIpyF jrcLJatRZyBbspfTnSw02.BLl5KAEV6KRzyC84X674aRZm55bzRP4yAakyL6YZSG18M_DCoPCM7T sDYTp69IbBDTyAmJTuSASVg75b8TMFqv5WH5YmZaP._EJrJS_KUnxEAfDGsyep1BCCOq6sdQPhWg a8vezFl3CGmbXPceP36_UmIaZwnj0sp17qyzlCDxvTDmpe02f.kStvVHIwFkgHYyXubfMrVHXKBb w0.Ll8cVgEDRt8Zxe2SW2yx7dS3H6wvI9hDbYddKAHS.qPfUKAzZ.YKjmhRxjqDXLlOH7SI.07X_ BRFsGOU.56k1fXGc9gbUEXEqEoLTlqH1RS8AIZ8MzPwUsN77gTGFnwdX3_RqJUjxaaZK5KOWjBp6 MRbdUoPpIl2VId_EzWjKTzSK_h3NEQWYN765eZEb5Vx87pCq61yv7NdEwCPE1qLBZaJqt.N58Qlp ILEAg6RFWDbkzWY9_EFW67G8cd7iP98I1UaHnzhLSmZEE_7HX_oFO7EZHiqPKRqWqYwASYq1Gxbv tpNBBoh7fRDrLaZz3qaeGU7MYe70agQ10xNRpCijvueR9Z4ce12ue7qFFIqHvpd0YAzd76Ylc0WB mzM0oYwMM3oBxefV6cpSHbSoDJqdxCuKU5F2IW2nTsBZPnmqgY39NF5WHJT55HBeamannkfv7abI 5hJBZicoiYRmtHbV0rmBmH9JnayFmFjDfkK1jrIoTjLQrh254.OCgi8RDTapHAF63Y8bUu9O7.tb pi7GnvjjTb41DVaSb.79Ln4P1FuEqDSljTW8pqRoKBx9C3uJEjS_p0jv9IGhzZN5GQUSsmR_WDWL p0yqdjkVo4NaC9M7rIK28AW4HzvUAUUIdByytGzRp6fj.6WPbmkSkdfgSoJjtbDJ1hAirW_IDdc. IyPWKk09nk7jlFE42TlHN33OSu92OXK2Y.whu6u5OjH0kmPNxtiA8x6gEuR_z94lctR1AmzNKeH2 kCf.ECykmZVP1jiPaGQNf2SKMS6man7biNKdy8WW2jfzxJVXKn4vHR263JevGmYhqgBZ.5WoyZ0P NN07cj0Yp1ZUn6P5oW3Px0ZcAvTKT2GneoG7BkZz9OJBsMRap3y4YYrx7oYATVDKqzWCvgPoD69H 7336XqtSWnsTeeqBIXnzkLhX.eDpzxQ8UBHYW6JAn7w5EVOR8NAu31q_qy4mlaU7RYK1Tf8UXAcF RzXnswhHCQgW8rspn8LuCQKd8wGrvlkQlbOTk12RwJ8uW6O92W8PmARZNLPAplSCBbTQommsw23Y PC5OH6MyzwWmL4xp1lmgjM5HPxnEwTYkW9dbiZq9HHPfxDd.wDn5EJd1MoUxQkFWC9HRWXGWUECB 6DPCONC.Pv30AwpYS.XwUpt0nR_.Co_TxjliafwrEL_t4mFTMK.1I1RVGeBpTK0hjwk5N3dJ42cG 5MvtfDvc943weYt2DOLoI7fYkiTrCEc_BB6R3CvYmhGHjvbyc7TZ0SoynMZ3tiQKB X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic305.consmr.mail.ne1.yahoo.com with HTTP; Fri, 15 Jul 2022 12:58:55 +0000 Received: by hermes--canary-production-sg3-67975bbd4b-w2clr (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 0f53437e286836a93d42175b2551ada2; Fri, 15 Jul 2022 12:58:51 +0000 (UTC) From: Po Lu To: Manuel Giraud Subject: Re: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend References: <87wnch16as.fsf@elite.giraud> <87k08gtsz0.fsf@yahoo.com> <87cze8t4i9.fsf@elite.giraud> <87k08goud8.fsf@yahoo.com> <87h73jq1dp.fsf@elite.giraud> <874jzjp1st.fsf@yahoo.com> <87ilnysi72.fsf@elite.giraud> Date: Fri, 15 Jul 2022 20:58:46 +0800 In-Reply-To: <87ilnysi72.fsf@elite.giraud> (Manuel Giraud's message of "Fri, 15 Jul 2022 13:56:17 +0200") Message-ID: <87v8rymt15.fsf@yahoo.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.91 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Mailer: WebService/1.1.20407 mail.backend.jedi.jws.acl:role.jedi.acl.token.atz.jws.hermes.yahoo Content-Length: 850 X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 56538 Cc: 56538@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Manuel Giraud writes: > Here is a new version of this patch. What's new: > > - fix some comments > > - format arguments list on both new functions and the one I have > modified their arguments > > - add some forgot freeing in `release_shadow_gcs' Thanks. One (late) last comment on the documentation: > +@item highlightForeground > +Foreground color for a highlighted menu item. > +@item highlightBackground > +Background color for a highlighted menu item. Shouldn't this say "the menu item highlighted by the mouse"? Otherwise, what "highlighted" means is not exactly clear. > +** New X resources: "highlightForeground" and "highlightBackground" > +Only in the Lucid build, this controls colors used for highlighted > +menu item widget. And here, shouldn't "widget" be in plural? From debbugs-submit-bounces@debbugs.gnu.org Fri Jul 15 09:27:42 2022 Received: (at 56538) by debbugs.gnu.org; 15 Jul 2022 13:27:42 +0000 Received: from localhost ([127.0.0.1]:39861 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oCLM6-0000z1-0z for submit@debbugs.gnu.org; Fri, 15 Jul 2022 09:27:42 -0400 Received: from ledu-giraud.fr ([51.159.28.247]:27815) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oCLM4-0000yr-2w for 56538@debbugs.gnu.org; Fri, 15 Jul 2022 09:27:41 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; s=rsa; bh=+r4Y6R7a0JlwKthE mmIXXDiovaiJ3BU3n36sR3D/5Lg=; h=date:references:in-reply-to:subject: cc:to:from; d=ledu-giraud.fr; b=lCHOckbtyO4QbfRyICDBggNmj952HEu6YE3QCu FsqivA/y7dSq1+uBlviNLZPSW8a8F5npOrlnAz9D4cAJ/1Eueik68Vgb31euno9Fhlm7yR szuYh2wSCtNFEO4Y07AK4YkYmmsTJnDxw0IErC3xnLIaEFceupnP/GPsl58LXOBS+QGSrM 4Msx5vO5yYFsqMhqLpePf/gBzeY9aZMMoVNVZRFCWl0JQ6+aChAlTB3/Aco/8+j7Gzqnen eSxkxnUqPHRNzvFiBeDQVdSv+zuPoxDp/u81jpCCz1V5B+yA1yXHEi4KoCKpCHeNjv14Kw YyradTXxD/G/Y6cFnwafYFmg== Received: from elite.giraud ( [10.1.1.1]) by ledu-giraud.fr (OpenSMTPD) with ESMTPSA id 6c795dba (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Fri, 15 Jul 2022 15:27:36 +0200 (CEST) From: Manuel Giraud To: Po Lu Subject: Re: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend In-Reply-To: <87v8rymt15.fsf@yahoo.com> (Po Lu's message of "Fri, 15 Jul 2022 20:58:46 +0800") References: <87wnch16as.fsf@elite.giraud> <87k08gtsz0.fsf@yahoo.com> <87cze8t4i9.fsf@elite.giraud> <87k08goud8.fsf@yahoo.com> <87h73jq1dp.fsf@elite.giraud> <874jzjp1st.fsf@yahoo.com> <87ilnysi72.fsf@elite.giraud> <87v8rymt15.fsf@yahoo.com> Date: Fri, 15 Jul 2022 15:27:23 +0200 Message-ID: <87edymsdz8.fsf@elite.giraud> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 56538 Cc: 56538@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Po Lu writes: [...] >> +@item highlightForeground >> +Foreground color for a highlighted menu item. >> +@item highlightBackground >> +Background color for a highlighted menu item. > > Shouldn't this say "the menu item highlighted by the mouse"? Otherwise, > what "highlighted" means is not exactly clear. I did not add "by the mouse" because menus could also be navigated with keyboard arrows. Do you have any other suggestions to make it clearer? >> +** New X resources: "highlightForeground" and "highlightBackground" >> +Only in the Lucid build, this controls colors used for highlighted >> +menu item widget. > > And here, shouldn't "widget" be in plural? Ok. I'll add it to the next patch when the previous issue is resolved. -- Manuel Giraud From debbugs-submit-bounces@debbugs.gnu.org Fri Jul 15 23:04:59 2022 Received: (at 56538) by debbugs.gnu.org; 16 Jul 2022 03:04:59 +0000 Received: from localhost ([127.0.0.1]:42588 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oCY70-0004oJ-SB for submit@debbugs.gnu.org; Fri, 15 Jul 2022 23:04:59 -0400 Received: from sonic305-22.consmr.mail.ne1.yahoo.com ([66.163.185.148]:42092) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oCY6w-0004o0-6Q for 56538@debbugs.gnu.org; Fri, 15 Jul 2022 23:04:57 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1657940687; bh=SEvDEsP7WAy425D6KAsXkpxRhyMrfUE2pzaSG08lf8w=; h=From:To:Cc:Subject:References:Date:In-Reply-To:From:Subject:Reply-To; b=LCOe+e+4Hcz/5/Cvs/do09APEuUBxrha9Uq6eaRcyk+CrZ6ivvvCq3F0HPZjwuFsW2TaKYdIUl1rLJldyqpeVxq9/yVCxtrWHpbUa1iNuBOS2WlU9ekri0xRYOmVlAh3p7QaaMcIbLJZ0NqDid44mHlO1zXJ+r75NsXr+70HUG8CGemAL26ul1yWPLXpFaQjE4WUltNAgSy82F0bPXT2eBZIK5R5n7enGCY5gvv1RJIyDTIZbSgnQVuwII7MUavsTuE2HKYzCEINVrcFUpZrUANVMjGBRchIZ36RRfrH9yFi7RAgvsivPO1d4FBMaQQDCvgyjsvGwXG8aGVkyc1p9Q== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1657940687; bh=0JgvGsncGmUs9h5e6ZL0SzlAqAvclEyvuSxTLKrXQz9=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=RH5T1gjUaP7hXUMB03T2KRocTEnAGkoQIeEWecUXNQPZqD/2zgPbk3DUw4qz8TT7M+/g7Go+hylmBkz0UogqtFEXqVvUsLQJNUe+q+cyxKgBZ6MHO9NAeYXcVhTaj/W7jU3fZya6/1RQfW7eCuP5tqaFpYm20FagNpBJWrAHuxY7zi9fGhJEGbvFeGK4FEDpa0VebB7FH6Dd8f1H1MNhyzSZUPcn3402Wc/aDcrrsELsfRn5R37P1ua51XZH0qD4dKPI8pXOjnLNoysMi9dXY0qC0jTfGO6WJF+w3INfDSPv59f6zyshUm5SWcdybfBYtQfW0TS3H6k2C3kEZOqXqA== X-YMail-OSG: tsI5vy8VM1kJY.YyzJIjBssb8CiEXSB6oN36UwT0BQWLYu.Kh646Z.rs1sNMsHk qUreJB_l9rB.I4TsgElxC6f4vtE2iL4YozskEdWnOG7xcXw9TTNNb1Nhr_0Yab_GjU9_R2jtg22G _LpBxzLm2pF8us_zMEsSyoTfOH09WjMQ2SZJ8tR4DAeq3EagvtcprpBHEsdvskVaAFrka0IkLm0c bwTck6l9uBNiaEjMg26KIUZ_nJ4.0prgONJNp29eKIocF8uSigto5YVEEEqYFSXV0fIVkB67jb_P SmvgQif6qEwSVYSuxCaMLz6k.4Kpr8aKO.sPD6zx8IkzOO9qyrsUFeKvo9SE9Gl1anqg9Yyj0817 rsu_ZXTQOr6lq75UCQQqWvscVDUkNimtC313qUK8wZFApUR9wuARozEr6yAbA2rlWFSl0Qp_VC2l GEaUlLj6rG5.W6iKUt0QVzLwPOpAUU7xOoRyAeEjqyWKxjnq.z.cy1aOK554K02lmayBD8UHicBK uamMpJ4Tjha0dvOGnl.ocSHECD5WqPlUqipqXXamPc.3ZsVKvNgqF7NFu9zPqlSPUqdhpn0WsF4j 9dVxaaCrV31eFJkYhzTg53Bx6qzmbuk2YRcqOWKB_7bVgQ_ABvgDMNkqdfk66_leY79yYPtGDtFA x8IySa6z9j7nEs_OqSIV9PDDDTXL5nuS.LmL9OHYF7HUjALIcYAuK250OguyCntV9SPiyL1WXRxJ 8ltQjTjNeNlEjOrlEc7NZSrwv_Wuop8uwDeUfULtN9ljNQydZStDP9E.IE59.ihOrWJKRbj7GSoa L54ngJvFCLb8dEWXv3Bafx5BT5ArEySQhXE0MaJCJIZFo4.254SKAp3si4DJSYq8JuOzXxtyiaWu oKbaGXMRvZdB8oVia8JDhEfXMjaPqfRQD.5l0El.PQ5X4IUa95.lZuwUkT_xasN8zBTERI4wkOuD T_aReVUFWnR3deaNHP8PaNWlt4iKBMWhWJGUhN3FpzR5mPEhoKuaikYrHpJwtwIRAJGDdn4.vk8y L94AweSpXSgR8ITsnaEGFzPY.aQWckMpCYR8w4dn2fUx08uDYpZTnJ4KiyKRDpPEN7amjxtZbkeu myB2IgSKVjiEAeFhpFwxR6Nl3hMv4eewVKmzA.cyRysH45SSCpCN5YjS9O3bVXBdZTL9fjsJ0n0m kTyMBWzDVScdIZh7uSaQXI7v0K.UpsRdWUy9WDyN0R4mwQfgqDYsq2nzE.cljFcRLq8xHLxVE2dc pN93HGaVFRp1btWTy_y8q2F0x4j18tYRYC.LnJgRNSog5oKfsTO0r9M0Ku3fMBZZvJvCldkylEv2 KKzmzHa6_M1W4A.Qp2OI.IxKcwv5V9SNWmBFenkHHdvoCunav46Y98ELME3EvrLVT7KCOC6.mSw5 HgjliJLPOcX6_GT42vH9imDFZ57tLSixgE.tlaoPs8q5DD_3JWFUdl3qvvN2B_PhMqnMxnvZSvFz BLEYJEf54q4BcIf6mSQ.O8WPDEfELkGXVrSqG.dTWZdOLkx8lyTq_kPCNZBdJSNC6ybZTefvzr_9 o2VQTbjCcpBXvL16smZeSGJt7L0eIW.5EJFmY8koNr3L7f0iUVrNmA4fQWXEiXIZQ9wCt.nKQvyf _SkZ1QF8Q9x3oeOiKxOBFxe4C36B9YD3Yn5dqoWfFeOkpiFGRABiUE1ErIBj3mM9LWSHAsGLvr63 vq9upFwkhaY_3zWBwyHQbe0jNJ1G0CwSCa4ASBs_Djb05nZHxw_28SFIibfjGjF7YQkomoogg_DV retQ6tCgCDN6TpB7iElrN_XmOZNH_kgZdzdykA51XD7_v6rlWFNfh7UEQMtCDlsXVGnwcaPa54tn YtiShrhy_93DRbXFVEJVdl1qzavv9BUZkdvZNSph_j4mpau1b9rROWo9OWiUUP7a_tU1n6ZXr3F7 _F7VQYMlSwwoQVLo062p_Ae154BCHle9EqeuTTOGQ5FNlTWeE9neB50hx.DvIxJteBdc80cUT.p4 gr9lMi4S0vM0pu7DADidh_P3QlizXmNCBGE3.Qa0WaXPw3Y7XjkWr1V2lzkEYEBFVYRjJmo16Qso VPbUGfoSGFZ_ItkjT6lvfP5Sd3m0Axvy7bgaZaqkjArHJQs8fON64UsfExwuwN.vsbIoQEuAipAv 6toY6dUrLGGkdxbPvknrBri9B.Ev97k2nvWrzMucWX8vvZDrSh9SZqsqydk9H9vge0.nG2f.65bi d.19PFq5iMaAh5IuNK9sfFjftJUB3YG6pT1aFq819dQbqMfx_jJaS4hiRqu.8 X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic305.consmr.mail.ne1.yahoo.com with HTTP; Sat, 16 Jul 2022 03:04:47 +0000 Received: by hermes--canary-production-sg3-67975bbd4b-w2clr (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 0489fe2465483ea8efb262be3d86e94b; Sat, 16 Jul 2022 03:04:41 +0000 (UTC) From: Po Lu To: Manuel Giraud Subject: Re: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend References: <87wnch16as.fsf@elite.giraud> <87k08gtsz0.fsf@yahoo.com> <87cze8t4i9.fsf@elite.giraud> <87k08goud8.fsf@yahoo.com> <87h73jq1dp.fsf@elite.giraud> <874jzjp1st.fsf@yahoo.com> <87ilnysi72.fsf@elite.giraud> <87v8rymt15.fsf@yahoo.com> <87edymsdz8.fsf@elite.giraud> Date: Sat, 16 Jul 2022 11:04:34 +0800 In-Reply-To: <87edymsdz8.fsf@elite.giraud> (Manuel Giraud's message of "Fri, 15 Jul 2022 15:27:23 +0200") Message-ID: <877d4dn4fx.fsf@yahoo.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.91 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Mailer: WebService/1.1.20407 mail.backend.jedi.jws.acl:role.jedi.acl.token.atz.jws.hermes.yahoo Content-Length: 671 X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 56538 Cc: 56538@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Manuel Giraud writes: >> Shouldn't this say "the menu item highlighted by the mouse"? Otherwise, >> what "highlighted" means is not exactly clear. > > I did not add "by the mouse" because menus could also be navigated with > keyboard arrows. Do you have any other suggestions to make it clearer? How about "by the mouse or key navigation"? >>> +** New X resources: "highlightForeground" and "highlightBackground" >>> +Only in the Lucid build, this controls colors used for highlighted >>> +menu item widget. >> >> And here, shouldn't "widget" be in plural? > > Ok. I'll add it to the next patch when the previous issue is resolved. Thanks. From debbugs-submit-bounces@debbugs.gnu.org Sat Jul 16 06:56:37 2022 Received: (at 56538) by debbugs.gnu.org; 16 Jul 2022 10:56:37 +0000 Received: from localhost ([127.0.0.1]:43051 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oCfTQ-000335-Et for submit@debbugs.gnu.org; Sat, 16 Jul 2022 06:56:37 -0400 Received: from ledu-giraud.fr ([51.159.28.247]:44344) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oCfTM-00032t-Sp for 56538@debbugs.gnu.org; Sat, 16 Jul 2022 06:56:34 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; s=rsa; bh=9L1Aa1nZlD0pemU2 YyDGuyTeLFec904scaMR7aXb1Cw=; h=date:references:in-reply-to:subject: cc:to:from; d=ledu-giraud.fr; b=ubyYujchYGkZ8dauqF6FgglxHR/bgNZjQCQ9Wk Wsbkvvzb4gi8BLyVD7kIWfdbabSOS4Gw0V8zZun1XfS0vAEFV36EZ/MRaFBoz+AXDIzZ0W TnoRabB9Z5BfKlO5pV0tEQkaRNVgMzm0n5bYjukChl0QnW1CnIXm1CGkq23XrHk1Xg0pl9 psaq+tNvBUy3Zfo7tqJpxHEjujiK64JICclW579L1dwVjzlvS0j4K2uYXzr0FZGObFGLTR OtmcAY3hGnyK7DY5kEpE0edD7dXJPq0KM4bc6OGc91FA2aulyojJdPE1upgS3x8jeZPHgL b8EEi+CnsKV3ni7s8NBA6HEQ== Received: from elite.giraud ( [10.1.1.1]) by ledu-giraud.fr (OpenSMTPD) with ESMTPSA id 05c5fe1f (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Sat, 16 Jul 2022 12:56:30 +0200 (CEST) From: Manuel Giraud To: Po Lu Subject: Re: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend In-Reply-To: <877d4dn4fx.fsf@yahoo.com> (Po Lu's message of "Sat, 16 Jul 2022 11:04:34 +0800") References: <87wnch16as.fsf@elite.giraud> <87k08gtsz0.fsf@yahoo.com> <87cze8t4i9.fsf@elite.giraud> <87k08goud8.fsf@yahoo.com> <87h73jq1dp.fsf@elite.giraud> <874jzjp1st.fsf@yahoo.com> <87ilnysi72.fsf@elite.giraud> <87v8rymt15.fsf@yahoo.com> <87edymsdz8.fsf@elite.giraud> <877d4dn4fx.fsf@yahoo.com> Date: Sat, 16 Jul 2022 12:56:29 +0200 Message-ID: <87bktp8gwy.fsf@elite.giraud> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (berkeley-unix) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 56538 Cc: 56538@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Po Lu writes: > How about "by the mouse or key navigation"? =F0=9F=91=8D Here's the updated version. --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-Colored-menu-highlight-in-Lucid-backend.patch >From f0a2392c04b2d3f514716df9757f0b8ed96efa22 Mon Sep 17 00:00:00 2001 From: Manuel Giraud Date: Mon, 11 Jul 2022 11:14:08 +0200 Subject: [PATCH] Colored menu highlight in Lucid backend * lwlib/xlwmenuP.h: * lwlib/xlwmenu.h: * lwlib/xlwmenu.c: Introduce resources to handle colored highlighting of menu entries. * doc/emacs/xresources.texi (Lucid Resources): Documentation. --- doc/emacs/xresources.texi | 6 + etc/NEWS | 5 + lwlib/xlwmenu.c | 352 +++++++++++++++++++++++++++----------- lwlib/xlwmenu.h | 4 + lwlib/xlwmenuP.h | 18 +- 5 files changed, 278 insertions(+), 107 deletions(-) diff --git a/doc/emacs/xresources.texi b/doc/emacs/xresources.texi index 2c2700bc15..8915d2025b 100644 --- a/doc/emacs/xresources.texi +++ b/doc/emacs/xresources.texi @@ -449,6 +449,12 @@ Lucid Resources Foreground color. @item disabledForeground Foreground color for a disabled menu item. +@item highlightForeground +Foreground color for a menu item highlighted by the mouse or key +navigation. +@item highlightBackground +Background color for a menu item highlighted by the mouse or key +navigation. @ifnottex @item horizontalSpacing Horizontal spacing in pixels between items. Default is 3. diff --git a/etc/NEWS b/etc/NEWS index bf36316890..b85f3eef83 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -544,6 +544,11 @@ and pop-up menus. This controls the style of the pre-edit and status areas of X input methods. ++++ +** New X resources: "highlightForeground" and "highlightBackground" +Only in the Lucid build, this controls colors used for highlighted +menu item widgets. + +++ ** On X11, Emacs now tries to synchronize window resize with the window manager. This leads to less flicker and empty areas of a frame being displayed diff --git a/lwlib/xlwmenu.c b/lwlib/xlwmenu.c index 68f49e646d..2450e718c2 100644 --- a/lwlib/xlwmenu.c +++ b/lwlib/xlwmenu.c @@ -121,6 +121,10 @@ #define DEFAULT_FONTNAME "XtDefaultFont" offset(menu.disabled_foreground), XtRString, (XtPointer)NULL}, {XtNbuttonForeground, XtCButtonForeground, XtRPixel, sizeof(Pixel), offset(menu.button_foreground), XtRString, "XtDefaultForeground"}, + {XtNhighlightForeground, XtCHighlightForeground, XtRPixel, sizeof(Pixel), + offset(menu.highlight_foreground), XtRString, "XtDefaultForeground"}, + {XtNhighlightBackground, XtCHighlightBackground, XtRPixel, sizeof(Pixel), + offset(menu.highlight_background), XtRImmediate, (XtPointer)-1}, {XtNmargin, XtCMargin, XtRDimension, sizeof(Dimension), offset(menu.margin), XtRImmediate, (XtPointer)1}, {XtNhorizontalSpacing, XtCMargin, XtRDimension, sizeof(Dimension), @@ -570,8 +574,7 @@ draw_arrow (XlwMenuWidget mw, int down_p) { Display *dpy = XtDisplay (mw); - GC top_gc = mw->menu.shadow_top_gc; - GC bottom_gc = mw->menu.shadow_bottom_gc; + GC top_gc, bottom_gc; int thickness = mw->menu.shadow_thickness; int height = width; XPoint pt[10]; @@ -584,10 +587,13 @@ draw_arrow (XlwMenuWidget mw, if (down_p) { - GC temp; - temp = top_gc; - top_gc = bottom_gc; - bottom_gc = temp; + top_gc = mw->menu.highlight_shadow_bottom_gc; + bottom_gc = mw->menu.highlight_shadow_top_gc; + } + else + { + top_gc = mw->menu.shadow_top_gc; + bottom_gc = mw->menu.shadow_bottom_gc; } pt[0].x = x; @@ -621,24 +627,34 @@ draw_arrow (XlwMenuWidget mw, XFillPolygon (dpy, window, bottom_gc, pt, 4, Convex, CoordModeOrigin); } - - +/* Generic draw shadow rectangle function. It is used to draw shadows + on menus, menu items and also toggle buttons. When ERASE_P is + true, it clears shadows. DOWN_P is true when a menu item is pushed + or a button toggled. TOP_GC and BOTTOM_GC are the graphic contexts + used to draw the top and bottom shadow respectively. */ static void -draw_shadow_rectangle (XlwMenuWidget mw, - Window window, - int x, - int y, - int width, - int height, - int erase_p, - int down_p) +draw_shadow_rectangle (XlwMenuWidget mw, Window window, int x, int y, + int width, int height, int erase_p, int down_p, + GC top_gc, GC bottom_gc) { Display *dpy = XtDisplay (mw); - GC top_gc = !erase_p ? mw->menu.shadow_top_gc : mw->menu.background_gc; - GC bottom_gc = !erase_p ? mw->menu.shadow_bottom_gc : mw->menu.background_gc; int thickness = !x && !y ? mw->menu.border_thickness : mw->menu.shadow_thickness; XPoint points [4]; + /* Choose correct GC with a standard default if NULL. */ + if (erase_p) + { + top_gc = mw->menu.background_gc; + bottom_gc = mw->menu.background_gc; + } + else + { + if (top_gc == NULL) + top_gc = mw->menu.shadow_top_gc; + if (bottom_gc == NULL) + bottom_gc = mw->menu.shadow_bottom_gc; + } + if (!erase_p && width == height && width == toggle_button_width (mw)) { points [0].x = x; @@ -662,6 +678,7 @@ draw_shadow_rectangle (XlwMenuWidget mw, bottom_gc = temp; } + /* Do draw (or erase) shadows */ points [0].x = x; points [0].y = y; points [1].x = x + width; @@ -702,21 +719,28 @@ draw_shadow_rectangle (XlwMenuWidget mw, static void -draw_shadow_rhombus (XlwMenuWidget mw, - Window window, - int x, - int y, - int width, - int height, - int erase_p, - int down_p) +draw_shadow_rhombus (XlwMenuWidget mw, Window window, int x, int y, + int width, int height, int erase_p, int down_p, + GC top_gc, GC bottom_gc) { Display *dpy = XtDisplay (mw); - GC top_gc = !erase_p ? mw->menu.shadow_top_gc : mw->menu.background_gc; - GC bottom_gc = !erase_p ? mw->menu.shadow_bottom_gc : mw->menu.background_gc; int thickness = mw->menu.shadow_thickness; XPoint points [4]; + /* Choose correct GC with a standard default if NULL */ + if (erase_p) + { + top_gc = mw->menu.background_gc; + bottom_gc = mw->menu.background_gc; + } + else + { + if (top_gc == NULL) + top_gc = mw->menu.shadow_top_gc; + if (bottom_gc == NULL) + top_gc = mw->menu.shadow_bottom_gc; + } + if (!erase_p && width == height && width == radio_button_width (mw)) { points [0].x = x; @@ -784,15 +808,29 @@ draw_shadow_rhombus (XlwMenuWidget mw, toggle button is selected. */ static void -draw_toggle (XlwMenuWidget mw, Window window, int x, int y, int selected_p) +draw_toggle (XlwMenuWidget mw, Window window, int x, int y, int selected_p, + int highlighted_p) { int width, height; + GC top_gc, bottom_gc; + + if (highlighted_p) + { + top_gc = mw->menu.highlight_shadow_top_gc; + bottom_gc = mw->menu.highlight_shadow_bottom_gc; + } + else + { + top_gc = mw->menu.shadow_top_gc; + bottom_gc = mw->menu.shadow_bottom_gc; + } width = toggle_button_width (mw); height = width; x += mw->menu.horizontal_spacing; y += (MENU_FONT_ASCENT (mw) - height) / 2; - draw_shadow_rectangle (mw, window, x, y, width, height, False, selected_p); + draw_shadow_rectangle (mw, window, x, y, width, height, False, + selected_p, top_gc, bottom_gc); } @@ -801,15 +839,29 @@ draw_toggle (XlwMenuWidget mw, Window window, int x, int y, int selected_p) toggle button is selected. */ static void -draw_radio (XlwMenuWidget mw, Window window, int x, int y, int selected_p) +draw_radio (XlwMenuWidget mw, Window window, int x, int y, int selected_p, + int highlighted_p) { int width, height; + GC top_gc, bottom_gc; + + if (highlighted_p) + { + top_gc = mw->menu.highlight_shadow_top_gc; + bottom_gc = mw->menu.highlight_shadow_bottom_gc; + } + else + { + top_gc = mw->menu.shadow_top_gc; + bottom_gc = mw->menu.shadow_bottom_gc; + } width = radio_button_width (mw); height = width; x += mw->menu.horizontal_spacing; y += (MENU_FONT_ASCENT (mw) - height) / 2; - draw_shadow_rhombus (mw, window, x, y, width, height, False, selected_p); + draw_shadow_rhombus (mw, window, x, y, width, height, False, selected_p, + top_gc, bottom_gc); } @@ -968,6 +1020,31 @@ separator_height (enum menu_separator separator) } } +/* Draw the highlighted background and shadows. */ + +static void +draw_highlight (XlwMenuWidget mw, Window window, int x, int y, int width, + int height) +{ + Display *dpy = XtDisplay (mw); + XPoint points [4]; + + points [0].x = x; + points [0].y = y; + points [1].x = x + width; + points [1].y = y; + points [2].x = x + width; + points [2].y = y + height; + points [3].x = x; + points [3].y = y + height; + XFillPolygon (dpy, window, + mw->menu.highlight_background_gc, + points, 4, Convex, CoordModeOrigin); + + draw_shadow_rectangle(mw, window, x, y, width, height, False, False, + mw->menu.highlight_shadow_top_gc, + mw->menu.highlight_shadow_bottom_gc); +} /* Display the menu item and increment where.x and where.y to show how large the menu item was. */ @@ -983,7 +1060,6 @@ display_menu_item (XlwMenuWidget mw, { GC deco_gc; GC text_gc; - int font_height = MENU_FONT_HEIGHT (mw); int font_ascent = MENU_FONT_ASCENT (mw); int shadow = mw->menu.shadow_thickness; int margin = mw->menu.margin; @@ -1032,12 +1108,21 @@ display_menu_item (XlwMenuWidget mw, /* pick the foreground and background GC. */ if (val->enabled) - text_gc = mw->menu.foreground_gc; + if (highlighted_p) + text_gc = mw->menu.highlight_foreground_gc; + else + text_gc = mw->menu.foreground_gc; else text_gc = mw->menu.disabled_gc; deco_gc = mw->menu.foreground_gc; #if defined USE_CAIRO || defined HAVE_XFT - xftfg = val->enabled ? &mw->menu.xft_fg : &mw->menu.xft_disabled_fg; + if (val->enabled) + if (highlighted_p) + xftfg = &mw->menu.xft_highlight_fg; + else + xftfg = &mw->menu.xft_fg; + else + xftfg = &mw->menu.xft_disabled_fg; #endif if (separator_p) @@ -1048,8 +1133,11 @@ display_menu_item (XlwMenuWidget mw, { int x_offset = x + h_spacing + shadow; char* display_string = resource_widget_value (mw, val); - draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, True, - False); + /* Clears shadows and maybe highlight */ + draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, + True, False, NULL, NULL); + if (highlighted_p) + draw_highlight (mw, ws->pixmap, x, y, width, height); /* Deal with centering a menu title. */ if (!horizontal_p && !val->contents && !val->call_data) @@ -1095,10 +1183,10 @@ display_menu_item (XlwMenuWidget mw, { if (val->button_type == BUTTON_TYPE_TOGGLE) draw_toggle (mw, ws->pixmap, x, y + v_spacing + shadow, - val->selected); + val->selected, highlighted_p); else if (val->button_type == BUTTON_TYPE_RADIO) draw_radio (mw, ws->pixmap, x, y + v_spacing + shadow, - val->selected); + val->selected, highlighted_p); if (val->contents) { @@ -1145,25 +1233,18 @@ display_menu_item (XlwMenuWidget mw, } else { - XDrawRectangle (XtDisplay (mw), ws->pixmap, - mw->menu.background_gc, - x + shadow, y + shadow, - label_width + h_spacing - 1, - font_height + 2 * v_spacing - 1); - draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, - True, False); + /* If not highlighted, clears shadows for horizontal + menu item */ + if (!highlighted_p) + draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, + True, False, NULL, NULL); } #ifdef USE_CAIRO if (ws->xft_draw) cairo_surface_flush (cairo_get_target (ws->xft_draw)); #endif - - if (highlighted_p) - draw_shadow_rectangle (mw, ws->pixmap, x, y, width, height, False, - False); } } - where->x += width; where->y += height; } @@ -1257,7 +1338,7 @@ display_menu (XlwMenuWidget mw, if (!just_compute_p) { draw_shadow_rectangle (mw, ws->pixmap, 0, 0, ws->width, ws->height, - False, False); + False, False, NULL, NULL); XCopyArea (XtDisplay (mw), ws->pixmap, ws->window, mw->menu.foreground_gc, 0, 0, ws->width, ws->height, 0, 0); } @@ -1714,6 +1795,18 @@ #define BRIGHTNESS(color) (((color) & 0xff) + (((color) >> 8) & 0xff) + (((color xgcv.foreground = mw->core.background_pixel; xgcv.background = mw->menu.foreground; mw->menu.background_gc = XtGetGC ((Widget)mw, mask, &xgcv); + + xgcv.foreground = mw->menu.highlight_foreground; + xgcv.background = ((mw->menu.highlight_background == -1) + ? mw->core.background_pixel + : mw->menu.highlight_background); + mw->menu.highlight_foreground_gc = XtGetGC ((Widget)mw, mask, &xgcv); + + xgcv.foreground = ((mw->menu.highlight_background == -1) + ? mw->core.background_pixel + : mw->menu.highlight_background); + xgcv.background = mw->menu.foreground; + mw->menu.highlight_background_gc = XtGetGC ((Widget)mw, mask, &xgcv); } static void @@ -1724,12 +1817,16 @@ release_drawing_gcs (XlwMenuWidget mw) XtReleaseGC ((Widget) mw, mw->menu.disabled_gc); XtReleaseGC ((Widget) mw, mw->menu.inactive_button_gc); XtReleaseGC ((Widget) mw, mw->menu.background_gc); + XtReleaseGC ((Widget) mw, mw->menu.highlight_foreground_gc); + XtReleaseGC ((Widget) mw, mw->menu.highlight_background_gc); /* let's get some segvs if we try to use these... */ mw->menu.foreground_gc = (GC) -1; mw->menu.button_gc = (GC) -1; mw->menu.disabled_gc = (GC) -1; mw->menu.inactive_button_gc = (GC) -1; mw->menu.background_gc = (GC) -1; + mw->menu.highlight_foreground_gc = (GC) -1; + mw->menu.highlight_background_gc = (GC) -1; } #ifndef emacs @@ -1738,29 +1835,29 @@ #define MINL(x,y) ((((unsigned long) (x)) < ((unsigned long) (y))) \ #endif static void -make_shadow_gcs (XlwMenuWidget mw) +compute_shadow_colors (XlwMenuWidget mw, Pixel *top_color, Pixel *bottom_color, + Boolean *free_top_p, Boolean *free_bottom_p, + Pixmap *top_pixmap, Pixmap *bottom_pixmap, + Pixel fore_color, Pixel back_color) { - XGCValues xgcv; - unsigned long pm = 0; Display *dpy = XtDisplay ((Widget) mw); Screen *screen = XtScreen ((Widget) mw); Colormap cmap = mw->core.colormap; XColor topc, botc; int top_frobbed = 0, bottom_frobbed = 0; - mw->menu.free_top_shadow_color_p = 0; - mw->menu.free_bottom_shadow_color_p = 0; + *free_top_p = False; + *free_bottom_p = False; - if (mw->menu.top_shadow_color == -1) - mw->menu.top_shadow_color = mw->core.background_pixel; + if (*top_color == -1) + *top_color = back_color; - if (mw->menu.bottom_shadow_color == -1) - mw->menu.bottom_shadow_color = mw->menu.foreground; + if (*bottom_color == -1) + *bottom_color = fore_color; - if (mw->menu.top_shadow_color == mw->core.background_pixel || - mw->menu.top_shadow_color == mw->menu.foreground) + if (*top_color == back_color || *top_color == fore_color) { - topc.pixel = mw->core.background_pixel; + topc.pixel = back_color; #ifdef emacs if (x_alloc_lighter_color_for_widget ((Widget) mw, dpy, cmap, &topc.pixel, @@ -1774,15 +1871,14 @@ make_shadow_gcs (XlwMenuWidget mw) if (XAllocColor (dpy, cmap, &topc)) #endif { - mw->menu.top_shadow_color = topc.pixel; - mw->menu.free_top_shadow_color_p = 1; + *top_color = topc.pixel; + *free_top_p = True; top_frobbed = 1; } } - if (mw->menu.bottom_shadow_color == mw->menu.foreground || - mw->menu.bottom_shadow_color == mw->core.background_pixel) + if (*bottom_color == fore_color || *bottom_color == back_color) { - botc.pixel = mw->core.background_pixel; + botc.pixel = back_color; #ifdef emacs if (x_alloc_lighter_color_for_widget ((Widget) mw, dpy, cmap, &botc.pixel, @@ -1795,8 +1891,8 @@ make_shadow_gcs (XlwMenuWidget mw) if (XAllocColor (dpy, cmap, &botc)) #endif { - mw->menu.bottom_shadow_color = botc.pixel; - mw->menu.free_bottom_shadow_color_p = 1; + *bottom_color = botc.pixel; + *free_bottom_p = True; bottom_frobbed = 1; } } @@ -1805,63 +1901,94 @@ make_shadow_gcs (XlwMenuWidget mw) { if (topc.pixel == botc.pixel) { - if (botc.pixel == mw->menu.foreground) + if (botc.pixel == fore_color) { - if (mw->menu.free_top_shadow_color_p) + if (*free_top_p) { - x_free_dpy_colors (dpy, screen, cmap, - &mw->menu.top_shadow_color, 1); - mw->menu.free_top_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, top_color, 1); + *free_top_p = False; } - mw->menu.top_shadow_color = mw->core.background_pixel; + *top_color = back_color; } else { - if (mw->menu.free_bottom_shadow_color_p) + if (*free_bottom_p) { - x_free_dpy_colors (dpy, screen, cmap, - &mw->menu.bottom_shadow_color, 1); - mw->menu.free_bottom_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, bottom_color, 1); + *free_bottom_p = False; } - mw->menu.bottom_shadow_color = mw->menu.foreground; + *bottom_color = fore_color; } } } - if (!mw->menu.top_shadow_pixmap - && mw->menu.top_shadow_color == mw->core.background_pixel) + if (!*top_pixmap && *top_color == back_color) { - mw->menu.top_shadow_pixmap = mw->menu.gray_pixmap; - if (mw->menu.free_top_shadow_color_p) + *top_pixmap = mw->menu.gray_pixmap; + if (*free_top_p) { - x_free_dpy_colors (dpy, screen, cmap, &mw->menu.top_shadow_color, 1); - mw->menu.free_top_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, top_color, 1); + *free_top_p = False; } - mw->menu.top_shadow_color = mw->menu.foreground; + *top_color = fore_color; } - if (!mw->menu.bottom_shadow_pixmap - && mw->menu.bottom_shadow_color == mw->core.background_pixel) + if (!*bottom_pixmap && *bottom_color == back_color) { - mw->menu.bottom_shadow_pixmap = mw->menu.gray_pixmap; - if (mw->menu.free_bottom_shadow_color_p) + *bottom_pixmap = mw->menu.gray_pixmap; + if (*free_bottom_p) { - x_free_dpy_colors (dpy, screen, cmap, - &mw->menu.bottom_shadow_color, 1); - mw->menu.free_bottom_shadow_color_p = 0; + x_free_dpy_colors (dpy, screen, cmap, bottom_color, 1); + *free_bottom_p = False; } - mw->menu.bottom_shadow_color = mw->menu.foreground; + *bottom_color = fore_color; } +} + +static void +make_shadow_gcs (XlwMenuWidget mw) +{ + XGCValues xgcv; + unsigned long pm = 0; + + /* Normal shadows */ + compute_shadow_colors (mw, &(mw->menu.top_shadow_color), + &(mw->menu.bottom_shadow_color), + &(mw->menu.free_top_shadow_color_p), + &(mw->menu.free_bottom_shadow_color_p), + &(mw->menu.top_shadow_pixmap), + &(mw->menu.bottom_shadow_pixmap), + mw->menu.foreground, mw->core.background_pixel); + + /* Highlight shadows */ + compute_shadow_colors (mw, &(mw->menu.top_highlight_shadow_color), + &(mw->menu.bottom_highlight_shadow_color), + &(mw->menu.free_top_highlight_shadow_color_p), + &(mw->menu.free_bottom_highlight_shadow_color_p), + &(mw->menu.top_highlight_shadow_pixmap), + &(mw->menu.bottom_highlight_shadow_pixmap), + mw->menu.highlight_foreground, + mw->menu.highlight_background); xgcv.fill_style = FillStippled; xgcv.foreground = mw->menu.top_shadow_color; xgcv.stipple = mw->menu.top_shadow_pixmap; - pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0); - mw->menu.shadow_top_gc = XtGetGC ((Widget)mw, GCForeground | pm, &xgcv); + pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0); + mw->menu.shadow_top_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv); xgcv.foreground = mw->menu.bottom_shadow_color; xgcv.stipple = mw->menu.bottom_shadow_pixmap; - pm = (xgcv.stipple ? GCStipple|GCFillStyle : 0); - mw->menu.shadow_bottom_gc = XtGetGC ((Widget)mw, GCForeground | pm, &xgcv); + pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0); + mw->menu.shadow_bottom_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv); + + xgcv.foreground = mw->menu.top_highlight_shadow_color; + xgcv.stipple = mw->menu.top_highlight_shadow_pixmap; + pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0); + mw->menu.highlight_shadow_top_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv); + + xgcv.foreground = mw->menu.bottom_highlight_shadow_color; + xgcv.stipple = mw->menu.bottom_highlight_shadow_pixmap; + pm = (xgcv.stipple ? GCStipple | GCFillStyle : 0); + mw->menu.highlight_shadow_bottom_gc = XtGetGC ((Widget) mw, GCForeground | pm, &xgcv); } @@ -1871,18 +1998,24 @@ release_shadow_gcs (XlwMenuWidget mw) Display *dpy = XtDisplay ((Widget) mw); Screen *screen = XtScreen ((Widget) mw); Colormap cmap = mw->core.colormap; - Pixel px[2]; + Pixel px[4]; int i = 0; if (mw->menu.free_top_shadow_color_p) px[i++] = mw->menu.top_shadow_color; if (mw->menu.free_bottom_shadow_color_p) px[i++] = mw->menu.bottom_shadow_color; + if (mw->menu.free_top_highlight_shadow_color_p) + px[i++] = mw->menu.top_highlight_shadow_color; + if (mw->menu.free_bottom_highlight_shadow_color_p) + px[i++] = mw->menu.bottom_highlight_shadow_color; if (i > 0) x_free_dpy_colors (dpy, screen, cmap, px, i); XtReleaseGC ((Widget) mw, mw->menu.shadow_top_gc); XtReleaseGC ((Widget) mw, mw->menu.shadow_bottom_gc); + XtReleaseGC ((Widget) mw, mw->menu.highlight_shadow_top_gc); + XtReleaseGC ((Widget) mw, mw->menu.highlight_shadow_bottom_gc); } #if defined USE_CAIRO || defined HAVE_XFT @@ -1964,6 +2097,11 @@ XlwMenuInitialize (Widget request, Widget w, ArgList args, Cardinal *num_args) mw->menu.font_extents = XExtentsOfFontSet (mw->menu.fontSet); #endif + mw->menu.top_highlight_shadow_color = -1; + mw->menu.bottom_highlight_shadow_color = -1; + mw->menu.top_highlight_shadow_pixmap = None; + mw->menu.bottom_highlight_shadow_pixmap = None; + make_drawing_gcs (mw); make_shadow_gcs (mw); @@ -2038,12 +2176,14 @@ XlwMenuRealize (Widget w, Mask *valueMask, XSetWindowAttributes *attributes) #if defined USE_CAIRO || defined HAVE_XFT if (mw->menu.xft_font) { - XColor colors[3]; + XColor colors[4]; colors[0].pixel = mw->menu.xft_fg.pixel = mw->menu.foreground; colors[1].pixel = mw->menu.xft_bg.pixel = mw->core.background_pixel; colors[2].pixel = mw->menu.xft_disabled_fg.pixel = mw->menu.disabled_foreground; - XQueryColors (XtDisplay (mw), mw->core.colormap, colors, 3); + colors[3].pixel = mw->menu.xft_highlight_fg.pixel + = mw->menu.highlight_foreground; + XQueryColors (XtDisplay (mw), mw->core.colormap, colors, 4); mw->menu.xft_fg.color.alpha = 0xFFFF; mw->menu.xft_fg.color.red = colors[0].red; mw->menu.xft_fg.color.green = colors[0].green; @@ -2056,6 +2196,10 @@ XlwMenuRealize (Widget w, Mask *valueMask, XSetWindowAttributes *attributes) mw->menu.xft_disabled_fg.color.red = colors[2].red; mw->menu.xft_disabled_fg.color.green = colors[2].green; mw->menu.xft_disabled_fg.color.blue = colors[2].blue; + mw->menu.xft_highlight_fg.color.alpha = 0xFFFF; + mw->menu.xft_highlight_fg.color.red = colors[3].red; + mw->menu.xft_highlight_fg.color.green = colors[3].green; + mw->menu.xft_highlight_fg.color.blue = colors[3].blue; } #endif } diff --git a/lwlib/xlwmenu.h b/lwlib/xlwmenu.h index 7f4bf35939..4e36bde3fb 100644 --- a/lwlib/xlwmenu.h +++ b/lwlib/xlwmenu.h @@ -58,6 +58,10 @@ #define XtNallowResize "allowResize" #define XtCAllowResize "AllowResize" #define XtNborderThickness "borderThickness" #define XtCBorderThickness "BorderThickness" +#define XtNhighlightForeground "highlightForeground" +#define XtCHighlightForeground "HighlightForeground" +#define XtNhighlightBackground "highlightBackground" +#define XtCHighlightBackground "HighlightBackground" /* Motif-compatible resource names */ #define XmNshadowThickness "shadowThickness" diff --git a/lwlib/xlwmenuP.h b/lwlib/xlwmenuP.h index 455ecdbce0..c314eb3e91 100644 --- a/lwlib/xlwmenuP.h +++ b/lwlib/xlwmenuP.h @@ -63,13 +63,15 @@ #define _XlwMenuP_h #if defined USE_CAIRO || defined HAVE_XFT int default_face; XftFont* xft_font; - XftColor xft_fg, xft_bg, xft_disabled_fg; + XftColor xft_fg, xft_bg, xft_disabled_fg, xft_highlight_fg; #endif String fontName; XFontStruct* font; Pixel foreground; Pixel disabled_foreground; Pixel button_foreground; + Pixel highlight_foreground; + Pixel highlight_background; Dimension margin; Dimension horizontal_spacing; Dimension vertical_spacing; @@ -80,6 +82,10 @@ #define _XlwMenuP_h Pixel bottom_shadow_color; Pixmap top_shadow_pixmap; Pixmap bottom_shadow_pixmap; + Pixel top_highlight_shadow_color; + Pixel bottom_highlight_shadow_color; + Pixmap top_highlight_shadow_pixmap; + Pixmap bottom_highlight_shadow_pixmap; Cursor cursor_shape; XtCallbackList open; XtCallbackList select, highlight; @@ -88,8 +94,10 @@ #define _XlwMenuP_h int horizontal; /* True means top_shadow_color and/or bottom_shadow_color must be freed. */ - bool_bf free_top_shadow_color_p : 1; - bool_bf free_bottom_shadow_color_p : 1; + Boolean free_top_shadow_color_p; + Boolean free_bottom_shadow_color_p; + Boolean free_top_highlight_shadow_color_p; + Boolean free_bottom_highlight_shadow_color_p; /* State of the XlwMenu */ int top_depth; @@ -112,9 +120,13 @@ #define _XlwMenuP_h GC button_gc; GC background_gc; GC disabled_gc; + GC highlight_foreground_gc; + GC highlight_background_gc; GC inactive_button_gc; GC shadow_top_gc; GC shadow_bottom_gc; + GC highlight_shadow_top_gc; + GC highlight_shadow_bottom_gc; Cursor cursor; Boolean popped_up; Pixmap gray_pixmap; -- 2.37.0 --=-=-= Content-Type: text/plain -- Manuel Giraud --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Sat Jul 16 06:59:57 2022 Received: (at 56538-done) by debbugs.gnu.org; 16 Jul 2022 10:59:57 +0000 Received: from localhost ([127.0.0.1]:43061 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oCfWf-00037w-CF for submit@debbugs.gnu.org; Sat, 16 Jul 2022 06:59:57 -0400 Received: from sonic309-20.consmr.mail.ne1.yahoo.com ([66.163.184.146]:45259) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oCfWc-00037h-Cl for 56538-done@debbugs.gnu.org; Sat, 16 Jul 2022 06:59:55 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1657969186; bh=qSCjU38tZdNwp3XVzizMm4m7Tql0XGxAWzbV6e/jyS8=; h=From:To:Cc:Subject:References:Date:In-Reply-To:From:Subject:Reply-To; b=KexGRF8z9w8L4rHpuFbkA00N+0HrezxYH4X06cFSYh7a9JboJFyeIGSJNyO6gzDFZb07ajwLQavn7v4Do/ymGqpvNHl6F+O0HLUI0OtLkXAOTbZe6rOL/c970GyOJ0/PVqypp8aCgg0rDkmRJCbsVlWAkwqNxXqem1VTbxcJ02thaJpGs+Ti7ltEtgTWeB1dipio7ThN5O6F4qkEV8bY3nzcP1hYO4QQTqda0M6PaKPDEKVu4NL1eYCsBhnFQD2o7fUWJOv0XdSAucdd/iJvSPTuZBrLamyWKCJrgPblNFPXz2Z+sXXdr/BFR6W80KhUtjmxMlo2D5ftaZhYNrY18g== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1657969186; bh=LzXitsp/ELGGWBXwX4lsInN2FINdc+9KmleEAcQ/kzl=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=lzo/zJWFUdt50/n6aAULhAuLaS2d8zPoCWmnBU+Xayu8NdvUg1+LGgxs9bc0bCqKKgi6Q1FYdGjSMvO7auA1+31Diq9koehZVoelcv+TjxdUZvWmYzClBThRHJXP3gHKqC0vW2m/2sc8Vzo69850ViRPd56jkL5GOrSX+yZJOhHdVQ/L2HIt3ZPENy/Fw6Cm0r/U5WUDSjd51WKzn3GdkBF81J5AAxBxyXQn67w++IiE3a/X/fNBHpnq6aWFQTVo0TL7Cg1dtGfjrS+bVGWSk+62TTluHl6dPGzDAybcHl+tT7OlhHnlzgHiHmQVK3bRbhHeTi8IlaOaa63AwCq/YQ== X-YMail-OSG: aTL_MFwVM1mrCPBj41s8hmRoA_vm2JB5mLnss6xslDRAV.HKm1aIFy5uhxHnWUK oplJOvfGuOEjIo_jiN5284gdiH7FM0EN3ZuwcCLCg8E6hH_UvcMvdrF1qMmQ7VYX3d9tghhTfSCh 36DX80I_libLqPve1A0FmqhDVUcxWS4WvGf18ryu86Wg7_bs1uPiQQ4g2MagTx3AFktGokdcAvTt E9zlSSVp_LQs5_5HXvq1gGNBCWumzDETWfmGZ4UpoL1Btfm431kmLKR1VJf1CXUoVQfhUw9S5EYC 7yiXrrXUqc_AFIKE2Yhmgx048V6MYagMjkNnJJ3rFJ7YyByqxbP_E9omJFEYWtv_e.LZzQlu_C0W sbM2B3a77pDiMCgWOMTwadInf4FUkz0BI1jRP1x5xByTVzXxC1UzC5iC58yezoEYqoJkYs2_aMSC K9A5oqXBUZur6ldD2ftH20iCNI3IU7hLUip6g7x0u7RlpfoxjWAoF7SBr8MgneuxF9auy7VPVXmT _VRoBsYjWqHxPJta1_Nsnyw9cYfH8M4Y.8POxgWdXYfaPr5KX33TYyR5GJQQz6aiJd1u6tC9CgfF BfgccWZWRi2mknlcR20r1QcnGukoSvek0GCA3Qe8BfFdgXsRKxfKR4_UtBPY4po8yXmZedjReeuJ ie5CC3ZPI9jW5i8AT.VuzFjUV8NI.3jFNG_4rPpUirJzai_3pcdHvEISq4VOxfJs3o8_Q8iaDxNl ZUrXwiS3BMthGk6yNsQMdCaZbnuyswQ1Yhm7BwrmLkRaJ_ZUMTfQc5Q83J9Nqx7Hd5DW3CBDvVyb EoWad.8wTaTbDalFn1l8OUwE2PxUhM2HseJut6wUD52bCxhxIF7ClWoI7PbgDU1bBPkVlXdEtYus Wbn2S0mlJfvO8ATEaO29I3LR1pb0VxCKtOUSVCLaaHH4MtSU4mFZ8QIWT5.MWNDqQGxGR4h.i8OR EmpjGCF1He55dNB3d8nW4QaiU0EM5JDEDaRjoeRF8dgajLjqcnQeYC6LDTYkMMK4rHKVGZphH7Ys AgfK7ScscwD2xmhpIVcWEHizf7O.C.S8RJXCFQdBnW3rirenTgfOwvCt6_4_8K9D0RmYT9oK35zs JpYYLzPAXTHm4e46NY1GgZoUZQz_F2tbqbXfOWq4wknvd3iddebxZwD3haUIuH_56D6V8CrBMV6_ qKGcKb45.PArE8Q4eV4ohBxRlpv.PrCWYOb617z1a1o_pBXt4RBCcDrvXgDumbmG8kE9P.S.ngc7 xdKwQjYXEKcRLNz7rkrfW0iJEhZMUPvwy72kuQpJ5xen_ksc1WjwAr_1g45AIwowT1H0fsF99B6B XrHBZQRdW9l2zQP.4PBHWeS5xrAeOiz2n9sTgT6IL.MEKIBP0cqvimqtBJxLce35DygZj02_8eLc j1g75YYGV2mVz2g8BBL7MuBER6Hhp4pc7doc92IptsjdasnKQzZ2gDf5QyTupeOYYiVEY4o1Iwdo wksyCuL9mk23kOu5RlfJuVOLnrWdptTzpJUgPRAoFr32j.lD695LFumrLYN0Yrxnx2n1bV_gPn3C NjEPnXOjytxp3tkI9RhJ6oI4JeCxPz0eUPbNi5mgHgMSdBAmkPTjGjnVlfpgFfhXFHm32CeLrMcd pLfJTbEBeslvVvfSbxW69Oorq0LOMmG2OtMkM85mF1JuNo87ORUXAZxAxTgiwTLDKJBMwPbI4Kkm NWnCdVSXBDgTBPi89Qx.R1uaGqGblbwnhjokPLU.szeVXoylS37H1BHcUEqMjoWX8x4jzyadobqo XpffQ6nMIskkNvOYOELQb7qww4m34Op5FtNCkTrHW6mqf.HxikcPZU7bZX_6q13_e7ZQ_Jn.LoeC VdC2W5EpZuDyM58D7HkCj8lT515yPqqr9Dv9Kfop3I9mF_MAOj_ZNYlFzVU44Q50J90aDdj8OFhI OPPQOylx6ubyEiRrzUkDhrhwrVOncrJk8y2bQJ_vtd6xePJytDkEezUN8yoRsqgpcg.4IqKIJSeW eDtgJjFl2Dwegkbv97kWW13B7zeAat6hXHH7DGmMQtAy6xoQq2x2zdH9K9Fg0HMWb_FJbplc_VL8 aqOpLt5LfgaDr.hIhz.ZTFWXA3nIikMQ543rHCa7rUnQBQ.iQj22IhapuDJrJoGoW1R8x38UzGXC RqKLQNrXXa6GCDIkPJEmoDuUrtppg0.CUO_UsgPKomQicBXdY40SfmRr5IdL37UxIRL412A.67b1 U285pmqqIhDmWH97lULil5pl1yHojeHHngpauu_j3uKkryjzy2i2AR3JdP1.xDw.t X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic309.consmr.mail.ne1.yahoo.com with HTTP; Sat, 16 Jul 2022 10:59:46 +0000 Received: by hermes--canary-production-sg3-67975bbd4b-mtf9g (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 2481a3aa77fee67e0a3173a634993721; Sat, 16 Jul 2022 10:59:41 +0000 (UTC) From: Po Lu To: Manuel Giraud Subject: Re: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend References: <87wnch16as.fsf@elite.giraud> <87k08gtsz0.fsf@yahoo.com> <87cze8t4i9.fsf@elite.giraud> <87k08goud8.fsf@yahoo.com> <87h73jq1dp.fsf@elite.giraud> <874jzjp1st.fsf@yahoo.com> <87ilnysi72.fsf@elite.giraud> <87v8rymt15.fsf@yahoo.com> <87edymsdz8.fsf@elite.giraud> <877d4dn4fx.fsf@yahoo.com> <87bktp8gwy.fsf@elite.giraud> Date: Sat, 16 Jul 2022 18:59:35 +0800 In-Reply-To: <87bktp8gwy.fsf@elite.giraud> (Manuel Giraud's message of "Sat, 16 Jul 2022 12:56:29 +0200") Message-ID: <87zgh9iaqw.fsf@yahoo.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.91 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Mailer: WebService/1.1.20407 mail.backend.jedi.jws.acl:role.jedi.acl.token.atz.jws.hermes.yahoo Content-Length: 465 X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 56538-done Cc: 56538-done@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Manuel Giraud writes: > Po Lu writes: > >> How about "by the mouse or key navigation"? > > =F0=9F=91=8D Here's the updated version. > > From f0a2392c04b2d3f514716df9757f0b8ed96efa22 Mon Sep 17 00:00:00 2001 > From: Manuel Giraud > Date: Mon, 11 Jul 2022 11:14:08 +0200 > Subject: [PATCH] Colored menu highlight in Lucid backend Installed, so I'm closing this bug. Thanks for working on Emacs. From unknown Sat Aug 16 15:58:41 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Sat, 13 Aug 2022 11:24:05 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator