From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: =?utf-8?Q?H=C3=A5kon?= Flatval Newsgroups: gmane.emacs.devel Subject: Re: Sv: Sv: Support for background transparency Date: Sun, 23 Jan 2022 22:43:04 +0100 Message-ID: References: <87wnlnptf2.fsf@gnus.org> <83h7bwybeg.fsf@gnu.org> <87y24t1ed1.fsf@gnus.org> <87k0eulqhx.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="37571"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: mu4e 1.6.10; emacs 27.2 Cc: "emacs-devel@gnu.org" To: Robert Pluim Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sun Jan 23 22:02:51 2022 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nBk0c-0009VI-J8 for ged-emacs-devel@m.gmane-mx.org; Sun, 23 Jan 2022 22:02:46 +0100 Original-Received: from localhost ([::1]:35092 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nBk0b-0000TC-7V for ged-emacs-devel@m.gmane-mx.org; Sun, 23 Jan 2022 16:02:45 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:33854) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nBjxD-0006mH-E6 for emacs-devel@gnu.org; Sun, 23 Jan 2022 15:59:16 -0500 Original-Received: from mail-oln040092064086.outbound.protection.outlook.com ([40.92.64.86]:40451 helo=EUR01-DB5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nBjxA-0001EZ-Gs for emacs-devel@gnu.org; Sun, 23 Jan 2022 15:59:14 -0500 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=RQGUcgVxSypk0/lcJiKUUlXehxN1A5Fuwh5u4n3ZT9Pa5QQgdN1/YAl8Vj+XmBuJXWLBzVjO9NWw+ngLOrolAboD4LFBN/w+Lzn1wQTITfNKxmsGu0aePtsrAhR5G1qN0yrvBbyPCGlDUEeTqc3BYG3yUUUwfYL4WpKZqjNnyn8dAyEQ9hLJA8xgsUbH0jUWH1K6M4diblJQR6TxJErgtrv+AOO4tiEFhDcxVvWVCVFvEKAXwft7df6XUMbdgcPxwUvM8lBL/fbx/q+NhGQuOUaBc0orYZHSWIMkElkTMsK8GwqTwyYCGdsdvLKGVUw9YjKqmHWXn2cKXyVTe37CNQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=T1MB8at9MzZ6RH3oZUdOawLOvGwick+G/Zj3dHljLBQ=; b=i91dX66tf/DyokX0x50X4AEfdzNylDcFLFkKC+1lS9QEFdNCq4enw0VUGwEULG60aNTBEwqw+SFNwu2OC2lEYvnxtaOCrgmQaWimA3a0SMKnD2ZngdGFWpXhIK93ioINuFl+vfSaWg7ykXqBVG2lIVznoiwxAsJg4HMwY3pWAwf4j3rpfskbkNpUqD7vlzZKslFPsibnummopVJD52uIFxnMNYl0X3qIl7AxBsRjfUu+yjeqqBOqtCalVpcV1GnALdHroeJcAsJs5s3+/8A4+HnWAb4XyNdGdS3LGBfw4rDizmiLdn9AWHxktf3bLykjWX7DObm/KbEt/Gp62mCjgw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hotmail.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=T1MB8at9MzZ6RH3oZUdOawLOvGwick+G/Zj3dHljLBQ=; b=qxJ4I5Kd7gorK5TuxFQ3fZV8feW7OPyD9wplGe/ypC2bh/o2P0cMSeIlMyzzJmT/aNB8Z4+/Hjpfh3nykwKtGmDYVCMfQ0vy93U0Ts2GnhA249K5mWr61jpyjF+Diieq2mcRFpMndY++rS6wDVRQppaSi/fjvptTFoeuYCUfxpifnUIsEonhm7nwO8g8BbbM8gqv0hz052DBxezepALCx6eszPQ/+xiq8Hfx5l/hBAo6D4PNTERcg203QY1MIWnGQZLFCN/ZCR9di0P69QLKiuti3dfaCZVpxVS3pAHF1C1zYMCdtgVtE3qPIqQnHa7FXiYw2fBaB2YcM6lRCmIdgA== Original-Received: from PRAP251MB0688.EURP251.PROD.OUTLOOK.COM (2603:10a6:102:293::21) by PAXP251MB0578.EURP251.PROD.OUTLOOK.COM (2603:10a6:102:286::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4909.17; Sun, 23 Jan 2022 20:59:09 +0000 Original-Received: from PRAP251MB0688.EURP251.PROD.OUTLOOK.COM ([fe80::15ff:34d8:e4d9:a23f]) by PRAP251MB0688.EURP251.PROD.OUTLOOK.COM ([fe80::15ff:34d8:e4d9:a23f%5]) with mapi id 15.20.4909.007; Sun, 23 Jan 2022 20:59:09 +0000 In-reply-to: <87k0eulqhx.fsf@gmail.com> X-TMN: [drRTFy/FY8ajBRmQ5Odq18xsmw1a4mLDFYwjj3IZUXFN4t/9Oc8p/JKfcjjtSr/D] X-ClientProxiedBy: OL1P279CA0071.NORP279.PROD.OUTLOOK.COM (2603:10a6:e10:15::22) To PRAP251MB0688.EURP251.PROD.OUTLOOK.COM (2603:10a6:102:293::21) X-Microsoft-Original-Message-ID: <87mtjmru52.fsf@hotmail.com> X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 84a8f76d-b5aa-42c7-aaf9-08d9deb333a1 X-MS-TrafficTypeDiagnostic: PAXP251MB0578:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: B5alLbc0TJ2r3pbNKnViqByPQY+Jw+oYAorv3av4IFTbVJNb8oKE4m3jUekRFdGMZj36DyEqD5dngCCDwe1JEWOb0ZGHMZkzUIrnmKhUC/C99h1VOOL+If+gf0RoEshF9EIgfcVzFlmbqITCbsA70j9ZjtEnL67pcwYHZRQnuwikXz7Qh9L2s/tfs7HbKlRwsX5La2xSl8kenQNCSMcVgIl0EUXb8HYKnJ+hJpenrtBr1+CJ+7MT7hc9+uWCXwylm1Sbqu54Usl5HInL6dDf7BzkVg2nysi8agjukEZhAQ8Gb1c94PIUVdkvuFG4GTD4LEU1D89Ysu21t33toIiYbO38e+fO8VEatVIKHlIy23jtXK+L2APIVsqBNHbfI8gLmPvbuqKUsfrunpw62w7IkoOLcgS0aEVzS92ifsrhHodQO+lUFPlCnaxm5V3unTRfkxP0rk8qyBeJo/UBtcmlJLaqqALIeFvWO4FAECqlY/Gq67gdtu4mjEAEbXcyZUAbgBS6BzXQxdxEDA/WpIrAEk2B9o2n/tbSmPEihaIQ+IP8cdhpOsIeAdbNDQbQ9DC6JAre78h70tnujtxyzEdfJw== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?N3dwZnVkMXlaU2VSUlV6UmdUc2RCTGVrWm15NHZlNlNQMUFrc2R4QnY3TmN6?= =?utf-8?B?QWp0ejFtMWJXREd6ajZ6TFBQMWN6VnRZNFM4YTlwT2NMSmJQc2E5NUhiTDhy?= =?utf-8?B?QW5kT3g3aURzVXU5V1lpTDcwY1MraFBLcTlTZXdJbXdZVlFyWkg3S1NLUith?= =?utf-8?B?OHN5NXZmV25DU0duVDJOZyszdTgrcU4zaHF5REtSU1Y3Q0ZiK2U4RTdOeHl0?= =?utf-8?B?cHc1ejE5YWgxQ2xmclN6NVZaQkFGZzFPSEowQkxmcnFja09hcHpGcCtDQ2dm?= =?utf-8?B?ckN5d3MrR3kvTUtiVW5rNTRoVWQ1ZXFkS05BenhTVWVNaFM1MTAzcC9xOU9W?= =?utf-8?B?d01oNDNqTTRKYkY4YzVhcDZWcDdoWk1mVDhneXNOWFFuZ1QxaDI3SmhIRkFz?= =?utf-8?B?MHA2THE4bFdDSERUejZoV2prMUFoVkRuMmgvTlhNTVRtQkF1a2pibEJuRU9z?= =?utf-8?B?U0FrWEdqV2FIWVJob21rVTlpaktaNVZhUlpaaDkyVS9xbTZXS3RiZHRkQjdu?= =?utf-8?B?dWJYbkN4UXVXVlJtRWl2cVQ2TTRHUkpzb21JSzJpWkRpMVMxbytlWW4veGxp?= =?utf-8?B?cjZFYkdrNE9wUk9wbDV5aVU0dDM4MkRpN091d0s5MllnbDErR0lqU3Z0SkVY?= =?utf-8?B?dHpqeHFnTGN0RzRiblYzQmM2WFU2R1U0bmtlTl X-OriginatorOrg: sct-15-20-4755-11-msonline-outlook-00b75.templateTenant X-MS-Exchange-CrossTenant-Network-Message-Id: 84a8f76d-b5aa-42c7-aaf9-08d9deb333a1 X-MS-Exchange-CrossTenant-AuthSource: PRAP251MB0688.EURP251.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jan 2022 20:59:09.8567 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXP251MB0578 Received-SPF: pass client-ip=40.92.64.86; envelope-from=hkon20@hotmail.com; helo=EUR01-DB5-obe.outbound.protection.outlook.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 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, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:285270 Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable > - Something answering the question: "what's the difference between > this and the existing 'alpha frame parameter", I added paragraph after that for alpha with a brief description. I have included it in the attached patch. For convenience, I'm reciting the relevant part here: =3D=3D=3D=3D diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi index 2eeb8b7ed7..05d0b1a72a 100644 --- a/doc/lispref/frames.texi +++ b/doc/lispref/frames.texi @@ -2433,6 +2433,16 @@ Font and Color Parameters Some window systems do not support the @code{alpha} parameter for child frames (@pxref{Child Frames}). + +@vindex alpha-background@r{, a frame parameter} +@item alpha-background +@cindex opacity, frame +@cindex transparency, frame +Sets the background transparency of the frame. Unlike the @code{alpha} +frame parameter, this only controls the transparency of the background +while keeping foreground elements such as text fully opaque. +It should be an integer between 0 and 100, where 0 means +completely transparent and 100 means completely opaque (default). @end table The following frame parameters are semi-obsolete in that they are =3D=3D=3D=3D Please let me know if this is what you had in mind or if I should revise it. > - a commit message containing a description of the changes in > ChangeLog format I have attached a file with a changelog entry. I'm also giving it here for convenience: =3D=3D=3D=3D 2022-01-23 H=C3=A5kon Flatval Add support for background transparency * src/haikufns.c: * src/nsfns.m: * src/pgtkfns.c: * src/w32fns.c: * src/xfns.c: Add alpha-background frame parameter defaults. Prefer to = use 32-bit depth visual in X. * src/frame.h: * src/frame.c: Add alpha-background frame parameter and setter function= . * src/gtkutil.c: Setup GTK to allow transparency. * src/xterm.c: Draw background transparent using alpha-background frame= parameter. * doc/lispref/frames.texi: Add docs for alpha-background frame paramete= r =3D=3D=3D=3D Let me know if it needs changes. I'm a little confused as to where I should put this. Should I add it to one of the Changelog files? Best regards, H=C3=A5kon --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=gdk-cairo-background-transparency-007.patch diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi index 2eeb8b7ed7..05d0b1a72a 100644 --- a/doc/lispref/frames.texi +++ b/doc/lispref/frames.texi @@ -2433,6 +2433,16 @@ Font and Color Parameters Some window systems do not support the @code{alpha} parameter for child frames (@pxref{Child Frames}). + +@vindex alpha-background@r{, a frame parameter} +@item alpha-background +@cindex opacity, frame +@cindex transparency, frame +Sets the background transparency of the frame. Unlike the @code{alpha} +frame parameter, this only controls the transparency of the background +while keeping foreground elements such as text fully opaque. +It should be an integer between 0 and 100, where 0 means +completely transparent and 100 means completely opaque (default). @end table The following frame parameters are semi-obsolete in that they are diff --git a/src/frame.c b/src/frame.c index 8aaff949ba..c331cff32b 100644 --- a/src/frame.c +++ b/src/frame.c @@ -3907,6 +3907,7 @@ DEFUN ("frame-scale-factor", Fframe_scale_factor, Sframe_scale_factor, {"z-group", SYMBOL_INDEX (Qz_group)}, {"override-redirect", SYMBOL_INDEX (Qoverride_redirect)}, {"no-special-glyphs", SYMBOL_INDEX (Qno_special_glyphs)}, + {"alpha-background", SYMBOL_INDEX (Qalpha_background)}, #ifdef NS_IMPL_COCOA {"ns-appearance", SYMBOL_INDEX (Qns_appearance)}, {"ns-transparent-titlebar", SYMBOL_INDEX (Qns_transparent_titlebar)}, @@ -5024,6 +5025,33 @@ gui_set_alpha (struct frame *f, Lisp_Object arg, Lisp_Object oldval) } } +void +gui_set_alpha_background (struct frame *f, Lisp_Object arg, Lisp_Object oldval) +{ + double alpha = 1.0; + + if (NILP (arg)) + alpha = 1.0; + else if (FLOATP (arg)) + { + alpha = XFLOAT_DATA (arg); + if (! (0 <= alpha && alpha <= 1.0)) + args_out_of_range (make_float (0.0), make_float (1.0)); + } + else if (FIXNUMP (arg)) + { + EMACS_INT ialpha = XFIXNUM (arg); + if (! (0 <= ialpha && ialpha <= 100)) + args_out_of_range (make_fixnum (0), make_fixnum (100)); + alpha = ialpha / 100.0; + } + else + wrong_type_argument (Qnumberp, arg); + + f->alpha_background = alpha; + + SET_FRAME_GARBAGED (f); +} /** * gui_set_no_special_glyphs: @@ -6100,6 +6128,7 @@ syms_of_frame (void) #endif DEFSYM (Qalpha, "alpha"); + DEFSYM (Qalpha_background, "alpha-background"); DEFSYM (Qauto_lower, "auto-lower"); DEFSYM (Qauto_raise, "auto-raise"); DEFSYM (Qborder_color, "border-color"); diff --git a/src/frame.h b/src/frame.h index cb2f58e261..5d5f2122fb 100644 --- a/src/frame.h +++ b/src/frame.h @@ -637,6 +637,9 @@ #define EMACS_FRAME_H Negative values mean not to change alpha. */ double alpha[2]; + /* Background opacity */ + double alpha_background; + /* Exponent for gamma correction of colors. 1/(VIEWING_GAMMA * SCREEN_GAMMA) where viewing_gamma is 0.4545 and SCREEN_GAMMA is a frame parameter. 0 means don't do gamma correction. */ @@ -1669,6 +1672,7 @@ #define EMACS_CLASS "Emacs" extern long gui_figure_window_size (struct frame *, Lisp_Object, bool, bool); extern void gui_set_alpha (struct frame *, Lisp_Object, Lisp_Object); +extern void gui_set_alpha_background (struct frame *, Lisp_Object, Lisp_Object); extern void gui_set_no_special_glyphs (struct frame *, Lisp_Object, Lisp_Object); extern void validate_x_resource_name (void); diff --git a/src/gtkutil.c b/src/gtkutil.c index eb14856062..19dd04523e 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -1467,6 +1467,10 @@ xg_create_frame_widgets (struct frame *f) } wtop = gtk_window_new (type); gtk_widget_add_events (wtop, GDK_ALL_EVENTS_MASK); + + /* This prevents GTK from painting the window's background, which + would interfere with transparent background in some environments */ + gtk_widget_set_app_paintable (wtop, TRUE); #endif /* gtk_window_set_has_resize_grip is a Gtk+ 3.0 function but Ubuntu @@ -1587,6 +1591,15 @@ xg_create_frame_widgets (struct frame *f) #endif | GDK_VISIBILITY_NOTIFY_MASK); + GdkScreen *screen = gtk_widget_get_screen (wtop); + + if (FRAME_DISPLAY_INFO (f)->n_planes == 32) + { + GdkVisual *visual = gdk_screen_get_rgba_visual (screen); + gtk_widget_set_visual (wtop, visual); + gtk_widget_set_visual (wfixed, visual); + } + #ifndef HAVE_PGTK /* Must realize the windows so the X window gets created. It is used by callers of this function. */ @@ -1651,7 +1664,6 @@ xg_create_frame_widgets (struct frame *f) #endif { - GdkScreen *screen = gtk_widget_get_screen (wtop); GtkSettings *gs = gtk_settings_get_for_screen (screen); /* Only connect this signal once per screen. */ if (! g_signal_handler_find (G_OBJECT (gs), diff --git a/src/haikufns.c b/src/haikufns.c index 58a2e1d464..7117296a73 100644 --- a/src/haikufns.c +++ b/src/haikufns.c @@ -2609,7 +2609,8 @@ DEFUN ("haiku-frame-restack", Fhaiku_frame_restack, Shaiku_frame_restack, 2, 3, haiku_set_no_accept_focus, NULL, /* set z group */ haiku_set_override_redirect, - gui_set_no_special_glyphs + gui_set_no_special_glyphs, + gui_set_alpha_background, }; void diff --git a/src/nsfns.m b/src/nsfns.m index 11132a294a..a4f3f091fc 100644 --- a/src/nsfns.m +++ b/src/nsfns.m @@ -1004,6 +1004,7 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side. ns_set_z_group, 0, /* x_set_override_redirect */ gui_set_no_special_glyphs, + gui_set_alpha_background, #ifdef NS_IMPL_COCOA ns_set_appearance, ns_set_transparent_titlebar, diff --git a/src/pgtkfns.c b/src/pgtkfns.c index 9c37c04810..b46429379e 100644 --- a/src/pgtkfns.c +++ b/src/pgtkfns.c @@ -1043,6 +1043,7 @@ frames (each of which corresponds to one page). Each frame should be x_set_z_group, x_set_override_redirect, gui_set_no_special_glyphs, + gui_set_alpha_background, }; diff --git a/src/w32fns.c b/src/w32fns.c index 37f9b813c6..a360faefa8 100644 --- a/src/w32fns.c +++ b/src/w32fns.c @@ -10436,6 +10436,7 @@ w32_get_resource (const char *key, const char *name, LPDWORD lpdwtype) w32_set_z_group, 0, /* x_set_override_redirect */ gui_set_no_special_glyphs, + gui_set_alpha_background, }; void diff --git a/src/xfns.c b/src/xfns.c index 7123198724..a79462b125 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -4569,6 +4569,8 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame, RES_TYPE_NUMBER); gui_default_parameter (f, parms, Qalpha, Qnil, "alpha", "Alpha", RES_TYPE_NUMBER); + gui_default_parameter (f, parms, Qalpha_background, Qnil, + "alpha_background", "AlphaBackground", RES_TYPE_NUMBER); if (!NILP (parent_frame)) { @@ -6342,10 +6344,29 @@ select_visual (struct x_display_info *dpyinfo) int n_visuals; XVisualInfo *vinfo, vinfo_template; - dpyinfo->visual = DefaultVisualOfScreen (screen); + vinfo_template.screen = XScreenNumberOfScreen (screen); + +#if defined (USE_GTK) && defined (USE_CAIRO) + /* First attempt to use 32-bit visual if available */ + + vinfo_template.depth = 32; + + vinfo = XGetVisualInfo (dpy, VisualScreenMask | VisualDepthMask, + &vinfo_template, &n_visuals); + if (n_visuals > 0) + { + dpyinfo->n_planes = vinfo->depth; + dpyinfo->visual = vinfo->visual; + XFree (vinfo); + return; + } + +#endif // defined (USE_GTK) && defined (USE_CAIRO) + + /* 32-bit visual not available, fallback to default visual */ + dpyinfo->visual = DefaultVisualOfScreen (screen); vinfo_template.visualid = XVisualIDFromVisual (dpyinfo->visual); - vinfo_template.screen = XScreenNumberOfScreen (screen); vinfo = XGetVisualInfo (dpy, VisualIDMask | VisualScreenMask, &vinfo_template, &n_visuals); if (n_visuals <= 0) @@ -7203,6 +7224,8 @@ x_create_tip_frame (struct x_display_info *dpyinfo, Lisp_Object parms) "cursorType", "CursorType", RES_TYPE_SYMBOL); gui_default_parameter (f, parms, Qalpha, Qnil, "alpha", "Alpha", RES_TYPE_NUMBER); + gui_default_parameter (f, parms, Qalpha_background, Qnil, + "alpha_background", "AlphaBackground", RES_TYPE_NUMBER); /* Add `tooltip' frame parameter's default value. */ if (NILP (Fframe_parameter (frame, Qtooltip))) @@ -8531,6 +8554,7 @@ DEFUN ("x-gtk-debug", Fx_gtk_debug, Sx_gtk_debug, 1, 1, 0, x_set_z_group, x_set_override_redirect, gui_set_no_special_glyphs, + gui_set_alpha_background, }; void diff --git a/src/xterm.c b/src/xterm.c index 2a4ea883bc..ed3b9a8b25 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -840,12 +840,27 @@ x_set_cr_source_with_gc_background (struct frame *f, GC gc) { XGCValues xgcv; XColor color; + unsigned int depth; XGetGCValues (FRAME_X_DISPLAY (f), gc, GCBackground, &xgcv); color.pixel = xgcv.background; + x_query_colors (f, &color, 1); - cairo_set_source_rgb (FRAME_CR_CONTEXT (f), color.red / 65535.0, - color.green / 65535.0, color.blue / 65535.0); + + depth = FRAME_DISPLAY_INFO (f)->n_planes; + + if (f->alpha_background < 1.0 && depth == 32) + { + cairo_set_source_rgba (FRAME_CR_CONTEXT (f), color.red / 65535.0, + color.green / 65535.0, color.blue / 65535.0, + f->alpha_background); + + cairo_set_operator (FRAME_CR_CONTEXT (f), CAIRO_OPERATOR_SOURCE); + } + else + cairo_set_source_rgb (FRAME_CR_CONTEXT (f), color.red / 65535.0, + color.green / 65535.0, color.blue / 65535.0); + } static const cairo_user_data_key_t xlib_surface_key, saved_drawable_key; @@ -1258,6 +1273,29 @@ x_fill_rectangle (struct frame *f, GC gc, int x, int y, int width, int height) #endif } + +static void +x_clear_rectangle (struct frame *f, GC gc, int x, int y, int width, int height) +{ +#ifdef USE_CAIRO + cairo_t *cr; + + cr = x_begin_cr_clip (f, gc); + x_set_cr_source_with_gc_background (f, gc); + cairo_rectangle (cr, x, y, width, height); + cairo_fill (cr); + x_end_cr_clip (f); +#else + XGCValues xgcv; + Display *dpy = FRAME_X_DISPLAY (f); + XGetGCValues (dpy, gc, GCBackground | GCForeground, &xgcv); + XSetForeground (dpy, gc, xgcv.background); + XFillRectangle (dpy, FRAME_X_DRAWABLE (f), + gc, x, y, width, height); + XSetForeground (dpy, gc, xgcv.foreground); +#endif +} + static void x_draw_rectangle (struct frame *f, GC gc, int x, int y, int width, int height) { @@ -1838,9 +1876,9 @@ x_draw_fringe_bitmap (struct window *w, struct glyph_row *row, struct draw_fring if (face->stipple) XSetFillStyle (display, face->gc, FillOpaqueStippled); else - XSetForeground (display, face->gc, face->background); + XSetBackground (display, face->gc, face->background); - x_fill_rectangle (f, face->gc, p->bx, p->by, p->nx, p->ny); + x_clear_rectangle (f, face->gc, p->bx, p->by, p->nx, p->ny); if (!face->stipple) XSetForeground (display, face->gc, face->foreground); @@ -2141,12 +2179,7 @@ x_compute_glyph_string_overhangs (struct glyph_string *s) static void x_clear_glyph_string_rect (struct glyph_string *s, int x, int y, int w, int h) { - Display *display = FRAME_X_DISPLAY (s->f); - XGCValues xgcv; - XGetGCValues (display, s->gc, GCForeground | GCBackground, &xgcv); - XSetForeground (display, s->gc, xgcv.background); - x_fill_rectangle (s->f, s->gc, x, y, w, h); - XSetForeground (display, s->gc, xgcv.foreground); + x_clear_rectangle (s->f, s->gc, x, y, w, h); } --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=alpha-background-changelog Content-Transfer-Encoding: base64 MjAyMi0wMS0yMyAgSMOla29uIEZsYXR2YWwgIDxoa29uMjBAaG90bWFpbC5jb20+CglBZGQgc3Vw cG9ydCBmb3IgYmFja2dyb3VuZCB0cmFuc3BhcmVuY3kKCgkqIHNyYy9oYWlrdWZucy5jOgoJKiBz cmMvbnNmbnMubToKCSogc3JjL3BndGtmbnMuYzoKCSogc3JjL3czMmZucy5jOgoJKiBzcmMveGZu cy5jOiBBZGQgYWxwaGEtYmFja2dyb3VuZCBmcmFtZSBwYXJhbWV0ZXIgZGVmYXVsdHMuIFByZWZl ciB0byB1c2UgMzItYml0IGRlcHRoIHZpc3VhbCBpbiBYLgoJKiBzcmMvZnJhbWUuaDoKCSogc3Jj L2ZyYW1lLmM6IEFkZCBhbHBoYS1iYWNrZ3JvdW5kIGZyYW1lIHBhcmFtZXRlciBhbmQgc2V0dGVy IGZ1bmN0aW9uLgoJKiBzcmMvZ3RrdXRpbC5jOiBTZXR1cCBHVEsgdG8gYWxsb3cgdHJhbnNwYXJl bmN5LgoJKiBzcmMveHRlcm0uYzogRHJhdyBiYWNrZ3JvdW5kIHRyYW5zcGFyZW50IHVzaW5nIGFs cGhhLWJhY2tncm91bmQgZnJhbWUgcGFyYW1ldGVyLgoJKiBkb2MvbGlzcHJlZi9mcmFtZXMudGV4 aTogQWRkIGRvY3MgZm9yIGFscGhhLWJhY2tncm91bmQgZnJhbWUgcGFyYW1ldGVyCg== --=-=-=--