steamcompmgr: don't always warp cursor on mouse input focus change

This commit is contained in:
Pierre-Loup A. Griffais 2021-09-12 23:39:34 -07:00
parent 3db90edd75
commit 66064b23cf
3 changed files with 15 additions and 7 deletions

View file

@ -1782,7 +1782,7 @@ found:
wlserver_lock(); wlserver_lock();
if ( inputFocus->surface.wlr != nullptr ) if ( inputFocus->surface.wlr != nullptr )
wlserver_mousefocus( inputFocus->surface.wlr ); wlserver_mousefocus( inputFocus->surface.wlr, cursor->x(), cursor->y() );
if ( keyboardFocusWin->surface.wlr != nullptr ) if ( keyboardFocusWin->surface.wlr != nullptr )
wlserver_keyboardfocus( keyboardFocusWin->surface.wlr ); wlserver_keyboardfocus( keyboardFocusWin->surface.wlr );
@ -1796,8 +1796,7 @@ found:
currentInputFocusMode = inputFocus->inputFocusMode; currentInputFocusMode = inputFocus->inputFocusMode;
currentKeyboardFocusWindow = keyboardFocusWin->id; currentKeyboardFocusWindow = keyboardFocusWin->id;
// at some point make wlserver_mousefocus smarter with preserving pointer position // cursor is likely not interactable anymore in its original context, hide
// for now hide the jarring warp and possible image change in case cursor was still on screen
cursor->hide(); cursor->hide();
} }

View file

@ -790,11 +790,20 @@ void wlserver_key( uint32_t key, bool press, uint32_t time )
wlr_seat_keyboard_notify_key( wlserver.wlr.seat, time, key, press ); wlr_seat_keyboard_notify_key( wlserver.wlr.seat, time, key, press );
} }
void wlserver_mousefocus( struct wlr_surface *wlrsurface ) void wlserver_mousefocus( struct wlr_surface *wlrsurface, int x /* = 0 */, int y /* = 0 */ )
{ {
wlserver.mouse_focus_surface = wlrsurface; wlserver.mouse_focus_surface = wlrsurface;
if ( x < wlrsurface->current.width && y < wlrsurface->current.height )
{
wlserver.mouse_surface_cursorx = x;
wlserver.mouse_surface_cursory = y;
}
else
{
wlserver.mouse_surface_cursorx = wlrsurface->current.width / 2.0; wlserver.mouse_surface_cursorx = wlrsurface->current.width / 2.0;
wlserver.mouse_surface_cursory = wlrsurface->current.height / 2.0; wlserver.mouse_surface_cursory = wlrsurface->current.height / 2.0;
}
wlr_seat_pointer_notify_enter( wlserver.wlr.seat, wlrsurface, wlserver.mouse_surface_cursorx, wlserver.mouse_surface_cursory ); wlr_seat_pointer_notify_enter( wlserver.wlr.seat, wlrsurface, wlserver.mouse_surface_cursorx, wlserver.mouse_surface_cursory );
} }

View file

@ -84,7 +84,7 @@ void wlserver_unlock(void);
void wlserver_keyboardfocus( struct wlr_surface *surface ); void wlserver_keyboardfocus( struct wlr_surface *surface );
void wlserver_key( uint32_t key, bool press, uint32_t time ); void wlserver_key( uint32_t key, bool press, uint32_t time );
void wlserver_mousefocus( struct wlr_surface *wlrsurface ); void wlserver_mousefocus( struct wlr_surface *wlrsurface, int x = 0, int y = 0 );
void wlserver_mousemotion( int x, int y, uint32_t time ); void wlserver_mousemotion( int x, int y, uint32_t time );
void wlserver_mousebutton( int button, bool press, uint32_t time ); void wlserver_mousebutton( int button, bool press, uint32_t time );
void wlserver_mousewheel( int x, int y, uint32_t time ); void wlserver_mousewheel( int x, int y, uint32_t time );