GNOME panel kisalkalmazás + cairo probléma

Sziasztok,
a közelmúltban megpróbáltam írni egy kisalkalmazást a GNOME panelhez. Az applet felületét Cairo-val szerettem volna megrajzolni, de nem sok sikerrel jártam. A probléma az volt, hogy a Caironak szüksége van egy GtkWindow (általánosabban GtkDrawable) objektumra, amire rajzolni tud, azonban az applet Bonobo-konténerében elszigetelt widgetek "window" tulajdonsága nem volt beállítva, tehát ezekből nem lehetett meghatározni az ablakot. Próbálkoztam a gtk_widget_get_parent_window() és a gtk_widget_get_ancestor() függvényekkel is, azonban ezek mindegyike egy BonoboPlug objektumot adott vissza, amit szintén nem lehetett GtkWindow típusúvá alakítani. A Google is gyanúsan keveset (semmit) tud a témáról. Adott tehát a kérdés: lehetséges-e egyáltalán Cairo-val megrajzolni egy panel appletet? Ha bárki bármilyen információval tud szolgálni, azt megköszönném.

Á.

Hozzászólások

Ez egy fpc-lazarus megoldás, hátha segít:


unit Unit1;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
glib2, gdk2, gtk2, gtkdef, cairo, ExtCtrls;

type

{ TForm1 }

TForm1 = class(TForm)
Image1: TImage;
procedure FormCreate(Sender: TObject);
procedure Image1ChangeBounds(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
//ha már nincs a Free Pascalban, hát beleteszem a gdk_cairo_create-t
function gdk_cairo_create(drawable: PgdkDrawable):Pcairo_t; cdecl; external gdklib;

var
Form1: TForm1;
ct: Pcairo_t;
gdio: PGDIObject;
implementation

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
image1.Picture.Bitmap.Canvas.Brush.Color:= clWhite;
image1.Picture.Bitmap.Width:= 300;
image1.Picture.Bitmap.Height:=300;
image1.Picture.Bitmap.Canvas.FillRect(0,0,300,300);

end;

procedure TForm1.Image1ChangeBounds(Sender: TObject);
begin
image1.Picture.Bitmap.Canvas.FillRect(0,0,300,300);
gdio:= PGDIObject(image1.Picture.Bitmap.Handle);
ct:= gdk_cairo_create(gdio^.GDIBitmapObject);

cairo_move_to (ct, 128.0, 25.6);
cairo_line_to (ct, 230.4, 230.4);
cairo_rel_line_to (ct, -102.4, 0.0);
cairo_curve_to (ct, 51.2, 230.4, 51.2, 128.0, 128.0, 128.0);
cairo_close_path (ct);

cairo_move_to (ct, 64.0, 25.6);
cairo_rel_line_to (ct, 51.2, 51.2);
cairo_rel_line_to (ct, -51.2, 51.2);
cairo_rel_line_to (ct, -51.2, -51.2);
cairo_close_path (ct);

cairo_set_line_width (ct, 10.0);
cairo_set_source_rgb (ct, 0, 0, 1);
cairo_fill_preserve (ct);
cairo_set_source_rgb (ct, 0, 0, 0);
cairo_stroke (ct);

cairo_destroy(ct);
end;

initialization
{$I unit1.lrs}

end.

Nem irtam meg panel kisalkalmazast, de szerintem mennie kell a cairo-s rajzolasnak.
A PanelApplet egy GtkWidget leszarmazott, ha nem is lehet rajzolni ra, de azert valamit csak lehet.

Ahogy en csinalnam:
Sajat widget, amit cairo rajzol. Ez megoldhato egyszeruen.
Utana gtk_container_add() fuggvennyel bepakolnam a PanelApplet-re.

Amit me'g meg lehet nezni,
GtkWidget * w = GTK_WIDGET(panel_applet);
w->window ebbol csinalsz a cairo-nak feluletet.

A második nem működik, azt próbáltam (nullpointer a ->window). Saját widgetet hogyan lehet Cairo-val rajzoltatni anélkül, hogy tudnánk a widget->window-t? Elképzelhető, hogy én vagyok a hülye, de láttam egy példakódot, és nekem úgy tűnt, hogy ott is kell a window :(. Köszönöm a tippeket, mindenesetre!

Nem talalok nalad email cimet, legyszives keress meg, zoltan[dot]horvath[kukac]gmail[dot]com
Kuldenek neked egy minta programot az appletrol, ami cairoval rajzol.