/***************************************************************************** # Copyright (C) 1994-2008 by David Gordon. # All rights reserved. # # This software is part of a beta-test version of the Consed/Autofinish # package. It should not be redistributed or # used for any commercial purpose, including commercially funded # sequencing, without written permission from the author and the # University of Washington. # # This software is provided ``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 authors or the University of Washington 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. # # Building Consed from source is error prone and not simple which is # why I provide executables. Due to time limitations I cannot # provide any assistance in building Consed. Even if you do not # modify the source, you may introduce errors due to using a # different version of the compiler, a different version of motif, # different versions of other libraries than I used, etc. For this # reason, if you discover Consed bugs, I can only offer help with # those bugs if you first reproduce those bugs with an executable # provided by me--not an executable you have built. # # Modifying Consed is also difficult. Although Consed is modular, # some modules are used by many other modules. Thus making a change # in one place can have unforeseen effects on many other features. # It may takes months for you to notice these other side-effects # which may not seen connected at all. It is not feasable for me to # provide help with modifying Consed sources because of the # potentially huge amount of time involved. # #*****************************************************************************/ // // guitextcolor.cpp // // implementation for GuiColorText object // #include "assert.h" #include "guicolortext.h" #include "guiapp.h" //////////////////////////////////////////////////////////// // // PURPOSE: to allow consed to use an object that hides all of // the X-specific graphics context information // // HOW TO USE IT: it is perfectly OK for the constructor to // have X-specific info. Then this info is hidden in // its private data, and used by the gui side. // //////////////////////////////////////////////////////////// GuiColorText::GuiColorText(const char* szForegroundColor, const char* szBackgroundColor) : pFont_(NULL), soForegroundColor_(szForegroundColor), soBackgroundColor_(szBackgroundColor), bInitFinished_ (false), ulMaskAdditional_(0) // no need to initialize xgcvaluesAdditional_ // since the ulMaskAdditional_ is 0 {} GuiColorText::GuiColorText(XFontStruct* pFont, const char* szForegroundColor, const char* szBackgroundColor, const XGCValues xgcvaluesAdditional, const unsigned long ulMaskAdditional ) : pFont_(pFont), soForegroundColor_(szForegroundColor), soBackgroundColor_(szBackgroundColor), bInitFinished_ (false), xgcvaluesAdditional_(xgcvaluesAdditional), ulMaskAdditional_(ulMaskAdditional) {} GuiColorText::GuiColorText() {} void GuiColorText::finishInit() { if (bInitFinished_) return; int nStatus; int nMask; XColor xcolor, xcolorHardware; Widget widDrawWindow; Display* pDisplay; Window win; int nScreen; Colormap colormap; XColor xcForeground; XColor xcBackground; // these get saved for future messing with the gc pDisplay = XtDisplay( GuiApp::pGetGuiApp()->widGetTopLevel() ); win = XtWindow( GuiApp::pGetGuiApp()->widGetTopLevel() ); nScreen = DefaultScreen(pDisplay); colormap = GuiApp::pGetGuiApp()->cmapGetColorMap(); nStatus = XAllocNamedColor(pDisplay, colormap, soForegroundColor_, &xcolor, &xcolorHardware); if (nStatus != 1 ) { ostringstream ost; ost << "Could not allocate colormap entry for color \"" << soForegroundColor_ << "\"." << "This may be due to a spelling error in your color name. Or this may be because some other application is a hog. " << "If it is netscape, run netscape via netscape -install" << ends; SysRequestFailed srf(ost.str().c_str()); throw srf; // throw exception } xcForeground = xcolor; xgcvaluesAdditional_.foreground = xcolorHardware.pixel; nStatus = XAllocNamedColor(pDisplay, colormap, soBackgroundColor_, &xcolor, &xcolorHardware); if (nStatus != 1 ) { ostringstream ost; ost << "Could not allocate colormap entry for color \"" << soBackgroundColor_ << "\"." << "This may be due to a spelling error in your color name. Or this may be because some other application is a pig. " << "If it is netscape, run netscape via netscape -install" << ends; SysRequestFailed srf(ost.str().c_str()); throw srf; // throw exception } xcBackground = xcolor; xgcvaluesAdditional_.background = xcolorHardware.pixel; if (pFont_ == NULL) pFont_ = GuiApp::pGetGuiApp()->pXfsGetDrawFont(); xgcvaluesAdditional_.font = pFont_->fid; nMask = GCFont | GCForeground | GCBackground | ulMaskAdditional_ ; gcNormal_ = XCreateGC(pDisplay, win, nMask, &xgcvaluesAdditional_); // now swap colors xgcvaluesAdditional_.background = xgcvaluesAdditional_.foreground; xgcvaluesAdditional_.foreground = xcolorHardware.pixel; gcReverse_ = XCreateGC(pDisplay, win, nMask, &xgcvaluesAdditional_); // set the init complete flag bInitFinished_ = true; } void GuiColorText :: changeLineWidth( const int nThickness ) { finishInit(); XGCValues xgcvalues; xgcvalues.line_width = nThickness; XChangeGC( XtDisplay( GuiApp::pGetGuiApp()->widGetTopLevel() ), gcNormal_, GCLineWidth, &xgcvalues ); }