diff options
author | Damien Plisson <damien.plisson@yahoo.fr> | 2010-01-11 14:14:36 +0300 |
---|---|---|
committer | Damien Plisson <damien.plisson@yahoo.fr> | 2010-01-11 14:14:36 +0300 |
commit | 4a011a99cb9f45e0d76b134d72c2c2ab150ba006 (patch) | |
tree | 6141ccea3ff99236c32e31f479ef5ba36835a629 /source | |
parent | ebb9286fd65d3cb1aae001080dbdb7102e7b49bf (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')
-rw-r--r-- | source/blender/editors/interface/view2d_ops.c | 35 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_ops.c | 35 | ||||
-rw-r--r-- | source/blender/editors/space_image/space_image.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_outliner/outliner.c | 3 | ||||
-rw-r--r-- | source/blender/editors/space_text/space_text.c | 1 | ||||
-rw-r--r-- | source/blender/editors/space_text/text_ops.c | 53 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_edit.c | 88 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_ops.c | 5 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_wm.c | 6 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 34 | ||||
-rw-r--r-- | source/blender/windowmanager/wm_event_types.h | 10 |
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) |