--- Ensures the `terminal` global variable exists, creating it if it does not. | |
--- This allows other parts of the codebase to safely access and modify the `terminal` table. | |
if not rawget(_G, "terminal") then | |
terminal = {} | |
end | |
local terminal = terminal | |
if not terminal.targets then | |
terminal.targets = {} | |
terminal.activate_time = RealTime() | |
end | |
--- | |
--- Adds a `TerminalTarget` object to the `terminal.targets` table and sorts the table by the `terminal_target_priority` field in descending order. | |
--- | |
--- @param target TerminalTarget The `TerminalTarget` object to add to the `terminal.targets` table. | |
--- | |
function terminal.AddTarget(target) | |
assert(IsKindOf(target, "TerminalTarget")) | |
table.insert_unique(terminal.targets, target) | |
terminal.SortTargets() | |
end | |
--- | |
--- Removes a `TerminalTarget` object from the `terminal.targets` table. | |
--- | |
--- @param target TerminalTarget The `TerminalTarget` object to remove from the `terminal.targets` table. | |
--- | |
function terminal.RemoveTarget(target) | |
table.remove_entry(terminal.targets, target) | |
end | |
--- | |
--- Sorts the `terminal.targets` table in descending order by the `terminal_target_priority` field. | |
--- | |
function terminal.SortTargets() | |
table.sortby_field_descending(terminal.targets, "terminal_target_priority") | |
end | |
--- | |
--- Handles mouse events for the terminal system. | |
--- | |
--- This function is called when a mouse event occurs, such as mouse position changes, mouse button presses/releases, and mouse wheel scrolling. | |
--- It iterates through the `terminal.targets` table and calls the `MouseEvent` method on each `TerminalTarget` object, passing the event details. | |
--- If any `TerminalTarget` object returns "break", the function immediately returns "break" to stop further processing. | |
--- If the event is a mouse wheel or mouse button event, the function checks for any associated shortcuts and calls the `terminal.Shortcut` function to handle the shortcut. | |
--- | |
--- @param event string The type of mouse event that occurred, such as "OnMousePos", "OnMouseButtonDown", "OnMouseButtonUp", "OnMouseWheelBack", or "OnMouseWheelForward". | |
--- @param pt table The position of the mouse cursor, in the format `{x = x, y = y}`. | |
--- @param button string The mouse button that was pressed or released, such as "Left", "Right", or "Middle". | |
--- @param time number The timestamp of the mouse event. | |
--- @param last_pos_event boolean Whether this is the last position event in a series of mouse position events. | |
--- @return string|nil "break" if the function should stop processing the event, or nil if the event should continue to be processed. | |
--- | |
function terminal.MouseEvent(event, pt, button, time, last_pos_event) | |
if event == "OnMousePos" and not last_pos_event then | |
return | |
end | |
for _, target in ipairs(terminal.targets) do | |
local result = target:MouseEvent(event, pt, button, time) | |
if result == "break" then | |
return "break" | |
end | |
end | |
if event == "OnMouseWheelBack" or event == "OnMouseWheelForward" then | |
local button = event == "OnMouseWheelBack" and "WheelBack" or "WheelFwd" | |
local shortcut = MouseShortcut(button) | |
if shortcut then | |
return terminal.Shortcut(shortcut, "mouse") | |
end | |
end | |
if event == "OnMouseButtonDown" or event == "OnMouseButtonDoubleClick" then | |
local shortcut = MouseShortcut(button) | |
if shortcut then | |
return terminal.Shortcut(shortcut, "mouse") | |
end | |
end | |
if event == "OnMouseButtonUp" then | |
local shortcut = MouseShortcut(button) | |
if shortcut then | |
return terminal.Shortcut("-" .. shortcut, "mouse") | |
end | |
end | |
end | |
--- | |
--- Checks if the specified shortcut is currently pressed. | |
--- | |
--- This function checks if all the key or button combinations that make up the specified shortcut are currently pressed. It supports both keyboard and gamepad shortcuts. | |
--- | |
--- @param shortcut string The shortcut to check, in the format "key1+key2+key3" or "button1+button2+button3". | |
--- @return boolean true if the shortcut is currently pressed, false otherwise. | |
--- | |
function terminal.IsShortcutPressed(shortcut) | |
assert(IsAsyncCode()) | |
local sc_list = GetShortcuts(shortcut) | |
for i = 1, 3 do | |
if (sc_list[i] or "") ~= "" then | |
local sc = SplitShortcut(sc_list[i]) | |
local all_pressed = true | |
for j = 1, #sc do | |
if i < 3 then | |
local vk = VKStrNamesInverse[sc[j]] or MouseVKStrNamesInverse[sc[j]] | |
if vk and (not terminal.IsKeyPressed(vk)) then | |
all_pressed = false | |
break | |
end | |
else | |
if Platform.pc then | |
local pressed = false | |
for k = 0, XInput.MaxControllers() - 1 do | |
if XInput.IsCtrlButtonPressed(k, sc[j]) then | |
pressed = true | |
break | |
end | |
end | |
if not pressed then | |
all_pressed = false | |
break | |
end | |
else | |
if not XInput.IsCtrlButtonPressed(ActiveController, sc[j]) then | |
all_pressed = false | |
break | |
end | |
end | |
end | |
end | |
if all_pressed then | |
return true | |
end | |
end | |
end | |
return false | |
end | |
--- Dispatches a shortcut event to all registered terminal targets. | |
--- | |
--- @param shortcut string The shortcut to dispatch, in the format "key1+key2+key3" or "button1+button2+button3". | |
--- @param source string The source of the shortcut, either "keyboard" or "gamepad". | |
--- @param ... any Additional arguments to pass to the shortcut handler. | |
--- @return string "break" if any of the targets returned "break", nil otherwise. | |
function terminal.Shortcut(shortcut, source, ...) | |
for _, target in ipairs(terminal.targets) do | |
if target:OnShortcut(shortcut, source, ...) == "break" then | |
return "break" | |
end | |
end | |
end | |
--- Dispatches a system event to all registered terminal targets. | |
--- | |
--- @param event string The system event to dispatch. | |
--- @param ... any Additional arguments to pass to the system event handler. | |
--- @return string "break" if any of the targets returned "break", nil otherwise. | |
function terminal.SysEvent(event, ...) | |
for _, target in ipairs(terminal.targets) do | |
local result = target:SysEvent(event, ...) | |
if result == "break" then | |
return "break" | |
end | |
end | |
end | |
--- Dispatches a touch event to all registered terminal targets. | |
--- | |
--- @param event string The touch event to dispatch. | |
--- @param ... any Additional arguments to pass to the touch event handler. | |
--- @return string "break" if any of the targets returned "break", nil otherwise. | |
function terminal.TouchEvent(event, ...) | |
for _, target in ipairs(terminal.targets) do | |
local result = target:TouchEvent(event, ...) | |
if result == "break" then | |
return "break" | |
end | |
end | |
end | |
--- Dispatches a keyboard event to all registered terminal targets. | |
--- | |
--- @param event string The keyboard event to dispatch, either "OnKbdKeyDown" or "OnKbdKeyUp". | |
--- @param ... any Additional arguments to pass to the keyboard event handler. | |
--- @return string "break" if any of the targets returned "break", nil otherwise. | |
local function KeyboardEventDispatch(event, ...) | |
for _, target in ipairs(terminal.targets) do | |
if target:KeyboardEvent(event, ...) == "break" then | |
return "break" | |
end | |
end | |
if event == "OnKbdKeyDown" then | |
local virtual_key, repeated = ... | |
local shortcut = KbdShortcut(virtual_key) | |
if shortcut then | |
return terminal.Shortcut(shortcut, "keyboard", nil, repeated) | |
end | |
end | |
if event == "OnKbdKeyUp" then | |
local virtual_key = ... | |
local shortcut = KbdShortcut(virtual_key) | |
if shortcut then | |
return terminal.Shortcut("-" .. shortcut, "keyboard") | |
end | |
end | |
end | |
--- Dispatches a keyboard event to all registered terminal targets. | |
--- | |
--- If the event is "OnKbdKeyDown" or "OnKbdKeyUp", the function will call `KeyboardEventDispatch` with the remaining arguments. | |
--- Otherwise, it will call `KeyboardEventDispatch` with the `char` argument and the remaining arguments. | |
--- | |
--- @param event string The keyboard event to dispatch, either "OnKbdKeyDown" or "OnKbdKeyUp". | |
--- @param char string The character of the key that was pressed or released. | |
--- @param ... any Additional arguments to pass to the keyboard event handler. | |
--- @return string "break" if any of the targets returned "break", nil otherwise. | |
function terminal.KeyboardEvent(event, char, ...) | |
-- Drop the first argument "char", as it is meaningless in case of OnKbdKeyDown or OnKbdKeyUp and can only cause confusion | |
if event == "OnKbdKeyDown" or event == "OnKbdKeyUp" then | |
return KeyboardEventDispatch(event, ...) | |
else | |
return KeyboardEventDispatch(event, char, ...) | |
end | |
end | |
--- Dispatches a file event to all registered terminal targets. | |
--- | |
--- @param event string The file event to dispatch, such as "OnFileChanged" or "OnFileDeleted". | |
--- @param filename string The name of the file that triggered the event. | |
--- @return string "break" if any of the targets returned "break", nil otherwise. | |
function terminal.FileEvent(event, filename) | |
for _, target in ipairs(terminal.targets) do | |
local result = target:FileEvent(event, filename) | |
if result == "break" then | |
return "break" | |
end | |
end | |
end | |
--- A table of gamepad buttons that should be treated as repeatable input. | |
--- | |
--- This table maps button names to boolean values, where a true value indicates that the button should be treated as repeatable input. | |
--- Repeatable input means that the button will generate multiple events when held down, rather than just a single event when pressed and released. | |
--- | |
--- The buttons included in this table are: | |
--- - D-Pad buttons (Left, Right, Up, Down) | |
--- - Left thumbstick buttons (Up, Up-Right, Right, Down-Right, Down, Down-Left, Left, Up-Left) | |
--- - Right thumbstick buttons (Up, Down, Down-Right, Right, Up-Right) | |
--- - Left and Right shoulder buttons | |
--- | |
--- This table is used by the `terminal.XEvent` function to determine which gamepad button events should be treated as repeatable. | |
RepeatableXButtons = {["DPadLeft"]=true, ["DPadRight"]=true, ["DPadUp"]=true, ["DPadDown"]=true, ["LeftThumbUp"]=true, | |
["LeftThumbUpRight"]=true, ["LeftThumbRight"]=true, ["LeftThumbDownRight"]=true, ["LeftThumbDown"]=true, | |
["LeftThumbDownLeft"]=true, ["LeftThumbLeft"]=true, ["LeftThumbUpLeft"]=true, ["RightThumbUp"]=true, | |
["RightThumbDown"]=true, ["RightThumbDownRight"]=true, ["RightThumbRight"]=true, ["RightThumbUpRight"]=true, | |
["LeftShoulder"]=true, ["RightShoulder"]=true} | |
--- | |
--- Dispatches an X-input (gamepad) event to all registered terminal targets. | |
--- | |
--- This function handles the following X-input events: | |
--- - `OnXButtonDown`: Dispatches the corresponding gamepad button press shortcut to the terminal targets. | |
--- - `OnXButtonUp`: Dispatches the corresponding gamepad button release shortcut to the terminal targets. | |
--- - `OnXButtonRepeat`: Dispatches the corresponding gamepad button repeat shortcut to the terminal targets, but only for buttons marked as repeatable in the `RepeatableXButtons` table. | |
--- | |
--- @param event string The X-input event to dispatch, such as "OnXButtonDown", "OnXButtonUp", or "OnXButtonRepeat". | |
--- @param ... any Additional arguments to pass to the X-input event handler. | |
--- @return string "break" if any of the targets returned "break", nil otherwise. | |
function terminal.XEvent(event, ...) | |
for _, target in ipairs(terminal.targets) do | |
if target:XEvent(event, ...) == "break" then | |
return "break" | |
end | |
end | |
if event == "OnXButtonDown" then | |
local button, controller_id = ... | |
local shortcut = XInputShortcut(button, controller_id) | |
if shortcut then | |
if terminal.Shortcut("+" .. shortcut, "gamepad", controller_id) == "break" then | |
return "break" | |
end | |
return terminal.Shortcut(shortcut, "gamepad", controller_id) | |
end | |
end | |
if event == "OnXButtonUp" then | |
local button, controller_id = ... | |
local shortcut = XInputShortcut(button, controller_id) | |
if shortcut then | |
return terminal.Shortcut("-" .. shortcut, "gamepad", controller_id) | |
end | |
end | |
if event == "OnXButtonRepeat" then | |
local button, controller_id = ... | |
if RepeatableXButtons[button] then | |
local shortcut = XInputShortcut(button, controller_id) | |
if shortcut then | |
return terminal.Shortcut(shortcut, "gamepad", controller_id, true) | |
end | |
end | |
end | |
end | |
----- TerminalTarget | |
--- | |
--- Defines a terminal target class with a priority value. | |
--- | |
--- The `TerminalTarget` class is used to handle various events (mouse, keyboard, system, touch, X-input, file) for a terminal target. The `terminal_target_priority` field is used to determine the order in which terminal targets are processed when handling these events. | |
--- | |
--- @class TerminalTarget | |
--- @field terminal_target_priority number The priority of the terminal target, used to determine the order in which targets are processed. | |
DefineClass.TerminalTarget = {__parents={"PropertyObject"}, terminal_target_priority=0} | |
--- | |
--- Dispatches the corresponding mouse event to the terminal target. | |
--- | |
--- @param event string The mouse event to dispatch, such as "OnMouseMove", "OnMouseButtonDown", etc. | |
--- @param ... any Additional arguments to pass to the mouse event handler. | |
--- @return string "break" if the event handler returned "break", nil otherwise. | |
function TerminalTarget:MouseEvent(event, ...) | |
return self[event](self, ...) | |
end | |
--- | |
--- Dispatches the corresponding keyboard event to the terminal target. | |
--- | |
--- @param event string The keyboard event to dispatch, such as "OnKbdChar", "OnKbdKeyDown", or "OnKbdKeyUp". | |
--- @param ... any Additional arguments to pass to the keyboard event handler. | |
--- @return string "break" if the event handler returned "break", nil otherwise. | |
function TerminalTarget:KeyboardEvent(event, ...) | |
return self[event](self, ...) | |
end | |
--- | |
--- Dispatches the corresponding system event to the terminal target. | |
--- | |
--- @param event string The system event to dispatch, such as "OnSysResize", "OnSysActivate", etc. | |
--- @param ... any Additional arguments to pass to the system event handler. | |
--- @return string "break" if the event handler returned "break", nil otherwise. | |
function TerminalTarget:SysEvent(event, ...) | |
return self[event](self, ...) | |
end | |
--- | |
--- Dispatches the corresponding touch event to the terminal target. | |
--- | |
--- @param event string The touch event to dispatch, such as "OnTouchMove", "OnTouchStart", or "OnTouchEnd". | |
--- @param ... any Additional arguments to pass to the touch event handler. | |
--- @return string "break" if the event handler returned "break", nil otherwise. | |
function TerminalTarget:TouchEvent(event, ...) | |
return self[event](self, ...) | |
end | |
--- | |
--- Dispatches the corresponding X-input event to the terminal target. | |
--- | |
--- @param event string The X-input event to dispatch, such as "OnXButtonDown", "OnXButtonUp", or "OnXButtonRepeat". | |
--- @param ... any Additional arguments to pass to the X-input event handler. | |
--- @return string "break" if the event handler returned "break", nil otherwise. | |
function TerminalTarget:XEvent(event, ...) | |
return self[event](self, ...) | |
end | |
--- | |
--- Handles a shortcut event for the terminal target. | |
--- | |
--- @param shortcut string The shortcut identifier. | |
--- @param source any The source of the shortcut event. | |
--- @param controller_id number The ID of the controller that triggered the shortcut. | |
--- @param repeated boolean Whether the shortcut event is a repeat. | |
--- @param ... any Additional arguments to pass to the shortcut event handler. | |
--- @return string "break" if the event handler returned "break", nil otherwise. | |
function TerminalTarget:OnShortcut(shortcut, source, controller_id, repeated, ...) | |
end | |
--- | |
--- Dispatches the corresponding file event to the terminal target. | |
--- | |
--- @param event string The file event to dispatch. | |
--- @param ... any Additional arguments to pass to the file event handler. | |
--- @return string "break" if the event handler returned "break", nil otherwise. | |
function TerminalTarget:FileEvent(event, ...) | |
return self[event](self, ...) | |
end | |
-----|| event handler funcs start ||------- | |
--- | |
--- Handles a mouse button double click event for the terminal target. | |
--- | |
--- @param pt table The position of the mouse pointer. | |
--- @param button number The mouse button that was double clicked. | |
--- @return string "break" if the event handler returned "break", nil otherwise. | |
function TerminalTarget:OnMouseButtonDoubleClick(pt, button) | |
return self:OnMouseButtonDown(pt, button) | |
end | |
--- | |
--- Handles a gamepad button repeat event for the terminal target. | |
--- | |
--- If the button is a repeatable X button, this function will call the `OnXButtonUp` and `OnXButtonDown` event handlers in succession. | |
--- | |
--- @param button number The gamepad button that is being repeated. | |
--- @param controller_id number The ID of the controller that is triggering the button repeat event. | |
--- @return string "break" if either the `OnXButtonUp` or `OnXButtonDown` event handlers returned "break", nil otherwise. | |
function TerminalTarget:OnXButtonRepeat(button, controller_id) | |
if RepeatableXButtons[button] then | |
local up_result = self:OnXButtonUp(button, controller_id) | |
local down_result = self:OnXButtonDown(button, controller_id) | |
if up_result == "break" or down_result == "break" then | |
return "break" | |
end | |
end | |
end | |
local function stub() end | |
----- mouse event handlers | |
TerminalTarget.OnMouseMove = stub | |
TerminalTarget.OnMousePos = stub | |
TerminalTarget.OnMouseButtonDown = stub | |
TerminalTarget.OnMouseButtonUp = stub | |
TerminalTarget.OnMouseWheelForward = stub | |
TerminalTarget.OnMouseWheelBack = stub | |
TerminalTarget.OnMouseOutside = stub | |
TerminalTarget.OnMouseInside = stub | |
----- keyboard event handlers | |
TerminalTarget.OnKbdChar = stub | |
TerminalTarget.OnKbdKeyDown = stub | |
TerminalTarget.OnKbdKeyUp = stub | |
----- keyboard ime event handlers | |
TerminalTarget.OnKbdIMEStartComposition = stub | |
TerminalTarget.OnKbdIMEEndComposition = stub | |
TerminalTarget.OnKbdIMEUpdateComposition = stub | |
----- system event handlers | |
TerminalTarget.OnSystemSize = stub | |
TerminalTarget.OnSystemVirtualKeyboard = stub | |
TerminalTarget.OnSystemActivate = stub | |
TerminalTarget.OnSystemInactivate = stub | |
TerminalTarget.OnSystemMinimize = stub | |
----- gamepad event handlers | |
TerminalTarget.OnXNewPacket = stub | |
TerminalTarget.OnXButtonUp = stub | |
TerminalTarget.OnXButtonDown = stub | |
----- touch event handlers | |
TerminalTarget.OnTouchBegan = stub | |
TerminalTarget.OnTouchMoved = stub | |
TerminalTarget.OnTouchStationary = stub | |
TerminalTarget.OnTouchEnded = stub | |
TerminalTarget.OnTouchCancelled = stub | |
----- file event handlers | |
TerminalTarget.OnFileDrop = stub | |
-----|| event handler funcs end ||------- | |
----- FilterEventsTarget | |
--- Defines a class `FilterEventsTarget` that inherits from `TerminalTarget`. | |
--- | |
--- The `FilterEventsTarget` class is used to filter terminal events based on the | |
--- `allow_events` table. If the corresponding event type is set to `false` in | |
--- the `allow_events` table, the event will be blocked and not passed to the | |
--- terminal targets. | |
--- | |
--- The `terminal_target_priority` field sets the priority of the | |
--- `FilterEventsTarget` instance, which determines the order in which it is | |
--- processed relative to other terminal targets. | |
--- | |
--- @class FilterEventsTarget | |
--- @field terminal_target_priority number The priority of the `FilterEventsTarget` instance. | |
--- @field allow_events table A table that specifies which event types are allowed to pass through. | |
DefineClass.FilterEventsTarget = {__parents={"TerminalTarget"}, terminal_target_priority=10000000, allow_events=false} | |
--- Handles mouse events for the `FilterEventsTarget` class. | |
--- | |
--- If the `allow_events.mouse` field is `true`, this function will return `"continue"` to allow the mouse event to propagate to other terminal targets. If `allow_events.mouse` is `false`, this function will return `"break"` to block the mouse event. | |
--- | |
--- @param event string The type of mouse event (e.g. "OnMouseWheelForward", "OnMouseInside", etc.) | |
--- @param ... any Additional arguments passed with the mouse event | |
--- @return string "continue" to allow the event, "break" to block the event | |
function FilterEventsTarget:MouseEvent(event, ...) | |
return self.allow_events.mouse and "continue" or "break" | |
end | |
--- Handles keyboard events for the `FilterEventsTarget` class. | |
--- | |
--- If the `allow_events.keyboard` field is `true`, this function will return `"continue"` to allow the keyboard event to propagate to other terminal targets. If `allow_events.keyboard` is `false`, this function will return `"break"` to block the keyboard event. | |
--- | |
--- @param event string The type of keyboard event | |
--- @param ... any Additional arguments passed with the keyboard event | |
--- @return string "continue" to allow the event, "break" to block the event | |
function FilterEventsTarget:KeyboardEvent(event, ...) | |
return self.allow_events.keyboard and "continue" or "break" | |
end | |
--- Handles system events for the `FilterEventsTarget` class. | |
--- | |
--- This function ensures that system events are never disallowed, regardless of the values in the `allow_events` table. It always returns `"continue"` to allow the system event to propagate to other terminal targets. | |
--- | |
--- @param event string The type of system event | |
--- @param ... any Additional arguments passed with the system event | |
--- @return string "continue" to allow the event | |
function FilterEventsTarget:SysEvent(event, ...) | |
-- system events are never disallowed | |
end | |
--- Handles gamepad events for the `FilterEventsTarget` class. | |
--- | |
--- If the `allow_events["gamepad" .. (nCtrlId or "X")]` field is `true`, this function will return `"continue"` to allow the gamepad event to propagate to other terminal targets. If the field is `false`, this function will return `"break"` to block the gamepad event. | |
--- | |
--- @param event string The type of gamepad event | |
--- @param button number The gamepad button that triggered the event | |
--- @param nCtrlId number The ID of the gamepad controller (optional) | |
--- @param ... any Additional arguments passed with the gamepad event | |
--- @return string "continue" to allow the event, "break" to block the event | |
function FilterEventsTarget:XEvent(event, button, nCtrlId, ...) | |
return self.allow_events["gamepad" .. (nCtrlId or "X")] and "continue" or "break" | |
end | |
-- allow_events[source] must be true for events to pass | |
--- Filters the terminal event sources by adding or removing a `FilterEventsTarget` object. | |
--- | |
--- If `allow_events` is provided, a new `FilterEventsTarget` object is created with the specified `allow_events` table and `terminal_target_priority`. Any existing `FilterEventsTarget` objects are removed from the terminal targets. | |
--- | |
--- If `allow_events` is not provided, any existing `FilterEventsTarget` objects are removed from the terminal targets. | |
--- | |
--- @param allow_events table A table that specifies which event types are allowed to pass through. | |
--- @param priority number The priority of the `FilterEventsTarget` object. | |
function FilterTerminalEventSources(allow_events, priority) | |
for _, target in ipairs(terminal.targets) do | |
if IsKindOf(target, "FilterEventsTarget") then | |
terminal.RemoveTarget(target) | |
break | |
end | |
end | |
if allow_events then | |
FilterEventsTarget:new{allow_events=allow_events, terminal_target_priority=priority} | |
end | |
end | |
--- Handles the reset of the device. | |
--- | |
--- This function is called when the device is reset. It is currently empty and does not perform any actions. | |
function OnDeviceReset() | |
end | |
------------------ Sound Mute ---------------------- | |
--- Handles the system inactivate event. | |
--- | |
--- If the `config.DontMuteWhenInactive` flag is not set, this function will set the "Inactive" mute sound reason, which will mute all sounds while the system is inactive. | |
function OnMsg.SystemInactivate() | |
if not config.DontMuteWhenInactive then | |
SetMuteSoundReason("Inactive") | |
end | |
end | |
--- Handles the system activate event. | |
--- | |
--- This function is called when the system is activated. It sets the `activate_time` field of the `terminal` table to the current real time, and clears the "Inactive" mute sound reason, which will unmute all sounds. | |
function OnMsg.SystemActivate() | |
terminal.activate_time = RealTime() | |
ClearMuteSoundReason("Inactive") | |
end | |
------------------- Keyboard on consoles --------------------- | |
--- Initializes the `g_KeyboardConnected` global variable based on the platform. | |
--- | |
--- If `FirstLoad` is true, `g_KeyboardConnected` is set to the opposite of `Platform.console`. This is likely used to track whether a keyboard is connected, as the platform may not provide explicit connection/disconnection events. | |
if FirstLoad then | |
g_KeyboardConnected = not Platform.console | |
end | |
--- Handles keyboard and mouse connection/disconnection events on console platforms. | |
--- | |
--- On console platforms, this code sets the `g_KeyboardConnected` and `g_MouseConnected` global variables based on keyboard and mouse connection/disconnection events. It also creates a real-time thread on Xbox platforms to periodically check the connection status and send the appropriate messages. | |
--- | |
--- @module terminal | |
--- @within CommonLua.Core | |
if Platform.console then | |
function OnMsg.KeyboardConnected() | |
g_KeyboardConnected = true | |
end | |
function OnMsg.KeyboardDisconnected() | |
g_KeyboardConnected = false | |
end | |
function OnMsg.MouseConnected() | |
g_MouseConnected = true | |
UnforceHideMouseCursor("MouseDisconnected") | |
end | |
function OnMsg.MouseDisconnected() | |
g_MouseConnected = false | |
ForceHideMouseCursor("MouseDisconnected") | |
end | |
function OnMsg.Autorun() | |
if terminal.IsMouseEnabled() then | |
Msg("MouseConnected") | |
else | |
Msg("MouseDisconnected") | |
end | |
end | |
-- there are no keyboard or mouse connected messages on xbox, so we start a thread | |
if Platform.xbox then | |
if FirstLoad then | |
KeyboardMouseSupportThread = false | |
end | |
DeleteThread(KeyboardMouseSupportThread) | |
KeyboardMouseSupportThread = CreateRealTimeThread(function() | |
while true do | |
Sleep(5000) | |
local mouse = terminal.IsMouseEnabled() | |
local keyboard = terminal.IsKeyboardEnabled() | |
if mouse ~= g_MouseConnected then | |
Msg(mouse and "MouseConnected" or "MouseDisconnected") | |
end | |
if keyboard ~= g_KeyboardConnected then | |
Msg(keyboard and "KeyboardConnected" or "KeyboardDisconnected") | |
end | |
end | |
end) | |
end | |
end | |