Deblan blog

i3wm - barre de status

Il y a quelques semaines, j'ai changé de gestionnaire de fenêtres sur ma Debian. De Fvwm-crystal (que je recommande beaucoup) à i3wm, j'ai un full tiling manager et c'est vraiement nickel.

J'ai fais quelques lignes de code pour modifier la barre de status et je vais les paratager.

i3wm status bar

Mais avant tout, on va configurer le minimum vital pour que ça fonctionne :

Dans le bloc bar { ... } de votre fichier de configuration, remplacez status_command i3status par status_command ~/.i3/i3status.sh.

~/.i3/i3status.sh doit contenir :

#!/bin/sh

php ~/.i3/i3status.php

i3status | while read LINE; do
	php ~/.i3/i3status.php
done

Vous l'aurez remarqué, j'ai décidé d'utiliser du php. Pour ceux que ça ne dérange pas et qui n'ont pas encore le nécessaire :

$ su -
# aptitude update
# aptitude install php5

Il ne reste plus que de placer dans ~/.i3/i3status.php le code suivant :

<?php
// J'ai des soucis d'encodage sur le blog, le code avec les caractères en utf8 sont dispos ici : http://wall.deblan.fr/x10a/php/1/

define('SEPARATOR', ' # ');

render(
	get_the_notification(), 
	get_ips(array('eth0', 'wlan0')), // indiquez les interfaces susceptibles d'être utilisées et dont vous voulez connaître les IP (si elles en ont)
	get_the_acpi(),
	get_the_date()
);


/**
 *
 * IP
 *
 */
function get_ips($ifaces=array()) {
	$ips = array();
	foreach($ifaces as $iface) {
		preg_match('`inet ([^\s]+)`', shell_exec('ip addr show '.escapeshellcmd($iface)), $inet);

		if($inet) {
			$ips[] = '['.$iface.'] '.$inet[1];
		}
	}

	return implode(SEPARATOR, $ips);;
}

function ips() {
	echo get_ips();
}


/**
 *
 * Notification
 *
 */
function get_the_notification() {
	$final = '';

	if(file_exists($file=getenv('HOME').'/.i3/notification')) {
		$info = json_decode(file_get_contents($file));

		if($info->count == 15) {
			unlink($file);
		}
		else {
			$info->count++;

			file_put_contents(
				$file, 
				json_encode($info)
			);

			$message = '['.$info->title.'] '.$info->message;

			$final.= $message;
		}
	}

	return $final;
}

function the_notification() {
	echo get_the_notification();
}


/**
 *
 * Date
 *
 */
function get_the_date() {
	return date('H:i:s'.SEPARATOR.'d/m/Y');
}

function the_date() {
	echo get_the_date();
}

/**
 *
 * Acpi
 *
 */
function get_the_acpi() {
	$acpi = shell_exec('acpi');

	if(!preg_match('`Discharging`', $acpi)) {
		preg_match('`([0-9]+%)`', $acpi, $values);

		if(!empty($values)) {
			$charging = $values[1];
			return $charging.'?';
		}

		return '';
	}
	
	preg_match('`([0-9]+%), ([0-9]+:[0-9]+)`', $acpi, $values);

	$charging = $values[1].'?';
	$times    = str_replace(':', 'h', $values[2]);

	return implode(' ', array($charging, $times));
}

function the_acpi() {
	echo get_the_acpi();
}


/**
 *
 * Render
 *
 */
function get_the_render($values) {
	foreach($values as $k => $v) {
		if(empty($v)) {
			unset($values[$k]);
		}
	}

	return implode(SEPARATOR, $values).SEPARATOR;
}

function render() {
	echo get_the_render(func_get_args());
}

J'ai un système de notification qui permet de faire ça :

i3wm status bar

Voici le script qui permet de générer la notification :

#!/usr/bin/php5
<?php

$file = getenv('HOME').'/.i3/notification';

$info = array(
	'title'   => $argv[1],
	'message' => $argv[2],
	'count'   => 0
);

file_put_contents(
	$file, 
	json_encode($info)
);
/chemin/vers/le/script titre "Je suis une notification"

Terminé :)



Ajouter un commentaire

Vous pouvez utiliser du markdown.Afficher l'aide.