vendredi 29 août 2008

Commit : Support des touches multimédia

Si vous utilisez comme moi un ordinateur portable similaire au DELL XPS m1530, vous avez problement aussi des touches multimédia autour de votre clavier. Moi en plus, avec mon Dell j’ai eu droit à une mini-télécommande qui me permet d’utiliser ces touches là à distance.

C’est là que je me suis dit que ça pourrait être le pied de pouvoir changer de chaîne sans avoir à bouger du lit.

Du coup, j’ai cherché comment intégrer ça à FreetuxTV. Et là je doit avouer que j’ai pensé que ça serait plus simple que ça. J’ai fouiner dans les sources de tous les programmes GTK qui supportait ça (Totem, Exaile, Listen, l’utilitaire raccourci clavier de Gnome, Gmpc…). Après moult compilation, j’ai peu à peu desespéré d’y arriver. Je trouvais des pistes mais le mécanisme étant assez compliqué, je ne comprenais rien au fonctionnement qu’utilisait ces softs. La plupart des programmes supportant cette fonction, sont écrit en Python et ne connaissant pas le langage c’était vraiment tendu.

C’est alors qu’avec obstination je suis tombé sur le plugin Rythmbox écrit en C. Et la avec beaucoup de bidouille et de chance (commenter des lignes quasi au hasard), j’ai reussi à faire un petit programme qui détectait quand j’appui sur mes touches multimédia. Vous imaginez pas la joie que j’ai ressenti sur le moment (ça m’as pris une semaine pour avoir ça).

Enfin voilà pour la petite histoire, j’ai pu épuré le code que j’avais trouvé (je ne comprend ce qui fait, mais ça marche), et j’en ai fait une petite librairie qui me permettra de facilement réutiliser ça à l’avenir. Un petit exemple pour ceux que ça interesse.

#include
#include “lib-gmmkeys.h”

static void
on_mm_key_pressed (GMMKeys *mmkeys,
GMMKeysButton button, gpointer user_data)
{
switch(button){
case GMMKEYS_BUTTON_PLAY :
break;
case GMMKEYS_BUTTON_PAUSE :
break;
case GMMKEYS_BUTTON_STOP :
break;
case GMMKEYS_BUTTON_PREV :
break;
case GMMKEYS_BUTTON_NEXT :
break;
}
}

int main (int argc, char *argv[])
{
gtk_init(&argc, &argv);

GtkWidget* window;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_show (window);

g_signal_connect (window, “destroy”, gtk_main_quit, NULL);

GMMKeys* mmkeys;
mmkeys = g_mmkeys_new (”MonApplication”);
g_mmkeys_activate (mmkeys);

g_signal_connect(G_OBJECT(mmkeys),
“mm_key_pressed”,
G_CALLBACK(on_mm_key_pressed),
NULL);

gtk_main();

g_mmkeys_deactivate (mmkeys);

return 0;
}

Pour compiler voici un Makefile (y’a besoin de dbus) :

CFLAGS = `pkg-config –cflags gtk+-2.0 x11 dbus-glib-1`
LIBS = `pkg-config –libs gtk+-2.0 x11 dbus-glib-1`
all: main.c lib-gmmkeys.o
gcc ${LIBS} ${CFLAGS} -o main main.c lib-gmmkeys.o
lib-gmmkeys.o : lib-gmmkeys.c lib-gmmkeys.h
gcc -c ${CFLAGS} lib-gmmkeys.c lib-gmmkeys.h

J’en parle parce que vu le peu d’infos que j’ai trouvé pour faire ça. Ca servira sûrement à quelqu’un un jour.

Par contre, je pense que ça ne marche que sur Gnome. J’ai pas testé, mais si y’en a qui utilise FreetuxTV sur KDE ou autres, ça serait sympa de m’informer de ce qu’il en est.

Voilà, comme toujours ceux qui veulent testé prenez les sources, et rapportez moi les bugs.

En espérant que cette fonction vous plaisent même si tout le monde ne peut pas en profiter.

2 commentaires:

  1. Bonjour,
    J'ai utilisé une autre méthode pour la télécommande avec freetuxtv :
    J'ai modifié la maquette 'glade' pour ajouter des raccourcis clavier sur les boutons 'chaine suivante', 'chaine précédente', 'plein écran', etc...
    Ensuite, avec irxevent, je transforme les touches de ma télécommande en raccourcis clavier qui vont bien...
    C'est pas top, mais ca m'a pas pris une semaine de recherches MOI ;)
    Héhé
    marcambie@gmail.com

    RépondreSupprimer
  2. Oui c'est sur c'est une solution. Mais je sais pas si les touches multimédia et toutes les télécommandes marche avec ça...

    RépondreSupprimer