Emacs最近实现了真·背景透明

最近玩nixos, 发现使用默认的emacs-overlay设置alpha-background不生效, 需要显示指定withGTK3 = true; 才可以, 下面是我的build例子作为参考…

with (import <nixpkgs> {});
with rec {
  emacs-overlay = import (builtins.fetchTarball { url = https://github.com/nix-community/emacs-overlay/archive/master.tar.gz; });
};
let overlay = self: super: {
  myemacs = ((super.emacsGit.override{
    nativeComp = false;
    withGTK3 = true;
  }).overrideAttrs (old: {
    # 这行是因为, 在用了GTK3后会在 `nativeInputBuilds` 加入 `wrapGAppsHook`, 大概是因为动态链接的问题导致nix-community/emacs-overlay的 treesitter patch没有生效, 因为刚用nixos所以不太熟只想到这个解决方法.
    nativeBuildInputs = (lib.remove pkgs.wrapGAppsHook old.nativeBuildInputs);
  }));
};
in
(import <nixpkgs> {
  overlays = [ emacs-overlay overlay ];
}).myemacs
3 个赞

为什么 我按楼主的方式,没有效果,反而 我用下面的 可以实现透明

(set-frame-parameter nil 'alpha 0.9)

我也遇到了这个问题,通过站内搜索搜到这个帖子。想知道现在有解决方案了吗?

还是有点用的,对我来说多大的优点是节约屏幕面积。 下层放文档,上层放 Emacs 边看文档边敲代码算是常见场景了。 不过这还不是我发现透明背景最大的优点。

我把 动态变化 的软件界面放在 Emacs 后面,比如 QQ,玩 Emacs 时还能顺便看到群友在聊什么,这个实在是太方便了。

我遇到和你同样的问题. 请问你是使用的 macOS (ns 架构) 吗?

目前 macOS 好像只能实现背景透明(内容也会跟着一起变透明), 但不能实现如题所述的真·背景透明.

(push '(alpha . (90 . 90)) default-frame-alist)

据我所知在Windows上把窗口弄半透明(毛玻璃效果)不需要使用DirectX,而是使用桌面窗口管理器提供的几个C API: DWM Blur Behind Overview - Win32 apps | Microsoft Learn

1 个赞

目前,我还不知道解决方案! :rofl:

这里没有讲到 C 下怎么调节 DC 的 alpha,只是讲解了怎么给全部的窗口内容开启透明效果。

把窗口变成透明以后,绘制带alpha通道的背景,窗口管理器会正确地混合背景色的alpha通道和窗口下面的内容的。这里有一点讨厌的地方是Emacs主要通过GDI来进行绘制,然而很多GDI函数对Alpha通道不太友好(因为太古老了)。要绘制带Alpha的图形,需要使用能够支持32位RGBA的API。

参见这篇博文

1 个赞

而据说只有 GDI 能从 C 代码调用,GDI+ 之类的必须使用 C++。

技术上讲稍微用一点点c++可能也不算个太大的问题吧,gcc和clang都可以支持,而且Emacs在苹果平台上也用了objc。政治上有没有障碍我就不知道了。

还有一个办法是给 windows 加一个cairo后端

技术上没有阻碍,但是目前的 w32 维护者(Eli)不愿意添加 C++ 代码。

我在emacs邮件群组里找到了绘制图片透明通道的暂时解决方案,答案是使用xpm的图片格式! https://mail.gnu.org/archive/html/bug-gnu-emacs/2022-12/msg01080.html

这是使用了xpm图片格式后的显示效果

代价是,启动时间肉眼可见的变长。 启动时间并没有变长~

这是linux平台下的解决方案,我使用pgtk的emacs也可以正确显示。不清楚windows和macos平台下能不能正常显示。

4 个赞

哦哦! xpm 格式!回头在 Linux 平台上试试!
真背景透明,我只在 Linux 平台实现过。
在 Windows 平台 29.1 版本 也是不被支持的!
MacOS 我不清楚,因为我不在 MacOS 上用 Emacs! :blush:
目前我是根据系统平台分别设置了对应透明方式!

启动时间长, 用server就好了. 我的配置单纯启动要四秒

用server有一些难以描述的gui方面的问题,我觉得我的启动时间还算是可以接受的

兄弟, 可以试一下看这篇 https://github.com/shynur/.emacs.d/blob/main/docs/Emacs-FAQ.txt#L20.

2 个赞

这个真不错啊,我能不能把 (load custom-file) 放在 (custom-set-faces … ) 那里呢?

还有,这么说的话client gui 不符合预期全都是因为custom加载不符预期导致的吗?