forked from bartvdbraak/blender
Fix T44605: OS X continuous grab issues.
This commit is contained in:
parent
ffe03cd264
commit
d9d3a2a500
@ -358,27 +358,20 @@ GHOST_TSuccess GHOST_SetCursorGrab(GHOST_WindowHandle windowhandle,
|
|||||||
int bounds[4], const int mouse_ungrab_xy[2])
|
int bounds[4], const int mouse_ungrab_xy[2])
|
||||||
{
|
{
|
||||||
GHOST_IWindow *window = (GHOST_IWindow *) windowhandle;
|
GHOST_IWindow *window = (GHOST_IWindow *) windowhandle;
|
||||||
GHOST_Rect bounds_rect, bounds_win;
|
GHOST_Rect bounds_rect;
|
||||||
GHOST_TInt32 mouse_ungrab_xy_global[2];
|
GHOST_TInt32 mouse_xy[2];
|
||||||
|
|
||||||
if (bounds) {
|
if (bounds) {
|
||||||
/* if this is X11 specific we need a function that converts */
|
bounds_rect = GHOST_Rect(bounds[0], bounds[1], bounds[2], bounds[3]);
|
||||||
window->getClientBounds(bounds_win);
|
|
||||||
window->clientToScreen(bounds[0], bounds_win.getHeight() - bounds[1], bounds_rect.m_l, bounds_rect.m_t);
|
|
||||||
window->clientToScreen(bounds[2], bounds_win.getHeight() - bounds[3], bounds_rect.m_r, bounds_rect.m_b);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mouse_ungrab_xy) {
|
if (mouse_ungrab_xy) {
|
||||||
if (bounds == NULL)
|
mouse_xy[0] = mouse_ungrab_xy[0];
|
||||||
window->getClientBounds(bounds_win);
|
mouse_xy[1] = mouse_ungrab_xy[1];
|
||||||
window->clientToScreen(mouse_ungrab_xy[0], bounds_win.getHeight() - mouse_ungrab_xy[1],
|
|
||||||
mouse_ungrab_xy_global[0], mouse_ungrab_xy_global[1]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return window->setCursorGrab(mode,
|
return window->setCursorGrab(mode,
|
||||||
bounds ? &bounds_rect : NULL,
|
bounds ? &bounds_rect : NULL,
|
||||||
mouse_ungrab_xy ? mouse_ungrab_xy_global : NULL);
|
mouse_ungrab_xy ? mouse_xy : NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1317,6 +1317,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr)
|
|||||||
GHOST_TInt32 x_warp, y_warp, x_accum, y_accum, x, y;
|
GHOST_TInt32 x_warp, y_warp, x_accum, y_accum, x, y;
|
||||||
|
|
||||||
window->getCursorGrabInitPos(x_warp, y_warp);
|
window->getCursorGrabInitPos(x_warp, y_warp);
|
||||||
|
window->screenToClientIntern(x_warp, y_warp, x_warp, y_warp);
|
||||||
|
|
||||||
window->getCursorGrabAccum(x_accum, y_accum);
|
window->getCursorGrabAccum(x_accum, y_accum);
|
||||||
x_accum += [event deltaX];
|
x_accum += [event deltaX];
|
||||||
@ -1368,6 +1369,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr)
|
|||||||
|
|
||||||
//Post event
|
//Post event
|
||||||
window->getCursorGrabInitPos(x_cur, y_cur);
|
window->getCursorGrabInitPos(x_cur, y_cur);
|
||||||
|
window->screenToClientIntern(x_cur, y_cur, x_cur, y_cur);
|
||||||
window->clientToScreenIntern(x_cur + x_accum, y_cur + y_accum, x, y);
|
window->clientToScreenIntern(x_cur + x_accum, y_cur + y_accum, x, y);
|
||||||
pushEvent(new GHOST_EventCursor([event timestamp] * 1000, GHOST_kEventCursorMove, window, x, y));
|
pushEvent(new GHOST_EventCursor([event timestamp] * 1000, GHOST_kEventCursorMove, window, x, y));
|
||||||
break;
|
break;
|
||||||
|
@ -1463,12 +1463,9 @@ GHOST_TSuccess GHOST_WindowCocoa::setWindowCursorGrab(GHOST_TGrabCursorMode mode
|
|||||||
if (mode != GHOST_kGrabDisable) {
|
if (mode != GHOST_kGrabDisable) {
|
||||||
//No need to perform grab without warp as it is always on in OS X
|
//No need to perform grab without warp as it is always on in OS X
|
||||||
if (mode != GHOST_kGrabNormal) {
|
if (mode != GHOST_kGrabNormal) {
|
||||||
GHOST_TInt32 x_old,y_old;
|
|
||||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||||
|
|
||||||
m_systemCocoa->getCursorPosition(x_old,y_old);
|
m_systemCocoa->getCursorPosition(m_cursorGrabInitPos[0], m_cursorGrabInitPos[1]);
|
||||||
screenToClientIntern(x_old, y_old, m_cursorGrabInitPos[0], m_cursorGrabInitPos[1]);
|
|
||||||
//Warp position is stored in client (window base) coordinates
|
|
||||||
setCursorGrabAccum(0, 0);
|
setCursorGrabAccum(0, 0);
|
||||||
|
|
||||||
if (mode == GHOST_kGrabHide) {
|
if (mode == GHOST_kGrabHide) {
|
||||||
@ -1486,7 +1483,7 @@ GHOST_TSuccess GHOST_WindowCocoa::setWindowCursorGrab(GHOST_TGrabCursorMode mode
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (m_cursorGrab==GHOST_kGrabHide) {
|
if (m_cursorGrab==GHOST_kGrabHide) {
|
||||||
//No need to set again cursor position, as it has not changed for Cocoa
|
m_systemCocoa->setCursorPosition(m_cursorGrabInitPos[0], m_cursorGrabInitPos[1]);
|
||||||
setWindowCursorVisibility(true);
|
setWindowCursorVisibility(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,14 +199,10 @@ void WM_cursor_grab_enable(wmWindow *win, bool wrap, bool hide, int bounds[4])
|
|||||||
* It helps not to get a stuck WM when hitting a breakpoint
|
* It helps not to get a stuck WM when hitting a breakpoint
|
||||||
* */
|
* */
|
||||||
GHOST_TGrabCursorMode mode = GHOST_kGrabNormal;
|
GHOST_TGrabCursorMode mode = GHOST_kGrabNormal;
|
||||||
float fac = GHOST_GetNativePixelSize(win->ghostwin);
|
|
||||||
|
|
||||||
/* in case pixel coords differ from window/mouse coords */
|
|
||||||
if (bounds) {
|
if (bounds) {
|
||||||
bounds[0] /= fac;
|
wm_cursor_position_to_ghost(win, &bounds[0], &bounds[1]);
|
||||||
bounds[1] /= fac;
|
wm_cursor_position_to_ghost(win, &bounds[2], &bounds[3]);
|
||||||
bounds[2] /= fac;
|
|
||||||
bounds[3] /= fac;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hide) {
|
if (hide) {
|
||||||
@ -234,7 +230,15 @@ void WM_cursor_grab_disable(wmWindow *win, const int mouse_ungrab_xy[2])
|
|||||||
{
|
{
|
||||||
if ((G.debug & G_DEBUG) == 0) {
|
if ((G.debug & G_DEBUG) == 0) {
|
||||||
if (win && win->ghostwin) {
|
if (win && win->ghostwin) {
|
||||||
GHOST_SetCursorGrab(win->ghostwin, GHOST_kGrabDisable, NULL, mouse_ungrab_xy);
|
if (mouse_ungrab_xy) {
|
||||||
|
int mouse_xy[2] = {mouse_ungrab_xy[0], mouse_ungrab_xy[1]};
|
||||||
|
wm_cursor_position_to_ghost(win, &mouse_xy[0], &mouse_xy[1]);
|
||||||
|
GHOST_SetCursorGrab(win->ghostwin, GHOST_kGrabDisable, NULL, mouse_xy);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
GHOST_SetCursorGrab(win->ghostwin, GHOST_kGrabDisable, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
win->grabcursor = GHOST_kGrabDisable;
|
win->grabcursor = GHOST_kGrabDisable;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -676,7 +676,7 @@ int wm_window_fullscreen_toggle_exec(bContext *C, wmOperator *UNUSED(op))
|
|||||||
|
|
||||||
/* ************ events *************** */
|
/* ************ events *************** */
|
||||||
|
|
||||||
static void wm_convert_cursor_position(wmWindow *win, int *x, int *y)
|
void wm_cursor_position_from_ghost(wmWindow *win, int *x, int *y)
|
||||||
{
|
{
|
||||||
float fac = GHOST_GetNativePixelSize(win->ghostwin);
|
float fac = GHOST_GetNativePixelSize(win->ghostwin);
|
||||||
|
|
||||||
@ -687,11 +687,21 @@ static void wm_convert_cursor_position(wmWindow *win, int *x, int *y)
|
|||||||
*y *= fac;
|
*y *= fac;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wm_cursor_position_to_ghost(wmWindow *win, int *x, int *y)
|
||||||
|
{
|
||||||
|
float fac = GHOST_GetNativePixelSize(win->ghostwin);
|
||||||
|
|
||||||
|
*x /= fac;
|
||||||
|
*y /= fac;
|
||||||
|
*y = win->sizey - *y - 1;
|
||||||
|
|
||||||
|
GHOST_ClientToScreen(win->ghostwin, *x, *y, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
void wm_get_cursor_position(wmWindow *win, int *x, int *y)
|
void wm_get_cursor_position(wmWindow *win, int *x, int *y)
|
||||||
{
|
{
|
||||||
GHOST_GetCursorPosition(g_system, x, y);
|
GHOST_GetCursorPosition(g_system, x, y);
|
||||||
wm_convert_cursor_position(win, x, y);
|
wm_cursor_position_from_ghost(win, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@ -1118,7 +1128,7 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr
|
|||||||
{
|
{
|
||||||
GHOST_TEventTrackpadData *pd = data;
|
GHOST_TEventTrackpadData *pd = data;
|
||||||
|
|
||||||
wm_convert_cursor_position(win, &pd->x, &pd->y);
|
wm_cursor_position_from_ghost(win, &pd->x, &pd->y);
|
||||||
wm_event_add_ghostevent(wm, win, type, time, data);
|
wm_event_add_ghostevent(wm, win, type, time, data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1126,7 +1136,7 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr
|
|||||||
{
|
{
|
||||||
GHOST_TEventCursorData *cd = data;
|
GHOST_TEventCursorData *cd = data;
|
||||||
|
|
||||||
wm_convert_cursor_position(win, &cd->x, &cd->y);
|
wm_cursor_position_from_ghost(win, &cd->x, &cd->y);
|
||||||
wm_event_add_ghostevent(wm, win, type, time, data);
|
wm_event_add_ghostevent(wm, win, type, time, data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1541,14 +1551,9 @@ void WM_init_native_pixels(bool do_it)
|
|||||||
void WM_cursor_warp(wmWindow *win, int x, int y)
|
void WM_cursor_warp(wmWindow *win, int x, int y)
|
||||||
{
|
{
|
||||||
if (win && win->ghostwin) {
|
if (win && win->ghostwin) {
|
||||||
float f = GHOST_GetNativePixelSize(win->ghostwin);
|
|
||||||
int oldx = x, oldy = y;
|
int oldx = x, oldy = y;
|
||||||
|
|
||||||
x = x / f;
|
wm_cursor_position_to_ghost(win, &x, &y);
|
||||||
y = y / f;
|
|
||||||
y = win->sizey - y - 1;
|
|
||||||
|
|
||||||
GHOST_ClientToScreen(win->ghostwin, x, y, &x, &y);
|
|
||||||
GHOST_SetCursorPosition(g_system, x, y);
|
GHOST_SetCursorPosition(g_system, x, y);
|
||||||
|
|
||||||
win->eventstate->prevx = oldx;
|
win->eventstate->prevx = oldx;
|
||||||
|
@ -65,6 +65,8 @@ bool wm_window_get_swap_interval(wmWindow *win, int *intervalOut);
|
|||||||
float wm_window_pixelsize(wmWindow *win);
|
float wm_window_pixelsize(wmWindow *win);
|
||||||
|
|
||||||
void wm_get_cursor_position (wmWindow *win, int *x, int *y);
|
void wm_get_cursor_position (wmWindow *win, int *x, int *y);
|
||||||
|
void wm_cursor_position_from_ghost (wmWindow *win, int *x, int *y);
|
||||||
|
void wm_cursor_position_to_ghost (wmWindow *win, int *x, int *y);
|
||||||
|
|
||||||
void wm_window_testbreak (void);
|
void wm_window_testbreak (void);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user