Clutter Windows
Clutter Windows
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
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
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.
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.
Re: Clutter Windows
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
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;
}
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
Re: Clutter Windows
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
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.
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=#Nullund 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.
Re: Clutter Windows
Das nimmt einem so unendlich viel Arbeit ab, danke nochmal dafuerremi_meier hat geschrieben: PS: Sry, dass ich an dem GIR-Ding nicht mehr
weiter gemacht habe. Bist wahrscheinlich der
einzige Nutzer.
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
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
Re: Clutter Windows
Weil mich das so gerührt hat und weil's noch ne Woche bisedel 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.
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
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
Re: Clutter Windows
Nun ist mir doch ein Problem aufgefallen:
Funktion selbst zu deklarieren (geht automatisch
leider nicht besser):
Das Problem besteht leider bei allen vararg-Funktionen.
Du könntest auch versuchen ob Folgendes funktioniert:
Hach... das ist kompliziert 
Edit: Es ist wohl einfacher per clutter_state_set_key ()
die Keys einzeln zu setzen...
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.
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.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);
Edit: Es ist wohl einfacher per clutter_state_set_key ()
die Keys einzeln zu setzen...
Re: Clutter Windows
remi_meier hat geschrieben:Weil mich das so gerührt hat und weil's noch ne Woche bisedel 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.
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
Danke dir, ich muss jetzt erstmal mit meiner Tochter ins Kino und Schluempfe gucken, danach werd ich das aber gleich ausprobieren
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
Re: Clutter Windows
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 = 24Problem darstellen.
(habe allerdings vergessen, clutter.pbi neu zu
erstellen. Hoffe es fehlen keine wichtigen Konstanten)
http://remi.secretly.de/downloads/gir2pb.zip
Re: Clutter Windows
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
, 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 :
allerdings bekomme ich das bei clutter-actor/box ueberhaupt nicht hin. Falls du Zeit haettest, koenntest du
da nochmal reingucken?
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.
Auch sind die fehlenden Funktionen jetzt da
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 :
Ich hab es dann mit gobject probiert und nach dem umstellen der Strukturen lief das dann auch sehr gut,GLib-GObject-WARNING **: specified class size for type `Spielfeld' is smaller than the parent type's `ClutterActor' class size
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.