| 365 | | /* hide/show mouse cursor */ |
|---|
| 366 | | if( p_vout->p_sys->b_mouse_moved && p_vout->b_fullscreen && |
|---|
| 367 | | p_intf->p_sys->b_play_status ) |
|---|
| | 365 | /* hide/show mouse cursor |
|---|
| | 366 | * this code looks unnecessarily complicated, but is necessary like this. |
|---|
| | 367 | * it has to deal with multiple monitors and therefore checks a lot */ |
|---|
| | 368 | if( !p_vout->p_sys->b_mouse_moved && p_vout->b_fullscreen ) |
|---|
| | 369 | { |
|---|
| | 370 | if( mdate() - p_vout->p_sys->i_time_mouse_last_moved > 2000000 && |
|---|
| | 371 | p_vout->p_sys->b_mouse_pointer_visible ) |
|---|
| | 372 | { |
|---|
| | 373 | VLCHideMouse( p_vout, YES ); |
|---|
| | 374 | } |
|---|
| | 375 | else if ( !p_vout->p_sys->b_mouse_pointer_visible ) |
|---|
| | 376 | { |
|---|
| | 377 | vlc_bool_t b_playing = NO; |
|---|
| | 378 | playlist_t * p_playlist = vlc_object_find( p_vout, VLC_OBJECT_PLAYLIST, |
|---|
| | 379 | FIND_ANYWHERE ); |
|---|
| | 380 | |
|---|
| | 381 | if ( p_playlist != nil ) |
|---|
| | 382 | { |
|---|
| | 383 | vlc_mutex_lock( &p_playlist->object_lock ); |
|---|
| | 384 | if( p_playlist->p_input != NULL ) |
|---|
| | 385 | { |
|---|
| | 386 | vlc_mutex_lock( &p_playlist->p_input->stream.stream_lock ); |
|---|
| | 387 | b_playing = p_playlist->p_input->stream.control.i_status != PAUSE_S; |
|---|
| | 388 | vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock ); |
|---|
| | 389 | } |
|---|
| | 390 | vlc_mutex_unlock( &p_playlist->object_lock ); |
|---|
| | 391 | vlc_object_release( p_playlist ); |
|---|
| | 392 | } |
|---|
| | 393 | if ( ![p_vout->p_sys->o_window isKeyWindow] || !b_playing ) |
|---|
| | 394 | { |
|---|
| | 395 | VLCHideMouse( p_vout, NO ); |
|---|
| | 396 | } |
|---|
| | 397 | } |
|---|
| | 398 | } |
|---|
| | 399 | else if ( p_vout->p_sys->b_mouse_moved && p_vout->b_fullscreen ) |
|---|
| 371 | | VLShowHideCursors( p_vout, NO ); |
|---|
| 372 | | b_change = 1; |
|---|
| 373 | | } |
|---|
| 374 | | else if( mdate() - p_vout->p_sys->i_time_mouse_last_moved > 2000000 && |
|---|
| 375 | | p_vout->p_sys->b_mouse_pointer_visible ) |
|---|
| 376 | | { |
|---|
| 377 | | VLShowHideCursors( p_vout, YES ); |
|---|
| 378 | | b_change = 1; |
|---|
| 379 | | } |
|---|
| 380 | | |
|---|
| 381 | | } |
|---|
| 382 | | else if ( p_vout->b_fullscreen && !p_intf->p_sys->b_play_status ) |
|---|
| 383 | | { |
|---|
| 384 | | if( !p_vout->p_sys->b_mouse_pointer_visible ) |
|---|
| 385 | | { |
|---|
| 386 | | VLShowHideCursors( p_vout, NO ); |
|---|
| 387 | | b_change = 1; |
|---|
| 388 | | } |
|---|
| 389 | | else if( p_vout->p_sys->b_mouse_pointer_visible ) |
|---|
| 390 | | { |
|---|
| 391 | | p_vout->p_sys->i_time_mouse_last_moved = mdate(); |
|---|
| 392 | | p_vout->p_sys->b_mouse_moved = 1; |
|---|
| 393 | | } |
|---|
| 394 | | } |
|---|
| 395 | | |
|---|
| 396 | | if( b_change ) |
|---|
| 397 | | { |
|---|
| 398 | | p_vout->p_sys->b_mouse_moved = 0; |
|---|
| 399 | | p_vout->p_sys->i_time_mouse_last_moved = 0; |
|---|
| 400 | | } |
|---|
| 401 | | |
|---|
| | 403 | VLCHideMouse( p_vout, NO ); |
|---|
| | 404 | } |
|---|
| | 405 | else |
|---|
| | 406 | { |
|---|
| | 407 | p_vout->p_sys->b_mouse_moved = NO; |
|---|
| | 408 | } |
|---|
| | 409 | } |
|---|
| | 410 | |
|---|
| 526 | | * VLShowHideCursors: if b_hide then hide the cursors on every display |
|---|
| 527 | | * that contains p_vout, else show the cursors instead. |
|---|
| 528 | | ***************************************************************************** |
|---|
| 529 | | * We cannot use kCGDirectMainDisplay, because this is always the display with |
|---|
| 530 | | * the menubar. |
|---|
| 531 | | *****************************************************************************/ |
|---|
| 532 | | static void VLShowHideCursors ( vout_thread_t *p_vout, BOOL b_hide ) |
|---|
| 533 | | { |
|---|
| 534 | | NSRect frame; |
|---|
| 535 | | NSScreen *o_screen; |
|---|
| 536 | | CGDirectDisplayID displays[VL_MAX_DISPLAYS]; |
|---|
| 537 | | CGDisplayCount displayCount; |
|---|
| 538 | | |
|---|
| 539 | | o_screen = [p_vout->p_sys->o_window screen]; |
|---|
| 540 | | frame = [o_screen frame]; |
|---|
| 541 | | |
|---|
| 542 | | int err = CGGetDisplaysWithRect( CGRectMake( NSMinX( frame ), NSMinY( frame ), |
|---|
| 543 | | NSWidth( frame ), NSHeight( frame ) ), VL_MAX_DISPLAYS, displays, &displayCount ); |
|---|
| 544 | | |
|---|
| 545 | | if ( displayCount > 0 && !err ) |
|---|
| 546 | | { |
|---|
| 547 | | unsigned int i; |
|---|
| 548 | | /* multiple displays are possible, because of mirroring. |
|---|
| 549 | | * mirroring is essential one screen on mult. displays. */ |
|---|
| 550 | | for ( i=0 ; i < displayCount ; i++ ) |
|---|
| 551 | | { |
|---|
| 552 | | if ( b_hide ) |
|---|
| 553 | | { |
|---|
| 554 | | CGDisplayHideCursor( displays[i] ); |
|---|
| 555 | | p_vout->p_sys->b_mouse_pointer_visible = 0; |
|---|
| 556 | | } |
|---|
| 557 | | else |
|---|
| 558 | | { |
|---|
| 559 | | CGDisplayShowCursor( displays[i] ); |
|---|
| 560 | | p_vout->p_sys->b_mouse_pointer_visible = 1; |
|---|
| 561 | | } |
|---|
| 562 | | } |
|---|
| 563 | | } |
|---|
| | 534 | * VLCHideMouse: if b_hide then hide the cursor |
|---|
| | 535 | *****************************************************************************/ |
|---|
| | 536 | static void VLCHideMouse ( vout_thread_t *p_vout, BOOL b_hide ) |
|---|
| | 537 | { |
|---|
| | 538 | BOOL b_inside; |
|---|
| | 539 | NSRect s_rect; |
|---|
| | 540 | NSPoint ml; |
|---|
| | 541 | NSWindow *o_window = p_vout->p_sys->o_window; |
|---|
| | 542 | NSView *o_contents = [o_window contentView]; |
|---|
| | 543 | |
|---|
| | 544 | s_rect = [o_contents bounds]; |
|---|
| | 545 | ml = [o_window convertScreenToBase:[NSEvent mouseLocation]]; |
|---|
| | 546 | ml = [o_contents convertPoint:ml fromView:nil]; |
|---|
| | 547 | b_inside = [o_contents mouse: ml inRect: s_rect]; |
|---|
| | 548 | |
|---|
| | 549 | if ( b_hide && b_inside ) |
|---|
| | 550 | { |
|---|
| | 551 | /* only hide if mouse over VLCView */ |
|---|
| | 552 | [NSCursor hide]; |
|---|
| | 553 | p_vout->p_sys->b_mouse_pointer_visible = 0; |
|---|
| | 554 | } |
|---|
| | 555 | else if ( !b_hide ) |
|---|
| | 556 | { |
|---|
| | 557 | if ( ![o_window isKeyWindow] && b_inside ) |
|---|
| | 558 | { |
|---|
| | 559 | /* be nice for ppl with multi monitors */ |
|---|
| | 560 | p_vout->p_sys->b_mouse_moved = NO; |
|---|
| | 561 | p_vout->p_sys->i_time_mouse_last_moved = mdate(); |
|---|
| | 562 | return; |
|---|
| | 563 | } |
|---|
| | 564 | [NSCursor unhide]; |
|---|
| | 565 | p_vout->p_sys->b_mouse_pointer_visible = 1; |
|---|
| | 566 | } |
|---|
| | 567 | p_vout->p_sys->b_mouse_moved = NO; |
|---|
| | 568 | p_vout->p_sys->i_time_mouse_last_moved = mdate(); |
|---|