mouse wheel

Linux specific forum
mestnyi
Addict
Addict
Posts: 1109
Joined: Mon Nov 25, 2013 6:41 am

mouse wheel

Post by mestnyi »

Can you help me? Why is this not working? That is, delta(x&y) equals zero.

Code: Select all

EnableExplicit

ImportC ""
   gdk_event_get_scroll_deltas(*Event, *delta_x, *delta_y)
EndImport

Procedure signal_event( *self, *event.gdkeventscroll, user_data )
   Protected deltaX.d, deltaY.d
   
   If *event\type = #GDK_SCROLL
      ;Debug "Scroll State " + *event\state
      gdk_event_get_scroll_deltas(*event, @deltaX, @deltaY)
      Debug ""+ *event\direction +" "+ deltaX +" "+ deltaY
   EndIf
EndProcedure

Procedure TestGadget( Canvas, X,Y,Width,Height )
  CanvasGadget(Canvas, X,Y,Width,Height, #PB_Canvas_Keyboard ) 
  
  ; g_signal_connect_data_(GadgetID(Canvas), "change-value", @signal_event( ), 0, #Null, 0)
   g_signal_connect_( GadgetID(Canvas), "event", @signal_event( ), 0 )

   SetActiveGadget( Canvas )
EndProcedure

If OpenWindow( 1, 0,0,170,170,"window_1", #PB_Window_ScreenCentered)
   TestGadget( 1, 10, 0, 160, 170 )
   
   Define gEvent, gQuit
   Repeat
      gEvent= WaitWindowEvent()
      
      Select gEvent
         Case #PB_Event_CloseWindow
            gQuit= #True
      EndSelect
      
   Until gQuit
EndIf
Last edited by mestnyi on Wed Nov 05, 2025 8:30 pm, edited 1 time in total.
User avatar
mk-soft
Always Here
Always Here
Posts: 6402
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: mouse wheel

Post by mk-soft »

When connecting GdkEvent, structure is structured slightly differently.

Link: https://docs.gtk.org/gdk3/union.Event.html

Example

Code: Select all

; See two posts below
Last edited by mk-soft on Thu Nov 06, 2025 6:52 pm, edited 1 time in total.
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
mestnyi
Addict
Addict
Posts: 1109
Joined: Mon Nov 25, 2013 6:41 am

Re: mouse wheel

Post by mestnyi »

Hi mk-soft , thank you for sending it. Turned out the problem was that the container didn't work without the flag.

Code: Select all

EnableExplicit

ImportC ""
   gdk_event_get_scroll_deltas(*Event, *delta_x, *delta_y)
EndImport

Structure GdkEventScrollEx Extends GdkEventScroll
    deltaX.d
    deltaY.d
    is_stop.l
  EndStructure
  
  
Procedure signal_event( *self, *event.GdkEventScrollEx, user_data )
   Protected deltaX.d, deltaY.d
   
   If *event\type = #GDK_SCROLL
      ;Debug "Scroll State " + *event\state
      gdk_event_get_scroll_deltas(*event, @deltaX, @deltaY)
      
      Debug ""+ *event\direction +" "+ *event\deltaX +" "+ *event\deltaY +" "+ deltaX +" "+ deltaY
   EndIf
EndProcedure

Procedure TestGadget( Canvas, X,Y,Width,Height )
  ;CanvasGadget(Canvas, X,Y,Width,Height, #PB_Canvas_Keyboard ) 
  CanvasGadget(Canvas, X,Y,Width,Height, #PB_Canvas_Container) : CloseGadgetList()

  ; g_signal_connect_data_(GadgetID(Canvas), "change-value", @signal_event( ), 0, #Null, 0)
   g_signal_connect_( GadgetID(Canvas), "event", @signal_event( ), 0 )

   SetActiveGadget( Canvas )
EndProcedure

If OpenWindow( 1, 0,0,170,170,"window_1", #PB_Window_ScreenCentered)
   TestGadget( 1, 10, 0, 160, 170 )
   
   Define gEvent, gQuit
   Repeat
      gEvent= WaitWindowEvent()
      
      Select gEvent
         Case #PB_Event_CloseWindow
            gQuit= #True
      EndSelect
      
   Until gQuit
EndIf
User avatar
mk-soft
Always Here
Always Here
Posts: 6402
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: mouse wheel

Post by mk-soft »

Scroll delta is only available with Controls that support direction #GDK_SCROLL_SMOOTH.
All other controls check the direction up, down, left and right.

Code: Select all

;-TOP my mk-soft

CompilerIf #PB_Compiler_OS = #PB_OS_Linux
  
  #GDK_SCROLL_SMOOTH = 4 ; Since 3.4
  
  Structure GdkEventScrollEx Extends GdkEventScroll
    delta_x.d
    delta_y.d
    is_stop.l
  EndStructure
  
  CompilerIf Defined(GdkEvent,#PB_Structure)=#False
    Structure GdkEvent
      StructureUnion
        Type.l
        any.GdkEventAny
        expose.GdkEventExpose   
        no_expose.GdkEventNoExpose   
        visibility.GdkEventVisibility   
        motion.GdkEventMotion
        button.GdkEventButton
        scroll.GdkEventScrollEx
        key.GdkEventKey
        crossing.GdkEventCrossing
        focus_change.GdkEventFocus           
        configure.GdkEventConfigure       
        property.GdkEventProperty   
        selection.GdkEventSelection   
        proximity.GdkEventProximity
        client.GdkEventClient       
        dnd.GdkEventDND               
        window_state.GdkEventWindowState       
        setting.GdkEventSetting           
      EndStructureUnion
    EndStructure
  CompilerEndIf
  
  ; ----
  
  Enumeration #PB_EventType_FirstCustomValue
    #PB_EventType_MouseWheelX
    #PB_EventType_MouseWheelY
  EndEnumeration
  
  ProcedureC _signal_event_cb(*Widget, *Event.GdkEvent, Gadget)
    With *Event
      Select \Type
        Case #GDK_BUTTON_PRESS
          Select \button\button
            Case  1
              ;Debug "Left Button Press"
              PostEvent(#PB_Event_Gadget, EventWindow(), Gadget, #PB_EventType_LeftButtonDown)
            Case 2
              ;Debug "Right Button Press"
              PostEvent(#PB_Event_Gadget, EventWindow(), Gadget, #PB_EventType_MiddleButtonDown)
            Case 3
              ;Debug "Right Button Press"
              PostEvent(#PB_Event_Gadget, EventWindow(), Gadget, #PB_EventType_RightButtonDown)
          EndSelect
          ProcedureReturn #True
          
        Case #GDK_BUTTON_RELEASE
          Select \button\button
            Case  1
              ;Debug "Left Button Release"
              PostEvent(#PB_Event_Gadget, EventWindow(), Gadget, #PB_EventType_LeftButtonUp)
            Case 2
              ;Debug "Right Button Release"
              PostEvent(#PB_Event_Gadget, EventWindow(), Gadget, #PB_EventType_MiddleButtonUp)
            Case 3
              ;Debug "Right Button Release"
              PostEvent(#PB_Event_Gadget, EventWindow(), Gadget, #PB_EventType_RightButtonUp)
          EndSelect
          ProcedureReturn #True
          
        Case #GDK_SCROLL
          
          If \scroll\direction = #GDK_SCROLL_LEFT
            PostEvent(#PB_Event_Gadget, GetActiveWindow(), user_data, #PB_EventType_MouseWheelX, -1)
          ElseIf \scroll\direction = #GDK_SCROLL_RIGHT
            PostEvent(#PB_Event_Gadget, GetActiveWindow(), user_data, #PB_EventType_MouseWheelX, 1)
          ElseIf \scroll\direction = #GDK_SCROLL_UP
            PostEvent(#PB_Event_Gadget, GetActiveWindow(), user_data, #PB_EventType_MouseWheelY, -1)
          ElseIf \scroll\direction = #GDK_SCROLL_DOWN
            PostEvent(#PB_Event_Gadget, GetActiveWindow(), user_data, #PB_EventType_MouseWheelY, 1)
          ElseIf \scroll\direction = #GDK_SCROLL_SMOOTH
            If \scroll\delta_x <> 0.0
              PostEvent(#PB_Event_Gadget, GetActiveWindow(), user_data, #PB_EventType_MouseWheelX, \scroll\delta_x)
            EndIf
            If \scroll\delta_y <> 0.0
              PostEvent(#PB_Event_Gadget, GetActiveWindow(), user_data, #PB_EventType_MouseWheelY, \scroll\delta_y)
            EndIf
          EndIf
          ProcedureReturn #True
          
      EndSelect
    EndWith
    ProcedureReturn #False
  EndProcedure
  
CompilerEndIf

; ********

OpenWindow(0, 0, 0, 420, 420, "Test Mouse Button Down/Up", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget |
                                                           #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
;CanvasGadget(0, 0, 0, 420, 420, #PB_Canvas_Container) : CloseGadgetList()
CanvasGadget(0, 0, 0, 420, 420)

signal_event_handler = g_signal_connect_(GadgetID(0), "event", @_signal_event_cb(), 0) ; <= UserData = Gadget Number

Repeat
  event = WaitWindowEvent(10)
  If event = #PB_Event_Gadget
    Select EventGadget()
      Case 0
        Select EventType()
          Case #PB_EventType_LeftButtonDown
            Debug "Mouse left button down"
          Case #PB_EventType_LeftButtonUp
            Debug "Mouse left button up"
          Case #PB_EventType_MouseWheel
            Debug "PB MouseWhell"
          Case #PB_EventType_MouseWheelX
            Debug "MouseWheelX = " + EventData()
          Case #PB_EventType_MouseWheelY
            Debug "MouseWheelY = " + EventData()
            
            
        EndSelect
    EndSelect
    
  EndIf
Until event = #PB_Event_CloseWindow
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
Post Reply