281 lines
6.7 KiB
C++
281 lines
6.7 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public
|
|
* License Version 1.1 (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.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
* implied. See the License for the specific language governing
|
|
* rights and limitations under the License.
|
|
*
|
|
* The Original Code is mozilla.org code.
|
|
*
|
|
* The Initial Developer of the Original Code is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
* Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*/
|
|
/*
|
|
DisplayFactory.cpp -- class definition for the factory class
|
|
Created: Spence Murray <spence@netscape.com>, 17-Sep-96.
|
|
*/
|
|
|
|
|
|
|
|
#include "DisplayFactory.h"
|
|
#include "xpassert.h"
|
|
|
|
#ifdef DEBUG_toshok
|
|
#define D(x) x
|
|
#else
|
|
#define D(x)
|
|
#endif
|
|
|
|
#define PRIVATE_COLORMAP_REALLY_MEANS_PRIVATE_COLORMAP
|
|
|
|
static XFE_DisplayFactory *factoryRunning = NULL;
|
|
|
|
// Internationalization stuff
|
|
#include "xpgetstr.h"
|
|
extern int XFE_DISPLAY_FACTORY_INSTALL_COLORMAP_ERROR;
|
|
|
|
|
|
fe_colormap *
|
|
XFE_DisplayFactory::getSharedColormap()
|
|
{
|
|
// make sure the visual stuff has been dealt with.
|
|
getVisual();
|
|
|
|
if (m_sharedCmap == NULL)
|
|
{
|
|
if (m_alwaysInstallCmap)
|
|
{
|
|
Colormap cmap = XCreateColormap (m_display, RootWindowOfScreen (m_screen),
|
|
m_visual, AllocNone);
|
|
m_sharedCmap = fe_NewColormap(m_screen, m_visual, cmap, True);
|
|
}
|
|
else
|
|
{
|
|
Colormap cmap = DefaultColormapOfScreen(m_screen);
|
|
|
|
m_sharedCmap = fe_NewColormap(m_screen, DefaultVisualOfScreen(m_screen), cmap, False);
|
|
}
|
|
}
|
|
|
|
return m_sharedCmap;
|
|
}
|
|
|
|
fe_colormap *
|
|
XFE_DisplayFactory::getPrivateColormap()
|
|
{
|
|
#ifdef PRIVATE_COLORMAP_REALLY_MEANS_PRIVATE_COLORMAP
|
|
|
|
if (m_alwaysInstallCmap)
|
|
{
|
|
Colormap cmap;
|
|
|
|
// make sure the visual stuff has been dealt with.
|
|
getVisual();
|
|
|
|
cmap = XCreateColormap (m_display, RootWindowOfScreen (m_screen),
|
|
m_visual, AllocNone);
|
|
|
|
return fe_NewColormap(m_screen, m_visual, cmap, True);
|
|
}
|
|
else
|
|
#endif
|
|
return getSharedColormap();
|
|
}
|
|
|
|
Visual *
|
|
XFE_DisplayFactory::getVisual()
|
|
{
|
|
if (m_visual == NULL)
|
|
{
|
|
m_visual = fe_globalData.default_visual;
|
|
|
|
if (m_visual == NULL)
|
|
{
|
|
Visual *v;
|
|
String str = 0;
|
|
|
|
/* "*visualID" is special for a number of reasons... */
|
|
static XtResource getVisual_res = { "visualID", "VisualID",
|
|
XtRString, sizeof (String),
|
|
0, XtRString, "default" };
|
|
|
|
XtGetSubresources (m_toplevel, &str, (char *)fe_progname, "TopLevelShell",
|
|
&getVisual_res, 1, 0, 0);
|
|
v = fe_ParseVisual (m_screen, str);
|
|
|
|
m_visual =
|
|
fe_globalData.default_visual = v;
|
|
}
|
|
|
|
/* Don't allow colormap flashing on a deep display */
|
|
if (m_visual != DefaultVisualOfScreen (m_screen))
|
|
m_alwaysInstallCmap = True;
|
|
|
|
if (!fe_globalData.default_colormap)
|
|
{
|
|
Colormap cmap = DefaultColormapOfScreen (m_screen);
|
|
fe_globalData.default_colormap =
|
|
fe_NewColormap(m_screen, DefaultVisualOfScreen(m_screen), cmap, False);
|
|
}
|
|
}
|
|
|
|
return m_visual;
|
|
}
|
|
|
|
int
|
|
XFE_DisplayFactory::getVisualDepth()
|
|
{
|
|
// make sure the visual has been initialized
|
|
getVisual();
|
|
|
|
if (m_visualDepth == 0)
|
|
{
|
|
XVisualInfo vi_in, *vi_out;
|
|
int out_count;
|
|
vi_in.visualid = XVisualIDFromVisual (m_visual);
|
|
vi_out = XGetVisualInfo (m_display, VisualIDMask,
|
|
&vi_in, &out_count);
|
|
if (! vi_out) abort ();
|
|
|
|
m_visualDepth = vi_out [0].depth;
|
|
|
|
XFree ((char *) vi_out);
|
|
}
|
|
|
|
|
|
return m_visualDepth;
|
|
}
|
|
|
|
int
|
|
XFE_DisplayFactory::getVisualPixmapDepth()
|
|
{
|
|
int pixmap_depth;
|
|
int i, pfvc = 0;
|
|
XPixmapFormatValues *pfv;
|
|
|
|
// make sure the visual stuff has been initialized
|
|
getVisual();
|
|
getVisualDepth();
|
|
|
|
pixmap_depth = m_visualDepth;
|
|
|
|
pfv = XListPixmapFormats(m_display, &pfvc);
|
|
/* Return the first matching depth in the pixmap formats.
|
|
If there are no matching pixmap formats (which shouldn't
|
|
be able to happen) return the visual depth instead. */
|
|
for (i = 0; i < pfvc; i++)
|
|
if (pfv[i].depth == m_visualDepth)
|
|
{
|
|
pixmap_depth = pfv[i].bits_per_pixel;
|
|
break;
|
|
}
|
|
|
|
if (pfv)
|
|
XFree(pfv);
|
|
|
|
return pixmap_depth;
|
|
}
|
|
|
|
XFE_DisplayFactory::XFE_DisplayFactory(Widget toplevel)
|
|
{
|
|
m_sharedCmap = NULL;
|
|
m_visual = NULL;
|
|
m_visualDepth = 0;
|
|
|
|
m_toplevel = toplevel;
|
|
|
|
m_display = XtDisplay(m_toplevel);
|
|
m_screen = XtScreen(m_toplevel);
|
|
|
|
{
|
|
String str = 0;
|
|
static XtResource res = { "installColormap", XtCString, XtRString,
|
|
sizeof (String), 0, XtRString, "guess" };
|
|
XtGetApplicationResources (m_toplevel, &str, &res, 1, 0, 0);
|
|
if (!str || !*str || !XP_STRCASECMP (str, "guess"))
|
|
#if 0
|
|
/* If the server is capable of installing multiple hardware colormaps
|
|
simultaniously, take one for ourself by default. Otherwise, don't. */
|
|
m_alwaysInstallCmap = (MaxCmapsOfScreen (m_screen) > 1);
|
|
#else
|
|
{
|
|
/* But everybody lies about this value. */
|
|
char *vendor = XServerVendor (m_display);
|
|
m_alwaysInstallCmap =
|
|
!strcmp (vendor, "Silicon Graphics");
|
|
}
|
|
#endif
|
|
else if (!XP_STRCASECMP (str, "yes") || !XP_STRCASECMP (str, "true"))
|
|
m_alwaysInstallCmap = True;
|
|
else if (!XP_STRCASECMP (str, "no") || !XP_STRCASECMP (str, "false"))
|
|
m_alwaysInstallCmap = False;
|
|
else
|
|
{
|
|
|
|
// XP_GetString ( XFE_DISPLAY_FACTORY_INSTALL_COLORMAP_ERROR )
|
|
|
|
// fprintf (stderr,
|
|
// "%s: installColormap: %s must be yes, no, or guess.\n",
|
|
// fe_progname, str);
|
|
|
|
fprintf(stderr,
|
|
XP_GetString(XFE_DISPLAY_FACTORY_INSTALL_COLORMAP_ERROR),
|
|
fe_progname,
|
|
str);
|
|
|
|
m_alwaysInstallCmap = False;
|
|
}
|
|
}
|
|
}
|
|
|
|
XFE_DisplayFactory::~XFE_DisplayFactory()
|
|
{
|
|
D( printf ("in XFE_DisplayFactory::~XFE_DisplayFactory()\n");)
|
|
|
|
D( printf ("leaving XFE_DisplayFactory::~XFE_DisplayFactory()\n");)
|
|
}
|
|
|
|
XFE_DisplayFactory *
|
|
XFE_DisplayFactory::theFactory()
|
|
{
|
|
XP_ASSERT(factoryRunning);
|
|
|
|
return factoryRunning;
|
|
}
|
|
|
|
void
|
|
XFE_DisplayFactory::colormapGoingAway(fe_colormap *colormap)
|
|
{
|
|
if (colormap == m_sharedCmap)
|
|
m_sharedCmap = NULL;
|
|
/* we don't free it here, as it's freed inside fe_DisposeColormap */
|
|
}
|
|
|
|
void
|
|
fe_startDisplayFactory(Widget toplevel)
|
|
{
|
|
if (factoryRunning == NULL)
|
|
factoryRunning = new XFE_DisplayFactory(toplevel);
|
|
}
|
|
|
|
void
|
|
fe_DisplayFactoryColormapGoingAway(fe_colormap *colormap)
|
|
{
|
|
XFE_DisplayFactory::theFactory()->colormapGoingAway(colormap);
|
|
}
|
|
|
|
fe_colormap *
|
|
fe_GetSharedColormap()
|
|
{
|
|
return XFE_DisplayFactory::theFactory()->getSharedColormap();
|
|
}
|