Es hat sich was geändertedel hat geschrieben:IsGadget scheint wohl unter Linux etwas anderes zurückzugeben. Ich habe es oben angepasst.

Hab nur 64-Bit getested, vielleicht liegt es daran?
Es hat sich was geändertedel hat geschrieben:IsGadget scheint wohl unter Linux etwas anderes zurückzugeben. Ich habe es oben angepasst.
Code: Alles auswählen
Prototype CallFreeProc(Gadget)
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Structure FreeProcInfo
oldProc.i
newProc.i
EndStructure
Global NewMap OldFreeProc.FreeProcInfo()
Procedure FreeGadgetCallback(hWnd, Msg, wParam, lParam)
Protected oldProc.i
Protected newProc.CallFreeProc
oldProc = OldFreeProc(Str(hWnd))\oldProc
newProc = OldFreeProc(Str(hWnd))\newProc
If Msg = #WM_DESTROY
newProc(GetWindowLongPtr_(hWnd, #GWL_ID))
DeleteMapElement(OldFreeProc(), Str(hWnd))
EndIf
ProcedureReturn CallWindowProc_(oldProc, hWnd, Msg, wParam, lParam)
EndProcedure
Procedure SetFreeProc(Gadget, Proc)
OldFreeProc(Str(GadgetID(Gadget)))\oldProc = SetWindowLongPtr_(GadgetID(Gadget), #GWLP_WNDPROC, @FreeGadgetCallback())
OldFreeProc(Str(GadgetID(Gadget)))\newProc = proc
EndProcedure
CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
Global NewMap OldFreeProc.i()
PrototypeC g_signal_connect(instance.i, signal.p-utf8, handler.i, _data.i)
Procedure _g_signal_connect_(instance.i, signal.i, handler.i, _data.i)
ProcedureReturn g_signal_connect_(instance, signal, handler, _data)
EndProcedure
Global g_signal_connect.g_signal_connect = @_g_signal_connect_()
ProcedureC FreeProc(Gadget, FProc.CallFreeProc)
FProc(OldFreeProc(Str(Gadget)))
DeleteMapElement(OldFreeProc(), Str(Gadget))
EndProcedure
Procedure SetFreeProc(Gadget, Proc)
OldFreeProc(Str(GadgetID(Gadget))) = Gadget
g_signal_connect(GadgetID(Gadget), "destroy", @FreeProc(), Proc)
EndProcedure
CompilerElse
CompilerEndIf
;-----------------------------------------------------------
;-----------------------------------------------------------
;-----------------------------------------------------------
Procedure MyFreeGadget(Gadget)
Debug "FreeGadget : " + Gadget
EndProcedure
Procedure Main()
Protected Window
Protected Gad1
Protected Gad2
Window = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 200, 200, "")
If Window
Gad1 = ButtonGadget(2, 10, 10, 180, 25, "hm?")
Gad2 = ListViewGadget(#PB_Any, 10, 35, 180, 150)
SetFreeProc(2, @MyFreeGadget())
SetFreeProc(Gad2, @MyFreeGadget())
FreeGadget(2)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
EndProcedure:End Main()