Clutter Windows

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Clutter Windows

Beitrag von edel »

Huhu

hat jemand von euch schonmal etwas mit Clutter (das Teil womit Gnome-Shell laeuft) gemacht?

Hab mir jetzt das ganze unter Windows kompiliert und und versucht unter PB einzubinden.
Ich komme allerdings nicht sehr weit, bzw bleibe bei ich clutter_state_set haengen, das Programm
schmiert ab, wenn ich es genau nach einem Beispiel aus den Sourcen nachbaue.

Vielleicht mag sich das mal jemand anschauen. Die Include sind alt aber zum testen sollte es reichen.
Der Download ist etwas gross, laeuft damit aber auch ohne gtk installation.

http://realsource.de/tmp/clutter_test.zip
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Clutter Windows

Beitrag von DarkDragon »

Hallo,

Bei mir ging es auch erst nicht. Dann hab ich mir mal die Deklaration von clutter_state_set angeschaut und die ganzen a, b, c, d, ... Parameter auskommentiert. Danach hab ich es versucht zu kompillieren, ging jedoch nicht wegen der falschen Anzahl an Parameter. Deshalb hab ich das Kommentar wieder rausgenommen und plötzlich ging es, wie der Screenshot beweist. D.h. es lief praktisch ohne Änderung auf einmal. Nur am Ende crasht es jetzt. Ich hab mal die Stackpointer-Differenzen rund um die eine Funktion angeschaut und es sind alle 0.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Clutter Windows

Beitrag von edel »

Eigentlich sollte das Fenster voll von solchen bildern sein, und von links hereinschwenken.
http://realsource.de/tmp/Unbenannt.png

hier mal der Quellcode in C

Code: Alles auswählen

#include <stdlib.h>
#include <math.h>
#include <gmodule.h>
#include <clutter/clutter.h>
#include "test-common.h"

#define STAGE_WIDTH    800
#define STAGE_HEIGHT   600

#define ACTOR_WIDTH    64
#define ACTOR_HEIGHT   64

#define COLS  (STAGE_WIDTH/ACTOR_WIDTH)
#define ROWS  (STAGE_HEIGHT/ACTOR_HEIGHT)
#define TOTAL (ROWS*COLS)


static gboolean press_event (ClutterActor *actor,
                             ClutterEvent *event,
                             gpointer      user_data)
{
  ClutterState *state = CLUTTER_STATE (user_data);
  clutter_state_set_state (state, "right");
  return TRUE;
}

static gboolean release_event (ClutterActor *actor,
                               ClutterEvent *event,
                               gpointer      user_data)
{
  ClutterState *state = CLUTTER_STATE (user_data);
  clutter_state_set_state (state, "active");
  return TRUE;
}

static gboolean enter_event (ClutterActor *actor,
                             ClutterEvent *event,
                             gpointer      user_data)
{
  ClutterState *state = CLUTTER_STATE (user_data);
  clutter_state_set_state (state, "hover");
  return TRUE;
}

static gboolean leave_event (ClutterActor *actor,
                             ClutterEvent *event,
                             gpointer      user_data)
{
  ClutterState *state = CLUTTER_STATE (user_data);
  clutter_state_set_state (state, "normal");
  return TRUE;
}

static void completed (ClutterState *state,
                       gpointer      data)
{
  g_print ("Completed transitioning to state: %s\n",
           clutter_state_get_state (state));

  if (g_str_equal (clutter_state_get_state (state), "right"))
    {
      /* skip straight to left state when reaching right */
      clutter_state_warp_to_state (state, "left");
    }
}

static ClutterActor *new_rect (gint r,
                               gint g,
                               gint b,
                               gint a)
{
  GError *error = NULL;
  ClutterColor *color = clutter_color_new (r, g, b, a);
  ClutterActor *group = clutter_group_new ();
  ClutterActor *rectangle = clutter_rectangle_new_with_color (color);
  ClutterActor *hand = NULL;

  gchar *file = g_build_filename (TESTS_DATA_DIR, "redhand.png", NULL);

  hand = clutter_texture_new_from_file (file, &error);
  if (rectangle == NULL)
    g_error ("image load failed: %s", error->message);
  g_free (file);
  clutter_actor_set_size (hand, ACTOR_WIDTH,ACTOR_HEIGHT);

  clutter_actor_set_size (rectangle, ACTOR_WIDTH,ACTOR_HEIGHT);
  clutter_color_free (color);
  clutter_container_add (CLUTTER_CONTAINER (group), rectangle, hand, NULL);
  return group;
}

gint
main (gint    argc,
      gchar **argv)
{
  ClutterColor  black={0,0,0,0xff};
  ClutterActor *stage;
  ClutterState *layout_state;
  gint i;
  clutter_perf_fps_init ();
  if (CLUTTER_INIT_SUCCESS != clutter_init (&argc, &argv))
    g_error ("Failed to initialize Clutter");

  stage = clutter_stage_get_default ();
  layout_state = clutter_state_new ();
  clutter_stage_set_color (CLUTTER_STAGE (stage), &black);
  clutter_actor_set_size (stage, STAGE_WIDTH, STAGE_HEIGHT);

  g_signal_connect (stage, "button-press-event",
                    G_CALLBACK (press_event), layout_state);
  g_signal_connect (stage, "button-release-event",
                    G_CALLBACK (release_event), layout_state);

  for (i=0; i<TOTAL; i++)
    {
      ClutterActor *actor;
      ClutterState *a_state;

      int row = i/COLS;
      int col = i%COLS;

      actor = new_rect (255 * ( 1.0*col/COLS), 50,
                        255 * ( 1.0*row/ROWS), 255);
      clutter_container_add_actor (CLUTTER_CONTAINER (stage), actor);
      clutter_actor_set_position (actor, 320.0, 240.0);
      clutter_actor_set_reactive (actor, TRUE);


      clutter_state_set (layout_state, NULL, "active",
            actor, "delayed::x", CLUTTER_LINEAR,
                                         ACTOR_WIDTH * 1.0 * ((TOTAL-1-i) % COLS), 
                                        ((row*1.0/ROWS))/2, (1.0-(row*1.0/ROWS))/2,
            actor, "delayed::y", CLUTTER_LINEAR,
                                         ACTOR_HEIGHT * 1.0 * ((TOTAL-1-i) / COLS),
                                        ((row*1.0/ROWS))/2, 0.0,
            actor, "rotation-angle-x", CLUTTER_LINEAR, 0.0,
            actor, "rotation-angle-y", CLUTTER_LINEAR, 0.0,
            NULL);

      clutter_state_set (layout_state, NULL, "right",
            actor, "delayed::x", CLUTTER_LINEAR, STAGE_WIDTH * 1.0,
                                    ((row*1.0/ROWS))/2,
                                    (1.0-(row*1.0/ROWS))/2,
            actor, "delayed::y", CLUTTER_LINEAR, STAGE_HEIGHT * 1.0,
                                    ((row*1.0/ROWS))/2,
                                    0.0,
            NULL);

      clutter_state_set (layout_state, NULL, "left",
            actor, "rotation-angle-x", CLUTTER_LINEAR, 45.0,
            actor, "rotation-angle-y", CLUTTER_LINEAR, 5.0,
            actor, "x", CLUTTER_LINEAR, 0-64.0,
            actor, "y", CLUTTER_LINEAR, 0-64.0,
                         NULL);

      a_state = clutter_state_new ();
      g_object_set_data_full (G_OBJECT (actor), "hover-state-machine",
                              a_state, g_object_unref);
      g_signal_connect (actor, "enter-event",
                        G_CALLBACK (enter_event), a_state);
      g_signal_connect (actor, "leave-event",
                        G_CALLBACK (leave_event), a_state);

      clutter_state_set (a_state, NULL, "normal",
                         actor, "opacity", CLUTTER_LINEAR, 0x77,
                         actor, "rotation-angle-z", CLUTTER_LINEAR, 0.0,
                         NULL);
      clutter_state_set (a_state, NULL, "hover",
                         actor, "opacity", CLUTTER_LINEAR, 0xff,
                         actor, "rotation-angle-z", CLUTTER_LINEAR, 10.0,
                         NULL);
      clutter_actor_set_opacity (actor, 0x77);

      clutter_state_set_duration (a_state, NULL, NULL, 500);
    }

  clutter_state_set_duration (layout_state, NULL, NULL, 1000);
  clutter_state_set_duration (layout_state, "active", "left", 1400);

  g_signal_connect (layout_state, "completed", G_CALLBACK (completed), NULL);

  clutter_actor_show (stage);

  clutter_state_warp_to_state (layout_state, "left");
  clutter_state_set_state (layout_state, "active");

  clutter_perf_fake_mouse (CLUTTER_STAGE (stage));
  clutter_perf_fps_start (CLUTTER_STAGE (stage));
  clutter_main ();
  clutter_perf_fps_report ("test-state-interactive");
  g_object_unref (layout_state);

  return EXIT_SUCCESS;
}

Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Re: Clutter Windows

Beitrag von remi_meier »

Bin leider nicht unter Windows unterwegs, aber ich
möchte auf eine Unstimmigkeit zwischen Linux 64bit
und Windows 64bit hinweisen. IIRC ist ein LONG
unter Win64 32bit lang und unter Linux 64bit.

Wenn du also 64bit Windows verwendest _und_
Clutter & Co. mit Win64-ABI kompiliert sind, dann
wäre z. B. die Funktion

Code: Alles auswählen

 clutter_state_set(*state, source_state_name.p-utf8, target_state_name.p-utf8, *first_object, first_property_name.p-utf8, first_mode,a=#Null,b=#Null,c=#Null,d=#Null,e=#Null,f=#Null,g=#Null,h=#Null,i=#Null,j=#Null,k=#Null,l=#Null,m=#Null,n=#Null,o=#Null,p=#Null,q=#Null,r=#Null,s=#Null
falsch deklariert, da first_mode ein 'gulong' ist
und somit unter Win64 nur 32bit sein sollte.

Ob es an diesem Problem liegt, kann ich leider
nicht überprüfen. Wollte das aber mal anmerken :)
In der Clutter-Anwendung sehe ich sonst grad
keine Fehler.

greetz
remi

PS: Sry, dass ich an dem GIR-Ding nicht mehr
weiter gemacht habe. Bist wahrscheinlich der
einzige Nutzer.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Clutter Windows

Beitrag von edel »

remi_meier hat geschrieben: PS: Sry, dass ich an dem GIR-Ding nicht mehr
weiter gemacht habe. Bist wahrscheinlich der
einzige Nutzer.
Das nimmt einem so unendlich viel Arbeit ab, danke nochmal dafuer :)
Aber vielleicht kannste da nochmal drueber gucken, es scheint als wuerden einige Funktionen einfach
ausgelassen.

clutter_state_set ist leider nicht die einzige Funktion die so funktioniert, aber es scheint als koennte
man das auch mehrmals hintereinander aufrufen.

Was die Bibliotheken angeht, da habe ich hier die normale 32bit Versionen. War ja schon froh das ich
es ueberhaupt gebacken bekommen habe. gobject-introspection bekomme ich nicht kompiliert, daher
muss ich mir die ganzen gir Dateien ausm Netz zusammenklauben, und irgendwas fehlt dann immer :(
Als naechstes muss Clutter-MX dran glauben, mal sehen was das wird ;)
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Re: Clutter Windows

Beitrag von remi_meier »

edel hat geschrieben:Das nimmt einem so unendlich viel Arbeit ab, danke nochmal dafuer :)
Aber vielleicht kannste da nochmal drueber gucken, es scheint als wuerden einige Funktionen einfach
ausgelassen.
Weil mich das so gerührt hat und weil's noch ne Woche bis
Semesterbeginn ist,
habe ich mich nochmals hingesetzt und
viele Bugs mit fehlenden Funktionen, fehlender Typenübersetzung
und fehlender varargs-Unterstützung gefixt. Ob das mit
deinem Problem hilft, kann ich leider nicht sagen :)

Hier das aktuelle Programm inkl. aktueller GIR-Dateien und der
aktuellen clutter.pbi.
http://remi.secretly.de/downloads/gir2pb.zip
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Re: Clutter Windows

Beitrag von remi_meier »

Nun ist mir doch ein Problem aufgefallen:

Code: Alles auswählen

clutter_state_set (layout_state, "", "active", actor, "delayed::x", #CLUTTER_LINEAR,#ACTOR_WIDTH  * 1 * ((#TOTAL-1-i) % #COLS),((row*1.0/#ROWS))/2, (1.0-(row*1.0/#ROWS))/2, #Null)
  • "" <> #NULL, was jetzt natürlich doof ist, da dort ein String verlangt wird...
  • wenn du Floats übergeben möchtest, dann werden die leider einfach zu Integer konvertiert. Was falsch ist, denn das übergebene Argument sollte "binär"-gesehen eine Float sein.
Für deine Zwecke wäre es wohl am einfachsten, die
Funktion selbst zu deklarieren (geht automatisch
leider nicht besser):

Code: Alles auswählen

clutter_state_set1(*state, *src, target.p-utf8, *obj, property.p-utf8, value.f, mode.l, end.l)
clutter_state_setint1(*state, *src, target.p-utf8, *obj, property.p-utf8, value.l, mode.l, end.l)
etc. Dann sollte ein Aufruf wie
clutter_state_set (state, NULL, "hover",
                   button, "scale-x", 1.2, CLUTTER_EASE_OUT_CUBIC,
                   NULL);
klappen.
Das Problem besteht leider bei allen vararg-Funktionen.

Du könntest auch versuchen ob Folgendes funktioniert:

Code: Alles auswählen

Structure VAR
StructureUnion
 l.l
 f.f
 s.s ; aber nicht mit unicode kompilieren!
EndStructureUnion
EndStructure

a.VAR\l = #NULL
prop.VAR\s = "scale-x"
value.VAR\f = 1.2
clutter_state_set(*state, a\s,  "hover",
                   button, prop\l, value\l, #CLUTTER_EASE_OUT_CUBIC,
                   #NULL);
Hach... das ist kompliziert :|

Edit: Es ist wohl einfacher per clutter_state_set_key ()
die Keys einzeln zu setzen...
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Clutter Windows

Beitrag von edel »

remi_meier hat geschrieben:
edel hat geschrieben:Das nimmt einem so unendlich viel Arbeit ab, danke nochmal dafuer :)
Aber vielleicht kannste da nochmal drueber gucken, es scheint als wuerden einige Funktionen einfach
ausgelassen.
Weil mich das so gerührt hat und weil's noch ne Woche bis
Semesterbeginn ist,
habe ich mich nochmals hingesetzt und
viele Bugs mit fehlenden Funktionen, fehlender Typenübersetzung
und fehlender varargs-Unterstützung gefixt. Ob das mit
deinem Problem hilft, kann ich leider nicht sagen :)

Hier das aktuelle Programm inkl. aktueller GIR-Dateien und der
aktuellen clutter.pbi.
http://remi.secretly.de/downloads/gir2pb.zip
:praise:

Danke dir, ich muss jetzt erstmal mit meiner Tochter ins Kino und Schluempfe gucken, danach werd ich das aber gleich ausprobieren :)
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Re: Clutter Windows

Beitrag von remi_meier »

:lurk:

Habe soeben noch Kompatibilitätsprobleme mit
einigen aktuelleren .gir-Files behoben. Ausserdem
wurden noch "globale" Konstanten übergangen,
was jetzt nicht mehr der Fall sein sollte. Jedoch
reklamiert PB jetzt, weil es z. B. bei

Code: Alles auswählen

#GTK_MICRO_VERSION = 4
#GTK_MINOR_VERSION = 24
andere Werte hat. Aber das sollte ja kein grosses
Problem darstellen.

(habe allerdings vergessen, clutter.pbi neu zu
erstellen. Hoffe es fehlen keine wichtigen Konstanten)
http://remi.secretly.de/downloads/gir2pb.zip
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Clutter Windows

Beitrag von edel »

Sieht sehr gut aus. clutter_state_set_key funktioniert, ist zwar weit mehr Code, aber besser als nen IMA :).
Auch sind die fehlenden Funktionen jetzt da :allright:, es muss zwar noch ein wenig umgeschrieben werden,
aber das ist in Ordnung.

Ich hab gestern versucht eine neue abgeleitete Klasse zu erstellen, was aber nicht so geklappt hat. Als Fehler
bekomme ich immer :
GLib-GObject-WARNING **: specified class size for type `Spielfeld' is smaller than the parent type's `ClutterActor' class size
Ich hab es dann mit gobject probiert und nach dem umstellen der Strukturen lief das dann auch sehr gut,
allerdings bekomme ich das bei clutter-actor/box ueberhaupt nicht hin. Falls du Zeit haettest, koenntest du
da nochmal reingucken?

Code: Alles auswählen

XIncludeFile #PB_Compiler_Home + "include/inc.clutter.pbi"
XIncludeFile #PB_Compiler_Home + "include/inc.gobject.pbi"
XIncludeFile #PB_Compiler_Home + "include/inc.glib.pbi"

ImportC ""
	clutter_actor_get_type()	
EndImport

Structure Spielfeld
	parent.ClutterActor	
	
	
EndStructure

Structure SpielfeldClass 
	parent.ClutterBoxClass	
	
	
EndStructure

DeclareCDLL spielfeld_class_init (*klass.SpielfeldClass)
DeclareCDLL spielfeld_init (*Spielfeld.Spielfeld)

ProcedureCDLL spielfeld_get_type ()   	
	Static g_define_type_id__volatile.i = 0
		
	Protected g_define_type_id
	
	If g_once_init_enter (@g_define_type_id__volatile)       
		g_define_type_id = g_type_register_static_simple (clutter_actor_get_type(), "Spielfeld", SizeOf (SpielfeldClass), @spielfeld_class_init(), SizeOf (Spielfeld), @spielfeld_init(), 0)     
		g_once_init_leave(@g_define_type_id__volatile, g_define_type_id)
	EndIf
	
	ProcedureReturn g_define_type_id__volatile
EndProcedure

ProcedureCDLL spielfeld_class_init (*klass.SpielfeldClass)	
	
EndProcedure

ProcedureCDLL spielfeld_init (*Spielfeld.Spielfeld)

EndProcedure

ProcedureCDLL spielfeld_new()
	ProcedureReturn g_object_newv(spielfeld_get_type (), 0, #Null)
EndProcedure

ProcedureC main()
	g_type_init()
	clutter_init(0, "")
	
	Debug spielfeld_new()
	
	CallDebugger
	
	ProcedureReturn 0
EndProcedure: End main()

Sehr schoen, das zeigt das die PB IDE, unter Windows, schon nach 7000 Zeilen am Ende ist :s ...
Ich hab es ja bei der Include verstanden, wo alle Gnome Header drin waren (30.000 Zeilen), aber
die Clutter Include mag ich nicht auch noch aufteilen ...
Dafuer muss man aber beim Compiler mal den Hut ziehen, den interessiert die Groesse gar nicht
und bleibt dabei schoen schnell.
Antworten