[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17876] branches/blender2.5/blender/source /blender: 2.5

Ton Roosendaal ton at blender.org
Mon Dec 15 17:55:41 CET 2008


Revision: 17876
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17876
Author:   ton
Date:     2008-12-15 17:54:47 +0100 (Mon, 15 Dec 2008)

Log Message:
-----------
2.5

Mouse cursors now work again

- centralized screen-level cursor changes, no more operator
  running for it.
- spacetypes have callback to check/set individual cursor
  types. Use notifier SCREEN_CHANGED to make sure it works
  on mode changes etc.
- new calls WM_cursor_modal() and WM_cursor_restore() to
  make temporarily cursor types during modes.
- used above for view2d cursors.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
    branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c
    branches/blender2.5/blender/source/blender/editors/screen/area.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_intern.h
    branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
    branches/blender2.5/blender/source/blender/editors/space_text/space_text.c
    branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_cursors.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_init_exit.c
    branches/blender2.5/blender/source/blender/windowmanager/wm_cursors.h

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h	2008-12-15 13:46:50 UTC (rev 17875)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h	2008-12-15 16:54:47 UTC (rev 17876)
@@ -37,6 +37,7 @@
 struct ARegion;
 struct wmNotifier;
 struct wmWindowManager;
+struct wmWindow;
 struct ListBase;
 
 /* spacetype has everything stored to get an editor working, it gets initialized via 
@@ -69,6 +70,8 @@
 	void		(*operatortypes)(void);
 	/* add default items to WM keymap */
 	void		(*keymap)(struct wmWindowManager *);
+	/* sets default cursor per region */
+	void		(*cursor)(struct wmWindow *win, struct ARegion *ar);
 
 	/* region type definitions */
 	ListBase	regiontypes;

Modified: branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c	2008-12-15 13:46:50 UTC (rev 17875)
+++ branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c	2008-12-15 16:54:47 UTC (rev 17876)
@@ -209,14 +209,12 @@
 	RNA_int_set(op->ptr, "deltax", 0);
 	RNA_int_set(op->ptr, "deltay", 0);
 	
-#if 0 // XXX - enable this when cursors are working properly
 	if (v2d->keepofs & V2D_LOCKOFS_X)
-		WM_set_cursor(C, BC_NS_SCROLLCURSOR);
+		WM_cursor_modal(C->window, BC_NS_SCROLLCURSOR);
 	else if (v2d->keepofs & V2D_LOCKOFS_Y)
-		WM_set_cursor(C, BC_EW_SCROLLCURSOR);
+		WM_cursor_modal(C->window, BC_EW_SCROLLCURSOR);
 	else
-		WM_set_cursor(C, BC_NSEW_SCROLLCURSOR);
-#endif // XXX - enable this when cursors are working properly
+		WM_cursor_modal(C->window, BC_NSEW_SCROLLCURSOR);
 	
 	/* add temp handler */
 	WM_event_add_modal_handler(C, &C->window->handlers, op);
@@ -251,7 +249,7 @@
 				RNA_int_set(op->ptr, "deltay", (vpd->starty - vpd->lasty));
 				
 				view_pan_exit(C, op);
-				//WM_set_cursor(C, CURSOR_STD);		// XXX - enable this when cursors are working properly	
+				WM_cursor_restore(C->window);
 				
 				return OPERATOR_FINISHED;
 			}
@@ -689,14 +687,12 @@
 	RNA_float_set(op->ptr, "deltax", 0);
 	RNA_float_set(op->ptr, "deltay", 0);
 	
-#if 0 // XXX - enable this when cursors are working properly
 	if (v2d->keepofs & V2D_LOCKOFS_X)
-		WM_set_cursor(C, BC_NS_SCROLLCURSOR);
+		WM_cursor_modal(C->window, BC_NS_SCROLLCURSOR);
 	else if (v2d->keepofs & V2D_LOCKOFS_Y)
-		WM_set_cursor(C, BC_EW_SCROLLCURSOR);
+		WM_cursor_modal(C->window, BC_EW_SCROLLCURSOR);
 	else
-		WM_set_cursor(C, BC_NSEW_SCROLLCURSOR);
-#endif // XXX - enable this when cursors are working properly
+		WM_cursor_modal(C->window, BC_NSEW_SCROLLCURSOR);
 	
 	/* add temp handler */
 	WM_event_add_modal_handler(C, &C->window->handlers, op);
@@ -784,7 +780,7 @@
 				
 				/* free customdata */
 				view_zoomdrag_exit(C, op);
-				//WM_set_cursor(C, CURSOR_STD);		// XXX - enable this when cursors are working properly	
+				WM_cursor_restore(C->window);
 				
 				return OPERATOR_FINISHED;
 			}

Modified: branches/blender2.5/blender/source/blender/editors/screen/area.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/area.c	2008-12-15 13:46:50 UTC (rev 17875)
+++ branches/blender2.5/blender/source/blender/editors/screen/area.c	2008-12-15 16:54:47 UTC (rev 17876)
@@ -503,6 +503,7 @@
 
 		sa->spacetype= type;
 		sa->butspacetype= type;
+		sa->type= st;
 		
 		/* check previously stored space */
 		for (sl= sa->spacedata.first; sl; sl= sl->next)

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2008-12-15 13:46:50 UTC (rev 17875)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2008-12-15 16:54:47 UTC (rev 17876)
@@ -236,6 +236,39 @@
 	}
 }
 
+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 *se;
+	
+	for (se= sc->edgebase.first; se; se= se->next) {
+		if (scredge_is_horizontal(se)) {
+			short min, max;
+			min= MIN2(se->v1->vec.x, se->v2->vec.x);
+			max= MAX2(se->v1->vec.x, se->v2->vec.x);
+			
+			if (abs(my-se->v1->vec.y)<=2 && mx>=min && mx<=max)
+				return se;
+		} 
+		else {
+			short min, max;
+			min= MIN2(se->v1->vec.y, se->v2->vec.y);
+			max= MAX2(se->v1->vec.y, se->v2->vec.y);
+			
+			if (abs(mx-se->v1->vec.x)<=2 && my>=min && my<=max)
+				return se;
+		}
+	}
+	
+	return NULL;
+}
+
+
+
 /* adds no space data */
 static ScrArea *screen_addarea(bScreen *sc, ScrVert *v1, ScrVert *v2, ScrVert *v3, ScrVert *v4, short headertype, short spacetype)
 {
@@ -962,6 +995,8 @@
 	if(G.f & G_DEBUG) printf("set screen\n");
 	win->screen->do_refresh= 0;
 
+	/* cursor types too */
+	ED_screen_set_subwinactive(win);
 }
 
 /* file read, set all screens, ... */
@@ -1017,22 +1052,46 @@
 	C->window= prevwin;
 }
 
+/* case when on area-edge or in azones */
+static void screen_cursor_set(wmWindow *win, wmEvent *event)
+{
+	ScrArea *sa;
+	
+	for(sa= win->screen->areabase.first; sa; sa= sa->next)
+		if(is_in_area_actionzone(sa, event->x, event->y))
+			break;
+	
+	if(sa) {
+		WM_cursor_set(win, CURSOR_EDIT);
+	}
+	else {
+		ScrEdge *actedge= screen_find_active_scredge(win->screen, event->x, event->y);
+		
+		if (actedge && scredge_is_horizontal(actedge)) {
+			WM_cursor_set(win, CURSOR_Y_MOVE);
+		} else {
+			WM_cursor_set(win, CURSOR_X_MOVE);
+		}
+	} 
+}
 
+
 /* called in wm_event_system.c. sets state var in screen */
 void ED_screen_set_subwinactive(wmWindow *win)
 {
 	if(win->screen) {
 		wmEvent *event= win->eventstate;
 		ScrArea *sa;
+		ARegion *ar;
 		int oldswin= win->screen->subwinactive;
 		
 		for(sa= win->screen->areabase.first; sa; sa= sa->next) {
 			if(event->x > sa->totrct.xmin && event->x < sa->totrct.xmax)
 				if(event->y > sa->totrct.ymin && event->y < sa->totrct.ymax)
-					break;
+					if(NULL==is_in_area_actionzone(sa, event->x, event->y))
+						break;
 		}
 		if(sa) {
-			ARegion *ar;
 			for(ar= sa->regionbase.first; ar; ar= ar->next) {
 				if(BLI_in_rcti(&ar->winrct, event->x, event->y))
 					win->screen->subwinactive= ar->swinid;
@@ -1043,9 +1102,8 @@
 		
 		/* check for redraw headers */
 		if(oldswin!=win->screen->subwinactive) {
-			
+
 			for(sa= win->screen->areabase.first; sa; sa= sa->next) {
-				ARegion *ar;
 				int do_draw= 0;
 				
 				for(ar= sa->regionbase.first; ar; ar= ar->next)
@@ -1059,6 +1117,25 @@
 				}
 			}
 		}
+		
+		/* cursors, for time being set always on edges, otherwise aregion doesnt switch */
+		if(win->screen->subwinactive==win->screen->mainwin) {
+			screen_cursor_set(win, event);
+		}
+		else if(oldswin!=win->screen->subwinactive) {
+			/* cursor space type switching */
+			for(sa= win->screen->areabase.first; sa; sa= sa->next) {
+				for(ar= sa->regionbase.first; ar; ar= ar->next) {
+					if(ar->swinid==win->screen->subwinactive) {
+						if(sa->type->cursor)
+							sa->type->cursor(win, ar);
+						else 
+							WM_cursor_set(win, CURSOR_STD);
+					}
+				}
+					
+			}
+		}
 	}
 }
 

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_intern.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_intern.h	2008-12-15 13:46:50 UTC (rev 17875)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_intern.h	2008-12-15 16:54:47 UTC (rev 17876)
@@ -46,7 +46,12 @@
 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);
 
+AZone *is_in_area_actionzone(ScrArea *sa, int x, int y);
+
+
 #endif /* ED_SCREEN_INTERN_H */
 
 

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2008-12-15 13:46:50 UTC (rev 17875)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2008-12-15 16:54:47 UTC (rev 17876)
@@ -118,7 +118,7 @@
 }
 
 
-static AZone *is_in_area_actionzone(ScrArea *sa, int x, int y)
+AZone *is_in_area_actionzone(ScrArea *sa, int x, int y)
 {
 	AZone *az= NULL;
 	int i= 0;
@@ -232,79 +232,7 @@
 	ot->poll= ED_operator_areaactive;
 }
 
-/* ****************** cursor near edge operator ********************************* */
 
-static int scredge_is_horizontal(ScrEdge *se)
-{
-	return (se->v1->vec.y == se->v2->vec.y);
-}
-
-static ScrEdge *screen_find_active_scredge(bScreen *sc, int mx, int my)
-{
-	ScrEdge *se;
-	
-	for (se= sc->edgebase.first; se; se= se->next) {
-		if (scredge_is_horizontal(se)) {
-			short min, max;
-			min= MIN2(se->v1->vec.x, se->v2->vec.x);
-			max= MAX2(se->v1->vec.x, se->v2->vec.x);
-			
-			if (abs(my-se->v1->vec.y)<=2 && mx>=min && mx<=max)
-				return se;
-		} 
-		else {
-			short min, max;
-			min= MIN2(se->v1->vec.y, se->v2->vec.y);
-			max= MAX2(se->v1->vec.y, se->v2->vec.y);
-			
-			if (abs(mx-se->v1->vec.x)<=2 && my>=min && my<=max)
-				return se;
-		}
-	}
-	
-	return NULL;
-}
-
-
-/* operator cb */
-static int screen_cursor_test(bContext *C, wmOperator *op, wmEvent *event)
-{
-	if (C->screen->subwinactive==C->screen->mainwin) {
-		ScrEdge *actedge= screen_find_active_scredge(C->screen, event->x, event->y);
-		
-		if (actedge && scredge_is_horizontal(actedge)) {
-			WM_set_cursor(C, CURSOR_Y_MOVE);
-		} else {
-			WM_set_cursor(C, CURSOR_X_MOVE);
-		}
-	} 
-	else {
-		ScrArea *sa= NULL;
-		AZone *az= NULL;
-		
-		for(sa= C->screen->areabase.first; sa; sa= sa->next) {
-			az= is_in_area_actionzone(sa, event->x, event->y);
-			if(az!=NULL) break;
-		}
-		
-		if(az!=NULL) WM_set_cursor(C, CURSOR_EDIT);
-		else WM_set_cursor(C, CURSOR_STD);
-	}
-	
-	return OPERATOR_PASS_THROUGH;
-}
-
-static void ED_SCR_OT_cursor_type(wmOperatorType *ot)
-{
-    ot->name= "Cursor type";
-    ot->idname= "ED_SCR_OT_cursor_type";
-	
-    ot->invoke= screen_cursor_test;
-    ot->poll= ED_operator_screenactive;
-}
-
-
-
 /* *********** Rip area operator ****************** */
 
 
@@ -1224,12 +1152,6 @@
 	return OPERATOR_FINISHED;
 }
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list