X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcontrol%2Fgestures.c;h=9305cce64e12aec49895a70a16fdde4d7a65ac65;hb=9aa7bcf1457555711311d43e8752eeebf761946f;hp=3d337aeb7e5c0f8eb68cf96320d12a9ad5d8b92e;hpb=dd5df29b88b606707679db5b60167435cd979d1c;p=vlc diff --git a/modules/control/gestures.c b/modules/control/gestures.c index 3d337aeb7e..9305cce64e 100644 --- a/modules/control/gestures.c +++ b/modules/control/gestures.c @@ -46,7 +46,7 @@ struct intf_sys_t { vlc_mutex_t lock; - vlc_object_t * p_vout; + vout_thread_t *p_vout; bool b_got_gesture; bool b_button_pressed; int i_mouse_x, i_mouse_y; @@ -86,6 +86,12 @@ static void RunIntf ( intf_thread_t *p_intf ); #define BUTTON_LONGTEXT N_( \ "Trigger button for mouse gestures." ) +#if defined (HAVE_MAEMO) +# define BUTTON_DEFAULT "left" +#else +# define BUTTON_DEFAULT "right" +#endif + static const char *const button_list[] = { "left", "middle", "right" }; static const char *const button_list_text[] = { N_("Left"), N_("Middle"), N_("Right") }; @@ -96,7 +102,7 @@ vlc_module_begin () set_subcategory( SUBCAT_INTERFACE_CONTROL ) add_integer( "gestures-threshold", 30, NULL, THRESHOLD_TEXT, THRESHOLD_LONGTEXT, true ) - add_string( "gestures-button", "right", NULL, + add_string( "gestures-button", BUTTON_DEFAULT, NULL, BUTTON_TEXT, BUTTON_LONGTEXT, false ) change_string_list( button_list, button_list_text, 0 ) set_description( N_("Mouse gestures control interface") ) @@ -124,13 +130,13 @@ int Open ( vlc_object_t *p_this ) p_sys->p_vout = NULL; p_sys->b_got_gesture = false; p_sys->b_button_pressed = false; - p_sys->i_threshold = config_GetInt( p_intf, "gestures-threshold" ); + p_sys->i_threshold = var_InheritInteger( p_intf, "gestures-threshold" ); // Choose the tight button to use - char *psz_button = config_GetPsz( p_intf, "gestures-button" ); - if( !strcmp( psz_button, "left" ) ) + char *psz_button = var_InheritString( p_intf, "gestures-button" ); + if( psz_button && !strcmp( psz_button, "left" ) ) p_sys->i_button_mask = 1; - else if( !strcmp( psz_button, "middle" ) ) + else if( psz_button && !strcmp( psz_button, "middle" ) ) p_sys->i_button_mask = 2; else // psz_button == "right" p_sys->i_button_mask = 4; @@ -178,40 +184,38 @@ void Close ( vlc_object_t *p_this ) *****************************************************************************/ static void RunIntf( intf_thread_t *p_intf ) { - playlist_t * p_playlist = NULL; + intf_sys_t *p_sys = p_intf->p_sys; int canc = vlc_savecancel(); input_thread_t *p_input; /* Main loop */ while( vlc_object_alive( p_intf ) ) { - vlc_mutex_lock( &p_intf->p_sys->lock ); + vlc_mutex_lock( &p_sys->lock ); /* * mouse cursor */ - if( p_intf->p_sys->b_got_gesture ) + if( p_sys->b_got_gesture ) { - vlc_value_t val; int i_interval = 0; /* Do something */ /* If you modify this, please try to follow this convention: Start with LEFT, RIGHT for playback related commands and UP, DOWN, for other commands */ - switch( p_intf->p_sys->i_pattern ) + playlist_t * p_playlist = pl_Get( p_intf ); + switch( p_sys->i_pattern ) { case LEFT: msg_Dbg( p_intf, "Go backward in the movie!" ); - p_playlist = pl_Hold( p_intf ); p_input = playlist_CurrentInput( p_playlist ); - pl_Release( p_intf ); if( p_input ) { - i_interval = config_GetInt( p_intf , "short-jump-size" ); + i_interval = var_InheritInteger( p_intf , "short-jump-size" ); if ( i_interval > 0 ) { - val.i_time = ( (mtime_t)( -i_interval ) * 1000000L); - var_Set( p_input, "time-offset", val ); + mtime_t i_time = ( (mtime_t)( -i_interval ) * 1000000L); + var_SetTime( p_input, "time-offset", i_time ); } vlc_object_release( p_input ); } @@ -219,17 +223,14 @@ static void RunIntf( intf_thread_t *p_intf ) case RIGHT: msg_Dbg( p_intf, "Go forward in the movie!" ); - p_playlist = pl_Hold( p_intf ); p_input = playlist_CurrentInput( p_playlist ); - pl_Release( p_intf ); - if( p_input ) { - i_interval = config_GetInt( p_intf , "short-jump-size" ); + i_interval = var_InheritInteger( p_intf , "short-jump-size" ); if ( i_interval > 0 ) { - val.i_time = ( (mtime_t)( i_interval ) * 1000000L); - var_Set( p_input, "time-offset", val ); + mtime_t i_time = ( (mtime_t)( i_interval ) * 1000000L); + var_SetTime( p_input, "time-offset", i_time ); } vlc_object_release( p_input ); } @@ -237,24 +238,20 @@ static void RunIntf( intf_thread_t *p_intf ) case GESTURE(LEFT,UP,NONE,NONE): msg_Dbg( p_intf, "Going slower." ); - p_playlist = pl_Hold( p_intf ); p_input = playlist_CurrentInput( p_playlist ); - pl_Release( p_intf ); if( p_input ) { - var_SetVoid( p_input, "rate-slower" ); + var_TriggerCallback( p_input, "rate-slower" ); vlc_object_release( p_input ); } break; case GESTURE(RIGHT,UP,NONE,NONE): msg_Dbg( p_intf, "Going faster." ); - p_playlist = pl_Hold( p_intf ); p_input = playlist_CurrentInput( p_playlist ); - pl_Release( p_intf ); if( p_input ) { - var_SetVoid( p_input, "rate-faster" ); + var_TriggerCallback( p_input, "rate-faster" ); vlc_object_release( p_input ); } break; @@ -262,73 +259,65 @@ static void RunIntf( intf_thread_t *p_intf ) case GESTURE(LEFT,RIGHT,NONE,NONE): case GESTURE(RIGHT,LEFT,NONE,NONE): msg_Dbg( p_intf, "Play/Pause" ); - p_playlist = pl_Hold( p_intf ); p_input = playlist_CurrentInput( p_playlist ); - pl_Release( p_intf ); if( p_input ) { - var_Get( p_input, "state", &val); - val.i_int = ( val.i_int != PLAYING_S ) ? PLAYING_S : PAUSE_S; - var_Set( p_input, "state", val); + int i_state = var_GetInteger( p_input, "state" ); + var_SetInteger( p_input, "state", ( i_state != PLAYING_S ) + ? PLAYING_S : PAUSE_S ); vlc_object_release( p_input ); } break; case GESTURE(LEFT,DOWN,NONE,NONE): - p_playlist = pl_Hold( p_intf ); playlist_Prev( p_playlist ); - pl_Release( p_intf ); break; case GESTURE(RIGHT,DOWN,NONE,NONE): - p_playlist = pl_Hold( p_intf ); playlist_Next( p_playlist ); - pl_Release( p_intf ); break; case UP: msg_Dbg(p_intf, "Louder"); - aout_VolumeUp( p_intf, 1, NULL ); + aout_VolumeUp( p_playlist, 1, NULL ); break; case DOWN: msg_Dbg(p_intf, "Quieter"); - aout_VolumeDown( p_intf, 1, NULL ); + aout_VolumeDown( p_playlist, 1, NULL ); break; case GESTURE(UP,DOWN,NONE,NONE): case GESTURE(DOWN,UP,NONE,NONE): - msg_Dbg(p_intf, "Mute sound"); - aout_VolumeMute( p_intf, NULL ); + msg_Dbg( p_intf, "Mute sound" ); + aout_ToggleMute( p_playlist, NULL ); break; case GESTURE(UP,RIGHT,NONE,NONE): { - vlc_value_t val, list, list2; - int i_count, i; + vlc_value_t list, list2; + int i_count, i, i_audio_es; - p_playlist = pl_Hold( p_intf ); p_input = playlist_CurrentInput( p_playlist ); - pl_Release( p_intf ); - if( !p_input ) break; - var_Get( p_input, "audio-es", &val ); - var_Change( p_input, "audio-es", VLC_VAR_GETCHOICES, - &list, &list2 ); - i_count = list.p_list->i_count; - if( i_count <= 1 ) - { - vlc_object_release( p_input ); - break; - } - for( i = 0; i < i_count; i++ ) - { - if( val.i_int == list.p_list->p_values[i].i_int ) - break; - } + i_audio_es = var_GetInteger( p_input, "audio-es" ); + var_Change( p_input, "audio-es", VLC_VAR_GETCHOICES, + &list, &list2 ); + i_count = list.p_list->i_count; + if( i_count <= 1 ) + { + var_FreeList( &list, &list2 ); + vlc_object_release( p_input ); + break; + } + for( i = 0; i < i_count; i++ ) + { + if( i_audio_es == list.p_list->p_values[i].i_int ) + break; + } /* value of audio-es was not in choices list */ if( i == i_count ) { @@ -340,23 +329,21 @@ static void RunIntf( intf_thread_t *p_intf ) i = 1; else i++; - var_Set( p_input, "audio-es", list.p_list->p_values[i] ); + var_SetInteger( p_input, "audio-es", list.p_list->p_values[i].i_int ); + var_FreeList( &list, &list2 ); vlc_object_release( p_input ); } break; case GESTURE(DOWN,RIGHT,NONE,NONE): { - vlc_value_t val, list, list2; - int i_count, i; + vlc_value_t list, list2; + int i_count, i, i_spu_es; - p_playlist = pl_Hold( p_intf ); p_input = playlist_CurrentInput( p_playlist ); - pl_Release( p_intf ); - if( !p_input ) break; - var_Get( p_input, "spu-es", &val ); + i_spu_es = var_GetInteger( p_input, "spu-es" ); var_Change( p_input, "spu-es", VLC_VAR_GETCHOICES, &list, &list2 ); @@ -364,11 +351,12 @@ static void RunIntf( intf_thread_t *p_intf ) if( i_count <= 1 ) { vlc_object_release( p_input ); + var_FreeList( &list, &list2 ); break; } for( i = 0; i < i_count; i++ ) { - if( val.i_int == list.p_list->p_values[i].i_int ) + if( i_spu_es == list.p_list->p_values[i].i_int ) { break; } @@ -384,19 +372,19 @@ static void RunIntf( intf_thread_t *p_intf ) i = 0; else i++; - var_Set( p_input, "spu-es", list.p_list->p_values[i] ); + var_SetInteger( p_input, "spu-es", list.p_list->p_values[i].i_int); + var_FreeList( &list, &list2 ); vlc_object_release( p_input ); } break; case GESTURE(UP,LEFT,NONE,NONE): - if (p_intf->p_sys->p_vout ) - { - var_Get( p_intf->p_sys->p_vout, "fullscreen", &val ); - val.b_bool = !val.b_bool; - var_Set( p_intf->p_sys->p_vout, "fullscreen", val ); - } + { + bool val = var_ToggleBool( pl_Get( p_intf ), "fullscreen" ); + if( p_sys->p_vout ) + var_SetBool( p_sys->p_vout, "fullscreen", val ); break; + } case GESTURE(DOWN,LEFT,NONE,NONE): /* FIXME: Should close the vout!"*/ @@ -404,49 +392,47 @@ static void RunIntf( intf_thread_t *p_intf ) break; case GESTURE(DOWN,LEFT,UP,RIGHT): case GESTURE(UP,RIGHT,DOWN,LEFT): - msg_Dbg(p_intf, "a square was drawn!" ); + msg_Dbg( p_intf, "a square was drawn!" ); break; default: break; } - p_intf->p_sys->i_num_gestures = 0; - p_intf->p_sys->i_pattern = 0; - p_intf->p_sys->b_got_gesture = false; + p_sys->i_num_gestures = 0; + p_sys->i_pattern = 0; + p_sys->b_got_gesture = false; } /* * video output */ - if( p_intf->p_sys->p_vout && !vlc_object_alive (p_intf->p_sys->p_vout) ) + if( p_sys->p_vout && !vlc_object_alive( p_sys->p_vout ) ) { - var_DelCallback( p_intf->p_sys->p_vout, "mouse-moved", + var_DelCallback( p_sys->p_vout, "mouse-moved", MouseEvent, p_intf ); - var_DelCallback( p_intf->p_sys->p_vout, "mouse-button-down", + var_DelCallback( p_sys->p_vout, "mouse-button-down", MouseEvent, p_intf ); - vlc_object_release( p_intf->p_sys->p_vout ); - p_intf->p_sys->p_vout = NULL; + vlc_object_release( p_sys->p_vout ); + p_sys->p_vout = NULL; } - if( p_intf->p_sys->p_vout == NULL ) + if( p_sys->p_vout == NULL ) { - p_playlist = pl_Hold( p_intf ); - p_input = playlist_CurrentInput( p_playlist ); - pl_Release( p_intf ); + p_input = playlist_CurrentInput( pl_Get( p_intf ) ); if( p_input ) { - p_intf->p_sys->p_vout = input_GetVout( p_input ); + p_sys->p_vout = input_GetVout( p_input ); vlc_object_release( p_input ); } - if( p_intf->p_sys->p_vout ) + if( p_sys->p_vout ) { - var_AddCallback( p_intf->p_sys->p_vout, "mouse-moved", + var_AddCallback( p_sys->p_vout, "mouse-moved", MouseEvent, p_intf ); - var_AddCallback( p_intf->p_sys->p_vout, "mouse-button-down", + var_AddCallback( p_sys->p_vout, "mouse-button-down", MouseEvent, p_intf ); } } - vlc_mutex_unlock( &p_intf->p_sys->lock ); + vlc_mutex_unlock( &p_sys->lock ); /* Wait a bit */ msleep( INTF_IDLE_SLEEP ); @@ -462,33 +448,29 @@ static int MouseEvent( vlc_object_t *p_this, char const *psz_var, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { VLC_UNUSED(p_this); VLC_UNUSED(oldval); - vlc_value_t val; int pattern = 0; signed int i_horizontal, i_vertical; intf_thread_t *p_intf = (intf_thread_t *)p_data; + intf_sys_t *p_sys = p_intf->p_sys; - vlc_mutex_lock( &p_intf->p_sys->lock ); + vlc_mutex_lock( &p_sys->lock ); /* don't process new gestures before the last events are processed */ - if( p_intf->p_sys->b_got_gesture ) + if( p_sys->b_got_gesture ) { - vlc_mutex_unlock( &p_intf->p_sys->lock ); + vlc_mutex_unlock( &p_sys->lock ); return VLC_SUCCESS; } - if( !strcmp(psz_var, "mouse-moved" ) && p_intf->p_sys->b_button_pressed ) + if( !strcmp( psz_var, "mouse-moved" ) && p_sys->b_button_pressed ) { - var_Get( p_intf->p_sys->p_vout, "mouse-x", &val ); - p_intf->p_sys->i_mouse_x = val.i_int; - var_Get( p_intf->p_sys->p_vout, "mouse-y", &val ); - p_intf->p_sys->i_mouse_y = val.i_int; - i_horizontal = p_intf->p_sys->i_mouse_x - - p_intf->p_sys->i_last_x; - i_horizontal = i_horizontal / p_intf->p_sys->i_threshold; - i_vertical = p_intf->p_sys->i_mouse_y - - p_intf->p_sys->i_last_y; - i_vertical = i_vertical / p_intf->p_sys->i_threshold; + p_sys->i_mouse_x = newval.coords.x; + p_sys->i_mouse_y = newval.coords.y; + i_horizontal = p_sys->i_mouse_x - p_sys->i_last_x; + i_horizontal = i_horizontal / p_sys->i_threshold; + i_vertical = p_sys->i_mouse_y - p_sys->i_last_y; + i_vertical = i_vertical / p_sys->i_threshold; if( i_horizontal < 0 ) { @@ -512,37 +494,33 @@ static int MouseEvent( vlc_object_t *p_this, char const *psz_var, } if( pattern ) { - p_intf->p_sys->i_last_y = p_intf->p_sys->i_mouse_y; - p_intf->p_sys->i_last_x = p_intf->p_sys->i_mouse_x; - if( gesture( p_intf->p_sys->i_pattern, - p_intf->p_sys->i_num_gestures - 1 ) != pattern ) + p_sys->i_last_y = p_sys->i_mouse_y; + p_sys->i_last_x = p_sys->i_mouse_x; + if( gesture( p_sys->i_pattern, p_sys->i_num_gestures - 1 ) + != pattern ) { - p_intf->p_sys->i_pattern |= - pattern << ( p_intf->p_sys->i_num_gestures * 4 ); - p_intf->p_sys->i_num_gestures++; + p_sys->i_pattern |= pattern << ( p_sys->i_num_gestures * 4 ); + p_sys->i_num_gestures++; } } } - if( !strcmp( psz_var, "mouse-button-down" ) - && newval.i_int & p_intf->p_sys->i_button_mask - && !p_intf->p_sys->b_button_pressed ) + else if( !strcmp( psz_var, "mouse-button-down" ) ) { - p_intf->p_sys->b_button_pressed = true; - var_Get( p_intf->p_sys->p_vout, "mouse-x", &val ); - p_intf->p_sys->i_last_x = val.i_int; - var_Get( p_intf->p_sys->p_vout, "mouse-y", &val ); - p_intf->p_sys->i_last_y = val.i_int; - } - if( !strcmp( psz_var, "mouse-button-down" ) - && !( newval.i_int & p_intf->p_sys->i_button_mask ) - && p_intf->p_sys->b_button_pressed ) - { - p_intf->p_sys->b_button_pressed = false; - p_intf->p_sys->b_got_gesture = true; + if( (newval.i_int & p_sys->i_button_mask) && !p_sys->b_button_pressed ) + { + p_sys->b_button_pressed = true; + var_GetCoords( p_sys->p_vout, "mouse-moved", + &p_sys->i_last_x, &p_sys->i_last_y ); + } + else if( !( newval.i_int & p_sys->i_button_mask ) && p_sys->b_button_pressed ) + { + p_sys->b_button_pressed = false; + p_sys->b_got_gesture = true; + } } - vlc_mutex_unlock( &p_intf->p_sys->lock ); + vlc_mutex_unlock( &p_sys->lock ); return VLC_SUCCESS; }