window call back linux(gdk)

Share your advanced PureBasic knowledge/code with the community.
User avatar
idle
Always Here
Always Here
Posts: 6094
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

window call back linux(gdk)

Post by idle »

Gets mousewheel scroll direction

Code: Select all

 ;-TOP by Idle, v0.00.0, 21.02.2011
;  Fixed by mk-soft, v1.01.1, 06.11.2025

;GdkEventTypes
; #GDK_NOTHING            = -1
; #GDK_DELETE             = 0
; #GDK_DESTROY            = 1
; #GDK_EXPOSE             = 2
; #GDK_MOTION_NOTIFY      = 3
; #GDK_BUTTON_PRESS       = 4
; #GDK_2BUTTON_PRESS      = 5
; #GDK_3BUTTON_PRESS      = 6
; #GDK_BUTTON_RELEASE     = 7
; #GDK_KEY_PRESS          = 8
; #GDK_KEY_RELEASE        = 9
; #GDK_ENTER_NOTIFY       = 10
; #GDK_LEAVE_NOTIFY       = 11
; #GDK_FOCUS_CHANGE       = 12
; #GDK_CONFIGURE          = 13
; #GDK_MAP                = 14
; #GDK_UNMAP              = 15
; #GDK_PROPERTY_NOTIFY    = 16
; #GDK_SELECTION_CLEAR    = 17
; #GDK_SELECTION_REQUEST  = 18
; #GDK_SELECTION_NOTIFY   = 19
; #GDK_PROXIMITY_IN       = 20
; #GDK_PROXIMITY_OUT      = 21
; #GDK_DRAG_ENTER         = 22
; #GDK_DRAG_LEAVE         = 23
; #GDK_DRAG_MOTION        = 24
; #GDK_DRAG_STATUS        = 25
; #GDK_DROP_START         = 26
; #GDK_DROP_FINISHED      = 27
; #GDK_CLIENT_EVENT       = 28
; #GDK_VISIBILITY_NOTIFY  = 29
; #GDK_NO_EXPOSE          = 30
; #GDK_SCROLL             = 31
; #GDK_WINDOW_STATE       = 32
; #GDK_SETTING            = 33
; #GDK_OWNER_CHANGE       = 34
; #GDK_GRAB_BROKEN        = 35
; #GDK_DAMAGE             = 36
#GDK_TOUCH_BEGIN          = 37
#GDK_TOUCH_UPDATE         = 38
#GDK_TOUCH_END            = 39
#GDK_TOUCH_CANCEL         = 40
#GDK_TOUCHPAD_SWIPE       = 41
#GDK_TOUCHPAD_PINCH       = 42
#GDK_PAD_BUTTON_PRESS     = 43
#GDK_PAD_BUTTON_RELEASE   = 44
#GDK_PAD_RING             = 45
#GDK_PAD_STRIP            = 46
#GDK_PAD_GROUP_MODE       = 47
#GDK_EVENT_LAST           = 48

#GDK_SCROLL_SMOOTH = 4 ; Since 3.4

Structure GdkEventScrollEx Extends GdkEventScroll
  delta_x.d
  delta_y.d
  is_stop.l
EndStructure

CompilerIf Not Defined(GdkEvent, #PB_Structure)
  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

Macro SetWindowCallback(EventFunction, UserData)
  gdk_event_handler_set_(EventFunction, UserData, 0);
EndMacro

Macro ProcessPureBasicEvents(Event)
  gtk_main_do_event_(Event);
EndMacro

; Example

CompilerIf #PB_Compiler_IsMainFile
  
  ;Our call back function
  
  ProcedureC MyWindowCallBack(*Event.GdkEvent, UserData);
    If *Event\Type = #GDK_SCROLL
      If  *Event\scroll\direction  = #GDK_SCROLL_UP
        Debug "Scroll UP"
      ElseIf  *Event\scroll\direction  =  #GDK_SCROLL_DOWN
        Debug "Scroll Down "
      EndIf
    ElseIf *Event\Type = #GDK_BUTTON_PRESS
      Debug "Button Press " + *Event\button\button
      ;ProcedureReturn 1
    EndIf
    
    ;Pass control back to pb so it can get events 
    ProcessPureBasicEvents(*Event)
    
  EndProcedure
  
  OpenWindow(1,0,0,200,300,"test",#PB_Window_SystemMenu)
  SetWindowCallback(@MyWindowCallBack(), 1)
  ButtonGadget(0,10,10,60,20,"quit")
  
  Repeat
    
    Event = WaitWindowEvent()
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            quit = 1
        EndSelect
    EndSelect
    
  Until  Event = #PB_Event_CloseWindow Or quit
  
CompilerEndIf



Windows 11, Manjaro, Raspberry Pi OS
Image
User avatar
bembulak
Enthusiast
Enthusiast
Posts: 576
Joined: Mon Mar 06, 2006 3:53 pm
Location: Austria

Re: window call back linux(gdk)

Post by bembulak »

Interesting and useful!
Thanks a lot for sharing!
cheers,

bembulak
User avatar
mk-soft
Always Here
Always Here
Posts: 6410
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: window call back linux(gdk)

Post by mk-soft »

Hello Idle,

I found the old code with me again and realised that it is yours.
Unfortunately, you made a mistake with the GdkEvent structure and corrected it.

SetWindowCallback for Linux ;)

Code: Select all

;-TOP by Idle, v0.00.0, 21.02.2011
;  Fixed by mk-soft, v1.01.1, 06.11.2025

;GdkEventTypes
; #GDK_NOTHING            = -1
; #GDK_DELETE             = 0
; #GDK_DESTROY            = 1
; #GDK_EXPOSE             = 2
; #GDK_MOTION_NOTIFY      = 3
; #GDK_BUTTON_PRESS       = 4
; #GDK_2BUTTON_PRESS      = 5
; #GDK_3BUTTON_PRESS      = 6
; #GDK_BUTTON_RELEASE     = 7
; #GDK_KEY_PRESS          = 8
; #GDK_KEY_RELEASE        = 9
; #GDK_ENTER_NOTIFY       = 10
; #GDK_LEAVE_NOTIFY       = 11
; #GDK_FOCUS_CHANGE       = 12
; #GDK_CONFIGURE          = 13
; #GDK_MAP                = 14
; #GDK_UNMAP              = 15
; #GDK_PROPERTY_NOTIFY    = 16
; #GDK_SELECTION_CLEAR    = 17
; #GDK_SELECTION_REQUEST  = 18
; #GDK_SELECTION_NOTIFY   = 19
; #GDK_PROXIMITY_IN       = 20
; #GDK_PROXIMITY_OUT      = 21
; #GDK_DRAG_ENTER         = 22
; #GDK_DRAG_LEAVE         = 23
; #GDK_DRAG_MOTION        = 24
; #GDK_DRAG_STATUS        = 25
; #GDK_DROP_START         = 26
; #GDK_DROP_FINISHED      = 27
; #GDK_CLIENT_EVENT       = 28
; #GDK_VISIBILITY_NOTIFY  = 29
; #GDK_NO_EXPOSE          = 30
; #GDK_SCROLL             = 31
; #GDK_WINDOW_STATE       = 32
; #GDK_SETTING            = 33
; #GDK_OWNER_CHANGE       = 34
; #GDK_GRAB_BROKEN        = 35
; #GDK_DAMAGE             = 36
#GDK_TOUCH_BEGIN          = 37
#GDK_TOUCH_UPDATE         = 38
#GDK_TOUCH_END            = 39
#GDK_TOUCH_CANCEL         = 40
#GDK_TOUCHPAD_SWIPE       = 41
#GDK_TOUCHPAD_PINCH       = 42
#GDK_PAD_BUTTON_PRESS     = 43
#GDK_PAD_BUTTON_RELEASE   = 44
#GDK_PAD_RING             = 45
#GDK_PAD_STRIP            = 46
#GDK_PAD_GROUP_MODE       = 47
#GDK_EVENT_LAST           = 48

#GDK_SCROLL_SMOOTH = 4 ; Since 3.4

Structure GdkEventScrollEx Extends GdkEventScroll
  delta_x.d
  delta_y.d
  is_stop.l
EndStructure

CompilerIf Not Defined(GdkEvent, #PB_Structure)
  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

Macro SetWindowCallback(EventFunction, UserData)
  gdk_event_handler_set_(EventFunction, UserData, 0);
EndMacro

Macro ProcessPureBasicEvents(Event)
  gtk_main_do_event_(Event);
EndMacro

; Example

CompilerIf #PB_Compiler_IsMainFile
  
  ;Our call back function
  
  ProcedureC MyWindowCallBack(*Event.GdkEvent, UserData);
    If *Event\Type = #GDK_SCROLL
      If  *Event\scroll\direction  = #GDK_SCROLL_UP
        Debug "Scroll UP"
      ElseIf  *Event\scroll\direction  =  #GDK_SCROLL_DOWN
        Debug "Scroll Down "
      EndIf
    ElseIf *Event\Type = #GDK_BUTTON_PRESS
      Debug "Button Press " + *Event\button\button
      ;ProcedureReturn 1
    EndIf
    
    ;Pass control back to pb so it can get events 
    ProcessPureBasicEvents(*Event)
    
  EndProcedure
  
  OpenWindow(1,0,0,200,300,"test",#PB_Window_SystemMenu)
  SetWindowCallback(@MyWindowCallBack(), 1)
  ButtonGadget(0,10,10,60,20,"quit")
  
  Repeat
    
    Event = WaitWindowEvent()
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            quit = 1
        EndSelect
    EndSelect
    
  Until  Event = #PB_Event_CloseWindow Or quit
  
CompilerEndIf
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
idle
Always Here
Always Here
Posts: 6094
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

Re: window call back linux(gdk)

Post by idle »

Thanks maybe maybe I just screwed up or it changed since 2011, I had used it in OPB project which was a take on objective c or swift like oop in PB before we had bindevents.
updated 1st post
Post Reply