[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13296] branches/blender2.5/blender/source /blender: New "Gesture Manager" system.

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


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

Log Message:
-----------
New "Gesture Manager" system.

This is a first implementation of the "gesture manager" system,
the idea is put the WM in a automatic draw mode so we can
implement different "Gesture types" to draw different class
of data (lasso, bound box, etc).

The gesture data is passed through the data field of the notifiers,
i think that we can change this to something like:
	WM_gesture_init(C, data); /* put the data in the context. */

	while() {
		/* send WM_NOTE_GESTURE_CHANGED to update screen */
	}

	/* send event and free the data in the context. */
	WM_gesture_end(C);

Also i add a new operator and event to test the gesture manager.
The new operator is the "border select" function, just press BKEY
in the window and LMB or ESCKEY to exit.
In the case of LMB you can see a print in the console about the
BORDERSELECT event.

All this still need a lot of work, comment are welcome.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
    branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h
    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/WM_types.h
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.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_event_system.h
    branches/blender2.5/blender/source/blender/windowmanager/wm_event_types.h

Added Paths:
-----------
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_gesture.c
    branches/blender2.5/blender/source/blender/windowmanager/wm_gesture_types.h

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2008-01-19 16:32:29 UTC (rev 13295)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2008-01-19 17:54:05 UTC (rev 13296)
@@ -51,8 +51,9 @@
 /* screens */
 void	ED_screens_initialize(struct wmWindowManager *wm);
 void	ED_screen_draw(struct wmWindow *win);
+void	ED_screen_gesture(struct wmWindow *win);
 void	ED_screen_refresh(struct wmWindowManager *wm, struct wmWindow *win);
-void	ED_screen_do_listen(bScreen *screen, struct wmNotifier *note);
+void	ED_screen_do_listen(struct wmWindow *win, struct wmNotifier *note);
 bScreen *ED_screen_duplicate(struct wmWindow *win, bScreen *sc);
 void	ED_screen_set_subwinactive(struct wmWindow *win);
 

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 16:32:29 UTC (rev 13295)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2008-01-19 17:54:05 UTC (rev 13296)
@@ -50,6 +50,20 @@
 
 #include "screen_intern.h"	/* own module include */
 
+/* ******************* gesture manager ******************* */
+void ed_gesture_draw_rect(wmWindow *win)
+{
+	wmGestureRect *rect= (wmGestureRect *)win->gesture;
+	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);
+}
+
 /* ******************* screen vert, edge, area managing *********************** */
 
 static ScrVert *screen_addvert(bScreen *sc, short x, short y)
@@ -752,16 +766,16 @@
 	}
 }
 
-void ED_screen_do_listen(bScreen *screen, wmNotifier *note)
+void ED_screen_do_listen(wmWindow *win, wmNotifier *note)
 {
 	
 	/* generic notes */
 	switch(note->type) {
 		case WM_NOTE_WINDOW_REDRAW:
-			screen->do_draw= 1;
+			win->screen->do_draw= 1;
 			break;
 		case WM_NOTE_SCREEN_CHANGED:
-			screen->do_draw= screen->do_refresh= 1;
+			win->screen->do_draw= win->screen->do_refresh= 1;
 			break;
 		case WM_NOTE_AREA_SPLIT:
 			printf("WM_NOTE_AREA_SPLIT\n");
@@ -769,6 +783,11 @@
 		case WM_NOTE_AREA_DRAG:
 			printf("WM_NOTE_AREA_DRAG\n");
 			break;
+		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;
 	}
 }
 
@@ -786,6 +805,18 @@
 	win->screen->do_draw= 0;
 }
 
+void ED_screen_gesture(wmWindow *win)
+{
+	printf("gesture draw screen\n");
+
+	if(win->gesture) {
+		ed_gesture_update(win);
+		MEM_freeN(win->gesture);
+		win->gesture= NULL;
+	}
+	win->screen->do_gesture= 0;
+}
+
 /* make this screen usable */
 /* for file read and first use, for scaling window, area moves */
 void ED_screen_refresh(wmWindowManager *wm, wmWindow *win)
@@ -997,7 +1028,7 @@
 
 static int move_areas_exit(bContext *C, wmOperator *op)
 {
-	WM_event_add_notifier(C->wm, C->window, 0, WM_NOTE_SCREEN_CHANGED, 0);
+	WM_event_add_notifier(C->wm, C->window, 0, WM_NOTE_SCREEN_CHANGED, 0, NULL);
 
 	/* this makes sure aligned edges will result in aligned grabbing */
 	removedouble_scrverts(C->screen);
@@ -1045,7 +1076,7 @@
 				op->delta= event->y - op->veci.y;
 			
 			move_areas_exec(C, op);
-			WM_event_add_notifier(C->wm, C->window, 0, WM_NOTE_SCREEN_CHANGED, 0);
+			WM_event_add_notifier(C->wm, C->window, 0, WM_NOTE_SCREEN_CHANGED, 0, NULL);
 			break;
 			
 		case LEFTMOUSE:
@@ -1133,7 +1164,7 @@
 		op->customdata = NULL;
 	}
 	
-	WM_event_add_notifier(C->wm, C->window, 0, WM_NOTE_SCREEN_CHANGED, 0);
+	WM_event_add_notifier(C->wm, C->window, 0, WM_NOTE_SCREEN_CHANGED, 0, NULL);
 
 	/* this makes sure aligned edges will result in aligned grabbing */
 	removedouble_scrverts(C->screen);
@@ -1167,7 +1198,7 @@
 	/* select newly created edge */
 	select_connected_scredge(C->screen, sd->nedge);
 	
-	WM_event_add_notifier(C->wm, C->window, 0, WM_NOTE_SCREEN_CHANGED, 0);
+	WM_event_add_notifier(C->wm, C->window, 0, WM_NOTE_SCREEN_CHANGED, 0, NULL);
 	
 	return 1;
 }
@@ -1321,7 +1352,7 @@
 			} else if (sd->state==SPLIT_DONE) {
 				/* shouldn't get here anymore */
 			}
-			WM_event_add_notifier(C->wm, C->window, 0, WM_NOTE_SCREEN_CHANGED, 0);
+			WM_event_add_notifier(C->wm, C->window, 0, WM_NOTE_SCREEN_CHANGED, 0, NULL);
 			break;
 		case LEFTMOUSE:
 			if(event->val==0) { /* mouse up => confirm if not near/on starting edge */
@@ -1585,7 +1616,7 @@
 		case LEFTMOUSE:
 			if(event->val==0) {
 				join_areas_exec(C, op);
-				WM_event_add_notifier(C->wm, C->window, 0, WM_NOTE_SCREEN_CHANGED, 0);				
+				WM_event_add_notifier(C->wm, C->window, 0, WM_NOTE_SCREEN_CHANGED, 0, NULL);
 				join_areas_exit(C, op);
 				WM_event_remove_modal_handler(&C->window->handlers, op);
 			}
@@ -1616,4 +1647,3 @@
 
 	ot->poll= ED_operator_screen_mainwinactive;
 }
-

Modified: branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h	2008-01-19 16:32:29 UTC (rev 13295)
+++ branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h	2008-01-19 17:54:05 UTC (rev 13296)
@@ -54,6 +54,8 @@
 	short full, winid;					/* winid from WM, starts with 1 */
 	short do_draw;						/* notifier for drawing edges */
 	short do_refresh;					/* notifier for scale screen, changed screen, etc */
+	short do_gesture;					/* notifier for gesture draw. */
+	short pad[3];
 	
 	short mainwin;						/* screensize subwindow, for screenedges and global menus */
 	short subwinactive;					/* active subwindow */

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 16:32:29 UTC (rev 13295)
+++ branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h	2008-01-19 17:54:05 UTC (rev 13296)
@@ -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. */
 } 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 16:32:29 UTC (rev 13295)
+++ branches/blender2.5/blender/source/blender/windowmanager/WM_api.h	2008-01-19 17:54:05 UTC (rev 13296)
@@ -34,6 +34,7 @@
 struct bContext;
 struct wmEvent;
 struct wmEventHandler;
+struct wmGesture;
 
 			/* general API */
 void		WM_setprefsize		(int stax, int stay, int sizx, int sizy);
@@ -67,8 +68,9 @@
 struct wmEventHandler *WM_event_add_modal_handler(ListBase *handlers, wmOperator *op);
 void		WM_event_remove_modal_handler(ListBase *handlers, wmOperator *op);
 
-void		WM_event_add_notifier(wmWindowManager *wm, wmWindow *window, int swinid, int type, 
-								  int value);
+void		WM_event_add_notifier(wmWindowManager *wm, wmWindow *window,
+					int swinid, int type,
+					int value, void *data);
 
 
 			/* operator api, default callbacks */
@@ -132,6 +134,11 @@
  **/
 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);
+
 			/* OpenGL wrappers, mimicing opengl syntax */
 void		wmLoadMatrix		(wmWindow *win, float mat[][4]);
 void		wmGetMatrix			(wmWindow *win, float mat[][4]);

Modified: branches/blender2.5/blender/source/blender/windowmanager/WM_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/WM_types.h	2008-01-19 16:32:29 UTC (rev 13295)
+++ branches/blender2.5/blender/source/blender/windowmanager/WM_types.h	2008-01-19 17:54:05 UTC (rev 13296)
@@ -32,6 +32,7 @@
 
 #include "wm_cursors.h"
 #include "wm_event_types.h"
+#include "wm_gesture_types.h"
 
 /* ************** wmOperatorType ************************ */
 
@@ -103,11 +104,23 @@
 	WM_NOTE_WINDOW_REDRAW,
 	WM_NOTE_SCREEN_CHANGED,
 	WM_NOTE_OBJECT_CHANGED,
-	WM_NOTE_AREA_SPLIT,
+	WM_NOTE_AREA_SPLIT,
 	WM_NOTE_AREA_DRAG,
+	WM_NOTE_GESTURE_CHANGED,
 	WM_NOTE_LAST
 };
 
+/* ************** Gesture Manager data ************** */
+typedef struct wmGestureRect {
+	/* always this first!! */
+	wmGesture gesture;
+
+	short x1, x2;
+	short y1, y2;
+} wmGestureRect;
+
+#define GESTURE_RECT 0
+
 /* ************** custom wmEvent data ************** */
 
 #define DEV_STYLUS	1
@@ -120,6 +133,10 @@
 	float Ytilt;		/* as above */
 } wmTabletData;
 
+typedef struct wmBorderSelect {
+	short x1, y1;
+	short x2, y2;
+} wmBorderSelect;
 
 /* *************** migrated stuff, clean later? ******************************** */
 

Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c	2008-01-19 16:32:29 UTC (rev 13295)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c	2008-01-19 17:54:05 UTC (rev 13296)
@@ -79,6 +79,7 @@
 	WM_keymap_verify_item(&wm->windowkeymap, "WM_OT_save_homefile", UKEY, KM_PRESS, KM_CTRL, 0);
 	WM_keymap_verify_item(&wm->windowkeymap, "WM_OT_window_fullscreen_toggle", FKEY, KM_PRESS, 0, 0);
 	WM_keymap_verify_item(&wm->windowkeymap, "WM_OT_exit_blender", QKEY, KM_PRESS, KM_CTRL, 0);
+	WM_keymap_verify_item(&wm->windowkeymap, "WM_OT_border_select", BKEY, KM_PRESS, 0, 0);
 }
 
 /* ****************************************** */

Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c	2008-01-19 16:32:29 UTC (rev 13295)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c	2008-01-19 17:54:05 UTC (rev 13296)
@@ -55,7 +55,7 @@
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list