@Shardik,
Very nice
but you can the gadget number send with PostEvent, therefore get pb_id with
Code: Select all
gadget = g_object_get_data_(*Widget, "pb_id" ) - 1
@Joris
If you bind a signal with a ProcedureC callback, you must pay attention to the parameters number and type. Otherwise the entire Linux GUI may hang up.
Link:
https://docs.gtk.org/gtk3/
Update
Code: Select all
EnableExplicit
Enumeration CustomEvents
#Event_MouseLeftButtonDown = #PB_Event_FirstCustomValue
#Event_MouseLeftButtonUp
EndEnumeration
Enumeration Gadgets
#StringGadget
#EditorGadget
EndEnumeration
Define GadgetCount.I = #PB_Compiler_EnumerationValue
Define i.I
ProcedureC MouseButtonCallback(*Widget.GtkWidget, *Event.GdkEventButton, *UserData)
Protected gadget
gadget = g_object_get_data_(*Widget, "pb_id" ) - 1
If *Event\type = #GDK_BUTTON_PRESS And *Event\button = 1
PostEvent(#Event_MouseLeftButtonDown, GetActiveWindow(), gadget)
ElseIf *Event\type = #GDK_BUTTON_RELEASE And *Event\button = 1
PostEvent(#Event_MouseLeftButtonUp, GetActiveWindow(), gadget)
EndIf
EndProcedure
OpenWindow(0, 100, 100, 300, 140, "Detect left mouse button down & up")
StringGadget(#StringGadget, 10, 10, 280, 25, "")
EditorGadget(#EditorGadget, 10, 45, 280, 60)
; ----- Connect press and release event to each gadget in "Enumeration Gadgets"
For i = 1 To GadgetCount
g_signal_connect_(GadgetID(i - 1), "button_press_event",
@MouseButtonCallback(), 0)
g_signal_connect_(GadgetID(i - 1), "button_release_event",
@MouseButtonCallback(), 0)
Next i
CreateStatusBar(0, WindowID(0))
AddStatusBarField(#PB_Ignore)
SetActiveGadget(#StringGadget)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #Event_MouseLeftButtonDown
StatusBarText(0, 0, "GagdetID " + Str(EventGadget()) +
": Left mouse button down", #PB_StatusBar_Center)
Case #Event_MouseLeftButtonUp
StatusBarText(0, 0, "GagdetID " + Str(EventGadget()) +
": Left mouse button up", #PB_StatusBar_Center)
EndSelect
ForEver