如何使窗口在不活动时保持不透明?

如何使窗口在不活动时保持不透明?

我设置 Xfce 使所有窗口在没有鼠标焦点时变为半透明。如何设置特定窗口在不活动时保持不透明? Xfce 没有更改特定窗口设置的选项(据我所知)。

我以前找到过这个问题的解决方案,但现在找不到了。我使用命令行程序在我想要的窗口上设置特定的窗口管理器提示,这阻止了窗口变得透明。但我不记得我使用的程序或窗口管理器提示的名称。我认为提示名称的一部分可能是LOCKED.

例如,这对于防止 GIMP 窗口在失去鼠标焦点时变得透明非常有用。

我有transset-df,但它没有办法强制窗口在不活动时保持相同的透明度。

答案1

使用恶魔间谍2将窗口类型设置为“实用程序”以供选择性应用程序使用。该窗口类型不会受到 Xfce 环境中“非活动窗口的不透明度”的影响。

初步设置

从存储库安装 Devilspie2(可在德班乌班图$HOME/.config/devilspie2存储库),然后使用以下内容创建一个新的配置文件。

debug_print("Window Name: " .. get_window_name());
debug_print("Application name: " .. get_application_name());

if (get_application_name()=="xfce4-dict") then
   set_window_type "_NET_WM_WINDOW_TYPE_UTILITY";
end

将文件另存为opaque.lua.文件名可以是任何名称,但必须具有.lua文件扩展名才能与 Devilspie2 一起使用。

初步测试

在调试模式下运行 Devilspie2,您将看到如下所示的内容。

$  devilspie2 -d
Running devilspie2 in debug mode.

Using scripts from folder: /home/USERNAME/.config/devilspie2
------------
List of LUA files handling "window_open" events in folder:
/home/USERNAME/.config/devilspie2/opaque.lua
List of LUA files handling "window_close" events in folder:
------------
Window Name: Desktop
Application name: xfdesktop
Window Name: xfce4-panel
Application name: xfce4-panel
Window Name: Application Finder
Application name: xfrun4
Window Name: Dictionary
Application name: xfce4-dict

以下屏幕截图显示了运行 Devilspie2 之前和之后的 Dictionary 非活动窗口。请注意,字典(底部)的不透明度发生了变化,但 Xfce 终端在两个窗口均处于非活动状态时仍然不透明(左侧)。

没有 Devilspie2,字典就不那么不透明了

使用 Devilspie2 使字典完全不透明

Dictionary 的非活动窗口仍然完全不透明,因为相对于配置文件,Devilspie2 已将窗口类型更改为“实用程序”。

修改设置

debug_print创建的配置文件包含以显示“窗口名称:...应用程序名称:...”的调试消息开头的前两行。这些行允许 Devilspie2 显示当前运行的应用程序和随后运行的应用程序的各自名称。

根据调试消息,用户应执行以下步骤:

  1. 确定选择的应用程序,该应用程序在不活动时需要完全不透明。查找包含它的行Application name:并复制该值。

  2. /home/USERNAME/.config/devilspie2/opaque.lua使用文本编辑器打开相同的配置文件,然后替换xfce4-dict为所选的应用程序。

  3. 保存文件。

  4. 退出并再次运行 Devilspie2。

请注意,USERNAME 指的是当前用户名。

修改后的配置现已生效。如果选择的应用程序已在运行,请来回切换窗口,以便在窗口再次变为非活动状态时查看有效的更改。

持久设置:Devilspie2 必须在后台运行,此解决方案才能对每个会话有效。要使其持久化,请devilspie2在“会话和启动”中的“应用程序自动启动”选项卡下添加。

什么窗型

最初,我在玩 Devilspie2 时通过试验和错误找到了这个解决方案。后来我尝试运行 GIMP 2.8,发现主窗口在不活动时变得不那么不透明,但其他两个浮动窗口仍然完全不透明。

然后我通过运行确认了窗口类型xwininfo,然后单击其中一个浮动窗口,打印窗口管理器提示。

$ xwininfo -wm

xwininfo: Please select the window about which you
          would like information by clicking the
          mouse in that window.

xwininfo: Window id: 0x2a00686 "Layers - Brushes"

  Window manager hints:
      Client accepts input or input focus: Yes
      Initial state is Normal State
      Displayed on desktop 1
      Window type:
          Utility
      Window state:
          Skip Pager
          Skip Taskbar
      Process id: 5262 on host XXXXX
      Frame extents: 1, 1, 22, 4

宾果,窗口类型确实是“实用程序”!

琐碎的问题:“实用程序”窗口类型有一种不同的行为,即应用程序窗口将不再出现在任务栏中。用户可以继续使用Alt+Tab键而不是任务栏进行导航。

这种行为对于“实用程序”窗口类型来说是正常的,对于浮动窗口(即 GIMP 中的停靠栏)也可以观察到同样的情况。

如果用户觉得这种行为不可取,那么改变窗口类型可能是一个有缺点的解决方案。另一方面,这种行为是一个微不足道的问题,同时能够在不活动时保持选择性窗口不透明。

使用 Devilspie2 v0.31 在 Xubuntu 14.04 (Xfce 4.10) 中进行测试。

答案2

当我研究clearkimura的答案时,我发现了我之前一直使用的使窗口保持不透明的方法。在终端中输入此命令,然后单击所需的窗口:

xprop -f _NET_WM_WINDOW_OPACITY_LOCKED 32c -set _NET_WM_WINDOW_OPACITY_LOCKED 1

这会设置一个窗口属性,使 Xfce 在窗口变为活动状态时保持窗口不透明度不变。

我最终按照clearkimura的建议做了,但这是另一种在窗口不活动时自动保持窗口不透明的方法:

我的存储库只有devilspie,没有devilspie2。我创建了这个 Devilspie 配置文件并将其命名~/.devilspie/rules.ds(注释以分号开头):

(begin
    ;(debug)
    (if
        ; For mplayer/smplayer and all Gimp windows:
        (or
            (contains (application_name) "MPlayer")
            (contains (window_class) "Gimp")
        )
        ; comment out one of the lines below:
        (print (window_xid) "\n") ; print the window IDs
        ; (wintype "utility") ; set the window type to utility
    )
)

然后我创建了这个脚本,将其命名为devilspie_xprop,并将其放在我的主目录中:

#!/bin/bash
devilspie $@ | while read id text; do
    if [[ $id -gt 0 && $text == "" ]]; then
        xprop -id $id -f _NET_WM_WINDOW_OPACITY_LOCKED 32c -set _NET_WM_WINDOW_OPACITY_LOCKED 1
    else
        echo "$id $text"
    fi
done

Devilspie 打印任何 Gimp 或 MPlayer/SMPlayer 窗口的窗口 ID。然后,该脚本xprop针对每个窗口 ID 运行,设置_NET_WM_WINDOW_OPACITY_LOCKED属性。

最后,我在启动 Xfce 之前将其添加到我的 .xinitrc 中:

$HOME/devilspie_xprop &

我最终决定我更喜欢 Clearkimura 的解决方案,但其中任何一个都有效。

相关内容