@ -264,27 +264,16 @@ input_manager_process_key(struct input_manager *im,
bool alt = event - > keysym . mod & ( KMOD_LALT | KMOD_RALT ) ;
bool alt = event - > keysym . mod & ( KMOD_LALT | KMOD_RALT ) ;
bool meta = event - > keysym . mod & ( KMOD_LGUI | KMOD_RGUI ) ;
bool meta = event - > keysym . mod & ( KMOD_LGUI | KMOD_RGUI ) ;
// use Cmd on macOS, Ctrl on other platforms
if ( alt | | meta ) {
# ifdef __APPLE__
// no shortcuts involve Alt or Meta, and they must not be forwarded to
bool cmd = ! ctrl & & meta ;
// the device
# else
if ( meta ) {
// no shortcuts involve Meta on platforms other than macOS, and it must
// not be forwarded to the device
return ;
}
bool cmd = ctrl ; // && !meta, already guaranteed
# endif
if ( alt ) {
// no shortcuts involve Alt, and it must not be forwarded to the device
return ;
return ;
}
}
struct controller * controller = im - > controller ;
struct controller * controller = im - > controller ;
// capture all Ctrl events
// capture all Ctrl events
if ( ctrl | | cmd ) {
if ( ctrl ) {
SDL_Keycode keycode = event - > keysym . sym ;
SDL_Keycode keycode = event - > keysym . sym ;
bool down = event - > type = = SDL_KEYDOWN ;
bool down = event - > type = = SDL_KEYDOWN ;
int action = down ? ACTION_DOWN : ACTION_UP ;
int action = down ? ACTION_DOWN : ACTION_UP ;
@ -292,37 +281,33 @@ input_manager_process_key(struct input_manager *im,
bool shift = event - > keysym . mod & ( KMOD_LSHIFT | KMOD_RSHIFT ) ;
bool shift = event - > keysym . mod & ( KMOD_LSHIFT | KMOD_RSHIFT ) ;
switch ( keycode ) {
switch ( keycode ) {
case SDLK_h :
case SDLK_h :
// Ctrl+h on all platform, since Cmd+h is already captured by
if ( control & & ctrl & & ! shift & & ! repeat ) {
// the system on macOS to hide the window
if ( control & & ctrl & & ! meta & & ! shift & & ! repeat ) {
action_home ( controller , action ) ;
action_home ( controller , action ) ;
}
}
return ;
return ;
case SDLK_b : // fall-through
case SDLK_b : // fall-through
case SDLK_BACKSPACE :
case SDLK_BACKSPACE :
if ( control & & c md & & ! shift & & ! repeat ) {
if ( control & & c trl & & ! shift & & ! repeat ) {
action_back ( controller , action ) ;
action_back ( controller , action ) ;
}
}
return ;
return ;
case SDLK_s :
case SDLK_s :
if ( control & & c md & & ! shift & & ! repeat ) {
if ( control & & c trl & & ! shift & & ! repeat ) {
action_app_switch ( controller , action ) ;
action_app_switch ( controller , action ) ;
}
}
return ;
return ;
case SDLK_m :
case SDLK_m :
// Ctrl+m on all platform, since Cmd+m is already captured by
if ( control & & ctrl & & ! shift & & ! repeat ) {
// the system on macOS to minimize the window
if ( control & & ctrl & & ! meta & & ! shift & & ! repeat ) {
action_menu ( controller , action ) ;
action_menu ( controller , action ) ;
}
}
return ;
return ;
case SDLK_p :
case SDLK_p :
if ( control & & c md & & ! shift & & ! repeat ) {
if ( control & & c trl & & ! shift & & ! repeat ) {
action_power ( controller , action ) ;
action_power ( controller , action ) ;
}
}
return ;
return ;
case SDLK_o :
case SDLK_o :
if ( control & & c md & & ! repeat & & down ) {
if ( control & & c trl & & ! repeat & & down ) {
enum screen_power_mode mode = shift
enum screen_power_mode mode = shift
? SCREEN_POWER_MODE_NORMAL
? SCREEN_POWER_MODE_NORMAL
: SCREEN_POWER_MODE_OFF ;
: SCREEN_POWER_MODE_OFF ;
@ -330,34 +315,34 @@ input_manager_process_key(struct input_manager *im,
}
}
return ;
return ;
case SDLK_DOWN :
case SDLK_DOWN :
if ( control & & c md & & ! shift ) {
if ( control & & c trl & & ! shift ) {
// forward repeated events
// forward repeated events
action_volume_down ( controller , action ) ;
action_volume_down ( controller , action ) ;
}
}
return ;
return ;
case SDLK_UP :
case SDLK_UP :
if ( control & & c md & & ! shift ) {
if ( control & & c trl & & ! shift ) {
// forward repeated events
// forward repeated events
action_volume_up ( controller , action ) ;
action_volume_up ( controller , action ) ;
}
}
return ;
return ;
case SDLK_LEFT :
case SDLK_LEFT :
if ( c md & & ! shift & & ! repeat & & down ) {
if ( c trl & & ! shift & & ! repeat & & down ) {
rotate_client_left ( im - > screen ) ;
rotate_client_left ( im - > screen ) ;
}
}
return ;
return ;
case SDLK_RIGHT :
case SDLK_RIGHT :
if ( c md & & ! shift & & ! repeat & & down ) {
if ( c trl & & ! shift & & ! repeat & & down ) {
rotate_client_right ( im - > screen ) ;
rotate_client_right ( im - > screen ) ;
}
}
return ;
return ;
case SDLK_c :
case SDLK_c :
if ( control & & c md & & ! shift & & ! repeat & & down ) {
if ( control & & c trl & & ! shift & & ! repeat & & down ) {
request_device_clipboard ( controller ) ;
request_device_clipboard ( controller ) ;
}
}
return ;
return ;
case SDLK_v :
case SDLK_v :
if ( control & & c md & & ! repeat & & down ) {
if ( control & & c trl & & ! repeat & & down ) {
if ( shift ) {
if ( shift ) {
// store the text in the device clipboard and paste
// store the text in the device clipboard and paste
set_device_clipboard ( controller , true ) ;
set_device_clipboard ( controller , true ) ;
@ -368,29 +353,29 @@ input_manager_process_key(struct input_manager *im,
}
}
return ;
return ;
case SDLK_f :
case SDLK_f :
if ( c md & & ! shift & & ! repeat & & down ) {
if ( c trl & & ! shift & & ! repeat & & down ) {
screen_switch_fullscreen ( im - > screen ) ;
screen_switch_fullscreen ( im - > screen ) ;
}
}
return ;
return ;
case SDLK_x :
case SDLK_x :
if ( c md & & ! shift & & ! repeat & & down ) {
if ( c trl & & ! shift & & ! repeat & & down ) {
screen_resize_to_fit ( im - > screen ) ;
screen_resize_to_fit ( im - > screen ) ;
}
}
return ;
return ;
case SDLK_g :
case SDLK_g :
if ( c md & & ! shift & & ! repeat & & down ) {
if ( c trl & & ! shift & & ! repeat & & down ) {
screen_resize_to_pixel_perfect ( im - > screen ) ;
screen_resize_to_pixel_perfect ( im - > screen ) ;
}
}
return ;
return ;
case SDLK_i :
case SDLK_i :
if ( c md & & ! shift & & ! repeat & & down ) {
if ( c trl & & ! shift & & ! repeat & & down ) {
struct fps_counter * fps_counter =
struct fps_counter * fps_counter =
im - > video_buffer - > fps_counter ;
im - > video_buffer - > fps_counter ;
switch_fps_counter_state ( fps_counter ) ;
switch_fps_counter_state ( fps_counter ) ;
}
}
return ;
return ;
case SDLK_n :
case SDLK_n :
if ( control & & c md & & ! repeat & & down ) {
if ( control & & c trl & & ! repeat & & down ) {
if ( shift ) {
if ( shift ) {
collapse_notification_panel ( controller ) ;
collapse_notification_panel ( controller ) ;
} else {
} else {
@ -399,7 +384,7 @@ input_manager_process_key(struct input_manager *im,
}
}
return ;
return ;
case SDLK_r :
case SDLK_r :
if ( control & & c md & & ! shift & & ! repeat & & down ) {
if ( control & & c trl & & ! shift & & ! repeat & & down ) {
rotate_device ( controller ) ;
rotate_device ( controller ) ;
}
}
return ;
return ;