Page 1 of 1

Gadget under mouse

Posted: Mon Jul 27, 2015 6:00 pm
by mk-soft
How to get gadget under mouse

Thanks

I needed for this
http://www.purebasic.fr/german/viewtopi ... 16#p331316

Re: Gadget under mouse

Posted: Tue Jul 28, 2015 11:02 am
by Shardik
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

Re: Gadget under mouse

Posted: Tue Jul 28, 2015 7:57 pm
by mk-soft
Many thanks to Shardik for help :wink: