Hab mal wieder was für euch...

Previous topic - Next topic

Kitty Hello

Code (glbasic) Select
CALLBACK glb_hello: para
ENDFUNCTION

INLINE
extern "C" static void c_hello(int para)
{
   glb_hello(para);
}

FUNCTION ConnecteMeinenButton:
INLINE
   g_signal_connect (G_OBJECT (button), "clicked",G_CALLBACK (c_hello), NULL);
ENDINLINE
ENDFUNCTION
Jetzt kannst Du aber nicht für jeden Button eine "glb_hello" machen, klar oder?
Also: Machst Du eine FUNCTION GTK_OnButton: iButton, und verknüpfst alle button-messages mit einer c_button funktion. In der suchst Du dann heraus, welcher Button gedrückt wurde (mach ein Feld mit GtkWidget* pointern, und vergleiche die, dann gib den Index an die glb-Funktion weiter. Weisst wie ich mein?

trucidare

Ich weiß was du meinst aber wie lös ich das mit dem GtkWidget feld?
und so wie ich das aus dem code sehe wird beim signal "clicked" die funktion hello aufgerufen. WIe soll ich das denn machen, dass wenn ich button1 drück dann z.b. label1 ein anderen text und auf click von button2 das programm beendet wird, wenn ich nur 1ne callback funktion hab?
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

trucidare

muss mal e in doppelpost investieren...
sonst bin ich am ende noch ganz unten
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

Kitty Hello

GtkWidget* ist kein Feld!!! Das ist ein Zeiger auf ein mit "new" erstelltes Widget.

trucidare

Bezig sich auf das aus deinem Post:
(mach ein Feld mit GtkWidget* pointern)

Ich weiß nich wie ich da weiter machen soll. nun hab ich bald alle widgets aber noch keine events :(
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

Schranz0r

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Kitty Hello

Ja... Mach ein Feld
INLINE
DGArray gPointers;

//neues Widget machen:
...
DIMPUSH (gPointers, neuesWidget);

// im callback:
for(int i=0; i{
   if(gPointers(i) == callback_ueberreichter_pointer) return i;
}
return -1; // fehler

Schranz0r

Das soll funzen?

Eine Forschleife im Callback...

Obs auch so bei der Newton gehen würde?
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

trucidare

Hmm ich kanns immernoch nicht in Verbindung bringen :(

ich mein das folgendermaßen:

Code (glbasic) Select
static void callback_func( GtkWidget *widget,
                    GdkEvent  *event,
                    gpointer   callback_data );
Das ist die Callback Funktion.

Code (glbasic) Select
g_signal_connect (G_OBJECT (button), "button_press_event",
                  G_CALLBACK (callback_func), NULL);
Das ist der Aufruf von Gtk. So ruft das Widget "button" beim klicken die callback funktion callback_func auf und übergibt den Kram "GtkWidget *widget, GdkEvent  *event, gpointer callback_data" an die callback_func.

Nun kann ich nicht für jeden button ein neues callback machen wie gernot schon sagt. Also schreib ich meine widgets (gleich beim erstellen) in ein Feld.

Nun meine frage... Wie gehts weiter?
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

Kitty Hello

ah - ha!!!
pass auf, der conenct übergibt an die Funktion, die Du angibst ja NULL als callback_data, stimmts?
Jetzt rufst Du für jeden Kopf immer die gleiche Callback-funktion auf, _aaaaber_ gibst stall NULL den index/id/whatever des Knopfes an -> damit Du später dem Nutzer sagen kannst "Knopf 5 gedrückt".

@Schranzor - so mach ich das in Newton auch. Ich bekomme einen Zeiger auf einen Body bei den Kollisionen, dann such ich mir den passenden Index dazu und gebe den an GLBasic zurück.

Code (glbasic) Select
int xNewtonBodyIndexFromPointer(const void* body)
{
int m = BOUNDS(gNewtonBodyPointers, 0);
for(int i=0; ireturn -1;
}

Schranz0r

ahhh ok :D

Hast du im Pinguinspiel nicht gemacht;)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

trucidare

ich habs jetzt erstmal so gelöst:

Code (glbasic) Select
CALLBACK FUNCTION EVENTS: widget,command$
DEBUG widget
DEBUG command$
SELECT widget
CASE button1
GuiStatusBarPush(status,"Test")
CASE Button
GuiStatusBarPush(status,"Moop")
CASE window
GuiEnd()
END
CASE datei_sub
GuiEnd()
END
ENDSELECT
ENDFUNCTION
da ichnich weiß wie es sich später als dll verhält muss ich mir noch was anderes ausdenken. Übrigens von feld event bekomm ich nur ne 1 oder ne 0 und von data nur bei dem schließen button vom fenster einen wert, der aber jedesmal anders ist.
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

Kitty Hello

kannst es mir ja mal schicken, dann schau ich mal drüber - so ists schwer zu sagen.

trucidare

Jipp mach ich dir mal fertig. Vielleicht hast du ja noch ein verbesserungsvorschlag und vor allem ein vorschlag zur vereinfachung hab schon viele befehle 1:1 übernommen weiß nicht wie ich die in den anderen unterbringen soll um den kram noch einfacher zu machen.

UPDATE erster Post
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

Schranz0r

Wie gewünscht, vom Trucidare, ein Screenshot von seiner GUI in Vista:


!!KLICK IMAGE FOR FULLSIZE!!
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard