mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
Merge remote-tracking branch 'origin/release/1.9.x'
This commit is contained in:
commit
cbb3969017
@ -1,44 +0,0 @@
|
|||||||
##############################################################################
|
|
||||||
#
|
|
||||||
# cleancvstree
|
|
||||||
#
|
|
||||||
# Cleancvstree searches a CVS tree for files that are not in CVS, and
|
|
||||||
# deletes them. Be careful using it --- it's very aggressive.
|
|
||||||
#
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
import sys,os
|
|
||||||
|
|
||||||
def cleanCvsTree(dir):
|
|
||||||
try:
|
|
||||||
sub = os.listdir(dir)
|
|
||||||
except:
|
|
||||||
print "Could not read directory: "+dir
|
|
||||||
return
|
|
||||||
valid = {}
|
|
||||||
try:
|
|
||||||
readentries = 0
|
|
||||||
cvsent = open(dir + "/CVS/Entries")
|
|
||||||
for line in cvsent:
|
|
||||||
words = line.split("/")
|
|
||||||
if (len(words) > 1):
|
|
||||||
valid[words[1]] = 1
|
|
||||||
cvsent.close()
|
|
||||||
readentries = 1
|
|
||||||
except:
|
|
||||||
print "Could not read "+dir+"/CVS/Entries"
|
|
||||||
if (readentries):
|
|
||||||
for file in sub:
|
|
||||||
if (os.path.isfile(dir+"/"+file)):
|
|
||||||
if (valid.has_key(file)==0):
|
|
||||||
os.unlink(dir+"/"+file)
|
|
||||||
for file in sub:
|
|
||||||
if (file != "CVS"):
|
|
||||||
if (os.path.isdir(dir+"/"+file)):
|
|
||||||
cleanCvsTree(dir+"/"+file)
|
|
||||||
|
|
||||||
if (os.path.isdir(sys.argv[1])==0):
|
|
||||||
print "Not a directory: "+sys.argv[1]
|
|
||||||
os.exit(1)
|
|
||||||
|
|
||||||
cleanCvsTree(sys.argv[1])
|
|
@ -1,124 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
"""This script generates the panda3d-date.tar.gz tarball for a file
|
|
||||||
release of panda3d onto the SourceForge download site.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
|
|
||||||
-d cvsroot
|
|
||||||
Specifies the CVSROOT string to use to tag and export the
|
|
||||||
tree. The default is $SFROOT if it is defined, or $CVSROOT
|
|
||||||
otherwise.
|
|
||||||
|
|
||||||
-r tag
|
|
||||||
Specifies the tag to export from. If this parameter is
|
|
||||||
specified, the tree is not tagged again; otherwise, the
|
|
||||||
current head of the CVS tree is tagged with the file version
|
|
||||||
name.
|
|
||||||
|
|
||||||
-m module
|
|
||||||
Specifies the module to check out and build. The default is
|
|
||||||
panda3d.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import os
|
|
||||||
import os.path
|
|
||||||
import getopt
|
|
||||||
import time
|
|
||||||
import glob
|
|
||||||
import shutil
|
|
||||||
|
|
||||||
CVSROOT = os.getenv('SFROOT') or os.getenv('CVSROOT')
|
|
||||||
ORIGTAG = ''
|
|
||||||
MODULE = 'panda3d'
|
|
||||||
|
|
||||||
def usage(code, msg = ''):
|
|
||||||
print >> sys.stderr, __doc__
|
|
||||||
print >> sys.stderr, msg
|
|
||||||
sys.exit(code)
|
|
||||||
|
|
||||||
try:
|
|
||||||
opts, args = getopt.getopt(sys.argv[1:], 'd:r:m:h')
|
|
||||||
except getopt.error, msg:
|
|
||||||
usage(1, msg)
|
|
||||||
|
|
||||||
for opt, arg in opts:
|
|
||||||
if opt == '-d':
|
|
||||||
CVSROOT = arg
|
|
||||||
elif opt == '-r':
|
|
||||||
ORIGTAG = arg
|
|
||||||
elif opt == '-m':
|
|
||||||
MODULE = arg
|
|
||||||
elif opt == '-h':
|
|
||||||
usage(0)
|
|
||||||
|
|
||||||
if not CVSROOT:
|
|
||||||
usage(1, 'CVSROOT must have a value.')
|
|
||||||
|
|
||||||
if not MODULE:
|
|
||||||
usage(1, 'MODULE must have a value.')
|
|
||||||
|
|
||||||
basename = MODULE + '-' + time.strftime("%Y-%m-%d")
|
|
||||||
tarfile = basename + '.tar.gz'
|
|
||||||
zipfile = basename + '.zip'
|
|
||||||
|
|
||||||
if os.path.exists(basename):
|
|
||||||
print basename, 'already exists in the local directory!'
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
if not ORIGTAG:
|
|
||||||
# If we weren't given a starting tag, make one.
|
|
||||||
tag = basename
|
|
||||||
|
|
||||||
print 'Tagging sources.'
|
|
||||||
cmd = 'cvs -f -d "%s" rtag -F -r HEAD "%s" "%s"' % (CVSROOT, tag, MODULE)
|
|
||||||
if os.system(cmd) != 0:
|
|
||||||
sys.exit(1)
|
|
||||||
else:
|
|
||||||
# Otherwise, we were given a starting tag, so use it.
|
|
||||||
tag = ORIGTAG
|
|
||||||
|
|
||||||
print 'Checking out "%s" as "%s".' % (MODULE, basename)
|
|
||||||
cmd = 'cvs -z3 -f -d "%s" export -r "%s" -d "%s" "%s"' % (CVSROOT, tag,
|
|
||||||
basename, MODULE)
|
|
||||||
if os.system(cmd) != 0:
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# Move the contents of the doc module into the root directory where people
|
|
||||||
# will expect to see it.
|
|
||||||
docdir = basename + os.sep + 'doc'
|
|
||||||
if os.path.exists(docdir):
|
|
||||||
files = glob.glob(docdir + os.sep + '*')
|
|
||||||
for file in files:
|
|
||||||
shutil.copy(file, basename)
|
|
||||||
os.remove(file)
|
|
||||||
os.rmdir(docdir)
|
|
||||||
|
|
||||||
# Generate the autoconf scripts for ppremake.
|
|
||||||
if MODULE == 'ppremake':
|
|
||||||
ppremakedir = basename
|
|
||||||
else:
|
|
||||||
ppremakedir = basename + os.sep + 'ppremake'
|
|
||||||
if os.path.exists(ppremakedir):
|
|
||||||
cmd = 'cd "./%s" && aclocal && autoheader && automake --foreign -a && autoconf' % (ppremakedir)
|
|
||||||
if os.system(cmd) != 0:
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# Generate the tarball.
|
|
||||||
print 'Generating %s' % (tarfile)
|
|
||||||
if os.path.exists(tarfile):
|
|
||||||
os.remove(tarfile)
|
|
||||||
cmd = 'tar cf - "%s" | gzip -9 > "%s"' % (basename, tarfile)
|
|
||||||
if os.system(cmd) != 0:
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# Also generate a zip file.
|
|
||||||
print 'Generating %s' % (zipfile)
|
|
||||||
if os.path.exists(zipfile):
|
|
||||||
os.remove(zipfile)
|
|
||||||
cmd = 'zip -9rq "%s" "%s"' % (zipfile, basename)
|
|
||||||
if os.system(cmd) != 0:
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
shutil.rmtree(basename)
|
|
@ -641,7 +641,7 @@ class AppRunner(DirectObject):
|
|||||||
if hasattr(__builtin__, "base"):
|
if hasattr(__builtin__, "base"):
|
||||||
base.destroy()
|
base.destroy()
|
||||||
|
|
||||||
self.notify.info("Normal exit with status %d." % err.code)
|
self.notify.info("Normal exit with status %s." % repr(err.code))
|
||||||
raise
|
raise
|
||||||
|
|
||||||
except:
|
except:
|
||||||
|
@ -2371,7 +2371,7 @@ class Packager:
|
|||||||
|
|
||||||
# Binary files that are copied (and compressed) without
|
# Binary files that are copied (and compressed) without
|
||||||
# processing.
|
# processing.
|
||||||
self.binaryExtensions = [ 'ttf', 'TTF', 'mid', 'ico' ]
|
self.binaryExtensions = [ 'ttf', 'TTF', 'mid', 'ico', 'cur' ]
|
||||||
|
|
||||||
# Files that can have an existence in multiple different
|
# Files that can have an existence in multiple different
|
||||||
# packages simultaneously without conflict.
|
# packages simultaneously without conflict.
|
||||||
@ -2411,7 +2411,7 @@ class Packager:
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Files that should be extracted to disk.
|
# Files that should be extracted to disk.
|
||||||
self.extractExtensions = self.executableExtensions[:] + self.manifestExtensions[:] + [ 'ico' ]
|
self.extractExtensions = self.executableExtensions[:] + self.manifestExtensions[:] + [ 'ico', 'cur' ]
|
||||||
|
|
||||||
# Files that indicate a platform dependency.
|
# Files that indicate a platform dependency.
|
||||||
self.platformSpecificExtensions = self.executableExtensions[:]
|
self.platformSpecificExtensions = self.executableExtensions[:]
|
||||||
|
@ -111,7 +111,7 @@ class ArgumentError(StandardError):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def makePackedApp(args):
|
def makePackedApp(args):
|
||||||
opts, args = getopt.getopt(args, 'o:d:m:S:e:n:p:c:r:s:Dh')
|
opts, args = getopt.getopt(args, 'o:d:m:S:e:n:x:p:c:r:s:Dh')
|
||||||
|
|
||||||
packager = Packager.Packager()
|
packager = Packager.Packager()
|
||||||
|
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
from direct.directbase.TestStart import *
|
from direct.directbase.TestStart import *
|
||||||
|
|
||||||
from pandac.LinearVectorForce import LinearVectorForce
|
from panda3d.physics import LinearVectorForce
|
||||||
from pandac.Vec3 import Vec3
|
from panda3d.core import Vec3
|
||||||
import ParticleEffect
|
import ParticleEffect
|
||||||
from direct.tkpanels import ParticlePanel
|
from direct.tkpanels import ParticlePanel
|
||||||
import Particles
|
import Particles
|
||||||
|
@ -376,12 +376,30 @@ run_python() {
|
|||||||
// An uncaught application exception, and not handled by
|
// An uncaught application exception, and not handled by
|
||||||
// appRunner.exceptionHandler. If it is a SystemExit, extract
|
// appRunner.exceptionHandler. If it is a SystemExit, extract
|
||||||
// the exit status that we should return.
|
// the exit status that we should return.
|
||||||
if (PyErr_Occurred() == PyExc_SystemExit) {
|
if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
|
||||||
PyObject *ptype, *ptraceback;
|
PyObject *ptype, *ptraceback;
|
||||||
PySystemExitObject *value = NULL;
|
PyObject *value = NULL;
|
||||||
PyErr_Fetch(&ptype, (PyObject **)&value, &ptraceback);
|
PyErr_Fetch(&ptype, &value, &ptraceback);
|
||||||
if (value != NULL) {
|
|
||||||
status = (int)PyInt_AsLong(value->code);
|
if (value != NULL && PyExceptionInstance_Check(value)) {
|
||||||
|
PyObject *code = PyObject_GetAttrString(value, "code");
|
||||||
|
if (code) {
|
||||||
|
Py_DECREF(value);
|
||||||
|
value = code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value == NULL || value == Py_None) {
|
||||||
|
status = 0;
|
||||||
|
#if PY_MAJOR_VERSION >= 3
|
||||||
|
} else if (PyLong_Check(value)) {
|
||||||
|
status = (int)PyLong_AsLong(value);
|
||||||
|
#else
|
||||||
|
} else if (PyInt_Check(value)) {
|
||||||
|
status = (int)PyInt_AsLong(value);
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
status = 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
PyErr_Print();
|
PyErr_Print();
|
||||||
|
@ -855,7 +855,7 @@ class Loader(DirectObject):
|
|||||||
def loadShader (self, shaderPath, okMissing = False):
|
def loadShader (self, shaderPath, okMissing = False):
|
||||||
shader = ShaderPool.loadShader (shaderPath)
|
shader = ShaderPool.loadShader (shaderPath)
|
||||||
if not shader and not okMissing:
|
if not shader and not okMissing:
|
||||||
message = 'Could not shader file: %s' % (shaderPath)
|
message = 'Could not load shader file: %s' % (shaderPath)
|
||||||
raise IOError, message
|
raise IOError, message
|
||||||
return shader
|
return shader
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ goto done
|
|||||||
|
|
||||||
:missing2
|
:missing2
|
||||||
echo You seem to be missing the 'thirdparty' directory. You probably checked
|
echo You seem to be missing the 'thirdparty' directory. You probably checked
|
||||||
echo the source code out from sourceforge. The sourceforge repository is
|
echo the source code out from GitHub. The GitHub repository is
|
||||||
echo missing the 'thirdparty' directory. You will need to supplement the
|
echo missing the 'thirdparty' directory. You will need to supplement the
|
||||||
echo code by downloading the 'thirdparty' directory from www.panda3d.org
|
echo code by downloading the 'thirdparty' directory from www.panda3d.org
|
||||||
goto done
|
goto done
|
||||||
|
@ -21,7 +21,7 @@ goto done
|
|||||||
|
|
||||||
:missing2
|
:missing2
|
||||||
echo You seem to be missing the 'thirdparty' directory. You probably checked
|
echo You seem to be missing the 'thirdparty' directory. You probably checked
|
||||||
echo the source code out from sourceforge. The sourceforge repository is
|
echo the source code out from GitHub. The GitHub repository is
|
||||||
echo missing the 'thirdparty' directory. You will need to supplement the
|
echo missing the 'thirdparty' directory. You will need to supplement the
|
||||||
echo code by downloading the 'thirdparty' directory from www.panda3d.org
|
echo code by downloading the 'thirdparty' directory from www.panda3d.org
|
||||||
goto done
|
goto done
|
||||||
|
@ -21,7 +21,7 @@ goto done
|
|||||||
|
|
||||||
:missing2
|
:missing2
|
||||||
echo You seem to be missing the 'thirdparty' directory. You probably checked
|
echo You seem to be missing the 'thirdparty' directory. You probably checked
|
||||||
echo the source code out from sourceforge. The sourceforge repository is
|
echo the source code out from GitHub. The GitHub repository is
|
||||||
echo missing the 'thirdparty' directory. You will need to supplement the
|
echo missing the 'thirdparty' directory. You will need to supplement the
|
||||||
echo code by downloading the 'thirdparty' directory from www.panda3d.org
|
echo code by downloading the 'thirdparty' directory from www.panda3d.org
|
||||||
goto done
|
goto done
|
||||||
|
@ -31,7 +31,7 @@ goto done
|
|||||||
:missing2
|
:missing2
|
||||||
echo %thirdparty%
|
echo %thirdparty%
|
||||||
echo You seem to be missing the 'thirdparty' directory. You probably checked
|
echo You seem to be missing the 'thirdparty' directory. You probably checked
|
||||||
echo the source code out from sourceforge. The sourceforge repository is
|
echo the source code out from GitHub. The GitHub repository is
|
||||||
echo missing the 'thirdparty' directory. You will need to supplement the
|
echo missing the 'thirdparty' directory. You will need to supplement the
|
||||||
echo code by downloading the 'thirdparty' directory from www.panda3d.org
|
echo code by downloading the 'thirdparty' directory from www.panda3d.org
|
||||||
goto done
|
goto done
|
||||||
|
@ -1,95 +0,0 @@
|
|||||||
VC7 upgrade instructions in 2 easy steps
|
|
||||||
------------------------
|
|
||||||
Step 1. cvs update wintools & dtool
|
|
||||||
|
|
||||||
Step 2. Run v:\msvc7\vc_setup\setup.exe, or install from the MSDN
|
|
||||||
'Visual Studio.NET' CD. Click on 'Windows Component Update' (if it is
|
|
||||||
highlighted, else click '2'). Click 'Continue' (Selecting 'Do not use
|
|
||||||
this machine to host web projects') You will install IE6, which will
|
|
||||||
requires a reboot. Give your pw if you want it to happen
|
|
||||||
automatically.
|
|
||||||
|
|
||||||
After rebooting, setup should start again. If it does not, go back and
|
|
||||||
rerun it, it should remember where it left off.
|
|
||||||
|
|
||||||
After installing components, you are ready to install VC7 in Step 2.
|
|
||||||
Enter this step and enter the product-key, which is stored in
|
|
||||||
V:\msvc7\vc7-prodkey.txt
|
|
||||||
|
|
||||||
On the 'select items to install page', you need uncheck things to
|
|
||||||
avoid wasting gigs of extra space and install time. Uncheck
|
|
||||||
everything except for Language Tools->Visual C++, Server
|
|
||||||
Components->Remote Debugger->Native Remote Debugger, and if you want,
|
|
||||||
Documentation (this is a gig, and is only a slight update if you
|
|
||||||
already have MSDN installed locally though. You will want to
|
|
||||||
uninstall the separately-installed MSDN docs if you get this.)
|
|
||||||
|
|
||||||
Unlike VC 6.0, there is no option to add the required compiler bin
|
|
||||||
directories to the environment path automatically. To do this, if you
|
|
||||||
are running from the NT command line, run
|
|
||||||
"C:\Program Files\Microsoft Visual Studio .NET\Vc7\bin\vcvars32.bat"
|
|
||||||
|
|
||||||
If you are using tcsh.exe under cygwin, enable VC7 using
|
|
||||||
'source $WINTOOLS/etc/setup_msvc7.csh'
|
|
||||||
|
|
||||||
You will want to copy the top portion of setup_msvc7.csh to your
|
|
||||||
.cshrc, so you can do 'set_msvc7' to set up the PATH properly in the
|
|
||||||
future, or you can add the required dirs to the front of your path
|
|
||||||
explicitly as well as 'setenv USE_COMPILER MSVC7' to always use VC7.
|
|
||||||
The easiest thing to do is just put the 'set_msvc7' at the end of your
|
|
||||||
.cshrc.
|
|
||||||
|
|
||||||
IMPORTANT:
|
|
||||||
|
|
||||||
After finishing this process, make sure you are using VC7 in your
|
|
||||||
shell by typing 'cl' at the prompt. If you see:
|
|
||||||
|
|
||||||
> Microsoft (R)32-bit C/C++ Optimizing Compiler Version 13.00.9466 for 80x86
|
|
||||||
> Copyright (C) Microsoft Corporation 1984-2001.
|
|
||||||
|
|
||||||
then you have VC7. If you have still VC6, you will see
|
|
||||||
> Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
|
|
||||||
> Copyright (C) Microsoft Corp 1984-1998.
|
|
||||||
|
|
||||||
If you try to build with this broken setup, the build process
|
|
||||||
will get confused and compile with VC6 but try to link with
|
|
||||||
the VC7 libraries and you will get link errors.
|
|
||||||
|
|
||||||
To correct this problem, check your tcsh path to make sure it has the
|
|
||||||
.NET dirs in it, and make sure the cygwin softlink mount point /msvc7
|
|
||||||
exists, and is not empty but points to the proper VC7 directory. Doing
|
|
||||||
'ls /msvc7' should give you something like
|
|
||||||
|
|
||||||
Common7/ Visual Studio .NET Enterprise Architect - English/
|
|
||||||
Crystal Reports/ Visual Studio SDKs/
|
|
||||||
EnterpriseFrameworks/ contents.htm
|
|
||||||
FrameworkSDK/ readme.htm
|
|
||||||
Msdn/ redist.txt
|
|
||||||
Setup/ sqlserver/
|
|
||||||
Vb7/ toc.htm
|
|
||||||
Vc7/ vdt70vcs.dll*
|
|
||||||
|
|
||||||
If it does not, try running 'source ~/player/wintools/etc/setup_env.csh'
|
|
||||||
again to get it to do the
|
|
||||||
'mount -s C:/Program\ Files/Microsoft\ Visual\ Studio\ .NET /msvc7'
|
|
||||||
cmd to create the softlink, or run the cmd yourself.
|
|
||||||
|
|
||||||
---
|
|
||||||
Notes:
|
|
||||||
The debug C runtime seems significantly slower than the vc6 one, which has
|
|
||||||
slowed Opt2 install builds considerably.
|
|
||||||
---------
|
|
||||||
To distribute toontown,
|
|
||||||
We need to rebuild the python and nspr DLLs to link to the new
|
|
||||||
VC7 C and C++ runtime DLLs, which are
|
|
||||||
msvcp70.dll
|
|
||||||
msvcr70.dll
|
|
||||||
|
|
||||||
and these must replace
|
|
||||||
msvcp60.dll
|
|
||||||
msvcrt.dll
|
|
||||||
in the Toontown download.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -430,6 +430,7 @@ process_events() {
|
|||||||
// inner corner, anyway, but that means we need to fix
|
// inner corner, anyway, but that means we need to fix
|
||||||
// XConfigureWindow too.)
|
// XConfigureWindow too.)
|
||||||
properties.set_origin(configure_event.x, configure_event.y);
|
properties.set_origin(configure_event.x, configure_event.y);
|
||||||
|
properties.set_size(configure_event.width, configure_event.height);
|
||||||
|
|
||||||
if (_properties.get_fixed_size()) {
|
if (_properties.get_fixed_size()) {
|
||||||
// If the window properties indicate a fixed size only, undo
|
// If the window properties indicate a fixed size only, undo
|
||||||
@ -437,21 +438,15 @@ process_events() {
|
|||||||
// doesn't appear to be a way to universally disallow this
|
// doesn't appear to be a way to universally disallow this
|
||||||
// directly (although we do set the min_size and max_size to
|
// directly (although we do set the min_size and max_size to
|
||||||
// the same value, which seems to work for most window
|
// the same value, which seems to work for most window
|
||||||
// managers.) Incidentally, this also works to force my
|
// managers.)
|
||||||
// tiling window manager into 'floating' mode.
|
if (configure_event.width != _fixed_size.get_x() ||
|
||||||
WindowProperties current_props = get_properties();
|
configure_event.height != _fixed_size.get_y()) {
|
||||||
if (configure_event.width != current_props.get_x_size() ||
|
|
||||||
configure_event.height != current_props.get_y_size()) {
|
|
||||||
XWindowChanges changes;
|
XWindowChanges changes;
|
||||||
changes.width = current_props.get_x_size();
|
changes.width = _fixed_size.get_x();
|
||||||
changes.height = current_props.get_y_size();
|
changes.height = _fixed_size.get_y();
|
||||||
int value_mask = (CWWidth | CWHeight);
|
int value_mask = (CWWidth | CWHeight);
|
||||||
XConfigureWindow(_display, _xwindow, value_mask, &changes);
|
XConfigureWindow(_display, _xwindow, value_mask, &changes);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
|
||||||
// A normal window may be resized by the user at will.
|
|
||||||
properties.set_size(configure_event.width, configure_event.height);
|
|
||||||
}
|
}
|
||||||
changed_properties = true;
|
changed_properties = true;
|
||||||
}
|
}
|
||||||
@ -495,16 +490,19 @@ set_properties_now(WindowProperties &properties) {
|
|||||||
x11GraphicsPipe *x11_pipe;
|
x11GraphicsPipe *x11_pipe;
|
||||||
DCAST_INTO_V(x11_pipe, _pipe);
|
DCAST_INTO_V(x11_pipe, _pipe);
|
||||||
|
|
||||||
// Handle fullscreen mode.
|
// We're either going into or out of fullscreen, or are in fullscreen
|
||||||
if (properties.has_fullscreen()) {
|
// and are changing the resolution.
|
||||||
if (properties.get_fullscreen()) {
|
bool is_fullscreen = _properties.has_fullscreen() && _properties.get_fullscreen();
|
||||||
|
bool want_fullscreen = properties.has_fullscreen() ? properties.get_fullscreen() : is_fullscreen;
|
||||||
|
|
||||||
|
if (is_fullscreen != want_fullscreen || (is_fullscreen && properties.has_size())) {
|
||||||
|
if (want_fullscreen) {
|
||||||
if (_have_xrandr) {
|
if (_have_xrandr) {
|
||||||
#ifdef HAVE_XRANDR
|
#ifdef HAVE_XRANDR
|
||||||
XRRScreenConfiguration* conf = XRRGetScreenInfo(_display, x11_pipe->get_root());
|
XRRScreenConfiguration* conf = XRRGetScreenInfo(_display, x11_pipe->get_root());
|
||||||
if (_orig_size_id == (SizeID) -1) {
|
SizeID old_size_id = XRRConfigCurrentConfiguration(conf, &_orig_rotation);
|
||||||
_orig_size_id = XRRConfigCurrentConfiguration(conf, &_orig_rotation);
|
SizeID new_size_id = (SizeID) -1;
|
||||||
}
|
int num_sizes = 0, reqsizex, reqsizey;
|
||||||
int num_sizes, reqsizex, reqsizey, new_size_id = -1;
|
|
||||||
if (properties.has_size()) {
|
if (properties.has_size()) {
|
||||||
reqsizex = properties.get_x_size();
|
reqsizex = properties.get_x_size();
|
||||||
reqsizey = properties.get_y_size();
|
reqsizey = properties.get_y_size();
|
||||||
@ -520,16 +518,18 @@ set_properties_now(WindowProperties &properties) {
|
|||||||
new_size_id = i;
|
new_size_id = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (new_size_id == -1) {
|
if (new_size_id == (SizeID) -1) {
|
||||||
x11display_cat.error()
|
x11display_cat.error()
|
||||||
<< "Videocard has no supported display resolutions at specified res ("
|
<< "Videocard has no supported display resolutions at specified res ("
|
||||||
<< reqsizex << " x " << reqsizey <<")\n";
|
<< reqsizex << " x " << reqsizey << ")\n";
|
||||||
_orig_size_id = -1;
|
|
||||||
} else {
|
} else {
|
||||||
if (new_size_id != _orig_size_id) {
|
if (new_size_id != old_size_id) {
|
||||||
|
|
||||||
XRRSetScreenConfig(_display, conf, x11_pipe->get_root(), new_size_id, _orig_rotation, CurrentTime);
|
XRRSetScreenConfig(_display, conf, x11_pipe->get_root(), new_size_id, _orig_rotation, CurrentTime);
|
||||||
} else {
|
if (_orig_size_id == (SizeID) -1) {
|
||||||
_orig_size_id = -1;
|
// Remember the original resolution so we can switch back to it.
|
||||||
|
_orig_size_id = old_size_id;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -546,7 +546,7 @@ set_properties_now(WindowProperties &properties) {
|
|||||||
if (_have_xrandr && _orig_size_id != (SizeID) -1) {
|
if (_have_xrandr && _orig_size_id != (SizeID) -1) {
|
||||||
XRRScreenConfiguration* conf = XRRGetScreenInfo(_display, x11_pipe->get_root());
|
XRRScreenConfiguration* conf = XRRGetScreenInfo(_display, x11_pipe->get_root());
|
||||||
XRRSetScreenConfig(_display, conf, x11_pipe->get_root(), _orig_size_id, _orig_rotation, CurrentTime);
|
XRRSetScreenConfig(_display, conf, x11_pipe->get_root(), _orig_size_id, _orig_rotation, CurrentTime);
|
||||||
_orig_size_id = -1;
|
_orig_size_id = (SizeID) -1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// Set the origin back to what it was
|
// Set the origin back to what it was
|
||||||
@ -590,8 +590,7 @@ set_properties_now(WindowProperties &properties) {
|
|||||||
// on the fly.
|
// on the fly.
|
||||||
|
|
||||||
// We'll pass some property requests on as a window manager hint.
|
// We'll pass some property requests on as a window manager hint.
|
||||||
WindowProperties wm_properties = _properties;
|
set_wm_properties(properties, true);
|
||||||
wm_properties.add_properties(properties);
|
|
||||||
|
|
||||||
// The window title may be changed by issuing another hint request.
|
// The window title may be changed by issuing another hint request.
|
||||||
// Assume this will be honored.
|
// Assume this will be honored.
|
||||||
@ -618,6 +617,7 @@ set_properties_now(WindowProperties &properties) {
|
|||||||
changes.y = 0;
|
changes.y = 0;
|
||||||
value_mask |= CWX | CWY;
|
value_mask |= CWX | CWY;
|
||||||
properties.clear_origin();
|
properties.clear_origin();
|
||||||
|
|
||||||
} else if (properties.has_origin()) {
|
} else if (properties.has_origin()) {
|
||||||
changes.x = properties.get_x_origin();
|
changes.x = properties.get_x_origin();
|
||||||
changes.y = properties.get_y_origin();
|
changes.y = properties.get_y_origin();
|
||||||
@ -626,10 +626,21 @@ set_properties_now(WindowProperties &properties) {
|
|||||||
properties.clear_origin();
|
properties.clear_origin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This, too. But we can't currently change out of fixed_size mode.
|
||||||
|
if (properties.has_fixed_size() && properties.get_fixed_size()) {
|
||||||
|
_properties.set_fixed_size(properties.get_fixed_size());
|
||||||
|
properties.clear_fixed_size();
|
||||||
|
_fixed_size = _properties.get_size();
|
||||||
|
}
|
||||||
|
|
||||||
if (properties.has_size()) {
|
if (properties.has_size()) {
|
||||||
changes.width = properties.get_x_size();
|
changes.width = properties.get_x_size();
|
||||||
changes.height = properties.get_y_size();
|
changes.height = properties.get_y_size();
|
||||||
value_mask |= (CWWidth | CWHeight);
|
value_mask |= (CWWidth | CWHeight);
|
||||||
|
|
||||||
|
if (_properties.get_fixed_size()) {
|
||||||
|
_fixed_size = properties.get_size();
|
||||||
|
}
|
||||||
properties.clear_size();
|
properties.clear_size();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -657,13 +668,6 @@ set_properties_now(WindowProperties &properties) {
|
|||||||
properties.clear_z_order();
|
properties.clear_z_order();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (value_mask != 0) {
|
|
||||||
XReconfigureWMWindow(_display, _xwindow, _screen, value_mask, &changes);
|
|
||||||
|
|
||||||
// Don't draw anything until this is done reconfiguring.
|
|
||||||
_awaiting_configure = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We hide the cursor by setting it to an invisible pixmap.
|
// We hide the cursor by setting it to an invisible pixmap.
|
||||||
// We can also load a custom cursor from a file.
|
// We can also load a custom cursor from a file.
|
||||||
if (properties.has_cursor_hidden() || properties.has_cursor_filename()) {
|
if (properties.has_cursor_hidden() || properties.has_cursor_filename()) {
|
||||||
@ -784,7 +788,14 @@ set_properties_now(WindowProperties &properties) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
set_wm_properties(wm_properties, true);
|
if (value_mask != 0) {
|
||||||
|
// We must call this after changing the WM properties, otherwise
|
||||||
|
// we may get misleading ConfigureNotify events in the wrong order.
|
||||||
|
XReconfigureWMWindow(_display, _xwindow, _screen, value_mask, &changes);
|
||||||
|
|
||||||
|
// Don't draw anything until this is done reconfiguring.
|
||||||
|
_awaiting_configure = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -964,6 +975,11 @@ open_window() {
|
|||||||
<< "failed to create X window.\n";
|
<< "failed to create X window.\n";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_properties.get_fixed_size()) {
|
||||||
|
_fixed_size = _properties.get_size();
|
||||||
|
}
|
||||||
|
|
||||||
set_wm_properties(_properties, false);
|
set_wm_properties(_properties, false);
|
||||||
|
|
||||||
// We don't specify any fancy properties of the XIC. It would be
|
// We don't specify any fancy properties of the XIC. It would be
|
||||||
@ -1036,8 +1052,8 @@ set_wm_properties(const WindowProperties &properties, bool already_mapped) {
|
|||||||
XTextProperty window_name;
|
XTextProperty window_name;
|
||||||
XTextProperty *window_name_p = (XTextProperty *)NULL;
|
XTextProperty *window_name_p = (XTextProperty *)NULL;
|
||||||
if (properties.has_title()) {
|
if (properties.has_title()) {
|
||||||
char *name = (char *)properties.get_title().c_str();
|
const char *name = properties.get_title().c_str();
|
||||||
if (XStringListToTextProperty(&name, 1, &window_name) != 0) {
|
if (XStringListToTextProperty((char **)&name, 1, &window_name) != 0) {
|
||||||
window_name_p = &window_name;
|
window_name_p = &window_name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1058,18 +1074,19 @@ set_wm_properties(const WindowProperties &properties, bool already_mapped) {
|
|||||||
}
|
}
|
||||||
size_hints_p->flags |= USPosition;
|
size_hints_p->flags |= USPosition;
|
||||||
}
|
}
|
||||||
|
LVecBase2i size = _properties.get_size();
|
||||||
if (properties.has_size()) {
|
if (properties.has_size()) {
|
||||||
size_hints_p->width = properties.get_x_size();
|
size = properties.get_size();
|
||||||
size_hints_p->height = properties.get_y_size();
|
size_hints_p->width = size.get_x();
|
||||||
|
size_hints_p->height = size.get_y();
|
||||||
size_hints_p->flags |= USSize;
|
size_hints_p->flags |= USSize;
|
||||||
|
}
|
||||||
if (properties.get_fixed_size()) {
|
if (properties.get_fixed_size()) {
|
||||||
size_hints_p->min_width = properties.get_x_size();
|
size_hints_p->min_width = size.get_x();
|
||||||
size_hints_p->min_height = properties.get_y_size();
|
size_hints_p->min_height = size.get_y();
|
||||||
size_hints_p->max_width = properties.get_x_size();
|
size_hints_p->max_width = size.get_x();
|
||||||
size_hints_p->max_height = properties.get_y_size();
|
size_hints_p->max_height = size.get_y();
|
||||||
size_hints_p->flags |= (PMinSize | PMaxSize);
|
size_hints_p->flags |= (PMinSize | PMaxSize);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1109,18 +1126,21 @@ set_wm_properties(const WindowProperties &properties, bool already_mapped) {
|
|||||||
SetAction set_data[max_set_data];
|
SetAction set_data[max_set_data];
|
||||||
int next_set_data = 0;
|
int next_set_data = 0;
|
||||||
|
|
||||||
if (properties.get_fullscreen()) {
|
if (properties.has_fullscreen()) {
|
||||||
// For a "fullscreen" request, we pass this through, hoping the
|
if (properties.get_fullscreen()) {
|
||||||
// window manager will support EWMH.
|
// For a "fullscreen" request, we pass this through, hoping the
|
||||||
type_data[next_type_data++] = x11_pipe->_net_wm_window_type_fullscreen;
|
// window manager will support EWMH.
|
||||||
|
type_data[next_type_data++] = x11_pipe->_net_wm_window_type_fullscreen;
|
||||||
|
|
||||||
// We also request it as a state.
|
// We also request it as a state.
|
||||||
state_data[next_state_data++] = x11_pipe->_net_wm_state_fullscreen;
|
state_data[next_state_data++] = x11_pipe->_net_wm_state_fullscreen;
|
||||||
// Don't ask me why this has to be 1/0 and not _net_wm_state_add.
|
// Don't ask me why this has to be 1/0 and not _net_wm_state_add.
|
||||||
// It doesn't seem to work otherwise.
|
// It doesn't seem to work otherwise.
|
||||||
set_data[next_set_data++] = SetAction(x11_pipe->_net_wm_state_fullscreen, 1);
|
set_data[next_set_data++] = SetAction(x11_pipe->_net_wm_state_fullscreen, 1);
|
||||||
} else {
|
|
||||||
set_data[next_set_data++] = SetAction(x11_pipe->_net_wm_state_fullscreen, 0);
|
} else {
|
||||||
|
set_data[next_set_data++] = SetAction(x11_pipe->_net_wm_state_fullscreen, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we asked for a window without a border, there's no excellent
|
// If we asked for a window without a border, there's no excellent
|
||||||
|
@ -96,6 +96,8 @@ protected:
|
|||||||
SizeID _orig_size_id;
|
SizeID _orig_size_id;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
LVecBase2i _fixed_size;
|
||||||
|
|
||||||
long _event_mask;
|
long _event_mask;
|
||||||
bool _awaiting_configure;
|
bool _awaiting_configure;
|
||||||
bool _dga_mouse_enabled;
|
bool _dga_mouse_enabled;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user