From unknown Sat Aug 16 18:44:53 2025 X-Loop: help-debbugs@gnu.org Subject: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend Resent-From: Manuel Giraud Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 13 Jul 2022 13:39:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 56538 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: 56538@debbugs.gnu.org X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Received: via spool by submit@debbugs.gnu.org id=B.165771952729890 (code B ref -1); Wed, 13 Jul 2022 13:39:02 +0000 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 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-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 unknown Sat Aug 16 18:44:53 2025 X-Loop: help-debbugs@gnu.org Subject: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend Resent-From: Po Lu Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 14 Jul 2022 00:55:03 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 56538 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Manuel Giraud Cc: 56538@debbugs.gnu.org Received: via spool by 56538-submit@debbugs.gnu.org id=B56538.165776004824786 (code B ref 56538); Thu, 14 Jul 2022 00:55:03 +0000 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 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-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 unknown Sat Aug 16 18:44:53 2025 X-Loop: help-debbugs@gnu.org Subject: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend Resent-From: Manuel Giraud Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 14 Jul 2022 09:43:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 56538 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Po Lu Cc: 56538@debbugs.gnu.org Received: via spool by 56538-submit@debbugs.gnu.org id=B56538.16577917399930 (code B ref 56538); Thu, 14 Jul 2022 09:43:01 +0000 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 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-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 unknown Sat Aug 16 18:44:53 2025 X-Loop: help-debbugs@gnu.org Subject: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend Resent-From: Po Lu Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 14 Jul 2022 10:36:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 56538 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Manuel Giraud Cc: 56538@debbugs.gnu.org Received: via spool by 56538-submit@debbugs.gnu.org id=B56538.165779490616157 (code B ref 56538); Thu, 14 Jul 2022 10:36:02 +0000 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 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-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 unknown Sat Aug 16 18:44:53 2025 X-Loop: help-debbugs@gnu.org Subject: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend Resent-From: Manuel Giraud Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 14 Jul 2022 13:19:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 56538 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Po Lu Cc: 56538@debbugs.gnu.org Received: via spool by 56538-submit@debbugs.gnu.org id=B56538.16578046844940 (code B ref 56538); Thu, 14 Jul 2022 13:19:01 +0000 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 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-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 unknown Sat Aug 16 18:44:53 2025 X-Loop: help-debbugs@gnu.org Subject: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend Resent-From: Po Lu Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 15 Jul 2022 02:07:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 56538 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Manuel Giraud Cc: 56538@debbugs.gnu.org Received: via spool by 56538-submit@debbugs.gnu.org id=B56538.165785080620572 (code B ref 56538); Fri, 15 Jul 2022 02:07:02 +0000 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 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-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 unknown Sat Aug 16 18:44:53 2025 X-Loop: help-debbugs@gnu.org Subject: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend Resent-From: Manuel Giraud Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 15 Jul 2022 11:55:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 56538 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Po Lu Cc: 56538@debbugs.gnu.org Received: via spool by 56538-submit@debbugs.gnu.org id=B56538.165788606810118 (code B ref 56538); Fri, 15 Jul 2022 11:55:02 +0000 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 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-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 unknown Sat Aug 16 18:44:53 2025 X-Loop: help-debbugs@gnu.org Subject: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend Resent-From: Manuel Giraud Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 15 Jul 2022 11:57:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 56538 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Po Lu Cc: 56538@debbugs.gnu.org Received: via spool by 56538-submit@debbugs.gnu.org id=B56538.165788619910407 (code B ref 56538); Fri, 15 Jul 2022 11:57:01 +0000 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 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-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 unknown Sat Aug 16 18:44:53 2025 X-Loop: help-debbugs@gnu.org Subject: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend Resent-From: Po Lu Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 15 Jul 2022 13:00:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 56538 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Manuel Giraud Cc: 56538@debbugs.gnu.org Received: via spool by 56538-submit@debbugs.gnu.org id=B56538.1657889954836 (code B ref 56538); Fri, 15 Jul 2022 13:00:02 +0000 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 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-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 unknown Sat Aug 16 18:44:53 2025 X-Loop: help-debbugs@gnu.org Subject: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend Resent-From: Manuel Giraud Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 15 Jul 2022 13:28:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 56538 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Po Lu Cc: 56538@debbugs.gnu.org Received: via spool by 56538-submit@debbugs.gnu.org id=B56538.16578916623787 (code B ref 56538); Fri, 15 Jul 2022 13:28:01 +0000 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 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-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 unknown Sat Aug 16 18:44:53 2025 X-Loop: help-debbugs@gnu.org Subject: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend Resent-From: Po Lu Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 16 Jul 2022 03:05:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 56538 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Manuel Giraud Cc: 56538@debbugs.gnu.org Received: via spool by 56538-submit@debbugs.gnu.org id=B56538.165794069918499 (code B ref 56538); Sat, 16 Jul 2022 03:05:02 +0000 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 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-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 unknown Sat Aug 16 18:44:53 2025 X-Loop: help-debbugs@gnu.org Subject: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend Resent-From: Manuel Giraud Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 16 Jul 2022 10:57:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 56538 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Po Lu Cc: 56538@debbugs.gnu.org Received: via spool by 56538-submit@debbugs.gnu.org id=B56538.165796899711728 (code B ref 56538); Sat, 16 Jul 2022 10:57:02 +0000 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 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-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 unknown Sat Aug 16 18:44:53 2025 MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) X-Loop: help-debbugs@gnu.org From: help-debbugs@gnu.org (GNU bug Tracking System) To: Manuel Giraud Subject: bug#56538: closed (Re: bug#56538: 29.0.50; [PATCH] Colored highlight in Lucid backend) Message-ID: References: <87zgh9iaqw.fsf@yahoo.com> <87wnch16as.fsf@elite.giraud> X-Gnu-PR-Message: they-closed 56538 X-Gnu-PR-Package: emacs X-Gnu-PR-Keywords: patch Reply-To: 56538@debbugs.gnu.org Date: Sat, 16 Jul 2022 11:00:02 +0000 Content-Type: multipart/mixed; boundary="----------=_1657969202-12059-1" This is a multi-part message in MIME format... ------------=_1657969202-12059-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Your bug report #56538: 29.0.50; [PATCH] Colored highlight in Lucid backend which was filed against the emacs package, has been closed. The explanation is attached below, along with your original report. If you require more details, please reply to 56538@debbugs.gnu.org. --=20 56538: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D56538 GNU Bug Tracking System Contact help-debbugs@gnu.org with problems ------------=_1657969202-12059-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit 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. ------------=_1657969202-12059-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit 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 --=-=-=-- ------------=_1657969202-12059-1--