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 21/12/2009, à 21:03

kevlar

[résolu]Programmer des bulles d'aide style Ubuntu 9.x

Bonjour à tous !

J'ai observé que sous Ubuntu,  depuis la 9.04 nous avons de superbes bulles d'aides, liées aux tâches en cours, qui s'affichent depuis la zone de notification. La nouveauté, c'est qu'elles utilisent la transparence, donc une sorte de canal alpha. Je pense donc qu'elles sont faites à partir de Cairo.
Faire une bulle d'aide à la mano sous Cairo, je sais, mais ce que je ne sais pas faire, c'est préserver l'arrière plan pour faire, au besoin, disparaître la bulle d'aide ... sad

Le pire c'est que je connais les tootips de Gtk, mais je ne vois pas comment les faire apparaître où je veux et dans le style voulu sur l'écran.

Voilà, si une bonne âme passe par là, et a la solution ou une piste, je serais vraiment très heureux ... smile

Dernière modification par kevlar (Le 23/12/2009, à 15:55)

Hors ligne

#2 Le 22/12/2009, à 01:22

mika

Re : [résolu]Programmer des bulles d'aide style Ubuntu 9.x

Tu devrais aller voir chez macslow, le gars touche bien sa bille avec cairo. De nombreux exemples sont à télécharger.

Intéresse toi plus particulièrement à la catégorie cairo (et à son notify-osd) même si y a des exemples sympathiques un peu partout.

Dernière modification par mika (Le 22/12/2009, à 01:22)


Pinard m'a tueR (in vino veritas ?)
Cherche logiciel pour tagger ses vinyles.

Hors ligne

#3 Le 22/12/2009, à 10:05

kevlar

Re : [résolu]Programmer des bulles d'aide style Ubuntu 9.x

merci pour la réponse,  mais son blog semble un peu "bloqué". Sinon, j'ai également vu les exemples classiques d'horloges Cairo, mais elles s'appuient sur une fenêtre Gtk transparente. Or, il me faut écrire des informations sur une fenêtre Gtk d'arrière-plan qui est en "plein écran" (fullscreen), donc je ne peux mettre une fenêtre transparente par dessus sans minimiser la fenêtre sous-jacente.

Hors ligne

#4 Le 23/12/2009, à 15:32

kevlar

Re : [résolu]Programmer des bulles d'aide style Ubuntu 9.x

Problème résolu : on utilise les fonctions Cairo+Pango pour l'affichage des "bulles d'aides évoluées", voici un extrait de code :

void rendertext_alpha(cairo_t *cr,int xm, int ym,gchararray texte,int char_size, GdkColor pp, GdkColor ap, gdouble alpha)
{
   PangoLayout *layout;// layout for a paragraph of text
   PangoRectangle ink_rect;
   PangoRectangle logical_rect;
   PangoFontDescription *desc; 
   gchar *str;
	
   str=g_strdup_printf("Sans Bold %d",char_size);
   layout = pango_cairo_create_layout(cr);// init pango layout ready for use
   pango_layout_set_text(layout, texte, -1);// sets the text to be associated with the layout (final arg is length, -1
   cairo_set_source_rgba(cr, (gdouble)(pp.red/65535.0), (gdouble)(pp.green/65535.0), (gdouble)(pp.blue/65535.0),alpha);
  /* afficher le texte à la position */
   cairo_move_to(cr,xm,ym);
   desc = pango_font_description_from_string(str);// specify the font 
   pango_layout_set_font_description(layout, desc);// assign the previous font description to the layout
   pango_font_description_free(desc);// free the description
   /* calculer la bounding box pour tracer l'arrière-plan */
   pango_layout_get_pixel_extents(layout,&ink_rect,&logical_rect);
   /* tracer l'arrière plan */
   cairo_set_source_rgba(cr, (gdouble)(ap.red/65535.0), (gdouble)(ap.green/65535.0), (gdouble)(ap.blue/65535.0),alpha);
   cairo_rectangle(cr,xm-2,ym-2,logical_rect.width+4,logical_rect.height+4);
   cairo_fill(cr);
   
   pango_layout_set_text(layout, texte, -1);// sets the text to be associated with the layout (final arg is length, -1
   cairo_set_source_rgba(cr, (gdouble)(pp.red/65535.0), (gdouble)(pp.green/65535.0), (gdouble)(pp.blue/65535.0),alpha);
  /* afficher le texte à la position */
   cairo_move_to(cr,xm,ym);	// obligatoire !
   pango_cairo_update_layout(cr, layout); // if the target surface or transformation properties of the cairo instance
   // have changed, update the pango layout to reflect this
   pango_cairo_show_layout(cr, layout);// draw the pango layout onto the cairo surface
   g_object_unref(layout);	// free the layout
   g_free(str);
/* cadre autour du rectangle */
   cairo_set_source_rgb(cr,65535.0,65535.0,65535.0); /* blanc*/
   cairo_move_to(cr,xm-2,ym-2);
   cairo_line_to(cr,xm+logical_rect.width+2,ym-2);
   cairo_line_to(cr,xm+logical_rect.width+2,ym+logical_rect.height+2);
   cairo_line_to(cr,xm-2,ym+logical_rect.height+2);
   cairo_line_to(cr,xm-2,ym-2);
   cairo_stroke(cr);
}

puis, on utilise les fonctions Gdk orientées vers les pixbufs pour stocker en mémoire la zone de dessin sur laquelle va s'afficher la bulle d'aide :

/*****************************************************
  sauvegarder une portion
  d'écran dans un pixbuf
 win : fenêtre dont on veut sauvegarder une zone
 x,y : coin supérieur gauche de la zone
 w,h : largeur, hauteur de la zone
 retourne un pointeur sur un GdkPixbuf
attention à déréférencer après usage !
******************************************************/
GdkPixbuf *save_zone(GtkWidget *win,gint x, gint y, gint w, gint h)
{
 GdkPixbuf *pb;

 pb = gdk_pixbuf_get_from_drawable(NULL,
                                   GDK_DRAWABLE(win->window),
                                   NULL, x, y, 0, 0, w, h);
 return pb;
}

et on restaure l'écran dans son état initial ainsi :

/*****************************************************
  ramener une portion
  d'écran depuis un pixbuf
 win : fenêtre dont on veut restaurer une zone
 x,y : coin supérieur gauche de la zone de la fenêtre
 w,h : largeur, hauteur de la zone
  pb : GdkPixbuf contenant la zone à restaurer
attention à déréférencer après usage !
******************************************************/
void restore_zone(GtkWidget *win,gint x, gint y, gint w, gint h, GdkPixbuf *pb)
{

  gdk_draw_pixbuf(GDK_DRAWABLE(win->window),
                  NULL,
                  pb,
                  0,0,
                  x,y,
                  -1,-1,
                  GDK_RGB_DITHER_NONE,
                  0,0);  
}

Hors ligne

#5 Le 23/12/2009, à 18:12

kevlar

Re : [résolu]Programmer des bulles d'aide style Ubuntu 9.x

voici ce que cela donne : ma bulle d'aide, avec un canal alpha à 75 %, affiche un chronomètre au dessus d'une application de Présentation :
091223051909427113.png

Dernière modification par kevlar (Le 23/12/2009, à 18:13)

Hors ligne

#6 Le 23/12/2009, à 21:53

mika

Re : [résolu]Programmer des bulles d'aide style Ubuntu 9.x

Ben bravo, t'as pensé à clutter ? J'ai jamais essayé mais il parait évident qu'on peut aussi faire des trucs sympas avec.


Pinard m'a tueR (in vino veritas ?)
Cherche logiciel pour tagger ses vinyles.

Hors ligne

#7 Le 23/12/2009, à 22:01

kevlar

Re : [résolu]Programmer des bulles d'aide style Ubuntu 9.x

en fait, je ne connais pas Clutter ? C'est compatible avec le C ?:|

Edit : Clutter se fonde sur OpenGl, donc je fais l'impasse (je n'utilise que Gdk/Gtk/Cairo)

Dernière modification par kevlar (Le 23/12/2009, à 22:10)

Hors ligne

#8 Le 23/12/2009, à 22:15

mika

Re : [résolu]Programmer des bulles d'aide style Ubuntu 9.x

C'est sectaire non  ? big_smile Ma foi ça me tente de tater du clutter.
A plus sur le forum.


Pinard m'a tueR (in vino veritas ?)
Cherche logiciel pour tagger ses vinyles.

Hors ligne

#9 Le 23/12/2009, à 22:52

kevlar

Re : [résolu]Programmer des bulles d'aide style Ubuntu 9.x

même pas : je fais en sorte que mes programmes puisent tourner sur de petites configs' wink
A+ et bon courage !:)

Hors ligne