pátek 25. března 2011

(Ne)pořádek v Gnome Panelu při změnách rozlišení

Gnome Panel je fajn záležitost, dá se na něj nacpat kde co, ale při změně rozlišení obrazovky se jeho obsah strašně rád přemisťuje z místa na místo. Pokud měníte rozlišení častěji, ať už proto, že používáte více monitorů, nebo spouštíte nějaký fullscreen program v jiném, než nativním rozlišení, máte možnost buď neustále uklízet, nebo se na to vykašlat a koukat na ten bordel. Ručně to stále přemisťovat nehodlám, druhá možnost mě přestala bavit, a tak jsem napsal skript, který to udělá za mě..
Poslední update 28.3.11 - doplnění skriptů

Applety a další objekty, které máte umístěny na panelu, mají svou konfiguraci v GConfu, tedy centrální databázi nastavení Gnome. Odtud můžete jednoduše číst, nebo sem naopak zapisovat hodnoty pomocí konzolového nástroje gconftool-2, nebo grafické aplikace gconf-editor.
Vzhledem k tomu, že střídavě přepínám mezi dvěma monitory s různým rozlišením, dojde vždy po přepnutí k rozházení osazenstva panelu. Můj nápad byl tedy takový, že si uložím nastavení pro obě obrazovky a při přepnutí monitoru načtu nastavení panelu pro dané rozlišení. Skripty pro uložení i nastavení panelu, jsem napsal tak, aby si zjistili pomocí xrandr aktuální rozlišení obrazovky a podle toho použily správný konfigurační soubor. Tyto soubory ukládám do adresáře ~/.gnome2/panel-order/ a vždy nesou jméno odpovídající rozlišení displeje, ke kterému patří (např. 1920x1200).

save-panel.sh (uloží nastavení panelu)
#!/bin/bash

# save positions of gnome panel objects/applets
# for current screen resolution
# author: GdH

_FILE=`xrandr -q|grep \*|awk '{print $1}'`
if [ `echo $_FILE | wc -w` -ne 1 ]; then echo 'error: just one display must be in use..'; exit 1; fi
_PATH="$HOME/.gnome2/panel-order"
[ -d $_PATH ] || mkdir $_PATH

gconftool-2 --all-dirs /apps/panel/applets /apps/panel/objects|while read LINE
  do
    echo $LINE
    gconftool-2 --get "$LINE/position" 2>&1
    gconftool-2 --get "$LINE/panel_right_stick" 2>&1
  done > /dev/shm/save-panel

if grep "No value" /dev/shm/save-panel; then echo 'error while reading gconf..'; exit 1; fi
mv /dev/shm/save-panel $_PATH/$_FILE
[ $? -gt 0 ] || echo "panel configuration saved to:
$_PATH/$_FILE"
exit 0

set-panel.sh (obnoví nastavení panelu)
#!/bin/bash

# restore positions of gnome panel objects/applets
# for current screen resolution
# author: GdH

_FILE=`xrandr -q|grep \*|awk '{print $1}'`
_PATH="$HOME/.gnome2/panel-order"

if [ -f $_PATH/$_FILE ]; then
  cat $_PATH/$_FILE|while read OBJECT
    do
      read POSITION; read STICK
      if gconftool-2 --dir-exists="$OBJECT"; then
        gconftool-2 --type int --set $OBJECT/position $POSITION
        gconftool-2 --type bool --set $OBJECT/panel_right_stick $STICK
      fi
    done
else
  echo "error: no config file.."
  exit 1
fi
pkill gnome-panel
exit 0

Objekty panelu jsou v GCconfu ve dvou adresářích, rozdělené na applety a objekty. Do konfiguračního souboru se ukládají pro každý applet, i objekt tři řádky, kde první je cesta, druhý pozice (klíč position) a třetí obsahuje informaci, zda je pozice počítána zprava, místo zleva (klíč panel_right_stick). Skript set-panel.sh pro každý klíč kontroluje, zda objekt, kterému patří existuje, aby nevytvářel nesmyslné klíče, pokud jste mezitím z panelu něco odstranili. Aby se nastavení panelu projevilo, je potřeba panel restartovat, to je ve skriptu zajištěno zabitím panelu - Gnome si ho automaticky spustí znovu. Skript save-panel.sh je dobré spouštět vždy když na panel něco přidáte, nebo z něj něco odeberete, i když v druhém případě nebude mít neaktuální konfigurační soubor žádný negativní dopad, jak jsem v předešlé větě vysvětlil.

Předpokládám, že na většině Gnome systémů by tyto skripty měly fungovat správně. Já to psal a testoval na Ubuntu 10.10 s grafickým driverem Catalyst 11.2 a na 10.04 s ovladačem radeon, i nvidia.

Žádné komentáře:

Okomentovat

Zkuste prosím při komentováni používat místo volby Anonymní volbu Název/adresa URL, kde vyplníte nějakou přezdívku, adresu zadávat nemusíte. Vědět, které příspěvky jsou od jednoho člověka, je fajn. Díky.

Pokud by se vám náhodou odeslaný komentář na stránce nezobrazil, vytáhnu ho z koše hned jak si toho všimnu. I Google spam filter se občas sekne.