TGPopupMenu Showing In Top Left Corner

Hi, I’m currently working on writing a GUI for a project. Currently I have a base window with some elements in it and a TGMenuBar filled out with a few cascading TGPopupMenus. For what ever reason every time a launch my application for testing all of my popup menus are shown initially shown (all on top of each other in the top left corner, image attached) until one clicks on the necessary entries in the menu that would show the window(e.g. clicking on file would should the file menu where it is intended to be and after leaving that menu option the File popup menu would be hidden). Is there any way I can go about remedying this. I can attach my coded if need, but essentially all I am doing in it is creating the menu bar and popup menus, adding them to the frame, and mapping the window.


Hi,

This looks like a bad Window hierarchy (i.e. parent-children assignment). I would need to see the code, least where you build the GUI elements, and in particular where you build the menu bar and the popup menus (to see the full hierarchy, from the TGMainFrame down to the last child frame).

Cheers, Bertrand.

Here is the relevant code.All gui elements are declared as pointers in a separate file. All Panel ids are enumerated earlier in code.

here p is

gClient->GetRoot()
fMain = new TGMainFrame(p, w, h);//intiliazing menu
  windowMenu = new TGMenuBar(fMain, 700, 600,kHorizontalFrame);
  //building file dropdownmenu
  windowMenuFile = new TGPopupMenu(fMain);	
  windowMenuFile->AddEntry("Load Profile",LOAD_PROFILE);
  windowMenuFile->AddEntry("Save Profile", SAVE_PROFILE);
  windowMenuFile->AddSeparator();
  windowMenuFile->AddEntry("Save Profile as Default", SAVE_PROFILE_DEFAULT);
  windowMenuFile->AddEntry("Clear Default Profile", CLEAR_PROFILE_DEFAULT);
  windowMenuFile->AddSeparator();
  windowMenuFile->AddEntry("Generate All Text Files for DAQ", GENERATE_TEXT_DAQ);
  windowMenuFile->AddEntry("Generate All Action/Sequence Files for DAQ", GENERATE_ACTION_DAQ);
  windowMenuFile->AddSeparator();
  windowMenuFile->AddEntry("Quit", QUIT);
  //connecting menu entries in file dropdown menu
  windowMenuFile->Connect("Activated(Int_t)","MyWindow",this,"HandleFileMenu(Int_t)");
  //building execute drop downmenu
  windowMenuExecute = new TGPopupMenu(fMain);
  windowMenuExecute->AddEntry("CSM IOs Control",CSM_IOS_CONTROL);
  windowMenuExecute->AddEntry("Program FPGA from PROM via IO pin",PROGRAM_FPGA);
  windowMenuExecute->AddEntry("Reset CSM via IO pin",RESET_CSM);
  windowMenuExecute->AddEntry("Select Hardware TDO In",SELECT_HARDWARE_TDO);
  windowMenuExecute->AddEntry("Select Software TDO In",SELECT_SOFTWARE_TDO);
  windowMenuExecute->AddSeparator();
  windowMenuExecute->AddEntry("INIT DAQ",INIT_DAQ);
  windowMenuExecute->AddEntry("Search JTAG Driver",SEARCH_JTAG);
  windowMenuExecute->AddSeparator();
  windowMenuExecute->AddEntry("Setup Run Condition",SETUP_RUN_COND);
  windowMenuExecute->AddEntry("Auto Run Setup",AUTO_RUN_SETUP);
  windowMenuExecute->AddSeparator();
  windowMenuExecute->AddEntry("Check Mezz Card On/Off Status",CHECK_MEZZ_ON_OFF);
  windowMenuExecute->AddEntry("Check All DAQ HardWare",CHECK_ALL_HARDWARE);
  //creating Run Diagnostics sub menu
  runDiag = new TGPopupMenu(fMain);
  runDiag->AddEntry("Get Raw Data",GET_RAW);
  runDiag->AddEntry("Get One Event",GET_EVENT);
  runDiag->AddEntry("Get One Sequential Event",GET_SEQ_EVENT);
  windowMenuExecute->AddPopup("Run Diagnostics", runDiag);
  windowMenuExecute->AddSeparator();
  windowMenuExecute->AddEntry("Program VertexII FPGA (CSM)",PROG_VERT_FPGA);
  windowMenuExecute->AddEntry("Program PROM",PROG_PROM);
  windowMenuExecute->AddEntry("Program VertexII from PROM",PROG_VERT_PROM);
  windowMenuExecute->AddSeparator();
  windowMenuExecute->AddEntry("Verify VertexII FPGA (CSM)",VERIF_VERT_FPGA);
  windowMenuExecute->AddEntry("Verify PROM",VERIF_PROM );
  windowMenuExecute->AddSeparator();
  windowMenuExecute->AddEntry("Shutdown FPGA",SHUTDOWN_FPGA);
  windowMenuExecute->AddEntry("Read FPGA Config. Status",READ_FPGA_CONFIG);
  windowMenuExecute->AddSeparator();
  windowMenuExecute->AddEntry("Save Error Report",SAVE_ERROR);
  windowMenuExecute->AddEntry("Show Error Report",SHOW_ERROR);
  //connecting menu entries in "Execute" drop down menu
  windowMenuExecute->Connect("Activated(Int_t)","MyWindow",this,"HandleExecuteMenu(Int_t)");
  //building JTAG portion of menu
  windowMenuJTAG = new TGPopupMenu(fMain);
  windowMenuJTAG->AddEntry("Setup JTAG Chain",SETUP_JTAG);
  windowMenuJTAG->AddEntry("Reset TAP",RESET_TAP);
  windowMenuJTAG->AddSeparator();
  windowMenuJTAG->AddEntry("Setup CSM",SETUP_CSM);
  windowMenuJTAG->AddEntry("Setup TTCrx",SETUP_TTCRX);
  windowMenuJTAG->AddSeparator();
  windowMenuJTAG->AddEntry("Setup GOL",SETUP_GOL);
  windowMenuJTAG->AddSeparator();
  windowMenuJTAG->AddEntry("MezzCard Setup All",SETUP_MEZZ_ALL);
  mezzIndSetup = new TGPopupMenu(fMain);
  mezzIndSetup->AddEntry("Mezzanine 0", MEZZ_0);
  mezzIndSetup->AddEntry("Mezzanine 1",MEZZ_1);
  mezzIndSetup->AddEntry("Mezzanine 2", MEZZ_2);
  mezzIndSetup->AddEntry("Mezzanine 3", MEZZ_3);
  mezzIndSetup->AddEntry("Mezzanine 4",MEZZ_4);
  mezzIndSetup->AddEntry("Mezzanine 5", MEZZ_5);
  mezzIndSetup->AddEntry("Mezzanine 6", MEZZ_6);
  mezzIndSetup->AddEntry("Mezzanine 7",MEZZ_7);
  mezzIndSetup->AddEntry("Mezzanine 8",MEZZ_8);
  mezzIndSetup->AddEntry("Mezzanine 9",MEZZ_9);
  mezzIndSetup->AddEntry("Mezzanine 10",MEZZ_10);
  mezzIndSetup->AddEntry("Mezzanine 11",MEZZ_11);
  mezzIndSetup->AddEntry("Mezzanine 12",MEZZ_12);
  mezzIndSetup->AddEntry("Mezzanine 13",MEZZ_13);
  mezzIndSetup->AddEntry("Mezzanine 14",MEZZ_14);
  mezzIndSetup->AddEntry("Mezzanine 15", MEZZ_15);
  mezzIndSetup->AddEntry("Mezzanine 16",MEZZ_16);
  mezzIndSetup->AddEntry("Mezzanine 17",MEZZ_17);
  windowMenuJTAG->AddPopup("MezzCard Setup Ind",mezzIndSetup);
  windowMenuJTAG->AddEntry("Load  Nominal Threshold",LOAD_NOM_THRESHOLD);
  windowMenuJTAG->AddSeparator();
  diagJTAG= new TGPopupMenu(fMain);
  diagJTAG->AddEntry("CSM ID",CSM_ID);
  diagJTAG->AddEntry("CSM Versin Date",CSM_VERS);
  diagJTAG->AddSeparator();
  diagJTAG->AddEntry("CSM AMT Parity Error",CSM_AMT_PARITY);
  diagJTAG->AddEntry("CSM AMT Phase Error",CSM_AMT_PHASE);
  diagJTAG->AddEntry("CSM AMT Full Phase Samples",CSM_AMT_FULL_PHASE);
  diagJTAG->AddSeparator();
  diagJTAG->AddEntry("CSM Status",CSM_STATUS);
  diagJTAG->AddEntry("CSM TTCrx Status",CSM_TTCRX_STATUS);
  diagJTAG->AddEntry("CSM Read Only Bits",CSM_READ_ONLY);
  diagJTAG->AddSeparator();
  diagJTAG->AddEntry("CSM Full Read/Write",CSM_FULL_READ_WRITE);
  diagJTAG->AddEntry("CSM Full Read Only",CSM_FULL_READ);
  diagJTAG->AddSeparator();
  diagJTAG->AddEntry("CSM Config Read/Wrie",CSM_CONFIG_READ_WRITE);
  diagJTAG->AddEntry("CSM Config Read Only",CSM_CONFIG_READ);
  diagJTAG->AddSeparator();
  diagJTAG->AddEntry("CSM Para. Read/Write",CSM_PARA_READ_WRITE);
  diagJTAG->AddEntry("CSM Para. Read Only",CSM_PARA_READ);
  windowMenuJTAG->AddPopup("Diagnostics",diagJTAG);
  windowMenuJTAG->AddEntry("Search Mezzanine Card (AMTs)",SEARCH_MEZZ);
  windowMenuJTAG->AddSeparator();
  windowMenuJTAG->AddEntry("Get Device List in JTAG Chain",GET_DEVICE_JTAG);
  windowMenuJTAG->AddEntry("Get All Device ID",GET_ALL_DEVICE);
  windowMenuJTAG->AddSeparator();
  windowMenuJTAG->AddEntry("Get PROM ID",GET_PROM_ID);
  windowMenuJTAG->AddEntry("Get CSM Chip ID",GET_CSM_CHIP_ID);
  windowMenuJTAG->AddEntry("Get TTCrx ID",GET_TTCRX_ID);
  windowMenuJTAG->AddEntry("Get GOL ID",GET_GOL_ID);
  windowMenuJTAG->AddEntry("Get CSM ID",GET_CSM_ID);
  windowMenuJTAG->AddEntry("Get All AMT ID",GET_AMT_ID);
  windowMenuJTAG->AddSeparator();
  windowMenuJTAG->AddEntry("Clear Setup Status",CLEAR_SETUP_STATUS);
  windowMenuJTAG->AddEntry("Reset CSM FPGA",RESET_CSM_FPGA);
  //connecting menu entires in "JTAG" menu
  windowMenuJTAG->Connect("Activated(Int_t)","MyWindow",this,"HandleJTAGMenu(Int_t)");
  //buidling TTCvi portion of menu
  windowMenuTTCvi = new TGPopupMenu(fMain);
  windowMenuTTCvi->AddEntry("Status and Control",STATUS_CONTROL);
  windowMenuTTCvi->AddEntry("B-Go Control",BGO_CONTROL);
  windowMenuTTCvi->AddSeparator();
  windowMenuTTCvi->AddEntry("Reset Board",RESET_BOARD);
  windowMenuTTCvi->AddEntry("Reset L1A FIFO",RESET_L1A);
  windowMenuTTCvi->AddSeparator();
  windowMenuTTCvi->AddEntry("Event Counter Reset",EVENT_COUNTER_RESET);
  windowMenuTTCvi->AddEntry("Bunch Counter Reset",BUNCH_COUNTER_RESET);
  windowMenuTTCvi->AddEntry("Event and Bunch Counter Reset",EVENT_BUNCH_RESET);
  windowMenuTTCvi->AddSeparator();
  windowMenuTTCvi->AddEntry("One Shot SoftWare Trigger",ONE_SOFT_TRIGGER);
  ttcviRandTrigger = new TGPopupMenu(fMain);
  ttcviRandTrigger->AddEntry("1 Hz",HZ1);
  ttcviRandTrigger->AddEntry("100 Hz",HZ100);
  ttcviRandTrigger->AddEntry("1 KHz",KHZ1);
  ttcviRandTrigger->AddEntry("5 KHz",KHZ5);
  ttcviRandTrigger->AddEntry("10 KHz",KHZ10);
  ttcviRandTrigger->AddEntry("25 KHz",KHZ25);
  ttcviRandTrigger->AddEntry("50 KHz",KHZ50);
  ttcviRandTrigger->AddEntry("100 KHz",KHZ100);
  windowMenuTTCvi->AddPopup("Random Software Trigger", ttcviRandTrigger);
  windowMenuTTCvi->AddSeparator();
  ttcviExtTrigger = new TGPopupMenu(fMain);
  ttcviExtTrigger->AddEntry("L1A Channel 0",CHANNEL_0);
  ttcviExtTrigger->AddEntry("L1A Channel 1",CHANNEL_1);
  ttcviExtTrigger->AddEntry("L1A Channel 2",CHANNEL_2);
  ttcviExtTrigger->AddEntry("L1A Channel 3",CHANNEL_3);
  windowMenuTTCvi->AddPopup("External Trigger", ttcviExtTrigger);
  windowMenuTTCvi->AddEntry("Disable Trigger",DISABLE_TRIGGER);
  windowMenuTTCvi->AddSeparator();
  windowMenuTTCvi->AddEntry("Trigger Select",TRIGGER_SELECT);
  //connecting menu entires in "TTCvi" menu
  windowMenuTTCvi->Connect("Activated(Int_t)","MyWindow",this,"HandleTTCviMenu(Int_t)");
  //help menu
  windowMenuHelp =  new TGPopupMenu(fMain);
  windowMenuHelp->AddEntry("Help on Buttons",HELP);
  windowMenuHelp->AddEntry("About CSM1 DAQ Control", ABOUT);
  //connecting menu entires in "TTCvi" menu
  windowMenuHelp->Connect("Activated(Int_t)","MyWindow",this,"HandleHelpMenu(Int_t)");
  //adding menus to frame
  windowMenu->AddPopup("File", windowMenuFile, new TGLayoutHints(kLHintsTop | kLHintsExpandY, 0, 4, 0, 0));
  windowMenu->AddPopup("Execute", windowMenuExecute, new TGLayoutHints(kLHintsTop | kLHintsExpandY, 0, 4, 0, 0));
  windowMenu->AddPopup("JTAG", windowMenuJTAG, new TGLayoutHints(kLHintsTop | kLHintsExpandY, 0, 4, 0, 0));
  windowMenu->AddPopup("TTCvi", windowMenuTTCvi, new TGLayoutHints(kLHintsTop | kLHintsExpandY, 0, 4, 0, 0));
  windowMenu->AddPopup("Help", windowMenuHelp, new TGLayoutHints(kLHintsTop | kLHintsExpandY, 0, 4, 0, 0));
fMain->AddFrame(windowMenu, new TGLayoutHints(kLHintsCenterX, 2, 2, 2, 2));  

I also attached a copy of my full code and a script for running a version of it.
windowTest.c (349 Bytes)
MyWindow.h (7.29 KB)
MyWindow.C (26.9 KB)

Hi,

OK, so don’t specify fMain as parent of the TGPopupMenu, but simply call “new TGPopupMenu()”:

[...] windowMenuFile = new TGPopupMenu(); [...] windowMenuExecute = new TGPopupMenu(); [...] (if you really want to specify a parent, pass gClient->GetRoot())

And then, you should call Layout() after MapSubwindows():

fMain->MapSubwindows(); fMain->Layout(); fMain->MapWindow();
And BTW, why don’t you make your MyWindow class inheriting from TGMainFrame? It would be much simpler and cleaner (i.e. no need to use RQ_OBJECT(“MyWindow”) anymore)

Cheers, Bertrand.