Initial commit

This commit is contained in:
2025-07-17 20:36:20 +02:00
commit 069402c4ec
37 changed files with 7849 additions and 0 deletions

View File

@@ -0,0 +1,260 @@
;-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