117 lines
4.9 KiB
Python
117 lines
4.9 KiB
Python
|
# ----------------------------------------------------------------------------
|
||
|
# pyglet
|
||
|
# Copyright (c) 2006-2008 Alex Holkner
|
||
|
# Copyright (c) 2008-2020 pyglet contributors
|
||
|
# All rights reserved.
|
||
|
#
|
||
|
# Redistribution and use in source and binary forms, with or without
|
||
|
# modification, are permitted provided that the following conditions
|
||
|
# are met:
|
||
|
#
|
||
|
# * Redistributions of source code must retain the above copyright
|
||
|
# notice, this list of conditions and the following disclaimer.
|
||
|
# * Redistributions in binary form must reproduce the above copyright
|
||
|
# notice, this list of conditions and the following disclaimer in
|
||
|
# the documentation and/or other materials provided with the
|
||
|
# distribution.
|
||
|
# * Neither the name of pyglet nor the names of its
|
||
|
# contributors may be used to endorse or promote products
|
||
|
# derived from this software without specific prior written
|
||
|
# permission.
|
||
|
#
|
||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||
|
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||
|
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||
|
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||
|
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||
|
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||
|
# ----------------------------------------------------------------------------
|
||
|
|
||
|
"""Display and screen management.
|
||
|
|
||
|
Rendering is performed on a :class:`Canvas`, which conceptually could be an
|
||
|
off-screen buffer, the content area of a :class:`pyglet.window.Window`, or an
|
||
|
entire screen. Currently, canvases can only be created with windows (though
|
||
|
windows can be set fullscreen).
|
||
|
|
||
|
Windows and canvases must belong to a :class:`Display`. On Windows and Mac OS X
|
||
|
there is only one display, which can be obtained with :func:`get_display`.
|
||
|
Linux supports multiple displays, corresponding to discrete X11 display
|
||
|
connections and screens. :func:`get_display` on Linux returns the default
|
||
|
display and screen 0 (``localhost:0.0``); if a particular screen or display is
|
||
|
required then :class:`Display` can be instantiated directly.
|
||
|
|
||
|
Within a display one or more screens are attached. A :class:`Screen` often
|
||
|
corresponds to a physical attached monitor, however a monitor or projector set
|
||
|
up to clone another screen will not be listed. Use :meth:`Display.get_screens`
|
||
|
to get a list of the attached screens; these can then be queried for their
|
||
|
sizes and virtual positions on the desktop.
|
||
|
|
||
|
The size of a screen is determined by its current mode, which can be changed
|
||
|
by the application; see the documentation for :class:`Screen`.
|
||
|
|
||
|
.. versionadded:: 1.2
|
||
|
"""
|
||
|
|
||
|
import sys
|
||
|
import weakref
|
||
|
|
||
|
|
||
|
_is_pyglet_doc_run = hasattr(sys, "is_pyglet_doc_run") and sys.is_pyglet_doc_run
|
||
|
|
||
|
|
||
|
_displays = weakref.WeakSet()
|
||
|
"""Set of all open displays. Instances of :class:`Display` are automatically
|
||
|
added to this set upon construction. The set uses weak references, so displays
|
||
|
are removed from the set when they are no longer referenced.
|
||
|
|
||
|
:type: :class:`WeakSet`
|
||
|
"""
|
||
|
|
||
|
|
||
|
def get_display():
|
||
|
"""Get the default display device.
|
||
|
|
||
|
If there is already a :class:`Display` connection, that display will be
|
||
|
returned. Otherwise, a default :class:`Display` is created and returned.
|
||
|
If multiple display connections are active, an arbitrary one is returned.
|
||
|
|
||
|
.. versionadded:: 1.2
|
||
|
|
||
|
:rtype: :class:`Display`
|
||
|
"""
|
||
|
# If there are existing displays, return one of them arbitrarily.
|
||
|
for display in _displays:
|
||
|
return display
|
||
|
|
||
|
# Otherwise, create a new display and return it.
|
||
|
return Display()
|
||
|
|
||
|
|
||
|
if _is_pyglet_doc_run:
|
||
|
from pyglet.canvas.base import Display, Screen, Canvas, ScreenMode
|
||
|
else:
|
||
|
from pyglet import compat_platform, options
|
||
|
if options['headless']:
|
||
|
from pyglet.canvas.headless import HeadlessDisplay as Display
|
||
|
from pyglet.canvas.headless import HeadlessScreen as Screen
|
||
|
from pyglet.canvas.headless import HeadlessCanvas as Canvas
|
||
|
elif compat_platform == 'darwin':
|
||
|
from pyglet.canvas.cocoa import CocoaDisplay as Display
|
||
|
from pyglet.canvas.cocoa import CocoaScreen as Screen
|
||
|
from pyglet.canvas.cocoa import CocoaCanvas as Canvas
|
||
|
elif compat_platform in ('win32', 'cygwin'):
|
||
|
from pyglet.canvas.win32 import Win32Display as Display
|
||
|
from pyglet.canvas.win32 import Win32Screen as Screen
|
||
|
from pyglet.canvas.win32 import Win32Canvas as Canvas
|
||
|
else:
|
||
|
from pyglet.canvas.xlib import XlibDisplay as Display
|
||
|
from pyglet.canvas.xlib import XlibScreen as Screen
|
||
|
from pyglet.canvas.xlib import XlibCanvas as Canvas
|