Index: source/blender/editors/screen/area.c =================================================================== --- source/blender/editors/screen/area.c (revision 26600) +++ source/blender/editors/screen/area.c (working copy) @@ -592,10 +592,10 @@ static void region_azone_add(ScrArea *sa, ARegion *ar, int alignment) static int rct_fits(rcti *rect, char dir, int size) { if(dir=='h') { - return rect->xmax-rect->xmin - size; + return rect->xmax-rect->xmin +1 - size; } else { // 'v' - return rect->ymax-rect->ymin - size; + return rect->ymax-rect->ymin + 1 - size; } } Index: source/blender/editors/screen/screen_edit.c =================================================================== --- source/blender/editors/screen/screen_edit.c (revision 26600) +++ source/blender/editors/screen/screen_edit.c (working copy) @@ -251,12 +251,12 @@ int scredge_is_horizontal(ScrEdge *se) return (se->v1->vec.y == se->v2->vec.y); } -ScrEdge *screen_find_active_scredge(bScreen *sc, int mx, int my) +ScrEdge *screen_find_active_scredge(bScreen *sc, int winsizex, int winsizey, int mx, int my) { ScrEdge *se; for (se= sc->edgebase.first; se; se= se->next) { - if (scredge_is_horizontal(se)) { + if (scredge_is_horizontal(se) && se->v1->vec.y < winsizey-1 && se->v1->vec.y > 0) { short min, max; min= MIN2(se->v1->vec.x, se->v2->vec.x); max= MAX2(se->v1->vec.x, se->v2->vec.x); @@ -264,7 +264,7 @@ ScrEdge *screen_find_active_scredge(bScreen *sc, int mx, int my) if (abs(my-se->v1->vec.y)<=2 && mx>=min && mx<=max) return se; } - else { + else if(se->v1->vec.x < winsizex-1 && se->v1->vec.x > 0){ short min, max; min= MIN2(se->v1->vec.y, se->v2->vec.y); max= MAX2(se->v1->vec.y, se->v2->vec.y); @@ -631,8 +631,8 @@ static void screen_test_scale(bScreen *sc, int winsizex, int winsizey) sv->vec.y -= min[1]; } - sizex= max[0]-min[0]; - sizey= max[1]-min[1]; + sizex= max[0]-min[0]+1; + sizey= max[1]-min[1]+1; if(sizex!= winsizex || sizey!= winsizey) { facx= winsizex; @@ -647,14 +647,14 @@ static void screen_test_scale(bScreen *sc, int winsizex, int winsizey) sv->vec.x+= AREAGRID-1; sv->vec.x-= (sv->vec.x % AREAGRID); - CLAMP(sv->vec.x, 0, winsizex); + CLAMP(sv->vec.x, 0, winsizex-1); tempf= ((float)sv->vec.y )*facy; sv->vec.y= (short)(tempf+0.5); sv->vec.y+= AREAGRID-1; sv->vec.y-= (sv->vec.y % AREAGRID); - CLAMP(sv->vec.y, 0, winsizey); + CLAMP(sv->vec.y, 0, winsizey-1); } } @@ -663,7 +663,11 @@ static void screen_test_scale(bScreen *sc, int winsizex, int winsizey) /* make each window at least HEADERY high */ for(sa= sc->areabase.first; sa; sa= sa->next) { - int headery= HEADERY+1; + int headery= HEADERY-1; + + /* adjust headery if verts along the edge of window */ + if(sa->v1->vec.y > 0) headery++; + if(sa->v2->vec.y < winsizey-1) headery++; if(sa->v1->vec.y+headery > sa->v2->vec.y) { /* lower edge */ @@ -1164,7 +1168,7 @@ static void screen_cursor_set(wmWindow *win, wmEvent *event) } } else { - ScrEdge *actedge= screen_find_active_scredge(win->screen, event->x, event->y); + ScrEdge *actedge= screen_find_active_scredge(win->screen, win->sizex, win->sizey, event->x, event->y); if (actedge) { if(scredge_is_horizontal(actedge)) Index: source/blender/editors/screen/screen_intern.h =================================================================== --- source/blender/editors/screen/screen_intern.h (revision 26600) +++ source/blender/editors/screen/screen_intern.h (working copy) @@ -47,7 +47,7 @@ void removedouble_scrverts(bScreen *sc); void removedouble_scredges(bScreen *sc); void removenotused_scredges(bScreen *sc); int scredge_is_horizontal(ScrEdge *se); -ScrEdge *screen_find_active_scredge(bScreen *sc, int mx, int my); +ScrEdge *screen_find_active_scredge(bScreen *sc, int winsizex, int winsizey, int mx, int my); AZone *is_in_area_actionzone(ScrArea *sa, int x, int y); Index: source/blender/editors/screen/screen_ops.c =================================================================== --- source/blender/editors/screen/screen_ops.c (revision 26600) +++ source/blender/editors/screen/screen_ops.c (working copy) @@ -773,9 +773,11 @@ typedef struct sAreaMoveData { char dir; } sAreaMoveData; -/* helper call to move area-edge, sets limits */ -static void area_move_set_limits(bScreen *sc, int dir, int *bigger, int *smaller) +/* helper call to move area-edge, sets limits +need window size to make adjustments for verts at window edge*/ +static void area_move_set_limits(bScreen *sc, int dir, int winsizex, int winsizey, int *bigger, int *smaller) { + int areamin; ScrArea *sa; /* we check all areas and test for free space with MINSIZE */ @@ -783,7 +785,12 @@ static void area_move_set_limits(bScreen *sc, int dir, int *bigger, int *smaller for(sa= sc->areabase.first; sa; sa= sa->next) { if(dir=='h') { - int y1= sa->v2->vec.y - sa->v1->vec.y-AREAMINY; + int y1; + areamin=AREAMINY-1; + if(sa->v1->vec.y > 0) areamin++; + if(sa->v2->vec.y < winsizey-1) areamin++; + + y1= sa->v2->vec.y - sa->v1->vec.y-areamin; /* if top or down edge selected, test height */ if(sa->v1->flag && sa->v4->flag) @@ -792,7 +799,12 @@ static void area_move_set_limits(bScreen *sc, int dir, int *bigger, int *smaller *smaller= MIN2(*smaller, y1); } else { - int x1= sa->v4->vec.x - sa->v1->vec.x-AREAMINX; + int x1; + areamin=AREAMINX-1; + if(sa->v1->vec.y > 0) areamin++; + if(sa->v2->vec.y < winsizex-1) areamin++; + + x1= sa->v4->vec.x - sa->v1->vec.x-areamin; /* if left or right edge selected, test width */ if(sa->v1->flag && sa->v2->flag) @@ -808,6 +820,7 @@ static void area_move_set_limits(bScreen *sc, int dir, int *bigger, int *smaller static int area_move_init (bContext *C, wmOperator *op) { bScreen *sc= CTX_wm_screen(C); + wmWindow *win= CTX_wm_window(C); ScrEdge *actedge; sAreaMoveData *md; int x, y; @@ -817,7 +830,7 @@ static int area_move_init (bContext *C, wmOperator *op) y= RNA_int_get(op->ptr, "y"); /* setup */ - actedge= screen_find_active_scredge(sc, x, y); + actedge= screen_find_active_scredge(sc, win->sizex, win->sizey, x, y); if(actedge==NULL) return 0; md= MEM_callocN(sizeof(sAreaMoveData), "sAreaMoveData"); @@ -830,7 +843,7 @@ static int area_move_init (bContext *C, wmOperator *op) select_connected_scredge(sc, actedge); /* now all vertices with 'flag==1' are the ones that can be moved. */ - area_move_set_limits(sc, md->dir, &md->bigger, &md->smaller); + area_move_set_limits(sc, md->dir, win->sizex, win->sizey, &md->bigger, &md->smaller); return 1; } @@ -841,6 +854,8 @@ static void area_move_apply_do(bContext *C, int origval, int delta, int dir, int wmWindow *win= CTX_wm_window(C); bScreen *sc= CTX_wm_screen(C); ScrVert *v1; + int doredraw= 0; + int oldval; delta= CLAMPIS(delta, -smaller, bigger); @@ -848,31 +863,43 @@ static void area_move_apply_do(bContext *C, int origval, int delta, int dir, int if (v1->flag) { /* that way a nice AREAGRID */ if((dir=='v') && v1->vec.x>0 && v1->vec.xsizex-1) { + oldval = v1->vec.x; v1->vec.x= origval + delta; - if(delta != bigger && delta != -smaller) v1->vec.x-= (v1->vec.x % AREAGRID); + if(delta != bigger && delta != -smaller) + { + v1->vec.x-= (v1->vec.x % AREAGRID); + v1->vec.x=CLAMPIS(v1->vec.x, origval-smaller, origval+bigger); + } + if(oldval != v1->vec.x) + doredraw=1; } if((dir=='h') && v1->vec.y>0 && v1->vec.ysizey-1) { + oldval = v1->vec.y; v1->vec.y= origval + delta; - v1->vec.y+= AREAGRID-1; - v1->vec.y-= (v1->vec.y % AREAGRID); - - /* prevent too small top header */ - if(v1->vec.y > win->sizey-AREAMINY) - v1->vec.y= win->sizey-AREAMINY; + if(delta != bigger && delta != -smaller) + { + v1->vec.y-= (v1->vec.y % AREAGRID); + v1->vec.y=CLAMPIS(v1->vec.y, origval-smaller, origval+bigger); + } + if(oldval != v1->vec.y) + doredraw=1; } } } #ifdef WM_FAST_DRAW { - ScrArea *sa; - for(sa= sc->areabase.first; sa; sa= sa->next) - if(sa->v1->flag || sa->v2->flag || sa->v3->flag || sa->v4->flag) - ED_area_tag_redraw(sa); + if (doredraw) { + ScrArea *sa; + for(sa= sc->areabase.first; sa; sa= sa->next) + if(sa->v1->flag || sa->v2->flag || sa->v3->flag || sa->v4->flag) + ED_area_tag_redraw(sa); + } } #endif - WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL); /* redraw everything */ + if (doredraw) + WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL); /* redraw everything */ } static void area_move_apply(bContext *C, wmOperator *op) @@ -1171,6 +1198,7 @@ static void area_split_exit(bContext *C, wmOperator *op) static int area_split_invoke(bContext *C, wmOperator *op, wmEvent *event) { sAreaSplitData *sd; + wmWindow *win= CTX_wm_window(C); if(event->type==EVT_ACTIONZONE_AREA) { sActionzoneData *sad= event->customdata; @@ -1214,7 +1242,7 @@ static int area_split_invoke(bContext *C, wmOperator *op, wmEvent *event) /* do the split */ if(area_split_apply(C, op)) { - area_move_set_limits(CTX_wm_screen(C), dir, &sd->bigger, &sd->smaller); + area_move_set_limits(CTX_wm_screen(C), dir, win->sizex, win->sizey, &sd->bigger, &sd->smaller); /* add temp handler for edge move or cancel */ WM_event_add_modal_handler(C, op); Index: source/blender/makesdna/DNA_screen_types.h =================================================================== --- source/blender/makesdna/DNA_screen_types.h (revision 26600) +++ source/blender/makesdna/DNA_screen_types.h (working copy) @@ -180,7 +180,7 @@ typedef struct ARegion { #define AREAGRID 4 #define AREAMINX 32 #define HEADERY 26 -#define AREAMINY (HEADERY+EDGEWIDTH) +#define AREAMINY HEADERY #define HEADERDOWN 1 #define HEADERTOP 2