Đặt khóa meta của trình quản lý cửa sổ tùy thuộc vào Xserver được kết nối


7

Tình hình

Một máy chủ linux đang chạy xdm hỗ trợ XDMCP, nó được kết nối với từ nhiều hộp Linux và OS X khác nhau bằng XDMCP thông qua một X -query <server>lệnh.

Khi người dùng đã đăng nhập, trình quản lý cửa sổ được khởi động, phần lớn được điều khiển từ bàn phím bằng phím meta được gán.

Vấn đề

Khóa meta được gán cần phụ thuộc vào nền tảng của hộp kết nối với máy chủ linux. Làm thế nào để tôi tìm ra nền tảng đằng sau máy chủ X được kết nối?

Suy nghĩ

Tôi không thể sử dụng biến môi trường HIỂN THỊ để bật, IP của các hộp kết nối được gán bởi DHCP và không cho biết nền tảng của hộp là gì.

Tôi biết tùy chọn-class cho X có thể được sử dụng để đặt lớp hiển thị, sau đó có thể được sử dụng để đặt mặc định cho các lớp hiển thị khác nhau trong Xresource. Tuy nhiên tôi không biết cách lấy lớp Xserver được kết nối từ dòng lệnh (hoặc một chương trình C tùy chỉnh nhỏ) và hơn nữa, tôi không biết cách lấy giá trị của Xresource sẽ được cấu hình với lớp đó .

Lý tưởng nhất là khóa meta được sử dụng có thể được cấu hình trên hộp chạy máy chủ X, do đó máy chủ linux chạy xdm không cần bất kỳ cấu hình lại nào khi một loại nền tảng mới được giới thiệu trong thiết lập.

cách tốt nhất để làm việc này là gì? Có thể xác định nền tảng mà máy chủ X đang chạy không? Một số tùy chọn cấu hình có thể được chuyển từ Xserver sang các kịch bản quản lý cửa sổ không? Có cách nào tốt hơn để giải quyết điều này?

Câu trả lời:


1

Vấn đề cụ thể này sẽ dễ dàng giải quyết nếu bạn thiết lập ánh xạ bàn phím sao cho cùng một phím và bộ sửa đổi được gán cho phím Meta ở mọi nơi.


Bạn có thể nhận được một số thông tin về máy chủ thông qua chương trình xrdb . Máy chủ định nghĩa một số thuộc tính xrdbcó sẵn thông qua tiền xử lý. Bạn có thể in chúng ra xrdb -symbols. Ví dụ,

xrdb -Dsymbols | sed -n 's/-DSERVERHOST=//p'

in tên máy chủ của máy chủ X. Bạn có thể xác định tài nguyên cụ thể cho một máy chủ lưu trữ cụ thể với cấu trúc tiền xử lý C:

#ifdef SRVR_darkstar
…
#endif

Đây là tập lệnh shell biến các ký hiệu xrdb thành các biến môi trường shell. Sử dụng nó với một cái gì đó như eval "$(xrdb_sh_prefix=X_ xrdb-sh)".

#!/bin/sh
# Access xrdb #define's from the shell

# For each binding that xrdb(1) would give to the preprocessor, print
# NAME=VALUE for -DNAME=VALUE.
# If $xrdb_sh_export is not empty, also print "export NAME".
# If $xrdb_sh_prefix is not empty, prefix it to each NAME in output.
# Shell metacharacters are preceded by `\' in VALUEs. NAMEs are
# assumed to be admissible C identifiers.
# Example:
#   xrdb_sh_export=y xrdb_sh_prefix=X_ xrdb-sh
# outputs somthing like
#    X_SERVERHOST=drongo
#    export X_SERVERHOST
#    X_VENDOR=The\ XFree86\ Project\,\ Inc
#    export X_VENDOR
# ...
# The output of this program is typically used in a Bourne shell thus:
#   eval "`xrdb_sh_prefix=X_ xrdb-sh`"

if [ -n "$xrdb_sh_export" ]; then
  awk_export='print "export " name'
fi
awk -v prefix="$xrdb_sh_prefix" '
  /^-D/ {
    $0 = substr($0, 3)
    eq = match($0, /=/)
    name = (prefix) (eq ? substr($0, 1, eq-1) : $0)
    if (eq) {
        $0 = substr($0, eq+1)
        sub(/^\"/, ""); sub(/\"$/, "")
        gsub(/[^0-9A-Z_a-z]/, "\\\\&")
    } else {
        $0 = ""
    }
    print name "=" $0
    '"$awk_export"'
  }
  /^exit=[0-9]+$/ {sub(/^.*=/, ""); exit $0}
' <<EOF
`{ xrdb "$@" -symbols || echo exit=$?; } | $sort || echo exit=$?`
EOF

Một cách tiếp cận khác là đặt các thuộc tính tùy chỉnh trên cửa sổ gốc từ phía máy chủ, ví dụ như với xprop. Truy vấn các thuộc tính (một lần nữa với xprop) từ phía khách hàng.

xprop -set Server_arch "$(uname -m)"

Thật không may, tùy chọn thứ nhất là không nên vì tôi không thể yêu cầu người dùng thiết lập sơ đồ bàn phím của họ theo một cách nhất định chỉ cho một máy chủ này, họ sẽ kết nối với các máy chủ khác và sử dụng X cục bộ có thể bị rối hoặc yêu cầu mọi người thực hiện tất cả các loại cấu hình lại trên hộp riêng của họ hoặc trên các máy chủ khác.

@wich Bạn sẽ thiết lập sơ đồ bàn phím bằng một cuộc gọi đến xmodmaphoặc xkbhoặc cài đặt ở /etc/xorg.confphía máy chủ X.
Gilles 'SO- ngừng trở nên xấu xa'

X_SERVERHOST cũng có vẻ không ổn, đối với tôi, nó chỉ cung cấp IP của hộp chạy máy chủ X, giống như nó ở trong $ HIỂN THỊ trong môi trường. Như đã đề cập, đó là môi trường DHCP, vì vậy tôi không thể suy ra bất cứ điều gì từ chính IP.

re: keymap Chính xác, đó là điều tôi không thể yêu cầu từ mọi người, thêm một số thẻ thông tin theo bất kỳ cách nào là một điều, nhưng yêu cầu mọi người sửa đổi sơ đồ bàn phím của họ là không ổn trong môi trường này
trong

Về phần xprop, tôi chưa thể làm cho nó hoạt động được, nhưng vấn đề là máy chủ X chưa chạy trước khi X -queryđược tạo và sau đó xprop không có quyền truy cập vào hộp kết nối, xhost + <IP từ $ HIỂN THỊ> sẽ cần phải được thực thi trên hộp máy chủ hoặc một cái gì đó tương tự. Ngay cả sau đó xprop của tôi đã thất bại vì một số lý do không xác định, mà tôi vẫn chưa thể giải quyết.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.