127
125
short winqueue_break= 0;
128
126
ScrArea *curarea= 0;
128
/* prototypes -------------------*/
129
int afterqtest(short win, unsigned short evt);
130
unsigned short screen_qread(short *val, char *ascii);
131
void add_to_mainqueue(Window *win, void *user_data, short evt, short val, char ascii);
132
static void drawscredge_area(ScrArea *sa);
130
134
/**********************************************************************/
132
136
static void screen_set_cursor(bScreen *sc)
225
void headerprint(char *str)
227
if(curarea->headertype) {
228
areawinset(curarea->headwin);
232
glRasterPos2i(20+curarea->headbutofs, 6);
233
BMF_DrawString(G.font, str);
235
curarea->head_swap= WIN_BACK_OK;
236
areawinset(curarea->win);
239
// dunno... thats for later (ton)
214
243
/* *********** STUFF ************** */
216
245
static int scredge_is_horizontal(ScrEdge *se)
306
341
void headerbox(ScrArea *area)
308
343
float width= area->winx;
310
346
glClearColor(SCR_BACK, SCR_BACK, SCR_BACK, 0.0);
311
347
glClear(GL_COLOR_BUFFER_BIT);
313
if(area_is_active_area(area)) BIF_ThemeColor(TH_HEADER);
349
active= area_is_active_area(area);
351
if(active) BIF_ThemeColor(TH_HEADER);
314
352
else BIF_ThemeColor(TH_HEADERDESEL);
316
354
/* weird values here... is because of window matrix that centres buttons */
317
355
if(area->headertype==HEADERTOP) {
318
356
uiSetRoundBox(3);
319
uiRoundBoxEmboss(-0.5+area->headbutofs, -10.0, width-1.5+area->headbutofs, HEADERY-2.0, SCR_ROUND);
357
uiRoundBoxEmboss(-0.5+area->headbutofs, -10.0, width-1.5+area->headbutofs, HEADERY-2.0, SCR_ROUND, active);
322
360
uiSetRoundBox(12);
323
uiRoundBoxEmboss(-0.5+area->headbutofs, -3.5, width-1.5+area->headbutofs, HEADERY+10, SCR_ROUND);
361
uiRoundBoxEmboss(-0.5+area->headbutofs, -3.5, width-1.5+area->headbutofs, HEADERY+10, SCR_ROUND, active);
326
364
uiSetRoundBox(15);
367
406
float ofs= area->headbutofs;
369
408
if (area->headertype==HEADERDOWN) {
370
bwin_ortho2(area->headwin, -0.375+ofs, area->headrct.xmax-area->headrct.xmin-0.375+ofs, -3.375, area->headrct.ymax-area->headrct.ymin-3.375);
409
bwin_ortho2(area->headwin, -0.375+ofs, area->headrct.xmax-area->headrct.xmin-0.375+ofs, -3.375, area->headrct.ymax-area->headrct.ymin-3.375+1.0);
371
410
} else if (area->headertype==HEADERTOP) {
372
bwin_ortho2(area->headwin, -0.375+ofs, area->headrct.xmax-area->headrct.xmin-0.375+ofs, -2.375, area->headrct.ymax-area->headrct.ymin-2.375);
411
bwin_ortho2(area->headwin, -0.375+ofs, area->headrct.xmax-area->headrct.xmin-0.375+ofs, -2.375-1.0, area->headrct.ymax-area->headrct.ymin-2.375);
544
583
void markdirty_all()
548
for (sa= G.curscreen->areabase.first; sa; sa= sa->next) {
549
scrarea_queue_winredraw(sa);
550
sa->win_swap &= ~WIN_FRONT_OK;
552
scrarea_queue_headredraw(sa);
553
sa->head_swap &= ~WIN_FRONT_OK;
586
for (sa= G.curscreen->areabase.first; sa; sa= sa->next) {
588
scrarea_queue_winredraw(sa);
589
sa->win_swap &= ~WIN_FRONT_OK;
592
scrarea_queue_headredraw(sa);
593
sa->head_swap &= ~WIN_FRONT_OK;
599
void markdirty_all_back(void)
603
for (sa= G.curscreen->areabase.first; sa; sa= sa->next) {
605
sa->win_swap &= ~WIN_BACK_OK;
608
sa->head_swap &= ~WIN_BACK_OK;
612
/* if needed; backbuffer selection redraw */
613
if(G.vd) G.vd->flag |= V3D_NEEDBACKBUFDRAW;
617
void markdirty_win_back(short winid)
619
ScrArea *sa= areawinar[winid];
621
if(sa->win==winid) sa->win_swap &= ~WIN_BACK_OK;
622
else sa->head_swap &= ~WIN_BACK_OK;
557
627
int is_allowed_to_change_screen(bScreen *new)
598
669
glDrawBuffer(GL_FRONT);
601
// this dims the whole screen a bit. I didn't like it afterall
603
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
604
glColor4f(0.0,0.0,0.0,0.3);
605
glRecti(0, 0, G.curscreen->sizex, G.curscreen->sizey);
671
uiDrawBoxShadow(200, (prefsizx-bbuf->x)/2, (prefsizy-bbuf->y)/2, (prefsizx+bbuf->x)/2, (prefsizy+bbuf->y)/2);
609
673
glRasterPos2i((prefsizx-bbuf->x)/2, (prefsizy-bbuf->y)/2);
610
674
glDrawPixels(bbuf->x, bbuf->y, GL_RGBA, GL_UNSIGNED_BYTE, bbuf->rect);
651
715
static void joinarea(ScrArea *sa, ScrEdge *onedge);
652
716
static void splitarea_interactive(ScrArea *area, ScrEdge *onedge);
654
static void screen_edge_edit_event(ScrArea *actarea, ScrEdge *actedge, short evt, short val) {
718
static void screen_edge_edit_event(ScrArea *actarea, ScrEdge *actedge, short evt, short val)
656
721
// don't allow users to edit full screens
657
722
if (actarea && actarea->full) {
677
742
scrarea_change_headertype(actarea, actarea->headertype?0:HEADERDOWN);
745
else blenderqread(evt, val); // global hotkeys
685
void mywindow_init_mainwin(Window *win, int orx, int ory, int sizex, int sizey);
751
extern void mywindow_init_mainwin(Window *win, int orx, int ory, int sizex, int sizey);
686
752
void test_scale_screen(bScreen *);
688
754
static void resize_screens(int x, int y, int w, int h) {
875
957
window_set_timer(mainwin, U.savetime*60*1000, AUTOSAVE_FILE);
960
/* ************ handlers ************** */
962
/* don't know yet how the handlers will evolve, for simplicity
963
i choose for an array with eventcodes, this saves in a file!
965
void add_screenhandler(bScreen *sc, short eventcode, short val)
970
for(a=0; a<SCREEN_MAXHANDLER; a+=2) {
971
if( sc->handler[a]==eventcode ) {
972
sc->handler[a+1]= val;
975
else if( sc->handler[a]==0) {
976
sc->handler[a]= eventcode;
977
sc->handler[a+1]= val;
981
if(a==SCREEN_MAXHANDLER) printf("error; max (4) screen handlers reached!\n");
984
void rem_screenhandler(bScreen *sc, short eventcode)
988
for(a=0; a<SCREEN_MAXHANDLER; a+=2) {
989
if( sc->handler[a]==eventcode) {
996
int has_screenhandler(bScreen *sc, short eventcode)
1000
for(a=0; a<SCREEN_MAXHANDLER; a+=2) {
1001
if( sc->handler[a]==eventcode) {
1008
static void animated_screen(bScreen *sc, short val)
1010
if (U.mixbufsize && (val & TIME_WITH_SEQ_AUDIO)) {
1014
audiostream_start( CFRA );
1017
int cfra = audiostream_pos();
1018
if(cfra <= CFRA) CFRA++;
1024
if(CFRA > EFRA) CFRA= SFRA;
1027
update_for_newframe_nodraw(1);
1029
if(val & TIME_ALL_3D_WIN)
1030
allqueue(REDRAWVIEW3D, 0);
1031
else if(val & TIME_LEFTMOST_3D_WIN) {
1032
ScrArea *sa= sc->areabase.first, *samin=NULL;
1034
for(; sa; sa= sa->next) {
1035
if(sa->spacetype==SPACE_VIEW3D) {
1036
if(sa->winrct.xmin - sa->winrct.ymin < min) {
1038
min= sa->winrct.xmin - sa->winrct.ymin;
1042
if(samin) scrarea_queue_winredraw(samin);
1044
if(val & TIME_ALL_ANIM_WIN) allqueue(REDRAWANIM, 0);
1045
if(val & TIME_ALL_BUTS_WIN) allqueue(REDRAWBUTSALL, 0);
1047
allqueue(REDRAWTIME, 0);
1050
/* because we still have to cope with subloops, this function is called
1051
in viewmove() for example too */
1053
/* returns 1 if something was handled */
1054
/* restricts to frames-per-second setting for frequency of updates */
1055
int do_screenhandlers(bScreen *sc)
1057
static double ltime=0.0;
1058
double swaptime, time;
1061
time = PIL_check_seconds_timer();
1062
swaptime= 1.0/(float)G.scene->r.frs_sec;
1064
/* only now do the handlers */
1065
if(swaptime < time-ltime || ltime==0.0) {
1069
for(a=0; a<SCREEN_MAXHANDLER; a+=2) {
1070
switch(sc->handler[a]) {
1071
case SCREEN_HANDLER_ANIM:
1072
animated_screen(sc, sc->handler[a+1]);
1075
case SCREEN_HANDLER_PYTHON:
1078
case SCREEN_HANDLER_VERSE:
1084
else if( qtest()==0) PIL_sleep_ms(5); // 5 milliseconds pause, for idle
1086
/* separate check for if we need to add to afterqueue */
1087
/* is only to keep mainqueue awqke */
1088
for(a=0; a<SCREEN_MAXHANDLER; a+=2) {
1089
if(sc->handler[a]) {
1090
ScrArea *sa= sc->areabase.first;
1091
if(sa->headwin) addafterqueue(sa->headwin, SCREEN_HANDLER, 1);
1092
else addafterqueue(sa->win, SCREEN_HANDLER, 1);
1099
/* ****** end screen handlers ************ */
878
1101
static void screen_dispatch_events(void) {
879
1102
int events_remaining= 1;
1087
1339
else if (event==SPACEKEY) {
1088
1340
if((G.obedit && G.obedit->type==OB_FONT && g_activearea->spacetype==SPACE_VIEW3D)||g_activearea->spacetype==SPACE_TEXT||g_activearea->spacetype==SPACE_SCRIPT);
1341
else if(G.qual==0) {
1090
1342
if(val) toolbox_n();
1094
else if(ELEM(event, LEFTARROWKEY, RIGHTARROWKEY)) {
1095
if(val && (G.qual & LR_CTRLKEY)) {
1096
bScreen *sc= (event==LEFTARROWKEY)?G.curscreen->id.prev:G.curscreen->id.next;
1097
if(is_allowed_to_change_screen(sc)) setscreen(sc);
1102
1346
else if(ELEM(event, UPARROWKEY, DOWNARROWKEY)) {
1103
1347
if(val && (G.qual & LR_CTRLKEY)) {
1104
1348
area_fullscreen();
1119
1363
if (event==0 || event==EXECUTE) {
1120
1364
screen_dispatch_events();
1368
GLenum error = glGetError();
1370
printf("GL error: %s\n", gluErrorString(error));
1123
1372
/* Bizar hack. The event queue has mutated... */
1124
1373
if ( (firsttime) && (event == 0) ) {
1126
if (G.fileflags & G_FILE_AUTOPLAY) {
1375
if (onload_script) {
1376
/* OnLoad scriptlink */
1377
BPY_do_pyscript(&G.scene->id, SCRIPT_ONLOAD);
1380
else if (G.fileflags & G_FILE_AUTOPLAY) {
1127
1381
// SET AUTOPLAY in G.flags for
1128
1382
// other fileloads
1193
1448
int scrwidth, scrheight;
1195
1450
winlay_get_screensize(&scrwidth, &scrheight);
1197
1452
if(stax<0) stax= 0;
1198
1453
if(stay<0) stay= 0;
1199
1454
if(sizx<320) sizx= 320;
1200
1455
if(sizy<256) sizy= 256;
1202
if(stax+sizx>scrwidth) sizx= scrwidth-stax;
1204
if(stay+sizy>scrheight) sizy= scrheight-stay;
1207
if(stay+sizy>scrheight-22) sizy= scrheight-22-stay; // 22 = topbar
1457
if(stax+sizx>scrwidth) {
1458
fprintf(stderr," width prob \n");
1459
sizx= scrwidth-stax;
1462
if(stay+sizy>scrheight) {
1463
fprintf(stderr," height prob \n");
1464
sizy= scrheight-stay;
1467
/* #ifdef __APPLE__ */
1468
/* if(stay+sizy>scrheight-22) sizy= scrheight-22-stay; // 22 = topbar */
1210
1471
if(sizx<320 || sizy<256) {
1211
1472
printf("ERROR: illegal prefsize\n");
1489
1750
static void copy_areadata(ScrArea *sa1, ScrArea *sa2)
1491
1752
Panel *pa1, *pa2, *patab;
1753
ScriptLink *slink1 = &sa1->scriptlink, *slink2 = &sa2->scriptlink;
1493
1755
sa1->headertype= sa2->headertype;
1494
1756
sa1->spacetype= sa2->spacetype;
1495
1757
Mat4CpyMat4(sa1->winmat, sa2->winmat);
1497
1759
freespacelist(&sa1->spacedata);
1498
1760
duplicatespacelist(sa1, &sa1->spacedata, &sa2->spacedata);
1500
1762
BLI_freelistN(&sa1->panels);
1501
1763
duplicatelist(&sa1->panels, &sa2->panels);
1765
/* space handler script links */
1766
if (slink1->totscript) {
1767
MEM_freeN(slink1->scripts);
1768
MEM_freeN(slink1->flag);
1769
slink1->totscript = 0;
1771
if (slink2->totscript) {
1772
slink1->scripts = MEM_dupallocN(slink2->scripts);
1773
slink1->flag = MEM_dupallocN(slink2->flag);
1774
slink1->totscript = slink2->totscript;
1503
1777
/* copy pointers */
1504
1778
pa1= sa1->panels.first;
1546
1820
static void testareas(void)
1550
1824
/* test for header, if removed, or moved */
1551
/* testen for window, if removed, or moved */
1553
for (sa= G.curscreen->areabase.first; sa; sa= sa->next) {
1825
/* test for window, if removed, or moved */
1827
sa= G.curscreen->areabase.first;
1554
1829
rcti oldhr= sa->headrct;
1555
1830
rcti oldwr= sa->winrct;
1557
1834
calc_arearcts(sa);
1561
if (!rcti_eq(&oldhr, &sa->headrct)) {
1562
mywinposition(sa->headwin, sa->headrct.xmin, sa->headrct.xmax, sa->headrct.ymin, sa->headrct.ymax);
1563
addqueue(sa->headwin, CHANGED, 1);
1566
if(sa->headbutlen<sa->winx) {
1568
addqueue(sa->headwin, CHANGED, 1);
1570
else if(sa->headbutofs+sa->winx > sa->headbutlen) {
1571
sa->headbutofs= sa->headbutlen-sa->winx;
1572
addqueue(sa->headwin, CHANGED, 1);
1576
if (!rcti_eq(&oldwr, &sa->winrct)) {
1577
mywinposition(sa->win, sa->winrct.xmin, sa->winrct.xmax, sa->winrct.ymin, sa->winrct.ymax);
1578
addqueue(sa->win, CHANGED, 1);
1836
/* ilegally scaled down area.... */
1837
if(sa->totrct.xmin>=sa->totrct.xmax || sa->totrct.ymin>=sa->totrct.ymax) {
1839
BLI_remlink(&G.curscreen->areabase, sa);
1841
printf("Warning, removed zero sized window from screen %s\n", G.curscreen->id.name+2);
1846
if (!rcti_eq(&oldhr, &sa->headrct)) {
1847
mywinposition(sa->headwin, sa->headrct.xmin, sa->headrct.xmax, sa->headrct.ymin, sa->headrct.ymax);
1848
addqueue(sa->headwin, CHANGED, 1);
1851
if(sa->headbutlen<sa->winx) {
1853
addqueue(sa->headwin, CHANGED, 1);
1855
else if(sa->headbutofs+sa->winx > sa->headbutlen) {
1856
sa->headbutofs= sa->headbutlen-sa->winx;
1857
addqueue(sa->headwin, CHANGED, 1);
1861
if (!rcti_eq(&oldwr, &sa->winrct)) {
1862
mywinposition(sa->win, sa->winrct.xmin, sa->winrct.xmax, sa->winrct.ymin, sa->winrct.ymax);
1863
addqueue(sa->win, CHANGED, 1);
1582
1869
/* remake global windowarray */
1706
1993
return window_get_mbut(mainwin);
1709
static unsigned short convert_for_nonumpad(unsigned short event)
1711
if (event>=ZEROKEY && event<=NINEKEY) {
1712
return event - ZEROKEY + PAD0;
1713
} else if (event==MINUSKEY) {
1715
} else if (event==EQUALKEY) {
1717
} else if (event==BACKSLASHKEY) {
1724
1996
void add_to_mainqueue(Window *win, void *user_data, short evt, short val, char ascii)
1727
1999
statechanged= 1;
1729
if (U.flag & USER_NONUMPAD) {
1730
evt= convert_for_nonumpad(evt);
1733
2001
/* accept the extended ascii set (ton) */
1734
2002
if( !val || ascii<32 ) {
2333
glutil_draw_front_xor_line(sa->totrct.xmin, split, sa->totrct.xmax, split);
2334
glutil_draw_front_xor_line(sa->totrct.xmin, split-1, sa->totrct.xmax, split-1);
2596
sdrawXORline(sa->totrct.xmin, split, sa->totrct.xmax, split);
2597
sdrawXORline(sa->totrct.xmin, split-1, sa->totrct.xmax, split-1);
2336
glutil_draw_front_xor_line(split, sa->totrct.ymin, split, sa->totrct.ymax);
2337
glutil_draw_front_xor_line(split-1, sa->totrct.ymin, split-1, sa->totrct.ymax);
2599
sdrawXORline(split, sa->totrct.ymin, split, sa->totrct.ymax);
2600
sdrawXORline(split-1, sa->totrct.ymin, split-1, sa->totrct.ymax);
2355
2619
mywinset(G.curscreen->mainwin);
2356
2620
/* should already have a good matrix */
2621
glReadBuffer(GL_FRONT);
2622
glDrawBuffer(GL_FRONT);
2358
2624
/* keep track of grid and minsize */
2360
2626
getmouseco_sc(mval);
2628
/* this part of code allows to choose, what window will be splited */
2629
/* cursor is out of the current ScreenArea */
2630
if((mval[0] < sa->v1->vec.x) || (mval[0] > sa->v3->vec.x) ||
2631
(mval[1] < sa->v1->vec.y) || (mval[1] > sa->v3->vec.y)){
2632
scr= (ScrArea*)G.curscreen->areabase.first;
2634
if((mval[0] > scr->v1->vec.x) && (mval[0] < scr->v4->vec.x) &&
2635
(mval[1] < scr->v2->vec.y) && (mval[1] > scr->v1->vec.y)){
2636
/* test: is ScreenArea enough big for splitting */
2637
split= testsplitpoint(scr, dir, fac);
2639
/* delete old line from previous ScreenArea */
2640
if(!first) scrarea_draw_splitpoint(sa, dir, fac);
2362
2650
if (first || mval[0]!=mvalo[0] || mval[1]!=mvalo[1]) {
2387
2675
event= extern_qread(&val);
2677
/* change direction of splitting between horizontal and vertical
2678
* patch was offered by Guillaume */
2679
if(val && (event==TABKEY || event==MIDDLEMOUSE)) {
2680
scrarea_draw_splitpoint(sa, dir, fac);
2683
set_cursor(CURSOR_Y_MOVE);
2686
set_cursor(CURSOR_X_MOVE);
2388
2691
if(val && event==LEFTMOUSE) {
2390
2693
fac= split- (sa->v1->vec.y);
2605
2911
static void draw_front_xor_dirdist_line(char dir, int dist, int start, int end)
2607
2913
if (dir=='h') {
2608
glutil_draw_front_xor_line(start, dist, end, dist);
2609
glutil_draw_front_xor_line(start, dist+1, end, dist+1);
2914
sdrawXORline(start, dist, end, dist);
2915
sdrawXORline(start, dist+1, end, dist+1);
2611
glutil_draw_front_xor_line(dist, start, dist, end);
2612
glutil_draw_front_xor_line(dist+1, start, dist+1, end);
2917
sdrawXORline(dist, start, dist, end);
2918
sdrawXORline(dist+1, start, dist+1, end);
2926
3239
/* right border area */
2927
if(sa->headertype==HEADERTOP) sdrawline(x2, y1, x2, y2-SCR_ROUND);
2928
else if(sa->headertype==HEADERDOWN) sdrawline(x2, y1+SCR_ROUND, x2, y2);
3240
if(sa->headertype==HEADERTOP) sdrawline(x2, y1, x2, y2-SCR_ROUND+1);
3241
else if(sa->headertype==HEADERDOWN) sdrawline(x2, y1+SCR_ROUND-1, x2, y2);
2929
3242
else sdrawline(x2, y1, x2, y2);
2931
3244
/* left border area */
2932
if(sa->headertype==HEADERTOP) sdrawline(x1, y1, x1, y2-SCR_ROUND);
2933
else if(sa->headertype==HEADERDOWN) sdrawline(x1, y1+SCR_ROUND, x1, y2);
2934
else sdrawline(x1, y1, x1, y2);
3245
if(x1>0) { // otherwise it draws the emboss of window over
3246
if(sa->headertype==HEADERTOP) sdrawline(x1, y1, x1, y2-SCR_ROUND+1);
3247
else if(sa->headertype==HEADERDOWN) sdrawline(x1, y1+SCR_ROUND-1, x1, y2);
3248
else sdrawline(x1, y1, x1, y2);
2936
3250
/* top border area */
2937
if(sa->headertype==HEADERTOP) sdrawline(x1+SCR_ROUND, y2, x2-SCR_ROUND, y2);
3251
if(sa->headertype==HEADERTOP) sdrawline(x1+SCR_ROUND-3, y2, x2-SCR_ROUND+3, y2);
2938
3252
else sdrawline(x1, y2, x2, y2);
2940
3254
/* bottom border area */
2941
if(sa->headertype==HEADERDOWN) sdrawline(x1+SCR_ROUND, y1, x2-SCR_ROUND, y1);
3255
if(sa->headertype==HEADERDOWN) sdrawline(x1+SCR_ROUND-3, y1, x2-SCR_ROUND+3, y1);
2942
3256
else sdrawline(x1, y1, x2, y1);