ROOT logo
// @(#)root/gui:$Id: TGResourcePool.cxx 23115 2008-04-10 13:35:37Z rdm $
// Author: Fons Rademakers   19/5/2003

/*************************************************************************
 * Copyright (C) 1995-2003, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/
/**************************************************************************

    This source is based on Xclass95, a Win95-looking GUI toolkit.
    Copyright (C) 1996, 1997 David Barth, Ricky Ralston, Hector Peraza.

    Xclass95 is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

**************************************************************************/


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGResourcePool                                                       //
//                                                                      //
// This class implements a pool for the default GUI resource set,       //
// like GC's, colors, fonts, etc..                                      //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "RConfigure.h"

#include "TGResourcePool.h"
#include "TGClient.h"
#include "TGWindow.h"
#include "TROOT.h"
#include "TSystem.h"
#include "TEnv.h"
#include "TVirtualX.h"
#include "TGGC.h"
#include "TGPicture.h"
#include "TGFont.h"
#include "TGMimeTypes.h"


const int gray_width  = 8;
const int gray_height = 8;
static unsigned char gray_bits[] = {
   0x55, 0xaa, 0x55, 0xaa,
   0x55, 0xaa, 0x55, 0xaa
};


ClassImp(TGResourcePool)

//______________________________________________________________________________
TGResourcePool::TGResourcePool(TGClient *client)
{
   // Create the global GUI resource pool manager.

   fClient = client;
   fDefaultColormap = gVirtualX->GetColormap();

   // Get GUI defaults from [system].rootrc
   char default_font[256];
   char menu_font[256];
   char menu_hi_font[256];
   char doc_fixed_font[256];
   char doc_prop_font[256];
   char icon_font[256];
   char status_font[256];
   char backcolor[256];
   char forecolor[256];
   char selbackcolor[256];
   char selforecolor[256];
   char docbackcolor[256];
   char docforecolor[256];
   char tipbackcolor[256];
   char tipforecolor[256];
   char framebgpixmap[2048], docbgpixmap[2048];
   char icon_path[2048], mime_file[256], line[2048];

   strcpy(default_font,   gEnv->GetValue("Gui.DefaultFont",  "-*-helvetica-medium-r-*-*-12-*-*-*-*-*-iso8859-1"));
   strcpy(menu_font,      gEnv->GetValue("Gui.MenuFont",     "-*-helvetica-medium-r-*-*-12-*-*-*-*-*-iso8859-1"));
   strcpy(menu_hi_font,   gEnv->GetValue("Gui.MenuHiFont",   "-*-helvetica-bold-r-*-*-12-*-*-*-*-*-iso8859-1"));
   strcpy(doc_fixed_font, gEnv->GetValue("Gui.DocFixedFont", "-*-courier-medium-r-*-*-12-*-*-*-*-*-iso8859-1"));
   strcpy(doc_prop_font,  gEnv->GetValue("Gui.DocPropFont",  "-*-helvetica-medium-r-*-*-12-*-*-*-*-*-iso8859-1"));
   strcpy(icon_font,      gEnv->GetValue("Gui.IconFont",     "-*-helvetica-medium-r-*-*-10-*-*-*-*-*-iso8859-1"));
   strcpy(status_font,    gEnv->GetValue("Gui.StatusFont",   "-*-helvetica-medium-r-*-*-10-*-*-*-*-*-iso8859-1"));
   strcpy(backcolor,      gEnv->GetValue("Gui.BackgroundColor",         "#c0c0c0"));
   strcpy(forecolor,      gEnv->GetValue("Gui.ForegroundColor",         "black"));
   strcpy(selbackcolor,   gEnv->GetValue("Gui.SelectBackgroundColor",   "#000080"));
   strcpy(selforecolor,   gEnv->GetValue("Gui.SelectForegroundColor",   "white"));
   strcpy(docbackcolor,   gEnv->GetValue("Gui.DocumentBackgroundColor", "white"));
   strcpy(docforecolor,   gEnv->GetValue("Gui.DocumentForegroundColor", "black"));
   strcpy(tipbackcolor,   gEnv->GetValue("Gui.TooltipBackgroundColor",  "LightYellow"));
   strcpy(tipforecolor,   gEnv->GetValue("Gui.TooltipForegroundColor",  "black"));
   strcpy(framebgpixmap,  gEnv->GetValue("Gui.FrameBackgroundPixmap", ""));
   strcpy(docbgpixmap,    gEnv->GetValue("Gui.DocumentBackgroundPixmap", ""));

#ifndef R__WIN32
#ifndef R__VMS
# ifdef ROOTICONPATH
   sprintf(icon_path, "%s/icons:%s:.:",
           gSystem->HomeDirectory(),
           ROOTICONPATH);
#  ifdef EXTRAICONPATH
   strcat(icon_path, gEnv->GetValue("Gui.IconPath", EXTRAICONPATH));
#  else
   strcat(icon_path, gEnv->GetValue("Gui.IconPath", ""));
#  endif
# else
   sprintf(icon_path, "%s/icons:%s/icons:.:", gSystem->HomeDirectory(),
                                              gSystem->Getenv("ROOTSYS"));
   strcat(icon_path, gEnv->GetValue("Gui.IconPath", ""));
# endif
   sprintf(line, "%s/.root.mimes", gSystem->HomeDirectory());
#else
   sprintf(line,"[%s.ICONS]",gSystem->Getenv("ROOTSYS"));
   strcpy(icon_path, gEnv->GetValue("Gui.IconPath",line));
   sprintf(line,"%sroot.mimes",gSystem->HomeDirectory());
#endif

   strcpy(mime_file, gEnv->GetValue("Gui.MimeTypeFile", line));
   char *mf = gSystem->ExpandPathName(mime_file);
   if (mf) {
      strcpy(mime_file, mf);
      delete [] mf;
   }
   if (gSystem->AccessPathName(mime_file, kReadPermission))
#ifdef R__VMS
      sprintf(mime_file,"[%s.ETC]root.mimes",gSystem->Getenv("ROOTSYS"));
#else
# ifdef ROOTETCDIR
      sprintf(mime_file, "%s/root.mimes", ROOTETCDIR);
# else
      sprintf(mime_file, "%s/etc/root.mimes", gSystem->Getenv("ROOTSYS"));
# endif
#endif
#else // R__WIN32
   sprintf(icon_path, "%s\\icons:.:\\", gSystem->Getenv("ROOTSYS"));
   strcat(icon_path, gEnv->GetValue("Gui.IconPath", ""));
   sprintf(line, "%s\\root.mimes", gSystem->HomeDirectory());
   strcpy(mime_file, gEnv->GetValue("Gui.MimeTypeFile", line));
   if (gSystem->AccessPathName(mime_file, kReadPermission))
      sprintf(mime_file, "%s\\etc\\root.mimes", gSystem->Getenv("ROOTSYS"));
#endif

   // Setup colors...
   fClient->GetColorByName("white", fWhite);  // white and black always exist
   fClient->GetColorByName("black", fBlack);
   if (!fClient->GetColorByName(backcolor, fBackColor))
      fBackColor = fWhite;
   if (!fClient->GetColorByName(forecolor, fForeColor))
      fForeColor = fBlack;
   fHilite = fClient->GetHilite(fBackColor);
   fShadow = fClient->GetShadow(fBackColor);
   if (!fClient->GetColorByName(selbackcolor, fSelBackColor))
      fSelBackColor = fBlack;
   if (!fClient->GetColorByName(selforecolor, fSelForeColor))
      fSelForeColor = fWhite;
   if (!fClient->GetColorByName(docbackcolor, fDocBackColor))
      fDocBackColor = fWhite;
   if (!fClient->GetColorByName(docforecolor, fDocForeColor))
      fDocForeColor = fBlack;
   if (!fClient->GetColorByName(tipbackcolor, fTipBackColor))
      fTipBackColor = fWhite;
   if (!fClient->GetColorByName(tipforecolor, fTipForeColor))
      fTipForeColor = fBlack;

   // Setup checkered pix/bit-maps...
   fCheckered = gVirtualX->CreatePixmap(fClient->GetDefaultRoot()->GetId(),
                                        (const char *)gray_bits,
                                        gray_width, gray_height,
                                        fBackColor, fWhite /*fHilite*/,
                                        gVirtualX->GetDepth());
   fCheckeredBitmap = gVirtualX->CreatePixmap(fClient->GetDefaultRoot()->GetId(),
                                              (const char *)gray_bits,
                                              gray_width, gray_height,
                                              1, 0, 1);

   // Create picture pool, GC pool, font pool, mime type list, etc.

   // Create picture pool and pre-load some pictures...
   fPicturePool = new TGPicturePool(fClient, icon_path);

   fDefaultBackPicture    = 0;
   fDefaultDocBackPicture = 0;
   if (strlen(framebgpixmap))
      fDefaultBackPicture = fPicturePool->GetPicture(framebgpixmap);
   if (strlen(docbgpixmap))
      fDefaultDocBackPicture = fPicturePool->GetPicture(docbgpixmap);

   // Create font pool and pre-load some fonts...
   fFontPool = new TGFontPool(fClient);
   fDefaultFont  = fFontPool->GetFont(default_font);
   fMenuFont     = fFontPool->GetFont(menu_font);
   fMenuHiFont   = fFontPool->GetFont(menu_hi_font);
   fDocFixedFont = fFontPool->GetFont(doc_fixed_font);
   fDocPropFont  = fFontPool->GetFont(doc_prop_font);
   fIconFont     = fFontPool->GetFont(icon_font);
   fStatusFont   = fFontPool->GetFont(status_font);

   // Create GC pool and pre-load some GCs...
   fGCPool = new TGGCPool(fClient);

   GCValues_t gval;
   gval.fMask = kGCForeground | kGCBackground | kGCFont |
                kGCFillStyle  | kGCGraphicsExposures;
   gval.fGraphicsExposures = kFALSE;
   gval.fFillStyle  = kFillSolid;
   gval.fFont       = fDefaultFont->GetFontHandle();
   gval.fBackground = fBackColor;
   gval.fForeground = fBlack;
   fBlackGC = fGCPool->GetGC(&gval, kTRUE);

   gval.fForeground = fWhite;
   fWhiteGC = fGCPool->GetGC(&gval, kTRUE);

   gval.fForeground = fHilite;
   fHiliteGC = fGCPool->GetGC(&gval, kTRUE);

   gval.fForeground = fShadow;
   fShadowGC = fGCPool->GetGC(&gval, kTRUE);

   gval.fForeground = fBackColor;
   fBckgndGC = fGCPool->GetGC(&gval, kTRUE);

   gval.fForeground = fForeColor;
   fFrameGC = fGCPool->GetGC(&gval, kTRUE);

   gval.fForeground = fSelBackColor;
   fSelbgndGC = fGCPool->GetGC(&gval, kTRUE);

   gval.fForeground = fSelForeColor;
   gval.fBackground = fSelBackColor;
   fSelGC = fGCPool->GetGC(&gval, kTRUE);

   gval.fFont       = fDocPropFont->GetFontHandle();
   gval.fForeground = fDocForeColor;
   gval.fBackground = fDocBackColor;
   fDocGC = fGCPool->GetGC(&gval, kTRUE);

   gval.fForeground = fDocBackColor;
   fDocbgndGC = fGCPool->GetGC(&gval, kTRUE);

   gval.fFont       = fStatusFont->GetFontHandle();
   gval.fForeground = fTipForeColor;
   gval.fBackground = fTipBackColor;
   fTipGC = fGCPool->GetGC(&gval, kTRUE);

   gval.fMask = kGCForeground | kGCBackground | kGCFillStyle |
                kGCLineWidth  | kGCSubwindowMode |
                kGCGraphicsExposures | kGCStipple;
   gval.fForeground = fBlack;
   gval.fBackground = fSelBackColor;
   gval.fLineWidth  = 0;
   gval.fFillStyle  = kFillStippled;
   gval.fSubwindowMode = kIncludeInferiors;
   gval.fGraphicsExposures = kFALSE;
   gval.fStipple = fCheckeredBitmap;
   fFocusGC = fGCPool->GetGC(&gval, kTRUE);

   // Setup cursors...
   fDefaultCursor = kNone;
   fGrabCursor    = gVirtualX->CreateCursor(kArrowRight);
   fTextCursor    = gVirtualX->CreateCursor(kCaret);
   fWaitCursor    = gVirtualX->CreateCursor(kWatch);

   // Read in mime type...
   fMimeTypeList  = new TGMimeTypes(fClient, mime_file);

   // Clipboard handle...
#ifndef R__WIN32
   fClipboardAtom = gVirtualX->InternAtom("_ROOT_CLIPBOARD", kFALSE);
#else
   fClipboardAtom = gVirtualX->InternAtom("CLIPBOARD", kFALSE);
#endif
}

//______________________________________________________________________________
TGResourcePool::~TGResourcePool()
{
   // Cleanup the resource pool...

   delete fPicturePool;
   delete fFontPool;
   delete fGCPool;
   delete fMimeTypeList;

   gVirtualX->DeletePixmap(fCheckered);
   gVirtualX->DeletePixmap(fCheckeredBitmap);
}
 TGResourcePool.cxx:1
 TGResourcePool.cxx:2
 TGResourcePool.cxx:3
 TGResourcePool.cxx:4
 TGResourcePool.cxx:5
 TGResourcePool.cxx:6
 TGResourcePool.cxx:7
 TGResourcePool.cxx:8
 TGResourcePool.cxx:9
 TGResourcePool.cxx:10
 TGResourcePool.cxx:11
 TGResourcePool.cxx:12
 TGResourcePool.cxx:13
 TGResourcePool.cxx:14
 TGResourcePool.cxx:15
 TGResourcePool.cxx:16
 TGResourcePool.cxx:17
 TGResourcePool.cxx:18
 TGResourcePool.cxx:19
 TGResourcePool.cxx:20
 TGResourcePool.cxx:21
 TGResourcePool.cxx:22
 TGResourcePool.cxx:23
 TGResourcePool.cxx:24
 TGResourcePool.cxx:25
 TGResourcePool.cxx:26
 TGResourcePool.cxx:27
 TGResourcePool.cxx:28
 TGResourcePool.cxx:29
 TGResourcePool.cxx:30
 TGResourcePool.cxx:31
 TGResourcePool.cxx:32
 TGResourcePool.cxx:33
 TGResourcePool.cxx:34
 TGResourcePool.cxx:35
 TGResourcePool.cxx:36
 TGResourcePool.cxx:37
 TGResourcePool.cxx:38
 TGResourcePool.cxx:39
 TGResourcePool.cxx:40
 TGResourcePool.cxx:41
 TGResourcePool.cxx:42
 TGResourcePool.cxx:43
 TGResourcePool.cxx:44
 TGResourcePool.cxx:45
 TGResourcePool.cxx:46
 TGResourcePool.cxx:47
 TGResourcePool.cxx:48
 TGResourcePool.cxx:49
 TGResourcePool.cxx:50
 TGResourcePool.cxx:51
 TGResourcePool.cxx:52
 TGResourcePool.cxx:53
 TGResourcePool.cxx:54
 TGResourcePool.cxx:55
 TGResourcePool.cxx:56
 TGResourcePool.cxx:57
 TGResourcePool.cxx:58
 TGResourcePool.cxx:59
 TGResourcePool.cxx:60
 TGResourcePool.cxx:61
 TGResourcePool.cxx:62
 TGResourcePool.cxx:63
 TGResourcePool.cxx:64
 TGResourcePool.cxx:65
 TGResourcePool.cxx:66
 TGResourcePool.cxx:67
 TGResourcePool.cxx:68
 TGResourcePool.cxx:69
 TGResourcePool.cxx:70
 TGResourcePool.cxx:71
 TGResourcePool.cxx:72
 TGResourcePool.cxx:73
 TGResourcePool.cxx:74
 TGResourcePool.cxx:75
 TGResourcePool.cxx:76
 TGResourcePool.cxx:77
 TGResourcePool.cxx:78
 TGResourcePool.cxx:79
 TGResourcePool.cxx:80
 TGResourcePool.cxx:81
 TGResourcePool.cxx:82
 TGResourcePool.cxx:83
 TGResourcePool.cxx:84
 TGResourcePool.cxx:85
 TGResourcePool.cxx:86
 TGResourcePool.cxx:87
 TGResourcePool.cxx:88
 TGResourcePool.cxx:89
 TGResourcePool.cxx:90
 TGResourcePool.cxx:91
 TGResourcePool.cxx:92
 TGResourcePool.cxx:93
 TGResourcePool.cxx:94
 TGResourcePool.cxx:95
 TGResourcePool.cxx:96
 TGResourcePool.cxx:97
 TGResourcePool.cxx:98
 TGResourcePool.cxx:99
 TGResourcePool.cxx:100
 TGResourcePool.cxx:101
 TGResourcePool.cxx:102
 TGResourcePool.cxx:103
 TGResourcePool.cxx:104
 TGResourcePool.cxx:105
 TGResourcePool.cxx:106
 TGResourcePool.cxx:107
 TGResourcePool.cxx:108
 TGResourcePool.cxx:109
 TGResourcePool.cxx:110
 TGResourcePool.cxx:111
 TGResourcePool.cxx:112
 TGResourcePool.cxx:113
 TGResourcePool.cxx:114
 TGResourcePool.cxx:115
 TGResourcePool.cxx:116
 TGResourcePool.cxx:117
 TGResourcePool.cxx:118
 TGResourcePool.cxx:119
 TGResourcePool.cxx:120
 TGResourcePool.cxx:121
 TGResourcePool.cxx:122
 TGResourcePool.cxx:123
 TGResourcePool.cxx:124
 TGResourcePool.cxx:125
 TGResourcePool.cxx:126
 TGResourcePool.cxx:127
 TGResourcePool.cxx:128
 TGResourcePool.cxx:129
 TGResourcePool.cxx:130
 TGResourcePool.cxx:131
 TGResourcePool.cxx:132
 TGResourcePool.cxx:133
 TGResourcePool.cxx:134
 TGResourcePool.cxx:135
 TGResourcePool.cxx:136
 TGResourcePool.cxx:137
 TGResourcePool.cxx:138
 TGResourcePool.cxx:139
 TGResourcePool.cxx:140
 TGResourcePool.cxx:141
 TGResourcePool.cxx:142
 TGResourcePool.cxx:143
 TGResourcePool.cxx:144
 TGResourcePool.cxx:145
 TGResourcePool.cxx:146
 TGResourcePool.cxx:147
 TGResourcePool.cxx:148
 TGResourcePool.cxx:149
 TGResourcePool.cxx:150
 TGResourcePool.cxx:151
 TGResourcePool.cxx:152
 TGResourcePool.cxx:153
 TGResourcePool.cxx:154
 TGResourcePool.cxx:155
 TGResourcePool.cxx:156
 TGResourcePool.cxx:157
 TGResourcePool.cxx:158
 TGResourcePool.cxx:159
 TGResourcePool.cxx:160
 TGResourcePool.cxx:161
 TGResourcePool.cxx:162
 TGResourcePool.cxx:163
 TGResourcePool.cxx:164
 TGResourcePool.cxx:165
 TGResourcePool.cxx:166
 TGResourcePool.cxx:167
 TGResourcePool.cxx:168
 TGResourcePool.cxx:169
 TGResourcePool.cxx:170
 TGResourcePool.cxx:171
 TGResourcePool.cxx:172
 TGResourcePool.cxx:173
 TGResourcePool.cxx:174
 TGResourcePool.cxx:175
 TGResourcePool.cxx:176
 TGResourcePool.cxx:177
 TGResourcePool.cxx:178
 TGResourcePool.cxx:179
 TGResourcePool.cxx:180
 TGResourcePool.cxx:181
 TGResourcePool.cxx:182
 TGResourcePool.cxx:183
 TGResourcePool.cxx:184
 TGResourcePool.cxx:185
 TGResourcePool.cxx:186
 TGResourcePool.cxx:187
 TGResourcePool.cxx:188
 TGResourcePool.cxx:189
 TGResourcePool.cxx:190
 TGResourcePool.cxx:191
 TGResourcePool.cxx:192
 TGResourcePool.cxx:193
 TGResourcePool.cxx:194
 TGResourcePool.cxx:195
 TGResourcePool.cxx:196
 TGResourcePool.cxx:197
 TGResourcePool.cxx:198
 TGResourcePool.cxx:199
 TGResourcePool.cxx:200
 TGResourcePool.cxx:201
 TGResourcePool.cxx:202
 TGResourcePool.cxx:203
 TGResourcePool.cxx:204
 TGResourcePool.cxx:205
 TGResourcePool.cxx:206
 TGResourcePool.cxx:207
 TGResourcePool.cxx:208
 TGResourcePool.cxx:209
 TGResourcePool.cxx:210
 TGResourcePool.cxx:211
 TGResourcePool.cxx:212
 TGResourcePool.cxx:213
 TGResourcePool.cxx:214
 TGResourcePool.cxx:215
 TGResourcePool.cxx:216
 TGResourcePool.cxx:217
 TGResourcePool.cxx:218
 TGResourcePool.cxx:219
 TGResourcePool.cxx:220
 TGResourcePool.cxx:221
 TGResourcePool.cxx:222
 TGResourcePool.cxx:223
 TGResourcePool.cxx:224
 TGResourcePool.cxx:225
 TGResourcePool.cxx:226
 TGResourcePool.cxx:227
 TGResourcePool.cxx:228
 TGResourcePool.cxx:229
 TGResourcePool.cxx:230
 TGResourcePool.cxx:231
 TGResourcePool.cxx:232
 TGResourcePool.cxx:233
 TGResourcePool.cxx:234
 TGResourcePool.cxx:235
 TGResourcePool.cxx:236
 TGResourcePool.cxx:237
 TGResourcePool.cxx:238
 TGResourcePool.cxx:239
 TGResourcePool.cxx:240
 TGResourcePool.cxx:241
 TGResourcePool.cxx:242
 TGResourcePool.cxx:243
 TGResourcePool.cxx:244
 TGResourcePool.cxx:245
 TGResourcePool.cxx:246
 TGResourcePool.cxx:247
 TGResourcePool.cxx:248
 TGResourcePool.cxx:249
 TGResourcePool.cxx:250
 TGResourcePool.cxx:251
 TGResourcePool.cxx:252
 TGResourcePool.cxx:253
 TGResourcePool.cxx:254
 TGResourcePool.cxx:255
 TGResourcePool.cxx:256
 TGResourcePool.cxx:257
 TGResourcePool.cxx:258
 TGResourcePool.cxx:259
 TGResourcePool.cxx:260
 TGResourcePool.cxx:261
 TGResourcePool.cxx:262
 TGResourcePool.cxx:263
 TGResourcePool.cxx:264
 TGResourcePool.cxx:265
 TGResourcePool.cxx:266
 TGResourcePool.cxx:267
 TGResourcePool.cxx:268
 TGResourcePool.cxx:269
 TGResourcePool.cxx:270
 TGResourcePool.cxx:271
 TGResourcePool.cxx:272
 TGResourcePool.cxx:273
 TGResourcePool.cxx:274
 TGResourcePool.cxx:275
 TGResourcePool.cxx:276
 TGResourcePool.cxx:277
 TGResourcePool.cxx:278
 TGResourcePool.cxx:279
 TGResourcePool.cxx:280
 TGResourcePool.cxx:281
 TGResourcePool.cxx:282
 TGResourcePool.cxx:283
 TGResourcePool.cxx:284
 TGResourcePool.cxx:285
 TGResourcePool.cxx:286
 TGResourcePool.cxx:287
 TGResourcePool.cxx:288
 TGResourcePool.cxx:289
 TGResourcePool.cxx:290
 TGResourcePool.cxx:291
 TGResourcePool.cxx:292
 TGResourcePool.cxx:293
 TGResourcePool.cxx:294
 TGResourcePool.cxx:295