Map widgets of all windows

Linux specific forum
User avatar
Shardik
Addict
Addict
Posts: 2058
Joined: Thu Apr 21, 2005 2:38 pm
Location: Germany

Map widgets of all windows

Post by Shardik »

In order to find the handle of a CalendarGadget which is dynamically generated and displayed as soon as the button beside a DateGadget is pressed, I wrote some sort of widget explorer which uses a TreeGadget to display all widgets and their hierarchy for all top windows currently displayed. To see the additional window with the GtkCalendar widget added to the TreeGadget, click onto the button beside the DateGadget and the TreeGadget will be updated.

Code: Select all

EnableExplicit

ImportC ""
  g_type_check_instance_is_a(*Instance.GTypeInstance, *Type.GTypeClass)
EndImport

Define *Button.GtkWidget
Define CalendarVisible.I
Define *HBox.GtkWidget
Define SubnodeLevel.I
Define *WindowList.GList

NewList FallbackSubnodeLevel.I()

Procedure.I GetChildren(*Widget.GtkWidget)
  Shared FallbackSubnodeLevel.I()
  Shared SubnodeLevel.I

  Protected *Child.GtkWidget
  Protected ChildrenCount.I
  Protected *ChildrenList.GList
  Protected i.I
  Protected *WidgetName
  
  If g_type_check_instance_is_a(*Widget\object\parent_instance\g_type_instance, gtk_container_get_type_()) = #False
    If ListSize(FallbackSubnodeLevel()) > 0
      LastElement(FallbackSubnodeLevel())
      SubnodeLevel = FallbackSubnodeLevel()
      DeleteElement(FallbackSubnodeLevel())
    EndIf
  Else
    *ChildrenList = gtk_container_get_children_(*Widget)
    ChildrenCount = g_list_length_(*ChildrenList)
    
    If ChildrenCount > 0
      If ChildrenCount > 1
        AddElement(FallbackSubnodeLevel())
        FallbackSubnodeLevel() = SubnodeLevel
      EndIf

      For i = 0 To ChildrenCount - 1
        *Child = g_list_nth_data_(*ChildrenList, i)
        *WidgetName = gtk_widget_get_name_(*Child)
        AddGadgetItem(1, -1, PeekS(*WidgetName), 0, SubnodeLevel)
        SubnodeLevel + 1
        GetChildren(*Child)
      Next i
    EndIf
  EndIf
EndProcedure

Procedure ExamineWindows()
  Shared FallbackSubnodeLevel.I()
  Shared SubnodeLevel.I

  Protected *Child.GtkWidget
  Protected i.I
  Protected *WidgetName
  Protected WindowCount.I
  Protected *Window.GtkWindow
  Protected *WindowList.GList

  ClearGadgetItems(1)

  *WindowList = gtk_window_list_toplevels_()
  WindowCount = g_list_length_(*WindowList)
  
  If WindowCount > 0
    For i = 0 To WindowCount - 1
      *Window = g_list_nth_data_(*WindowList, i)
      AddGadgetItem(1, -1, "GtkWindow", 0, 0)
      ClearList(FallbackSubnodeLevel())
      SubnodeLevel = 1
      GetChildren(*Window)
    Next i
  EndIf

  gtk_tree_view_expand_all_(GadgetID(1))
EndProcedure

ProcedureC Callback(*Widget.GtkWidget, *Event.GdkEventAny, *UserData)
  Shared CalendarVisible.I
  CalendarVisible = #True
EndProcedure

OpenWindow(0, 1400, 100, 460, 300, "Widget Explorer")
DateGadget(0, 10, 10, 180, 25, "Date: %mm/%dd/%yyyy")
TreeGadget(1, GadgetWidth(0) + 20, 10, WindowWidth(0) - GadgetWidth(0) - 30, WindowHeight(0) - 20)

ExamineWindows()

*HBox.GtkWidget = gtk_widget_get_parent_(GadgetID(0))
*Button.GtkWidget = g_list_nth_data_(gtk_container_get_children_(*HBox), 1)
g_signal_connect_(*Button, "button-release-event", @Callback(), 0)

Repeat
  If CalendarVisible
    ExamineWindows()
    CalendarVisible = #False
  EndIf
Until WaitWindowEvent() = #PB_Event_CloseWindow
User avatar
idle
Always Here
Always Here
Posts: 5836
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

Re: Map widgets of all windows

Post by idle »

Thanks Shardik
Windows 11, Manjaro, Raspberry Pi OS
Image
Post Reply