ROOT logo
// @(#)root/gui:$Id: TGApplication.cxx 23115 2008-04-10 13:35:37Z rdm $
// Author: Guy Barrand   30/05/2001

/*************************************************************************
 * Copyright (C) 2001, Guy Barrand.                                      *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGApplication                                                        //
//                                                                      //
// This class initialize the ROOT GUI toolkit.                          //
// This class must be instantiated exactly once in any given            //
// application.                                                         //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "RConfigure.h"

#include "TGApplication.h"
#include "TROOT.h"
#include "TSystem.h"
#include "TGClient.h"
#include "TPluginManager.h"
#include "TError.h"
#include "TEnv.h"
#include "TVirtualX.h"
#include "TStyle.h"
#include "TInterpreter.h"
#include "TColor.h"

ClassImp(TGApplication)

//_____________________________________________________________________________
TGApplication::TGApplication(const char *appClassName,
                             int *argc, char **argv, void*, int)
   : TApplication(), fDisplay(0), fClient(0)
{
   // Create a GUI application environment. Use this class if you only
   // want to use the ROOT GUI and no other services. In all other cases
   // use either TApplication or TRint.

   if (gApplication) {
      Error("TGApplication", "only one instance of TGApplication allowed");
      return;
   }

   if (!gROOT)
      ::Fatal("TGApplication::TGApplication", "ROOT system not initialized");

   if (!gSystem)
      ::Fatal("TGApplication::TGApplication", "gSystem not initialized");

   gApplication = this;
   gROOT->SetApplication(this);
   gROOT->SetName(appClassName);

   GetOptions(argc, argv);
   if (argv && argv[0])
      gSystem->SetProgname(argv[0]);

   // Tell TSystem the TApplication has been created
   gSystem->NotifyApplicationCreated();

   // Enable autoloading
   gInterpreter->EnableAutoLoading();

   LoadGraphicsLibs();

   if (!fDisplay) gSystem->SetDisplay();
   fClient = new TGClient(fDisplay);

   if (fClient->IsZombie()) {
      Error("TGApplication", "cannot switch to batch mode, exiting...");
      gSystem->Exit(1);
   }

   // a GUI application is never run in batch mode
   gROOT->SetBatch(kFALSE);

   if (strcmp(appClassName, "proofserv")) {
      const char *ttpath = gEnv->GetValue("Root.TTFontPath",
#ifdef TTFFONTDIR
                                          TTFFONTDIR);
#else
                                          "$(ROOTSYS)/fonts");
#endif

      char *ttfont = gSystem->Which(ttpath, "arialbd.ttf", kReadPermission);
      // Added by cholm for use of DFSG - fonts - based on fix by Kevin
      if (!ttfont)
         ttfont = gSystem->Which(ttpath, "FreeSansBold.ttf", kReadPermission);
      if (ttfont && gEnv->GetValue("Root.UseTTFonts", 1)) {
         TPluginHandler *h;
         if ((h = gROOT->GetPluginManager()->FindHandler("TVirtualX", "x11ttf")))
            h->LoadPlugin();
      }

      delete [] ttfont;
   }

   // Create the canvas colors early so they are allocated before
   // any color table expensive bitmaps get allocated in GUI routines (like
   // creation of XPM bitmaps).
   TColor::InitializeColors();

   // Set default screen factor (if not disabled in rc file)
   if (gEnv->GetValue("Canvas.UseScreenFactor", 1)) {
      Int_t  x, y;
      UInt_t w, h;
      if (gVirtualX) {
         gVirtualX->GetGeometry(-1, x, y, w, h);
         if (h > 0 && h < 1000) gStyle->SetScreenFactor(0.0011*h);
      }
   }

   // Make sure all registered dictionaries have been initialized
   // and that all types have been loaded
   gInterpreter->InitializeDictionaries();
   gInterpreter->UpdateListOfTypes();

   // Save current interpreter context
   gInterpreter->SaveContext();
   gInterpreter->SaveGlobalsContext();

   // to allow user to interact with TCanvas's under WIN32
   gROOT->SetLineHasBeenProcessed();
}

//_____________________________________________________________________________
TGApplication::~TGApplication()
{
   // TGApplication dtor.

   delete fDisplay;
   delete fClient;
}

//_____________________________________________________________________________
void TGApplication::LoadGraphicsLibs()
{
   // Load shared libs necessary for GUI.

   TString name;
   TString title1 = "ROOT interface to ";
   TString nativex, title;
#ifndef R__WIN32
   nativex = "x11";
   name    = "X11";
   title   = title1 + "X11";
#else
   nativex = "win32gdk";
   name    = "Win32gdk";
   title   = title1 + "Win32gdk";
#endif

   TString guiBackend(gEnv->GetValue("Gui.Backend", "native"));
   guiBackend.ToLower();
   if (guiBackend == "native") {
      guiBackend = nativex;
   } else {
      name   = guiBackend;
      title  = title1 + guiBackend;
   }

   TPluginHandler *h;
   if ((h = gROOT->GetPluginManager()->FindHandler("TVirtualX", guiBackend))) {
      if (h->LoadPlugin() == -1)
         return;
      gVirtualX = (TVirtualX *) h->ExecPlugin(2, name.Data(), title.Data());
   }
}

//______________________________________________________________________________
void TGApplication::GetOptions(Int_t *argc, char **argv)
{
   // Handle command line arguments. Arguments handled are removed from the
   // argument array. Currently only option "-display xserver" is considered.

   if (!argc) return;

   int i, j;
   for (i = 0; i < *argc; i++) {
      if (!strcmp(argv[i], "-display")) {
         if (argv[i+1] && strlen(argv[i+1]) && argv[i+1][0] != '-') {
            fDisplay = StrDup(argv[i+1]);
            argv[i]   = 0;
            argv[i+1] = 0;
            i++;
         }
      }
   }

   j = 0;
   for (i = 0; i < *argc; i++) {
      if (argv[i]) {
         argv[j] = argv[i];
         j++;
      }
   }

   *argc = j;
}

 TGApplication.cxx:1
 TGApplication.cxx:2
 TGApplication.cxx:3
 TGApplication.cxx:4
 TGApplication.cxx:5
 TGApplication.cxx:6
 TGApplication.cxx:7
 TGApplication.cxx:8
 TGApplication.cxx:9
 TGApplication.cxx:10
 TGApplication.cxx:11
 TGApplication.cxx:12
 TGApplication.cxx:13
 TGApplication.cxx:14
 TGApplication.cxx:15
 TGApplication.cxx:16
 TGApplication.cxx:17
 TGApplication.cxx:18
 TGApplication.cxx:19
 TGApplication.cxx:20
 TGApplication.cxx:21
 TGApplication.cxx:22
 TGApplication.cxx:23
 TGApplication.cxx:24
 TGApplication.cxx:25
 TGApplication.cxx:26
 TGApplication.cxx:27
 TGApplication.cxx:28
 TGApplication.cxx:29
 TGApplication.cxx:30
 TGApplication.cxx:31
 TGApplication.cxx:32
 TGApplication.cxx:33
 TGApplication.cxx:34
 TGApplication.cxx:35
 TGApplication.cxx:36
 TGApplication.cxx:37
 TGApplication.cxx:38
 TGApplication.cxx:39
 TGApplication.cxx:40
 TGApplication.cxx:41
 TGApplication.cxx:42
 TGApplication.cxx:43
 TGApplication.cxx:44
 TGApplication.cxx:45
 TGApplication.cxx:46
 TGApplication.cxx:47
 TGApplication.cxx:48
 TGApplication.cxx:49
 TGApplication.cxx:50
 TGApplication.cxx:51
 TGApplication.cxx:52
 TGApplication.cxx:53
 TGApplication.cxx:54
 TGApplication.cxx:55
 TGApplication.cxx:56
 TGApplication.cxx:57
 TGApplication.cxx:58
 TGApplication.cxx:59
 TGApplication.cxx:60
 TGApplication.cxx:61
 TGApplication.cxx:62
 TGApplication.cxx:63
 TGApplication.cxx:64
 TGApplication.cxx:65
 TGApplication.cxx:66
 TGApplication.cxx:67
 TGApplication.cxx:68
 TGApplication.cxx:69
 TGApplication.cxx:70
 TGApplication.cxx:71
 TGApplication.cxx:72
 TGApplication.cxx:73
 TGApplication.cxx:74
 TGApplication.cxx:75
 TGApplication.cxx:76
 TGApplication.cxx:77
 TGApplication.cxx:78
 TGApplication.cxx:79
 TGApplication.cxx:80
 TGApplication.cxx:81
 TGApplication.cxx:82
 TGApplication.cxx:83
 TGApplication.cxx:84
 TGApplication.cxx:85
 TGApplication.cxx:86
 TGApplication.cxx:87
 TGApplication.cxx:88
 TGApplication.cxx:89
 TGApplication.cxx:90
 TGApplication.cxx:91
 TGApplication.cxx:92
 TGApplication.cxx:93
 TGApplication.cxx:94
 TGApplication.cxx:95
 TGApplication.cxx:96
 TGApplication.cxx:97
 TGApplication.cxx:98
 TGApplication.cxx:99
 TGApplication.cxx:100
 TGApplication.cxx:101
 TGApplication.cxx:102
 TGApplication.cxx:103
 TGApplication.cxx:104
 TGApplication.cxx:105
 TGApplication.cxx:106
 TGApplication.cxx:107
 TGApplication.cxx:108
 TGApplication.cxx:109
 TGApplication.cxx:110
 TGApplication.cxx:111
 TGApplication.cxx:112
 TGApplication.cxx:113
 TGApplication.cxx:114
 TGApplication.cxx:115
 TGApplication.cxx:116
 TGApplication.cxx:117
 TGApplication.cxx:118
 TGApplication.cxx:119
 TGApplication.cxx:120
 TGApplication.cxx:121
 TGApplication.cxx:122
 TGApplication.cxx:123
 TGApplication.cxx:124
 TGApplication.cxx:125
 TGApplication.cxx:126
 TGApplication.cxx:127
 TGApplication.cxx:128
 TGApplication.cxx:129
 TGApplication.cxx:130
 TGApplication.cxx:131
 TGApplication.cxx:132
 TGApplication.cxx:133
 TGApplication.cxx:134
 TGApplication.cxx:135
 TGApplication.cxx:136
 TGApplication.cxx:137
 TGApplication.cxx:138
 TGApplication.cxx:139
 TGApplication.cxx:140
 TGApplication.cxx:141
 TGApplication.cxx:142
 TGApplication.cxx:143
 TGApplication.cxx:144
 TGApplication.cxx:145
 TGApplication.cxx:146
 TGApplication.cxx:147
 TGApplication.cxx:148
 TGApplication.cxx:149
 TGApplication.cxx:150
 TGApplication.cxx:151
 TGApplication.cxx:152
 TGApplication.cxx:153
 TGApplication.cxx:154
 TGApplication.cxx:155
 TGApplication.cxx:156
 TGApplication.cxx:157
 TGApplication.cxx:158
 TGApplication.cxx:159
 TGApplication.cxx:160
 TGApplication.cxx:161
 TGApplication.cxx:162
 TGApplication.cxx:163
 TGApplication.cxx:164
 TGApplication.cxx:165
 TGApplication.cxx:166
 TGApplication.cxx:167
 TGApplication.cxx:168
 TGApplication.cxx:169
 TGApplication.cxx:170
 TGApplication.cxx:171
 TGApplication.cxx:172
 TGApplication.cxx:173
 TGApplication.cxx:174
 TGApplication.cxx:175
 TGApplication.cxx:176
 TGApplication.cxx:177
 TGApplication.cxx:178
 TGApplication.cxx:179
 TGApplication.cxx:180
 TGApplication.cxx:181
 TGApplication.cxx:182
 TGApplication.cxx:183
 TGApplication.cxx:184
 TGApplication.cxx:185
 TGApplication.cxx:186
 TGApplication.cxx:187
 TGApplication.cxx:188
 TGApplication.cxx:189
 TGApplication.cxx:190
 TGApplication.cxx:191
 TGApplication.cxx:192
 TGApplication.cxx:193
 TGApplication.cxx:194
 TGApplication.cxx:195
 TGApplication.cxx:196
 TGApplication.cxx:197
 TGApplication.cxx:198
 TGApplication.cxx:199
 TGApplication.cxx:200
 TGApplication.cxx:201
 TGApplication.cxx:202
 TGApplication.cxx:203
 TGApplication.cxx:204
 TGApplication.cxx:205
 TGApplication.cxx:206
 TGApplication.cxx:207
 TGApplication.cxx:208