Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 25/01/2021, à 14:12

DonutMan75

[RESOLU] Langage C, comment trouver l'appel d'une fonction ?

Bonjour,
je travaille sur un projet perso pour rajouter une option dans le code source de Rhythmbox qui répéterait en boucle le même morceau.

Je suis au courant :
1- qu'il existe des plugins qui font ça très bien,
2- que cela a déjà du être fait auparavant.
Néanmoins, j'aimerais y parvenir par moi même.

J'ai déjà fait une modification fonctionnelle et il me reste à ajouter le changement d'icone du bouton selon l'état (pas si simple qu'il n'y paraît parce que la construction de l'UI est assez dipsersée dans le code).

Ma question est la suivante :
le fichier rb-shell-player.c contient la fonction suivante :

static void
rb_shell_player_init (RBShellPlayer *player)
{
...
}

Je SAIS que cette fonction est appelée par main car j'y ai mis un printf() qui s'affiche.

Néanmoins, impossible de déterminer à quel endroit cet appel se fait : un find ne renvoie que la fonction elle-meme et son prototype :

$ find . -type f | xargs grep "rb_shell_player_init"
./shell/rb-shell-player.c:static void rb_shell_player_init (RBShellPlayer *shell_player);
./shell/rb-shell-player.c:rb_shell_player_init (RBShellPlayer *player)
Fichier binaire ./shell/.libs/librhythmbox-core.so.10.0.0 correspondant
Fichier binaire ./shell/.libs/librhythmbox_core_la-rb-shell-player.o correspondant

Les .so je suppose qu'ils ont été créé à la compilation et je ne m'en suis pas soucié.

Vous avez des idées ?

Merci d'avance !

Donut

Dernière modification par DonutMan75 (Le 15/02/2021, à 15:22)

Hors ligne

#2 Le 25/01/2021, à 15:55

Zakhar

Re : [RESOLU] Langage C, comment trouver l'appel d'une fonction ?

Il y a sans doute des EDI qui font ça, mais sinon tu as la bonne démarche !

N'oublie pas aussi que l'appel peut être "indirect" via un pointeur sur la fonction. lol


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#3 Le 25/01/2021, à 16:04

kamaris

Re : [RESOLU] Langage C, comment trouver l'appel d'une fonction ?

Les fonctions *_init de ce type sont appelées implicitement par GLib, ça fait partie de la construction d'un GObject, donc c'est appelé quand le *_new correspondant est explicitement appelé.
Tu peux reconsulter le lien que je t'ai donné la dernière fois à ce sujet : https://developer.gnome.org/gobject/sta … bject.html

Hors ligne

#4 Le 25/01/2021, à 17:23

DonutMan75

Re : [RESOLU] Langage C, comment trouver l'appel d'une fonction ?

Bonjour à tous les deux,

kamaris : à bah oui, c'était écrit noir sur blanc dans la page que tu m'as envoyée la dernière fois !

pas évident quand on  tente de décortiquer le code de Rhythmbox de séparer ce qui relève de la logique gtk (et donc de GLib sur lequel gtk repose) de ce qui relève de la logique Rhythmbox...
En plus gtk est pensé "orienté objet" avec un langage (le C) qui lui ne l'est pas... pas évident d'appréhender les mécanismes mis en jeu de cette façon. Mais enfin, c'est une bonne façon de progresser je trouve.

Je vais potasser la doc GLib que tu m'as passée en tout cas !
Merci pour le partage smile

A bientôt,

D.

Hors ligne

#5 Le 25/01/2021, à 17:38

kamaris

Re : [RESOLU] Langage C, comment trouver l'appel d'une fonction ?

Oui tout ça n'est pas évident, et surtout ça fait beaucoup de choses d'un coup quand on se lance là-dedans pour la première fois, même quand on est déjà familiarisé à la programmation orienté objet.

Un conseil pratique pour faciliter tes recherches dans la documentation : au lieu d'utiliser la doc en ligne comme le lien que j'ai donné ci-dessus, utilise celle que tu as en local.
Elle aura le double mérite de correspondre exactement à la version des bibliothèques installées sur ton système, et de se charger beaucoup plus vite dans ton navigateur (en évitant tout problème de connexion avec les serveurs de gnome).
Personnellement, je travaille avec toujours quatre onglets épinglés dans firefox : les listes de toutes les APIs de GTK 3, de GLib (au sens restreint), de GIO et de GObject (qui sont contenus dans le paquet GLib mais séparés du point de vue de la doc).

Chez moi ça se trouve là (peut-être à adapter chez toi) :
file:///usr/share/gtk-doc/html/gtk3/api-index-full.html
file:///usr/share/gtk-doc/html/glib/api-index-full.html
file:///usr/share/gtk-doc/html/gio/api-index-full.html
file:///usr/share/gtk-doc/html/gobject/api-index-full.html

Hors ligne

#6 Le 14/02/2021, à 17:33

LeoMajor

Re : [RESOLU] Langage C, comment trouver l'appel d'une fonction ?

gdb

et faire executer pas à pas ( il faut les paquets-dev, debug symbols, et le code source ...)

Hors ligne

#7 Le 15/02/2021, à 15:22

DonutMan75

Re : [RESOLU] Langage C, comment trouver l'appel d'une fonction ?

Bonjour à tous,
je profite de mon passage sur le fofo pour cloturer ce fil.
Grâce à vos indications, j'ai réussi à finaliser ce petit projet.
j'ai désormais une version alternative de Rhythmbox qui me permet de boucler sur une seul morceau ad nauseam !
Pas sûr d'avoir vraiment compris toutes les subtilités de GObject mais je pense avoir saisi les grandes lignes et en mimant le code initial j'ai pu me débrouiller.
Petit raffinement, j'ai même rajouté un changement dynamique de l'icone du bouton "repeter" entre les trois états (lecture standard, loop play-list et loop morceau).

Merci encore pour votre aide et vos conseils !

D.

Hors ligne