这是我一直使用的一个非常有用的 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 控制序列来更改几乎所有内容。
通过使用
CSI 2 t
和 CSI 2 t
,您可以 iconify、de-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
可能看起来像:
我测试失败:
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 控制序列来切换 阴影属性的方法。
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 客户端消息(见下文)。窗口管理器必须保持此属性更新以反映窗口的当前状态。
XSetTextProperty
,它使用了与原子存在不同的方法:
XSetTextProperty 函数将命名窗口的现有指定属性替换为分别由指定 XTextProperty 的值字段、编码字段、格式字段和 nitems 字段确定的数据、类型、格式和项目数结构。如果该属性尚不存在,XSetTextProperty 会为指定窗口设置它。
(要查看差异,请查看
xprop
的输出:present 要“设置”的原子没有值)。