1
0
Fork 0

Compare commits

..

2 Commits

Author SHA1 Message Date
under 1801c8e5ba Remove superfluous alt+enter fullscreen controls 2024-03-20 15:44:26 -07:00
under 35a8fc2f1a Fix window-clickthrough
What was happening here is that because we were detecting window clicks
inside _input, when you clicked overlapping windows, all of them would
receive the click, and all of them would set themselves to active and
move to the foreground. The solution to this was to move the
click-detection into _gui_input instead, which stops the event from
traveling to the back elements. There is, however, a gotcha. Because
_gui_input only fires on the topmost element clicked, the window itself
doesn't receive the event because its children are covering it up and
receive the event instead. To work around this I iterated all the
children of the window, connecting to and forwarding their _gui_input
events to the window root. Thus, buttons still work when you click on
them, but the window also gets to respond as it needs to.
2024-03-20 15:17:22 -07:00
2 changed files with 20 additions and 17 deletions

View File

@ -6,19 +6,4 @@ var current_window: Control = the_game # current window
func _ready() -> void: func _ready() -> void:
DisplayServer.window_set_flag(DisplayServer.WINDOW_FLAG_BORDERLESS, true) DisplayServer.window_set_flag(DisplayServer.WINDOW_FLAG_BORDERLESS, true)
func _process(_delta):
#get_window().grab_focus()
pass
func _input(event: InputEvent):
if event.is_action_pressed("HotKey_ToggleFullscreen"):
# we can't maximize because godot considers borderless maximized to be fullscreen
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)

View File

@ -7,13 +7,31 @@ extends Control
var windowed_rect: Rect2 var windowed_rect: Rect2
func _input(event: InputEvent): func get_descendants(node: Node) -> Array[Node]:
var nodes: Array[Node] = []
for child in node.get_children():
if child.get_child_count() > 0:
nodes.append(child)
nodes.append_array(get_descendants(child))
else:
nodes.append(child)
return nodes
func _ready() -> void:
for descendant in get_descendants(self):
descendant.gui_input.connect(_gui_input)
func _gui_input(event: InputEvent) -> void:
if event is InputEventMouseButton: if event is InputEventMouseButton:
if event.pressed: if event.pressed:
if get_global_rect().has_point(get_global_mouse_position()): if get_global_rect().has_point(get_global_mouse_position()):
desktop.current_window = self desktop.current_window = self
get_parent().move_child(self, get_parent().get_child_count()) get_parent().move_child(self, get_parent().get_child_count())
elif event is InputEventKey:
func _input(event: InputEvent):
if event is InputEventKey:
if event.keycode == KEY_F11: if event.keycode == KEY_F11:
if event.pressed: if event.pressed:
if desktop.current_window == self: if desktop.current_window == self: