godot-demo-projects/misc/window_management/control.gd

204 lines
8.0 KiB
GDScript

extends Control
var mouse_position := Vector2()
@onready var observer: CharacterBody3D = $"../Observer"
func _ready() -> void:
if not check_wm_api():
set_physics_process(false)
set_process_input(false)
# See godotengine/godot#73563, fetching the refresh rate on every frame may be slow on some platforms.
$Labels/Label_Screen0_RefreshRate.text = "Screen0 Refresh Rate: %.2f Hz" % DisplayServer.screen_get_refresh_rate()
if DisplayServer.get_screen_count() > 1:
$Labels/Label_Screen1_RefreshRate.text = "Screen1 Refresh Rate: %.2f Hz" % DisplayServer.screen_get_refresh_rate(1)
func _physics_process(_delta: float) -> void:
var modetext := "Mode: "
if DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_FULLSCREEN:
modetext += "Fullscreen\n"
else:
modetext += "Windowed\n"
if DisplayServer.window_get_flag(DisplayServer.WINDOW_FLAG_RESIZE_DISABLED):
modetext += "Fixed Size\n"
if DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_MINIMIZED:
modetext += "Minimized\n"
if DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_MAXIMIZED:
modetext += "Maximized\n"
if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
modetext += "Mouse Captured\n"
$Buttons/Label_MouseModeCaptured_KeyInfo.show()
else:
$Buttons/Label_MouseModeCaptured_KeyInfo.hide()
$Labels/Label_Mode.text = modetext
$Labels/Label_Position.text = str("Position: ", DisplayServer.window_get_position())
$Labels/Label_Size.text = str("Size: ", DisplayServer.window_get_size())
$Labels/Label_MousePosition.text = str("Mouse Position: ", mouse_position)
$Labels/Label_Screen_Count.text = str("Screen_Count: ", DisplayServer.get_screen_count())
$Labels/Label_Screen_Current.text = str("Screen: ", DisplayServer.window_get_current_screen())
$Labels/Label_Screen0_Resolution.text = str("Screen0 Resolution:\n", DisplayServer.screen_get_size())
$Labels/Label_Screen0_Position.text = str("Screen0 Position:\n", DisplayServer.screen_get_position())
$Labels/Label_Screen0_DPI.text = str("Screen0 DPI: ", DisplayServer.screen_get_dpi())
if DisplayServer.get_screen_count() > 1:
$Buttons/Button_Screen0.show()
$Buttons/Button_Screen1.show()
$Labels/Label_Screen1_Resolution.show()
$Labels/Label_Screen1_Position.show()
$Labels/Label_Screen1_DPI.show()
$Labels/Label_Screen1_Resolution.text = str("Screen1 Resolution:\n", DisplayServer.screen_get_size(1))
$Labels/Label_Screen1_Position.text = str("Screen1 Position:\n", DisplayServer.screen_get_position(1))
$Labels/Label_Screen1_DPI.text = str("Screen1 DPI: ", DisplayServer.screen_get_dpi(1))
else:
$Buttons/Button_Screen0.hide()
$Buttons/Button_Screen1.hide()
$Labels/Label_Screen1_Resolution.hide()
$Labels/Label_Screen1_Position.hide()
$Labels/Label_Screen1_DPI.hide()
$Labels/Label_Screen1_RefreshRate.hide()
$Buttons/Button_Fullscreen.set_pressed(DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_FULLSCREEN)
$Buttons/Button_FixedSize.set_pressed(DisplayServer.window_get_flag(DisplayServer.WINDOW_FLAG_RESIZE_DISABLED))
$Buttons/Button_Minimized.set_pressed(DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_MINIMIZED)
$Buttons/Button_Maximized.set_pressed(DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_MAXIMIZED)
$Buttons/Button_MouseModeVisible.set_pressed(Input.get_mouse_mode() == Input.MOUSE_MODE_VISIBLE)
$Buttons/Button_MouseModeHidden.set_pressed(Input.get_mouse_mode() == Input.MOUSE_MODE_HIDDEN)
$Buttons/Button_MouseModeCaptured.set_pressed(Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED)
func _input(event: InputEvent) -> void:
if event is InputEventMouseMotion:
mouse_position = event.position
if event is InputEventKey:
if Input.is_action_pressed(&"mouse_mode_visible"):
observer.state = observer.State.MENU
_on_button_mouse_mode_visible_pressed()
if Input.is_action_pressed(&"mouse_mode_hidden"):
observer.state = observer.State.MENU
_on_button_mouse_mode_hidden_pressed()
if Input.is_action_pressed(&"mouse_mode_captured"):
_on_button_mouse_mode_captured_pressed()
if Input.is_action_pressed(&"mouse_mode_confined"):
observer.state = observer.State.MENU
_on_button_mouse_mode_confined_pressed()
if Input.is_action_pressed(&"mouse_mode_confined_hidden"):
observer.state = observer.State.MENU
_on_button_mouse_mode_confined_hidden_pressed()
func check_wm_api() -> bool:
var s := ""
if not DisplayServer.has_method("get_screen_count"):
s += " - get_screen_count()\n"
if not DisplayServer.has_method("window_get_current_screen"):
s += " - window_get_current_screen()\n"
if not DisplayServer.has_method("window_set_current_screen"):
s += " - window_set_current_screen()\n"
if not DisplayServer.has_method("screen_get_position"):
s += " - screen_get_position()\n"
if not DisplayServer.has_method("window_get_size"):
s += " - window_get_size()\n"
if not DisplayServer.has_method("window_get_position"):
s += " - window_get_position()\n"
if not DisplayServer.has_method("window_set_position"):
s += " - window_set_position()\n"
if not DisplayServer.has_method("window_get_size"):
s += " - get_window_size()\n"
if not DisplayServer.has_method("window_set_size"):
s += " - window_set_size()\n"
# These function are no longer and this is set through flags!
# if not DisplayServer.has_method("set_window_fullscreen"):
# s += " - set_window_fullscreen()\n"
# if not DisplayServer.window_get_flag() OS.has_method("is_window_fullscreen"):
# s += " - is_window_fullscreen()\n"
# if not OS.has_method("set_window_resizable"):
# s += " - set_window_resizable()\n"
# if not OS.has_method("is_window_resizable"):
# s += " - is_window_resizable()\n"
# if not OS.has_method("set_window_minimized"):
# s += " - set_window_minimized()\n"
# if not OS.has_method("is_window_minimized"):
# s += " - is_window_minimized()\n"
# if not OS.has_method("set_window_maximized"):
# s += " - set_window_maximized()\n"
# if not OS.has_method("is_window_maximized"):
# s += " - is_window_maximized()\n"
if s.length() == 0:
return true
else:
$"ImplementationDialog/Text".text += s
$ImplementationDialog.show()
return false
func _on_button_move_to_pressed() -> void:
DisplayServer.window_set_position(Vector2(100, 100))
func _on_button_resize_pressed() -> void:
DisplayServer.window_set_size(Vector2(1280, 720))
func _on_button_screen_0_pressed() -> void:
DisplayServer.window_set_current_screen(0)
func _on_button_screen_1_pressed() -> void:
DisplayServer.window_set_current_screen(1)
func _on_button_fullscreen_pressed() -> void:
if DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_FULLSCREEN:
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
else:
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)
func _on_button_fixed_size_pressed() -> void:
if DisplayServer.window_get_flag(DisplayServer.WINDOW_FLAG_RESIZE_DISABLED):
DisplayServer.window_set_flag(DisplayServer.WINDOW_FLAG_RESIZE_DISABLED, false)
else:
DisplayServer.window_set_flag(DisplayServer.WINDOW_FLAG_RESIZE_DISABLED, true)
func _on_button_minimized_pressed() -> void:
if DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_MINIMIZED:
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
else:
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_MINIMIZED)
func _on_button_maximized_pressed() -> void:
if DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_MAXIMIZED:
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_MINIMIZED)
else:
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_MAXIMIZED)
func _on_button_mouse_mode_visible_pressed() -> void:
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
func _on_button_mouse_mode_hidden_pressed() -> void:
Input.mouse_mode = Input.MOUSE_MODE_HIDDEN
func _on_button_mouse_mode_captured_pressed() -> void:
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
observer.state = observer.State.GRAB
func _on_button_mouse_mode_confined_pressed() -> void:
Input.mouse_mode = Input.MOUSE_MODE_CONFINED
func _on_button_mouse_mode_confined_hidden_pressed() -> void:
Input.mouse_mode = Input.MOUSE_MODE_CONFINED_HIDDEN