Mot-clé - C

Fil des billets

samedi 31 janvier 2015

Jouons un peu avec la bibliothèque garcon (Xfce)

En ce moment, je découvre la bibliothèque garcon [1] du projet Xfce.

Comme je débute, le premier programme est relativement simple. Il affiche les applications présentes dans le menu. Il va analyser le fichier xfce-applications.menu présent dans $XDG_MENU_PREFIX pour rechercher les fichiers .desktop. Le résultat peut être différent en fonction des logiciels installés sur votre système.

Pour pouvoir l'utiliser il vous faut les fichiers d'en-tête pour GLib et bien évidemment garcon.

La ligne de commande que j'utilise sous FreeBSD (j'utilise encore gcc comme compilateur).

$ gcc -Wall xfce-menu.c -o xfce-menu `pkgconf --cflags --libs glib-2.0 garcon-1` -lc
$ ./xfce-menu

 * xfce4-run.desktop
----
 * exo-terminal-emulator.desktop
 * exo-file-manager.desktop
 * exo-mail-reader.desktop
 * exo-web-browser.desktop
----
Settings
 * xfce-settings-manager.desktop
----
 * xfce4-accessibility-settings.desktop
[...]
System
 * Thunar-bulk-rename.desktop
 * xfce4-taskmanager.desktop
 * Thunar.desktop
 * xterm.desktop
 * xfce4-terminal.desktop
----
 * xfce4-about.desktop
 * xfce4-session-logout.desktop

Si l'on souhaite utiliser la fonction xfce_menu_items2 () la sortie est différente, les fichiers .desktop sont suivis des catégories.

$ ./xfce-menu

xfce4-run.desktop X-Xfce-Toplevel;X-XFCE;Utility;
exo-terminal-emulator.desktop X-Xfce-Toplevel;X-XFCE;Utility;
exo-file-manager.desktop X-Xfce-Toplevel;X-XFCE;Utility;
exo-mail-reader.desktop X-Xfce-Toplevel;X-XFCE;Network;
exo-web-browser.desktop X-Xfce-Toplevel;X-XFCE;Network;
xfce-settings-manager.desktop DesktopSettings;Settings;X-XFCE;
xfce4-accessibility-settings.desktop X-XFCE-SystemSettings;X-XFCE-SettingsDialog;DesktopSettings;Settings;GTK;XFCE;
xfce-ui-settings.desktop X-XFCE-PersonalSettings;X-XFCE-SettingsDialog;DesktopSettings;Settings;GTK;XFCE;
[...]
Thunar.desktop FileManager;FileTools;GTK;Core;Utility;System;
xterm.desktop TerminalEmulator;System;
xfce4-terminal.desktop TerminalEmulator;System;GTK;
xfce4-about.desktop X-Xfce-Toplevel;X-XFCE;Utility;
xfce4-session-logout.desktop X-Xfce-Toplevel;X-XFCE;System;

Maintenant, il nous reste plus qu'à utiliser un GtkTreeView widget pour afficher le tout dans une fenêtre.

Note

[1] C'est un portage des spécifications définit par le consortium Freedesktop.org pour définir l'agencement d'un menu.

samedi 7 juin 2014

Exemples d'utilisation de la fonction sysctlbyname ()

Dans ce billet, nous allons voir comment afficher certaines informations obtenues avec la fonction sysctlbyname(3).

Exemple n°1

/sbin/sysctl vfs.usermount
vfs.usermount: 1

En C, on peut écrire un programme relativement simple (sysctl-01.c), qui va afficher uniquement le résultat.

gcc sysct-01.c -o sysctl-01 -Wall -W -lc
./sysctl-01
1

Exemple n°2

Si l'on souhaite afficher une chaîne de caractères.

/sbin/sysctl kern.ostype
kern.ostype: FreeBSD

Avec le programme sysctl-02.c, on procède de la manière suivante :

gcc sysct-02.c -o sysctl-02 -Wall -W -lc
./sysctl-02
FreeBSD

Exemple n°3

Maintenant, si plusieurs valeurs doivent être affichées.

/sbin/sysctl hw.acpi.supported_sleep_state
hw.acpi.supported_sleep_state: S3 S4 S5

Le programme sysctl-03.c affiche ces informations de cette manière :

gcc sysct-03.c -o sysctl-03 -Wall -W -lc
./sysctl-03
S3
S4
S5

Exemple n°4

Au lieu d'avoir une chaîne de caractères, on a une série d'entiers.

/sbin/sysctl kern.cp_times
kern.cp_times: 889624 1836 116735 3507 4424229

Le programme sysctl-04.c affiche tout ceci, de cette façon :

gcc sysct-04.c -o sysctl-04 -Wall -W -lc
./sysctl-04
Values: 889624 1836 116735 3507 4424229
Max: 4424229

Voilà, on peut désormais s'inspirer de ces exemples, pour apporter des patches aux programmes trop orientés Linux.

vendredi 3 janvier 2014

Déterminer le nom du pays à partir de la locale du système

En ce moment je travaille sur le portage d'une application pour FreeBSD. Comme elle fait appel à des fonctions qui ne sont pas disponibles sous ce système, je passe par l'analyse des fichiers iso-codes [1] mis à notre disposition par Debian.

Il s'agit de mon premier programme en C, donc soyez indulgent.

J'utilise les bibliothèques suivantes :

Pour le compiler, il faut définir une variable (par exemple ISO_CODES_PREFIX), qui va nous servir de macro [2].

ISO_CODES_PREFIX=`pkgconf --variable=prefix iso-codes`
gcc -Wall -DISO_CODES_PREFIX=\"$ISO_CODES_PREFIX\" `pkgconf --cflags --libs glib-2.0 gio-2.0 libxml-2.0` locales.c -o locales

Note : Si pkgconf n'est pas disponible, essayez pkg-config.

Après compilation, on obtient une liste avec la locale suivi du nom du pays. Cela me sert pour renforcer les tests pour mon patch.

[...]
eu_ES.ISO8859-1 Spain
eu_ES.ISO8859-15 Spain
eu_ES.UTF-8 Spain
fi_FI.ISO8859-1 Finland
fi_FI.ISO8859-15 Finland
fi_FI.UTF-8 Finland
fr_BE.ISO8859-1 Belgium
fr_BE.ISO8859-15 Belgium
fr_BE.UTF-8 Belgium
fr_CA.ISO8859-1 Canada
fr_CA.ISO8859-15 Canada
fr_CA.UTF-8 Canada
fr_CH.ISO8859-1 Switzerland
fr_CH.ISO8859-15 Switzerland
fr_CH.UTF-8 Switzerland
fr_FR.ISO8859-1 France
fr_FR.ISO8859-15 France
fr_FR.UTF-8 France
he_IL.UTF-8 Israel
hi_IN.ISCII-DEV India
[...]

Notes

[1] Certains logiciels du projet GNOME utilisent le même procédé.

[2] Reportez-vous à cette page du wiki pour plus de détail.