[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17503] branches/blender2.5/blender/source /blender: 2.5: gesture code in WM

Ton Roosendaal ton at blender.org
Wed Nov 19 14:16:06 CET 2008


Revision: 17503
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17503
Author:   ton
Date:     2008-11-19 14:16:05 +0100 (Wed, 19 Nov 2008)

Log Message:
-----------
2.5: gesture code in WM

- Simplified and cleaned previous border code
  It was a bit too complex, too many data manipulations

Original idea was to have WM API calls to manage border, circle, lines, 
lasso, etc. This now means that WM provides callbacks for custom operators,
so it's very easy to make them. Check bottom of screen_edit.c for an
example. 

Currently two borders were coded; with and without cross hair.
Press Bkey in any area-region to test it (note: time window has wrong matrix!)

Some specs to note:
- gestures are in region space, and draw 'over'. That latter still needs some
  work when we do real composites.
- only the active region is redrawn.
- on todo is the generic gesture engine for 'tweak' or like how currently grab
  gestures in Blender work. These will be configurable per area-region, and WM
  then will send the proper "Gesture Event" with properties (N, S, E, W, etc)
  to which you then can assign operators. Such events will be generated with low 
  priority, so other handlers who swallowed mouse events have preference.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
    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/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_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.h

Removed Paths:
-------------
    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-11-19 07:57:25 UTC (rev 17502)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2008-11-19 13:16:05 UTC (rev 17503)
@@ -55,7 +55,6 @@
 /* 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(struct wmWindow *win, struct wmNotifier *note);
 bScreen *ED_screen_duplicate(struct wmWindow *win, bScreen *sc);

Modified: branches/blender2.5/blender/source/blender/editors/screen/area.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/area.c	2008-11-19 07:57:25 UTC (rev 17502)
+++ branches/blender2.5/blender/source/blender/editors/screen/area.c	2008-11-19 13:16:05 UTC (rev 17503)
@@ -95,8 +95,13 @@
 	/* generic notes first */
 	switch(note->type) {
 		case WM_NOTE_WINDOW_REDRAW:
+		case WM_NOTE_AREA_REDRAW:
+		case WM_NOTE_REGION_REDRAW:
 			ar->do_draw= 1;
 			break;
+		case WM_NOTE_GESTURE_REDRAW:
+			ar->do_draw= 1;
+			break;
 		case WM_NOTE_SCREEN_CHANGED:
 			ar->do_draw= ar->do_refresh= 1;
 			break;

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2008-11-19 07:57:25 UTC (rev 17502)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2008-11-19 13:16:05 UTC (rev 17503)
@@ -53,24 +53,7 @@
 
 #include "screen_intern.h"	/* own module include */
 
-/* ******************* gesture manager ******************* */
-void ed_gesture_draw_rect(wmWindow *win, wmGesture *gt)
-{
-	wmGestureRect *rect= (wmGestureRect *)gt;
-	sdrawbox(rect->x1, rect->y1, rect->x2, rect->y2);
-}
 
-void ed_gesture_update(wmWindow *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 *********************** */
 
 static ScrVert *screen_addvert(bScreen *sc, short x, short y)
@@ -1163,16 +1146,9 @@
 		case WM_NOTE_SCREEN_CHANGED:
 			win->screen->do_draw= win->screen->do_refresh= 1;
 			break;
-		case WM_NOTE_AREA_SPLIT:
-			printf("WM_NOTE_AREA_SPLIT\n");
+		case WM_NOTE_GESTURE_REDRAW:
+			win->screen->do_gesture= 1;	/* XXX gestures are stored in window, draw per region... a bit weak? wait for proper composite? (ton) */
 			break;
-		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;
-			break;
 	}
 }
 
@@ -1222,16 +1198,6 @@
 	win->screen->do_draw= 0;
 }
 
-void ED_screen_gesture(wmWindow *win)
-{
-	if(G.f & G_DEBUG) printf("gesture draw screen\n");
-
-	if(win->gesture.first) {
-		ed_gesture_update(win);
-	}
-	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)
@@ -1309,11 +1275,6 @@
 	WM_event_remove_handlers(&window->handlers);
 }
 
-void placeholder()
-{
-	removenotused_scrverts(NULL);
-	removenotused_scredges(NULL);
-}
 
 /* called in wm_event_system.c. sets state var in screen */
 void ED_screen_set_subwinactive(wmWindow *win)
@@ -2118,9 +2079,49 @@
 	/* api callbacks */
 	ot->exec= join_areas_exec;
 	ot->invoke= join_areas_invoke;
-	ot->cancel= join_areas_cancel;
 	ot->modal= join_areas_modal;
 
 	ot->poll= ED_operator_screenactive;
 }
 
+/* ************** border select operator (test only) ***************************** */
+
+/* operator state vars used: (added by default WM callbacks)   
+	xmin, ymin     
+	xmax, ymax     
+
+	customdata: the wmGesture pointer
+
+callbacks:
+
+	exec()	has to be filled in by user
+
+	invoke() default WM function
+			 adds modal handler
+
+	modal()	default WM function 
+			accept modal events while doing it, calls exec(), handles ESC and border drawing
+	
+	poll()	has to be filled in by user for context
+*/
+
+static int border_select_do(bContext *C, wmOperator *op)
+{
+	printf("border select do\n");
+	return 1;
+}
+
+void ED_SCR_OT_border_select(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name= "Border select";
+	ot->idname= "ED_SCR_OT_border_select";
+	
+	/* api callbacks */
+	ot->exec= border_select_do;
+	ot->invoke= WM_border_select_invoke;
+	ot->modal= WM_border_select_modal;
+	
+	ot->poll= ED_operator_areaactive;
+}
+

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_intern.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_intern.h	2008-11-19 07:57:25 UTC (rev 17502)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_intern.h	2008-11-19 13:16:05 UTC (rev 17503)
@@ -45,6 +45,8 @@
 void ED_SCR_OT_actionzone(wmOperatorType *ot);
 void ED_SCR_OT_area_rip(wmOperatorType *ot);
 
+void ED_SCR_OT_border_select(wmOperatorType *ot);
+
 #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-11-19 07:57:25 UTC (rev 17502)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2008-11-19 13:16:05 UTC (rev 17503)
@@ -91,6 +91,9 @@
 	WM_operatortype_append(ED_SCR_OT_split_area);
 	WM_operatortype_append(ED_SCR_OT_join_areas);
 	WM_operatortype_append(ED_SCR_OT_area_rip);
+	
+	/* for test only */
+	WM_operatortype_append(ED_SCR_OT_border_select);
 }
 
 /* called in spacetypes.c */
@@ -103,5 +106,9 @@
 	WM_keymap_verify_item(&wm->screenkeymap, "ED_SCR_OT_split_area", EVT_ACTIONZONE, 0, 0, 0);	/* action tria */
 	WM_keymap_verify_item(&wm->screenkeymap, "ED_SCR_OT_join_areas", EVT_ACTIONZONE, 0, 0, 0);	/* action tria */ 
 	WM_keymap_verify_item(&wm->windowkeymap, "ED_SCR_OT_area_rip", RKEY, KM_PRESS, KM_ALT, 0);
+
+	/* for test only */
+	WM_keymap_verify_item(&wm->windowkeymap, "ED_SCR_OT_border_select", BKEY, KM_PRESS, 0, 0);
+
 }
 

Modified: branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/WM_api.h	2008-11-19 07:57:25 UTC (rev 17502)
+++ branches/blender2.5/blender/source/blender/windowmanager/WM_api.h	2008-11-19 13:16:05 UTC (rev 17503)
@@ -80,7 +80,7 @@
 					int swinid, int type,
 					int value, void *data);
 
-void		wm_event_add(wmWindow *win, struct wmEvent *event_to_add); /* XXX only for warning */
+void		wm_event_add		(wmWindow *win, struct wmEvent *event_to_add); /* XXX only for warning */
 
 			/* one-shot timer, returns wmTimerData.handle */
 struct wmTimerHandle *WM_event_add_window_timer(wmWindow *win, int delay_ms, int interval_ms);
@@ -94,11 +94,15 @@
 
 			/* operator api */
 wmOperatorType *WM_operatortype_find(const char *idname);
-void		WM_operatortype_append(void (*opfunc)(wmOperatorType*));
+void		WM_operatortype_append	(void (*opfunc)(wmOperatorType*));
 
-int			WM_operator_invoke(struct bContext *C, wmOperatorType *ot, struct wmEvent *event);
-void		WM_operator_cancel(struct bContext *C, ListBase *modalops, wmOperatorType *ot);
+int			WM_operator_invoke		(struct bContext *C, wmOperatorType *ot, struct wmEvent *event);
+void		WM_operator_cancel		(struct bContext *C, ListBase *modalops, wmOperatorType *ot);
 
+			/* default operator callbacks for border/lasso */
+int			WM_border_select_invoke	(struct bContext *C, wmOperator *op, struct wmEvent *event);
+int			WM_border_select_modal	(struct bContext *C, wmOperator *op, struct wmEvent *event);
+
 /* 
  * Operator property api
  *
@@ -160,14 +164,12 @@
 void OP_free_property(wmOperator *op);
 
 			/* Gesture manager API */
-void WM_gesture_init(struct bContext *C, int type);
-void WM_gesture_update(struct bContext *C, struct wmGesture *from);
-void WM_gesture_end(struct bContext *C, int type);
-void WM_gesture_free(wmWindow *win);
+struct wmGesture *WM_gesture_new(struct bContext *C, struct wmEvent *event, int type);
+void		WM_gesture_end(struct bContext *C, struct wmGesture *gesture);
 
 			/* Reporting information and errors */
-void WM_report(struct bContext *C, int type, const char *message);
-void WM_reportf(struct bContext *C, int type, const char *format, ...);
+void		WM_report(struct bContext *C, int type, const char *message);
+void		WM_reportf(struct bContext *C, int type, const char *format, ...);
 
 			/* OpenGL wrappers, mimicing opengl syntax */
 void		wmLoadMatrix		(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-11-19 07:57:25 UTC (rev 17502)
+++ branches/blender2.5/blender/source/blender/windowmanager/WM_types.h	2008-11-19 13:16:05 UTC (rev 17503)
@@ -32,7 +32,6 @@
 
 #include "wm_cursors.h"
 #include "wm_event_types.h"
-#include "wm_gesture_types.h"
 
 /* ************** wmOperatorType ************************ */
 
@@ -95,7 +94,7 @@
 	
 	int swinid;
 	int type;
-	int value;
+	int value;
 	void *data;
 	
 } wmNotifier;
@@ -104,24 +103,34 @@
 enum {
 	WM_NOTE_WINDOW_REDRAW,
 	WM_NOTE_SCREEN_CHANGED,
+	WM_NOTE_AREA_REDRAW,
+	WM_NOTE_REGION_REDRAW,
+	WM_NOTE_GESTURE_REDRAW,
 	WM_NOTE_OBJECT_CHANGED,
-	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;
+/* wmGesture->type */
+#define WM_GESTURE_LINE			0
+#define WM_GESTURE_RECT			1
+#define WM_GESTURE_CROSS_RECT	2
+#define WM_GESTURE_LASSO		3
+#define WM_GESTURE_CIRCLE		4
 
-#define GESTURE_RECT 0
+/* wmGesture is registered to window listbase, handled by operator callbacks */
+typedef struct wmGesture {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list