Initial commit
This commit is contained in:
260
Linux_Screen3DMousePatch.pbi
Normal file
260
Linux_Screen3DMousePatch.pbi
Normal 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
|
Reference in New Issue
Block a user