[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13301] branches/blender2.5/blender/source /blender: More change to the gesture manager.

Diego Borghetti (Plumiferos) bdiego at gmail.com
Sat Jan 19 22:54:33 CET 2008


Revision: 13301
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13301
Author:   bdiego
Date:     2008-01-19 22:54:33 +0100 (Sat, 19 Jan 2008)

Log Message:
-----------
More change to the gesture manager.

After check this a little more I make some changes to the
API and now work on the following form:
	WM_gesture_init(C, type);

	while() {
		/* handler event, etc */
		/* if something change. */
		if(need_update) {
			/* update the gesture data and notify about it. */
			WM_gesture_update(C, data);
			WM_event_add_notifier (.. WM_NOTE_GESTURE_CHANGE ..);
		}
	}
	WM_gesture_end(C, type);

Another of the change is that now the gesture data is a link list
in the window struct, so we can have multiples "gestures" (but
of different type) at the same time.

Also take care that the "gesture data" is reusable, that mean that
only alloc it 1 time and use in all the place, that is
why don't support multiple gesture of the same type, but of course
that can be change.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h
    branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_gesture.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_window.c
    branches/blender2.5/blender/source/blender/windowmanager/wm_gesture_types.h

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2008-01-19 21:52:09 UTC (rev 13300)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2008-01-19 21:54:33 UTC (rev 13301)
@@ -51,17 +51,21 @@
 #include "screen_intern.h"	/* own module include */
 
 /* ******************* gesture manager ******************* */
-void ed_gesture_draw_rect(wmWindow *win)
+void ed_gesture_draw_rect(wmWindow *win, wmGesture *gt)
 {
-	wmGestureRect *rect= (wmGestureRect *)win->gesture;
+	wmGestureRect *rect= (wmGestureRect *)gt;
 	sdrawbox(rect->x1, rect->y1, rect->x2, rect->y2);
 }
 
 void ed_gesture_update(wmWindow *win)
 {
-	wmGesture *gesture= (wmGesture *)win->gesture;
-	if(gesture->type==GESTURE_RECT)
-		ed_gesture_draw_rect(win);
+	wmGesture *gt= (wmGesture *)win->gesture.first;
+
+	while(gt) {
+		if(gt->type==GESTURE_RECT)
+			ed_gesture_draw_rect(win, gt);
+		gt= gt->next;
+	}
 }
 
 /* ******************* screen vert, edge, area managing *********************** */
@@ -786,7 +790,6 @@
 		case WM_NOTE_GESTURE_CHANGED:
 			printf("WM_NOTE_GESTURE_CHANGED\n");
 			win->screen->do_gesture= 1;
-			win->gesture= WM_gesture_dup((wmGesture *) note->data);
 			break;
 	}
 }
@@ -809,10 +812,8 @@
 {
 	printf("gesture draw screen\n");
 
-	if(win->gesture) {
+	if(win->gesture.first) {
 		ed_gesture_update(win);
-		MEM_freeN(win->gesture);
-		win->gesture= NULL;
 	}
 	win->screen->do_gesture= 0;
 }

Modified: branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h	2008-01-19 21:52:09 UTC (rev 13300)
+++ branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h	2008-01-19 21:54:33 UTC (rev 13301)
@@ -97,7 +97,7 @@
 	ListBase handlers;		/* window+screen handlers, overriding all queues */
 	
 	ListBase subwindows;	/* opengl stuff for sub windows, see notes in wm_subwindow.c */
-	void *gesture;	/* gesture stuff. */
+	ListBase gesture;	/* gesture stuff */
 } wmWindow;
 
 #

Modified: branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/WM_api.h	2008-01-19 21:52:09 UTC (rev 13300)
+++ branches/blender2.5/blender/source/blender/windowmanager/WM_api.h	2008-01-19 21:54:33 UTC (rev 13301)
@@ -135,9 +135,10 @@
 void OP_free_property(wmOperator *op);
 
 			/* Gesture manager API */
-struct wmGesture *WM_gesture_new(int type);
-struct wmGesture *WM_gesture_dup(struct wmGesture *from);
-void WM_gesture_send(wmWindow *win, struct wmGesture *gesture);
+void WM_gesture_init(bContext *C, int type);
+void WM_gesture_update(bContext *C, struct wmGesture *from);
+void WM_gesture_end(bContext *C, int type);
+void WM_gesture_free(wmWindow *win);
 
 			/* OpenGL wrappers, mimicing opengl syntax */
 void		wmLoadMatrix		(wmWindow *win, float mat[][4]);

Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm_gesture.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm_gesture.c	2008-01-19 21:52:09 UTC (rev 13300)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_gesture.c	2008-01-19 21:54:33 UTC (rev 13301)
@@ -32,20 +32,36 @@
 
 #include "BLI_blenlib.h"
 
+#include "BKE_global.h"
+
 #include "WM_api.h"
 #include "WM_types.h"
 
+#include "wm_event_system.h"
+
 #include "BIF_gl.h"
 #include "BIF_glutil.h"
 
 
-wmGesture *WM_gesture_new(int type)
+wmGesture *wm_gesture_find(ListBase *list, int type)
 {
+	wmGesture *gt= list->first;
+	while(gt) {
+		if(gt->type==type)
+			return(gt);
+		gt= gt->next;
+	}
+	return(NULL);
+}
+
+wmGesture *wm_gesture_new(int type)
+{
 	wmGesture *gesture= NULL;
 	wmGestureRect *rect;
 
 	if(type==GESTURE_RECT) {
-		gesture= rect= MEM_mallocN(sizeof(wmGestureRect), "gesture rect new");
+		rect= MEM_mallocN(sizeof(wmGestureRect), "gesture rect new");
+		gesture= (wmGesture*) rect;
 		gesture->type= type;
 		rect->x1= 0;
 		rect->y1= 0;
@@ -55,6 +71,19 @@
 	return(gesture);
 }
 
+void WM_gesture_init(bContext *C, int type)
+{
+	wmGesture *gt= NULL;
+
+	if(C->window) {
+		gt= wm_gesture_find(&C->window->gesture, type);
+		if(!gt) {
+			gt= wm_gesture_new(type);
+			BLI_addtail(&C->window->gesture, gt);
+		}
+	}
+}
+
 void wm_gesture_rect_copy(wmGestureRect *to, wmGestureRect *from)
 {
 	to->x1= from->x1;
@@ -63,24 +92,47 @@
 	to->y2= from->y2;
 }
 
-wmGesture *WM_gesture_dup(wmGesture *from)
+void WM_gesture_update(bContext *C, wmGesture *from)
 {
-	wmGesture *to= WM_gesture_new(from->type);
+	wmGesture *to;
 
-	if(from->type==GESTURE_RECT)
-		wm_gesture_rect_copy((wmGestureRect *) to, (wmGestureRect *) from);
-	return (to);
+	if(!C->window)
+		return;
+
+	to= wm_gesture_find(&C->window->gesture, from->type);
+	if(!to)
+		return;
+
+	printf("found gesture!!\n");
+	if(to->type==GESTURE_RECT)
+		wm_gesture_rect_copy((wmGestureRect*)to, (wmGestureRect*)from);
 }
 
-void WM_gesture_send(wmWindow *win, wmGesture *gesture)
+void WM_gesture_free(wmWindow *win)
 {
+	/* Now don't have multiple struct so
+	 * a simple BLI_freelistN is what we need.
+	 */
+	BLI_freelistN(&win->gesture);
+}
+
+void WM_gesture_end(bContext *C, int type)
+{
+	wmGesture *gt;
 	wmGestureRect *rect;
 	wmBorderSelect *wmbor;
 	wmEvent event;
 
-	if(gesture->type==GESTURE_RECT) {
-		rect= (wmGestureRect*)gesture;
+	if(!C->window)
+		return;
 
+	gt= wm_gesture_find(&C->window->gesture, type);
+	if(!gt)
+		return;
+
+	if(gt->type==GESTURE_RECT) {
+		rect= (wmGestureRect*)gt;
+
 		wmbor= MEM_mallocN(sizeof(wmBorderSelect), "border select");
 		wmbor->x1= rect->x1;
 		wmbor->y1= rect->y1;
@@ -90,6 +142,6 @@
 		event.type= BORDERSELECT;
 		event.custom= EVT_GESTURE;
 		event.customdata= wmbor;
-		wm_event_add(win, &event);
+		wm_event_add(C->window, &event);
 	}
 }

Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c	2008-01-19 21:52:09 UTC (rev 13300)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c	2008-01-19 21:54:33 UTC (rev 13301)
@@ -135,24 +135,26 @@
 {
 	OP_set_int(op, "start_x", op->veci.x);
 	OP_set_int(op, "start_y", op->veci.y);
+	WM_gesture_init(C, GESTURE_RECT);
 	return 1;
 }
 
 static int border_select_exec(bContext *C, wmOperator *op)
 {
-	wmGestureRect *rect;
+	wmGestureRect rect;
 	int x, y;
 
 	OP_get_int(op, "start_x", &x);
 	OP_get_int(op, "start_y", &y);
 
-	rect= (wmGestureRect *) WM_gesture_new(GESTURE_RECT);
-	rect->x1= x;
-	rect->y1= y;
-	rect->x2= op->veci.x;
-	rect->y2= op->veci.y;
-
-	WM_event_add_notifier(C->wm, C->window, 0, WM_NOTE_GESTURE_CHANGED, 0, rect);
+	rect.gesture.next= rect.gesture.prev= NULL;
+	rect.gesture.type= GESTURE_RECT;
+	rect.x1= x;
+	rect.y1= y;
+	rect.x2= op->veci.x;
+	rect.y2= op->veci.y;
+	WM_gesture_update(C, (wmGesture *) &rect);
+	WM_event_add_notifier(C->wm, C->window, 0, WM_NOTE_GESTURE_CHANGED, GESTURE_RECT, NULL);
 	return 1;
 }
 
@@ -189,19 +191,20 @@
 			break;
 		case LEFTMOUSE:
 			if(event->val==0) {
-				wmGestureRect *rect;
+				wmGestureRect rect;
 				int x, y;
 
 				OP_get_int(op, "start_x", &x);
 				OP_get_int(op, "start_y", &y);
 
-				rect= (wmGestureRect *) WM_gesture_new(GESTURE_RECT);
-				rect->x1= x;
-				rect->y1= y;
-				rect->x2= op->veci.x;
-				rect->y2= op->veci.y;
-				WM_gesture_send(C->window, (wmGesture *) rect);
-				MEM_freeN(rect);
+				rect.gesture.next= rect.gesture.prev= NULL;
+				rect.gesture.type= GESTURE_RECT;
+				rect.x1= x;
+				rect.y1= y;
+				rect.x2= op->veci.x;
+				rect.y2= op->veci.y;
+				WM_gesture_update(C, (wmGesture*)&rect);
+				WM_gesture_end(C, GESTURE_RECT);
 
 				border_select_exit(C, op);
 				WM_event_remove_modal_handler(&C->window->handlers, op);

Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm_window.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm_window.c	2008-01-19 21:52:09 UTC (rev 13300)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_window.c	2008-01-19 21:54:33 UTC (rev 13301)
@@ -106,7 +106,8 @@
 	/* XXX free screens */
 	
 	if(win->eventstate) MEM_freeN(win->eventstate);
-	
+
+	WM_gesture_free(win);
 	wm_event_free_handlers(&win->handlers);
 	wm_event_free_all(win);
 	wm_subwindows_free(win);

Modified: branches/blender2.5/blender/source/blender/windowmanager/wm_gesture_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/wm_gesture_types.h	2008-01-19 21:52:09 UTC (rev 13300)
+++ branches/blender2.5/blender/source/blender/windowmanager/wm_gesture_types.h	2008-01-19 21:54:33 UTC (rev 13301)
@@ -30,8 +30,10 @@
 #define WM_GESTURE_TYPES_H
 
 typedef struct wmGesture {
+	struct wmGesture *next, *prev;
+
 	/* gesture type. */
-	short type;
+	int type;
 } wmGesture;
 
 #endif	/* WM_GESTURE_TYPES_H */





More information about the Bf-blender-cvs mailing list