Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/editors/include/BIF_glutil.h2
-rw-r--r--source/blender/editors/include/ED_screen.h1
-rw-r--r--source/blender/editors/interface/interface_ops.c2
-rw-r--r--source/blender/editors/screen/area.c31
-rw-r--r--source/blender/editors/screen/glutil.c3
-rw-r--r--source/blender/editors/screen/screen_edit.c6
-rw-r--r--source/blender/editors/screen/screen_ops.c28
-rw-r--r--source/blender/makesdna/DNA_screen_types.h4
-rw-r--r--source/blender/windowmanager/WM_api.h3
-rw-r--r--source/blender/windowmanager/WM_types.h22
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c26
-rw-r--r--source/blender/windowmanager/intern/wm_gesture.c69
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c3
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c100
-rw-r--r--source/blender/windowmanager/wm.h1
-rw-r--r--source/blender/windowmanager/wm_event_types.h32
16 files changed, 279 insertions, 54 deletions
diff --git a/source/blender/editors/include/BIF_glutil.h b/source/blender/editors/include/BIF_glutil.h
index 3fcb88b1c49..b354591fc5f 100644
--- a/source/blender/editors/include/BIF_glutil.h
+++ b/source/blender/editors/include/BIF_glutil.h
@@ -35,7 +35,7 @@ void fdrawline(float x1, float y1, float x2, float y2);
void fdrawbox(float x1, float y1, float x2, float y2);
void sdrawline(short x1, short y1, short x2, short y2);
void sdrawtri(short x1, short y1, short x2, short y2);
-void sdrawtrifill(short x1, short y1, short x2, short y2, float r, float g, float b);
+void sdrawtrifill(short x1, short y1, short x2, short y2);
void sdrawbox(short x1, short y1, short x2, short y2);
void sdrawXORline(int x0, int y0, int x1, int y1);
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 3188746c599..01fac210a14 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -51,6 +51,7 @@ void ED_spacetypes_keymap(struct wmWindowManager *wm);
/* areas */
void ED_area_initialize(struct wmWindowManager *wm, struct wmWindow *win, struct ScrArea *sa);
void ED_area_exit(struct bContext *C, ScrArea *sa);
+void ED_area_do_draw(struct bContext *C, ScrArea *sa);
/* screens */
void ED_screens_initialize(struct wmWindowManager *wm);
diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c
index 074c05b050f..90f888e652d 100644
--- a/source/blender/editors/interface/interface_ops.c
+++ b/source/blender/editors/interface/interface_ops.c
@@ -1529,7 +1529,7 @@ static void ui_do_but_NUM(bContext *C, uiBlock *block, uiBut *but, uiActivateBut
if(event->shift) fac /= 10.0f;
if(event->alt) fac /= 20.0f;
- if(event->custom == EVT_TABLET) {
+ if(event->custom == EVT_DATA_TABLET) {
wmTabletData *wmtab= event->customdata;
/* de-sensitise based on tablet pressure */
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index c9ee8e67b27..7822ada7a09 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -111,6 +111,27 @@ void ED_region_do_listen(ARegion *ar, wmNotifier *note)
}
}
+/* only internal decoration, AZone for now */
+void ED_area_do_draw(bContext *C, ScrArea *sa)
+{
+ AZone *az;
+
+ /* hrmf, screenspace for zones */
+ wm_subwindow_set(C->window, C->window->screen->mainwin);
+
+ /* temporary viz for 'action corner' */
+ for(az= sa->actionzones.first; az; az= az->next) {
+
+ glEnable( GL_BLEND );
+ glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
+ glColor4ub(0, 0, 0, 80);
+ if(az->type==AZONE_TRI) sdrawtrifill(az->x1, az->y1, az->x2, az->y2);
+ //if(az->type==AZONE_TRI) sdrawtri(az->x1, az->y1, az->x2, az->y2);
+ glDisable( GL_BLEND );
+ }
+
+}
+
void ED_region_do_draw(bContext *C, ARegion *ar)
{
ARegionType *at= ar->type;
@@ -128,9 +149,10 @@ void ED_region_do_draw(bContext *C, ARegion *ar)
glClearColor(0.5, fac, 1.0f-fac, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
+ /* swapbuffers indicator */
fac= BLI_frand();
glColor3f(fac, fac, fac);
- glRecti(2, 2, 12, 12);
+ glRecti(20, 2, 30, 12);
region_draw_emboss(ar);
}
@@ -295,9 +317,10 @@ void area_azone_initialize(ScrArea *sa)
az->y1= sa->v1->vec.y+1;
az->x2= sa->v1->vec.x+AZONESPOT;
az->y2= sa->v1->vec.y+AZONESPOT;
- } else if (az->pos==AZONE_NE) {
- az->x1= sa->v3->vec.x-1;
- az->y1= sa->v3->vec.y-1;
+ }
+ else if (az->pos==AZONE_NE) {
+ az->x1= sa->v3->vec.x;
+ az->y1= sa->v3->vec.y;
az->x2= sa->v3->vec.x-AZONESPOT;
az->y2= sa->v3->vec.y-AZONESPOT;
}
diff --git a/source/blender/editors/screen/glutil.c b/source/blender/editors/screen/glutil.c
index 08587ddb9a5..0be29fc53c0 100644
--- a/source/blender/editors/screen/glutil.c
+++ b/source/blender/editors/screen/glutil.c
@@ -120,10 +120,9 @@ void sdrawtri(short x1, short y1, short x2, short y2)
glEnd();
}
-void sdrawtrifill(short x1, short y1, short x2, short y2, float r, float g, float b)
+void sdrawtrifill(short x1, short y1, short x2, short y2)
{
glBegin(GL_TRIANGLES);
- glColor3f(r, g, b);
sdrawtripoints(x1, y1, x2, y2);
glEnd();
}
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 5c39a1b00bd..742022ea370 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -768,7 +768,6 @@ static void scrarea_draw_shape_light(ScrArea *sa, char dir)
/** screen edges drawing **/
static void drawscredge_area(ScrArea *sa)
{
- AZone *az;
short x1= sa->v1->vec.x;
short y1= sa->v1->vec.y;
short x2= sa->v3->vec.x;
@@ -790,11 +789,6 @@ static void drawscredge_area(ScrArea *sa)
/* bottom border area */
sdrawline(x1, y1, x2, y1);
- /* temporary viz for 'action corner' */
- for(az= sa->actionzones.first; az; az= az->next) {
- if(az->type==AZONE_TRI) sdrawtrifill(az->x1, az->y1, az->x2, az->y2, .2, .2, .2);
- //if(az->type==AZONE_TRI) sdrawtri(az->x1, az->y1, az->x2, az->y2);
- }
}
/* ****************** EXPORTED API TO OTHER MODULES *************************** */
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index a2272f1b5b6..ce098c0f8e7 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -834,6 +834,11 @@ static int area_split_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
+ else {
+ /* nonmodal for now */
+ return op->type->exec(C, op);
+ }
+
return OPERATOR_PASS_THROUGH;
}
@@ -911,7 +916,7 @@ void ED_SCR_OT_area_split(wmOperatorType *ot)
ot->invoke= area_split_invoke;
ot->modal= area_split_modal;
- ot->poll= ED_operator_screenactive; /* XXX should be area active */
+ ot->poll= ED_operator_areaactive;
/* rna */
prop= RNA_def_property(ot->rna, "dir", PROP_ENUM, PROP_NONE);
@@ -1227,7 +1232,15 @@ callbacks:
static int border_select_do(bContext *C, wmOperator *op)
{
- printf("border select do\n");
+ int event_type= RNA_int_get(op->rna, "event_type");
+
+ if(event_type==LEFTMOUSE)
+ printf("border select do select\n");
+ else if(event_type==RIGHTMOUSE)
+ printf("border select deselect\n");
+ else
+ printf("border select do something\n");
+
return 1;
}
@@ -1243,6 +1256,10 @@ void ED_SCR_OT_border_select(wmOperatorType *ot)
ot->modal= WM_border_select_modal;
ot->poll= ED_operator_areaactive;
+
+ /* rna */
+ RNA_def_property(ot->rna, "event_type", PROP_INT, PROP_NONE);
+
}
@@ -1274,10 +1291,13 @@ void ED_keymap_screen(wmWindowManager *wm)
WM_keymap_verify_item(&wm->screenkeymap, "ED_SCR_OT_area_move", LEFTMOUSE, KM_PRESS, 0, 0);
WM_keymap_verify_item(&wm->screenkeymap, "ED_SCR_OT_area_split", EVT_ACTIONZONE, 0, 0, 0); /* action tria */
WM_keymap_verify_item(&wm->screenkeymap, "ED_SCR_OT_area_join", EVT_ACTIONZONE, 0, 0, 0); /* action tria */
- WM_keymap_verify_item(&wm->windowkeymap, "ED_SCR_OT_area_rip", RKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_verify_item(&wm->screenkeymap, "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);
+ WM_keymap_verify_item(&wm->screenkeymap, "ED_SCR_OT_border_select", BKEY, KM_PRESS, 0, 0);
+ WM_keymap_verify_item(&wm->screenkeymap, "WM_OT_tweak_gesture", LEFTMOUSE, KM_PRESS, 0, 0); /* generates event */
+
+ WM_keymap_add_item(&wm->screenkeymap, "ED_SCR_OT_area_split", EVT_TWEAK, EVT_GESTURE_S, 0, 0);
}
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index 40374f56967..c03a60ff65f 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -37,10 +37,6 @@ struct Scene;
struct SpaceType;
struct SpaceLink;
struct ARegionType;
-struct bContext;
-struct wmNotifier;
-struct wmWindowManager;
-
typedef struct bScreen {
ID id;
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index cb2bc80dfd2..9b2c1409887 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -103,6 +103,9 @@ void WM_operator_cancel (struct bContext *C, ListBase *modalops, wmOperatorTyp
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);
+ /* default operator for arearegions, generates event */
+void WM_OT_tweak_gesture(wmOperatorType *ot);
+
/* Gesture manager API */
struct wmGesture *WM_gesture_new(struct bContext *C, struct wmEvent *event, int type);
void WM_gesture_end(struct bContext *C, struct wmGesture *gesture);
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index adf4e2226b0..35dad1f0db2 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -81,8 +81,9 @@ typedef struct wmEvent {
#define KM_OSKEY2 128
/* val */
-#define KM_PRESS 2
-#define KM_RELEASE 1
+#define KM_ANY -1
+#define KM_RELEASE 0
+#define KM_PRESS 1
/* ************** notifiers ****************** */
@@ -113,17 +114,20 @@ enum {
/* ************** Gesture Manager data ************** */
/* 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 WM_GESTURE_TWEAK 0
+#define WM_GESTURE_LINE 1
+#define WM_GESTURE_RECT 2
+#define WM_GESTURE_CROSS_RECT 3
+#define WM_GESTURE_LASSO 4
+#define WM_GESTURE_CIRCLE 5
/* wmGesture is registered to window listbase, handled by operator callbacks */
typedef struct wmGesture {
struct wmGesture *next, *prev;
- int eventtype, mode;
- int type, swinid;
+ int event_type; /* event->type */
+ int mode; /* for modal callback */
+ int type; /* gesture type define */
+ int swinid; /* initial subwindow id where it started */
void *customdata;
/* customdata for border is a recti */
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index d0f812e31e6..c10faa6cadf 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -223,6 +223,8 @@ void wm_draw_update(bContext *C)
ED_screen_refresh(C->wm, win);
for(sa= win->screen->areabase.first; sa; sa= sa->next) {
+ int area_do_draw= 0;
+
C->area= sa;
for(ar=sa->regionbase.first; ar; ar= ar->next) {
@@ -232,12 +234,17 @@ void wm_draw_update(bContext *C)
if(ar->do_refresh)
ED_region_do_refresh(C, ar);
- if(ar->swinid && ar->do_draw)
+ if(ar->swinid && ar->do_draw) {
ED_region_do_draw(C, ar);
-
+ area_do_draw= 1;
+ }
+
C->region= NULL;
}
-
+ /* only internal decoration, like AZone */
+ if(area_do_draw)
+ ED_area_do_draw(C, sa);
+
C->area = NULL;
}
@@ -364,10 +371,11 @@ void WM_event_remove_handlers(ListBase *handlers)
static int wm_eventmatch(wmEvent *winevent, wmKeymapItem *km)
{
+
if(winevent->type!=km->type) return 0;
- if(km->val) /* KM_PRESS, KM_RELEASE */
- if(winevent->val!=km->val-1) return 0;
+ if(km->val!=KM_ANY)
+ if(winevent->val!=km->val) return 0;
if(winevent->shift!=km->shift) return 0;
if(winevent->ctrl!=km->ctrl) return 0;
@@ -648,7 +656,7 @@ void WM_event_add_message(wmWindowManager *wm, void *customdata, short customdat
event.type= MESSAGE;
if(customdata) {
- event.custom= EVT_MESSAGE;
+ event.custom= EVT_DATA_MESSAGE;
event.customdata= customdata;
event.customdatafree= customdatafree;
}
@@ -748,7 +756,7 @@ static void update_tablet_data(wmWindow *win, wmEvent *event)
wmtab->Xtilt = td->Xtilt;
wmtab->Ytilt = td->Ytilt;
- event->custom= EVT_TABLET;
+ event->custom= EVT_DATA_TABLET;
event->customdata= wmtab;
event->customdatafree= 1;
}
@@ -812,7 +820,7 @@ void wm_event_add_ghostevent(wmWindow *win, int type, void *customdata)
GHOST_TEventKeyData *kd= customdata;
event.type= convert_key(kd->key);
event.ascii= kd->ascii;
- event.val= (type==GHOST_kEventKeyDown);
+ event.val= (type==GHOST_kEventKeyDown); /* XXX eventmatch uses defines, bad code... */
/* modifiers */
if (event.type==LEFTSHIFTKEY || event.type==RIGHTSHIFTKEY) {
@@ -845,7 +853,7 @@ void wm_event_add_ghostevent(wmWindow *win, int type, void *customdata)
}
case GHOST_kEventTimer: {
event.type= TIMER;
- event.custom= EVT_TIMER;
+ event.custom= EVT_DATA_TIMER;
event.customdata= customdata;
wm_event_add(win, &event);
diff --git a/source/blender/windowmanager/intern/wm_gesture.c b/source/blender/windowmanager/intern/wm_gesture.c
index 0a927f3f191..a28eedc631e 100644
--- a/source/blender/windowmanager/intern/wm_gesture.c
+++ b/source/blender/windowmanager/intern/wm_gesture.c
@@ -26,6 +26,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <math.h>
+
#include "DNA_screen_types.h"
#include "DNA_vec_types.h"
#include "DNA_windowmanager_types.h"
@@ -55,12 +57,12 @@ wmGesture *WM_gesture_new(bContext *C, wmEvent *event, int type)
BLI_addtail(&C->window->gesture, gesture);
gesture->type= type;
- gesture->eventtype= event->type;
+ gesture->event_type= event->type;
gesture->swinid= C->screen->subwinactive; /* means only in area-region context! */
wm_subwindow_getorigin(C->window, gesture->swinid, &sx, &sy);
- if( ELEM(type, WM_GESTURE_RECT, WM_GESTURE_CROSS_RECT)) {
+ if( ELEM3(type, WM_GESTURE_RECT, WM_GESTURE_CROSS_RECT, WM_GESTURE_TWEAK)) {
rcti *rect= MEM_callocN(sizeof(rcti), "gesture rect new");
gesture->customdata= rect;
@@ -80,6 +82,47 @@ void WM_gesture_end(bContext *C, wmGesture *gesture)
MEM_freeN(gesture);
}
+/* for line, lasso, ... */
+void wm_gesture_point_add(bContext *C, wmGesture *gesture)
+{
+
+}
+
+/* tweak and line gestures */
+#define TWEAK_THRESHOLD 10
+int wm_gesture_evaluate(bContext *C, wmGesture *gesture)
+{
+ if(gesture->type==WM_GESTURE_TWEAK) {
+ rcti *rect= gesture->customdata;
+ int dx= rect->xmax - rect->xmin;
+ int dy= rect->ymax - rect->ymin;
+ if(ABS(dx)+ABS(dy) > TWEAK_THRESHOLD) {
+ int theta= (int)round(4.0f*atan2((float)dy, (float)dx)/M_PI);
+ int val= EVT_GESTURE_W;
+
+ if(theta==0) val= EVT_GESTURE_E;
+ else if(theta==1) val= EVT_GESTURE_NE;
+ else if(theta==2) val= EVT_GESTURE_N;
+ else if(theta==3) val= EVT_GESTURE_NW;
+ else if(theta==-1) val= EVT_GESTURE_SE;
+ else if(theta==-2) val= EVT_GESTURE_S;
+ else if(theta==-3) val= EVT_GESTURE_SW;
+
+ /* debug */
+ if(val==1) printf("tweak north\n");
+ if(val==2) printf("tweak north-east\n");
+ if(val==3) printf("tweak east\n");
+ if(val==4) printf("tweak south-east\n");
+ if(val==5) printf("tweak south\n");
+ if(val==6) printf("tweak south-west\n");
+ if(val==7) printf("tweak west\n");
+ if(val==8) printf("tweak north-west\n");
+
+ return val;
+ }
+ }
+ return 0;
+}
/* ******************* gesture draw ******************* */
@@ -90,7 +133,7 @@ static void wm_gesture_draw_rect(wmWindow *win, wmGesture *gt)
glEnable(GL_LINE_STIPPLE);
glColor3ub(0, 0, 0);
- glLineStipple(1, 0xAAAA);
+ glLineStipple(1, 0xCCCC);
sdrawbox(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
glColor3ub(255, 255, 255);
glLineStipple(1, 0x3333);
@@ -98,13 +141,29 @@ static void wm_gesture_draw_rect(wmWindow *win, wmGesture *gt)
glDisable(GL_LINE_STIPPLE);
}
-static void wm_gesture_draw_cross(wmWindow *win, wmGesture *gt)
+static void wm_gesture_draw_line(wmWindow *win, wmGesture *gt)
{
rcti *rect= (rcti *)gt->customdata;
glEnable(GL_LINE_STIPPLE);
glColor3ub(0, 0, 0);
glLineStipple(1, 0xAAAA);
+ sdrawline(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
+ glColor3ub(255, 255, 255);
+ glLineStipple(1, 0x5555);
+ sdrawline(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
+
+ glDisable(GL_LINE_STIPPLE);
+
+}
+
+static void wm_gesture_draw_cross(wmWindow *win, wmGesture *gt)
+{
+ rcti *rect= (rcti *)gt->customdata;
+
+ glEnable(GL_LINE_STIPPLE);
+ glColor3ub(0, 0, 0);
+ glLineStipple(1, 0xCCCC);
sdrawline(rect->xmin - win->sizex, rect->ymin, rect->xmin + win->sizex, rect->ymin);
sdrawline(rect->xmin, rect->ymin - win->sizey, rect->xmin, rect->ymin + win->sizey);
@@ -126,6 +185,8 @@ void wm_gesture_draw(wmWindow *win)
if(gt->type==WM_GESTURE_RECT)
wm_gesture_draw_rect(win, gt);
+ else if(gt->type==WM_GESTURE_TWEAK)
+ wm_gesture_draw_line(win, gt);
else if(gt->type==WM_GESTURE_CROSS_RECT) {
if(gt->mode==1)
wm_gesture_draw_rect(win, gt);
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index 7a5ec0e4d47..610222b4372 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -71,12 +71,11 @@ static void keymap_set(wmKeymapItem *km, short type, short val, int modifier, sh
km->oskey= 2;
}
-/* if item was added, then replace */
+/* if item was added, then bail out */
void WM_keymap_verify_item(ListBase *lb, char *idname, short type, short val, int modifier, short keymodifier)
{
wmKeymapItem *km;
- /* if item was added, then bail out */
for(km= lb->first; km; km= km->next)
if(strncmp(km->idname, idname, OP_MAX_TYPENAME)==0)
break;
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index b8c822592df..32800ff31dc 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -48,6 +48,7 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "wm.h"
#include "wm_window.h"
#include "wm_subwindow.h"
#include "wm_event_system.h"
@@ -143,7 +144,16 @@ static void WM_OT_exit_blender(wmOperatorType *ot)
* These are default callbacks for use in operators requiring gesture input
*/
-static void border_select_apply(bContext *C, wmOperator *op)
+/* **************** Border gesture *************** */
+
+/* Border gesture has two types:
+ 1) WM_GESTURE_CROSS_RECT: starts a cross, on mouse click it changes to border
+ 2) WM_GESTURE_RECT: starts immediate as a border, on mouse click or release it ends
+
+ It stores 4 values (xmin, xmax, ymin, ymax) and event it ended with (event_type)
+*/
+
+static void border_select_apply(bContext *C, wmOperator *op, int event_type)
{
wmGesture *gesture= op->customdata;
rcti *rect= gesture->customdata;
@@ -154,6 +164,8 @@ static void border_select_apply(bContext *C, wmOperator *op)
RNA_int_default(op->rna, "xmax", rect->xmax);
RNA_int_default(op->rna, "ymax", rect->ymax);
+ RNA_int_default(op->rna, "event_type", event_type);
+
op->type->exec(C, op);
}
@@ -205,6 +217,8 @@ int WM_border_select_modal(bContext *C, wmOperator *op, wmEvent *event)
break;
case LEFTMOUSE:
+ case MIDDLEMOUSE:
+ case RIGHTMOUSE:
if(event->val==1) {
if(gesture->type==WM_GESTURE_CROSS_RECT && gesture->mode==0) {
gesture->mode= 1;
@@ -212,7 +226,7 @@ int WM_border_select_modal(bContext *C, wmOperator *op, wmEvent *event)
}
}
else {
- border_select_apply(C, op);
+ border_select_apply(C, op, event->type);
border_select_end(C, op);
return OPERATOR_FINISHED;
}
@@ -224,6 +238,87 @@ int WM_border_select_modal(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
+/* **************** Tweak gesture *************** */
+
+static int tweak_gesture_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ op->customdata= WM_gesture_new(C, event, WM_GESTURE_TWEAK);
+
+ /* add modal handler */
+ WM_event_add_modal_handler(&C->window->handlers, op);
+
+ WM_event_add_notifier(C->wm, C->window, C->screen->subwinactive, WM_NOTE_GESTURE_REDRAW, 0, NULL);
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+static void tweak_gesture_end(bContext *C, wmOperator *op)
+{
+ wmGesture *gesture= op->customdata;
+
+ WM_gesture_end(C, gesture); /* frees gesture itself, and unregisters from window */
+ op->customdata= NULL;
+ WM_event_remove_modal_handler(&C->window->handlers, op);
+ WM_event_add_notifier(C->wm, C->window, gesture->swinid, WM_NOTE_AREA_REDRAW, 0, NULL);
+
+}
+
+static int tweak_gesture_modal(bContext *C, wmOperator *op, wmEvent *event)
+{
+ wmGesture *gesture= op->customdata;
+ rcti *rect= gesture->customdata;
+ int sx, sy, val;
+
+ switch(event->type) {
+ case MOUSEMOVE:
+
+ wm_subwindow_getorigin(C->window, gesture->swinid, &sx, &sy);
+
+ rect->xmax= event->x - sx;
+ rect->ymax= event->y - sy;
+
+ if((val= wm_gesture_evaluate(C, gesture))) {
+ wmEvent event;
+
+ event= *(C->window->eventstate);
+ event.type= EVT_TWEAK;
+ event.val= val;
+ /* mouse coords! */
+ wm_event_add(C->window, &event);
+
+ tweak_gesture_end(C, op);
+ return OPERATOR_FINISHED;
+ }
+ else
+ WM_event_add_notifier(C->wm, C->window, gesture->swinid, WM_NOTE_GESTURE_REDRAW, 0, NULL);
+
+ break;
+
+ case LEFTMOUSE:
+ case RIGHTMOUSE:
+ case MIDDLEMOUSE:
+ if(gesture->event_type==event->type) {
+ wm_gesture_evaluate(C, gesture);
+ tweak_gesture_end(C, op);
+ return OPERATOR_FINISHED;
+ }
+ break;
+ }
+ return OPERATOR_RUNNING_MODAL;
+}
+
+void WM_OT_tweak_gesture(wmOperatorType *ot)
+{
+ ot->name= "Tweak Gesture";
+ ot->idname= "WM_OT_tweak_gesture";
+
+ ot->invoke= tweak_gesture_invoke;
+ ot->modal= tweak_gesture_modal;
+
+ ot->poll= WM_operator_winactive;
+}
+
+
/* ******************************************************* */
/* called on initialize WM_exit() */
@@ -239,6 +334,7 @@ void wm_operatortype_init(void)
WM_operatortype_append(WM_OT_save_homefile);
WM_operatortype_append(WM_OT_window_fullscreen_toggle);
WM_operatortype_append(WM_OT_exit_blender);
+ WM_operatortype_append(WM_OT_tweak_gesture);
}
/* default keymap for windows and screens, only call once per WM */
diff --git a/source/blender/windowmanager/wm.h b/source/blender/windowmanager/wm.h
index ec9c56f6404..139c360dfda 100644
--- a/source/blender/windowmanager/wm.h
+++ b/source/blender/windowmanager/wm.h
@@ -49,6 +49,7 @@ void wm_window_keymap(wmWindowManager *wm);
/* wm_gesture.c */
void wm_gesture_draw(struct wmWindow *win);
+int wm_gesture_evaluate(bContext *C, wmGesture *gesture);
#endif /* WM_H */
diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h
index da644d77611..1edaec417c2 100644
--- a/source/blender/windowmanager/wm_event_types.h
+++ b/source/blender/windowmanager/wm_event_types.h
@@ -35,11 +35,11 @@
#ifndef WM_EVENT_TYPES_H
#define WM_EVENT_TYPES_H
-/* custom data type */
-#define EVT_TABLET 1
-#define EVT_GESTURE 2
-#define EVT_TIMER 3
-#define EVT_MESSAGE 4
+/* customdata type */
+#define EVT_DATA_TABLET 1
+#define EVT_DATA_GESTURE 2
+#define EVT_DATA_TIMER 3
+#define EVT_DATA_MESSAGE 4
#define MOUSEX 0x004
#define MOUSEY 0x005
@@ -259,8 +259,28 @@
/* **************** BLENDER GESTURE EVENTS ********************* */
-#define BORDERSELECT 0x5000
#define EVT_ACTIONZONE 0x5001
+#define EVT_TWEAK 0x5002
+#define EVT_GESTURE 0x5003
+
+/* value of tweaks and line gestures, note, KM_ANY (-1) works for this case too */
+#define EVT_GESTURE_N 1
+#define EVT_GESTURE_NE 2
+#define EVT_GESTURE_E 3
+#define EVT_GESTURE_SE 4
+#define EVT_GESTURE_S 5
+#define EVT_GESTURE_SW 6
+#define EVT_GESTURE_W 7
+#define EVT_GESTURE_NW 8
+/* value of corner gestures */
+#define EVT_GESTURE_N_E 9
+#define EVT_GESTURE_N_W 10
+#define EVT_GESTURE_E_N 11
+#define EVT_GESTURE_E_S 12
+#define EVT_GESTURE_S_E 13
+#define EVT_GESTURE_S_W 14
+#define EVT_GESTURE_W_S 15
+#define EVT_GESTURE_W_N 16
#endif /* WM_EVENT_TYPES_H */