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:
authorDamien Plisson <damien.plisson@yahoo.fr>2010-01-11 14:14:36 +0300
committerDamien Plisson <damien.plisson@yahoo.fr>2010-01-11 14:14:36 +0300
commit4a011a99cb9f45e0d76b134d72c2c2ab150ba006 (patch)
tree6141ccea3ff99236c32e31f479ef5ba36835a629 /source/blender
parentebb9286fd65d3cb1aae001080dbdb7102e7b49bf (diff)
Multitouch trackpad 2 fingers gestures implementation
- 2 fingers scroll (MOUSEPAN / GHOST_kTrackpadEventScroll event) pans/scrolls the view - 2 fingers pinch (MOUSEZOOM / GHOST_kTrackpadEventMagnify event) zooms the view And in 3D view: - alt + 2 fingers scroll rotates the view - 2 fingers rotation (MOUSEROTATE / GHOST_kTrackpadEventRotate) orbits the view. The implementation uses a new GHOST event type: GHOST_kEventTrackpad, that is then dispatched as Blender MOUSEPAN, MOUSEZOOM or MOUSEROTATE events. This is currently fully implemented for OSX (GHOST Cocoa fires the new events), with auto-detection of the source peripheral, so that a regular mouse still sends MOUSEWHEEL events.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/editors/interface/view2d_ops.c35
-rw-r--r--source/blender/editors/space_image/image_ops.c35
-rw-r--r--source/blender/editors/space_image/space_image.c2
-rw-r--r--source/blender/editors/space_outliner/outliner.c3
-rw-r--r--source/blender/editors/space_text/space_text.c1
-rw-r--r--source/blender/editors/space_text/text_ops.c53
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c88
-rw-r--r--source/blender/editors/space_view3d/view3d_ops.c5
-rw-r--r--source/blender/makesrna/intern/rna_wm.c6
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c34
-rw-r--r--source/blender/windowmanager/wm_event_types.h10
11 files changed, 227 insertions, 45 deletions
diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c
index 57882b7dd0d..bd325eb79eb 100644
--- a/source/blender/editors/interface/view2d_ops.c
+++ b/source/blender/editors/interface/view2d_ops.c
@@ -199,6 +199,16 @@ static int view_pan_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* set initial settings */
vpd->startx= vpd->lastx= event->x;
vpd->starty= vpd->lasty= event->y;
+
+ if (event->type == MOUSEPAN) {
+ RNA_int_set(op->ptr, "deltax", event->prevx - event->x);
+ RNA_int_set(op->ptr, "deltay", event->prevy - event->y);
+
+ view_pan_apply(C, op);
+ view_pan_exit(C, op);
+ return OPERATOR_FINISHED;
+ }
+
RNA_int_set(op->ptr, "deltax", 0);
RNA_int_set(op->ptr, "deltay", 0);
@@ -789,6 +799,26 @@ static int view_zoomdrag_invoke(bContext *C, wmOperator *op, wmEvent *event)
vzd= op->customdata;
v2d= vzd->v2d;
+ if (event->type == MOUSEZOOM) {
+ float dx, dy, fac;
+
+ vzd->lastx= event->prevx;
+ vzd->lasty= event->prevy;
+
+ /* As we have only 1D information (magnify value), feed both axes
+ with magnify information that is stored in x axis */
+ fac= 0.01f * (event->x - event->prevx);
+ dx= fac * (v2d->cur.xmax - v2d->cur.xmin) / 10.0f;
+ dy= fac * (v2d->cur.ymax - v2d->cur.ymin) / 10.0f;
+
+ RNA_float_set(op->ptr, "deltax", dx);
+ RNA_float_set(op->ptr, "deltay", dy);
+
+ view_zoomdrag_apply(C, op);
+ view_zoomdrag_exit(C, op);
+ return OPERATOR_FINISHED;
+ }
+
/* set initial settings */
vzd->lastx= event->x;
vzd->lasty= event->y;
@@ -1467,6 +1497,8 @@ void UI_view2d_keymap(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "VIEW2D_OT_pan", MIDDLEMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_pan", MIDDLEMOUSE, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "VIEW2D_OT_pan", MOUSEPAN, 0, 0, 0);
+
WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_right", WHEELDOWNMOUSE, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_left", WHEELUPMOUSE, KM_PRESS, KM_CTRL, 0);
@@ -1489,6 +1521,7 @@ void UI_view2d_keymap(wmKeyConfig *keyconf)
/* zoom - drag */
WM_keymap_add_item(keymap, "VIEW2D_OT_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "VIEW2D_OT_zoom", MOUSEZOOM, 0, 0, 0);
/* borderzoom - drag */
WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_border", BKEY, KM_PRESS, KM_SHIFT, 0);
@@ -1499,9 +1532,11 @@ void UI_view2d_keymap(wmKeyConfig *keyconf)
/* Alternative keymap for buttons listview */
keymap= WM_keymap_find(keyconf, "View2D Buttons List", 0, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_pan", MIDDLEMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "VIEW2D_OT_pan", MOUSEPAN, 0, 0, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_down", WHEELDOWNMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_up", WHEELUPMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "VIEW2D_OT_zoom", MOUSEZOOM, 0, 0, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_out", PADMINUS, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_in", PADPLUSKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_reset", HOMEKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 827b2ddeac2..cef92153725 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -214,8 +214,21 @@ static int view_pan_exec(bContext *C, wmOperator *op)
static int view_pan_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- view_pan_init(C, op, event);
- return OPERATOR_RUNNING_MODAL;
+ if (event->type == MOUSEPAN) {
+ SpaceImage *sima= CTX_wm_space_image(C);
+ float offset[2];
+
+ offset[0]= (event->x - event->prevx)/sima->zoom;
+ offset[1]= (event->y - event->prevy)/sima->zoom;
+ RNA_float_set_array(op->ptr, "offset", offset);
+
+ view_pan_exec(C, op);
+ return OPERATOR_FINISHED;
+ }
+ else {
+ view_pan_init(C, op, event);
+ return OPERATOR_RUNNING_MODAL;
+ }
}
static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event)
@@ -331,8 +344,22 @@ static int view_zoom_exec(bContext *C, wmOperator *op)
static int view_zoom_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- view_zoom_init(C, op, event);
- return OPERATOR_RUNNING_MODAL;
+ if (event->type == MOUSEZOOM) {
+ SpaceImage *sima= CTX_wm_space_image(C);
+ ARegion *ar= CTX_wm_region(C);
+ float factor;
+
+ factor= 1.0 + (event->x-event->prevx+event->y-event->prevy)/300.0f;
+ RNA_float_set(op->ptr, "factor", factor);
+ sima_zoom_set(sima, ar, sima->zoom*factor);
+ ED_area_tag_redraw(CTX_wm_area(C));
+
+ return OPERATOR_FINISHED;
+ }
+ else {
+ view_zoom_init(C, op, event);
+ return OPERATOR_RUNNING_MODAL;
+ }
}
static int view_zoom_modal(bContext *C, wmOperator *op, wmEvent *event)
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index 4622962bac5..6c325d9722f 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -219,12 +219,14 @@ void image_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "IMAGE_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_view_pan", MIDDLEMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "IMAGE_OT_view_pan", MOUSEPAN, 0, 0, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_in", WHEELINMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_out", WHEELOUTMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_in", PADPLUSKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_out", PADMINUS, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom", MOUSEZOOM, 0, 0, 0);
RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD8, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 8.0f);
RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD4, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 4.0f);
diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c
index 93b32086614..79a16a50544 100644
--- a/source/blender/editors/space_outliner/outliner.c
+++ b/source/blender/editors/space_outliner/outliner.c
@@ -5104,6 +5104,9 @@ static char *keymap_mouse_menu(void)
str += sprintf(str, formatstr, "Wheel Down", WHEELDOWNMOUSE);
str += sprintf(str, formatstr, "Wheel In", WHEELINMOUSE);
str += sprintf(str, formatstr, "Wheel Out", WHEELOUTMOUSE);
+ str += sprintf(str, formatstr, "Mouse/Trackpad Pan", MOUSEPAN);
+ str += sprintf(str, formatstr, "Mouse/Trackpad Zoom", MOUSEZOOM);
+ str += sprintf(str, formatstr, "Mouse/Trackpad Rotate", MOUSEROTATE);
return string;
}
diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c
index 292249bb0e8..c7601ef692e 100644
--- a/source/blender/editors/space_text/space_text.c
+++ b/source/blender/editors/space_text/space_text.c
@@ -313,6 +313,7 @@ static void text_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "TEXT_OT_overwrite_toggle", INSERTKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "TEXT_OT_scroll", MIDDLEMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "TEXT_OT_scroll", MOUSEPAN, 0, 0, 0);
WM_keymap_add_item(keymap, "TEXT_OT_scroll_bar", LEFTMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "TEXT_OT_cursor_set", LEFTMOUSE, KM_PRESS, 0, 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "TEXT_OT_cursor_set", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "select", 1);
diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c
index 0504db51a72..e5a1e772523 100644
--- a/source/blender/editors/space_text/text_ops.c
+++ b/source/blender/editors/space_text/text_ops.c
@@ -1720,25 +1720,6 @@ static int scroll_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int scroll_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
- SpaceText *st= CTX_wm_space_text(C);
- TextScroll *tsc;
-
- if(RNA_property_is_set(op->ptr, "lines"))
- return scroll_exec(C, op);
-
- tsc= MEM_callocN(sizeof(TextScroll), "TextScroll");
- tsc->first= 1;
- op->customdata= tsc;
-
- st->flags|= ST_SCROLL_SELECT;
-
- WM_event_add_modal_handler(C, op);
-
- return OPERATOR_RUNNING_MODAL;
-}
-
static void scroll_apply(bContext *C, wmOperator *op, wmEvent *event)
{
SpaceText *st= CTX_wm_space_text(C);
@@ -1816,6 +1797,40 @@ static int scroll_cancel(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
+static int scroll_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ SpaceText *st= CTX_wm_space_text(C);
+ TextScroll *tsc;
+
+ if(RNA_property_is_set(op->ptr, "lines"))
+ return scroll_exec(C, op);
+
+ tsc= MEM_callocN(sizeof(TextScroll), "TextScroll");
+ tsc->first= 1;
+ op->customdata= tsc;
+
+ st->flags|= ST_SCROLL_SELECT;
+
+ if (event->type == MOUSEPAN) {
+ text_update_character_width(st);
+
+ tsc->hold[0] = event->prevx;
+ tsc->hold[1] = event->prevy;
+ /* Sensitivity of scroll set to 4pix per line/char */
+ event->mval[0] = event->prevx + (event->x - event->prevx)*st->cwidth/4;
+ event->mval[1] = event->prevy + (event->y - event->prevy)*st->lheight/4;
+ tsc->first = 0;
+ tsc->scrollbar = 0;
+ scroll_apply(C, op, event);
+ scroll_exit(C, op);
+ return OPERATOR_FINISHED;
+ }
+
+ WM_event_add_modal_handler(C, op);
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
void TEXT_OT_scroll(wmOperatorType *ot)
{
/* identifiers */
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index 1e23d27fe77..288918c3c1e 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -554,7 +554,7 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
invert_m3_m3(m_inv,m);
/* Determine the direction of the x vector (for rotating up and down) */
- /* This can likely be compuated directly from the quaternion. */
+ /* This can likely be computed directly from the quaternion. */
mul_m3_v3(m_inv,xvec);
/* Perform the up/down rotation */
@@ -690,11 +690,30 @@ static int viewrotate_invoke(bContext *C, wmOperator *op, wmEvent *event)
vod->rv3d->persp= RV3D_PERSP;
ED_region_tag_redraw(vod->ar);
}
+
+ if (event->type == MOUSEPAN) {
+ viewrotate_apply(vod, event->prevx, event->prevy);
+ request_depth_update(CTX_wm_region_view3d(C));
+
+ viewops_data_free(C, op);
+
+ return OPERATOR_FINISHED;
+ }
+ else if (event->type == MOUSEROTATE) {
+ /* MOUSEROTATE performs orbital rotation, so y axis delta is set to 0 */
+ viewrotate_apply(vod, event->prevx, event->y);
+ request_depth_update(CTX_wm_region_view3d(C));
+
+ viewops_data_free(C, op);
+
+ return OPERATOR_FINISHED;
+ }
+ else {
+ /* add temp handler */
+ WM_event_add_modal_handler(C, op);
- /* add temp handler */
- WM_event_add_modal_handler(C, op);
-
- return OPERATOR_RUNNING_MODAL;
+ return OPERATOR_RUNNING_MODAL;
+ }
}
static int ED_operator_view3d_rotate(bContext *C)
@@ -838,13 +857,23 @@ static int viewmove_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* makes op->customdata */
viewops_data_create(C, op, event);
- /* add temp handler */
- WM_event_add_modal_handler(C, op);
+ if (event->type == MOUSEPAN) {
+ ViewOpsData *vod= op->customdata;
+ viewmove_apply(vod, event->prevx, event->prevy);
+ request_depth_update(CTX_wm_region_view3d(C));
+
+ viewops_data_free(C, op);
+
+ return OPERATOR_FINISHED;
+ }
+ else {
+ /* add temp handler */
+ WM_event_add_modal_handler(C, op);
- return OPERATOR_RUNNING_MODAL;
+ return OPERATOR_RUNNING_MODAL;
+ }
}
-
void VIEW3D_OT_move(wmOperatorType *ot)
{
@@ -940,11 +969,11 @@ static void view_zoom_mouseloc(ARegion *ar, float dfac, int mx, int my)
}
-static void viewzoom_apply(ViewOpsData *vod, int x, int y)
+static void viewzoom_apply(ViewOpsData *vod, int x, int y, short viewzoom)
{
float zfac=1.0;
- if(U.viewzoom==USER_ZOOM_CONT) {
+ if(viewzoom==USER_ZOOM_CONT) {
double time= PIL_check_seconds_timer();
float time_step= (float)(time - vod->timer_lastdraw);
@@ -952,7 +981,7 @@ static void viewzoom_apply(ViewOpsData *vod, int x, int y)
zfac = 1.0f + (((float)(vod->origx - x + vod->origy - y)/20.0) * time_step);
vod->timer_lastdraw= time;
}
- else if(U.viewzoom==USER_ZOOM_SCALE) {
+ else if(viewzoom==USER_ZOOM_SCALE) {
int ctr[2], len1, len2;
// method which zooms based on how far you move the mouse
@@ -986,7 +1015,7 @@ static void viewzoom_apply(ViewOpsData *vod, int x, int y)
view_zoom_mouseloc(vod->ar, zfac, vod->oldx, vod->oldy);
- if ((U.uiflag & USER_ORBIT_ZBUF) && (U.viewzoom==USER_ZOOM_CONT) && (vod->rv3d->persp==RV3D_PERSP)) {
+ if ((U.uiflag & USER_ORBIT_ZBUF) && (viewzoom==USER_ZOOM_CONT) && (vod->rv3d->persp==RV3D_PERSP)) {
float upvec[3], mat[3][3];
/* Secret apricot feature, translate the view when in continues mode */
@@ -1043,7 +1072,7 @@ static int viewzoom_modal(bContext *C, wmOperator *op, wmEvent *event)
}
if(event_code==VIEW_APPLY) {
- viewzoom_apply(vod, event->x, event->y);
+ viewzoom_apply(vod, event->x, event->y, U.viewzoom);
}
else if (event_code==VIEW_CONFIRM) {
request_depth_update(CTX_wm_region_view3d(C));
@@ -1114,13 +1143,34 @@ static int viewzoom_invoke(bContext *C, wmOperator *op, wmEvent *event)
vod= op->customdata;
- vod->timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f);
- vod->timer_lastdraw= PIL_check_seconds_timer();
+ if (event->type == MOUSEZOOM) {
+ if (U.uiflag & USER_ZOOM_INVERT) /* Bypass Zoom invert flag */
+ SWAP(int, event->x, event->prevx);
- /* add temp handler */
- WM_event_add_modal_handler(C, op);
+ if (U.uiflag & USER_ZOOM_DOLLY_HORIZ) {
+ vod->origx = vod->oldx = event->x;
+ viewzoom_apply(vod, event->prevx, event->prevy, USER_ZOOM_DOLLY);
+ }
+ else {
+
+ /* Set y move = x move as MOUSEZOOM uses only x axis to pass magnification value */
+ vod->origy = vod->oldy = event->x;
+ viewzoom_apply(vod, event->x, event->prevx, USER_ZOOM_DOLLY);
+ }
+ request_depth_update(CTX_wm_region_view3d(C));
+
+ viewops_data_free(C, op);
+ return OPERATOR_FINISHED;
+ }
+ else {
+ vod->timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f);
+ vod->timer_lastdraw= PIL_check_seconds_timer();
- return OPERATOR_RUNNING_MODAL;
+ /* add temp handler */
+ WM_event_add_modal_handler(C, op);
+
+ return OPERATOR_RUNNING_MODAL;
+ }
}
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/space_view3d/view3d_ops.c b/source/blender/editors/space_view3d/view3d_ops.c
index 2bcd78b3d3d..2e134da7e02 100644
--- a/source/blender/editors/space_view3d/view3d_ops.c
+++ b/source/blender/editors/space_view3d/view3d_ops.c
@@ -133,6 +133,11 @@ void view3d_keymap(wmKeyConfig *keyconf)
WM_keymap_verify_item(keymap, "VIEW3D_OT_smoothview", TIMER1, KM_ANY, KM_ANY, 0);
+ WM_keymap_add_item(keymap, "VIEW3D_OT_rotate", MOUSEPAN, 0, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "VIEW3D_OT_rotate", MOUSEROTATE, 0, 0, 0);
+ WM_keymap_add_item(keymap, "VIEW3D_OT_move", MOUSEPAN, 0, 0, 0);
+ WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", MOUSEZOOM, 0, 0, 0);
+
RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", PADPLUSKEY, KM_PRESS, 0, 0)->ptr, "delta", 1);
RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", PADMINUS, KM_PRESS, 0, 0)->ptr, "delta", -1);
RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", WHEELINMOUSE, KM_PRESS, 0, 0)->ptr, "delta", 1);
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 513f2f8f0ec..a3a2bc35dc1 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -85,6 +85,9 @@ EnumPropertyItem event_mouse_type_items[]= {
{SELECTMOUSE, "SELECTMOUSE", 0, "Select", ""},
{0, "", 0, NULL, NULL},
{MOUSEMOVE, "MOUSEMOVE", 0, "Move", ""},
+ {MOUSEPAN, "TRACKPADPAN", 0, "Mouse/Trackpad Pan", ""},
+ {MOUSEZOOM, "TRACKPADZOOM", 0, "Mouse/Trackpad Zoom", ""},
+ {MOUSEROTATE, "MOUSEROTATE", 0, "Mouse/Trackpad Rotate", ""},
{0, "", 0, NULL, NULL},
{WHEELUPMOUSE, "WHEELUPMOUSE", 0, "Wheel Up", ""},
{WHEELDOWNMOUSE, "WHEELDOWNMOUSE", 0, "Wheel Down", ""},
@@ -112,6 +115,9 @@ EnumPropertyItem event_type_items[] = {
{SELECTMOUSE, "SELECTMOUSE", 0, "Select Mouse", ""},
{0, "", 0, NULL, NULL},
{MOUSEMOVE, "MOUSEMOVE", 0, "Mouse Move", ""},
+ {MOUSEPAN, "TRACKPADPAN", 0, "Mouse/Trackpad Pan", ""},
+ {MOUSEZOOM, "TRACKPADZOOM", 0, "Mouse/Trackpad Zoom", ""},
+ {MOUSEROTATE, "MOUSEROTATE", 0, "Mouse/Trackpad Rotate", ""},
{0, "", 0, NULL, NULL},
{WHEELUPMOUSE, "WHEELUPMOUSE", 0, "Wheel Up", ""},
{WHEELDOWNMOUSE, "WHEELDOWNMOUSE", 0, "Wheel Down", ""},
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index aff843dc1cb..f513488eca8 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -1760,6 +1760,40 @@ void wm_event_add_ghostevent(wmWindow *win, int type, void *customdata)
}
break;
}
+ case GHOST_kEventTrackpad: {
+ if (win->active) {
+ GHOST_TEventTrackpadData * pd = customdata;
+ switch (pd->subtype) {
+ case GHOST_kTrackpadEventMagnify:
+ event.type = MOUSEZOOM;
+ break;
+ case GHOST_kTrackpadEventRotate:
+ event.type = MOUSEROTATE;
+ break;
+ case GHOST_kTrackpadEventScroll:
+ default:
+ event.type= MOUSEPAN;
+ break;
+ }
+#if defined(__APPLE__) && defined(GHOST_COCOA)
+ //Cocoa already uses coordinates with y=0 at bottom, and returns inwindow coordinates on mouse moved event
+ event.x= evt->x = pd->x;
+ event.y = evt->y = pd->y;
+#else
+ int cx, cy;
+ GHOST_ScreenToClient(win->ghostwin, pd->x, pd->y, &cx, &cy);
+ event.x= evt->x= cx;
+ event.y= evt->y= (win->sizey-1) - cy;
+#endif
+ // Use prevx/prevy so we can calculate the delta later
+ event.prevx= event.x - pd->deltaX;
+ event.prevy= event.y - pd->deltaY;
+
+ update_tablet_data(win, &event);
+ wm_event_add(win, &event);
+ }
+ break;
+ }
/* mouse button */
case GHOST_kEventButtonDown:
case GHOST_kEventButtonUp: {
diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h
index 8179154fc98..a90eb702069 100644
--- a/source/blender/windowmanager/wm_event_types.h
+++ b/source/blender/windowmanager/wm_event_types.h
@@ -56,9 +56,13 @@
/* only use if you want user option switch possible */
#define ACTIONMOUSE 0x005
#define SELECTMOUSE 0x006
-/* Extra mouse buttons */
+ /* Extra mouse buttons */
#define BUTTON4MOUSE 0x007
#define BUTTON5MOUSE 0x008
+ /* Extra trackpad gestures */
+#define MOUSEPAN 0x00e
+#define MOUSEZOOM 0x00f
+#define MOUSEROTATE 0x010
/* defaults from ghost */
#define WHEELUPMOUSE 0x00a
#define WHEELDOWNMOUSE 0x00b
@@ -67,7 +71,7 @@
#define WHEELOUTMOUSE 0x00d
-/* SYSTEM : 0x01x */
+/* SYSTEM : 0x01xx */
#define INPUTCHANGE 0x0103 /* input connected or disconnected */
#define WINDEACTIVATE 0x0104 /* window is deactivated, focus lost */
@@ -202,7 +206,7 @@
#define ISKEYBOARD(event) (event >=' ' && event <=320)
/* test whether the event is a mouse button */
-#define ISMOUSE(event) (event >= LEFTMOUSE && event <= WHEELOUTMOUSE)
+#define ISMOUSE(event) (event >= LEFTMOUSE && event <= MOUSEROTATE)
/* test whether the event is timer event */
#define ISTIMER(event) (event >= TIMER && event <= TIMERAUTOSAVE)