Legen Sie den Metaschlüssel des Fenstermanagers abhängig vom verbundenen Xserver fest

7

Situation

Auf einem Linux-Server wird ein XDM ausgeführt, das XDMCP unterstützt. Über einen X -query <server>Befehl wird über XDMCP eine Verbindung zu verschiedenen Linux- und OS X-Boxen hergestellt .

Sobald der Benutzer angemeldet ist, wird der Fenstermanager gestartet, der meist über die Tastatur mit einer zugewiesenen Metataste gesteuert wird.

Problem

Der zugewiesene Metaschlüssel muss von der Plattform der Box abhängen, die eine Verbindung zum Linux-Server herstellt. Wie finde ich heraus, welche Plattform sich hinter dem verbundenen X-Server befindet?

Gedanken

Ich kann die Umgebungsvariable DISPLAY nicht zum Einschalten verwenden. Die IPs der Verbindungsboxen werden von DHCP zugewiesen und geben keinen Hinweis auf die Plattform der Box.

Ich weiß, dass die Option -class auf X verwendet werden kann, um die Anzeigeklasse festzulegen, die dann verwendet werden kann, um Standardeinstellungen für die verschiedenen Anzeigeklassen in Xresources festzulegen. Ich weiß jedoch nicht, wie ich die Klasse des verbundenen Xservers über die Befehlszeile (oder ein kleines benutzerdefiniertes C-Programm) abrufen kann, und außerdem weiß ich nicht, wie ich den Wert einer Xresource abrufen kann, die mit dieser Klasse konfiguriert werden würde .

Idealerweise kann der verwendete Metaschlüssel auf der Box konfiguriert werden, auf der der X-Server ausgeführt wird, sodass der Linux-Server, auf dem der xdm ausgeführt wird, keine Neukonfiguration benötigt, wenn im Setup ein neuer Plattformtyp eingeführt wird.

Was ist der beste Weg, um dies zu erreichen? Ist es möglich, die Plattform zu bestimmen, auf der der X-Server ausgeführt wird? Kann eine Konfigurationsoption vom Xserver an die Fenstermanager-Skripte übergeben werden? Gibt es einen besseren Weg, um dies zu lösen?

welche
quelle

Antworten:

1

Dieses spezielle Problem ist leicht zu lösen, wenn Sie Tastaturzuordnungen so einrichten, dass der Meta-Taste überall dasselbe Keysym und Modifikator zugewiesen wird.


Sie können einige Informationen über den Server über das Programm xrdb erhalten . Der Server definiert eine Eigenschaft, die xrdbdurch Vorverarbeitung verfügbar gemacht wird. Sie können sie mit ausdrucken xrdb -symbols. Zum Beispiel,

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

Gibt den Hostnamen des X-Servers aus. Mit C-Vorverarbeitungskonstrukten können Sie bestimmte Ressourcen für einen bestimmten Serverhost definieren:

#ifdef SRVR_darkstar
…
#endif

Hier ist ein Shell-Skript, das xrdb-Symbole in Shell-Umgebungsvariablen umwandelt. Verwenden Sie es mit so etwas wie 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

Ein anderer Ansatz wäre, benutzerdefinierte Eigenschaften im Stammfenster von der Serverseite aus festzulegen, z. B. mit xprop. Fragen Sie diese Eigenschaften (erneut mit xprop) von der Clientseite ab.

xprop -set Server_arch "$(uname -m)"
Gilles 'SO - hör auf böse zu sein'
quelle
Leider ist Option 1 ein No-Go, da ich nicht verlangen kann, dass Benutzer ihre Keymap auf eine bestimmte Weise nur für diesen einen Server einrichten. Sie stellen eine Verbindung zu anderen Servern her und verwenden ihr X lokal, was zu Problemen führen oder von Personen verlangt werden kann alle Arten der Neukonfiguration auf ihren eigenen Boxen oder auf den anderen Servern.
Weicht
@wich Sie würden die Keymap durch einen Aufruf von xmodmapoder xkboder eine Einstellung /etc/xorg.confauf der X-Serverseite einrichten .
Gilles 'SO - hör auf böse zu sein'
Der X_SERVERHOST scheint ebenfalls ein No-Go zu sein. Für mich gibt er nur die IP-Adresse der Box an, auf der der X-Server ausgeführt wird, genau wie in $ DISPLAY in der Umgebung. Wie bereits erwähnt, handelt es sich um eine DHCP-Umgebung, sodass ich aus der IP selbst nichts ableiten kann.
Weicht
re: keymap Genau, das ist es, was ich nicht von Menschen verlangen kann, das Hinzufügen einiger Info - Tag in welcher Art und Weise ist eine Sache, aber die Leute ihre keymap ändern zu fragen ist in diesem Umfeld nicht in Ordnung
Wich
Was xpropkonnte ich es noch nicht arbeiten, aber von der Seite , dass das Problem ist , dass der X - Server noch nicht ausgeführt wird , bevor das X -querygemacht wird, und danach xprop Zugriff nicht auf dem Anschlusskasten hat, ein xhost + <IP aus $ DISPLAY> müsste auf der Serverbox oder ähnlichem ausgeführt werden. Selbst dann ist mein xprop aus einem unbekannten Grund ausgefallen, den ich noch nicht lösen konnte.
Weicht