Logo Search packages:      
Sourcecode: blender version File versions

header_info.c

/**
 * header_info.c oct-2003
 *
 * Functions to draw the "User Preferences" window header
 * and handle user events sent to it.
 * 
 * $Id: header_info.c,v 1.50 2004/11/11 23:58:05 ton Exp $
 *
 * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version. The Blender
 * Foundation also sells licenses for use in proprietary software under
 * the Blender License.  See http://www.blender.org/BL/ for information
 * about this.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 59 Temple Place - Suite 330, Boston, MA      02111-1307, USA.
 *
 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
 * All rights reserved.
 *
 * The Original Code is: all of this file.
 *
 * Contributor(s): none yet.
 *
 * ***** END GPL/BL DUAL LICENSE BLOCK *****
 */
 
#include <math.h>
#include <stdlib.h>
#include <string.h>

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#ifdef WIN32
#include "BLI_winstuff.h"
#endif

#include "BMF_Api.h"
#include "BIF_language.h"
#ifdef INTERNATIONAL
#include "FTF_Api.h"
#endif

#include "DNA_ID.h"
#include "DNA_image_types.h"
#include "DNA_lamp_types.h"
#include "DNA_object_types.h"
#include "DNA_packedFile_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_userdef_types.h"
#include "DNA_world_types.h"

#include "BDR_editcurve.h"
#include "BDR_editmball.h"
#include "BDR_editobject.h"

#include "BIF_editarmature.h"
#include "BIF_editfont.h"
#include "BIF_editmesh.h"
#include "BIF_gl.h"
#include "BIF_interface.h"
#include "BIF_language.h"
#include "BIF_mainqueue.h"
#include "BIF_previewrender.h"
#include "BIF_renderwin.h"
#include "BIF_resources.h"
#include "BIF_screen.h"
#include "BIF_space.h"
#include "BIF_toets.h"
#include "BIF_toolbox.h"
#include "BIF_usiblender.h"
#include "BIF_drawscene.h"

#include "BKE_blender.h"
#include "BKE_exotic.h"
#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_packedFile.h"
#include "BKE_scene.h"
#include "BKE_world.h"

#include "BLI_arithb.h"
#include "BLI_blenlib.h"
#include "BLO_writefile.h"

#include "BSE_editipo.h"
#include "BSE_filesel.h"
#include "BSE_headerbuttons.h"
#include "BSE_sequence.h"

#include "IMB_imbuf_types.h"

#include "MEM_guardedalloc.h"

#include "BPY_extern.h"
#include "BPY_menus.h"

#include "render.h" // for R - should use BKE_bad_level_calls.h instead?

#include "blendef.h"
#include "mydevice.h"

extern char versionstr[]; /* from blender.c */

/*----------------------------------*/
/* Progress bar vars and functions: */

/* strubi shamelessly abused the status line as a progress bar...
 * feel free to kill him after release */

static int g_progress_bar = 0;
static char *g_progress_info = 0;
static float g_done;

int start_progress_bar(void)
{
      g_progress_bar = 1;
      return 1;         // we never fail (yet)
}

void end_progress_bar(void)
{
      g_progress_bar = 0;
}

static void update_progress_bar(float done, char *info)
{
      g_done = done;
      g_progress_info = info;
}

/** Progress bar
      'done': a value between 0.0 and 1.0, showing progress
      'info': a info text what is currently being done

      Make sure that the progress bar is always called with:
      done = 0.0 first
            and
      done = 1.0 last -- or alternatively use:

      start_progressbar();
      do_stuff_and_callback_progress_bar();
      end_progressbar();
*/

int progress_bar(float done, char *busy_info)
{
      ScrArea *sa;
      short val; 

      /* User break (ESC) */
      while (qtest()) {
            if (extern_qread(&val) == ESCKEY) 
                  return 0;
      }
      if (done == 0.0) {
            start_progress_bar();
      } else if (done > 0.99) {
            end_progress_bar();
      }

      sa= G.curscreen->areabase.first;
      while(sa) {
            if (sa->spacetype == SPACE_INFO) {
                  update_progress_bar(done, busy_info);

                  curarea = sa;

                  scrarea_do_headdraw(curarea);
                  areawinset(curarea->win);
                  sa->head_swap= WIN_BACK_OK;
                  screen_swapbuffers();
            }
            sa = sa->next;
      }
      return 1;
}
/* -- End of progress bar definitions ------- */

extern char videosc_dir[];    /* exotic.c */

void write_videoscape_fs()
{
      if(G.obedit) {
            error("Can't save Videoscape. Press TAB to leave EditMode");
      }
      else {
            if(videosc_dir[0]==0) strcpy(videosc_dir, G.sce);
            activate_fileselect(FILE_SPECIAL, "Export Videoscape", videosc_dir,
                                                            write_videoscape);
      }
}

void write_vrml_fs()
{
      if(G.obedit) {
            error("Can't save VRML. Press TAB to leave EditMode");
      }
      else {
            if(videosc_dir[0]==0) strcpy(videosc_dir, G.sce);
      
            activate_fileselect(FILE_SPECIAL, "Export VRML 1.0", videosc_dir, write_vrml);
      }  
}

void write_dxf_fs()
{
      if(G.obedit) {
            error("Can't save DXF. Press TAB to leave EditMode");
      }
      else {

            if(videosc_dir[0]==0) strcpy(videosc_dir, G.sce);

            activate_fileselect(FILE_SPECIAL, "Export DXF", videosc_dir, write_dxf);      
      }
}

void write_stl_fs()
{
      if(G.obedit) {
            error("Can't save STL. Press TAB to leave EditMode");
      }
      else {

            if(videosc_dir[0]==0) strcpy(videosc_dir, G.sce);

            activate_fileselect(FILE_SPECIAL, "Export STL", videosc_dir, write_stl);
      }
}
/* ------------ */

int buttons_do_unpack()
{
      int how;
      char menu[2048];
      char line[128];
      int ret_value = RET_OK, count = 0;

      count = countPackedFiles();

      if (count) {
            if (count == 1) {
                  sprintf(menu, "Unpack 1 file%%t");
            } else {
                  sprintf(menu, "Unpack %d files%%t", count);
            }
            
            sprintf(line, "|Use files in current directory (create when necessary)%%x%d", PF_USE_LOCAL);
            strcat(menu, line);
      
            sprintf(line, "|Write files to current directory (overwrite existing files)%%x%d", PF_WRITE_LOCAL);
            strcat(menu, line);
      
            sprintf(line, "|%%l|Use files in original location (create when necessary)%%x%d", PF_USE_ORIGINAL);
            strcat(menu, line);
      
            sprintf(line, "|Write files to original location (overwrite existing files)%%x%d", PF_WRITE_ORIGINAL);
            strcat(menu, line);
      
            sprintf(line, "|%%l|Disable AutoPack, keep all packed files %%x%d", PF_KEEP);
            strcat(menu, line);
      
            sprintf(line, "|Ask for each file %%x%d", PF_ASK);
            strcat(menu, line);
            
            how = pupmenu(menu);
            
            if(how != -1) {
                  if (how != PF_KEEP) {
                        unpackAll(how);
                  }
                  G.fileflags &= ~G_AUTOPACK;
            } else {
                  ret_value = RET_CANCEL;
            }
      } else {
            pupmenu("No packed files. Autopack disabled");
      }
      
      return (ret_value);
}

/* here, because of all creator stuff */

Scene *copy_scene(Scene *sce, int level)
{
      /* level 0: al objects shared
       * level 1: al object-data shared
       * level 2: full copy
       */
      Scene *scen;
      Base *base, *obase;

      /* level 0 */
      scen= copy_libblock(sce);
      duplicatelist(&(scen->base), &(sce->base));
      
      clear_id_newpoins();
      
      id_us_plus((ID *)scen->world);
      id_us_plus((ID *)scen->set);

      scen->ed= 0;
      scen->radio= 0;

      obase= sce->base.first;
      base= scen->base.first;
      while(base) {
            base->object->id.us++;
            if(obase==sce->basact) scen->basact= base;

            obase= obase->next;
            base= base->next;
      }

      if(level==0) return scen;

      /* level 1 */
      G.scene= scen;
      single_object_users(0);

      /*    camera */
      ID_NEW(G.scene->camera);

      /* level 2 */
      if(level>=2) {
            if(scen->world) {
                  scen->world->id.us--;
                  scen->world= copy_world(scen->world);
            }
            single_obdata_users(0);
            single_mat_users_expand();
            single_tex_users_expand();
      }

      clear_id_newpoins();

      BPY_copy_scriptlink(&sce->scriptlink);

      // make a private copy of the avicodecdata

      if (sce->r.avicodecdata) {

            scen->r.avicodecdata = MEM_dupallocN(sce->r.avicodecdata);
            scen->r.avicodecdata->lpFormat = MEM_dupallocN(scen->r.avicodecdata->lpFormat);
            scen->r.avicodecdata->lpParms = MEM_dupallocN(scen->r.avicodecdata->lpParms);
      }

      // make a private copy of the qtcodecdata

      if (sce->r.qtcodecdata) {
            scen->r.qtcodecdata = MEM_dupallocN(sce->r.qtcodecdata);
            scen->r.qtcodecdata->cdParms = MEM_dupallocN(scen->r.qtcodecdata->cdParms);
      }

      return scen;
}

void do_info_buttons(unsigned short event)
{
      bScreen *sc, *oldscreen;
      Scene *sce, *sce1;
      ScrArea *sa;
      int nr;

      switch(event) {
      case B_INFOSCR:         /* menu select screen */

            if( G.curscreen->screennr== -2) {
                  if(curarea->winy <50) {
                        sa= closest_bigger_area();
                        areawinset(sa->win);
                  }
                  activate_databrowse((ID *)G.curscreen, ID_SCR, 0, B_INFOSCR,
                                                                  &G.curscreen->screennr, do_info_buttons);
                  return;
            }
            if( G.curscreen->screennr < 0) return;

            sc= G.main->screen.first;
            nr= 1;
            while(sc) {
                  if(nr==G.curscreen->screennr) {
                        if(is_allowed_to_change_screen(sc)) setscreen(sc);
                        else error("Unable to perform function in EditMode");
                        break;
                  }
                  nr++;
                  sc= sc->id.next;
            }
            /* last item: NEW SCREEN */
            if(sc==0) {
                  duplicate_screen();
            }
            break;
      case B_INFODELSCR:
/*do this event only with buttons, so it can never be called with full-window*/

            if(G.curscreen->id.prev) sc= G.curscreen->id.prev;
            else if(G.curscreen->id.next) sc= G.curscreen->id.next;
            else return;
            if(okee("Delete current screen")) {
                  /* find new G.curscreen */

                  oldscreen= G.curscreen;
                  setscreen(sc);          /* this test if sc has a full */
                  unlink_screen(oldscreen);
                  free_libblock(&G.main->screen, oldscreen);
            }
            scrarea_queue_headredraw(curarea);

            break;
      case B_INFOSCE:         /* menu select scene */

            if( G.obedit) {
                  exit_editmode(2);
            }
            if( G.curscreen->scenenr== -2) {
                  if(curarea->winy <50) {
                        sa= closest_bigger_area();
                        areawinset(sa->win);
                  }
                  activate_databrowse((ID *)G.scene, ID_SCE, 0, B_INFOSCE,
                                                                  &G.curscreen->scenenr, do_info_buttons);
                  return;
            }
            if( G.curscreen->scenenr < 0) return;

            sce= G.main->scene.first;
            nr= 1;
            while(sce) {
                  if(nr==G.curscreen->scenenr) {
                        if(sce!=G.scene) set_scene(sce);
                        break;
                  }
                  nr++;
                  sce= sce->id.next;
            }
            /* last item: NEW SCENE */
            if(sce==0) {
                  nr= pupmenu("Add scene%t|Empty|Link Objects|Link ObData|Full Copy");
                  if(nr<= 0) return;
                  if(nr==1) {
                        sce= add_scene(G.scene->id.name+2);
                        sce->r= G.scene->r;
#ifdef _WIN32
                        if (sce->r.avicodecdata) {
                              sce->r.avicodecdata = MEM_dupallocN(G.scene->r.avicodecdata);
                              sce->r.avicodecdata->lpFormat = MEM_dupallocN(G.scene->r.avicodecdata->lpFormat);
                              sce->r.avicodecdata->lpParms = MEM_dupallocN(G.scene->r.avicodecdata->lpParms);
                        }
#endif
#ifdef WITH_QUICKTIME
                        if (sce->r.qtcodecdata) {
                              sce->r.qtcodecdata = MEM_dupallocN(G.scene->r.qtcodecdata);
                              sce->r.qtcodecdata->cdParms = MEM_dupallocN(G.scene->r.qtcodecdata->cdParms);
                        }
#endif
                  }
                  else sce= copy_scene(G.scene, nr-2);

                  set_scene(sce);
            }
            BIF_preview_changed(G.buts);

            break;
      case B_INFODELSCE:

            if(G.scene->id.prev) sce= G.scene->id.prev;
            else if(G.scene->id.next) sce= G.scene->id.next;
            else return;
            if(okee("Delete current scene")) {

                  /* check all sets */
                  sce1= G.main->scene.first;
                  while(sce1) {
                        if(sce1->set == G.scene) sce1->set= 0;
                        sce1= sce1->id.next;
                  }

                  /* check all sequences */
                  clear_scene_in_allseqs(G.scene);

                  /* al screens */
                  sc= G.main->screen.first;
                  while(sc) {
                        if(sc->scene == G.scene) sc->scene= sce;
                        sc= sc->id.next;
                  }
                  free_libblock(&G.main->scene, G.scene);
                  set_scene(sce);
            }

            break;
      }
}

static void check_packAll()
{
      // first check for dirty images
      Image *ima;

      ima = G.main->image.first;
      while (ima) {
            if (ima->ibuf && (ima->ibuf->userflags &= IB_BITMAPDIRTY)) {
                  break;
            }
            ima= ima->id.next;
            }
      
      if (ima == 0 || okee("Some images are painted on. These changes will be lost. Continue ?")) {
            packAll();
            G.fileflags |= G_AUTOPACK;
      }
}

int write_runtime(char *str, char *exename)
{
      char *freestr= NULL;
      char *ext = 0;

#ifdef _WIN32
      ext = ".exe";
#endif

#ifdef __APPLE__
      ext = ".app";
#endif
      if (ext && (!BLI_testextensie(str, ext))) {
            freestr= MEM_mallocN(strlen(str) + strlen(ext) + 1, "write_runtime_check");
            strcpy(freestr, str);
            strcat(freestr, ext);
            str= freestr;
      }

      if (!BLI_exists(str) || saveover(str))
            BLO_write_runtime(str, exename);

      if (freestr)
            MEM_freeN(freestr);
 
      return 0;
}

static void write_runtime_check_dynamic(char *str) 
{
      write_runtime(str, "blenderdynplayer.exe");
}

static void write_runtime_check(char *str) 
{
      char player[128];

      strcpy(player, "blenderplayer");

#ifdef _WIN32
      strcat(player, ".exe");
#endif

#ifdef __APPLE__
      strcat(player, ".app");
#endif

      write_runtime(str, player);
}
/* end keyed functions */

/************************** MAIN MENU *****************************/
/************************** FILE *****************************/

void do_info_file_optionsmenu(void *arg, int event)
{
      G.fileflags ^= (1 << event);

      // allqueue(REDRAWINFO, 0);
}

#if GAMEBLENDER == 1
static uiBlock *info_file_optionsmenu(void *arg_unused)
{
      uiBlock *block;
      short yco= 0, xco = 20;

      block= uiNewBlock(&curarea->uiblocks, "runtime_options", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
      uiBlockSetButmFunc(block, do_info_file_optionsmenu, NULL);
      uiBlockSetXOfs(block,-40);    // offset to parent button
      
      /* flags are case-values */
      uiDefBut(block, BUTM, 1, "Compress File", xco, yco-=20, 100, 19, NULL, 0.0, 0.0, 0, G_FILE_COMPRESS_BIT, "Enables file compression");
/*
      uiDefBut(block, BUTM, 1, "Sign File",     xco, yco-=20, 100, 19, NULL, 0.0, 0.0, 0, G_FILE_SIGN_BIT, "Add signature to file");
      uiDefBut(block, BUTM, 1, "Lock File",     xco, yco-=20, 100, 19, NULL, 0.0, 0.0, 0, G_FILE_LOCK_BIT, "Protect the file from editing by others");
*/
      uiTextBoundsBlock(block, 50);

      /* Toggle buttons */
      
      yco= 0;
      xco -= 20;
      uiBlockSetEmboss(block, UI_EMBOSSM);
      uiBlockSetButmFunc(block, NULL, NULL);
      /* flags are defines */
      uiDefIconButI(block, ICONTOG|BIT|G_FILE_COMPRESS_BIT, 0, ICON_CHECKBOX_DEHLT, xco, yco-=20, 19, 19, &G.fileflags, 0.0, 0.0, 0, 0, "");
/*
      uiDefIconButI(block, ICONTOG|BIT|G_FILE_SIGN_BIT, 0, ICON_CHECKBOX_DEHLT, xco, yco-=20, 19, 19, &G.fileflags, 0.0, 0.0, 0, 0, "");
      uiDefIconButI(block, ICONTOG|BIT|G_FILE_LOCK_BIT, 0, ICON_CHECKBOX_DEHLT, xco, yco-=20, 19, 19, &G.fileflags, 0.0, 0.0, 0, 0, "");
*/
      uiBlockSetDirection(block, UI_RIGHT);
            
      return block;
}

static uiBlock *info_runtime_optionsmenu(void *arg_unused)
{
      uiBlock *block;
      short yco= 0, xco = 20;

      block= uiNewBlock(&curarea->uiblocks, "add_surfacemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
      uiBlockSetXOfs(block, -40);  // offset to parent button
      uiBlockSetEmboss(block, UI_EMBOSSM);

      uiDefBut(block, LABEL, 0, "Size options:",            xco, yco-=20, 114, 19, 0, 0.0, 0.0, 0, 0, "");
      uiDefButS(block, NUM, 0, "X:",            xco+19, yco-=20, 95, 19,            &G.scene->r.xplay, 10.0, 2000.0, 0, 0, "Displays current X screen/window resolution. Click to change.");
      uiDefButS(block, NUM, 0, "Y:",            xco+19, yco-=20, 95, 19, &G.scene->r.yplay, 10.0, 2000.0, 0, 0, "Displays current Y screen/window resolution. Click to change.");

      uiDefBut(block, SEPR, 0, "",        xco, yco-=4, 114, 4, NULL, 0.0, 0.0, 0, 0, "");

      uiDefBut(block, LABEL, 0, "Fullscreen options:",            xco, yco-=20, 114, 19, 0, 0.0, 0.0, 0, 0, "");
      uiDefButS(block, TOG, 0, "Fullscreen", xco + 19, yco-=20, 95, 19, &G.scene->r.fullscreen, 0.0, 0.0, 0, 0, "Starts player in a new fullscreen display");
      uiDefButS(block, NUM, 0, "Freq:",   xco+19, yco-=20, 95, 19, &G.scene->r.freqplay, 10.0, 120.0, 0, 0, "Displays clock frequency of fullscreen display. Click to change.");
      uiDefButS(block, NUM, 0, "Bits:",   xco+19, yco-=20, 95, 19, &G.scene->r.depth, 1.0, 32.0, 0, 0, "Displays bit depth of full screen display. Click to change.");

      uiDefBut(block, SEPR, 0, "",        xco, yco-=4, 114, 4, NULL, 0.0, 0.0, 0, 0, "");

      /* stereo settings */
      /* can't use any definition from the game engine here so hardcode it. Change it here when it changes there!
       * RAS_IRasterizer has definitions:
       * RAS_STEREO_NOSTEREO         1
       * RAS_STEREO_QUADBUFFERED 2
       * RAS_STEREO_ABOVEBELOW       3
       * RAS_STEREO_INTERLACED       4     future
       */
      uiDefBut(block, LABEL, 0, "Stereo options", xco, yco-=20, 114, 19, 0, 0.0, 0.0, 0, 0, "");
      uiDefButS(block, ROW, 0, "no stereo", xco+19, yco-=20, 95, 19, &(G.scene->r.stereomode), 6.0, 1.0, 0, 0, "Disables stereo");
      uiDefButS(block, ROW, 0, "h/w pageflip", xco+19, yco-=20, 95, 19, &(G.scene->r.stereomode), 6.0, 2.0, 0, 0, "Enables hardware pageflip stereo method");
      uiDefButS(block, ROW, 0, "syncdoubling", xco+19, yco-=20, 95, 19, &(G.scene->r.stereomode), 6.0, 3.0, 0, 0, "Enables syncdoubling stereo method");

      uiBlockSetDirection(block, UI_RIGHT);
      uiTextBoundsBlock(block, 50);
            
      return block;
}
#endif

static void do_info_file_importmenu(void *arg, int event)
{
      ScrArea *sa;

      if(curarea->spacetype==SPACE_INFO) {
            sa= find_biggest_area_of_type(SPACE_SCRIPT);
            if (!sa) sa= closest_bigger_area();
            areawinset(sa->win);
      }

      /* events >=4 are registered bpython scripts */
      if (event >= 4) {
            BPY_menu_do_python(PYMENU_IMPORT, event - 4);
            BIF_undo_push("Import file");
      }
      else {
            switch(event) {
                                                      
            case 0: /* DXF */
                  activate_fileselect(FILE_BLENDER, "Import DXF", G.sce, BIF_read_file);
                  break;
            case 1: /* VRML 1.0 */
                  activate_fileselect(FILE_BLENDER, "Import VRML 1.0", G.sce, BIF_read_file);
                  break;
            case 2: /* VideoScape */
                  activate_fileselect(FILE_BLENDER, "Import VideoScape", G.sce, BIF_read_file);
                  break;
            case 3: /* STL */
                  activate_fileselect(FILE_BLENDER, "Import STL", G.sce, BIF_read_file);
                  break;

            }
      }
      allqueue(REDRAWINFO, 0);
}

static uiBlock *info_file_importmenu(void *arg_unused)
{
      uiBlock *block;
      short yco = 20, menuwidth = 120;
      BPyMenu *pym;
      int i = 0;

      block= uiNewBlock(&curarea->uiblocks, "importmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
      uiBlockSetButmFunc(block, do_info_file_importmenu, NULL);
      //uiBlockSetXOfs(block, -50);  // offset to parent button
      
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "VRML 1.0...",
                   0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 1, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "DXF...",
                   0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 0, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "VideoScape...",
                   0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 2, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "STL...",
                   0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 3, "");

      uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");

      for (pym = BPyMenuTable[PYMENU_IMPORT]; pym; pym = pym->next, i++) {
            uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i+4, pym->tooltip?pym->tooltip:pym->filename);
      }

      uiBlockSetDirection(block, UI_RIGHT);
      uiTextBoundsBlock(block, 60);

      return block;
}

static void do_info_file_exportmenu(void *arg, int event)
{
      ScrArea *sa;

      if(curarea->spacetype==SPACE_INFO) {
            sa= find_biggest_area_of_type(SPACE_SCRIPT);
            if (!sa) sa= closest_bigger_area();
            areawinset(sa->win);
      }

      /* events >=4 are registered bpython scripts */
      if (event >= 4) BPY_menu_do_python(PYMENU_EXPORT, event - 4);

      else switch(event) {
                                                      
      case 0:
            write_vrml_fs();
            break;
      case 1:
            write_dxf_fs();
            break;
      case 2:
            write_videoscape_fs();
            break;
      case 3:
            write_stl_fs();
            break;
      }
      allqueue(REDRAWINFO, 0);
}

static uiBlock *info_file_exportmenu(void *arg_unused)
{
      uiBlock *block;
      short yco = 20, menuwidth = 120;
      BPyMenu *pym;
      int i = 0;

      block= uiNewBlock(&curarea->uiblocks, "exportmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
      uiBlockSetButmFunc(block, do_info_file_exportmenu, NULL);
      //uiBlockSetXOfs(block, -50);  // offset to parent button

      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "VRML 1.0...|Ctrl F2",
                   0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 0, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "DXF...|Shift F2",
                   0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 1, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Videoscape...|Alt W",
                   0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 2, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "STL...",
                   0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 3, "");

      uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");

      /* note that we acount for the 3 previous entries with i+3: */
      for (pym = BPyMenuTable[PYMENU_EXPORT]; pym; pym = pym->next, i++) {
            uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, 
                         NULL, 0.0, 0.0, 1, i+4, 
                         pym->tooltip?pym->tooltip:pym->filename);
      }


      uiBlockSetDirection(block, UI_RIGHT);
      uiTextBoundsBlock(block, 60);

      return block;
}

static void do_info_filemenu(void *arg, int event)
{
      ScrArea *sa;
      char dir[FILE_MAXDIR];
      
      if(curarea->spacetype==SPACE_INFO) {
            sa= closest_bigger_area();
            areawinset(sa->win);
      }

      /* these are no defines, easier this way, the codes are in the function below */
      switch(event) {
      case 0:
            if (okee("Erase All")) {
                  if (!BIF_read_homefile())
                        error("No file ~/.B.blend");
            }
            break;
      case 1: /* open */
            activate_fileselect(FILE_BLENDER, "Open", G.sce, BIF_read_file);
            break;
      case 2: /* reopen last */
            {
                  char *s= MEM_mallocN(strlen(G.sce) + 11 + 1, "okee_reload");
                  strcpy(s, "Open file: ");
                  strcat(s, G.sce);
                  if (okee(s)) BIF_read_file(G.sce);
                  MEM_freeN(s);
            }
            break;
      case 3: /* append */
            activate_fileselect(FILE_LOADLIB, "Load Library", G.lib, 0);
            break;
      case 4: /* save */
            strcpy(dir, G.sce);
            untitled(dir);
            activate_fileselect(FILE_BLENDER, "Save As", dir, BIF_write_file);
            break;
      case 5:
            strcpy(dir, G.sce);
            if (untitled(dir)) {
                  activate_fileselect(FILE_BLENDER, "Save As", dir, BIF_write_file);
            } else {
                  BIF_write_file(dir);
                  free_filesel_spec(dir);
            }
            break;
      case 6: /* save image */
            mainqenter(F3KEY, 1);
            break;
      case 22: /* save runtime */
            activate_fileselect(FILE_SPECIAL, "Save Runtime", "", write_runtime_check);
            break;
      case 23: /* save dynamic runtime */
            activate_fileselect(FILE_SPECIAL, "Save Dynamic Runtime", "", write_runtime_check_dynamic);
            break;
      case 24:
            BIF_screendump(0);
            break;
      case 25:
            BIF_screendump(1);
            break;
      case 10: /* pack data */
            check_packAll();
            break;
      case 11: /* unpack to current dir */
            unpackAll(PF_WRITE_LOCAL);
            G.fileflags &= ~G_AUTOPACK;
            break;
      case 12: /* unpack data */
            if (buttons_do_unpack() != RET_CANCEL) {
                  /* Clear autopack bit only if user selected one of the unpack options */
                  G.fileflags &= ~G_AUTOPACK;
            }
            break;
      case 13:
            exit_usiblender();
            break;
      case 15:    /* recover previous session */
            {
                  extern short winqueue_break; /* editscreen.c */
                  int save_over;
                  char str[FILE_MAXDIR+FILE_MAXFILE];
                  char scestr[FILE_MAXDIR+FILE_MAXFILE];
                  
                  strcpy(scestr, G.sce);  /* temporal store */
                  save_over = G.save_over;
                  BLI_make_file_string("/", str, U.tempdir, "quit.blend");
                  BKE_read_file(str, NULL);
                  G.save_over = save_over;
                  strcpy(G.sce, scestr);

                  winqueue_break= 1;      /* leave queues everywhere */
            
                  BKE_reset_undo();
                  BKE_write_undo("original");   /* save current state */
            }
            break;
      case 31: /* save default settings */
            BIF_write_homefile();
            break;
      }
      allqueue(REDRAWINFO, 0);
}

static uiBlock *info_filemenu(void *arg_unused)
{
      uiBlock *block;
      short yco=0;
      short menuwidth=120;

      block= uiNewBlock(&curarea->uiblocks, "info_filemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
      uiBlockSetButmFunc(block, do_info_filemenu, NULL);
      
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "New|Ctrl X",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Open...|F1",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reopen Last|Ctrl O",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recover Last Session",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");

      uiDefBut(block, SEPR, 0, "",                          0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");

      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save|Ctrl W",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save As...|F2",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");

      uiDefBut(block, SEPR, 0, "",                          0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");

      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Image...|F3",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Dump 3DView|Ctrl F3",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 24, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Dump Screen|Ctrl Shift F3",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
#if GAMEBLENDER == 1
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Runtime...",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
#ifdef _WIN32
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Dynamic Runtime...",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 23, "");
#endif
#endif
      uiDefBut(block, SEPR, 0, "",                          0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");

      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Default Settings|Ctrl U",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 31, "");


      uiDefBut(block, SEPR, 0, "",                          0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");

      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append...|Shift F1",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
      uiDefIconTextBlockBut(block, info_file_importmenu, NULL, ICON_RIGHTARROW_THIN, "Import", 0, yco-=20, menuwidth, 19, "");
      uiDefIconTextBlockBut(block, info_file_exportmenu, NULL, ICON_RIGHTARROW_THIN, "Export", 0, yco-=20, menuwidth, 19, "");
      
      uiDefBut(block, SEPR, 0, "",                          0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");

      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pack Data",                    0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 10, "");
//    uiDefBut(block, BUTM, 1, "Unpack Data to current dir",            0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 11, "Removes all packed files from the project and saves them to the current directory");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Unpack Data...",                     0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 12, "");

      uiDefBut(block, SEPR, 0, "",                          0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");

      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Quit Blender| Q",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");

      uiBlockSetDirection(block, UI_DOWN);
      uiTextBoundsBlock(block, 80);

      return block;
}

/**************************** ADD ******************************/

void do_info_add_meshmenu(void *arg, int event)
{

      switch(event) {         
            case 0:
                  /* Plane */
                  add_primitiveMesh(0);
                  break;
            case 1:
                  /* Cube */
                  add_primitiveMesh(1);
                  break;
            case 2:
                  /* Circle */
                  add_primitiveMesh(4);
                  break;
            case 3:
                  /* UVsphere */
                  add_primitiveMesh(11);
                  break;
            case 4:
                  /* IcoSphere */
                  add_primitiveMesh(12);
                  break;
            case 5:
                  /* Cylinder */
                  add_primitiveMesh(5);
                  break;
            case 6:
                  /* Tube */
                  add_primitiveMesh(6);
                  break;
            case 7:
                  /* Cone */
                  add_primitiveMesh(7);
                  break;
            case 8:
                  /* Grid */
                  add_primitiveMesh(10);
                  break;
            case 9:
                  /* Monkey */
                  add_primitiveMesh(13);
                  break;
            default:
                  break;
      }
      allqueue(REDRAWINFO, 0);
}

static uiBlock *info_add_meshmenu(void *arg_unused)
{
/*          static short tog=0; */
      uiBlock *block;
      short yco= 0;
      
      block= uiNewBlock(&curarea->uiblocks, "add_meshmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
      uiBlockSetButmFunc(block, do_info_add_meshmenu, NULL);
      
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Plane|",                       0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cube|",                        0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Circle|",                      0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "UVsphere",               0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "IcoSphere|",             0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cylinder|",              0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tube|",                        0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 6, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cone|",                        0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 7, "");
      uiDefIconTextBut(block, SEPR, 0, ICON_BLANK1, "",                             0, yco-=6,  160, 6,  NULL, 0.0, 0.0, 0, 0, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grid|",                        0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 8, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Monkey|",                0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 9, "");

      uiBlockSetDirection(block, UI_RIGHT);
      uiTextBoundsBlock(block, 50);
            
      return block;
}

void do_info_add_curvemenu(void *arg, int event)
{

      switch(event) {         
            case 0:
                  /* Bezier Curve */
                  add_primitiveCurve(10);
                  break;
            case 1:
                  /* Bezier Circle */
                  add_primitiveCurve(11);
                  break;
            case 2:
                  /* NURB Curve */
                  add_primitiveCurve(40);
                  break;
            case 3:
                  /* NURB Circle */
                  add_primitiveCurve(41);
                  break;
            case 4:
                  /* Path */
                  add_primitiveCurve(46);
                  break;
            default:
                  break;
      }
      allqueue(REDRAWINFO, 0);
}

static uiBlock *info_add_curvemenu(void *arg_unused)
{
/*          static short tog=0; */
      uiBlock *block;
      short yco= 0;
      
      block= uiNewBlock(&curarea->uiblocks, "add_curvemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
      uiBlockSetButmFunc(block, do_info_add_curvemenu, NULL);
      
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bezier Curve|",    0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bezier Circle|",   0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Curve|",           0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Circle",           0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Path|",                  0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");

      uiBlockSetDirection(block, UI_RIGHT);
      uiTextBoundsBlock(block, 50);
            
      return block;
}


void do_info_add_surfacemenu(void *arg, int event)
{

      switch(event) {         
            case 0:
                  /* Curve */
                  add_primitiveNurb(0);
                  break;
            case 1:
                  /* Circle */
                  add_primitiveNurb(1);
                  break;
            case 2:
                  /* Surface */
                  add_primitiveNurb(2);
                  break;
            case 3:
                  /* Tube */
                  add_primitiveNurb(3);
                  break;
            case 4:
                  /* Sphere */
                  add_primitiveNurb(4);
                  break;
            case 5:
                  /* Donut */
                  add_primitiveNurb(5);
                  break;
            default:
                  break;
      }
      allqueue(REDRAWINFO, 0);
}

static uiBlock *info_add_surfacemenu(void *arg_unused)
{
/*          static short tog=0; */
      uiBlock *block;
      short yco= 0;
      
      block= uiNewBlock(&curarea->uiblocks, "add_surfacemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
      uiBlockSetButmFunc(block, do_info_add_surfacemenu, NULL);
      
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Curve|",           0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Circle|",          0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Surface|",   0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Tube",       0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Sphere|",          0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Donut|",           0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "");
      uiBlockSetDirection(block, UI_RIGHT);
      uiTextBoundsBlock(block, 50);
            
      return block;
}

void do_info_add_metamenu(void *arg, int event)
{

      switch(event) {         
            case 0:
                  /* Ball */
                  add_primitiveMball(1);
                  break;
            case 1:
                  /* Tube */
                  add_primitiveMball(2);
                  break;
            case 2:
                  /* Plane */
                  add_primitiveMball(3);
                  break;
            case 3:
                  /* Elipsoid */
                  add_primitiveMball(4);
                  break;
            case 4:
                  /* Cube */
                  add_primitiveMball(5);
                  break;
            default:
                  break;
      }
      allqueue(REDRAWINFO, 0);
}


static uiBlock *info_add_metamenu(void *arg_unused)
{
/*          static short tog=0; */
      uiBlock *block;
      short xco= 0;
      
      block= uiNewBlock(&curarea->uiblocks, "add_metamenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
      uiBlockSetButmFunc(block, do_info_add_metamenu, NULL);
      
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,"Meta Ball|",        0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Tube|",       0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Plane|",            0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Ellipsoid|",  0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Cube|",       0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");

      uiBlockSetDirection(block, UI_RIGHT);
      uiTextBoundsBlock(block, 50);
            
      return block;
}

void do_info_add_lampmenu(void *arg, int event)
{

      switch(event) {         
            case 0: /* lamp */
                  add_objectLamp(LA_LOCAL);
                  break;
            case 1: /* sun */
                  add_objectLamp(LA_SUN);
                  break;
            case 2: /* spot */
                  add_objectLamp(LA_SPOT);
                  break;
            case 3: /* hemi */
                  add_objectLamp(LA_HEMI);
                  break;
            case 4: /* area */
                  add_objectLamp(LA_AREA);
                  break;
            case 5: /* YafRay photon lamp */
                  if (G.scene->r.renderer==R_YAFRAY)
                        add_objectLamp(LA_YF_PHOTON);
                  break;
            default:
                  break;
      }
      allqueue(REDRAWINFO, 0);
}

static uiBlock *info_add_lampmenu(void *arg_unused)
{
/*          static short tog=0; */
      uiBlock *block;
      short yco= 0;
      
      block= uiNewBlock(&curarea->uiblocks, "add_lampmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
      uiBlockSetButmFunc(block, do_info_add_lampmenu, NULL);
      
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp|",                        0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Sun|",                   0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Spot|",                        0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hemi|",                        0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Area|",                        0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
      if (G.scene->r.renderer==R_YAFRAY)
            uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Photon|",                      0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "");
      
      uiBlockSetDirection(block, UI_RIGHT);
      uiTextBoundsBlock(block, 50);
            
      return block;
}

void do_info_addmenu(void *arg, int event)
{
      switch(event) {         
            case 0:
                  /* Mesh */
                  break;
            case 1:
                  /* Curve */
                  break;
            case 2:
                  /* Surface */
                  break;
            case 3:
                  /* Metaball */
                  break;
            case 4:
                  /* Text (argument is discarded) */
                  add_primitiveFont(event);
                  break;
            case 5:
                  /* Empty */
                  add_object_draw(OB_EMPTY);
                  break;
            case 6:
                  /* Camera */
                  add_object_draw(OB_CAMERA);
                  break;
            case 7:
                  /* Lamp */
            //    add_object_draw(OB_LAMP);
                  break;
            case 8:
                  /* Armature */
                  add_primitiveArmature(OB_ARMATURE);
                  break;
            case 9:
                  /* Lattice */
                  add_object_draw(OB_LATTICE);
                  break;
            default:
                  break;
      }
      allqueue(REDRAWINFO, 0);
}


static uiBlock *info_addmenu(void *arg_unused)
{
/*          static short tog=0; */
      uiBlock *block;
      short yco= 0;

      block= uiNewBlock(&curarea->uiblocks, "addmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
      uiBlockSetButmFunc(block, do_info_addmenu, NULL);
      
      uiDefIconTextBlockBut(block, info_add_meshmenu, NULL, ICON_RIGHTARROW_THIN, "Mesh", 0, yco-=20, 120, 19, "");
      uiDefIconTextBlockBut(block, info_add_curvemenu, NULL, ICON_RIGHTARROW_THIN, "Curve", 0, yco-=20, 120, 19, "");
      uiDefIconTextBlockBut(block, info_add_surfacemenu, NULL, ICON_RIGHTARROW_THIN, "Surface", 0, yco-=20, 120, 19, "");
      uiDefIconTextBlockBut(block, info_add_metamenu, NULL, ICON_RIGHTARROW_THIN, "Meta", 0, yco-=20, 120, 19, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Text",                   0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 4, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Empty",                        0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 5, "");
      
      uiDefBut(block, SEPR, 0, "",                          0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
      
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera",                       0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 6, "");
//    uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp",                   0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 7, "");
      uiDefIconTextBlockBut(block, info_add_lampmenu, NULL, ICON_RIGHTARROW_THIN, "Lamp", 0, yco-=20, 120, 19, "");
      
      uiDefBut(block, SEPR, 0, "",                          0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
      
      /* armature needs 3d window to draw */
      //uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Armature",             0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 8, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice",                0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 9, "");

      uiBlockSetDirection(block, UI_DOWN);
      uiTextBoundsBlock(block, 80);
            
      return block;
}

/************************** GAME *****************************/

static void do_info_gamemenu(void *arg, int event)
{
      switch (event) {
      case G_FILE_ENABLE_ALL_FRAMES_BIT:
      case G_FILE_SHOW_FRAMERATE_BIT:
      case G_FILE_SHOW_DEBUG_PROPS_BIT:
      case G_FILE_AUTOPLAY_BIT:
            G.fileflags ^= (1 << event);
            break;
      default:
            ; /* ignore the rest */
      }
}

static uiBlock *info_gamemenu(void *arg_unused)
{
/*          static short tog=0; */
      uiBlock *block;
      short yco= 0;
      short menuwidth=120;
      
      block= uiNewBlock(&curarea->uiblocks, "gamemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
      uiBlockSetButmFunc(block, do_info_gamemenu, NULL);
      
      uiDefIconTextBut(block, BUTM, B_STARTGAME, ICON_BLANK1,     "Start Game|P",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
      
      uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 1, 0, "");


      if(G.fileflags & (1 << G_FILE_ENABLE_ALL_FRAMES_BIT)) {
            uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Enable All Frames",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_ENABLE_ALL_FRAMES_BIT, "");
      } else {
            uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Enable All Frames",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_ENABLE_ALL_FRAMES_BIT, "");
      }

      if(G.fileflags & (1 << G_FILE_SHOW_FRAMERATE_BIT)) {
            uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Show Framerate and Profile",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_FRAMERATE_BIT, "");
      } else {
            uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Show Framerate and Profile",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_FRAMERATE_BIT, "");
      }

      if(G.fileflags & (1 << G_FILE_SHOW_DEBUG_PROPS_BIT)) {
            uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Show Debug Properties",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_DEBUG_PROPS_BIT, "");
      } else {
            uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Show Debug Properties",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_DEBUG_PROPS_BIT, "");
      }
      
      uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 1, 0, "");

      if(G.fileflags & (1 << G_FILE_AUTOPLAY_BIT)) {
            uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Autostart",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_AUTOPLAY_BIT, "");
      } else {
            uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Autostart",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_AUTOPLAY_BIT, "");
      }

      uiBlockSetDirection(block, UI_DOWN);
      uiTextBoundsBlock(block, 50);
      
      return block;
}
/************************** TIMELINE *****************************/

static void do_info_timelinemenu(void *arg, int event)
{
      /* needed to check for valid selected objects */
      Base *base=NULL;
      Object *ob=NULL;
      //char file[FILE_MAXDIR+FILE_MAXFILE];

      base= BASACT;
      if (base) ob= base->object;

      switch(event) {
      case 1:
            /* Show Keyframes */
            if (!ob) error("Select an object before showing its keyframes");
            else set_ob_ipoflags();
            break;
      case 2:
            /* Show and select Keyframes */
            if (!ob) error("Select an object before showing and selecting its keyframes");
            else select_select_keys();
                  break;
            case 3:
            /* select next keyframe */
            if (!ob) error("Select an object before selecting its next keyframe");
            else nextkey_obipo(1);
                  break;
            case 4:
            /* select previous keyframe */
            if (!ob) error("Select an object before selecting its previous keyframe");
            else nextkey_obipo(-1);
            break;
            case 5:
            /* next keyframe */
            if (!ob) error("Select an object before going to its next keyframe");
            else movekey_obipo(1);
                  break;
            case 6:
            /* previous keyframe */
            if (!ob) error("Select an object before going to its previous keyframe");
            else movekey_obipo(-1);
            break;
      case 7:
            /* next frame */
            CFRA++;
            update_for_newframe();
            break;
            case 8:
            /* previous frame */
            CFRA--;
            if(CFRA<1) CFRA=1;
            update_for_newframe();
            break;
      case 9:
            /* forward 10 frames */
            CFRA+= 10;
            update_for_newframe();
            break;
      case 10:
            /* back 10 frames */
            CFRA-= 10;
            if(CFRA<1) CFRA=1;
            update_for_newframe();
            break;
      case 11:
            /* end frame */
            CFRA= EFRA;
            update_for_newframe();
            break;
      case 12:
            /* start frame */
            CFRA= SFRA;
            update_for_newframe();
            break;
      }
      allqueue(REDRAWINFO, 0);
}

static uiBlock *info_timelinemenu(void *arg_unused)
{
/*          static short tog=0; */
      uiBlock *block;
      short yco= 0;
      short menuwidth=120;

      block= uiNewBlock(&curarea->uiblocks, "timelinemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
      uiBlockSetButmFunc(block, do_info_timelinemenu, NULL);
      
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Keyframes|K",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show and Select Keyframes|Shift K",0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Next Keyframe|PageUp",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Previous Keyframe|PageDown",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");

      uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");

      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Next Keyframe|Ctrl PageUp",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Previous Keyframe|Ctrl PageDown",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");

      uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");

      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Next Frame|RightArrow",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Previous Frame|LeftArrow",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Forward 10 Frames|UpArrow",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Back 10 Frames|DownArrow",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");

      uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");

      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "End Frame|Shift RightArrow",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Start Frame|Shift LeftArrow",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");

      uiBlockSetDirection(block, UI_DOWN);
      uiTextBoundsBlock(block, 80);

      return block;
}

/************************** RENDER *****************************/

/* copied from buttons.c. .. probably not such a good idea!? */
static void run_playanim(char *file)
{
      extern char bprogname[];      /* usiblender.c */
      char str[FILE_MAXDIR+FILE_MAXFILE];
      int pos[2], size[2];

      calc_renderwin_rectangle(R.winpos, pos, size);

      sprintf(str, "%s -a -p %d %d \"%s\"", bprogname, pos[0], pos[1], file);
      system(str);
}

static void do_info_rendermenu(void *arg, int event)
{
      char file[FILE_MAXDIR+FILE_MAXFILE];

      extern void makeavistring(char *string);
      extern void makeqtstring (char *string);

      switch(event) {
            
      case 0:
            BIF_do_render(0);
            break;
      case 1:
            BIF_do_render(1);
            break;

            /* note: dont use select_area() for setting active areas for opengl render */
            /* its hackish and instable... code here was removed */
      
      case 4:
            BIF_toggle_render_display();
            break;
      case 5:
#ifdef WITH_QUICKTIME
            if(G.scene->r.imtype == R_QUICKTIME)
                  makeqtstring(file);
            else
#endif
                  makeavistring(file);
            if(BLI_exist(file)) {
                  run_playanim(file);
            }
            else {
                  makepicstring(file, G.scene->r.sfra);
                  if(BLI_exist(file)) {
                        run_playanim(file);
                  }
                  else error("Can't find image: %s", file);
            }
            break;
      case 6:
            /* dodgy hack turning on SHIFT key to do a proper render border select
            set_render_border(); only works when 3d window active
            
            This code copied from toolbox.c, only works when 3d window is cameraview */

            if(select_area(SPACE_VIEW3D)) {
                  mainqenter(LEFTSHIFTKEY, 1);
                  mainqenter(BKEY, 1);
                  mainqenter(BKEY, 0);
                  mainqenter(EXECUTE, 1);
                  mainqenter(LEFTSHIFTKEY, 0);
            }

            break;

            case 7:
            extern_set_butspace(F10KEY);
            break;
      }
      allqueue(REDRAWINFO, 0);
}

static uiBlock *info_rendermenu(void *arg_unused)
{
/*          static short tog=0; */
      uiBlock *block;
      short yco= 0;
      short menuwidth=120;
      
      block= uiNewBlock(&curarea->uiblocks, "rendermenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
      uiBlockSetButmFunc(block, do_info_rendermenu, NULL);
      
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Current Frame|F12",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Animation",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");

      uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");

      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Render Buffer|F11",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Rendered Animation", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");

      uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");

      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Render Border|Shift B",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");

      uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");

      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Settings|F10",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");

      uiBlockSetDirection(block, UI_DOWN);
      uiTextBoundsBlock(block, 80);

      return block;
}

/************************** HELP *****************************/

static void do_info_help_websitesmenu(void *arg, int event)
{
      BPY_menu_do_python(PYMENU_HELPWEBSITES, event);

      allqueue(REDRAWVIEW3D, 0);
}


static uiBlock *info_help_websitesmenu(void *arg_unused)
{
      uiBlock *block;
      BPyMenu *pym;
      short yco = 20, menuwidth = 120;
      int i = 0;

      block= uiNewBlock(&curarea->uiblocks, "info_help_websitesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
      uiBlockSetButmFunc(block, do_info_help_websitesmenu, NULL);
      
      for (pym = BPyMenuTable[PYMENU_HELPWEBSITES]; pym; pym = pym->next, i++) {
            uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i, pym->tooltip?pym->tooltip:pym->filename);
      }
      
      uiBlockSetDirection(block, UI_RIGHT);
      uiTextBoundsBlock(block, 60);
            
      return block;
}

static void do_info_help_systemmenu(void *arg, int event)
{
      /* events >=10 are registered bpython scripts */
      if (event >= 10) BPY_menu_do_python(PYMENU_HELPSYSTEM, event - 10);
      else {
            switch(event) {

            case 1: /* Benchmark */
                  /* dodgy hack turning on CTRL ALT SHIFT key to do a benchmark 
                   *    rather than copying lines and lines of code from toets.c :( 
                   */
      
                  if(select_area(SPACE_VIEW3D)) {
                        mainqenter(LEFTSHIFTKEY, 1);
                        mainqenter(LEFTCTRLKEY, 1);
                        mainqenter(LEFTALTKEY, 1);
                        mainqenter(TKEY, 1);
                        mainqenter(TKEY, 0);
                        mainqenter(EXECUTE, 1);
                        mainqenter(LEFTSHIFTKEY, 0);
                        mainqenter(LEFTCTRLKEY, 0);
                        mainqenter(LEFTALTKEY, 0);
                  }
                  break;
            }
      }

      allqueue(REDRAWVIEW3D, 0);
}


static uiBlock *info_help_systemmenu(void *arg_unused)
{
      uiBlock *block;
      BPyMenu *pym;
      short yco = 20, menuwidth = 120;
      int i = 0;

      block= uiNewBlock(&curarea->uiblocks, "info_help_systemmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
      uiBlockSetButmFunc(block, do_info_help_systemmenu, NULL);
      
      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Benchmark",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
      
      for (pym = BPyMenuTable[PYMENU_HELPSYSTEM]; pym; pym = pym->next, i++) {
            uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i+10, pym->tooltip?pym->tooltip:pym->filename);
      }
      
      uiBlockSetDirection(block, UI_RIGHT);
      uiTextBoundsBlock(block, 60);
            
      return block;
}

static void do_info_helpmenu(void *arg, int event)
{
      ScrArea *sa;

      if(curarea->spacetype==SPACE_INFO) {
            sa= find_biggest_area_of_type(SPACE_SCRIPT);
            if (!sa) sa= closest_bigger_area();
            areawinset(sa->win);
      }

      /* events >=10 are registered bpython scripts */
      if (event >= 10) BPY_menu_do_python(PYMENU_HELP, event - 10);
      else {
            switch(event) {
                                                      
            case 0: /* About Blender */
                  break;
            }
      }

      allqueue(REDRAWINFO, 0);
}

static uiBlock *info_helpmenu(void *arg_unused)
{
/*          static short tog=0; */
      uiBlock *block;
      short yco= 0;
      short menuwidth=120;
      BPyMenu *pym;
      int i = 0;
      
      block= uiNewBlock(&curarea->uiblocks, "info_helpmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
      uiBlockSetButmFunc(block, do_info_helpmenu, NULL);
      
      uiDefIconTextBut(block, BUTM, B_SHOWSPLASH, ICON_BLANK1, "About Blender...",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
      
      uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
      
      for (pym = BPyMenuTable[PYMENU_HELP]; pym; pym = pym->next, i++) {
            uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i+10, pym->tooltip?pym->tooltip:pym->filename);
      }
      
      uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
      
      uiDefIconTextBlockBut(block, info_help_websitesmenu, NULL, ICON_RIGHTARROW_THIN, "Websites", 0, yco-=20, 120, 19, "");
      
      uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
      
      uiDefIconTextBlockBut(block, info_help_systemmenu, NULL, ICON_RIGHTARROW_THIN, "System", 0, yco-=20, 120, 19, "");

      uiBlockSetDirection(block, UI_DOWN);
      uiTextBoundsBlock(block, 80);

      return block;
}

/************************** END MAIN MENU *****************************/
/* ugly global yes, for renderwin.c to write to */
char info_time_str[32]="";

static void info_text(int x, int y)
{
      Object *ob;
      extern float hashvectf[];
      extern int mem_in_use;
      unsigned int swatch_color;
      float fac1, fac2, fac3;
      char infostr[300];
      char *headerstr;
      int hsize;

      if(G.obedit) {
            sprintf(infostr,"Ve:%d-%d | Fa:%d-%d | Mem:%.2fM ",
            G.totvertsel, G.totvert, G.totfacesel, G.totface,
            (mem_in_use>>10)/1024.0);
      }
      else {
            sprintf(infostr,"Ve:%d | Fa:%d | Ob:%d-%d | La:%d | Mem:%.2fM | Time:%s | ",
                  G.totvert, G.totface, G.totobj, G.totobjsel, G.totlamp,  (mem_in_use>>10)/1024.0, info_time_str);
      }
      ob= OBACT;
      if(ob) {
            strcat(infostr, ob->id.name+2);
      }

      if (g_progress_bar && g_progress_info) {
            headerstr= g_progress_info;
      } else {
            headerstr= versionstr; 
      }

      if    (g_progress_bar) {
            hsize = 4 + (138.0 * g_done);
            fac1 = 0.5 * g_done; // do some rainbow colours on progress
            fac2 = 1.0;
            fac3 = 0.9;
      } else {
            hsize= 30+BIF_GetStringWidth(G.font, headerstr, (U.transopts & USER_TR_BUTTONS));

            /* promise! Never change these lines again! (zr & ton did!) */
            fac1= fabs(hashvectf[ 2*G.version+4]);
            fac2= 0.5+0.1*hashvectf[ G.version+3];
            fac3= 0.7;
      }
      
      swatch_color= hsv_to_cpack(fac1, fac2, fac3);

      cpack( swatch_color );
      glRecti(x-24,  y-6,  x-30+hsize,    y+14);

      glColor3ub(0, 0, 0);

      glRasterPos2i(x, y);

      BIF_DrawString(G.font, headerstr, (U.transopts & USER_TR_MENUS));
      hsize= BIF_GetStringWidth(G.font, headerstr, (U.transopts & USER_TR_BUTTONS));
      
      glRasterPos2i(x+hsize+10,     y);

      BIF_DrawString(G.font, infostr, (U.transopts & USER_TR_MENUS));
}

void info_buttons(void)
{
      uiBlock *block;
      short xco= 42;
      int xmax;

      block= uiNewBlock(&curarea->uiblocks, "header info", UI_EMBOSSN, UI_HELV, curarea->headwin);

      if(area_is_active_area(curarea)) uiBlockSetCol(block, TH_HEADER);
      else uiBlockSetCol(block, TH_HEADERDESEL);
      
      if(curarea->flag & HEADER_NO_PULLDOWN) {
            uiDefIconButS(block, TOG|BIT|0, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_RIGHT,
                        xco,2,XIC,YIC-2,
                        &(curarea->flag), 0, 0, 0, 0, "Enables display of pulldown menus");
      } else {
            uiDefIconButS(block, TOG|BIT|0, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_DOWN,
                        xco,2,XIC,YIC-2,
                        &(curarea->flag), 0, 0, 0, 0, "Hides pulldown menus");
      }
      xco+=XIC;

      if((curarea->flag & HEADER_NO_PULLDOWN)==0) {
      
            uiBlockSetEmboss(block, UI_EMBOSSP);

            /* the 'xmax - 3' rather than xmax is to prevent some weird flickering where the highlighted
             * menu is drawn wider than it should be. The ypos of -1 is to make it properly fill the
             * height of the header */
            xmax= GetButStringLength("File");
            uiDefPulldownBut(block, info_filemenu, NULL, "File",  xco, -1, xmax-3, 22, "");
            xco+= xmax;

            xmax= GetButStringLength("Add");
            uiDefPulldownBut(block, info_addmenu, NULL, "Add",    xco, -1, xmax-3, 22, "");
            xco+= xmax;

            xmax= GetButStringLength("Timeline");
            uiDefPulldownBut(block, info_timelinemenu, NULL, "Timeline",      xco, -1, xmax-3, 22, "");
            xco+= xmax;

            xmax= GetButStringLength("Game");
            uiDefPulldownBut(block, info_gamemenu, NULL, "Game",  xco, -1, xmax-3, 22, "");
            xco+= xmax;

            xmax= GetButStringLength("Render");
            uiDefPulldownBut(block, info_rendermenu, NULL, "Render",    xco, -1, xmax-3, 22, "");
            xco+= xmax;

            xmax= GetButStringLength("Help");
            uiDefPulldownBut(block, info_helpmenu, NULL, "Help",  xco, -1, xmax-3, 22, "");
            xco+= xmax;

      }

      /* pack icon indicates a packed file */
      
      if (G.fileflags & G_AUTOPACK) {
            uiBlockSetEmboss(block, UI_EMBOSSN);
            uiDefIconBut(block, LABEL, 0, ICON_PACKAGE, xco, 0, XIC, YIC, &G.fileflags, 0.0, 0.0, 0, 0, "Indicates this is a Packed file. See File menu.");
            xco += XIC;
      }

      if (curarea->full == 0) {
            curarea->butspacetype= SPACE_INFO;
            uiBlockSetEmboss(block, UI_EMBOSS);
            uiDefIconTextButC(block, ICONTEXTROW,B_NEWSPACE, ICON_VIEW3D, windowtype_pup(), 8,0,XIC+10,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Displays Current Window Type. Click for menu of available types.");
            
            /* STD SCREEN BUTTONS */
            xco= std_libbuttons(block, xco, 0, 0, NULL, B_INFOSCR, (ID *)G.curscreen, 0, &G.curscreen->screennr, 1, 1, B_INFODELSCR, 0, 0);
            
            xco +=8;
      
            /* STD SCENE BUTTONS */
            xco= std_libbuttons(block, xco, 0, 0, NULL, B_INFOSCE, (ID *)G.scene, 0, &G.curscreen->scenenr, 1, 1, B_INFODELSCE, 0, 0);
      }
      else xco= 430;
      
      info_text(xco+24, 6);
      
      uiBlockSetEmboss(block, UI_EMBOSSN);
      uiDefIconBut(block, BUT, B_SHOWSPLASH, ICON_BLENDER, xco+2, 0,XIC,YIC, 0, 0, 0, 0, 0, "Click to display Splash Screen");

      /* always do as last */
      curarea->headbutlen= xco+2*XIC;

#ifdef _WIN32     // FULLSCREEN
      if(U.uiflag & USER_FLIPFULLSCREEN) {
            uiDefIconBut(block, BUT, B_FLIPFULLSCREEN, ICON_WINDOW_WINDOW,
                        (short)(curarea->winx-XIC-5), 0,XIC,YIC,
                        0, 0, 0, 0, 0, "Toggles Blender to fullscreen mode");/* dir       */
      } else {
            uiDefIconBut(block, BUT, B_FLIPFULLSCREEN, ICON_WINDOW_FULLSCREEN,
                        (short)(curarea->winx-XIC-5), 0,XIC,YIC,
                        0, 0, 0, 0, 0, "Toggles Blender to fullscreen mode");/* dir       */
      }
#endif
      
      uiDrawBlock(block);
}

Generated by  Doxygen 1.6.0   Back to index