📄 ncurses.c
字号:
var_AddCallback( p_playlist, "item-append", PlaylistChanged, p_intf ); var_AddCallback( p_playlist, "item-change", PlaylistChanged, p_intf ); while( !intf_ShouldDie( p_intf ) ) { msleep( INTF_IDLE_SLEEP ); /* Update the input */ PL_LOCK; if( p_sys->p_input == NULL ) { p_sys->p_input = p_playlist->p_input; if( p_sys->p_input ) { if( !p_sys->p_input->b_dead ) { vlc_object_yield( p_sys->p_input ); } } } else if( p_sys->p_input->b_dead ) { vlc_object_release( p_sys->p_input ); p_sys->p_input = NULL; p_sys->f_slider = p_sys->f_slider_old = 0.0; p_sys->b_box_cleared = false; } PL_UNLOCK; if( p_sys->b_box_plidx_follow && p_playlist->status.p_item ) { FindIndex( p_intf ); } while( ( i_key = wgetch( p_sys->w ) ) != -1 ) { /* * HandleKey returns 1 if the screen needs to be redrawn */ if( HandleKey( p_intf, i_key ) ) { Redraw( p_intf, &t_last_refresh ); } } /* Hack */ if( p_sys->f_slider > 0.0001 && !p_sys->b_box_cleared ) { clear(); Redraw( p_intf, &t_last_refresh ); p_sys->b_box_cleared = true; } /* * redraw the screen every second */ if( (time(0) - t_last_refresh) >= 1 ) { ManageSlider( p_intf ); Redraw( p_intf, &t_last_refresh ); } } var_DelCallback( p_playlist, "intf-change", PlaylistChanged, p_intf ); var_DelCallback( p_playlist, "item-append", PlaylistChanged, p_intf ); var_DelCallback( p_playlist, "item-change", PlaylistChanged, p_intf );}/* following functions are local */static void start_color_and_pairs( intf_thread_t *p_intf ){ assert( p_intf->p_sys->b_color && !p_intf->p_sys->b_color_started ); if( !has_colors() ) { p_intf->p_sys->b_color = false; msg_Warn( p_intf, "Terminal doesn't support colors" ); return; } start_color(); /* Available colors: BLACK RED GREEN YELLOW BLUE MAGENTA CYAN WHITE */ /* untested, in all my terminals, !can_change_color() --funman */ if( can_change_color() ) init_color( COLOR_YELLOW, 960, 500, 0 ); /* YELLOW -> ORANGE */ /* title */ init_pair( C_TITLE, COLOR_YELLOW, COLOR_BLACK ); /* jamaican playlist */ init_pair( C_PLAYLIST_1, COLOR_GREEN, COLOR_BLACK ); init_pair( C_PLAYLIST_2, COLOR_YELLOW, COLOR_BLACK ); init_pair( C_PLAYLIST_3, COLOR_RED, COLOR_BLACK ); /* used in DrawBox() */ init_pair( C_BOX, COLOR_CYAN, COLOR_BLACK ); /* Source, State, Position, Volume, Chapters, etc...*/ init_pair( C_STATUS, COLOR_BLUE, COLOR_BLACK ); /* VLC messages, keep the order from highest priority to lowest */ /* infos */ init_pair( C_INFO, COLOR_BLACK, COLOR_WHITE ); /* errors */ init_pair( C_ERROR, COLOR_RED, COLOR_BLACK ); /* warnings */ init_pair( C_WARNING, COLOR_YELLOW, COLOR_BLACK );/* debug */ init_pair( C_DEBUG, COLOR_WHITE, COLOR_BLACK ); /* Category title (help, info, metadata) */ init_pair( C_CATEGORY, COLOR_MAGENTA, COLOR_BLACK ); /* Folder (BOX_BROWSE) */ init_pair( C_FOLDER, COLOR_RED, COLOR_BLACK ); p_intf->p_sys->b_color_started = true;}#ifndef HAVE_NCURSESWstatic char *KeyToUTF8( int i_key, char *psz_part ){ char *psz_utf8; int len = strlen( psz_part ); if( len == 6 ) { /* overflow error - should not happen */ memset( psz_part, 0, 6 ); return NULL; } psz_part[len] = (char)i_key; psz_utf8 = FromLocaleDup( psz_part ); /* Ugly check for incomplete bytes sequences * (in case of non-UTF8 multibyte local encoding) */ char *psz; for( psz = psz_utf8; *psz; psz++ ) if( ( *psz == '?' ) && ( *psz_utf8 != '?' ) ) { /* incomplete bytes sequence detected * (VLC core inserted dummy question marks) */ free( psz_utf8 ); return NULL; } /* Check for incomplete UTF8 bytes sequence */ if( EnsureUTF8( psz_utf8 ) == NULL ) { free( psz_utf8 ); return NULL; } memset( psz_part, 0, 6 ); return psz_utf8;}#endifstatic inline int RemoveLastUTF8Entity( char *psz, int len ){ while( len && ( (psz[--len] & 0xc0) == 0x80 ) ); /* UTF8 continuation byte */ psz[len] = '\0'; return len;}static int HandleKey( intf_thread_t *p_intf, int i_key ){ intf_sys_t *p_sys = p_intf->p_sys; vlc_value_t val; #define ReturnTrue \ do { \ vlc_object_release( p_playlist ); \ return 1; \ } while(0) #define ReturnFalse \ do { \ vlc_object_release( p_playlist ); \ return 0; \ } while(0) playlist_t *p_playlist = pl_Yield( p_intf ); if( p_sys->i_box_type == BOX_PLAYLIST ) { int b_ret = true; bool b_box_plidx_follow = false; switch( i_key ) { vlc_value_t val; /* Playlist Settings */ case 'r': var_Get( p_playlist, "random", &val ); val.b_bool = !val.b_bool; var_Set( p_playlist, "random", val ); ReturnTrue; case 'l': var_Get( p_playlist, "loop", &val ); val.b_bool = !val.b_bool; var_Set( p_playlist, "loop", val ); ReturnTrue; case 'R': var_Get( p_playlist, "repeat", &val ); val.b_bool = !val.b_bool; var_Set( p_playlist, "repeat", val ); ReturnTrue; /* Playlist sort */ case 'o': playlist_RecursiveNodeSort( p_playlist, PlaylistGetRoot( p_intf ), SORT_TITLE_NODES_FIRST, ORDER_NORMAL ); p_sys->b_need_update = true; ReturnTrue; case 'O': playlist_RecursiveNodeSort( p_playlist, PlaylistGetRoot( p_intf ), SORT_TITLE_NODES_FIRST, ORDER_REVERSE ); p_sys->b_need_update = true; ReturnTrue; /* Playlist view */ case 'v': switch( p_sys->i_current_view ) { case VIEW_CATEGORY: p_sys->i_current_view = VIEW_ONELEVEL; break; default: p_sys->i_current_view = VIEW_CATEGORY; } //p_sys->b_need_update = true; PlaylistRebuild( p_intf ); ReturnTrue; /* Playlist navigation */ case 'g': FindIndex( p_intf ); break; case KEY_HOME: p_sys->i_box_plidx = 0; break;#ifdef __FreeBSD__/* workaround for FreeBSD + xterm: * see http://www.nabble.com/curses-vs.-xterm-key-mismatch-t3574377.html */ case KEY_SELECT:#endif case KEY_END: p_sys->i_box_plidx = p_playlist->items.i_size - 1; break; case KEY_UP: p_sys->i_box_plidx--; break; case KEY_DOWN: p_sys->i_box_plidx++; break; case KEY_PPAGE: p_sys->i_box_plidx -= p_sys->i_box_lines; break; case KEY_NPAGE: p_sys->i_box_plidx += p_sys->i_box_lines; break; case 'D': case KEY_BACKSPACE: case 0x7f: case KEY_DC: { playlist_item_t *p_item; PL_LOCK; p_item = p_sys->pp_plist[p_sys->i_box_plidx]->p_item; if( p_item->i_children == -1 ) { playlist_DeleteFromInput( p_playlist, p_item->p_input->i_id, pl_Locked ); } else { playlist_NodeDelete( p_playlist, p_item, true , false ); } PL_UNLOCK; PlaylistRebuild( p_intf ); break; } case KEY_ENTER: case '\r': case '\n': if( !p_sys->pp_plist[p_sys->i_box_plidx] ) { b_ret = false; break; } if( p_sys->pp_plist[p_sys->i_box_plidx]->p_item->i_children == -1 ) { playlist_item_t *p_item, *p_parent; p_item = p_parent = p_sys->pp_plist[p_sys->i_box_plidx]->p_item; if( !p_parent ) p_parent = p_playlist->p_root_onelevel; while( p_parent->p_parent ) p_parent = p_parent->p_parent; playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, pl_Unlocked, p_parent, p_item ); } else if( p_sys->pp_plist[p_sys->i_box_plidx]->p_item->i_children == 0 ) { /* We only want to set the current node */ playlist_Stop( p_playlist ); p_sys->p_node = p_sys->pp_plist[p_sys->i_box_plidx]->p_item; } else { p_sys->p_node = p_sys->pp_plist[p_sys->i_box_plidx]->p_item; playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, pl_Unlocked, p_sys->pp_plist[p_sys->i_box_plidx]->p_item, NULL ); } b_box_plidx_follow = true; break; default: b_ret = false; break; } if( b_ret ) { int i_max = p_sys->i_plist_entries; if( p_sys->i_box_plidx >= i_max ) p_sys->i_box_plidx = i_max - 1; if( p_sys->i_box_plidx < 0 ) p_sys->i_box_plidx = 0; if( PlaylistIsPlaying( p_intf, p_sys->pp_plist[p_sys->i_box_plidx]->p_item ) ) b_box_plidx_follow = true; p_sys->b_box_plidx_follow = b_box_plidx_follow; ReturnTrue; } } if( p_sys->i_box_type == BOX_BROWSE ) { bool b_ret = true; /* Browser navigation */ switch( i_key ) { case KEY_HOME: p_sys->i_box_bidx = 0; break;#ifdef __FreeBSD__ case KEY_SELECT:#endif case KEY_END: p_sys->i_box_bidx = p_sys->i_dir_entries - 1; break; case KEY_UP: p_sys->i_box_bidx--; break; case KEY_DOWN: p_sys->i_box_bidx++; break; case KEY_PPAGE: p_sys->i_box_bidx -= p_sys->i_box_lines; break; case KEY_NPAGE: p_sys->i_box_bidx += p_sys->i_box_lines; break; case '.': /* Toggle show hidden files */ p_sys->b_show_hidden_files = ( p_sys->b_show_hidden_files == true ? false : true ); ReadDir( p_intf ); break; case KEY_ENTER: case '\r': case '\n': case ' ': if( p_sys->pp_dir_entries[p_sys->i_box_bidx]->b_file || i_key == ' ' ) { int i_size_entry = strlen( "directory://" ) + strlen( p_sys->psz_current_dir ) + strlen( p_sys->pp_dir_entries[p_sys->i_box_bidx]->psz_path ) + 2; char *psz_uri = (char *)malloc( sizeof(char)*i_size_entry); sprintf( psz_uri, "directory://%s/%s", p_sys->psz_current_dir, p_sys->pp_dir_entries[p_sys->i_box_bidx]->psz_path ); playlist_item_t *p_parent = p_sys->p_node; if( !p_parent ) p_parent = p_playlist->status.p_node; if( !p_parent ) p_parent = p_playlist->p_local_onelevel; while( p_parent->p_parent && p_parent->p_parent->p_parent ) p_parent = p_parent->p_parent; playlist_Add( p_playlist, psz_uri, NULL, PLAYLIST_APPEND, PLAYLIST_END, p_parent->p_input ==
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -