Page 1 of 1

GetParentGadget and WindowPB, GadgetPB

Posted: Tue Apr 19, 2022 2:52 pm
by mk-soft
After some examples here in the forum, I cleaned up some code, summarised and optimised it to get the parent gadget.

Update v1.01.3
- Bugfix Linux

Update v1.01.4
- Optimize

Code: Select all

;-TOP by mk-soft, v1.01.4, 19.04.2022 - 09.04.2023

CompilerSelect #PB_Compiler_OS
    
  CompilerCase #PB_OS_Windows
    
    Procedure EnumPropGadgetCB(hwnd, *lpstr, handle, *lparam.Integer)
      If *lpstr & $FFFFFFFFFFFF0000
        If PeekS(*lpStr) = "PB_ID"
          *lparam\i = handle
          ProcedureReturn 0
        EndIf
      EndIf
      ProcedureReturn 1
    EndProcedure
    
    Procedure WindowPB(Handle)
      Protected r1
      r1 = GetProp_(Handle, "PB_WINDOWID")
      If r1 > 0
        ProcedureReturn r1 - 1
      Else
        ProcedureReturn -1
      EndIf
    EndProcedure
    
    Procedure GadgetPB(Handle)
      Protected r1
      If EnumPropsEx_(Handle, @EnumPropGadgetCB(), @r1) = 0
        ProcedureReturn r1
      Else
        ProcedureReturn -1
      EndIf
    EndProcedure
    
  CompilerCase #PB_OS_Linux
    
    Procedure WindowPB(Object)
      ProcedureReturn g_object_get_data_(Object, "pb_id" )
    EndProcedure
    
    Procedure GadgetPB(Object)
      Protected r1
      r1 = g_object_get_data_(Object, "pb_id" )
      If r1 > 0
        ProcedureReturn r1 - 1
      Else
        ProcedureReturn -1
      EndIf
    EndProcedure
      
  CompilerCase #PB_OS_MacOS
    
    Import ""
      PB_Window_GetID(Object) 
    EndImport
    
    Procedure WindowPB(Object)
      ProcedureReturn PB_Window_GetID(Object)
    EndProcedure
    
    Procedure GadgetPB(Object)
      ProcedureReturn CocoaMessage(0, Object, "tag")
    EndProcedure
    
CompilerEndSelect

Procedure GetParentGadget(Gadget)
  Protected r1, objectID, gadgetID, parentID, winID
  r1 = -1
  If IsGadget(Gadget)
    gadgetID = GadgetID(Gadget)
    CompilerSelect #PB_Compiler_OS
      CompilerCase #PB_OS_Windows
        parentID = gadgetID
        Repeat
          parentID = GetAncestor_(parentID, #GA_PARENT)
          If parentID
            objectID = GadgetPB(parentID)
            If objectID >= 0
              r1 = objectID
              Break
            EndIf
          EndIf
        Until parentID = 0
      CompilerCase #PB_OS_MacOS
        parentID = gadgetID
        winID = CocoaMessage(0, gadgetID, "window")
        Repeat
          parentID = CocoaMessage(0, parentID, "superview")
          If parentID
            If parentID = winID
              Break
            EndIf
            objectID = GadgetPB(parentID)
            If objectID >= 0
              r1 = objectID
              Break
            EndIf
          EndIf
        Until parentID = 0
      CompilerCase #PB_OS_Linux
        parentID = gadgetID
        winID = gtk_widget_get_toplevel_(gadgetID)
        Repeat
          parentID = gtk_widget_get_parent_(parentID)
          If parentID
            If parentID = winID
              Break
            EndIf
            objectID = GadgetPB(parentID)
            If objectID >= 0
              r1 = objectID
              Break
            EndIf
          EndIf
        Until parentID = 0
    CompilerEndSelect
  EndIf  
  ProcedureReturn r1
EndProcedure

; ****

CompilerIf #PB_Compiler_IsMainFile
  
  ;-TOP
  
  Procedure UpdateWindow()
    Protected dx, dy
    dx = WindowWidth(0)
    dy = WindowHeight(0) - StatusBarHeight(0) - MenuHeight()
    ; Resize Gadgets
  EndProcedure
  
  Procedure Main()
    Protected dx, dy
    
    #WinStyle = #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget
    
    If OpenWindow(0, #PB_Ignore, #PB_Ignore, 600, 400, "Test Window", #WinStyle)
      ; MenuBar
      CreateMenu(0, WindowID(0))
      MenuTitle("File")
      
      ; StatusBar
      CreateStatusBar(0, WindowID(0))
      AddStatusBarField(#PB_Ignore)
      
      ; Gadgets
      dx = WindowWidth(0)
      dy = WindowHeight(0) - StatusBarHeight(0) - MenuHeight()
      ContainerGadget(1, 0, 0, dx, dy)
      ButtonGadget(2, 10, 10, 120, 25, "Button")
      CloseGadgetList()
      ; Bind Events
      BindEvent(#PB_Event_SizeWindow, @UpdateWindow(), 0)
      
      ; 
      hWnd = WindowID(0)
      Debug "Window handle = " + hWnd
      Debug "PB_ID = " + WindowPB(hWnd)
      
      hWnd = GadgetID(1)
      Debug "ContainerGadget handle = " + hWnd
      Debug "PB_ID = " + GadgetPB(hWnd)
      
      hWnd = GadgetID(1)
      Debug "ButtonGadget handle = " + hWnd
      Debug "PB_ID = " + GadgetPB(hWnd)
      Debug "Parent Gadget from ButtonGadget = " + GetParentGadget(2)
      
      ; Main Loop
      Repeat
        Select WaitWindowEvent()
          Case #PB_Event_CloseWindow
            Select EventWindow()
              Case 0
                Break
            EndSelect
            
          Case #PB_Event_Menu
            Select EventMenu()
              
            EndSelect
            
          Case #PB_Event_Gadget
            Select EventGadget()
                
            EndSelect
            
        EndSelect
      ForEver
      
    EndIf
    
  EndProcedure : Main()
  
CompilerEndIf

Re: GetParentGadget

Posted: Wed Apr 20, 2022 10:41 am
by mk-soft
Update v1.01.3
- Bugfix Linux

Re: GetParentGadget and WindowPB, GadgetPB

Posted: Sun Apr 09, 2023 3:24 pm
by mk-soft
Update v1.01.4
- Optimize

Re: GetParentGadget and WindowPB, GadgetPB

Posted: Mon Apr 24, 2023 9:04 am
by Kwai chang caine
Nice work :shock:
Very usefull for me, again yesterday i need a code like this :wink:
Thanks for sharing 8)