Cairo-Dock cafe | Café Cairo-Dock
nochka85, Monday 18 January 2010 à 13:03
|
|
fabounet, Monday 18 January 2010 à 14:12
|
|
Subscription date : 30 November 2007
Messages : 17118
|
pour pango je me souviens jamais
faut regarder dans la doc, mais de toute facon x et y sont petits (qques pixels), et si tu te trompes de signe tu le verras surement et tu le changeras
c'est pas un script qui renvoit ça ? pas d'idée, ça marche dans SysMonitor il me semble. |
nochka85, Monday 18 January 2010 à 19:18
|
|
Subscription date : 29 November 2007
Messages : 7408
|
c'est pas un script qui renvoit ça ? pas d'idée, ça marche dans SysMonitor il me semble.
Oups ! -> J'avais bien mis le script (et vu que la temp passait bien, je pensais que c'était bon), mais j'avais pas fait gaffe à la manière dont on lançait ce dernier dans notification.c -> Problème résolu ! |
nochka85, Monday 18 January 2010 à 22:14
|
|
Subscription date : 29 November 2007
Messages : 7408
|
quand tu parcours ta liste, tu as it qui est l'élément courant de ta liste. il suffit de garder it lorsque tu commences une nouvelle liste
it1 = it
puis tu continues à itérer avec it, et lorsque tu arrives à une nouvelle liste, tu fais it2=it, tu sais que de it1 à it2 tu es sur une même ligne.
comme ça tu peux repartir de it1 à tout moment.
pffff .... j'y arrive pas -> çà plante tout le temps quoique je fasse .... Tu pourrais pas m'aider juste pour çà ??
Voici le code sans la boucle de calcul :
for (it = myData.pTextZoneList; it != NULL; it = it->next)
{
pTextZone = it->data;
PangoFontDescription *fd = pango_font_description_from_string (pTextZone->cFont);
pango_layout_set_font_description (pLayout, fd);
pango_font_description_free (fd);
cairo_set_source_rgba (myDrawContext, pTextZone->fTextColor[0], pTextZone->fTextColor[1], pTextZone->fTextColor[2], pTextZone->fTextColor[3]);
myData.cCurrentText = g_strdup_printf ("%s",pTextZone->cText);
pango_layout_set_text (pLayout, myData.cCurrentText, -1);
pango_layout_get_pixel_extents (pLayout, &ink, &log);
cairo_move_to (myDrawContext,
myData.fCurrentX,
myData.fCurrentY);
pango_cairo_show_layout (myDrawContext, pLayout); // On dessine la ligne sur notre desklet
if (pTextZone->bEndOfLine) // On passe à la ligne du dessous
{
if (pTextZone->bNextNewLine) // Sinon, on reste sur la même ligne -> Utile pour avoir 1 zone alignée à gauche et 1 zone alignée à droite par exemple ;-)
myData.fCurrentY += log.height + myConfig.iSpaceBetweenLines;
myData.fCurrentX = iMargin + myConfig.iTextMargin;
myData.bNewLine = TRUE;
}
else // On laisse le curseur à la position actuelle
{
double w;
pango_layout_get_pixel_extents (pLayout, &ink, &log);
w = log.width + log.x;
myData.fCurrentX += w;
myData.bNewLine = FALSE;
}
}
Bref, concrètement, qu'est-ce que je dois rajouter pour faire une première passe pour chaque ligne PUIS le dessin dans la 2ème passe ?? <- Pas la peine de mettre quoique ce soit dans la 1ère passe, c'est juste pour voir comment tu boucle 2 fois chaque ligne (j'ai bien tenter de faire un it1=it PUIS it=it1 en fin de ligne, mais cela plante sur la ligne "pango_layout_set_font_description (pLayout, fd);" ) |
fabounet, Tuesday 19 January 2010 à 00:23
|
|
nochka85, Tuesday 19 January 2010 à 12:56
|
|
Subscription date : 29 November 2007
Messages : 7408
|
Merci ! Je teste çà dès ce soir |
nochka85, Tuesday 19 January 2010 à 19:40
|
|
Subscription date : 29 November 2007
Messages : 7408
|
Bon, cela semble marcher ! ... enfin à 1 détail près -> Il ne m'affiche pas le tout premier texte (pas la ligne .... juste la première zone de texte de mon .xml ) ... Bref, il faut que je lui mette une zone "bidon" au début de mon fichier pour pouvoir tout voir |
nochka85, Tuesday 19 January 2010 à 21:31
|
|
Subscription date : 29 November 2007
Messages : 7408
|
Bon, bah en fait, je n'y comprends RIEN DU TOUT ... Voilà mon code pour l'instant (j'ai mis plein de debug pour essayer de comprendre le chemin emprunté) :
if (myData.pTextZoneList != NULL)
{
GList *it = myData.pTextZoneList;
TextZone *pTextZone;
GList *it1 = it, *it2;
gboolean bFirstPass=TRUE;
double fCurrentLineWidth = 0; double fCurrentLineHeight = 0;
for (it = myData.pTextZoneList; it != NULL; it = it->next)
{
pTextZone = it->data;
PangoFontDescription *fd = pango_font_description_from_string (pTextZone->cFont);
pango_layout_set_font_description (pLayout, fd);
pango_font_description_free (fd);
cairo_set_source_rgba (myDrawContext, pTextZone->fTextColor[0], pTextZone->fTextColor[1], pTextZone->fTextColor[2], pTextZone->fTextColor[3]);
myData.cCurrentText = g_strdup_printf ("%s",pTextZone->cText);
cd_debug ("WriteThis-debug-lines : ----------------------> myData.cCurrentText 0 = %s", myData.cCurrentText);
pango_layout_set_text (pLayout, myData.cCurrentText, -1);
pango_layout_get_pixel_extents (pLayout, &ink, &log);
if (bFirstPass) {
fCurrentLineWidth += log.width; if (fCurrentLineHeight = 0 || (log.height + log.y) > fCurrentLineHeight) fCurrentLineHeight = log.height + log.y;
cd_debug ("WriteThis-debug-lines : ----------------------> myData.cCurrentText 1 = %s", myData.cCurrentText);
if (pTextZone->bEndOfLine)
cd_debug ("WriteThis-debug-lines : ----------------------> Fin de la ligne 1");
if (pTextZone->bEndOfLine) {
it2 = it; it = it1; bFirstPass=FALSE;
cd_debug ("WriteThis-debug-lines : ----------------------> myData.cCurrentText 2 = %s", myData.cCurrentText);
cd_debug ("WriteThis-debug-lines : ----------------------> FIN DE LA LIGNE - Taille total 2 = %d", fCurrentLineWidth);
}
else
{
cd_debug ("WriteThis-debug-lines : ----------------------> myData.cCurrentText 3 = %s", myData.cCurrentText);
cd_debug ("WriteThis-debug-lines : ----------------------> fCurrentLineWidth 3 = %d", fCurrentLineWidth);
}
}
else {
PangoFontDescription *fd = pango_font_description_from_string (pTextZone->cFont);
pango_layout_set_font_description (pLayout, fd);
pango_font_description_free (fd);
cairo_set_source_rgba (myDrawContext, pTextZone->fTextColor[0], pTextZone->fTextColor[1], pTextZone->fTextColor[2], pTextZone->fTextColor[3]);
myData.cCurrentText = g_strdup_printf ("%s",pTextZone->cText);
pango_layout_set_text (pLayout, myData.cCurrentText, -1);
pango_layout_get_pixel_extents (pLayout, &ink, &log);
cairo_move_to (myDrawContext,
myData.fCurrentX,
myData.fCurrentY);
pango_cairo_show_layout (myDrawContext, pLayout); if (pTextZone->bEndOfLine) {
if (pTextZone->bNextNewLine) myData.fCurrentY += log.height + myConfig.iSpaceBetweenLines;
myData.fCurrentX = iMargin + myConfig.iTextMargin;
}
else {
double w;
pango_layout_get_pixel_extents (pLayout, &ink, &log);
w = log.width + log.x;
myData.fCurrentX += w;
}
if (pTextZone->bEndOfLine) {
bFirstPass = TRUE;
cd_debug ("WriteThis-debug-lines : ----------------------> LIGNE DESSINEE");
}
}
}
}
... et voilà le .xml utilisé :
<code>
<zone>
<font>Sans 5</font>
<br/>
</zone>
<!-- Version du Noyau -->
<zone>
<align>left</align>
<font>Terminal Bitstream Vera Sans Mono 8</font>
<red>0,6</red>
<green>0,4</green>
<blue>0,9</blue>
<alpha>1,0</alpha>
<txt>Version du Noyau : </txt>
</zone>
<zone>
<font>Terminal Bitstream Vera Sans Mono Bold 8</font>
<red>0,6</red>
<green>0,4</green>
<blue>0,9</blue>
<alpha>1,0</alpha>
<cmd>uname -r</cmd>
<br/>
</zone>
</code>
... et voilà ce que me renvoit le debug :
WriteThis-debug-lines : ----------------------> myData.cCurrentText 0 = (null)
WriteThis-debug-lines : ----------------------> myData.cCurrentText 1 = (null)
WriteThis-debug-lines : ----------------------> Fin de la ligne 1
WriteThis-debug-lines : ----------------------> myData.cCurrentText 2 = (null)
WriteThis-debug-lines : ----------------------> FIN DE LA LIGNE - Taille total 2 = 0
WriteThis-debug-lines : ----------------------> myData.cCurrentText 0 = Version du Noyau :
WriteThis-debug-lines : ----------------------> myData.cCurrentText 0 = 2.6.31-18-generic
WriteThis-debug-lines : ----------------------> LIGNE DESSINEE
Bref, y'a rien qui marche
A L'AIIIDDDDEEE !!!! JE VAIS CRAAAAQQQUUUEEERRRR !!! |
matttbe, Tuesday 19 January 2010 à 22:07
|
|
Subscription date : 24 January 2009
Messages : 12573
|
Un bon site pour te remettre d'aplomb : http://perdu.com/
Ou si tu cherches une excuse:netcat bofh.jeffballard.us 666 Ou l'amusement Geek:sudo apt-get install sl && sl |
nochka85, Wednesday 20 January 2010 à 12:43
|
|
Subscription date : 29 November 2007
Messages : 7408
|
@fab: un petit up sur mon soucis ? |
lylambda, Wednesday 20 January 2010 à 13:12
|
|
matttbe, Wednesday 20 January 2010 à 14:03
|
|
Subscription date : 24 January 2009
Messages : 12573
|
lylambda : Par contre, je n'ai pas compris le premier Tu as une série d'excuses (données au hasard), par exemple : $ netcat bofh.jeffballard.us 666
=== The BOFH-style Excuse Server --- Feel The Power!
=== By Jeff Ballard <ballard@cs.wisc.edu>
=== See http://www.cs.wisc.edu/~ballard/bofh/ for more info.
Your excuse is: Webmasters kidnapped by evil cult.
Mais n'oublions pas : @fab: un petit up sur mon soucis ? |
fabounet, Wednesday 20 January 2010 à 14:34
|
|
Subscription date : 30 November 2007
Messages : 17118
|
en fait je me demande s'il ne faudrait pas définir une balise <line> ?
les propriétés d'alignement seraient alors définies pour une ligne (donc plus de conflit possible entre 2 zones ayant des alignements incompatibles)
du coup plus besoin de <br> aussi.
Edit : le probleme est là :
it = it1; // on revient au debut de la ligne.
car après tu as le it=it->next, donc en fait il faudrait dire it = it1->prev;, sauf que si tu es en début de liste il n'y a pas de prev ...
bref, ma méthode n'est pas top, je dirais qu'il serait peut-être plus simple de faire clairement 2 sous-boucles à l'intérieur de la boucle principale.
for (it=list;it!=NULL;it=it->next)
{
it1=it;
boucle sur it de it1 jusqu'à retour chariot => line_width
boucle sur it de it1 jusqu'à retour chariot => dessin
// a ce niveau, it pointe sur la zone qui contient un retour chariot. le "for" va nous faire passer a la suite.
} |
nochka85, Wednesday 20 January 2010 à 21:41
|
|
Subscription date : 29 November 2007
Messages : 7408
|
en fait je me demande s'il ne faudrait pas définir une balise <line> ?
les propriétés d'alignement seraient alors définies pour une ligne (donc plus de conflit possible entre 2 zones ayant des alignements incompatibles)
En fait, je ne comptais lire le contenu de la balise align QUE SI le booléen bNewLine était à TRUE ... autrement dit, cela n'aurait d'influence QUE SI on spécifie l'alignement dans la première zone de texte d'une ligne !
.... mais bon, pourquoi pas ... en plus, cela permettrait de clarifier un peu le code du .xml ! ... parce que là, c'est un peu "bordélique" !
... bref, cela me plairait même plus, mais par contre, comment je fais pour mettre (et lire) plusieurs fois la même balise dans la même zone ????
Exemple :
<code>
<line>
<zone>
...
</zone>
<zone>
...
</zone>
<zone>
...
</zone>
</line>
<line>
<zone>
...
</zone>
<zone>
...
</zone>
<zone>
...
</zone>
</line>
</code>
... ou je dois lire x fois "zone" entre la balise line ???
PS : Pour info, à l'heure actuelle, j'ai ce code :
g_return_val_if_fail (myConfig.cXmlFilePath != NULL, FALSE);
xmlInitParser ();
xmlDocPtr pXmlFile;
xmlNodePtr pXmlMainNode;
pXmlFile = cairo_dock_open_xml_file (myConfig.cXmlFilePath, "code", &pXmlMainNode, NULL);
g_return_val_if_fail (pXmlFile != NULL && pXmlMainNode != NULL, FALSE);
xmlAttrPtr ap;
xmlChar *cAttribute, *cNodeContent, *cTextNodeContent;
TextZone *pTextZone = NULL;
xmlNodePtr pXmlNode;
int i;
for (pXmlNode = pXmlMainNode->children, i = 0; pXmlNode != NULL; pXmlNode = pXmlNode->next, i ++)
{
if (xmlStrcmp (pXmlNode->name, (const xmlChar *) "zone") == 0)
{
pTextZone = g_new0 (TextZone, 1);
myData.pTextZoneList = g_list_append (myData.pTextZoneList, pTextZone);
...
xmlNodePtr pXmlSubNode;
for (pXmlSubNode = pXmlNode->children; pXmlSubNode != NULL; pXmlSubNode = pXmlSubNode->next)
{
cNodeContent = xmlNodeGetContent (pXmlSubNode);
...
xmlFree (cNodeContent);
}
}
}
cairo_dock_close_xml_file (pXmlFile);
... pour lire ce xml :
<code>
<zone>
...
</zone>
<zone>
...
</zone>
<zone>
...
</zone>
</code>
du coup plus besoin de <br> aussi.
Tant que j'ai toujours mon <nbr> (si vous avez un autre nom à me proposer) qui me permet d'écrire plusieurs lignes au même endroit ! <- Pour par exemple avoir une zone alignée à gauche + une autre centrée + une autre alignée à droite ... et le tout sur la même ligne |
fabounet, Thursday 21 January 2010 à 10:37
|
|
Subscription date : 30 November 2007
Messages : 17118
|
avoir une zone alignée à gauche + une autre centrée + une autre alignée à droite
pour ça y'a pas le choix je pense, il faut pouvoir spécifier l'alignement dans la zone de texte.
le coup de la ligne c'est pas forcément nécessaire, pour rendre ton code actuel plus lisible je pense que tu devrais sortir le br de la zone de texte.
après le pseudo-code que je t'ai donné plus haut devrait faire l'affaire. |
nochka85, Friday 22 January 2010 à 21:08
|
|
Subscription date : 29 November 2007
Messages : 7408
|
Bon, y'a vraiment rien à faire -> çà fait 2 soirs de suite que je bloque complètement (soit çà n'affiche rien, soit çà plante )
... Voilà où j'en suis (= avec un beau desklet tout vide ) ... Pourtant j'ai (je crois) fait ce que tu disais, mais rien à faire :
for (it = myData.pTextZoneList; it != NULL; it = it->next)
{
it1=it;
// boucle sur it de it1 jusqu'à retour chariot => line_width
for (it = it1 ; pTextZone->bEndOfLine ; it = it->next)
{
pTextZone = it->data;
PangoFontDescription *fd = pango_font_description_from_string (pTextZone->cFont);
pango_layout_set_font_description (pLayout, fd);
pango_font_description_free (fd);
cairo_set_source_rgba (myDrawContext, pTextZone->fTextColor[0], pTextZone->fTextColor[1], pTextZone->fTextColor[2], pTextZone->fTextColor[3]);
myData.cCurrentText = g_strdup_printf ("%s",pTextZone->cText);
pango_layout_set_text (pLayout, myData.cCurrentText, -1);
pango_layout_get_pixel_extents (pLayout, &ink, &log);
if (pTextZone->bEndOfLine) // retour chariot => fin de ligne.
{
myData.fCurrentLineWidth += log.width;
cd_debug ("WriteThis-debug-lines ----------------> Fin de calcul de la ligne -> Taille de la ligne = %d", myData.fCurrentLineWidth);
}
else
myData.fCurrentLineWidth += log.width;
}
// boucle sur it de it1 jusqu'à retour chariot => dessin
for (it = it1 ; pTextZone->bEndOfLine ; it = it->next)
//~ for (it = myData.pTextZoneList; it != NULL; it = it->next) // SI JE DESACTIVE TOUT CE QU'IL Y A AU DESSUS ET QUE J'ACTIVE CETTE LIGNE, MON TEXTE S'AFFICHE
{
pTextZone = it->data;
PangoFontDescription *fd = pango_font_description_from_string (pTextZone->cFont);
pango_layout_set_font_description (pLayout, fd);
pango_font_description_free (fd);
cairo_set_source_rgba (myDrawContext, pTextZone->fTextColor[0], pTextZone->fTextColor[1], pTextZone->fTextColor[2], pTextZone->fTextColor[3]);
myData.cCurrentText = g_strdup_printf ("%s",pTextZone->cText);
pango_layout_set_text (pLayout, myData.cCurrentText, -1);
pango_layout_get_pixel_extents (pLayout, &ink, &log);
cairo_move_to (myDrawContext,
myData.fCurrentX,
myData.fCurrentY);
pango_cairo_show_layout (myDrawContext, pLayout); // On dessine la ligne sur notre desklet
if (pTextZone->bEndOfLine) // On passe à la ligne du dessous
{
if (pTextZone->bNextNewLine) // Sinon, on reste sur la même ligne -> Utile pour avoir 1 zone alignée à gauche et 1 zone alignée à droite par exemple ;-)
myData.fCurrentY += log.height + myConfig.iSpaceBetweenLines;
myData.fCurrentX = iMargin + myConfig.iTextMargin;
}
else // On laisse le curseur à la position actuelle
{
double w;
pango_layout_get_pixel_extents (pLayout, &ink, &log);
w = log.width + log.x;
myData.fCurrentX += w;
}
}
... Pour l'instant, je n'essaies même pas de faire quelque chose dans la zone de calcul -> J'essaies juste de revenir à mon dessin correctement
Je suis sûr que c'est un truc évident, mais franchement, je n'y vois plus rien |
matttbe, Friday 22 January 2010 à 21:11
|
|
Subscription date : 24 January 2009
Messages : 12573
|
Viens sur IRC nochka, il y a du monde (qui pourront p-ê t'aider de surcroit ) |
fabounet, Friday 22 January 2010 à 22:16
|
|
Subscription date : 30 November 2007
Messages : 17118
|
if (myData.pTextZoneList == NULL)
return;
it = myData.pTextZoneList;
do
{
it1=it;
do // boucle sur it de it1 jusqu'à retour chariot => line_width
{
pTextZone = it->data;
PangoFontDescription *fd = pango_font_description_from_string (pTextZone->cFont);
pango_layout_set_font_description (pLayout, fd);
pango_font_description_free (fd);
pango_layout_set_text (pLayout, pTextZone->cText, -1);
pango_layout_get_pixel_extents (pLayout, &ink, &log);
myData.fCurrentLineWidth += log.width;
it = it->next;
} while (it != NULL && ! pTextZone->bEndOfLine);
// boucle sur it de it1 jusqu'à retour chariot => dessin
it = it1;
do // boucle sur it de it1 jusqu'à retour chariot => line_width
{
pTextZone = it->data;
/// dessin...
it = it->next;
} while (it != NULL && ! pTextZone->bEndOfLine);
}
while (it != NULL); |
nochka85, Friday 22 January 2010 à 22:46
|
|
Subscription date : 29 November 2007
Messages : 7408
|
@Fab : Voici l'applet en l'état ->
http://dl.free.fr/tNaoyxM7U
... et voici un .xml assez complet qui me cause les 50% de CPU bouffé : http://dl.free.fr/tMqa6bbcl
... Il faut (pour l'instant) que tu fasses pointé le .xml dans la config de l'applet |
nochka85, Saturday 23 January 2010 à 13:13
|
|
Subscription date : 29 November 2007
Messages : 7408
|
Oups, je t'ai pas filé le bon .xml -> http://dl.free.fr/twiblImaB (il est assez complet avec l'heure + uptime + divers mesures, etc...)
EDIT : Au fait, j'ai aussi un soucis pour récupérer la taille de la ligne dans la 1ère partie du code :
si je mets çà :
myData.fCurrentLineWidth += log.width;
cd_debug ("WriteThis-debug-lines ----------------> ligne en cours -> Taille = %d", myData.fCurrentLineWidth);
, cela me renvoit tout le temps 0
EDIT 2: Bon, j'ai rien dit ... avec :
cd_debug ("WriteThis-debug-lines ----------------> ligne en cours -> Taille = %f", myData.fCurrentLineWidth);
, cela marche beaucoup mieux
EDIT 3: Bon, contrairement à ce que je disais hier, la double boucle n'a pas d'influence sur le CPU (aujourd'hui, je reste à 25% ... et pas 50% comme hier). Bref, y'a surement un truc autre qui tournait hier soir !
Donc, je veux bien que tu jettes un coup d'oeil pour voir pourquoi çà consomme autant (je pense que c'est le thread) ... mais je vais pouvoir essayer d'avancer en parrallèle pour me faire une fonction de mise en page
Par contre, je sais plus comment je fais pour connaître la largeur actuelle du desklet ? |
Cairo-Dock cafe | Café Cairo-Dock
|