;-TOP ; Comment : Linux Screen3DMousePatch ; Author : mk-soft ; Version : v1.03.2 ; Create : 02.09.2022 ; Update : 10.09.2022 ; Link : https://www.purebasic.fr/english/viewtopic.php?t=79766 ; Info: ; ; - Call InitWindowMouse after OpenScreen or OpenWindowedScreen ; - Call RestoreMouse at end of program to restore desktop mouse cursor (Needs only with OpenScreen) ; - Call FrameDelay for save cpu usage (Needs only with OpenWindowedScreen) ; - Enumeration of cursor type: ; * Link: "https://docs.gtk.org/gdk3/enum.CursorType.html" ; * Blank: -2 ; ; - ScrollRange: ; * Auto scrolling range for mouse delta CompilerIf #PB_Compiler_OS = #PB_OS_Linux ImportC "" gtk_widget_get_window(widget) gdk_get_default_root_window() gdk_window_get_cursor(window) EndImport Structure udtMouseData IsWindow.i Window.i WindowID.i WindowGDK.i IsMenu.i CursorDefault.i CursorScreen.i CursorState.i x.l y.l lastX.l lastY.l deltaX.l deltaY.l menuHeight.l scrollRange.l screenWidth.l screenHeight.l EndStructure Global MyMouseData.udtMouseData Procedure InitWindowMouse(Window = 0, CursorDefault = 0, CursorScreen = 130, ScrollRange = 25) Protected PosX.l, PosY.l With MyMouseData ; Get Window Data If IsWindow(Window) \IsWindow = #True \Window = Window \WindowID = WindowID(Window) \WindowGDK = gtk_widget_get_window(\WindowID) If IsMenu(0) \IsMenu = #True \menuHeight = MenuHeight() EndIf Else \WindowGDK = gdk_get_default_root_window() EndIf ; Define Cursor Data If CursorDefault \CursorDefault = gdk_cursor_new_(CursorDefault) Else \CursorDefault = gdk_window_get_cursor(\WindowGDK) EndIf \CursorScreen = gdk_cursor_new_(CursorScreen); Blank = -2 gdk_window_set_cursor_(\WindowGDK, \CursorScreen) ; Scroll Range \scrollRange = ScrollRange \screenWidth = ScreenWidth() \screenHeight = ScreenHeight() ; Get Positions If IsWindow(Window) gtk_widget_get_pointer_(\WindowID, @PosX, @PosY) \lastX = PosX \lastY = PosY Else \x = DesktopMouseX() \y = DesktopMouseY() \lastX = \x \lastY = \y EndIf EndWith ProcedureReturn #True EndProcedure Procedure RestoreMouse() Protected window, cursor If OpenWindow(0, 0, 0, 0, 0, "Restore Mouse Cursor", #PB_Window_Invisible) window = gdk_get_default_root_window() cursor = gdk_cursor_new_(68) If window gdk_window_set_cursor_(window, cursor) EndIf EndIf EndProcedure ; ---- Procedure.f MyMouseX() ProcedureReturn MyMouseData\x EndProcedure Procedure.f MyMouseY() ProcedureReturn MyMouseData\y EndProcedure Procedure.f MyMouseDeltaX() ProcedureReturn MyMouseData\deltaX EndProcedure Procedure.f MyMouseDeltaY() ProcedureReturn MyMouseData\deltaY EndProcedure Procedure MyReleaseMouse(State) With MyMouseData \CursorState = State If \WindowGDK If State gdk_window_set_cursor_(\WindowGDK, \CursorDefault) Else gdk_window_set_cursor_(\WindowGDK, \CursorScreen) EndIf EndIf EndWith EndProcedure Procedure MyExamineMouse() Protected PosX.l, PosY.l With MyMouseData If \IsWindow gtk_widget_get_pointer_(\WindowID, @PosX, @PosY) If \IsMenu PosY - \menuHeight EndIf If PosX < 0 PosX = 0 ElseIf PosX >= \screenWidth PosX = \screenWidth - 1 EndIf If PosY < 0 PosY = 0 ElseIf PosY >= \screenHeight PosY = \screenHeight - 1 EndIf Else PosX = DesktopMouseX() PosY = DesktopMouseY() EndIf \x = PosX \y = PosY If \CursorState \deltaX = 0 \deltaY = 0 Else \deltaX = PosX - \lastX \deltaY = PosY - \lastY EndIf \lastX = PosX \lastY = PosY If PosX < \scrollRange \lastX = \scrollRange If \deltaX > \scrollRange \deltaX = \scrollRange EndIf ElseIf PosX > \screenWidth - \scrollRange \lastX = \screenWidth - \scrollRange If \deltaX < -\scrollRange \deltaX = -\scrollRange EndIf Else \lastX = PosX EndIf If PosY < \scrollRange \lastY = \scrollRange If \deltaY > \scrollRange \deltaY = \scrollRange EndIf ElseIf PosY > \screenHeight - \scrollRange \lastY = \screenHeight - \scrollRange If \deltaY < -\scrollRange \deltaY = -\scrollRange EndIf Else \lastY = PosY EndIf EndWith ProcedureReturn #True EndProcedure ;-- Macros Macro MouseX() MyMouseX() EndMacro Macro MouseY() MyMouseY() EndMacro Macro MouseDeltaX() MyMouseDeltaX() EndMacro Macro MouseDeltaY() MyMouseDeltaY() EndMacro Macro ReleaseMouse(State) MyReleaseMouse(State) EndMacro Macro ExamineMouse() MyExamineMouse() EndMacro CompilerElse Procedure InitWindowMouse(Window = 0, CursorDefault = 0, CursorScreen = 130, ScrollRange = 25) ; do nothing EndProcedure Procedure RestoreMouse() ; do nothing EndProcedure CompilerEndIf Procedure FrameDelay(Frames = 30) Static time Protected diff_time, delay_time If time diff_time = ElapsedMilliseconds() - time delay_time = (1000 / Frames) - diff_time If delay_time > 0 Delay(delay_time) EndIf EndIf time = ElapsedMilliseconds() EndProcedure ;-- End ; IDE Options = PureBasic 6.00 LTS (Linux - x64) ; CursorPosition = 253 ; FirstLine = 174 ; Folding = ---- ; EnableXP ; DPIAware