91e3a53fbb5380e62df61f8d97c6391bc8785645
[blender-staging.git] / source / blender / src / header_info.c
1 /**
2  * header_info.c oct-2003
3  *
4  * Functions to draw the "User Preferences" window header
5  * and handle user events sent to it.
6  * 
7  * $Id$
8  *
9  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License
13  * as published by the Free Software Foundation; either version 2
14  * of the License, or (at your option) any later version. The Blender
15  * Foundation also sells licenses for use in proprietary software under
16  * the Blender License.  See http://www.blender.org/BL/ for information
17  * about this.
18  *
19  * This program is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License
25  * along with this program; if not, write to the Free Software Foundation,
26  * Inc., 59 Temple Place - Suite 330, Boston, MA        02111-1307, USA.
27  *
28  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
29  * All rights reserved.
30  *
31  * The Original Code is: all of this file.
32  *
33  * Contributor(s): none yet.
34  *
35  * ***** END GPL/BL DUAL LICENSE BLOCK *****
36  */
37  
38 #include <math.h>
39 #include <stdlib.h>
40 #include <string.h>
41
42 #ifdef HAVE_CONFIG_H
43 #include <config.h>
44 #endif
45
46 #ifdef WIN32
47 #include "BLI_winstuff.h"
48 #endif
49
50 #include "BMF_Api.h"
51 #include "BIF_language.h"
52 #ifdef INTERNATIONAL
53 #include "FTF_Api.h"
54 #endif
55
56 #include "DNA_ID.h"
57 #include "DNA_image_types.h"
58 #include "DNA_object_types.h"
59 #include "DNA_packedFile_types.h"
60 #include "DNA_scene_types.h"
61 #include "DNA_screen_types.h"
62 #include "DNA_space_types.h"
63 #include "DNA_userdef_types.h"
64 #include "DNA_world_types.h"
65
66 #include "BDR_editcurve.h"
67 #include "BDR_editmball.h"
68 #include "BDR_editobject.h"
69
70 #include "BIF_editarmature.h"
71 #include "BIF_editfont.h"
72 #include "BIF_editmesh.h"
73 #include "BIF_gl.h"
74 #include "BIF_interface.h"
75 #include "BIF_language.h"
76 #include "BIF_mainqueue.h"
77 #include "BIF_previewrender.h"
78 #include "BIF_renderwin.h"
79 #include "BIF_resources.h"
80 #include "BIF_screen.h"
81 #include "BIF_space.h"
82 #include "BIF_toets.h"
83 #include "BIF_toolbox.h"
84 #include "BIF_usiblender.h"
85 #include "BIF_drawscene.h"
86
87 #include "BKE_blender.h"
88 #include "BKE_exotic.h"
89 #include "BKE_global.h"
90 #include "BKE_image.h"
91 #include "BKE_library.h"
92 #include "BKE_main.h"
93 #include "BKE_packedFile.h"
94 #include "BKE_scene.h"
95 #include "BKE_world.h"
96
97 #include "BLI_arithb.h"
98 #include "BLI_blenlib.h"
99 #include "BLO_writefile.h"
100
101 #include "BPY_extern.h"
102
103 #include "BSE_editipo.h"
104 #include "BSE_filesel.h"
105 #include "BSE_headerbuttons.h"
106 #include "BSE_sequence.h"
107
108 #include "IMB_imbuf_types.h"
109
110 #include "MEM_guardedalloc.h"
111
112 #include "render.h" // for R - should use BKE_bad_level_calls.h instead?
113
114 #include "blendef.h"
115 #include "mydevice.h"
116
117 extern char versionstr[]; /* from blender.c */
118
119 /*----------------------------------*/
120 /* Progress bar vars and functions: */
121
122 /* strubi shamelessly abused the status line as a progress bar...
123  * feel free to kill him after release */
124
125 static int g_progress_bar = 0;
126 static char *g_progress_info = 0;
127 static float g_done;
128
129 int start_progress_bar(void)
130 {
131         g_progress_bar = 1;
132         return 1;               // we never fail (yet)
133 }
134
135 void end_progress_bar(void)
136 {
137         g_progress_bar = 0;
138 }
139
140 static void update_progress_bar(float done, char *info)
141 {
142         g_done = done;
143         g_progress_info = info;
144 }
145
146 /** Progress bar
147         'done': a value between 0.0 and 1.0, showing progress
148         'info': a info text what is currently being done
149
150         Make sure that the progress bar is always called with:
151         done = 0.0 first
152                 and
153         done = 1.0 last -- or alternatively use:
154
155         start_progressbar();
156         do_stuff_and_callback_progress_bar();
157         end_progressbar();
158 */
159
160 int progress_bar(float done, char *busy_info)
161 {
162         ScrArea *sa;
163         short val; 
164
165         /* User break (ESC) */
166         while (qtest()) {
167                 if (extern_qread(&val) == ESCKEY) 
168                         return 0;
169         }
170         if (done == 0.0) {
171                 start_progress_bar();
172         } else if (done > 0.99) {
173                 end_progress_bar();
174         }
175
176         sa= G.curscreen->areabase.first;
177         while(sa) {
178                 if (sa->spacetype == SPACE_INFO) {
179                         update_progress_bar(done, busy_info);
180
181                         curarea = sa;
182
183                         scrarea_do_headdraw(curarea);
184                         areawinset(curarea->win);
185                         sa->head_swap= WIN_BACK_OK;
186                         screen_swapbuffers();
187                 }
188                 sa = sa->next;
189         }
190         return 1;
191 }
192 /* -- End of progress bar definitions ------- */
193
194 extern char videosc_dir[];      /* exotic.c */
195
196 void write_videoscape_fs()
197 {
198         if(G.obedit) {
199                 error("Can't save Videoscape. Press TAB to leave EditMode");
200         }
201         else {
202                 if(videosc_dir[0]==0) strcpy(videosc_dir, G.sce);
203                 activate_fileselect(FILE_SPECIAL, "SAVE VIDEOSCAPE", videosc_dir,
204                                                                                 write_videoscape);
205         }
206 }
207
208 void write_vrml_fs()
209 {
210         if(G.obedit) {
211                 error("Can't save VRML. Press TAB to leave EditMode");
212         }
213         else {
214                 if(videosc_dir[0]==0) strcpy(videosc_dir, G.sce);
215         
216                 activate_fileselect(FILE_SPECIAL, "SAVE VRML1", videosc_dir, write_vrml);
217         }  
218 }
219
220 void write_dxf_fs()
221 {
222         if(G.obedit) {
223                 error("Can't save DXF. Press TAB to leave EditMode");
224         }
225         else {
226
227                 if(videosc_dir[0]==0) strcpy(videosc_dir, G.sce);
228
229                 activate_fileselect(FILE_SPECIAL, "SAVE DXF", videosc_dir, write_dxf);  
230         }
231 }
232 /* ------------ */
233
234 int buttons_do_unpack()
235 {
236         int how;
237         char menu[2048];
238         char line[128];
239         int ret_value = RET_OK, count = 0;
240
241         count = countPackedFiles();
242
243         if (count) {
244                 if (count == 1) {
245                         sprintf(menu, "Unpack 1 file%%t");
246                 } else {
247                         sprintf(menu, "Unpack %d files%%t", count);
248                 }
249                 
250                 sprintf(line, "|Use files in current directory (create when necessary)%%x%d", PF_USE_LOCAL);
251                 strcat(menu, line);
252         
253                 sprintf(line, "|Write files to current directory (overwrite existing files)%%x%d", PF_WRITE_LOCAL);
254                 strcat(menu, line);
255         
256                 sprintf(line, "|%%l|Use files in original location (create when necessary)%%x%d", PF_USE_ORIGINAL);
257                 strcat(menu, line);
258         
259                 sprintf(line, "|Write files to original location (overwrite existing files)%%x%d", PF_WRITE_ORIGINAL);
260                 strcat(menu, line);
261         
262                 sprintf(line, "|%%l|Disable AutoPack, keep all packed files %%x%d", PF_KEEP);
263                 strcat(menu, line);
264         
265                 sprintf(line, "|Ask for each file %%x%d", PF_ASK);
266                 strcat(menu, line);
267                 
268                 how = pupmenu(menu);
269                 
270                 if(how != -1) {
271                         if (how != PF_KEEP) {
272                                 unpackAll(how);
273                         }
274                         G.fileflags &= ~G_AUTOPACK;
275                 } else {
276                         ret_value = RET_CANCEL;
277                 }
278         } else {
279                 pupmenu("No packed files. Autopack disabled");
280         }
281         
282         return (ret_value);
283 }
284
285 /* here, because of all creator stuff */
286
287 Scene *copy_scene(Scene *sce, int level)
288 {
289         /* level 0: al objects shared
290          * level 1: al object-data shared
291          * level 2: full copy
292          */
293         Scene *scen;
294         Base *base, *obase;
295
296         /* level 0 */
297         scen= copy_libblock(sce);
298         duplicatelist(&(scen->base), &(sce->base));
299         
300         clear_id_newpoins();
301         
302         id_us_plus((ID *)scen->world);
303         id_us_plus((ID *)scen->set);
304
305         scen->ed= 0;
306         scen->radio= 0;
307
308         obase= sce->base.first;
309         base= scen->base.first;
310         while(base) {
311                 base->object->id.us++;
312                 if(obase==sce->basact) scen->basact= base;
313
314                 obase= obase->next;
315                 base= base->next;
316         }
317
318         if(level==0) return scen;
319
320         /* level 1 */
321         G.scene= scen;
322         single_object_users(0);
323
324         /*      camera */
325         ID_NEW(G.scene->camera);
326
327         /* level 2 */
328         if(level>=2) {
329                 if(scen->world) {
330                         scen->world->id.us--;
331                         scen->world= copy_world(scen->world);
332                 }
333                 single_obdata_users(0);
334                 single_mat_users_expand();
335                 single_tex_users_expand();
336         }
337
338         clear_id_newpoins();
339
340         BPY_copy_scriptlink(&sce->scriptlink);
341
342         // make a private copy of the avicodecdata
343
344         if (sce->r.avicodecdata) {
345
346                 scen->r.avicodecdata = MEM_dupallocN(sce->r.avicodecdata);
347                 scen->r.avicodecdata->lpFormat = MEM_dupallocN(scen->r.avicodecdata->lpFormat);
348                 scen->r.avicodecdata->lpParms = MEM_dupallocN(scen->r.avicodecdata->lpParms);
349         }
350
351         // make a private copy of the qtcodecdata
352
353         if (sce->r.qtcodecdata) {
354                 scen->r.qtcodecdata = MEM_dupallocN(sce->r.qtcodecdata);
355                 scen->r.qtcodecdata->cdParms = MEM_dupallocN(scen->r.qtcodecdata->cdParms);
356         }
357
358         return scen;
359 }
360
361 void do_info_buttons(unsigned short event)
362 {
363         bScreen *sc, *oldscreen;
364         Scene *sce, *sce1;
365         ScrArea *sa;
366         int nr;
367
368         switch(event) {
369
370         case B_INFOSCR:         /* menu select screen */
371
372                 if( G.curscreen->screennr== -2) {
373                         if(curarea->winy <50) {
374                                 sa= closest_bigger_area();
375                                 areawinset(sa->win);
376                         }
377                         activate_databrowse((ID *)G.curscreen, ID_SCR, 0, B_INFOSCR,
378                                                                                         &G.curscreen->screennr, do_info_buttons);
379                         return;
380                 }
381                 if( G.curscreen->screennr < 0) return;
382
383                 sc= G.main->screen.first;
384                 nr= 1;
385                 while(sc) {
386                         if(nr==G.curscreen->screennr) {
387                                 if(is_allowed_to_change_screen(sc)) setscreen(sc);
388                                 else error("Unable to perform function in EditMode");
389                                 break;
390                         }
391                         nr++;
392                         sc= sc->id.next;
393                 }
394                 /* last item: NEW SCREEN */
395                 if(sc==0) {
396                         duplicate_screen();
397                 }
398                 break;
399         case B_INFODELSCR:
400 /*do this event only with buttons, so it can never be called with full-window*/
401
402                 if(G.curscreen->id.prev) sc= G.curscreen->id.prev;
403                 else if(G.curscreen->id.next) sc= G.curscreen->id.next;
404                 else return;
405                 if(okee("Delete current screen")) {
406                         /* find new G.curscreen */
407
408                         oldscreen= G.curscreen;
409                         setscreen(sc);          /* this test if sc has a full */
410                         unlink_screen(oldscreen);
411                         free_libblock(&G.main->screen, oldscreen);
412                 }
413                 scrarea_queue_headredraw(curarea);
414
415                 break;
416         case B_INFOSCE:         /* menu select scene */
417
418                 if( G.obedit) {
419                         error("Unable to perform function in EditMode");
420                         return;
421                 }
422                 if( G.curscreen->scenenr== -2) {
423                         if(curarea->winy <50) {
424                                 sa= closest_bigger_area();
425                                 areawinset(sa->win);
426                         }
427                         activate_databrowse((ID *)G.scene, ID_SCE, 0, B_INFOSCE,
428                                                                                         &G.curscreen->scenenr, do_info_buttons);
429                         return;
430                 }
431                 if( G.curscreen->scenenr < 0) return;
432
433                 sce= G.main->scene.first;
434                 nr= 1;
435                 while(sce) {
436                         if(nr==G.curscreen->scenenr) {
437                                 if(sce!=G.scene) set_scene(sce);
438                                 break;
439                         }
440                         nr++;
441                         sce= sce->id.next;
442                 }
443                 /* last item: NEW SCENE */
444                 if(sce==0) {
445                         nr= pupmenu("Add scene%t|Empty|Link Objects|Link ObData|Full Copy");
446                         if(nr<= 0) return;
447                         if(nr==1) {
448                                 sce= add_scene(G.scene->id.name+2);
449                                 sce->r= G.scene->r;
450 #ifdef _WIN32
451                                 if (sce->r.avicodecdata) {
452                                         sce->r.avicodecdata = MEM_dupallocN(G.scene->r.avicodecdata);
453                                         sce->r.avicodecdata->lpFormat = MEM_dupallocN(G.scene->r.avicodecdata->lpFormat);
454                                         sce->r.avicodecdata->lpParms = MEM_dupallocN(G.scene->r.avicodecdata->lpParms);
455                                 }
456 #endif
457 #ifdef WITH_QUICKTIME
458                                 if (sce->r.qtcodecdata) {
459                                         sce->r.qtcodecdata = MEM_dupallocN(G.scene->r.qtcodecdata);
460                                         sce->r.qtcodecdata->cdParms = MEM_dupallocN(G.scene->r.qtcodecdata->cdParms);
461                                 }
462 #endif
463                         }
464                         else sce= copy_scene(G.scene, nr-2);
465
466                         set_scene(sce);
467                 }
468                 BIF_preview_changed(G.buts);
469
470                 break;
471         case B_INFODELSCE:
472
473                 if(G.scene->id.prev) sce= G.scene->id.prev;
474                 else if(G.scene->id.next) sce= G.scene->id.next;
475                 else return;
476                 if(okee("Delete current scene")) {
477
478                         /* check all sets */
479                         sce1= G.main->scene.first;
480                         while(sce1) {
481                                 if(sce1->set == G.scene) sce1->set= 0;
482                                 sce1= sce1->id.next;
483                         }
484
485                         /* check all sequences */
486                         clear_scene_in_allseqs(G.scene);
487
488                         /* al screens */
489                         sc= G.main->screen.first;
490                         while(sc) {
491                                 if(sc->scene == G.scene) sc->scene= sce;
492                                 sc= sc->id.next;
493                         }
494                         free_libblock(&G.main->scene, G.scene);
495                         set_scene(sce);
496                 }
497
498                 break;
499         case B_FILEMENU:
500                 tbox_setmain(9);
501                 toolbox();
502                 break;
503         }
504 }
505
506 static void check_packAll()
507 {
508         // first check for dirty images
509         Image *ima;
510
511         ima = G.main->image.first;
512         while (ima) {
513                 if (ima->ibuf && (ima->ibuf->userflags &= IB_BITMAPDIRTY)) {
514                         break;
515                 }
516                 ima= ima->id.next;
517                 }
518         
519         if (ima == 0 || okee("Some images are painted on. These changes will be lost. Continue ?")) {
520                 packAll();
521                 G.fileflags |= G_AUTOPACK;
522         }
523 }
524
525 int write_runtime(char *str, char *exename)
526 {
527         char *freestr= NULL;
528         char *ext = 0;
529
530 #ifdef _WIN32
531         ext = ".exe";
532 #endif
533
534 #ifdef __APPLE__
535         ext = ".app";
536 #endif
537         if (ext && (!BLI_testextensie(str, ext))) {
538                 freestr= MEM_mallocN(strlen(str) + strlen(ext) + 1, "write_runtime_check");
539                 strcpy(freestr, str);
540                 strcat(freestr, ext);
541                 str= freestr;
542         }
543
544         if (!BLI_exists(str) || saveover(str))
545                 BLO_write_runtime(str, exename);
546
547         if (freestr)
548                 MEM_freeN(freestr);
549  
550         return 0;
551 }
552
553 static void write_runtime_check_dynamic(char *str) 
554 {
555         write_runtime(str, "blenderdynplayer.exe");
556 }
557
558 static void write_runtime_check(char *str) 
559 {
560         char player[128];
561
562         strcpy(player, "blenderplayer");
563
564 #ifdef _WIN32
565         strcat(player, ".exe");
566 #endif
567
568 #ifdef __APPLE__
569         strcat(player, ".app");
570 #endif
571
572         write_runtime(str, player);
573 }
574 /* end keyed functions */
575
576 /************************** MAIN MENU *****************************/
577 /************************** FILE *****************************/
578
579 void do_info_file_optionsmenu(void *arg, int event)
580 {
581         G.fileflags ^= (1 << event);
582
583         // allqueue(REDRAWINFO, 0);
584 }
585
586 #if 0
587 static uiBlock *info_file_optionsmenu(void *arg_unused)
588 {
589         uiBlock *block;
590         short yco= 0, xco = 20;
591
592         block= uiNewBlock(&curarea->uiblocks, "runtime_options", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
593         uiBlockSetButmFunc(block, do_info_file_optionsmenu, NULL);
594         uiBlockSetXOfs(block,-40);      // offset to parent button
595         uiBlockSetCol(block, MENUCOL);
596         
597         /* flags are case-values */
598         uiDefBut(block, BUTM, 1, "Compress File",       xco, yco-=20, 100, 19, NULL, 0.0, 0.0, 0, G_FILE_COMPRESS_BIT, "Enables file compression");
599 /*
600         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");
601         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");
602 */
603         uiTextBoundsBlock(block, 50);
604
605         /* Toggle buttons */
606         
607         yco= 0;
608         xco -= 20;
609         uiBlockSetEmboss(block, UI_EMBOSSW);
610         uiBlockSetButmFunc(block, NULL, NULL);
611         /* flags are defines */
612         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, "");
613 /*
614         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, "");
615         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, "");
616 */
617         uiBlockSetDirection(block, UI_RIGHT);
618                 
619         return block;
620 }
621
622 static uiBlock *info_runtime_optionsmenu(void *arg_unused)
623 {
624         uiBlock *block;
625         short yco= 0, xco = 20;
626
627         block= uiNewBlock(&curarea->uiblocks, "add_surfacemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
628         uiBlockSetXOfs(block, -40);  // offset to parent button
629         uiBlockSetCol(block, MENUCOL);
630         uiBlockSetEmboss(block, UI_EMBOSSW);
631
632         uiDefBut(block, LABEL, 0, "Size options:",              xco, yco-=20, 114, 19, 0, 0.0, 0.0, 0, 0, "");
633         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.");
634         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.");
635
636         uiDefBut(block, SEPR, 0, "",            xco, yco-=4, 114, 4, NULL, 0.0, 0.0, 0, 0, "");
637
638         uiDefBut(block, LABEL, 0, "Fullscreen options:",                xco, yco-=20, 114, 19, 0, 0.0, 0.0, 0, 0, "");
639         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");
640         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.");
641         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.");
642
643         uiDefBut(block, SEPR, 0, "",            xco, yco-=4, 114, 4, NULL, 0.0, 0.0, 0, 0, "");
644
645         /* stereo settings */
646         /* can't use any definition from the game engine here so hardcode it. Change it here when it changes there!
647          * RAS_IRasterizer has definitions:
648          * RAS_STEREO_NOSTEREO           1
649          * RAS_STEREO_QUADBUFFERED 2
650          * RAS_STEREO_ABOVEBELOW         3
651          * RAS_STEREO_INTERLACED         4       future
652          */
653         uiDefBut(block, LABEL, 0, "Stereo options", xco, yco-=20, 114, 19, 0, 0.0, 0.0, 0, 0, "");
654         uiDefButS(block, ROW, 0, "no stereo", xco+19, yco-=20, 95, 19, &(G.scene->r.stereomode), 6.0, 1.0, 0, 0, "Disables stereo");
655         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");
656         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");
657
658         uiBlockSetDirection(block, UI_RIGHT);
659         uiTextBoundsBlock(block, 50);
660                 
661         return block;
662 }
663 #endif
664
665 static void do_info_file_importmenu(void *arg, int event)
666 {
667         ScrArea *sa;
668
669         if(curarea->spacetype==SPACE_INFO) {
670                 sa= closest_bigger_area();
671                 areawinset(sa->win);
672         }
673
674         /* these are no defines, easier this way, the codes are in the function below */
675         switch(event) {
676                                                                         
677         case 0:
678                 break;
679         }
680         allqueue(REDRAWINFO, 0);
681 }
682
683 static uiBlock *info_file_importmenu(void *arg_unused)
684 {
685         uiBlock *block;
686         short yco = 20, menuwidth = 120;
687
688         block= uiNewBlock(&curarea->uiblocks, "importmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
689         uiBlockSetButmFunc(block, do_info_file_importmenu, NULL);
690         //uiBlockSetXOfs(block, -50);  // offset to parent button
691         uiBlockSetCol(block, MENUCOL);
692         
693         uiDefBut(block, BUTM, 1, "Python scripts go here somehow!",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
694
695         uiBlockSetDirection(block, UI_RIGHT);
696         uiTextBoundsBlock(block, 60);
697
698         return block;
699 }
700
701 static void do_info_file_exportmenu(void *arg, int event)
702 {
703         ScrArea *sa;
704
705         if(curarea->spacetype==SPACE_INFO) {
706                 sa= closest_bigger_area();
707                 areawinset(sa->win);
708         }
709
710         /* these are no defines, easier this way, the codes are in the function below */
711         switch(event) {
712                                                                         
713         case 0:
714                 write_vrml_fs();
715                 break;
716         case 1:
717                 write_dxf_fs();
718                 break;
719         case 2:
720                 write_videoscape_fs();
721                 break;
722         }
723         allqueue(REDRAWINFO, 0);
724 }
725
726 static uiBlock *info_file_exportmenu(void *arg_unused)
727 {
728         uiBlock *block;
729         short yco = 20;
730
731         block= uiNewBlock(&curarea->uiblocks, "exportmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
732         uiBlockSetButmFunc(block, do_info_file_exportmenu, NULL);
733         //uiBlockSetXOfs(block, -50);  // offset to parent button
734         uiBlockSetCol(block, MENUCOL);
735         
736         uiDefBut(block, BUTM, 1, "VRML 1.0...|Ctrl F2",         0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 0, "");
737         uiDefBut(block, BUTM, 1, "DXF...|Shift F2",             0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 1, "");
738         uiDefBut(block, BUTM, 1, "Videoscape...|Alt W",         0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 2, "");
739
740         uiBlockSetDirection(block, UI_RIGHT);
741         uiTextBoundsBlock(block, 60);
742
743         return block;
744 }
745
746
747 static void do_info_filemenu(void *arg, int event)
748 {
749         ScrArea *sa;
750         char dir[FILE_MAXDIR];
751         
752         if(curarea->spacetype==SPACE_INFO) {
753                 sa= closest_bigger_area();
754                 areawinset(sa->win);
755         }
756
757         /* these are no defines, easier this way, the codes are in the function below */
758         switch(event) {
759         case 0:
760                 if (okee("Erase All")) {
761                         if (!BIF_read_homefile())
762                                 error("No file ~/.B.blend");
763                 }
764                 break;
765         case 1: /* open */
766                 activate_fileselect(FILE_BLENDER, "Open", G.sce, BIF_read_file);
767                 break;
768         case 2: /* reopen last */
769                 {
770                         char *s= MEM_mallocN(strlen(G.sce) + 11 + 1, "okee_reload");
771                         strcpy(s, "Open file: ");
772                         strcat(s, G.sce);
773                         if (okee(s)) BIF_read_file(G.sce);
774                         MEM_freeN(s);
775                 }
776                 break;
777         case 3: /* append */
778                 activate_fileselect(FILE_LOADLIB, "Load Library", G.lib, 0);
779                 break;
780         case 4: /* save */
781                 strcpy(dir, G.sce);
782                 untitled(dir);
783                 activate_fileselect(FILE_BLENDER, "Save As", dir, BIF_write_file);
784                 break;
785         case 5:
786                 strcpy(dir, G.sce);
787                 if (untitled(dir)) {
788                         activate_fileselect(FILE_BLENDER, "Save As", dir, BIF_write_file);
789                 } else {
790                         BIF_write_file(dir);
791                         free_filesel_spec(dir);
792                 }
793                 break;
794         case 6: /* save image */
795                 mainqenter(F3KEY, 1);
796                 break;
797 /*
798         case 20:
799                 strcpy(dir, G.sce);
800                 activate_fileselect(FILE_SPECIAL, "INSTALL LICENSE KEY", dir, loadKeyboard);
801                 break;
802         case 21:
803                 SHOW_LICENSE_KEY();
804                 break;
805 */
806         case 22: /* save runtime */
807                 activate_fileselect(FILE_SPECIAL, "Save Runtime", "", write_runtime_check);
808                 break;
809         case 23: /* save dynamic runtime */
810                 activate_fileselect(FILE_SPECIAL, "Save Dynamic Runtime", "", write_runtime_check_dynamic);
811                 break;
812         case 10: /* pack data */
813                 check_packAll();
814                 break;
815         case 11: /* unpack to current dir */
816                 unpackAll(PF_WRITE_LOCAL);
817                 G.fileflags &= ~G_AUTOPACK;
818                 break;
819         case 12: /* unpack data */
820                 if (buttons_do_unpack() != RET_CANCEL) {
821                         /* Clear autopack bit only if user selected one of the unpack options */
822                         G.fileflags &= ~G_AUTOPACK;
823                 }
824                 break;
825         case 13:
826                 exit_usiblender();
827                 break;
828         case 31: /* save default settings */
829                 BIF_write_homefile();
830                 break;
831         }
832         allqueue(REDRAWINFO, 0);
833 }
834 static uiBlock *info_filemenu(void *arg_unused)
835 {
836         uiBlock *block;
837         short yco=0;
838         short menuwidth=120;
839
840         block= uiNewBlock(&curarea->uiblocks, "info_filemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
841         uiBlockSetButmFunc(block, do_info_filemenu, NULL);
842         uiBlockSetCol(block, MENUCOL);
843         
844         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "New|Ctrl X",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
845         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Open...|F1",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
846         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reopen Last|Ctrl O",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
847
848         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
849
850         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save|Ctrl W",                            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
851         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save As...|F2",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
852
853         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
854
855         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Image...|F3",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
856         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Runtime...",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
857 #ifdef _WIN32
858         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Dynamic Runtime...",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 23, "");
859 #endif
860         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
861
862         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Default Settings|Ctrl U",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 31, "");
863
864         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
865
866         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append...|Shift F1",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
867         uiDefIconTextBlockBut(block, info_file_importmenu, NULL, ICON_RIGHTARROW_THIN, "Import", 0, yco-=20, menuwidth, 19, "");
868         uiDefIconTextBlockBut(block, info_file_exportmenu, NULL, ICON_RIGHTARROW_THIN, "Export", 0, yco-=20, menuwidth, 19, "");
869         
870         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
871
872         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pack Data",                              0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 10, "");
873 //      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");
874         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Unpack Data...",                         0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 12, "");
875
876         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
877
878         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Quit Blender| Q",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
879
880         uiBlockSetDirection(block, UI_DOWN);
881         uiTextBoundsBlock(block, 80);
882
883         return block;
884 }
885
886 /**************************** ADD ******************************/
887
888 static void do_info_add_meshmenu(void *arg, int event)
889 {
890
891         switch(event) {         
892                 case 0:
893                         /* Plane */
894                         add_primitiveMesh(0);
895                         break;
896                 case 1:
897                         /* Cube */
898                         add_primitiveMesh(1);
899                         break;
900                 case 2:
901                         /* Circle */
902                         add_primitiveMesh(4);
903                         break;
904                 case 3:
905                         /* UVsphere */
906                         add_primitiveMesh(11);
907                         break;
908                 case 4:
909                         /* IcoSphere */
910                         add_primitiveMesh(12);
911                         break;
912                 case 5:
913                         /* Cylinder */
914                         add_primitiveMesh(5);
915                         break;
916                 case 6:
917                         /* Tube */
918                         add_primitiveMesh(6);
919                         break;
920                 case 7:
921                         /* Cone */
922                         add_primitiveMesh(7);
923                         break;
924                 case 8:
925                         /* Grid */
926                         add_primitiveMesh(10);
927                         break;
928                 default:
929                         break;
930         }
931         allqueue(REDRAWINFO, 0);
932 }
933
934 static uiBlock *info_add_meshmenu(void *arg_unused)
935 {
936 /*              static short tog=0; */
937         uiBlock *block;
938         short yco= 0;
939         
940         block= uiNewBlock(&curarea->uiblocks, "add_meshmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
941         uiBlockSetButmFunc(block, do_info_add_meshmenu, NULL);
942         uiBlockSetCol(block, MENUCOL);
943         
944         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Plane|",                         0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
945         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cube|",                          0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
946         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Circle|",                                0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
947         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "UVsphere",                       0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
948         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "IcoSphere|",                     0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
949         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cylinder|",                      0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "");
950         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tube|",                          0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 6, "");
951         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cone|",                          0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 7, "");
952         uiDefIconTextBut(block, SEPR, 0, ICON_BLANK1, "",                                       0, yco-=6,      160, 6,  NULL, 0.0, 0.0, 0, 0, "");
953         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grid|",                          0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 8, "");
954
955         uiBlockSetDirection(block, UI_RIGHT);
956         uiTextBoundsBlock(block, 50);
957                 
958         return block;
959 }
960
961 static void do_info_add_curvemenu(void *arg, int event)
962 {
963
964         switch(event) {         
965                 case 0:
966                         /* Bezier Curve */
967                         add_primitiveCurve(10);
968                         break;
969                 case 1:
970                         /* Bezier Circle */
971                         add_primitiveCurve(11);
972                         break;
973                 case 2:
974                         /* NURB Curve */
975                         add_primitiveCurve(40);
976                         break;
977                 case 3:
978                         /* NURB Circle */
979                         add_primitiveCurve(41);
980                         break;
981                 case 4:
982                         /* Path */
983                         add_primitiveCurve(46);
984                         break;
985                 default:
986                         break;
987         }
988         allqueue(REDRAWINFO, 0);
989 }
990
991 static uiBlock *info_add_curvemenu(void *arg_unused)
992 {
993 /*              static short tog=0; */
994         uiBlock *block;
995         short yco= 0;
996         
997         block= uiNewBlock(&curarea->uiblocks, "add_curvemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
998         uiBlockSetButmFunc(block, do_info_add_curvemenu, NULL);
999         uiBlockSetCol(block, MENUCOL);
1000         
1001         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bezier Curve|",  0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1002         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bezier Circle|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1003         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Curve|",           0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1004         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Circle",           0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1005         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Path|",                  0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1006
1007         uiBlockSetDirection(block, UI_RIGHT);
1008         uiTextBoundsBlock(block, 50);
1009                 
1010         return block;
1011 }
1012
1013
1014 static void do_info_add_surfacemenu(void *arg, int event)
1015 {
1016
1017         switch(event) {         
1018                 case 0:
1019                         /* Curve */
1020                         add_primitiveNurb(0);
1021                         break;
1022                 case 1:
1023                         /* Circle */
1024                         add_primitiveNurb(1);
1025                         break;
1026                 case 2:
1027                         /* Surface */
1028                         add_primitiveNurb(2);
1029                         break;
1030                 case 3:
1031                         /* Tube */
1032                         add_primitiveNurb(3);
1033                         break;
1034                 case 4:
1035                         /* Sphere */
1036                         add_primitiveNurb(4);
1037                         break;
1038                 case 5:
1039                         /* Donut */
1040                         add_primitiveNurb(5);
1041                         break;
1042                 default:
1043                         break;
1044         }
1045         allqueue(REDRAWINFO, 0);
1046 }
1047
1048 static uiBlock *info_add_surfacemenu(void *arg_unused)
1049 {
1050 /*              static short tog=0; */
1051         uiBlock *block;
1052         short yco= 0;
1053         
1054         block= uiNewBlock(&curarea->uiblocks, "add_surfacemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1055         uiBlockSetButmFunc(block, do_info_add_surfacemenu, NULL);
1056         uiBlockSetCol(block, MENUCOL);
1057         
1058         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Curve|",           0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1059         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Circle|",          0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1060         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Surface|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1061         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Tube",             0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1062         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Sphere|",          0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1063         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Donut|",           0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "");
1064         uiBlockSetDirection(block, UI_RIGHT);
1065         uiTextBoundsBlock(block, 50);
1066                 
1067         return block;
1068 }
1069
1070 static void do_info_add_metamenu(void *arg, int event)
1071 {
1072
1073         switch(event) {         
1074                 case 0:
1075                         /* Ball */
1076                         add_primitiveMball(1);
1077                         break;
1078                 case 1:
1079                         /* Tube */
1080                         add_primitiveMball(2);
1081                         break;
1082                 case 2:
1083                         /* Plane */
1084                         add_primitiveMball(3);
1085                         break;
1086                 case 3:
1087                         /* Elipsoid */
1088                         add_primitiveMball(4);
1089                         break;
1090                 case 4:
1091                         /* Cube */
1092                         add_primitiveMball(5);
1093                         break;
1094                 default:
1095                         break;
1096         }
1097         allqueue(REDRAWINFO, 0);
1098 }
1099
1100
1101 static uiBlock *info_add_metamenu(void *arg_unused)
1102 {
1103 /*              static short tog=0; */
1104         uiBlock *block;
1105         short xco= 0;
1106         
1107         block= uiNewBlock(&curarea->uiblocks, "add_metamenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1108         uiBlockSetButmFunc(block, do_info_add_metamenu, NULL);
1109         uiBlockSetCol(block, MENUCOL);
1110         
1111         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,"Meta Ball|",              0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1112         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Tube|",             0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1113         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Plane|",            0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1114         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Ellipsoid|",        0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1115         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Cube|",             0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1116
1117         uiBlockSetDirection(block, UI_RIGHT);
1118         uiTextBoundsBlock(block, 50);
1119                 
1120         return block;
1121 }
1122
1123
1124 static void do_info_addmenu(void *arg, int event)
1125 {
1126
1127         switch(event) {         
1128                 case 0:
1129                         /* Mesh */
1130                         break;
1131                 case 1:
1132                         /* Curve */
1133                         break;
1134                 case 2:
1135                         /* Surface */
1136                         break;
1137                 case 3:
1138                         /* Metaball */
1139                         break;
1140                 case 4:
1141                         /* Text (argument is discarded) */
1142                         add_primitiveFont(event);
1143                         break;
1144                 case 5:
1145                         /* Empty */
1146                         add_object_draw(OB_EMPTY);
1147                         break;
1148                 case 6:
1149                         /* Camera */
1150                         add_object_draw(OB_CAMERA);
1151                         break;
1152                 case 7:
1153                         /* Lamp */
1154                         add_object_draw(OB_LAMP);
1155                         break;
1156                 case 8:
1157                         /* Armature */
1158                         add_primitiveArmature(OB_ARMATURE);
1159                         break;
1160                 case 9:
1161                         /* Lattice */
1162                         add_object_draw(OB_LATTICE);
1163                         break;
1164                 default:
1165                         break;
1166         }
1167         allqueue(REDRAWINFO, 0);
1168 }
1169
1170
1171 static uiBlock *info_addmenu(void *arg_unused)
1172 {
1173 /*              static short tog=0; */
1174         uiBlock *block;
1175         short yco= 0;
1176
1177         block= uiNewBlock(&curarea->uiblocks, "addmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1178         uiBlockSetButmFunc(block, do_info_addmenu, NULL);
1179         uiBlockSetCol(block, MENUCOL);
1180         
1181         uiDefIconTextBlockBut(block, info_add_meshmenu, NULL, ICON_RIGHTARROW_THIN, "Mesh", 0, yco-=20, 120, 19, "");
1182         uiDefIconTextBlockBut(block, info_add_curvemenu, NULL, ICON_RIGHTARROW_THIN, "Curve", 0, yco-=20, 120, 19, "");
1183         uiDefIconTextBlockBut(block, info_add_surfacemenu, NULL, ICON_RIGHTARROW_THIN, "Surface", 0, yco-=20, 120, 19, "");
1184         uiDefIconTextBlockBut(block, info_add_metamenu, NULL, ICON_RIGHTARROW_THIN, "Meta", 0, yco-=20, 120, 19, "");
1185         
1186         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
1187         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice|",                       0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 9, "");
1188         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Text|",                          0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 4, "");
1189         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Empty|",                         0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 5, "");
1190         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
1191 //      uiDefBut(block, BUTM, 1, "Armature|",                   0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 8, "Adds an Armature");
1192 //      uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
1193         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera|",                                0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 6, "");
1194         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp|",                          0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 7, "");
1195
1196         uiBlockSetDirection(block, UI_DOWN);
1197         uiTextBoundsBlock(block, 80);
1198                 
1199         return block;
1200 }
1201
1202 /************************** GAME *****************************/
1203
1204 static void do_info_gamemenu(void *arg, int event)
1205 {
1206         switch (event) {
1207         case G_FILE_ENABLE_ALL_FRAMES_BIT:
1208         case G_FILE_SHOW_FRAMERATE_BIT:
1209         case G_FILE_SHOW_DEBUG_PROPS_BIT:
1210         case G_FILE_AUTOPLAY_BIT:
1211                 G.fileflags ^= (1 << event);
1212                 break;
1213         default:
1214                 ; /* ignore the rest */
1215         }
1216 }
1217
1218 static uiBlock *info_gamemenu(void *arg_unused)
1219 {
1220 /*              static short tog=0; */
1221         uiBlock *block;
1222         short yco= 0;
1223         short menuwidth=120;
1224         
1225         block= uiNewBlock(&curarea->uiblocks, "gamemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1226         uiBlockSetButmFunc(block, do_info_gamemenu, NULL);
1227         uiBlockSetCol(block, MENUCOL);
1228         
1229         uiDefIconTextBut(block, BUTM, B_STARTGAME, ICON_BLANK1, "Start Game|P",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
1230         
1231         uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 1, 0, "");
1232
1233
1234         if(G.fileflags & (1 << G_FILE_ENABLE_ALL_FRAMES_BIT)) {
1235                 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, "");
1236         } else {
1237                                         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, "");
1238         }
1239
1240         if(G.fileflags & (1 << G_FILE_SHOW_FRAMERATE_BIT)) {
1241                 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, "");
1242         } else {
1243                 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, "");
1244         }
1245
1246         if(G.fileflags & (1 << G_FILE_SHOW_DEBUG_PROPS_BIT)) {
1247                 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, "");
1248         } else {
1249                 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, "");
1250         }
1251         
1252         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 1, 0, "");
1253
1254         if(G.fileflags & (1 << G_FILE_AUTOPLAY_BIT)) {
1255                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Autostart",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_AUTOPLAY_BIT, "");
1256         } else {
1257                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Autostart",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_AUTOPLAY_BIT, "");
1258         }
1259
1260         uiBlockSetDirection(block, UI_DOWN);
1261         uiTextBoundsBlock(block, 50);
1262         
1263         return block;
1264 }
1265 /************************** TIMELINE *****************************/
1266
1267 static void do_info_timelinemenu(void *arg, int event)
1268 {
1269         /* needed to check for valid selected objects */
1270         Base *base=NULL;
1271         Object *ob=NULL;
1272         //char file[FILE_MAXDIR+FILE_MAXFILE];
1273
1274         base= BASACT;
1275         if (base) ob= base->object;
1276
1277         switch(event) {
1278         case 1:
1279                 /* Show Keyframes */
1280                 if (!ob) error("Select an object before showing its keyframes");
1281                 else set_ob_ipoflags();
1282                 break;
1283         case 2:
1284                 /* Show and select Keyframes */
1285                 if (!ob) error("Select an object before showing and selecting its keyframes");
1286                 else select_select_keys();
1287                         break;
1288                 case 3:
1289                 /* select next keyframe */
1290                 if (!ob) error("Select an object before selecting its next keyframe");
1291                 else nextkey_obipo(1);
1292                         break;
1293                 case 4:
1294                 /* select previous keyframe */
1295                 if (!ob) error("Select an object before selecting its previous keyframe");
1296                 else nextkey_obipo(-1);
1297                 break;
1298                 case 5:
1299                 /* next keyframe */
1300                 if (!ob) error("Select an object before going to its next keyframe");
1301                 else movekey_obipo(1);
1302                         break;
1303                 case 6:
1304                 /* previous keyframe */
1305                 if (!ob) error("Select an object before going to its previous keyframe");
1306                 else movekey_obipo(-1);
1307                 break;
1308         case 7:
1309                 /* next frame */
1310                 CFRA++;
1311                 update_for_newframe();
1312                 break;
1313                 case 8:
1314                 /* previous frame */
1315                 CFRA--;
1316                 if(CFRA<1) CFRA=1;
1317                 update_for_newframe();
1318                 break;
1319         case 9:
1320                 /* forward 10 frames */
1321                 CFRA+= 10;
1322                 update_for_newframe();
1323                 break;
1324         case 10:
1325                 /* back 10 frames */
1326                 CFRA-= 10;
1327                 if(CFRA<1) CFRA=1;
1328                 update_for_newframe();
1329                 break;
1330         case 11:
1331                 /* end frame */
1332                 CFRA= EFRA;
1333                 update_for_newframe();
1334                 break;
1335         case 12:
1336                 /* start frame */
1337                 CFRA= SFRA;
1338                 update_for_newframe();
1339                 break;
1340         }
1341         allqueue(REDRAWINFO, 0);
1342 }
1343
1344 static uiBlock *info_timelinemenu(void *arg_unused)
1345 {
1346 /*              static short tog=0; */
1347         uiBlock *block;
1348         short yco= 0;
1349         short menuwidth=120;
1350
1351         block= uiNewBlock(&curarea->uiblocks, "timelinemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1352         uiBlockSetButmFunc(block, do_info_timelinemenu, NULL);
1353         uiBlockSetCol(block, MENUCOL);
1354         
1355         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Keyframes|K",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1356         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show and Select Keyframes|Shift K",0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1357         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Next Keyframe|PageUp",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1358         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Previous Keyframe|PageDown",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1359
1360         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1361
1362         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Next Keyframe|Ctrl PageUp",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1363         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Previous Keyframe|Ctrl PageDown",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1364
1365         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1366
1367         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Next Frame|RightArrow",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1368         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Previous Frame|LeftArrow",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
1369         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Forward 10 Frames|UpArrow",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1370         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Back 10 Frames|DownArrow",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
1371
1372         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1373
1374         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "End Frame|Shift RightArrow",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
1375         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Start Frame|Shift LeftArrow",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
1376
1377         uiBlockSetDirection(block, UI_DOWN);
1378         uiTextBoundsBlock(block, 80);
1379
1380         return block;
1381 }
1382
1383 /************************** RENDER *****************************/
1384
1385 /* copied from buttons.c. .. probably not such a good idea!? */
1386 static void run_playanim(char *file)
1387 {
1388         extern char bprogname[];        /* usiblender.c */
1389         char str[FILE_MAXDIR+FILE_MAXFILE];
1390         int pos[2], size[2];
1391
1392         calc_renderwin_rectangle(R.winpos, pos, size);
1393
1394         sprintf(str, "%s -a -p %d %d \"%s\"", bprogname, pos[0], pos[1], file);
1395         system(str);
1396 }
1397
1398 static void do_info_rendermenu(void *arg, int event)
1399 {
1400         char file[FILE_MAXDIR+FILE_MAXFILE];
1401
1402         extern void makeavistring(char *string);
1403         extern void makeqtstring (char *string);
1404
1405         switch(event) {
1406                 
1407         case 0:
1408                 BIF_do_render(0);
1409                 break;
1410         case 1:
1411                 BIF_do_render(1);
1412                 break;
1413         case 2:
1414                 if(select_area(SPACE_VIEW3D)) {
1415                         BIF_do_ogl_render(curarea->spacedata.first, 0 );
1416                 }
1417                         break;
1418                 case 3:
1419                 if(select_area(SPACE_VIEW3D)) {
1420                         BIF_do_ogl_render(curarea->spacedata.first, 1 );
1421                 }
1422                         break;
1423                 case 4:
1424                 BIF_toggle_render_display();
1425                 break;
1426         case 5:
1427 #ifdef WITH_QUICKTIME
1428                 if(G.scene->r.imtype == R_QUICKTIME)
1429                         makeqtstring(file);
1430                 else
1431 #endif
1432                         makeavistring(file);
1433                 if(BLI_exist(file)) {
1434                         run_playanim(file);
1435                 }
1436                 else {
1437                         makepicstring(file, G.scene->r.sfra);
1438                         if(BLI_exist(file)) {
1439                                 run_playanim(file);
1440                         }
1441                         else error("Can't find image: %s", file);
1442                 }
1443                 break;
1444         case 6:
1445                 /* dodgy hack turning on SHIFT key to do a proper render border select
1446                 strangely, set_render_border(); won't work :( 
1447                 
1448                 This code copied from toolbox.c */
1449
1450                 if(select_area(SPACE_VIEW3D)) {
1451                         mainqenter(LEFTSHIFTKEY, 1);
1452                         mainqenter(BKEY, 1);
1453                         mainqenter(BKEY, 0);
1454                         mainqenter(EXECUTE, 1);
1455                         mainqenter(LEFTSHIFTKEY, 0);
1456                 }
1457
1458                 break;
1459
1460                 case 7:
1461                 extern_set_butspace(F10KEY);
1462                 break;
1463         }
1464         allqueue(REDRAWINFO, 0);
1465 }
1466
1467 static uiBlock *info_rendermenu(void *arg_unused)
1468 {
1469 /*              static short tog=0; */
1470         uiBlock *block;
1471         short yco= 0;
1472         short menuwidth=120;
1473         
1474         block= uiNewBlock(&curarea->uiblocks, "rendermenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1475         uiBlockSetButmFunc(block, do_info_rendermenu, NULL);
1476         uiBlockSetCol(block, MENUCOL);
1477         
1478         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Current Frame|F12",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1479         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Animation",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1480
1481         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1482
1483         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "OpenGL Preview Current Frame",0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1484         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "OpenGL Preview Animation",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1485
1486         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1487
1488         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Render Buffer|F11",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1489         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Rendered Animation",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1490
1491         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1492
1493         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Render Border|Shift B",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1494
1495         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1496
1497         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Settings|F10",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1498
1499         uiBlockSetDirection(block, UI_DOWN);
1500         uiTextBoundsBlock(block, 80);
1501
1502         return block;
1503 }
1504
1505 /************************** HELP *****************************/
1506
1507 static void do_info_help_websitesmenu(void *arg, int event)
1508 {
1509         /* these are no defines, easier this way, the codes are in the function below */
1510         switch(event) {
1511         case 0: /*      */
1512
1513                 break;
1514                 }
1515         allqueue(REDRAWVIEW3D, 0);
1516 }
1517
1518
1519 static uiBlock *info_help_websitesmenu(void *arg_unused)
1520 {
1521         uiBlock *block;
1522         short yco = 20, menuwidth = 120;
1523
1524         block= uiNewBlock(&curarea->uiblocks, "info_help_websitesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1525         uiBlockSetButmFunc(block, do_info_help_websitesmenu, NULL);
1526         uiBlockSetCol(block, MENUCOL);
1527         
1528         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Blender Website *",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1529         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Blender E-shop *",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1530         
1531         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1532         
1533         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Development Community *",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1534         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "User Community *",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1535         
1536         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1537         
1538         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "...? *",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1539         
1540         uiBlockSetDirection(block, UI_RIGHT);
1541         uiTextBoundsBlock(block, 60);
1542                 
1543         return block;
1544 }
1545
1546
1547 static void do_info_helpmenu(void *arg, int event)
1548 {
1549         switch(event) {
1550                 
1551         case 0:
1552                 break;
1553         case 1:
1554                 /* dodgy hack turning on CTRL ALT SHIFT key to do a benchmark 
1555                  *      rather than copying lines and lines of code from toets.c :( 
1556                  */
1557
1558                 if(select_area(SPACE_VIEW3D)) {
1559                         mainqenter(LEFTSHIFTKEY, 1);
1560                         mainqenter(LEFTCTRLKEY, 1);
1561                         mainqenter(LEFTALTKEY, 1);
1562                         mainqenter(TKEY, 1);
1563                         mainqenter(TKEY, 0);
1564                         mainqenter(EXECUTE, 1);
1565                         mainqenter(LEFTSHIFTKEY, 0);
1566                         mainqenter(LEFTCTRLKEY, 0);
1567                         mainqenter(LEFTALTKEY, 0);
1568                 }
1569                 break;
1570         }
1571         allqueue(REDRAWINFO, 0);
1572 }
1573
1574 static uiBlock *info_helpmenu(void *arg_unused)
1575 {
1576 /*              static short tog=0; */
1577         uiBlock *block;
1578         short yco= 0;
1579         short menuwidth=120;
1580         
1581         block= uiNewBlock(&curarea->uiblocks, "info_helpmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1582         uiBlockSetButmFunc(block, do_info_helpmenu, NULL);
1583         uiBlockSetCol(block, MENUCOL);
1584         
1585         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "-- Placeholders only --",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1586         
1587         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1588         
1589         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tutorials *",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1590         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "User Manual *",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1591         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Python Scripting Reference *",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1592         
1593         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1594         
1595         uiDefIconTextBlockBut(block, info_help_websitesmenu, NULL, ICON_RIGHTARROW_THIN, "Websites", 0, yco-=20, 120, 19, "");
1596
1597         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1598
1599         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Benchmark",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1600         
1601         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1602
1603         uiDefIconTextBut(block, BUTM, B_SHOWSPLASH, ICON_BLANK1, "About Blender...",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1604         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Release Notes *",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1605         
1606         uiBlockSetDirection(block, UI_DOWN);
1607         uiTextBoundsBlock(block, 80);
1608
1609         return block;
1610 }
1611
1612 /************************** END MAIN MENU *****************************/
1613
1614 static void info_text(int x, int y)
1615 {
1616         Object *ob;
1617         extern float hashvectf[];
1618         extern int mem_in_use;
1619         unsigned int swatch_color;
1620         float fac1, fac2, fac3;
1621         char infostr[300];
1622         char *headerstr;
1623         int hsize;
1624
1625
1626         if(G.obedit) {
1627                 sprintf(infostr,"Ve:%d-%d Fa:%d-%d      Mem:%.2fM  ",
1628                 G.totvertsel, G.totvert, G.totfacesel, G.totface,
1629                 (mem_in_use>>10)/1024.0);
1630         }
1631         else {
1632                 sprintf(infostr,"Ve:%d Fa:%d    Ob:%d-%d La:%d  Mem:%.2fM         ",
1633                         G.totvert, G.totface, G.totobj, G.totobjsel, G.totlamp,  (mem_in_use>>10)/1024.0);
1634         }
1635         ob= OBACT;
1636         if(ob) {
1637                 strcat(infostr, ob->id.name+2);
1638         }
1639
1640         if      (g_progress_bar) {
1641                 hsize = 4 + (138.0 * g_done);
1642                 fac1 = 0.5 * g_done; // do some rainbow colours on progress
1643                 fac2 = 1.0;
1644                 fac3 = 0.9;
1645         } else {
1646                 hsize = 142;
1647                 /* promise! Never change these lines again! (zr & ton did!) */
1648                 fac1= fabs(hashvectf[ 2*G.version+4]);
1649                 fac2= 0.5+0.1*hashvectf[ G.version+3];
1650                 fac3= 0.7;
1651         }
1652
1653         if (g_progress_bar && g_progress_info) {
1654                 headerstr= g_progress_info;
1655         } else {
1656                 headerstr= versionstr; 
1657         }
1658         
1659         swatch_color= hsv_to_cpack(fac1, fac2, fac3);
1660
1661         cpack( swatch_color );
1662         glRecti(x-24,  y-7,  x-24+hsize,        y+16);
1663
1664         glColor3ub(0, 0, 0);
1665
1666         glRasterPos2i(x, y);
1667
1668         BIF_DrawString(G.font, headerstr, (U.transopts & TR_MENUS), 0);
1669                 
1670         glRasterPos2i(x+122,    y);
1671
1672         BIF_DrawString(G.font, infostr, (U.transopts & TR_MENUS), 0);
1673 }
1674
1675 void info_buttons(void)
1676 {
1677         uiBlock *block;
1678         short xco= 42;
1679         char naam[20];
1680         int xmax;
1681
1682         sprintf(naam, "header %d", curarea->headwin);   
1683         block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSN, UI_HELV, curarea->headwin);
1684         uiBlockSetCol(block, BUTGREY);
1685         
1686         if(U.uiflag & FLIPINFOMENU) {
1687                 uiDefIconButS(block, TOG|BIT|6, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_RIGHT,
1688                                 xco,2,XIC,YIC-2,
1689                                 &(U.uiflag), 0, 0, 0, 0, "Enables display of pulldown menus");/* dir     */
1690         } else {
1691                 uiDefIconButS(block, TOG|BIT|6, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_DOWN,
1692                                 xco,2,XIC,YIC-2,
1693                                 &(U.uiflag), 0, 0, 0, 0, "Hides pulldown menus");/* dir         */
1694         }
1695         xco+=XIC;
1696
1697         if(U.uiflag & FLIPINFOMENU) {
1698         } else {
1699                 uiBlockSetEmboss(block, UI_EMBOSSP);
1700                 if(area_is_active_area(curarea)) uiBlockSetCol(block, HEADERCOLSEL);    
1701                 else uiBlockSetCol(block, HEADERCOL);   
1702
1703                 
1704                 /* the 'xmax - 3' rather than xmax is to prevent some weird flickering where the highlighted
1705                  * menu is drawn wider than it should be. The ypos of -1 is to make it properly fill the
1706                  * height of the header */
1707                 xmax= GetButStringLength("File");
1708                 uiDefBlockBut(block, info_filemenu, NULL, "File",       xco, -1, xmax-3, 22, "");
1709                 xco+= xmax;
1710
1711                 xmax= GetButStringLength("Add");
1712                 uiDefBlockBut(block, info_addmenu, NULL, "Add", xco, -1, xmax-3, 22, "");
1713                 xco+= xmax;
1714
1715                 xmax= GetButStringLength("Timeline");
1716                 uiDefBlockBut(block, info_timelinemenu, NULL, "Timeline",       xco, -1, xmax-3, 22, "");
1717                 xco+= xmax;
1718
1719                 xmax= GetButStringLength("Game");
1720                 uiDefBlockBut(block, info_gamemenu, NULL, "Game",       xco, -1, xmax-3, 22, "");
1721                 xco+= xmax;
1722
1723                 xmax= GetButStringLength("Render");
1724                 uiDefBlockBut(block, info_rendermenu, NULL, "Render",   xco, -1, xmax-3, 22, "");
1725                 xco+= xmax;
1726
1727                 xmax= GetButStringLength("Help");
1728                 uiDefBlockBut(block, info_helpmenu, NULL, "Help",       xco, -1, xmax-3, 22, "");
1729                 xco+= xmax;
1730
1731         }
1732
1733         /* pack icon indicates a packed file */
1734         uiBlockSetCol(block, BUTGREY);
1735         
1736         if (G.fileflags & G_AUTOPACK) {
1737                 uiBlockSetEmboss(block, UI_EMBOSSN);
1738                 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.");
1739                 xco += XIC;
1740                 uiBlockSetEmboss(block, UI_EMBOSSX);
1741         }
1742
1743         uiBlockSetEmboss(block, UI_EMBOSSX);
1744         
1745         if (curarea->full == 0) {
1746                 curarea->butspacetype= SPACE_INFO;
1747                 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.");
1748                 
1749                 /* STD SCREEN BUTTONS */
1750 //              xco+= XIC;
1751                 xco+= 4;
1752                 xco= std_libbuttons(block, xco, 0, 0, NULL, B_INFOSCR, (ID *)G.curscreen, 0, &G.curscreen->screennr, 1, 1, B_INFODELSCR, 0, 0);
1753         
1754                 /* STD SCENE BUTTONS */
1755                 xco+= 5;
1756                 xco= std_libbuttons(block, xco, 0, 0, NULL, B_INFOSCE, (ID *)G.scene, 0, &G.curscreen->scenenr, 1, 1, B_INFODELSCE, 0, 0);
1757         }
1758         else xco= 430;
1759         
1760         info_text(xco+29, 6);
1761         
1762         uiBlockSetEmboss(block, UI_EMBOSSN);
1763         uiDefIconBut(block, BUT, B_SHOWSPLASH, ICON_BLENDER, xco+7, 0,XIC,YIC, 0, 0, 0, 0, 0, "Click to display Splash Screen");
1764         uiBlockSetEmboss(block, UI_EMBOSSX);
1765
1766 /*
1767         uiBlockSetEmboss(block, UI_EMBOSSN);
1768         uiDefIconBut(block, LABEL, 0, ICON_PUBLISHER, xco+125, 0,XIC,YIC, 0, 0, 0, 0, 0, "");
1769         uiBlockSetEmboss(block, UI_EMBOSSX);
1770 */
1771         /* always do as last */
1772         curarea->headbutlen= xco+2*XIC;
1773         
1774         if(curarea->headbutlen + 4*XIC < curarea->winx) {
1775                 uiDefIconBut(block, BUT, B_FILEMENU, ICON_HELP,
1776                         (short)(curarea->winx-XIC-2), 0,XIC,YIC,
1777                         0, 0, 0, 0, 0, "Displays Toolbox menu (SPACE)");
1778
1779 #ifdef _WIN32   // FULLSCREEN
1780         if(U.uiflag & FLIPFULLSCREEN) {
1781                 uiDefIconBut(block, BUT, B_FLIPFULLSCREEN, ICON_WINDOW_WINDOW,
1782                                 (short)(curarea->winx-(XIC*2)-2), 0,XIC,YIC,
1783                                 0, 0, 0, 0, 0, "Toggles Blender to fullscreen mode");/* dir             */
1784         } else {
1785                 uiDefIconBut(block, BUT, B_FLIPFULLSCREEN, ICON_WINDOW_FULLSCREEN,
1786                                 (short)(curarea->winx-(XIC*2)-2), 0,XIC,YIC,
1787                                 0, 0, 0, 0, 0, "Toggles Blender to fullscreen mode");/* dir             */
1788         }
1789 #endif
1790         
1791         }
1792         
1793         uiDrawBlock(block);
1794 }