Home Forums Wiki Doc Install Extras Screenshots Source Code Projects Blog Users Groups Register
Glx-Dock / Cairo-Dock List of forums Cairo-Dock cafe | Café Cairo-Dock Le vrai post sur l'apprentissage de dbus et de python + 3615 ma vie
The latest stable release is the *3.4.0* : How to install it here.
Note: We just switched from BZR to Git on Github! (only to host the code and your future pull requests)
Cairo-Dock cafe | Café Cairo-Dock

Subjects Author Language Messages Last message
[Locked] Le vrai post sur l'apprentissage de dbus et de python + 3615 ma vie
Page : 1 2 3 4 5 6 7
taiebot65 Français 138 taiebot65 [Read]
16 May 2010 à 20:46

fabounet, Monday 31 August 2009 à 02:53


Subscription date : 30 November 2007
Messages : 17118
Taiebot pour écouter et parler au bus, regarde dans demo.py, il ya tout ce qu'il faut.
tu peux parler et écouter le dock et Pidgin de la même façon, seuls les chemins sur le bus et les noms des interfaces changent.
tu auras donc 2 interfaces (iface_dock et _iface_pidgin), avec des callbacks et des appels sur chaque, le but du jeu étant de faire :
je reçoit X de pidgin => je balance une action sur le dock
je reçois Y du dock (clic ou autre) => je fais une action en conséquence.

PS : pour parser son fichier de conf en python je sais pas comment faire, au pire un simple sed peut faire l'affaire, sinon voir dans glib version python

ppmt, Monday 31 August 2009 à 05:01


Subscription date : 29 November 2007
Messages : 3520
mais si ca peut se lancer comme un fichier bash

en haut du fichier tu mets:

#!/usr/bin/env python

tu rends le fichier executable et roulez poulette

nochka85, Monday 31 August 2009 à 10:21


Subscription date : 29 November 2007
Messages : 7408
merci

EDIT : @Fab -> Tu pourrais nous faire le même petit programme démo en bash ?

taiebot65, Monday 31 August 2009 à 10:36


Subscription date : 26 October 2008
Messages : 1904
On abandonnerai le C ..... Nochka?

taiebot65, Monday 31 August 2009 à 11:40


Subscription date : 26 October 2008
Messages : 1904
Ok Quelques questions sur le script demo... Veuillez derouler pour pouvoir repondre merci... Ok pas la peine j'ai trouve....
Mais alors des questions plus generales pkoi tu fais toujours
if "cModulename" != "test":
return
print "une action"

Ah oui comment on fait un appel je vois bien les callbacks sur la demo mais les appels?


#! /usr/bin/env python
### We assume the name of this applet is "test"
### It is installed in a directory, like for instance ~/test.
### This script should be placed in this folder, alongside with 2 files :
### "icon" (the default icon of the applet) and "preview" (a preview of this applet)

### import ###
import sys
import gobject
import glib
import gtk
import dbus
import os
.path
from dbus
.mainloop.glib import DBusGMainLoop


### callbacks ###
def action_on_click(cModuleName,iState):  #a quoi sert le istate !!! et il vient d'ou?
    
if cModuleName != "test":
        return
    print 
"clic !"

def action_on_middle_click(cModuleName):
    if 
cModuleName != "test":
        return
    print 
"middle clic !"

def action_on_build_menu(cModuleName):
    if 
cModuleName != "test":
        return
    print 
"build menu !"
    
bus dbus.SessionBus()
    
remote_object bus.get_object("org.cairodock.CairoDock""/org/cairodock/CairoDock")
    
iface dbus.Interface(remote_object"org.cairodock.CairoDock")
    
iface.PopulateMenu("test", ["choice 1""choice 2"])
    
del iface
    del remote_object
    del bus
    
def action_on_menu_select
(cModuleName,iNumEntry):  #de meme pour istate ? d'ou vient ce num entry? je suppose que c'est celui d'au dessus
    
if cModuleName != "test":
        return
    print 
"choice",iNumEntry,"has been selected !"
    

def action_on_init(cModuleName):
    if 
cModuleName != "test":
        return
    print 
"our module is started"
    
def action_on_stop(cModuleName):
    if 
cModuleName != "test":
        return
    print 
"our module is stopped"
    
def action_on_reload(cModuleNamebConfigHasChanged):
    if 
cModuleName != "test":
        return
    print 
"our module is reloaded"
    
if bConfigHasChanged:
        print 
" and our config has changed"
    

### init ###
def init():
    
# let's connect to the dock.
    
DBusGMainLoop(set_as_default=True)
    
bus dbus.SessionBus()
    try:
        
remote_object bus.get_object("org.cairodock.CairoDock",
                
"/org/cairodock/CairoDock")
    
except dbus.DBusException:
        print 
"Cairo-Dock not found on bus (did you activate its 'DBus' plug-in ?)"
        
return
    
iface dbus.Interface(remote_object"org.cairodock.CairoDock")
    
    
# let's register our applet !
    
iface.RegisterNewModule("test"3"This is a distant applet\nIt handles right and middle click\n  by Fabounet"os.path.abspath("."))
    
    
# register to the notifications on our applet    # Si j'ai plusieurs applets comment il fait la difference?
    
iface.connect_to_signal("on_click_icon"action_on_click)
    
iface.connect_to_signal("on_middle_click_icon"action_on_middle_click)
    
iface.connect_to_signal("on_build_menu"action_on_build_menu)
    
iface.connect_to_signal("on_menu_select"action_on_menu_select)
    
iface.connect_to_signal("on_init_module"action_on_init)
    
iface.connect_to_signal("on_stop_module"action_on_stop)
    
iface.connect_to_signal("on_reload_module"action_on_reload)
    
    
# a little test
    
iface.ShowDialog("I'm connected to Cairo-Dock !"4"None""None""test")
    
iface.SetQuickInfo("123""None""None""test")
    
    
# clean up memory
    
del iface
    del remote_object
    del bus


### stop ###    #a quoi ca set ca??
def stop():
    print 
"STOP"
    
bus dbus.SessionBus()
    
remote_object bus.get_object("org.cairodock.CairoDock""/org/cairodock/CairoDock")
    
iface dbus.Interface(remote_object"org.cairodock.CairoDock")
    
iface.UnregisterModule("test")
    
del iface
    del remote_object
    del bus
    

### main ###
if __name__ == '__main__':
    
init()
    
gtk.main()
    
stop()
    
sys.exit(0)


nochka85, Monday 31 August 2009 à 12:06


Subscription date : 29 November 2007
Messages : 7408
On abandonnerai le C ..... Nochka?


Non, mais pour des plugins "simples", je pense que cela peut être pas mal en bash ou en python

... D'ailleurs, à ce propos Fab, çà pourrait être sympa (lorsqu'un dossier où coller les plugins externes existera ) de transformer les 2 applets Show-desktop et Show-desklets en plugins externes (1 en python et 1 en bash ). Et ce pour 2 raisons :
      • Ces 2 applets font un peu "usine à gaz" en C vu leur simplicité et sont tout à fait adaptées à çà ! ... et en plus, cela allègerait le code
      • Cela ferait 2 exemples "concrets" (un en python et un en bash) pour les futurs développeurs


Qu'en penses tu ?

taiebot65, Monday 31 August 2009 à 13:15


Subscription date : 26 October 2008
Messages : 1904
Dans l'exemple demo comment fais tu pour voir sur quel icone on a clique?

Si je comprends bien iface.connect_to_signal("on_click_icon", action_on_click)

action on click
rappelle le callback du debut...

def action_on_click(cModuleName,iState):
if cModuleName != "test":
return
print "clic !"


Mais cModuleName sera toujours different de "test" puisque = "on_click_icon"

Je ne suis pas tres bien la logique...

taiebot65, Monday 31 August 2009 à 13:21


Subscription date : 26 October 2008
Messages : 1904
Ah je crois comprendre tu peux ecouter plusieurs truc a la fois donc je pourrais ecouter l'applet meteo en faisant au debut

def action_on_click(cModuleName,iState):
if cModuleName != "test":
print "clic !"
else cModuleName != "Weather":
print "rate mauvais applet!!"
return

taiebot65, Monday 31 August 2009 à 13:29


Subscription date : 26 October 2008
Messages : 1904
Ben non ca marche pas invalid syntax.. dur dur la vie de codeur..

matttbe, Monday 31 August 2009 à 13:50


Subscription date : 24 January 2009
Messages : 12573
else cModuleName != "Weather":
Beuurk
Dans les conditions, si tu mets un If, seuls peuvent suivent elseif ou else ou rien (=> si c'est ça (if + condition), ou si c'est ça (elseif + condition), sinon (else : si aucunes des conditions précédentes) c'est ça.

Je te conseille le numéro 27 du Full Circle Magasine : http://fullcircle-mag.fr/index.php?pages/publications
La suite n'est dispo pour le moment qu'en En : http://fullcirclemagazine.org/issue-28/

ppmt, Monday 31 August 2009 à 14:42


Subscription date : 29 November 2007
Messages : 3520
matttbe a raison...tu ne peux pas faire un test avec else vu que le test a deja ete fait avec if....il faut utiliser elif a la place

En fait ce qui manque dans Python ce une fonction case...ca resoudrait ton probleme...vu que ca n'existe pas tu te retrouves a utiliser if et elif

taiebot65, Monday 31 August 2009 à 14:46


Subscription date : 26 October 2008
Messages : 1904
Ok j'ai trouver pour elif mais ca repond pas a ma 1ere question pkoi fab utilise un != "Test" alors que ca devrait etre == "Test" non ? si y a plusieurs signaux a regarder comment il fait?

J'essaie avec ca mais ca marche pas..


def action_on_click
(cModuleName,iState):
    if 
cModuleName == "test":
        print 
"clic !"
    
elif cModuleName != "test":
        print 
"Rate mauvais applet"
        
return



Edit merci Nohka du codage des conneaux ...

nochka85, Monday 31 August 2009 à 14:48


Subscription date : 29 November 2007
Messages : 7408
si y a plusieurs signal a regarder


signaux

ppmt, Monday 31 August 2009 à 14:55


Subscription date : 29 November 2007
Messages : 3520
si je comprends la function tu recuperes le nom du module et son etat.

Puis si le modules n'est pas "test" tu quittes la fonction sinon tu imprimes clic. Fabounet fais un test inverse. C'est comme ca un Dieu....ca essaye de perturber tout le monde

qu'est ce qui ne marche pas dans ton cas?

taiebot65, Monday 31 August 2009 à 14:58


Subscription date : 26 October 2008
Messages : 1904
Ben j'essaie de voir si je peux recuperer le signal d'un autre module mais je pense que ce n'est pas possible....
dans le genre j'ai un sous dock nomme Pidgin si je clique dessus je m'attends a voir "Rate mauvais applet" mais je viens de relire on peut avoir que le signal des modules crees donc on oublie tout ...

fabounet, Monday 31 August 2009 à 15:06


Subscription date : 30 November 2007
Messages : 17118
en fait Show-desktop est plus compliquée qu'il n'y parait, regarde le code
(car il y'a le clic-milieu aussi
en fait c'est trop simple pour une bonne démo (c'est pratiquement juste un lanceur)
je pensais plus à Dustbin par exemple (par contre, sans moniteur, juste avec un boucle)
ou bien toutes les applets lisant dans /proc (System-Monitor, netspeed, etc)
par contre je sais pas faire de boucle en python

tu as raison pour if cModuleName != "test"
ça sert à vérifier que c'est bien pour nous
sauf que seule les applets DBus sont concernées
je vais essayer de mieux cloisonner les signaux mais en attendant faut faire comme ça.

taiebot65, Monday 31 August 2009 à 17:08


Subscription date : 26 October 2008
Messages : 1904
Allez je vous presente ma version 0.000000000000001 de mon plugin c'est pas qu'il aura plein de version mais comme je suis plus au stade de l'apprentissage qu'autres choses j'essaie de faire ca bien...

Bon il vous faut creer un sous-dock Pidgin avant de commencer..Pour voir des icones sans icones et sans nom ...LOL

et apres lancer mon programme dans un terminal sinon il marche pas ... du moins vous verrez rien

bien sur vous pouvez m'aider en me disant pkoi j'arrive pas a afficher mes icones je crois que c'est une histoire de call back et de string..


#!/usr/bin/env python
### import ###
import sys
import gobject
import glib
import gtk
import dbus
from dbus
.mainloop.glib import DBusGMainLoop

    
#On va activer Pidgin et ecouter son interface.
def init():
    
# let's connect to the dock.
    
DBusGMainLoop(set_as_default=True)
    
bus dbus.SessionBus()
    try:
        
remote_object bus.get_object("im.pidgin.purple.PurpleService",
                
"/im/pidgin/purple/PurpleObject")
    
except dbus.DBusException:
        print 
"Pidgin not found on bus (did you activate its 'DBus' plug-in ?)"
        
return
    
purple dbus.Interface(remote_object"im.pidgin.purple.PurpleInterface")    

# On recupere son statut
    
current purple.PurpleSavedstatusGetType(purple.PurpleSavedstatusGetCurrent())
    print 
current


# ON RECUPERE LES COMPTES
    
for acctID in purple.PurpleAccountsGetAllActive():

# ON recupere tous les BUddies en fonction des comptes...
        
buddies purple.PurpleFindBuddies(acctID,"")

        for 
buddyid in buddies:

            
#groupid = purple.PurpleBuddyGetGroup(buddyid)

            # get initial data
            #alias = purple.PurpleBuddyGetAlias(buddyid)
                
name purple.PurpleBuddyGetName(buddyid)
            
#online = purple.PurpleBuddyIsOnline(buddyid)
            #group = purple.PurpleGroupGetName(groupid)
                
icon purple.PurpleBuddyGetIcon(buddyid)
                print 
name
                remote2_object 
bus.get_object("org.cairodock.CairoDock",
                
"/org/cairodock/CairoDock")
                
iface dbus.Interface(remote2_object"org.cairodock.CairoDock")
                
iface.CreateLauncherFromScratch("icon""name""none""Pidgin")
    
del purple
    del remote_object
    del bus
    
### main ###
if __name__ == '__main__':
    
init()
    
gtk.main()
    
stop()
    
sys.exit(0)        
            


ppmt, Monday 31 August 2009 à 17:50


Subscription date : 29 November 2007
Messages : 3520
tu as bien creer un fichier qui s'appele icon dans ton repertoire?

taiebot65, Monday 31 August 2009 à 17:56


Subscription date : 26 October 2008
Messages : 1904
Ben non icon et name c ce que j'ai recuperer sur Pidgin .....Il devrait me creer un nouveau launcher avec l'image de mon contact et son nom pour l'instant il me cree les nouveaux launchers mais pas d'icones et pas de nom non plus...

ppmt, Monday 31 August 2009 à 20:02


Subscription date : 29 November 2007
Messages : 3520
oh I see....dans ce cas essaye ca

iface.CreateLauncherFromScratch(icon, name, "none", "Pidgin")

Cairo-Dock cafe | Café Cairo-Dock

Subjects Author Language Messages Last message
[Locked] Le vrai post sur l'apprentissage de dbus et de python + 3615 ma vie
Page : 1 2 3 4 5 6 7
taiebot65 Français 138 taiebot65 [Read]
16 May 2010 à 20:46


Glx-Dock / Cairo-Dock List of forums Cairo-Dock cafe | Café Cairo-Dock Le vrai post sur l'apprentissage de dbus et de python + 3615 ma vie Top

Online users :

Powered by ElementSpeak © 2007 Adrien Pilleboue, 2009-2013 Matthieu Baerts.
Dock based on CSS Dock Menu (Ndesign) with jQuery. Icons by zgegball
Cairo-Dock is a free software under GNU-GPL3 licence. First stable version created by Fabounet.
Many thanks to TuxFamily for the web Hosting and Mav for the domain name.