home *** CD-ROM | disk | FTP | other *** search
- /* -*- 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.0 (the "NPL"); you may not use this file except in
- * compliance with the NPL. You may obtain a copy of the NPL at
- * http://www.mozilla.org/NPL/
- *
- * Software distributed under the NPL is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
- * for the specific language governing rights and limitations under the
- * NPL.
- *
- * The Initial Developer of this code under the NPL is Netscape
- * Communications Corporation. Portions created by Netscape are
- * Copyright (C) 1998 Netscape Communications Corporation. All Rights
- * Reserved.
- */
- /*
- 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();
- }
-