GetGadgetAttribute(0,#PB_Panel_TabHeight) liefert -1

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
pickelrobert
Beiträge: 207
Registriert: 09.12.2004 22:09

GetGadgetAttribute(0,#PB_Panel_TabHeight) liefert -1

Beitrag von pickelrobert »

Die Funktion GetGadgetAttribute(0,#PB_Panel_TabHeight) liefert unter Linux -1, anstatt die Höhe der Tabs.

Code: Alles auswählen

  If OpenWindow(0, 0, 0, 322, 220, "PanelGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    PanelGadget     (0, 8, 8, 306, 203)
      AddGadgetItem (0, -1, "Panel 1")
      AddGadgetItem (0, -1,"Panel 2")
    CloseGadgetList()
    Debug GetGadgetAttribute(0,#PB_Panel_TabHeight)        
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
Getestet unter Debian 12.

Ist das ein Bug?
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: GetGadgetAttribute(0,#PB_Panel_TabHeight) liefert -1

Beitrag von mk-soft »

Sieht nach einem alten Bug aus. Auch mit PB v6.03
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: GetGadgetAttribute(0,#PB_Panel_TabHeight) liefert -1

Beitrag von mk-soft »

Ok, gefunden und wieder erinnert ...

Das GTK braucht etwas zeit das Fenster aufzubauen und die Daten zu hinterlegen (asynchrone Verarbeitung von GTK)

Code: Alles auswählen

;-TOP
Structure udtChildren
  Level.i
  Widget.i
  Name.s
EndStructure

ImportC ""
  gtk_widget_get_type(widget)
  g_object_get_type(void)
EndImport

Procedure.s GetType(*Widget.gtkwidget)
  type = g_object_get_type(*Widget)
  Debug type
  If type
    name.s = PeekS(g_type_name_(type), -1, #PB_UTF8)
  EndIf
  ProcedureReturn name
EndProcedure

Procedure FindChild(Widget, Name.s)
  Protected *Name, *child, *list.glist, *children.GList, *widget
  *Name = gtk_widget_get_name_(Widget)
  If *Name
    If LCase(Name) = LCase(PeekS(*Name, -1, #PB_UTF8))
      ProcedureReturn Widget
    EndIf
  EndIf
  
  *list = gtk_container_get_children_(Widget)
  If *list
    *children = *list
    While *children
      *widget = FindChild(*children\data, name);
      If *widget <> #Null
        g_list_free_(*list)
        ProcedureReturn *widget;
      EndIf
      *children = *children\next
    Wend
    g_list_free_(*list)
    ProcedureReturn #Null
  EndIf
  
  *child = gtk_bin_get_child_(Widget)
  If *child
    ProcedureReturn FindChild(*child, name)
  EndIf
  
  ProcedureReturn #Null
EndProcedure

Procedure ListChildren(Widget, List Children.udtChildren(), Level = 0)
  Protected *Name, *child, *list.glist, *children.glist
  
  If Level = 0
    ClearList(Children())
  EndIf
  
  *Name = gtk_widget_get_name_(Widget)
  If *Name
    AddElement(Children())
    Children()\Level = Level
    Children()\Widget = Widget
    Children()\Name = PeekS(*Name, -1, #PB_UTF8)
  EndIf
  
  *list = gtk_container_get_children_(Widget)
  If *list
    *children = *list
    While *children
      ListChildren(*children\data, Children(), Level + 1);
      *children = *children\next
    Wend
    g_list_free_(*list)
    ProcedureReturn #Null
  EndIf
  *child = gtk_bin_get_child_(Widget);
  If *child
    *Name = gtk_widget_get_name_(Widget)
    ProcedureReturn ListChildren(*child, Children(), Level + 1)
  EndIf
  
  ProcedureReturn #Null;
EndProcedure

;-Test

ImportC ""
  gtk_widget_get_allocation(widget, allocation)
EndImport

If OpenWindow(0, 0, 0, 322, 220, "PanelGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  PanelGadget     (0, 8, 8, 306, 203)
  AddGadgetItem (0, -1, "Panel 1")
  AddGadgetItem (0, -1,"Panel 2")
  CloseGadgetList()
  
  ; GTK need some time
  Delay(100)
  ;While WindowEvent() : Wend
  
  Debug "TabHeight = " + GetGadgetAttribute(0,#PB_Panel_TabHeight)
  Debug "ItemHeight = " + GetGadgetAttribute(0,#PB_Panel_ItemHeight)
  Debug "ItemWidth = " + GetGadgetAttribute(0,#PB_Panel_ItemWidth)
  
  Define NewList Childs.udtChildren()
  Define rect.GdkRectangle
  
  ;ListChildren(WindowID(#Main), Childs())
  ListChildren(GadgetID(0), Childs())
  ForEach Childs()
    Debug "Level " + Childs()\Level + ": " + Childs()\Name + " [" + Hex(Childs()\Widget) + "]"
    rect\width = 0
    rect\height = 0
    gtk_widget_get_allocation(Childs()\Widget, @rect)
    Debug "width = " + rect\width
    Debug "height = " + rect\height
  Next
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: GetGadgetAttribute(0,#PB_Panel_TabHeight) liefert -1

Beitrag von Macros »

Oder die nicht ganz so 100% sichere, aber auf jedem nicht gerade unglaublich langsamen System funktionierende Variante:

Code: Alles auswählen

  If OpenWindow(0, 0, 0, 322, 220, "PanelGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    PanelGadget     (0, 8, 8, 306, 203)
      AddGadgetItem (0, -1, "Panel 1")
      AddGadgetItem (0, -1,"Panel 2")
    CloseGadgetList()
    
    Delay(1)
    While WindowEvent():Wend
    Debug GetGadgetAttribute(0,#PB_Panel_TabHeight)  
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
Wer ganz sicher gehen will macht ein Delay(5) daraus, davon merkt der Anwender immer noch nichts.
Bild
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: GetGadgetAttribute(0,#PB_Panel_TabHeight) liefert -1

Beitrag von mk-soft »

Oder ...

Code: Alles auswählen

;-TOP

If OpenWindow(0, 0, 0, 322, 220, "PanelGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  PanelGadget     (0, 8, 8, 306, 203)
  AddGadgetItem (0, -1, "Panel 1")
  AddGadgetItem (0, -1,"Panel 2")
  CloseGadgetList()
  ; GTK need some time
  time = ElapsedMilliseconds()
  Repeat
    If GetGadgetAttribute(0,#PB_Panel_TabHeight) > 0
      Break
    Else
      Delay(1)
    EndIf
  ForEver
  Debug "GUI ready in " + Str(ElapsedMilliseconds() - time) + " ms"
  
  Debug "TabHeight = " + GetGadgetAttribute(0,#PB_Panel_TabHeight)
  Debug "ItemHeight = " + GetGadgetAttribute(0,#PB_Panel_ItemHeight)
  Debug "ItemWidth = " + GetGadgetAttribute(0,#PB_Panel_ItemWidth)
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: GetGadgetAttribute(0,#PB_Panel_TabHeight) liefert -1

Beitrag von Shardik »

mk-soft hat geschrieben: 20.02.2025 21:40 Oder ...
Ich hatte diesen Trick Fred bereits vorletztes Jahr zur Implementierung in PureBasic vorgeschlagen. Seine Antwort:
Fred hat geschrieben:Unfortunately, this workaround doesn't work if the window is invisible and blocks the whole program
Antworten