Tag Archives: Fluxbox

Control Pulseaudio from Shell

As you know I mainly use Fluxbox on a minimal Ubuntu installation without access to all the every-day functionality provided by panel applets in Gnome, including volume control. Therefore, I have been using pavucontrol for controlling Pulseaudio. It is a really nice application that gives you very finegrained control, for instance over which application should be how loud. Lately I have been annoyed with opening a whole application just for the sake of adjusting volume a little bit, so I set out to find a way to control it via shell. Turns out there is no convenient interface to pulseaudio at all, leaving me to script something together, this time in Ruby. It uses a very unwieldy interface to Pulseaudio named pacmd, contained in Ubuntu package pulseaudio-utils.

#!/usr/bin/ruby
def current
  c = IO::popen("pacmd \"list-sinks\" | grep volume | head -1").readlines[0]
  return c.split(" ").last.sub("%", "").strip.to_i
end

def max
  c = IO::popen("pacmd \"list-sinks\" | grep \"volume steps\" | head -1").readlines[0]
  return c.split(" ").last.strip.to_i - 1
end

def index
  c = IO::popen("pacmd \"list-sinks\" | grep index | head -1").readlines[0]
  return c.split(" ").last.strip.to_i
end

def set(v)
  IO::popen("pacmd \"set-sink-volume #{index} #{v}\"").readlines
end

def muted
  c = IO::popen("pacmd \"list-sinks\" | grep muted | head -1").readlines[0]
  return c.split(" ").last.strip == "yes"
end

def toggle
  t = 1
  if ( muted )
    t = 0
  end
  IO::popen("pacmd \"set-sink-mute #{index} #{t}\"").readlines
end

interval = 5

if ( ARGV.size == 0 )
  puts current
elsif (ARGV[0] == "?" )
  puts muted
elsif ( ARGV[0] == "+" )
  set([current + interval, 100].min * (max / 100.0).round)
elsif ( ARGV[0] == "-" )
  set([current - interval, 0].max * (max / 100.0).round)
elsif ( ARGV[0] == "!" )
  toggle
end

This is certainly not the most efficient way to do it, retrieving all the info multiple times, but it works and I do not perceive any delays. Note that the script will just use the first sink that pacmd prints, so if you have a setup with multiple sinks you will have to be more clever.

Of course, the obligatory Fluxbox key bindings

None XF86AudioLowerVolume :execCommand pavol -
None XF86AudioRaiseVolume :execCommand pavol +
None XF86AudioMute :execCommand pavol !

and conky volume display:

Vol: ${exec if [ `pavol ?` != 'true' ]; then echo `pavol`%; else echo 'Muted'; fi}

Update: The script now has a home on GitHub.

Screenshots mit Fluxbox

Versucht man unter Fluxbox einen Screenshot zu machen und drückt wie gewohnt auf die Taste Print, passiert genau nichts. Ich habe das folgende Skript geschrieben, das Abhilfe schafft:

#!/bin/bash

name="screen_`date +"%d-%m-%Y-%H:%M"`.png";

# Take the screenshot
scrot -q 85 ~/$name;

# Load it into a viewer/editor
display -geometry 1100x700 ~/$name &

Für display, das zu ImageMagick gehört, habe ich mich nicht entschieden, weil es so eine Augenweide wäre, sondern weil es ein schlankes Programm mit einer Fülle an Funktionen ist. Ein Linksklick auf das Bild lässt ein Menüfenster erscheinen. So ist es direkt möglich, den gerade gemachten Screenshot zurechtzuschneiden, zu skalieren und rotieren und in einem der üblichen Formate abzuspeichern. Grundsätzlich kann hier natürlich jedes beliebige Bildanzeige- oder -verarbeitungsprogramm benutzt werden.

Durch die Namenswahl des Originalbildes ist sichergestellt, dass Screenshots nicht überschrieben werden, so sie nicht allzu schnell aufeinander folgen. Sollte das gewählte Minutenraster nicht ausreichen, kann man durchaus Sekunden oder noch kleinere Einheiten hinzunehmen. Die Hilfe von date hilft diesbezüglich weiter.

Um das Skript unter Fluxbox noch an die richtige Taste zu binden, die folgende Zeile mit passendem Pfad in ~/.fluxbox/keys einfügen:

None Print :execCommand ~/bin/screenshot

Tastaturbelegung wechseln mit Fluxbox

Wer eine Fremdsprache lernt oder einfach lieber mit amerikanischer Tastenbelegung programmiert, muss regelmäßig sein Tastaturlayout verstellen. Während GNOME ein entsprechendes Applet für das Panel mitbringt, sieht es bei Fluxbox erstmal mau aus. Ich habe mir ein Skript geschrieben, das durch mehrere Tastaturlayouts rotiert und visuelles Feedback dafür liefert. Ist keines der angegebenen Layouts gesetzt, wird das erste gewählt.

#!/bin/bash
layouts=(
 "de"    "German"    "de.png"
 "se"    "Swedish"    "se.png"
);
errimg="error.png";

current=`
 setxkbmap -print |
 grep xkb_symbols |
 awk '{print $4}' |
 awk -F"+" '{print $2}'`;
next=0;

for (( i = 0 ; i < (${#layouts[@]}/3) ; i++ )) do
  if [ $current = ${layouts[$i*3]} ]; then
    next=($i+1)%${#layouts[@]/3};
  fi
done

return=`setxkbmap ${layouts[3*$next]} 2>&1`;

if [ ${#return} -gt 0 ]; then
  notify-send -i ${errimg}\
                      "Failed Setting Layout ${layouts[3*$next]}"\
                      "$return";
else
  notify-send -i ${layouts[3*$next + 2]}\
                     "Switched Keyboard Layout"\
                     "${layouts[3*$next + 1]}";
fi

Um weitere Layouts hinzuzufügen, müssen in das Array layouts je drei Strings eingefügt werden; der erste bezeichnet das Layout, der zweite ist der Ausgabestring und der dritte ist der Pfad zum entsprechenden Icon. Will man etwa auf das Bild verzichten, unbedingt einen leeren String angeben, da sonst die Indexberechnung schief läuft. Eine Auswahl an Layoutbezeichnern kann zum Beispiel hier gefunden werden.

Zu schwedischem Layout und zurück

Als Quelle muss ich diesen Post erwähnen. Eine kommentierte Fassung gibt es hier. Natürlich müssen die Pfade zu Bildern angepasst und die genannten Pakete installiert werden. Das Skript sollte grundsätzlich mit allen Window Managern funktionieren. Um es (unter Fluxbox) ohne Terminal oder fbrun ausführen zu können, kann man es natürlich mittels an ein Tastaturkürzel binden, in dem man in  ~/.fluxbox/keys etwa diese Zeile einfügt:

Mod1 F3 :execCommand ~/bin/switchkbl

Nachtrag: Die nötigen Pakete unter Ubuntu sind: setxkbmap, awk, libnotify-bin

[PLR] Betriebssystem – Konfiguration

Nach der Basisinstallation wollte Fluxbox eingerichtet werden. Hier bedarf es einiger Eingewöhnungszeit, nach der die konsequente Einfachheit schnelle Anpassungen über eine Hand voll Konfigurationsdateien zulässt. Ich habe mich von dieser und dieser Seite und vermutlich einigen mehr, die ich nicht notiert habe, unterstützen lassen. Alle nötigen Dateien liegen im Homeverzeichnis des Nutzers und dort im Ordner .fluxbox. Die wichtigsten sind keys, menu und startup. In keys findet sich eine komplette Auflistung der Keybindings von Fluxbox, die man beliebig erweitern kann. Die Syntax ist etwas pingelig, sodass ich Recherche oder die Verwendung des Programms fluxkeys empfehle. Ich habe ein paar Zeilen hinzugefügt; die verwendeten Skripte liefere ich in späteren Beiträgen.

# Ausschnitt aus ~/.fluxbox/keys
Mod1 F1 :execCommand xfce4-terminal
Mod1 F2 :Exec fbrun
Mod1 F3 :execCommand ~/bin/switchkbl
Control Mod1 Left :prevWorkspace
Control Mod1 Right :nextWorkspace
None Print :execCommand ~/bin/screenshot
Mod4 c :execCommand mpc toggle
Mod4 x :execCommand mpc prev
Mod4 v :execCommand mpc next

Ein mögliches Menü

In der Datei menu ist das Hauptmenü definiert, das man erhält, wenn man einen Rechtsklick auf freie Fläche tätigt. Im Prinzip ist jede beliebige Struktur möglich. Einige Standardmenüs und so nette Dinge wie Wallpaper Chooser sind mit eigenen Tags fest vorgesehen. Man kann aber beliebige Kommandos ausführen lassen. Eine komplette Liste der möglichen Elemente gibt es hier. Meine Version ist rechts zu sehen; insbesondere ist vielleicht erwähnenswert, wie man über das Menü den Rechner herunterfahren kann, denn das darf eigentlich nur root. Hier hilft gksu, das den Nutzer graphisch nach dem Sudopasswort fragt. Für Details verweise ich auf meine menu.

startup ist ein Shellscript, das nach dem Login ausgeführt wird. In dieser Datei starte ich alle Daemons, die ich so brauche, was man vermutlich besser mit Skripten in init.d abwickelte; meine Änderungen belaufen sich auf Folgendes:

# Ausschnitt aus ~/.fluxbox/startup
PATH=~/bin:"${PATH}"
numlockx on
synergys --daemon -c ~/.synergyconf
deluged
conky -d
mpd
mpdscribble
deluge -u web &
synergyc --daemon -n Charly localhost

Damit Fluxbox Wallpaper ordentlich setzen kann, braucht es ein geeignetes Hilfsprogramm. Aus einer Reihe möglicher solcher habe ich mich für feh entschieden. Benutzt man nun das spezielle Wallpapermenü, setzt Fluxbox den gewählten Wallpaper immer wieder beim Login.

Um dem Moloch Firefox ein bisschen unter die trägen Arme zu greifen, bin ich einem Tip gefolgt, der eigentlich zur Schonung von SSDs gedacht ist. Das Verzeichnis /tmp wird in den RAM gelegt und Firefox so konfiguriert, dass er seinen Cache dort ablegt. Ich halte das auch und besonders für Systeme mit Festplatten für eine gute Idee.

Mod1 F3 :execCommand ~/bin/switchkbl