Page 1 of 1
PanelGadget + BindGadgetEvent on Linux
Posted: Thu Apr 25, 2024 6:25 pm
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
Re: PanelGadget + BindGadgetEvent on Linux
Posted: Fri Apr 26, 2024 8:23 pm
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
Re: PanelGadget + BindGadgetEvent on Linux
Posted: Fri Apr 26, 2024 8:55 pm
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
Re: PanelGadget + BindGadgetEvent on Linux
Posted: Fri Apr 26, 2024 11:08 pm
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
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!