Dear Damir
I cannot believe it, you are right! Now my macro works!
(I consider this a severe bug!)
Sorrowly, it does not solve my other problem, the compilation
of the macro. Maybe, if you have time, I am sending you the
relevant files. It would be great if you could test it.
Thank you already for these good news.
(BTW, I am using "this->" in order to distinguish methods
defined in the current class from inherited methods)
Best regards
Christian
Damir Buskulic wrote:
> Hi Christian and Fons,
>
> I just tried it and Christian's script doesn't work neither on MacOSX
> However, if I replace the line 321 :
>
> this->Test(1);
>
> simply by
>
> Test(1)
>
> which is usual, everything works fine. So maybe there is an interpreter
> issue here, which is not limited to GUI. But I'm not able to investigate
> more. Hope it helps.
>
> Cheers
>
> Damir
>
> =====================================================================
> | Damir Buskulic | Universite de Savoie/LAPP |
> | | Chemin de Bellevue, B.P. 110 |
> | Tel : +33 (0)450091600 | F-74941 Annecy-le-Vieux Cedex |
> | e-mail: buskulic@lapp.in2p3.fr | FRANCE |
> =====================================================================
> mailto:buskulic@lapp.in2p3.fr
>
> On Sun, 16 Feb 2003, Fons Rademakers wrote:
>
>
>>Hi Christian,.
>>
>> this might very well be a 10.1 problem. I have this week no access
>>to my Mac so I can not verify the behaviour on Mac OS X 10.2. Maybe Damir
>>can try?
>>
>>Cheers, Fons.
>>
>>
>>
>>On Sat, Feb 15, 2003 at 06:33:11PM +0100, cstrato wrote:
>>
>>>Dear Rooters
>>>
>>>The enclosed macro ".x mygui.C" contains two classes,
>>>called MyFrame and SubFrame.
>>>
>>>In the constructor of MyFrame I am able to call methods,
>>>however, in the constructor of SubFrame I am unable to
>>>call any method. Even calling the simple method "Test(1)"
>>>(see line 321) causes ROOT to crash with:
>>>
>>>root [7] .x mygui.C
>>>---TEST - 1
>>> *** Break *** segmentation violation
>>>Root > Function mygui() busy flag cleared
>>>Function MyFrame() busy flag cleared
>>>Function CreateShutterFrames() busy flag cleared
>>>Function SubFrame() busy flag cleared
>>>Function Test() busy flag cleared
>>>
>>>Can anybody tell me, why I am not able to call a
>>>method in the SubFrame constructor??
>>>
>>>Note: Yesterday, I could run a similar macro in root
>>>for about 50 times without problems, until root finally
>>>crashed with the error described above. Since then, it
>>>is no longer possible to call a method from the constructor.
>>>
>>>I am using root 3.05/02 on MacOS X 10.1.2
>>>
>>>Thank you in advance.
>>>
>
>
>
// File created: 15/02/2003 last modified: 15/02/2003
/******************************************************************************
* Copyright(c) 2000-2003, Dr. Christian Stratowa, Vienna, Austria. *
* Author: Christian Stratowa. *
******************************************************************************/
#ifndef __MYGUI__
#define __MYGUI__
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <fstream.h>
#include "RQ_OBJECT.h"
#include "TGFrame.h"
#include "TGMenu.h"
#include "TGButton.h"
#include "TGLayout.h"
#include "TG3DLine.h"
#include "TGShutter.h"
#include "TGPicture.h"
#include "TList.h"
class SubFrame;
struct ShutterData_t {
const char *sPixmap_name;
const char *sTip_text;
Int_t sId;
TGButton *sButton;
};
class MyFrame {
RQ_OBJECT("MyFrame")
private:
TGMainFrame *fMain;
// MenuBar Frame
TGPopupMenu *fMenuFile;
TGMenuBar *fMenuBar;
TGHorizontal3DLine *fLineH1;
// Shutter Frame
TGHorizontalFrame *fHF1;
TGShutter *fShutter;
const TGPicture *fDefaultPic;
SubFrame *fSubFrame;
// Layout hints
TGLayoutHints *fMenuBarLayout;
TGLayoutHints *fMenuBarItemLayout;
TGLayoutHints *fMenuBarHelpLayout;
TGLayoutHints *fLineLayout;
TGLayoutHints *fLayout;
TList *fTrash;
public:
MyFrame(const TGWindow *window, UInt_t w, UInt_t h);
virtual ~MyFrame();
// void AddShutterItem(const char *name, Int_t id, ShutterData_t *data);
void AddShutterItem(const char *name, Int_t id, ShutterData_t data[]);
// Slots
void DoCloseWindow();
void DoShutter(Int_t id = -1);
private:
void CreateMenuBar();
void DeleteMenuBar();
void CreateShutter();
void DeleteShutter();
void CreateShutterFrames();
void DeleteShutterFrames();
ClassDef(MyFrame,0) //MainFrame
};
class SubFrame {
RQ_OBJECT("SubFrame")
private:
MyFrame *fMyFrame;
TGCompositeFrame *fShutterFrame;
TGCompositeFrame *fFrameA;
TGGroupFrame *fFG1;
TList *fTrash;
public:
SubFrame() {}
SubFrame(TGCompositeFrame *parent, MyFrame *main, UInt_t w, UInt_t h);
virtual ~SubFrame();
void HandleShutter(Int_t id = -1);
private:
void Test(Int_t k) {cout << "---TEST - " << k << endl;}
void CreateFrameA();
void DeleteFrameA();
ClassDef(SubFrame,0) //SubFrame
};
#endif
// File created: 15/02/2003 last modified: 15/02/2003
/******************************************************************************
* Copyright(c) 2000-2003, Dr. Christian Stratowa, Vienna, Austria. *
* Author: Christian Stratowa. *
******************************************************************************/
#include "TROOT.h"
#include "TApplication.h"
#include "TVirtualX.h"
#include "MyGui.h"
// Menu commands
enum EMenuCommands {
M_FILE,
M_FILE_NEW,
};
// Shutter commands
enum EShutterCommands {
S_SHUT1 = 1001,
S_SHUT1_A,
S_SHUT1_B,
S_SHUT2 = 1001,
S_SHUT2_A,
S_SHUT2_B,
};
const char *xpm_names[] = {
"Folder.xpm",
"Folder.xpm",
0
};
const char *kShutterName[] = {
"Shutter1",
"Shutter2",
0
};
ShutterData_t kItems1[] = {
{ "folder_s.xpm", "xxx", S_SHUT1_A, 0 },
{ "folder_s.xpm", "xxx", S_SHUT1_B, 0 },
{ 0, 0, 0, 0 }
};
ShutterData_t kItems2[] = {
{ "folder_s.xpm", "xxx", S_SHUT2_A, 0 },
{ "folder_s.xpm", "xxx", S_SHUT2_B, 0 },
{ 0, 0, 0, 0 }
};
//debug: print function names
const Bool_t kCS = 1;
ClassImp(MyFrame);
ClassImp(SubFrame);
//______________________________________________________________________________
MyFrame::MyFrame(const TGWindow *window, UInt_t w, UInt_t h)
{
if(kCS) cout << "------MyFrame::MyFrame------" << endl;
fTrash = new TList();
fMain = new TGMainFrame(window, w, h);
fMain->Connect("CloseWindow()", "MyFrame", this, "DoCloseWindow()");
// Create menus
CreateMenuBar();
// this->CreateMenuBar();
// Basic frame layout
fLayout = new TGLayoutHints(kLHintsTop | kLHintsExpandX | kLHintsExpandY);
fHF1 = new TGHorizontalFrame(fMain, 20, 20);
fMain->AddFrame(fHF1, fLayout);
// Create shutter
CreateShutter();
CreateShutterFrames();
// this->CreateShutter();
// this->CreateShutterFrames();
// Main settings
fMain->SetWindowName("MyGui");
fMain->MapSubwindows();
fMain->Resize(fMain->GetDefaultSize());
fMain->MapWindow();
fMain->Move(20, 20);
}//Constructor
//______________________________________________________________________________
MyFrame::~MyFrame()
{
if(kCS) cout << "------MyFrame::~MyFrame------" << endl;
DeleteMenuBar();
DeleteShutterFrames();
DeleteShutter();
// this->DeleteMenuBar();
// this->DeleteShutterFrames();
// this->DeleteShutter();
delete fHF1;
delete fMain;
delete fLayout;
fTrash->Delete();
delete fTrash;
}//Destructor
//______________________________________________________________________________
void MyFrame::CreateMenuBar()
{
if(kCS) cout << "------MyFrame::CreateMenuBar------" << endl;
// File menu
fMenuFile = new TGPopupMenu(gClient->GetRoot());
fMenuFile->AddEntry("&New...", M_FILE_NEW);
// Create menubar layout hints
fMenuBarLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 0, 0, 1, 1);
fMenuBarItemLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0);
fMenuBarHelpLayout = new TGLayoutHints(kLHintsTop | kLHintsRight);
// Add menus to MenuBar
fMenuBar = new TGMenuBar(fMain, 1, 1, kHorizontalFrame);
fMenuBar->AddPopup("&File", fMenuFile, fMenuBarItemLayout);
fMain->AddFrame(fMenuBar, fMenuBarLayout);
// Line to separate menubar
fLineH1 = new TGHorizontal3DLine(fMain);
fLineLayout = new TGLayoutHints(kLHintsTop | kLHintsExpandX);
fMain->AddFrame(fLineH1, fLineLayout);
fLineH1->DrawBorder();
}//CreateMenuBar
//______________________________________________________________________________
void MyFrame::DeleteMenuBar()
{
if(kCS) cout << "------MyFrame::DeleteMenuBar------" << endl;
delete fLineH1;
delete fMenuBar;
delete fMenuFile;
delete fMenuBarLayout;
delete fMenuBarItemLayout;
delete fMenuBarHelpLayout;
delete fLineLayout;
}//DeleteMenuBar
//______________________________________________________________________________
void MyFrame::CreateShutter()
{
if(kCS) cout << "------MyFrame::CreateShutter------" << endl;
fDefaultPic = gClient->GetPicture("folder_s.xpm");
fShutter = new TGShutter(fHF1, kSunkenFrame | kFixedWidth | kDoubleBorder);
AddShutterItem(kShutterName[0], 5001, kItems1);
AddShutterItem(kShutterName[1], 5002, kItems2);
// this->AddShutterItem(kShutterName[0], S_SHUT1, kItems1);
// this->AddShutterItem(kShutterName[1], S_SHUT2, kItems2);
TGLayoutHints *hint = 0;
hint = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandY);
fTrash->Add(hint);
fHF1->AddFrame(fShutter, hint);
fShutter->Resize(100, 400);
}//CreateShutter
//______________________________________________________________________________
void MyFrame::DeleteShutter()
{
if(kCS) cout << "------MyFrame::DeleteShutter------" << endl;
delete fShutter;
}//DeleteShutter
//______________________________________________________________________________
void MyFrame::CreateShutterFrames()
{
if(kCS) cout << "------MyFrame::CreateShutterFrames------" << endl;
// fSubFrame = new SubFrame(fHF1, this, 0, 0);
}//CreateShutterFrames
//______________________________________________________________________________
void MyFrame::DeleteShutterFrames()
{
if(kCS) cout << "------MyFrame::DeleteShutterFrames------" << endl;
delete fSubFrame;
}//DeleteShutterFrames
//______________________________________________________________________________
//void MyFrame::AddShutterItem(const char *name, Int_t id, ShutterData_t *data)
void MyFrame::AddShutterItem(const char *name, Int_t id, ShutterData_t data[])
{
if(kCS) cout << "------MyFrame::AddShutterItem------" << endl;
TGShutterItem *item;
TGCompositeFrame *container;
TGButton *button;
const TGPicture *buttonpic;
TGLayoutHints *hint;
hint = new TGLayoutHints(kLHintsTop | kLHintsCenterX, 5, 5, 5, 0);
fTrash->Add(hint);
item = new TGShutterItem(fShutter, new TGHotString(name), id);
fTrash->Add(item);
container = (TGCompositeFrame*)item->GetContainer();
for (Int_t i=0; data[i].sPixmap_name != 0; i++) {
buttonpic = gClient->GetPicture(data[i].sPixmap_name);
if (!buttonpic) {
printf("Shutter: missing pixmap \"%s\", using default",
data[i].sPixmap_name);
buttonpic = fDefaultPic;
}//if
button = new TGPictureButton(container, buttonpic, data[i].sId);
fTrash->Add(button);
button->Connect("Clicked()", "MyFrame", this, "DoShutter()");
button->SetToolTipText(data[i].sTip_text);
data[i].sButton = button;
container->AddFrame(button, hint);
}//for_i
fShutter->AddItem(item);
}//AddShutterItem
//______________________________________________________________________________
void MyFrame::DoCloseWindow()
{
if(kCS) cout << "------MyFrame::DoCloseWindow------" << endl;
// delete this; //does not exit root
gApplication->Terminate(0); //exit root, needed for standalone App
}//DoCloseWindow
//______________________________________________________________________________
void MyFrame::DoShutter(Int_t id)
{
if(kCS) cout << "------MyFrame::DoShutter------" << endl;
}//DoShutter
//______________________________________________________________________________
//______________________________________________________________________________
SubFrame::SubFrame(TGCompositeFrame *parent, MyFrame *main, UInt_t w, UInt_t h)
{
if(kCS) cout << "------SubFrame::SubFrame------" << endl;
fMyFrame = main;
fTrash = new TList();
// Subframe for frame containing different shutter frames
TGLayoutHints *hint = 0;
hint = new TGLayoutHints(kLHintsTop | kLHintsExpandX | kLHintsExpandY);
fTrash->Add(hint);
fShutterFrame = new TGCompositeFrame(parent, w, h);
parent->AddFrame(fShutterFrame, hint);
//THIS DOES WORK!!
fFrameA = new TGCompositeFrame(fShutterFrame,0,0, kHorizontalFrame);
fShutterFrame->AddFrame(fFrameA, hint);
fFG1 = new TGGroupFrame(fFrameA, "Group frame for A", kVerticalFrame);
fFrameA->AddFrame(fFG1, hint);
// Create shutter subframes
// this->Test(1);
//THIS DOES NOT WORK!!
// this->CreateFrameA();
// this->Test(2);
// Show first frame
fShutterFrame->ShowFrame(fFrameA);
}//Constructor
//______________________________________________________________________________
SubFrame::~SubFrame()
{
if(kCS) cout << "------SubFrame::~SubFrame------" << endl;
DeleteFrameA();
// this->DeleteFrameA();
fTrash->Delete();
delete fTrash;
fMyFrame = 0;
}//Destructor
//______________________________________________________________________________
void SubFrame::HandleShutter(Int_t id)
{
if(kCS) cout << "------SubFrame::HandleShutter------" << endl;
}//HandleShutter
//______________________________________________________________________________
void SubFrame::CreateFrameA()
{
if(kCS) cout << "------SubFrame::CreateFrameA------" << endl;
TGLayoutHints *hint1 = 0;
hint1 = new TGLayoutHints(kLHintsTop | kLHintsExpandX | kLHintsExpandY);
fTrash->Add(hint1);
fFrameA = new TGCompositeFrame(fShutterFrame,0,0, kHorizontalFrame);
fShutterFrame->AddFrame(fFrameA, hint1);
fFG1 = new TGGroupFrame(fFrameA, "Group frame for A", kVerticalFrame);
fFrameA->AddFrame(fFG1, hint1);
fShutterFrame->HideFrame(fFrameA);
}//CreateFrameA
//______________________________________________________________________________
void SubFrame::DeleteFrameA()
{
if(kCS) cout << "------SubFrame::DeleteFrameA------" << endl;
delete fFG1; delete fFrameA;
}//DeleteFrameA
//////////////////////////////////////////////////////////////////////////
// //
// Main program //
// //
//////////////////////////////////////////////////////////////////////////
TROOT root("MyApp", "GUI Application");
int main(int argc, char **argv)
{
TApplication theApp("App", &argc, argv);
if (gROOT->IsBatch()) {
fprintf(stderr, "%s: Cannot run in batch mode\n", argv[0]);
return 1;
}
new MyFrame(gClient->GetRoot(), 400, 220);
// MyFrame *myApp = new MyFrame(gClient->GetRoot(), 400, 220);
theApp.Run();
// delete myApp;
return 0;
}//main
#ifdef __CINT__
#pragma link off all globals;
#pragma link off all classes;
#pragma link off all functions;
#pragma link C++ class MyFrame+;
#pragma link C++ class SubFrame+;
#endif
#---------------------------------------------
# Makefile for MyGui.
# shell: gmake -f Makefile4MyApp
#ARCH = linuxppcegcs
ARCH = macosx
CXX =
ObjSuf = o
SrcSuf = cxx
ExeSuf =
DllSuf = so
OutPutOpt = -o
LPATH = .
MYLIB = -L$(LPATH)
#MYLIB = -L$(LPATH) -lMyClassB -lMyClassA
ROOTCFLAGS := $(shell root-config --cflags)
ROOTLIBS := $(shell root-config --libs)
ROOTGLIBS := $(shell root-config --glibs)
ifeq ($(ARCH),linuxegcs)
# Linux with egcs (>= RedHat 5.2)
CXX = g++
CXXFLAGS = -O -Wall -fPIC
LD = g++
LDFLAGS = -O
SOFLAGS = -shared
endif
ifeq ($(ARCH),linuxppcegcs)
# MkLinux with egcs/glibc
CXX = g++
CXXFLAGS = -O -Wall -fPIC
LD = g++
LDFLAGS = -O
SOFLAGS = -shared
endif
ifeq ($(ARCH),macosx)
# MacOS X with cc (GNU cc 2.95.2)
CXX = c++
CXXFLAGS = -O -pipe -Wall
LD = c++
LDFLAGS = -O -Xlinker -bind_at_load -flat_namespace
# The SOFLAGS will be used to create the .dylib; the .so will
# be created separately
DllSuf = dylib
SOFLAGS = -dynamiclib -flat_namespace -undefined suppress
endif
CXXFLAGS += $(ROOTCFLAGS)
LIBS = $(ROOTLIBS) $(SYSLIBS)
GLIBS = $(ROOTGLIBS) $(SYSLIBS)
#------------------------------------------------------------------------------
GUIO = MyGui.$(ObjSuf) MyGuiDict.$(ObjSuf)
GUIS = MyGui.$(SrcSuf) MyGuiDict.$(SrcSuf)
GUI = MyApp$(ExeSuf)
OBJS = $(GUIO)
PROGRAMS = $(GUI)
#------------------------------------------------------------------------------
.SUFFIXES: .$(SrcSuf) .$(ObjSuf) .$(DllSuf)
all: $(PROGRAMS)
$(GUI): $(GUIO)
# $(LD) $(LDFLAGS) $(OutPutOpt) $(GUI) $(GUIO) $(GLIBS)
$(LD) $(LDFLAGS) $(OutPutOpt) $(GUI) $(GUIO) $(MYLIB) $(GLIBS)
@echo "$@ done"
clean:
@rm -f $(OBJS) core
distclean: clean
@rm -f $(PROGRAMS) $(GUIO) *Dict.* *.def *.exp \
*.root *.ps *.so .def so_locations
# @rm -rf cxx_repository
.SUFFIXES: .$(SrcSuf)
###
MyGui.$(ObjSuf): MyGui.h
MyGuiDict.$(SrcSuf): MyGui.h MyGuiLinkDef.h
@echo "Generating dictionary $@..."
@rootcint -f $@ -c $^
.$(SrcSuf).$(ObjSuf):
$(CXX) $(CXXFLAGS) -c $<
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:09 MET