Merge pull request #41235 from akien-mga/3.2-cherrypicks

Cherry-picks for the 3.2 branch (future 3.2.3) - 6th batch
This commit is contained in:
Rémi Verschelde 2020-08-14 00:42:25 +02:00 committed by GitHub
commit 13a615bd9c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
29 changed files with 302 additions and 400 deletions

View file

@ -2,10 +2,6 @@ Alexander Holland <alexander.holland@live.de>
Alexander Holland <alexander.holland@live.de> <alexander.holland@haw-hamburg.de>
Alexander Holland <alexander.holland@live.de> <AlexHolly>
Andrea Catania <info@andreacatania.com>
Andreas Haas <liu.gam3@gmail.com>
Andreas Haas <liu.gam3@gmail.com> <hinsbart@gmail.com>
Andreas Haas <liu.gam3@gmail.com> <hinsbart@users.noreply.github.com>
Andreas Haas <liu.gam3@gmail.com> <entenflugstuhl@gmail.com>
Anish Bhobe <anishbhobe@hotmail.com>
Anutrix <numaanzaheerahmed@yahoo.com>
Aren Villanueva <arenvillanueva@yomogi-soft.com> <aren@displaysweet.com>
@ -69,6 +65,11 @@ Kelly Thomas <kelly.thomas@hotmail.com.au>
K. S. Ernest (iFire) Lee <ernest.lee@chibifire.com>
Leon Krause <lk@leonkrause.com> <eska@eska.me>
Leon Krause <lk@leonkrause.com> <eska014@users.noreply.github.com>
Liz Haas <27thLiz@gmail.com>
Liz Haas <27thLiz@gmail.com> <liu.gam3@gmail.com>
Liz Haas <27thLiz@gmail.com> <hinsbart@gmail.com>
Liz Haas <27thLiz@gmail.com> <hinsbart@users.noreply.github.com>
Liz Haas <27thLiz@gmail.com> <entenflugstuhl@gmail.com>
Manuel Strey <manuel.strey@gmx.de>
Marcelo Fernandez <marcelofg55@gmail.com>
Marcin Zawiejski <dragmz@gmail.com>

View file

@ -32,7 +32,6 @@ name is available.
Alexey Khoroshavin (allkhor)
Alket Rexhepi (alketii)
Andrea Catania (AndreaCatania)
Andreas Haas (Hinsbart)
Andrii Doroshenko (Xrayez)
Andy Moss (MillionOstrich)
Anish Bhobe (KidRigger)
@ -97,6 +96,7 @@ name is available.
Jakub Grzesik (kubecz3k)
James Buck (jbuck3)
Jérôme Gully (Nutriz)
Jia Jun Chai (SkyLucilfer)
Joan Fons Sanchez (JFonS)
Johan Manuel (29jm)
Joshua Grams (JoshuaGrams)
@ -107,7 +107,8 @@ name is available.
Kostadin Damyanov (Max-Might)
K. S. Ernest (iFire) Lee (fire)
lawnjelly
Leon Krause (eska014)
Leon Krause (leonkrause)
Liz Haas (27thLiz)
Lucien Menassol (Kanabenki)
m4nu3lf
Maganty Rushyendra (mrushyendra)
@ -134,6 +135,7 @@ name is available.
muiroc
Nathan Warden (NathanWarden)
Nils André-Chang (NilsIrl)
Noah Beard (TwistedTwigleg)
Nuno Donato (nunodonato)
Ovnuniarchos
Pascal Richter (ShyRed)
@ -157,12 +159,15 @@ name is available.
Robin Hübner (profan)
romulox-x
Ruslan Mustakov (endragor)
Ryan Roden-Corrent (rrcore)
Saniko (sanikoyes)
santouits
SaracenOne
Sergey Minakov (naithar)
sersoong
Shiqing (kawa-yoiko)
Simon Wenner (swenner)
Stijn Hinlopen (hinlopen)
Swarnim Arun (minraws)
Thakee Nathees (ThakeeNathees)
Theo Hallenius (TheoXD)

218
DONORS.md
View file

@ -12,26 +12,35 @@ generous deed immortalized in the next stable release of Godot Engine.
## Platinum sponsors
Gamblify <https://www.gamblify.com>
Heroic Labs <https://heroiclabs.com>
Interblock <http://interblockgaming.com>
## Gold sponsors
Gamblify <https://www.gamblify.com>
None currently, become one! <https://godotengine.org/donate>
## Silver sponsors
Moonwards <https://www.moonwards.com>
## Bronze sponsors
Brandon Lamb
## Mini sponsors
AD Ford
Alan Beauchamp
albinaask
Alejandro Saucedo
alex brown
Andrew Dunai
Brandon Lamb
Christian Baune
Christopher Montesano
Darkhan Baimyrza
Darrin Massena
David Mydlarz
Digital Grows
Dov Zimring
Edward Flick
@ -43,6 +52,7 @@ generous deed immortalized in the next stable release of Godot Engine.
Jasper Brooks
Javary Co.
Jeffery Chiu
Jonah Stich
Justin Arnold
Kyle Szklenski
Marcel Kräml
@ -51,45 +61,39 @@ generous deed immortalized in the next stable release of Godot Engine.
Mike King
Nathan Warden
Neal Gompa (Conan Kudo)
Patrick Schmidt
Ronnie Cheng
Slobodan Milnovic
Stephan Lanfermann
Steve
Thomas Krampl
Tristan Pemble
VilliHaukka
Violin Iliev
蕭惟允
## Gold donors
Bjarke
David Gehrig
David Snopek
Ed Morley
Florian Rämisch
Jakub Grzesik
Manuele Finocchiaro
Officine Pixel S.n.c.
Rami
Ronan Zeegers
Sofox
Spicylewd
Taylor Ritenour
Zaven Muradyan
Andreas Schüle
Andres Hernandez
Andrew Morsillo
Asher Glick
Austen McRae
Bernhard Werner
beVR
Carlo Cabanilla
Chris Goddard
Christopher Case
Daniel James
David Gehrig
David Giardi
Default Name
David Snopek
Ed Morley
eggs
Ellen Poe
Florian Breisch
Florian Rämisch
Forge
Gamejunkey
Jakub Grzesik
Javier Roman
Jon Woodward
Karl Werf
@ -97,95 +101,89 @@ generous deed immortalized in the next stable release of Godot Engine.
Lex Steers
Luke
Maciej Pendolski
Manuele Finocchiaro
Markus Wiesner
Matthew Hillier
Mohamed Ikbel Boulabiar
Monster Vial
Officine Pixel S.n.c.
Rami
Rene
Rene Tailleur
Retro Village
Rob Messick
Roland Fredenhagen
Ronan Zeegers
Ryan Badour
Sandro Jenny
Sarksus
Scott Wadden
Sergey
thechris
Sofox
Spicylewd
Taylor Ritenour
Tom Langwaldt
Tricky Fat Cat
tukon
William Wold
xagonist
Zaven Muradyan
Alex Khayrullin
alice gambrell
Andrew Harris
Barugon
Chris Goddard
Chris Serino
Christian Padilla
Conrad Curry
Craig Smith
Darrian Little
dragonage13
GiulianoB
Hoai Nam Tran
Horváth Péter
Jeff Nyte
Joan Fons
Joshua Flores
Leo Fidel R Liban
Michael Dürwald
Péter Magyar
Petr Malac
Rob
Robert Willes
Ronnie Ashlock
SKison
Thomas Bjarnelöf
Valryia
Vincent Henderson
Vojtěch
Wojciech Chojnacki
Xavier PATRICELLI
Zoran Kukulj
Aaron Winter
Adam Nakonieczny
Adam Neumann
Alexander J Maynard
Alexey Dyadchenko
Alex Khayrullin
alice gambrell
Andreas Funke
André Frélicot
Andrew Harris
aoshiwik
Ben Powell
Barugon
Can Eris
Carlos de Sousa Marques
Charlie Whitfield
Chase Taranto
Chelsea Hash
Chris Petrich
Chris Serino
Christian Alexander Bjørklund Bøhler
Christian Leth Jeppesen
Cody Parker
Conrad Curry
Craig Ostrin
curtis Kramer
Craig Smith
D
Darrian Little
Dev To be curious
Digital Denizen
Easypete
Edgar Sun
Eugenio Hugo Salgüero Jáñez
Felix Brückner
flesk
F S
Gary Hulst
gavlig
GGGames.org
GiulianoB
Guilherme Felipe de C. G. da Silva
Heath Hayes
Hoai Nam Tran
Horváth Péter
Hu Hund
Isaac Clausman
Jared
Jared White
Joe Flood
Jeff Nyte
Joan Fons
Joel Fivat
Joel Höglund
John G Gentzel
Jose Malheiro
Joseph Crane
Joshie Sparks
Joshua Flores
Joshua Lesperance
Juan Velandia
Julian Todd
@ -194,14 +192,18 @@ generous deed immortalized in the next stable release of Godot Engine.
Kelteseth
kickmaniac
kinfox
Lachie
Lain Ballard
Leo Fidel R Liban
luca duran
MadScientistCarl
Marcelo Dornbusch Lopes
Marcelo Henrique Gonçalves
Marisa Clardy
Markus Fehr
Markus Wiesner
Martin Eigel
Matt Eunson
Michael
Michael Dürwald
Mikado069
m kaersten
MuffinManKen
@ -211,40 +213,57 @@ generous deed immortalized in the next stable release of Godot Engine.
Patrick Ting
Paul Hocker
Paul Von Zimmerman
Pedro Silva
Pete Goodwin
Péter Magyar
Petr Malac
PhaineOfCatz
pl
Ranoller
Raymond Harris
Ricardo Alcantara
Rob
Robert Willes
Rob McInroy
Rocknight Studios
Ronnie Ashlock
Ryan
Ryan Wilson
Samuel Judd
Scott Pilet
Scott Ryan-Taylor
Sean Morgan
Sean Robertson
Sébastien
Serban Serafimescu
Shishir Tandale
SKison
SleepCircle
spilldata
Steven Landow
Stoned Xander
Tahiti Bos
TheLevelOfDetail .
Thomas Bjarnelöf
Thomas Kurz
Timothy Pulliam
Tobias Bocanegra
Trent Fehl
Urho
Valryia
VikFro
Vincent Henderson
Vojtěch
William Foster
Wojciech Chojnacki
Xavier PATRICELLI
xzibiting
Zhou Tuizhi
Zie Weaver
蕭惟允
Zoran Kukulj
## Silver donors
1D_Inc
Aaron
Aaron Winter
Abel Crunk
Abraham Haskins
Acheron
Adam
@ -252,7 +271,6 @@ generous deed immortalized in the next stable release of Godot Engine.
Adam Carr
Adam Long
Adam McCurdy
Adam Netzel
Adam N Webber
Adam Smeltzer
Adam Szymański
@ -265,18 +283,22 @@ generous deed immortalized in the next stable release of Godot Engine.
AleMax
Alessandro Senese
Alexander Erlemann
Alexandre Beaudoin
alex clavelle
Ali Al-Khalifa
Allan Davis
Allen Schade
Andreas Krampitz
André Simões
andrew james morris
Andrew Mansuetti
Andrew Rosenwinkel
Andrew Thomas
Ano Nim
Anthony Avina
AP Condomines
Arda Erol
Arisaka Mayuki
Armin Preiml
Arseniy M
Arthur S. Muszynski
@ -285,43 +307,49 @@ generous deed immortalized in the next stable release of Godot Engine.
Aubrey Falconer
B A
Balázs Batári
Balázs Hasprai
Bartosz Bielecki
Benedikt
Ben Vercammen
Bernd Jänichen
Bjarne
Bjarne Voigtländer
Black Block
Blair Allen
Bobby CC Wong
Bram
brian
Brian mc gowan
Brodie Fairhall
Burney Waring
Caleb Gartner
Cameron Meyer
Carl van der Geest
Carwyn Edwards
Cas Brugman
Cassidy James
Chad Steadman
Chris Brown
Chris Chapin
Christian Winter
Christoffer Dahlblom
Christoffer Sundbom
Christoph Brodmann
Christophe Gagnier
Christopher Schmitt
Christoph Woinke
Clay Heaton
Cole Johnson
Cuauhtemoc Moreno
Curt King
Daniel Kimblad
CzechBlueBear
Daniel De Macedo
Daniel Johnson
DanielMaximiano
Daniel Szarfman
Daniel Tebbutt
Daren Scot Wilson
Dave Walker
David May
David Woodard
Dimitri Stanojevic
David Zanetti
Dmitry Fisher
Dmytro Korchynskyi
Dominik Wetzel
Donn Eddy
@ -341,6 +369,7 @@ generous deed immortalized in the next stable release of Godot Engine.
Eric Ellingson
Eric Williams
Erkki Seppälä
ET Garcia
Evan Rose
Fain
Faisal Alkubaisi
@ -378,22 +407,20 @@ generous deed immortalized in the next stable release of Godot Engine.
Jaiden Gerig
Jaime Ruiz-Borau Vizárraga
Jako Danar
James
James A F Manley
Jamiee H
Jamie Massey
Janders
JARKKO PARVIAINEN
Jason Uechi
Jean-Baptiste LEPESME
Jeff Hungerford
Jennifer Graves
Jesse Dubay
Joe Alden
Joel Fivat
Joel Höglund
Joel Setterberg
Johannes Goslar
Joe Klemmer
John Gabriel
John Walker
Jomei Jackson
Jonas
Jonas Bernemann
@ -405,7 +432,6 @@ generous deed immortalized in the next stable release of Godot Engine.
Jon Sully
Jordy Goodridge
Jorge Antunes
Jose Aleman
Jose C. Rubio
Joseph Catrambone
Josh Mitchell
@ -422,19 +448,19 @@ generous deed immortalized in the next stable release of Godot Engine.
Karel Němec
Kauzig
Keedong Park
Keinan Powers
Keith Bradner
Kent Jofur
Kevin McPhillips
Kevin Velasco
Kiri Jolly
Kjetil Haugland
Klagsam
KsyTek Games
Kuan Cheang
kycho
Kyle Appelgate
Kyuppin
Laurent Tréguier
LEMMiNO
Leonardo Dimano
Lin Chear
Linus Lind Lundgren
@ -447,6 +473,7 @@ generous deed immortalized in the next stable release of Godot Engine.
Marco Lardelli
Mark Jad
Mark Krenz
Markus Martin
Markus Michael Egger
Martin FIbik
Martin Holas
@ -456,16 +483,16 @@ generous deed immortalized in the next stable release of Godot Engine.
Marvin
Mathieu
Matt Edwards
Mauro Pellegrini
Matthew Booe
Max Fiedler
Maxime Blade
Maxwell
Megasploot
Melissa Mears
mewin
Michael Cullen
Michael Haney
Michał Skwarek
Mikael Olsson
Mikayla
Mike Birkhead
Mike Cunningham
@ -484,12 +511,16 @@ generous deed immortalized in the next stable release of Godot Engine.
Nick Allen
Nick Macholl
Niclas Eriksen
Nicolas Goll-Perrier
Nicolás Montaña
Nicolas SAN AGUSTIN
NZ
'@oddgoo
OKV
Oleg Reva
Olivier
Omar Delarosa
Oscar Domingo
Oscar Norlander
Pan Ip
Parinya Teerakasemsuk
@ -502,16 +533,16 @@ generous deed immortalized in the next stable release of Godot Engine.
Penguin
Peter
Philip Cohoe
Pierre-Nicolas Tollitte
Piotr Góral
Point08
Preethi Vaidyanathan
pwab
Rad Cat
Rafa Laguna
Ram
Remi Rampin
Rémi Verschelde
Reneator
Ricardo Alcantara
Richard Diss
Richard Ivánek
Robert Farr (Larington)
@ -522,7 +553,9 @@ generous deed immortalized in the next stable release of Godot Engine.
Ronald Ho Hip (CrimsonZA)
Ronan
Ronny Mühle
Ross Squires
Ryan Groom
Sam Caulfield
Sam Edson
Samuele Zolfanelli
Scott D. Yelich
@ -531,15 +564,16 @@ generous deed immortalized in the next stable release of Godot Engine.
Sebastian Michailidis
Sebastian Vetter
Sergio Mello-Grand
Shaher
Shane
Shane Sicienski
Shane Spoor
Shiomi '- Duy Kevin Nguyen
Shiomi - Duy Kevin Nguyen
Siim Raidma
Simon Jonas Larsen
Simon Schoenenberger
Simon Wenner
Sintinium
SK
smbe19
smo1704
soft circles
@ -547,7 +581,7 @@ generous deed immortalized in the next stable release of Godot Engine.
Stefano Caronia
Steve Cloete
Svenne Krap
Taylor Fahlman
Tannen Helmers
Terry
tezuvholovdr
TheVoiceInMyHead
@ -558,26 +592,30 @@ generous deed immortalized in the next stable release of Godot Engine.
Tim Drumheller
Tim Erskine
Timothy B. MacDonald
Title Plinsut
Tobbun
Tobias Bradtke
Tom Glenn
Toni Duran
Tony Zhao
Torgeir Lilleskog
Torsten Crass
Travis O'Brien
Trent Skinner
Triptych
Triumph263 .
Troy Bonneau
Tryggve Sollid
Turgut Temucin
Tyler Compton
Tyler Stafos
UltyX
Uther
Valentí Gàmez
Vaughan Ling
Victor
Vigilant Watch
Viktor Ismagilov
Vincent Cloutier
Vitor Balbio
Vladimir Savin
waka nya
Wayne Haak
@ -587,9 +625,9 @@ generous deed immortalized in the next stable release of Godot Engine.
Wyatt Goodin
Yegor Smirnov
YiYin Gu
Yuri LaPointe
Yuri Sizov
Zgegnesh Hemomancer
ΒΑΣΙΛΗΣ ΓΕΩΡΓΑΚΟΠΟΥΛΟΣ
郝晨煜
## Bronze donors

View file

@ -1,25 +1,29 @@
[![Godot Engine logo](/logo.png)](https://godotengine.org)
# Godot Engine
## Godot Engine
<p align="center">
<a href="https://godotengine.org">
<img src="logo.svg" width="400" alt="Godot Engine logo">
</a>
</p>
Homepage: https://godotengine.org
## 2D and 3D cross-platform game engine
#### 2D and 3D cross-platform game engine
**[Godot Engine](https://godotengine.org) is a feature-packed, cross-platform
game engine to create 2D and 3D games from a unified interface.** It provides a
comprehensive set of common tools, so that users can focus on making games
without having to reinvent the wheel. Games can be exported in one click to a
number of platforms, including the major desktop platforms (Linux, macOS,
Windows), mobile platforms (Android, iOS), as well as Web-based platforms
(HTML5) and
[consoles](https://docs.godotengine.org/en/latest/tutorials/platform/consoles.html).
Godot Engine is a feature-packed, cross-platform game engine to create 2D and
3D games from a unified interface. It provides a comprehensive set of common
tools, so that users can focus on making games without having to reinvent the
wheel. Games can be exported in one click to a number of platforms, including
the major desktop platforms (Linux, Mac OSX, Windows) as well as mobile
(Android, iOS) and web-based (HTML5) platforms.
#### Free, open source and community-driven
## Free, open source and community-driven
Godot is completely free and open source under the very permissive MIT license.
No strings attached, no royalties, nothing. The users' games are theirs, down
to the last line of engine code. Godot's development is fully independent and
community-driven, empowering users to help shape their engine to match their
expectations. It is supported by the Software Freedom Conservancy
expectations. It is supported by the [Software Freedom Conservancy](https://sfconservancy.org/)
not-for-profit.
Before being open sourced in February 2014, Godot had been developed by Juan
@ -28,43 +32,45 @@ years as an in-house engine, used to publish several work-for-hire titles.
![Screenshot of a 3D scene in Godot Engine](https://raw.githubusercontent.com/godotengine/godot-design/master/screenshots/editor_tps_demo_1920x1080.jpg)
### Getting the engine
## Getting the engine
#### Binary downloads
### Binary downloads
Official binaries for the Godot editor and the export templates can be found
[on the homepage](https://godotengine.org/download).
#### Compiling from source
### Compiling from source
[See the official docs](https://docs.godotengine.org/en/latest/development/compiling/)
for compilation instructions for every supported platform.
### Community and contributing
## Community and contributing
Godot is not only an engine but an ever-growing community of users and engine
developers. The main community channels are listed [on the homepage](https://godotengine.org/community).
To get in touch with the developers, the best way is to join the
[#godotengine IRC channel](https://webchat.freenode.net/?channels=godotengine)
To get in touch with the engine developers, the best way is to join the
[#godotengine-devel IRC channel](https://webchat.freenode.net/?channels=godotengine-devel)
on Freenode.
To get started contributing to the project, see the [contributing guide](CONTRIBUTING.md).
### Documentation and demos
## Documentation and demos
The official documentation is hosted on [ReadTheDocs](https://docs.godotengine.org).
It is maintained by the Godot community in its own [GitHub repository](https://github.com/godotengine/godot-docs).
The [class reference](https://docs.godotengine.org/en/latest/classes/)
is also accessible from within the engine.
is also accessible from the Godot editor.
The official demos are maintained in their own [GitHub repository](https://github.com/godotengine/godot-demo-projects)
as well.
There are also a number of other learning resources provided by the community,
such as text and video tutorials, demos, etc. Consult the [community channels](https://godotengine.org/community)
for more info.
There are also a number of other
[learning resources](https://docs.godotengine.org/en/latest/community/tutorials.html)
provided by the community, such as text and video tutorials, demos, etc.
Consult the [community channels](https://godotengine.org/community)
for more information.
[![Actions Build Status](https://github.com/godotengine/godot/workflows/Godot/badge.svg?branch=master)](https://github.com/godotengine/godot/actions)
[![Code Triagers Badge](https://www.codetriage.com/godotengine/godot/badges/users.svg)](https://www.codetriage.com/godotengine/godot)

View file

@ -298,9 +298,10 @@ if selected_platform in platform_list:
from SCons import __version__ as scons_raw_version
scons_ver = env._get_major_minor_revision(scons_raw_version)
if scons_ver >= (3, 1, 1):
env.Tool("compilation_db", toolpath=["misc/scons"])
env.Alias("compiledb", env.CompilationDatabase("compile_commands.json"))
if scons_ver >= (4, 0, 0):
env.Tool("compilation_db")
env.Alias("compiledb", env.CompilationDatabase())
if env["dev"]:
env["verbose"] = True

View file

@ -86,10 +86,21 @@ def make_authors_header(target, source, env):
def make_donors_header(target, source, env):
sections = ["Platinum sponsors", "Gold sponsors", "Mini sponsors", "Gold donors", "Silver donors", "Bronze donors"]
sections = [
"Platinum sponsors",
"Gold sponsors",
"Silver sponsors",
"Bronze sponsors",
"Mini sponsors",
"Gold donors",
"Silver donors",
"Bronze donors",
]
sections_id = [
"DONORS_SPONSOR_PLAT",
"DONORS_SPONSOR_PLATINUM",
"DONORS_SPONSOR_GOLD",
"DONORS_SPONSOR_SILVER",
"DONORS_SPONSOR_BRONZE",
"DONORS_SPONSOR_MINI",
"DONORS_GOLD",
"DONORS_SILVER",

View file

@ -163,8 +163,10 @@ Array Engine::get_copyright_info() const {
Dictionary Engine::get_donor_info() const {
Dictionary donors;
donors["platinum_sponsors"] = array_from_info(DONORS_SPONSOR_PLAT);
donors["platinum_sponsors"] = array_from_info(DONORS_SPONSOR_PLATINUM);
donors["gold_sponsors"] = array_from_info(DONORS_SPONSOR_GOLD);
donors["silver_sponsors"] = array_from_info(DONORS_SPONSOR_SILVER);
donors["bronze_sponsors"] = array_from_info(DONORS_SPONSOR_BRONZE);
donors["mini_sponsors"] = array_from_info(DONORS_SPONSOR_MINI);
donors["gold_donors"] = array_from_info(DONORS_GOLD);
donors["silver_donors"] = array_from_info(DONORS_SILVER);

View file

@ -31,6 +31,7 @@
#include "script_language.h"
#include "core/core_string_names.h"
#include "core/io/resource_loader.h"
#include "core/os/file_access.h"
#include "core/project_settings.h"
@ -167,7 +168,7 @@ void ScriptServer::init_languages() {
for (int i = 0; i < script_classes.size(); i++) {
Dictionary c = script_classes[i];
if (!c.has("class") || !c.has("language") || !c.has("path") || !FileAccess::exists(c["path"]) || !c.has("base"))
if (!c.has("class") || !c.has("language") || !c.has("path") || !FileAccess::exists(ResourceLoader::path_remap(c["path"])) || !c.has("base"))
continue;
add_global_class(c["class"], c["base"], c["language"], c["path"]);
}

View file

@ -99,7 +99,7 @@
<return type="Variant">
</return>
<description>
Returns the last element of the array, or [code]null[/code] if the array is empty.
Returns the last element of the array. Throws an error and returns [code]null[/code] if the array is empty.
</description>
</method>
<method name="bsearch">
@ -192,7 +192,7 @@
<return type="Variant">
</return>
<description>
Returns the first element of the array, or [code]null[/code] if the array is empty.
Returns the first element of the array. Throws an error and returns [code]null[/code] if the array is empty.
</description>
</method>
<method name="has">

View file

@ -60,6 +60,7 @@
<argument index="1" name="rect" type="Rect2">
</argument>
<description>
Applies morphological dilation to the bitmap. The first argument is the dilation amount, Rect2 is the area where the dilation will be applied.
</description>
</method>
<method name="opaque_to_polygons" qualifiers="const">

View file

@ -34,7 +34,7 @@
</return>
<description>
Returns a Dictionary of Arrays of donor names.
{[code]platinum_sponsors[/code], [code]gold_sponsors[/code], [code]mini_sponsors[/code], [code]gold_donors[/code], [code]silver_donors[/code], [code]bronze_donors[/code]}
{[code]platinum_sponsors[/code], [code]gold_sponsors[/code], [code]silver_sponsors[/code], [code]bronze_sponsors[/code], [code]mini_sponsors[/code], [code]gold_donors[/code], [code]silver_donors[/code], [code]bronze_donors[/code]}
</description>
</method>
<method name="get_frames_drawn">

View file

@ -30,6 +30,28 @@
<description>
Converts a [Variant] var to JSON text and returns the result. Useful for serializing data to store or send over the network.
[b]Note:[/b] The JSON specification does not define integer or float types, but only a [i]number[/i] type. Therefore, converting a Variant to JSON text will convert all numerical values to [float] types.
Use [code]indent[/code] parameter to pretty print the output.
[b]Example output:[/b]
[codeblock]
## JSON.print(my_dictionary)
{"name":"my_dictionary","version":"1.0.0","entities":[{"name":"entity_0","value":"value_0"},{"name":"entity_1","value":"value_1"}]}
## JSON.print(my_dictionary, "\t")
{
"name": "my_dictionary",
"version": "1.0.0",
"entities": [
{
"name": "entity_0",
"value": "value_0"
},
{
"name": "entity_1",
"value": "value_1"
}
]
}
[/codeblock]
</description>
</method>
</methods>

View file

@ -925,6 +925,9 @@
<constant name="NOTIFICATION_INTERNAL_PHYSICS_PROCESS" value="26">
Notification received every frame when the internal physics process flag is set (see [method set_physics_process_internal]).
</constant>
<constant name="NOTIFICATION_POST_ENTER_TREE" value="27">
Notification received when the node is ready, just before [constant NOTIFICATION_READY] is received. Unlike the latter, it's sent every time the node enters tree, instead of only once.
</constant>
<constant name="NOTIFICATION_WM_MOUSE_ENTER" value="1002">
Notification received from the OS when the mouse enters the game window.
Implemented on desktop and web platforms.

View file

@ -33,7 +33,8 @@
<return type="float">
</return>
<description>
Returns this vector's angle with respect to the X axis, or [code](1, 0)[/code] vector, in radians.
Returns this vector's angle with respect to the positive X axis, or [code](1, 0)[/code] vector, in radians.
For example, [code]Vector2.RIGHT.angle()[/code] will return zero, [code]Vector2.DOWN.angle()[/code] will return [code]PI / 2[/code] (a quarter turn, or 90 degrees), and [code]Vector2(1, -1).angle()[/code] will return [code]-PI / 4[/code] (a negative eighth turn, or -45 degrees).
Equivalent to the result of [method @GDScript.atan2] when called with the vector's [member y] and [member x] as parameters: [code]atan2(y, x)[/code].
</description>
</method>

View file

@ -347,7 +347,7 @@ Error OS_Unix::execute(const String &p_path, const List<String> &p_arguments, bo
execvp(p_path.utf8().get_data(), &args[0]);
// still alive? something failed..
fprintf(stderr, "**ERROR** OS_Unix::execute - Could not create child process while executing: %s\n", p_path.utf8().get_data());
abort();
raise(SIGKILL);
}
if (p_blocking) {

View file

@ -162,12 +162,15 @@ EditorAbout::EditorAbout() {
List<String> donor_sections;
donor_sections.push_back(TTR("Platinum Sponsors"));
donor_sections.push_back(TTR("Gold Sponsors"));
donor_sections.push_back(TTR("Silver Sponsors"));
donor_sections.push_back(TTR("Bronze Sponsors"));
donor_sections.push_back(TTR("Mini Sponsors"));
donor_sections.push_back(TTR("Gold Donors"));
donor_sections.push_back(TTR("Silver Donors"));
donor_sections.push_back(TTR("Bronze Donors"));
const char *const *donor_src[] = { DONORS_SPONSOR_PLAT, DONORS_SPONSOR_GOLD,
DONORS_SPONSOR_MINI, DONORS_GOLD, DONORS_SILVER, DONORS_BRONZE };
const char *const *donor_src[] = { DONORS_SPONSOR_PLATINUM, DONORS_SPONSOR_GOLD,
DONORS_SPONSOR_SILVER, DONORS_SPONSOR_BRONZE, DONORS_SPONSOR_MINI,
DONORS_GOLD, DONORS_SILVER, DONORS_BRONZE };
tc->add_child(_populate_list(TTR("Donors"), donor_sections, donor_src, 3));
// License

View file

@ -1885,6 +1885,10 @@ EditorPropertyTransform::EditorPropertyTransform() {
////////////// COLOR PICKER //////////////////////
void EditorPropertyColor::_color_changed(const Color &p_color) {
// Cancel the color change if the current color is identical to the new one.
if (get_edited_object()->get(get_edited_property()) == p_color) {
return;
}
emit_changed(get_edited_property(), p_color, "", true);
}

View file

@ -1892,15 +1892,19 @@ void ScriptEditor::_update_script_names() {
Vector<String> disambiguated_script_names;
Vector<String> full_script_paths;
for (int j = 0; j < sedata.size(); j++) {
disambiguated_script_names.push_back(sedata[j].name);
disambiguated_script_names.push_back(sedata[j].name.replace("(*)", ""));
full_script_paths.push_back(sedata[j].tooltip);
}
EditorNode::disambiguate_filenames(full_script_paths, disambiguated_script_names);
for (int j = 0; j < sedata.size(); j++) {
if (sedata[j].name.ends_with("(*)")) {
sedata.write[j].name = disambiguated_script_names[j] + "(*)";
} else {
sedata.write[j].name = disambiguated_script_names[j];
}
}
EditorHelp *eh = Object::cast_to<EditorHelp>(tab_container->get_child(i));
if (eh) {

View file

@ -895,17 +895,17 @@ void TileMapEditor::_draw_cell(Control *p_viewport, int p_cell, const Point2i &p
rect.position += tile_ofs;
}
rect.position = p_xform.xform(rect.position);
rect.size *= sc;
Color modulate = node->get_tileset()->tile_get_modulate(p_cell);
modulate.a = 0.5;
Transform2D old_transform = p_viewport->get_viewport_transform();
p_viewport->draw_set_transform_matrix(p_xform); // Take into account TileMap transformation when displaying cell
if (r.has_no_area()) {
p_viewport->draw_texture_rect(t, rect, false, modulate, p_transpose);
} else {
p_viewport->draw_texture_rect_region(t, rect, r, modulate, p_transpose);
}
p_viewport->draw_set_transform_matrix(old_transform);
}
void TileMapEditor::_draw_fill_preview(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i &p_autotile_coord, const Transform2D &p_xform) {

View file

@ -1,5 +1,5 @@
<?xml version="1.0"?>
<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
<mime-type type="application/x-godot-project">
<comment>Godot Engine project</comment>
<icon name="godot" />

View file

@ -1,177 +0,0 @@
# Copyright 2015 MongoDB Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import json
import SCons
import itertools
# Implements the ability for SCons to emit a compilation database for the MongoDB project. See
# http://clang.llvm.org/docs/JSONCompilationDatabase.html for details on what a compilation
# database is, and why you might want one. The only user visible entry point here is
# 'env.CompilationDatabase'. This method takes an optional 'target' to name the file that
# should hold the compilation database, otherwise, the file defaults to compile_commands.json,
# which is the name that most clang tools search for by default.
# TODO: Is there a better way to do this than this global? Right now this exists so that the
# emitter we add can record all of the things it emits, so that the scanner for the top level
# compilation database can access the complete list, and also so that the writer has easy
# access to write all of the files. But it seems clunky. How can the emitter and the scanner
# communicate more gracefully?
__COMPILATION_DB_ENTRIES = []
# We make no effort to avoid rebuilding the entries. Someday, perhaps we could and even
# integrate with the cache, but there doesn't seem to be much call for it.
class __CompilationDbNode(SCons.Node.Python.Value):
def __init__(self, value):
SCons.Node.Python.Value.__init__(self, value)
self.Decider(changed_since_last_build_node)
def changed_since_last_build_node(child, target, prev_ni, node):
""" Dummy decider to force always building"""
return True
def makeEmitCompilationDbEntry(comstr):
"""
Effectively this creates a lambda function to capture:
* command line
* source
* target
:param comstr: unevaluated command line
:return: an emitter which has captured the above
"""
user_action = SCons.Action.Action(comstr)
def EmitCompilationDbEntry(target, source, env):
"""
This emitter will be added to each c/c++ object build to capture the info needed
for clang tools
:param target: target node(s)
:param source: source node(s)
:param env: Environment for use building this node
:return: target(s), source(s)
"""
dbtarget = __CompilationDbNode(source)
entry = env.__COMPILATIONDB_Entry(
target=dbtarget,
source=[],
__COMPILATIONDB_UTARGET=target,
__COMPILATIONDB_USOURCE=source,
__COMPILATIONDB_UACTION=user_action,
__COMPILATIONDB_ENV=env,
)
# TODO: Technically, these next two lines should not be required: it should be fine to
# cache the entries. However, they don't seem to update properly. Since they are quick
# to re-generate disable caching and sidestep this problem.
env.AlwaysBuild(entry)
env.NoCache(entry)
__COMPILATION_DB_ENTRIES.append(dbtarget)
return target, source
return EmitCompilationDbEntry
def CompilationDbEntryAction(target, source, env, **kw):
"""
Create a dictionary with evaluated command line, target, source
and store that info as an attribute on the target
(Which has been stored in __COMPILATION_DB_ENTRIES array
:param target: target node(s)
:param source: source node(s)
:param env: Environment for use building this node
:param kw:
:return: None
"""
command = env["__COMPILATIONDB_UACTION"].strfunction(
target=env["__COMPILATIONDB_UTARGET"], source=env["__COMPILATIONDB_USOURCE"], env=env["__COMPILATIONDB_ENV"],
)
entry = {
"directory": env.Dir("#").abspath,
"command": command,
"file": str(env["__COMPILATIONDB_USOURCE"][0]),
}
target[0].write(entry)
def WriteCompilationDb(target, source, env):
entries = []
for s in __COMPILATION_DB_ENTRIES:
entries.append(s.read())
with open(str(target[0]), "w") as target_file:
json.dump(entries, target_file, sort_keys=True, indent=4, separators=(",", ": "))
def ScanCompilationDb(node, env, path):
return __COMPILATION_DB_ENTRIES
def generate(env, **kwargs):
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
env["COMPILATIONDB_COMSTR"] = kwargs.get("COMPILATIONDB_COMSTR", "Building compilation database $TARGET")
components_by_suffix = itertools.chain(
itertools.product(
env["CPPSUFFIXES"],
[
(static_obj, SCons.Defaults.StaticObjectEmitter, "$CXXCOM"),
(shared_obj, SCons.Defaults.SharedObjectEmitter, "$SHCXXCOM"),
],
),
)
for entry in components_by_suffix:
suffix = entry[0]
builder, base_emitter, command = entry[1]
# Ensure we have a valid entry
# used to auto ignore header files
if suffix in builder.emitter:
emitter = builder.emitter[suffix]
builder.emitter[suffix] = SCons.Builder.ListEmitter([emitter, makeEmitCompilationDbEntry(command),])
env["BUILDERS"]["__COMPILATIONDB_Entry"] = SCons.Builder.Builder(
action=SCons.Action.Action(CompilationDbEntryAction, None),
)
env["BUILDERS"]["__COMPILATIONDB_Database"] = SCons.Builder.Builder(
action=SCons.Action.Action(WriteCompilationDb, "$COMPILATIONDB_COMSTR"),
target_scanner=SCons.Scanner.Scanner(function=ScanCompilationDb, node_class=None),
)
def CompilationDatabase(env, target):
result = env.__COMPILATIONDB_Database(target=target, source=[])
env.AlwaysBuild(result)
env.NoCache(result)
return result
env.AddMethod(CompilationDatabase, "CompilationDatabase")
def exists(env):
return True

View file

@ -53,6 +53,8 @@ import android.content.SharedPreferences.Editor;
import android.content.pm.ConfigurationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Point;
import android.graphics.Rect;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
@ -73,6 +75,7 @@ import android.view.Surface;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
@ -245,8 +248,6 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe
public GodotView mView;
private boolean godot_initialized = false;
private GodotEditText mEditText;
private SensorManager mSensorManager;
private Sensor mAccelerometer;
private Sensor mGravity;
@ -315,11 +316,29 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe
layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
setContentView(layout);
// GodotEditText layout
GodotEditText edittext = new GodotEditText(this);
edittext.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
// ...add to FrameLayout
layout.addView(edittext);
mView = new GodotView(this, xrMode, use_gl3, use_32_bits, use_debug_opengl);
layout.addView(mView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
edittext.setView(mView);
io.setEdit(edittext);
mEditText = new GodotEditText(this, mView);
io.setEdit(mEditText);
mView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Point fullSize = new Point();
getWindowManager().getDefaultDisplay().getSize(fullSize);
Rect gameSize = new Rect();
mView.getWindowVisibleDisplayFrame(gameSize);
final int keyboardHeight = fullSize.y - gameSize.bottom;
GodotLib.setVirtualKeyboardHeight(keyboardHeight);
}
});
final String[] current_command_line = command_line;
mView.queueEvent(new Runnable() {
@ -552,7 +571,6 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe
super.onCreate(icicle);
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
mClipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
pluginRegistry = GodotPluginRegistry.initializePluginRegistry(this);
@ -691,21 +709,8 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe
initializeGodot();
}
@Override
protected void onStart() {
super.onStart();
mView.post(new Runnable() {
@Override
public void run() {
mEditText.onInitView();
}
});
}
@Override
protected void onDestroy() {
mEditText.onDestroyView();
for (int i = 0; i < singleton_count; i++) {
singletons[i].onMainDestroy();

View file

@ -32,27 +32,16 @@ package org.godotengine.godot.input;
import org.godotengine.godot.*;
import android.app.Activity;
import android.content.Context;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Handler;
import android.os.Message;
import android.text.InputFilter;
import android.text.InputType;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.PopupWindow;
import java.lang.ref.WeakReference;
@ -67,8 +56,6 @@ public class GodotEditText extends EditText {
// Fields
// ===========================================================
private GodotView mView;
private View mKeyboardView;
private PopupWindow mKeyboardWindow;
private GodotTextInputWrapper mInputWrapper;
private EditHandler sHandler = new EditHandler(this);
private String mOriginText;
@ -93,52 +80,24 @@ public class GodotEditText extends EditText {
// ===========================================================
// Constructors
// ===========================================================
public GodotEditText(final Context context, final GodotView view) {
public GodotEditText(final Context context) {
super(context);
setPadding(0, 0, 0, 0);
setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_ACTION_DONE);
setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
mView = view;
mInputWrapper = new GodotTextInputWrapper(mView, this);
setOnEditorActionListener(mInputWrapper);
view.requestFocus();
// Create a popup window with an invisible layout for the virtual keyboard,
// so the view can be resized to get the vk height without resizing the main godot view.
final FrameLayout keyboardLayout = new FrameLayout(context);
keyboardLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
keyboardLayout.setVisibility(View.INVISIBLE);
keyboardLayout.addView(this);
mKeyboardView = keyboardLayout;
mKeyboardWindow = new PopupWindow(keyboardLayout, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
mKeyboardWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
mKeyboardWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
mKeyboardWindow.setFocusable(true); // for the text edit to work
mKeyboardWindow.setTouchable(false); // inputs need to go through
keyboardLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Point fullSize = new Point();
((Activity)mView.getContext()).getWindowManager().getDefaultDisplay().getSize(fullSize);
Rect gameSize = new Rect();
mKeyboardWindow.getContentView().getWindowVisibleDisplayFrame(gameSize);
final int keyboardHeight = fullSize.y - gameSize.bottom;
GodotLib.setVirtualKeyboardHeight(keyboardHeight);
}
});
this.initView();
}
public void onInitView() {
mKeyboardWindow.showAtLocation(mView, Gravity.NO_GRAVITY, 0, 0);
public GodotEditText(final Context context, final AttributeSet attrs) {
super(context, attrs);
this.initView();
}
public void onDestroyView() {
mKeyboardWindow.dismiss();
public GodotEditText(final Context context, final AttributeSet attrs, final int defStyle) {
super(context, attrs, defStyle);
this.initView();
}
protected void initView() {
this.setPadding(0, 0, 0, 0);
this.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_ACTION_DONE);
}
public boolean isMultiline() {
@ -170,7 +129,7 @@ public class GodotEditText extends EditText {
edit.mInputWrapper.setOriginText(text);
edit.addTextChangedListener(edit.mInputWrapper);
final InputMethodManager imm = (InputMethodManager)mKeyboardView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
final InputMethodManager imm = (InputMethodManager)mView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(edit, 0);
}
} break;
@ -179,7 +138,7 @@ public class GodotEditText extends EditText {
GodotEditText edit = (GodotEditText)msg.obj;
edit.removeTextChangedListener(mInputWrapper);
final InputMethodManager imm = (InputMethodManager)mKeyboardView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
final InputMethodManager imm = (InputMethodManager)mView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(edit.getWindowToken(), 0);
edit.mView.requestFocus();
} break;
@ -192,6 +151,17 @@ public class GodotEditText extends EditText {
p_edit_text.setFilters(filters);
}
// ===========================================================
// Getter & Setter
// ===========================================================
public void setView(final GodotView view) {
this.mView = view;
if (mInputWrapper == null)
mInputWrapper = new GodotTextInputWrapper(mView, this);
this.setOnEditorActionListener(mInputWrapper);
view.requestFocus();
}
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 951 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 7 KiB

View file

@ -153,8 +153,8 @@ bool JoypadWindows::setup_dinput_joypad(const DIDEVICEINSTANCE *instance) {
if (have_device(instance->guidInstance) || num == -1)
return false;
d_joypads[joypad_count] = dinput_gamepad();
dinput_gamepad *joy = &d_joypads[joypad_count];
d_joypads[num] = dinput_gamepad();
dinput_gamepad *joy = &d_joypads[num];
const DWORD devtype = (instance->dwDevType & 0xFF);
@ -178,7 +178,7 @@ bool JoypadWindows::setup_dinput_joypad(const DIDEVICEINSTANCE *instance) {
WORD version = 0;
sprintf_s(uid, "%04x%04x%04x%04x%04x%04x%04x%04x", type, 0, vendor, 0, product, 0, version, 0);
id_to_change = joypad_count;
id_to_change = num;
slider_count = 0;
joy->di_joy->SetDataFormat(&c_dfDIJoystick2);

View file

@ -188,7 +188,7 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int &
if (p_mode != PROCESS_CACHE && align != ALIGN_FILL)
wofs += line_ofs;
int begin = wofs;
int begin = margin;
Ref<Font> cfont = _find_font(it);
if (cfont.is_null())

View file

@ -2873,6 +2873,7 @@ void Node::_bind_methods() {
BIND_CONSTANT(NOTIFICATION_PATH_CHANGED);
BIND_CONSTANT(NOTIFICATION_INTERNAL_PROCESS);
BIND_CONSTANT(NOTIFICATION_INTERNAL_PHYSICS_PROCESS);
BIND_CONSTANT(NOTIFICATION_POST_ENTER_TREE);
BIND_CONSTANT(NOTIFICATION_WM_MOUSE_ENTER);
BIND_CONSTANT(NOTIFICATION_WM_MOUSE_EXIT);