; Module/File: Spin_TweakedPbSpinGadget.pb ; Function: Add value change by scrollwheel over entry + key up/down in PB SpinGadget - Linux gtk2/gtk3 ; Author: Omi ; Date: Aug. 24, 2017 ; Version: 0.2 ; Target Compiler: PureBasic 5.22/5.3/5.4/5.5/5.6 ; Target OS: Linux: (X/K/L)ubuntu, Mint, 32/64, Ascii/Uni ; Link to topic: http://www.purebasic.fr/english/viewtopic.php?f=15&t=69051 ;-------------------------------------------------------------- ;same as Spin_PB_Wheelscroll++_.pb ;Mousewheel action only? see: Spin_PbSpinGadget_Wheelscroll.pb ;A simple tweak to a up/down-arrow-repeat (w/o singleclicks) has not yet succeeded! ; ;fixed version with GadgetData in a LinkedList (previously it only worked on the last of multiple SpinGadget in 1. version) EnableExplicit ; Object constants #Win_Main = 0 Enumeration #But1 #SpBG1 #SpBG2 #But2 EndEnumeration Global.i gEvent, gEventType, gQuit ;- Part for tweaked SpinGadgets ... CompilerIf #PB_Compiler_OS = #PB_OS_Linux ImportC "" g_signal_connect(*instance, detailed_signal.p-utf8, *c_handler, *data, destroy= 0, flags= 0) As "g_signal_connect_data" EndImport ;see https://git.gnome.org/browse/gtk+/plain/gdk/gdkkeysyms.h #GDK_KEY_Up = $FF52 #GDK_KEY_Down= $FF54 Structure CALLBACKDATA GadgetNo.i WindowNo.i EndStructure Global NewList GadgetData.CALLBACKDATA() ProcedureC Callback_SpinGadgetScroll(*widget.GtkWidget, *Event.GdkEventAny, *user_data.CALLBACKDATA); match callback name with the call in SpinGadget_Tweak Protected *ev_scroll.GdkEventScroll Protected *ev_keypress.GdkEventKey Protected Ret= #False If *Event\type = #GDK_SCROLL *ev_scroll= *Event ElseIf *Event\type = #GDK_KEY_PRESS *ev_keypress= *Event EndIf If (*ev_scroll And *ev_scroll\direction = #GDK_SCROLL_UP) Or (*ev_keypress And *ev_keypress\keyval = #GDK_KEY_Up) SetGadgetText(*user_data\GadgetNo, Str(Val(GetGadgetText(*user_data\GadgetNo))+ 1)) PostEvent(#PB_Event_Gadget, *user_data\WindowNo, *user_data\GadgetNo, #PB_EventType_Up) PostEvent(#PB_Event_Gadget, *user_data\WindowNo, *user_data\GadgetNo, #PB_EventType_Change) Ret= #True; avoids focus change on up/down key ElseIf (*ev_scroll And *ev_scroll\direction = #GDK_SCROLL_DOWN) Or (*ev_keypress And *ev_keypress\keyval = #GDK_KEY_Down) SetGadgetText(*user_data\GadgetNo, Str(Val(GetGadgetText(*user_data\GadgetNo))- 1)) PostEvent(#PB_Event_Gadget, *user_data\WindowNo, *user_data\GadgetNo, #PB_EventType_Down) PostEvent(#PB_Event_Gadget, *user_data\WindowNo, *user_data\GadgetNo, #PB_EventType_Change) Ret= #True; avoids focus change on up/down key EndIf ProcedureReturn Ret EndProcedure CompilerEndIf Procedure SpinGadget_Tweak(Window, Gadget) CompilerIf #PB_Compiler_OS = #PB_OS_Linux If GadgetType(Gadget) = #PB_GadgetType_Spin Protected *entry.GtkEntry = g_list_nth_data_(gtk_container_get_children_(GadgetID(Gadget)), 0) AddElement(GadgetData()) GadgetData()\GadgetNo= Gadget GadgetData()\WindowNo= Window gtk_widget_add_events_(*entry, #GDK_SCROLL_MASK | #GDK_KEY_PRESS_MASK) g_signal_connect_(*entry, "scroll-event", @Callback_SpinGadgetScroll(), @GadgetData()); event on wheelscrolling over entry g_signal_connect_(*entry, "key-press-event", @Callback_SpinGadgetScroll(), @GadgetData()); event on key up/down on focussed entry EndIf CompilerEndIf EndProcedure ;- ... End of part Procedure Create_WinMain() If OpenWindow(#Win_Main, 300, 200, 600, 200, "PB-SpinGadget w. scrollwheel + up/down-key support", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) ButtonGadget (#But1, 5, 5, 100, 26, "Gadget in front") TextGadget (#PB_Any, 5, 45, 190, 22, "Tweaked PB-StringGadget") SpinGadget (#SpBG1, 200, 40, 100, 26, 0, 10, #PB_Spin_Numeric) TextGadget (#PB_Any, 5, 80, 190, 22, "Standard PB-StringGadget") SpinGadget (#SpBG2, 200, 75, 100, 26, 0, 10, #PB_Spin_Numeric) ButtonGadget (#But2, 5, 110, 100, 26, "Gadget rear") SetGadgetState(#SpBG1, 5) SetGadgetState(#SpBG2, 5) SpinGadget_Tweak(#Win_Main, #SpBG1); add this call for each SpinGadget you wanna tweak GadgetToolTip(#SpBG1, "Use mousewheel on hover or up/down-keys on focused SpinGadget") EndIf EndProcedure Create_WinMain() Repeat gEvent= WaitWindowEvent() Select gEvent Case #PB_Event_CloseWindow gQuit= #True Case #PB_Event_Gadget If EventGadget() = #SpBG1 gEventType= EventType() If gEventType = #PB_EventType_Up Debug "SpinGadget up" ElseIf gEventType = #PB_EventType_Down Debug "SpinGadget down" ElseIf gEventType = #PB_EventType_Change Debug "SpinGadget change" Debug " ---" EndIf EndIf EndSelect Until gQuit ; IDE Options = PureBasic 5.62 (Linux - x86) ; CursorPosition = 39 ; Folding = - ; EnableXP ; EnableUnicode