PanelGadget + BindGadgetEvent on Linux

Just starting out? Need help? Post your questions and find answers here.
Mr.L
Enthusiast
Enthusiast
Posts: 146
Joined: Sun Oct 09, 2011 7:39 am

PanelGadget + BindGadgetEvent on Linux

Post by Mr.L »

If I run this code on Windows 11, it works as expected: the new tab index is displayed. However, if I run the same code on Linux (Cinnamon), the previous tab index is displayed instead of the currently clicked one. Is this the expected behavior on Linux?
(The PB Vesion is 6.11)

Code: Select all

Procedure TabEvent()
	Debug "new tab index: " + Str(GetGadgetState(EventGadget()))
EndProcedure

OpenWindow(0,0,0,400,200,"!")
PanelGadget(0,0,0,400,100)
AddGadgetItem(0, 0, "Tab0")
AddGadgetItem(0, 1, "Tab1")
AddGadgetItem(0, 2, "Tab2")
BindGadgetEvent(0, @TabEvent(), #PB_EventType_Change)

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
User avatar
mk-soft
Always Here
Always Here
Posts: 6320
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: PanelGadget + BindGadgetEvent on Linux

Post by mk-soft »

The internal gadget data is probably only updated at WaitWindowEvent. BindGadgetEvent but processed before (signals)

Solution ...

Code: Select all

Procedure TabEvent()
  If Not EventData()
    Debug "Previous tab index: " + Str(GetGadgetState(EventGadget()))
    PostEvent(#PB_Event_Gadget, EventWindow(), EventGadget(), EventType(), #True)
  Else
    Debug "New tab index: " + Str(GetGadgetState(EventGadget()))
  EndIf
EndProcedure

OpenWindow(0,0,0,400,200,"!")
PanelGadget(0,0,0,400,100)
AddGadgetItem(0, 0, "Tab0")
AddGadgetItem(0, 1, "Tab1")
AddGadgetItem(0, 2, "Tab2")
BindGadgetEvent(0, @TabEvent(), #PB_EventType_Change)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 0
          Select EventType()
            Case #PB_EventType_Change
              ;Debug "Main new tab index: " + Str(GetGadgetState(EventGadget()))
              
          EndSelect
          
      EndSelect
  EndSelect
  
ForEver
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
mk-soft
Always Here
Always Here
Posts: 6320
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: PanelGadget + BindGadgetEvent on Linux

Post by mk-soft »

Or use signal switch_page ...

Code: Select all


ProcedureC switch_page_cb(*GtkNotebook, *Page_GtkWidget, page_num, user_data)
  Debug "Page Number " + page_num
EndProcedure

Procedure TabEvent()
  Debug "New tab index: " + Str(GetGadgetState(EventGadget()))
EndProcedure

OpenWindow(0,0,0,400,200,"!")
PanelGadget(0,0,0,400,100)
AddGadgetItem(0, 0, "Tab0")
AddGadgetItem(0, 1, "Tab1")
AddGadgetItem(0, 2, "Tab2")

;BindGadgetEvent(0, @TabEvent(), #PB_EventType_Change)
g_signal_connect_(GadgetID(0), "switch_page", @switch_page_cb(), 0)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 0
          Select EventType()
            Case #PB_EventType_Change
              ;Debug "Main new tab index: " + Str(GetGadgetState(EventGadget()))
              
          EndSelect
          
      EndSelect
  EndSelect
  
ForEver
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
Mr.L
Enthusiast
Enthusiast
Posts: 146
Joined: Sun Oct 09, 2011 7:39 am

Re: PanelGadget + BindGadgetEvent on Linux

Post by Mr.L »

Thanks for the reply!
I came up with an identical solution to your first post, event with the "Debug "previous tab index" part :D

Code: Select all

Procedure TabEvent()
	If EventData() = 0
		Debug "previous tab index: " + Str(GetGadgetState(EventGadget()))
		PostEvent(Event(), EventWindow(), EventGadget(), EventType(), 1)
	Else
		Debug "new tab index: " + Str(GetGadgetState(EventGadget()))
	EndIf
EndProcedure
The second solution (g_signal_connect_) is good to know! Thanks a lot!
Post Reply