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