local dirtylarry = require "dirtylarry/dirtylarry" local cursor = require("example.cursor.cursor") local cursor_url = require("example.html5_cursor") local system_name = sys.get_sys_info().system_name --pls add the files using bundle_resources parameter in game.project https://www.defold.com/manuals/project-settings/ local ICON_NAMES = { ["Windows"] = "win.ico", ["HTML5"] = "html5.ico", ["Darwin"] = "mac.png" } function toggle_cursor_lock(self) self.cursor_locked = not self.cursor_locked defos.set_cursor_locked(self.cursor_locked) local text = self.cursor_locked and "Unlock cursor" or "Lock cursor" gui.set_text(gui.get_node("lock_cursor/larrylabel"), text) end function extract_to_savefolder(res) local appname = sys.get_config("project.title") local resbuff = resource.load("/resources/"..res) local raw_bytes = buffer.get_bytes(resbuff, hash("data")) local path = sys.get_save_file(appname, res) local f = io.open(path, "wb") f:write(raw_bytes) f:flush() f:close() print(path) return path end function init(self) local appname = sys.get_config("project.title") gui.set_text(gui.get_node("bundle_path"), defos.get_bundle_root()..defos.PATH_SEP) -- custom cursors we will change between self.current_cursor = 0 -- start with default cursor (nil) self.cursors = { defos.CURSOR_HAND, defos.CURSOR_ARROW, defos.CURSOR_CROSSHAIR, defos.CURSOR_IBEAM, } if system_name == "Linux" then -- NOTE: since Defold cannot load resource without extension, we added .xcur here. -- NOTE: cursor should be normal x11 cursor file that type is: image/x-xcursor table.insert(self.cursors, defos.load_cursor(extract_to_savefolder("cursor.xcur"))) end if system_name == "Windows" then for i, v in ipairs({"cursor_01.ani", "cursor_02.ani" }) do -- load source file and write them to save folder, so that we can access them with fullpath, or you can use bundle_resource table.insert(self.cursors, defos.load_cursor(extract_to_savefolder(v))) end end if system_name == "Darwin" then table.insert(self.cursors, defos.load_cursor({ image = resource.load("/resources/cursor_mac.tiff"), hot_spot_x = 18, hot_spot_y = 2, })) end if system_name == "HTML5" then table.insert(self.cursors, defos.load_cursor(cursor_url)) end defos.on_mouse_enter(function () print("Mouse entered view") if not self.cursor_visible then defos.set_cursor_visible(false) end end) defos.on_mouse_leave(function () print("Mouse left view") if not self.cursor_visible then defos.set_cursor_visible(true) end end) if system_name == "HTML5" then defos.on_click(function () -- If we're hovering over the button if gui.get_flipbook(gui.get_node("lock_cursor/larrybutton")) == hash("button_pressed") then toggle_cursor_lock(self) end if gui.get_flipbook(gui.get_node("toggle_fullscreen/larrybutton")) == hash("button_pressed") then defos.toggle_fullscreen() end end) end defos.on_cursor_lock_disabled(function () self.cursor_locked = false gui.set_text(gui.get_node("lock_cursor/larrylabel"), "Lock cursor") end) self.cursor_visible = true self.cursor_clipped = false self.cursor_locked = false msg.post(".", "acquire_input_focus") -- Console related commands only work on Windows and in bundled builds not in editor builds if system_name == "Windows" then defos.set_console_visible(not defos.is_console_visible()) end local displays = defos.get_displays() print("Found " .. #displays .. " displays:") for i, display in ipairs(displays) do pprint(display) end local current_display_id = defos.get_current_display_id() print("Current display id: ", current_display_id) local modes = defos.get_display_modes(current_display_id) print("Found " .. #modes .. " modes for current display:") for i, mode in ipairs(modes) do print( mode.width .. "x" .. mode.height .. " " .. mode.bits_per_pixel .. "bit @" .. mode.refresh_rate .. "Hz x" .. mode.scaling_factor .. " " .. mode.orientation .. "deg" ) end print("App command line arguments:") pprint(defos.get_arguments()) end local function change_mouse_label(text) local label = gui.get_node("disable_mouse_cursor/larrylabel") gui.set_text(label,text) end function update(self, dt) local x,y,w,h = defos.get_window_size() gui.set_text(gui.get_node("window_pos"),"window position "..x.." "..y.." "..w.." "..h) x,y,w,h = defos.get_view_size() gui.set_text(gui.get_node("view_pos"),"view position "..x.." "..y.." "..w.." "..h) x, y = defos.get_cursor_pos() w, h = defos.get_cursor_pos_view() gui.set_text(gui.get_node("cursor_pos"),"cursor: "..math.floor(x).." "..math.floor(y).." view: "..math.floor(w).." "..math.floor(h)) gui.set_text(gui.get_node("is_fullscreen"),"is_fullscreen "..tostring(defos.is_fullscreen())) gui.set_text(gui.get_node("is_maximized"),"is_maximized "..tostring(defos.is_maximized())) gui.set_text(gui.get_node("is_mouse_in_view"),"is_mouse_in_view "..tostring(defos.is_mouse_in_view())) end function update_clipping_label(self) if self.cursor_clipped then text = "Stop clipping" else text = "Clip cursor" end gui.set_text(gui.get_node("clip_cursor/larrylabel"), text) end function on_input(self, action_id, action) self.input_title = dirtylarry:input("window_title", action_id, action, gui.KEYBOARD_TYPE_DEFAULT, "Type text") dirtylarry:button("set_window_title", action_id, action, function () defos.set_window_title(tostring(self.input_title)) end) dirtylarry:button("disable_minimize_button", action_id, action, function () defos.disable_minimize_button() end) dirtylarry:button("disable_maximize_button", action_id, action, function () defos.disable_maximize_button() end) dirtylarry:button("disable_window_resize", action_id, action, function () defos.disable_window_resize() end) dirtylarry:button("random_window_size", action_id, action, function () defos.set_window_size(math.random(1,500),math.random(1,500),math.random(100,1024),math.random(100,768)) end) dirtylarry:button("set_window_size", action_id, action, function () defos.set_view_size(nil, nil, 1024, 768) end) dirtylarry:button("toggle_fullscreen", action_id, action, function () if system_name ~= "HTML5" then defos.toggle_fullscreen() end end) dirtylarry:button("toggle_maximize", action_id, action, function () defos.toggle_maximized() end) dirtylarry:button("disable_mouse_cursor", action_id, action, function () local cursor_visible = not self.cursor_visible self.cursor_visible = cursor_visible defos.set_cursor_visible(cursor_visible) cursor.set_software_cursor_enabled(not cursor_visible) change_mouse_label(cursor_visible and "Hide mouse cursor" or "Show mouse cursor") end) dirtylarry:button("random_cursor_pos", action_id, action, function() local x = math.random(1,2000) local y = math.random(1,2000) defos.set_cursor_pos_view(x, y) end) dirtylarry:button("clip_cursor", action_id, action, function() self.cursor_clipped = not self.cursor_clipped defos.set_cursor_clipped(self.cursor_clipped) update_clipping_label(self) end) dirtylarry:button("lock_cursor", action_id, action, function() if system_name ~= "HTML5" then toggle_cursor_lock(self) end end) dirtylarry:button("set_icon", action_id, action, function() defos.set_window_icon(defos.get_bundle_root()..defos.PATH_SEP..ICON_NAMES[system_name]) end) dirtylarry:button("change_cursor", action_id, action, function() self.current_cursor = self.current_cursor + 1 if self.current_cursor > #self.cursors then self.current_cursor = 0 end defos.set_cursor(self.cursors[self.current_cursor]) end) end