XTerm *通过控制序列遮蔽*窗口

问题描述 投票:0回答:1

阴影 X 窗口

这是我一直使用的一个非常有用的 X 功能。对于不知道这一点的人来说,它是缩小窗口到标题栏的能力,而不是iconify

因为我可以使用标题栏来提示很多事情,比如:

printf '\e];Long process running...\a'
sleep 2 # doLongProcessLike apt full-upgrade
rc=$?; printf '\e];Long process ended with %d.\a' $rc

然后我可以通过以下方式遮蔽我的窗户:

wmctrl -ir "$WINDOWID" -b add,shaded

注意:我已经修改了我的配合设置,以便使用双击窗口标题来切换阴影*。

一切正常:

printf '\e];Long process running...\a'
wmctrl -ir "$WINDOWID" -b add,shaded
sleep 2 # doLongProcessLike apt full-upgrade
rc=$?; printf '\e];Long process ended with %d.\a' $rc
wmctrl -ir "$WINDOWID" -b remove,shaded

XTerm 控制序列。

使用 XTerm,您可以使用 Xterm 控制序列来更改几乎所有内容。

通过使用

CSI 2 t
CSI 2 t
,您可以 iconifyde-iconify 您的窗口。

printf '\e[2t'; sleep 1 ;  printf '\e[1t'

通过使用

OSC 0 ; Window Title BEL
您可以更改窗口标题,这是显示种类或进度条的示例:

wmctrl -ir "$WINDOWID" -b add,shaded
for progress in {0..100};do
    printf '\e];Job progress: %.2f%% \U2595%b\U258F\a' \
        "$progress" \\U2$(( progress ? 581 + progress * 100 /1428 : 800))
    sleep .03
done

可能看起来像:

enter image description here

我的问题:如何通过 ctlseqs 切换 shaded 属性?

我测试失败:

printf '\e]3;WM_STATE=WM_STATE_SHADED\a' ;sleep 1

还有很多变体,基于

xprop -id "$WINDOWID" > /tmp/xpropfile.txt
sleep 2
xprop -id "$WINDOWID" | diff /tmp/xpropfile.txt -

并用鼠标在不到 2 秒的时间内切换阴影...

但是我一直在寻找一种通过 Xterm 控制序列来切换 阴影属性的方法。

bash xterm
1个回答
0
投票

要查看的地方在

wmctrl
的源代码中,例如,这里

static gchar * normalize_wm_state_name(const char * name)
{
    char * short_names[] = {
        "modal", "sticky", "maximized_vert", "maximized_horz",
        "shaded", "skip_taskbar", "skip_pager", "hidden",
        "fullscreen", "above", "below", 0};

    int i;
    for (i = 0; short_names[i]; i++)
    {
        if (strcmp(short_names[i], name) == 0)
        {
            gchar * upcase = g_ascii_strup(name, -1);
            gchar * result = g_strdup_printf("_NET_WM_STATE_%s", upcase);
            g_free(upcase);
            return result;
        }
    }

看到要更改的属性是

_NET_WM_STATE_SHADED
,记录在here:

描述窗口状态的提示列表。列表中存在的原子必须被视为设置,列表中不存在的原子必须被视为未设置。每当撤回的窗口请求映射时,窗口管理器应该尊重 _NET_WM_STATE。希望更改窗口状态的客户端必须向根窗口发送 _NET_WM_STATE 客户端消息(见下文)。窗口管理器必须保持此属性更新以反映窗口的当前状态。

但是,xterm 使用

XSetTextProperty
,它使用了与原子存在不同的方法:

XSetTextProperty 函数将命名窗口的现有指定属性替换为分别由指定 XTextProperty 的值字段、编码字段、格式字段和 nitems 字段确定的数据、类型、格式和项目数结构。如果该属性尚不存在,XSetTextProperty 会为指定窗口设置它。

(要查看差异,请查看

xprop
的输出:present 要“设置”的原子没有值)。

© www.soinside.com 2019 - 2024. All rights reserved.