根据连接的 Xserver 设置窗口管理器的元键

wic*_*ich 7 remote keyboard x11

情况

一个 Linux 服务器运行一个支持 XDMCP 的 xdm,它通过一个X -query <server>命令使用 XDMCP 连接到各种不同的 Linux 和 OS X 机器。

一旦用户登录,窗口管理器就会启动,它主要是使用指定的元键从键盘控制的。

问题

分配的元密钥需要取决于连接到 linux 服务器的盒子的平台。我如何弄清楚所连接的 X 服务器背后的平台是什么?

想法

我无法使用 DISPLAY 环境变量打开,连接盒的 IP 是由 DHCP 分配的,不知道盒子的平台是什么。

我知道 X 的 -class 选项可用于设置显示类,然后可用于为 Xresources 中的各种显示类设置默认值。但是我不知道如何从命令行(或一个小的自定义 C 程序)获取连接的 Xserver 的类,此外,我不知道如何获取将使用该类配置的 Xresource 的值.

理想情况下,可以在运行 X 服务器的机器上配置使用的元密钥,以便在设置中引入新类型的平台时,运行 xdm 的 linux 服务器不需要任何重新配置​​。

解决这个问题的最佳方法是什么?是否可以确定 X 服务器运行的平台?可以将某些配置选项从 Xserver 传递到窗口管理器脚本吗?有没有更好的方法来解决这个问题?

Gil*_*il' 1

如果您设置键盘映射,以便将相同的键符号和修饰符分配给各处的 Meta 键,那么这个特殊问题就很容易解决。

\n\n
\n\n

您可以通过xrdb程序获取有关服务器的一些信息。服务器定义了一些可xrdb通过预处理使用的属性。您可以使用 打印出来xrdb -symbols。例如,

\n\n
xrdb -Dsymbols | sed -n \'s/-DSERVERHOST=//p\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

打印 X 服务器的主机名。您可以使用 C 预处理结构为特定服务器主机定义特定资源:

\n\n
#ifdef SRVR_darkstar\n\xe2\x80\xa6\n#endif\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是一个将 xrdb 符号转换为 shell 环境变量的 shell 脚本。将它与类似的东西一起使用eval "$(xrdb_sh_prefix=X_ xrdb-sh)"

\n\n
#!/bin/sh\n# Access xrdb #define\'s from the shell\n\n# For each binding that xrdb(1) would give to the preprocessor, print\n# NAME=VALUE for -DNAME=VALUE.\n# If $xrdb_sh_export is not empty, also print "export NAME".\n# If $xrdb_sh_prefix is not empty, prefix it to each NAME in output.\n# Shell metacharacters are preceded by `\\\' in VALUEs. NAMEs are\n# assumed to be admissible C identifiers.\n# Example:\n#   xrdb_sh_export=y xrdb_sh_prefix=X_ xrdb-sh\n# outputs somthing like\n#    X_SERVERHOST=drongo\n#    export X_SERVERHOST\n#    X_VENDOR=The\\ XFree86\\ Project\\,\\ Inc\n#    export X_VENDOR\n# ...\n# The output of this program is typically used in a Bourne shell thus:\n#   eval "`xrdb_sh_prefix=X_ xrdb-sh`"\n\nif [ -n "$xrdb_sh_export" ]; then\n  awk_export=\'print "export " name\'\nfi\nawk -v prefix="$xrdb_sh_prefix" \'\n  /^-D/ {\n    $0 = substr($0, 3)\n    eq = match($0, /=/)\n    name = (prefix) (eq ? substr($0, 1, eq-1) : $0)\n    if (eq) {\n        $0 = substr($0, eq+1)\n        sub(/^\\"/, ""); sub(/\\"$/, "")\n        gsub(/[^0-9A-Z_a-z]/, "\\\\\\\\&")\n    } else {\n        $0 = ""\n    }\n    print name "=" $0\n    \'"$awk_export"\'\n  }\n  /^exit=[0-9]+$/ {sub(/^.*=/, ""); exit $0}\n\' <<EOF\n`{ xrdb "$@" -symbols || echo exit=$?; } | $sort || echo exit=$?`\nEOF\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

另一种方法是从服务器端在根窗口上设置自定义属性,例如使用xprop. xprop从客户端查询这些属性(再次使用)。

\n\n
xprop -set Server_arch "$(uname -m)"\n
Run Code Online (Sandbox Code Playgroud)\n