Après de nombreuses lectures et essais et erreurs, il semble que ce qui manque lorsque vous exécutez un script en tant que root, c'est que la variable d'environnement DBUS_SESSION_BUS_ADDRESS n'est pas définie. Cela doit être défini ET l'uid modifié pour celui de l'utilisateur avant que les paramètres gconf puissent être définis. C'est mon script de test que j'ai utilisé pour l'essayer. Exécutez l'un ou l'autre des appels système à la fin pour changer l'ordre des boutons de la fenêtre. Essayez le script en tant qu'utilisateur ou en tant que root (sudo) pour voir que cela fonctionne.
#!/usr/bin/perl
use strict;
use warnings;
use POSIX;
# get the user's name (as opposed to root)
my $user_name = getlogin();
# get the uid of the user by name
my $user_uid = getpwnam($user_name);
print $user_name . ": " . $user_uid . "\n";
my %dbus;
# get the DBUS machine ID
$dbus{'machine_id'} = qx{cat /var/lib/dbus/machine-id};
chomp($dbus{'machine_id'});
# read the user's DBUS session file to get variable DBUS_SESSION_BUS_ADDRESS
$dbus{'file'} = "/home/" . $user_name . "/.dbus/session-bus/" . $dbus{'machine_id'} . "-0";
print "checking DBUS file: " . $dbus{'file'} . "\n";
if (-e $dbus{'file'}) {
open(my $fh, '<', $dbus{'file'}) or die "Cannot open $dbus{file}";
while(<$fh>) {
if (/^DBUS_SESSION_BUS_ADDRESS=(.*)$/) {
$dbus{'address'} = $1;
print "Found DBUS address: " . $dbus{'address'} . "\n";
}
}
} else {
print "cannot find DBUS file";
}
# set the uid to the user's uid not root's
POSIX::setuid($user_uid);
# set the DBUS_SESSION_BUS_ADDRESS environment variable
$ENV{'DBUS_SESSION_BUS_ADDRESS'} = $dbus{'address'};
my $command1 = 'gconftool-2 --set "/apps/metacity/general/button_layout" --type string "menu:maximize,minimize,close"';
my $command2 = 'gconftool-2 --set "/apps/metacity/general/button_layout" --type string "menu:minimize,maximize,close"';
system($command1);
## or
#system($command2);
Remarque: Vous avez de bonnes informations here.
J'ai fait quelques tests et je ne suis pas sûr que cela fonctionne, bien que cela semble certainement le cas! –
Juste nettoyer certaines choses. Encore une fois, la raison pour laquelle cela ne fonctionne pas est que la variable ENV ci-dessus n'est pas définie. Essayez 'perl -E ', dites $ <. "\ n". $ ENV {'DBUS_SESSION_BUS_ADDRESS'} '' en tant qu'utilisateur, sous 'sudo' et sous' sudo -u username' pour voir la différence –