The following example code demonstrates how to detect the current gadget under the mouse cursor. But you have to take care of some special gadgets which aren't selectable by default like the TextGadget! In order to detect the cursor above a TextGadget you have therefore to enable selectability:
Code: Select all
gtk_label_set_selectable_(GadgetID(TextGadgetID), #True)
This is the complete example:
Code: Select all
EnableExplicit
ImportC ""
PB_Object_EnumerateStart(PB_Objects.I)
PB_Object_EnumerateNext(PB_Objects.I, *GadgetID)
PB_Object_EnumerateAbort(PB_Objects.I)
PB_Gadget_Objects.I
EndImport
Define GadgetFound.I
Define GadgetHandle.I
Define GadgetID.I
Define *GdkWindow.GdkWindowObject
Define x.I
Define y.I
OpenWindow(0, 100, 100, 350, 220, "Detect gadget below cursor")
CreateStatusBar(0, WindowID(0))
AddStatusBarField(#PB_Ignore)
CheckBoxGadget(0, 30, 30, 130, 30, "CheckBox")
TextGadget(1, 30, 80, 130, 30, "TextGadget", #PB_Text_Border | #PB_Text_Center)
gtk_label_set_selectable_(GadgetID(1), #True)
ButtonGadget(2, 30, 140, 130, 30, "Button")
OptionGadget(3, 190, 30, 120, 30, "OptionBox")
StringGadget(4, 190, 80, 130, 30, "StringGadget")
HyperLinkGadget(5, 190, 140, 140, 30, "HyperLinkGadget", 0)
AddWindowTimer(0, 0, 200)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
RemoveWindowTimer(0, 0)
Break
Case #PB_Event_Timer
*GdkWindow = gdk_window_at_pointer_(@x,@y)
If *GdkWindow
GadgetHandle = *GdkWindow\user_data
PB_Object_EnumerateStart(PB_Gadget_Objects)
GadgetFound = #False
While PB_Object_EnumerateNext(PB_Gadget_Objects, @GadgetID)
If GadgetHandle = GadgetID(GadgetID)
StatusBarText(0, 0, "Cursor above Gadget " + Str(GadgetID), #PB_StatusBar_Center)
PB_Object_EnumerateAbort(PB_Gadget_Objects)
GadgetFound = #True
Break
EndIf
Wend
If GadgetFound = #False
StatusBarText(0, 0, "")
EndIf
EndIf
EndSelect
ForEver