]> git.lyx.org Git - lyx.git/blobdiff - src/ColorHandler.C
fix typo that put too many include paths for most people
[lyx.git] / src / ColorHandler.C
index 5b2571fbdd1b6f6ace0565a06c429dc5ba5c2c63..6a1f333ab4ecbf6cac6f4985d3234ac7e7ff1b7b 100644 (file)
@@ -1,10 +1,9 @@
-// -*- C++ -*-
 /* This file is part of
  * ======================================================
- * 
+ *
  *           LyX, The Document Processor
- *      
- *         Copyright 1998-2000 The LyX Team
+ *
+ *         Copyright 1998-2001 The LyX Team
  *
  *======================================================*/
 
 #pragma implementation
 #endif
 
-#include <cmath>
-
-#include FORMS_H_LOCATION
-#include "debug.h"
-
 #include "ColorHandler.h"
+#include "LColor.h"
 #include "gettext.h"
+#include "debug.h"
+
+#include "frontends/GUIRunTime.h"
+
+#include <cmath>
 
 using std::endl;
 
-LyXColorHandler::LyXColorHandler() 
+
+LyXColorHandler::LyXColorHandler()
 {
-       display = fl_display;
-       drawable = XCreatePixmap(display, fl_root, 10, 10,
-                                fl_get_visual_depth());
-       
-       colormap = fl_state[fl_get_vclass()].colormap;
+       display = GUIRunTime::x11Display();
+       drawable = XCreatePixmap(display,
+                                RootWindow(display, GUIRunTime::x11Screen()),
+                                10, 10,
+                                GUIRunTime::x11VisualDepth());
+
+       colormap = GUIRunTime::x11Colormap();
        // Clear the GC cache
        for (int i = 0; i <= LColor::ignore; ++i) {
                colorGCcache[i] = 0;
@@ -49,7 +52,7 @@ LyXColorHandler::~LyXColorHandler()
        // Iterate over the line cache and Free the GCs
        for (LineGCCache::iterator lit = lineGCcache.begin();
             lit != lineGCcache.end(); ++lit) {
-               XFreeGC(display, (*lit).second);
+               XFreeGC(display, lit->second);
        }
 }
 
@@ -69,27 +72,29 @@ GC LyXColorHandler::getGCForeground(LColor::color c)
        //if (lyxerr.debugging()) {
        //      lyxerr << "Painter drawable: " << drawable() << endl;
        //}
-       
-       if (colorGCcache[c] != 0) return colorGCcache[c];
 
-       XColor xcol, ccol;
-       string s = lcolor.getX11Name(c);
+       if (colorGCcache[c] != 0)
+               return colorGCcache[c];
+
+       XColor xcol;
+       XColor ccol;
+       string const s = lcolor.getX11Name(c);
        XGCValues val;
 
        // Look up the RGB values for the color, and an approximate
        // color that we can hope to get on this display.
-        if (XLookupColor(display, colormap, s.c_str(), &xcol, &ccol) == 0) {
+       if (XLookupColor(display, colormap, s.c_str(), &xcol, &ccol) == 0) {
                lyxerr << _("LyX: Unknown X11 color ") << s
                       << _(" for ") << lcolor.getGUIName(c) << '\n'
-                      << _("     Using black instead, sorry!.") << endl;
+                      << _("     Using black instead, sorry!") << endl;
                unsigned long bla = BlackPixel(display,
                                               DefaultScreen(display));
                val.foreground = bla;
        // Try the exact RGB values first, then the approximate.
        } else if (XAllocColor(display, colormap, &xcol) != 0) {
-               if (lyxerr.debugging()) {
+               if (lyxerr.debugging(Debug::GUI)) {
                        lyxerr << _("LyX: X11 color ") << s
-                              << _(" allocated for ") 
+                              << _(" allocated for ")
                               << lcolor.getGUIName(c) << endl;
                }
                val.foreground = xcol.pixel;
@@ -103,25 +108,25 @@ GC LyXColorHandler::getGCForeground(LColor::color c)
                // the color closest to the one we want.
                Visual * vi = DefaultVisual(display, DefaultScreen(display));
 
-               XColor * cmap = new XColor[vi->map_entries];
+               boost::scoped_array<XColor> cmap(new XColor[vi->map_entries]);
 
-               for(int i = 0; i < vi->map_entries; ++i) {
+               for (int i = 0; i < vi->map_entries; ++i) {
                        cmap[i].pixel = i;
                }
-               XQueryColors(display, colormap, cmap, vi->map_entries);
+               XQueryColors(display, colormap, cmap.get(), vi->map_entries);
 
                // Walk through the cmap and look for close colors.
                int closest_pixel = 0;
                double closest_distance = 1e20; // we want to minimize this
                double distance = 0;
-               for(int t = 0; t < vi->map_entries; ++t) {
-                       // The Euclidean distance between two points in 
+               for (int t = 0; t < vi->map_entries; ++t) {
+                       // The Euclidean distance between two points in
                        // a three-dimensional space, the RGB color-cube,
                        // is used as the distance measurement between two
                        // colors.
 
                        // Since square-root is monotonous, we don't have to
-                       // take the square-root to find the minimum, and thus 
+                       // take the square-root to find the minimum, and thus
                        // we use the squared distance instead to be faster.
 
                        // If we want to get fancy, we could convert the RGB
@@ -135,20 +140,19 @@ GC LyXColorHandler::getGCForeground(LColor::color c)
                                closest_pixel = t;
                        }
                }
-               lyxerr << _("LyX: Couldn't allocate '") << s 
+               lyxerr << _("LyX: Couldn't allocate '") << s
                       << _("' for ") << lcolor.getGUIName(c)
-                      << _(" with (r,g,b)=(") 
+                      << _(" with (r,g,b)=(")
                       << xcol.red << "," << xcol.green << ","
                       << xcol.blue << ").\n"
                       << _("     Using closest allocated "
-                           "color with (r,g,b)=(") 
+                           "color with (r,g,b)=(")
                       << cmap[closest_pixel].red << ","
                       << cmap[closest_pixel].green << ","
                       << cmap[closest_pixel].blue << _(") instead.\n")
-                      << _("Pixel [") << closest_pixel << _("] is used.") 
+                      << _("Pixel [") << closest_pixel << _("] is used.")
                       << endl;
                val.foreground = cmap[closest_pixel].pixel;
-               delete[] cmap;
        }
 
        val.function = GXcopy;
@@ -159,29 +163,40 @@ GC LyXColorHandler::getGCForeground(LColor::color c)
 
 // Gets GC for line
 GC LyXColorHandler::getGCLinepars(PainterBase::line_style ls,
-                         PainterBase::line_width lw, LColor::color c)
+                                 PainterBase::line_width lw, LColor::color c)
 {
        //if (lyxerr.debugging()) {
        //      lyxerr << "Painter drawable: " << drawable() << endl;
        //}
-       
-       int index = lw + (ls << 1) + (c << 3);
 
-       if (lineGCcache.find(index) != lineGCcache.end())
-               return lineGCcache[index];
+       int index = lw + (ls << 1) + (c << 6);
+
+       LineGCCache::iterator it = lineGCcache.find(index);
+       if (it != lineGCcache.end())
+               return it->second;
 
        XGCValues val;
        XGetGCValues(display, getGCForeground(c), GCForeground, &val);
-       
+
        switch (lw) {
-       case PainterBase::line_thin:    val.line_width = 0; break;
-       case PainterBase::line_thick:   val.line_width = 2; break;
+       case PainterBase::line_thin:
+               val.line_width = 0;
+               break;
+       case PainterBase::line_thick:
+               val.line_width = 2;
+               break;
        }
-       
+
        switch (ls) {
-       case PainterBase::line_solid:   val.line_style = LineSolid; break;
-       case PainterBase::line_onoffdash:       val.line_style = LineOnOffDash; break;
-       case PainterBase::line_doubledash:      val.line_style = LineDoubleDash; break;
+       case PainterBase::line_solid:
+               val.line_style = LineSolid;
+               break;
+       case PainterBase::line_onoffdash:
+               val.line_style = LineOnOffDash;
+               break;
+       case PainterBase::line_doubledash:
+               val.line_style = LineDoubleDash;
+               break;
        }
 
 
@@ -190,10 +205,39 @@ GC LyXColorHandler::getGCLinepars(PainterBase::line_style ls,
        val.function = GXcopy;
 
        return lineGCcache[index] =
-               XCreateGC(display, drawable, 
-                         GCForeground | GCLineStyle | GCLineWidth | 
+               XCreateGC(display, drawable,
+                         GCForeground | GCLineStyle | GCLineWidth |
                          GCCapStyle | GCJoinStyle | GCFunction, &val);
 }
 
+
+// update GC cache after color redefinition
+void LyXColorHandler::updateColor (LColor::color c)
+{
+       // color GC cache
+       GC gc = colorGCcache[c];
+       if (gc != 0) {
+               XFreeGC(display, gc);
+               colorGCcache[c] = NULL;
+               getGCForeground(c);
+       }
+
+       // line GC cache
+
+       for (int ls = 0; ls < 3; ++ls)
+               for (int lw = 0; lw < 2; ++lw) {
+                       int const index = lw + (ls << 1) + (c << 6);
+                       LineGCCache::iterator it = lineGCcache.find(index);
+                       if (it != lineGCcache.end()) {
+                               gc = it->second;
+                               XFreeGC(display, gc);
+                               lineGCcache.erase(it);
+                               getGCLinepars(PainterBase::line_style(ls),
+                                             PainterBase::line_width(lw), c);
+                       }
+               }
+
+}
+
 //
-LyXColorHandler * lyxColorHandler;
+boost::scoped_ptr<LyXColorHandler> lyxColorHandler;