Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-gpu
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-gpu
Commits
e155b93a
Commit
e155b93a
authored
Aug 25, 2011
by
Rafaël Carré
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ncurses: cosmetics
1tbs remove hungarian prefixes
parent
24a2edf5
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
645 additions
and
761 deletions
+645
-761
modules/gui/ncurses.c
modules/gui/ncurses.c
+645
-761
No files found.
modules/gui/ncurses.c
View file @
e155b93a
...
...
@@ -103,7 +103,7 @@ enum
BOX_STATS
};
static
const
char
*
box_title
[
]
=
{
static
const
char
box_title
[][
19
]
=
{
[
BOX_NONE
]
=
""
,
[
BOX_HELP
]
=
" Help "
,
[
BOX_INFO
]
=
" Information "
,
...
...
@@ -167,31 +167,31 @@ static const struct { short f; short b; } color_pairs[] =
struct
dir_entry_t
{
bool
b_
file
;
char
*
p
sz_p
ath
;
bool
file
;
char
*
path
;
};
struct
pl_item_t
{
playlist_item_t
*
p_
item
;
char
*
psz_
display
;
playlist_item_t
*
item
;
char
*
display
;
};
struct
intf_sys_t
{
input_thread_t
*
p_input
;
bool
b_
color
;
bool
b_
exit
;
bool
color
;
bool
exit
;
int
i_
box_type
;
int
i_
box_y
;
// start of box content
int
i_
box_height
;
int
i_
box_lines_total
;
// number of lines in the box
int
i_
box_start
;
// first line of box displayed
int
i_
box_idx
;
// selected line
int
box_type
;
int
box_y
;
// start of box content
int
box_height
;
int
box_lines_total
;
// number of lines in the box
int
box_start
;
// first line of box displayed
int
box_idx
;
// selected line
msg_subscription_t
*
p_
sub
;
// message bank subscription
msg_subscription_t
*
sub
;
// message bank subscription
struct
{
int
type
;
...
...
@@ -199,30 +199,30 @@ struct intf_sys_t
char
*
msg
;
}
msgs
[
50
];
// ring buffer
int
i_msgs
;
int
i_
verbosity
;
int
verbosity
;
vlc_mutex_t
msg_lock
;
/* Search Box context */
char
psz_
search_chain
[
20
];
char
*
psz_
old_search
;
int
i_
before_search
;
char
search_chain
[
20
];
char
*
old_search
;
int
before_search
;
/* Open Box Context */
char
psz_
open_chain
[
50
];
char
open_chain
[
50
];
/* File Browser context */
char
*
psz_
current_dir
;
int
i
_dir_entries
;
struct
dir_entry_t
**
pp_
dir_entries
;
bool
b_
show_hidden_files
;
char
*
current_dir
;
int
n
_dir_entries
;
struct
dir_entry_t
**
dir_entries
;
bool
show_hidden_files
;
/* Playlist context */
struct
pl_item_t
**
p
p_p
list
;
int
i_
plist_entries
;
bool
b_
need_update
;
struct
pl_item_t
**
plist
;
int
plist_entries
;
bool
need_update
;
vlc_mutex_t
pl_lock
;
bool
b_
plidx_follow
;
playlist_item_t
*
p_
node
;
/* current node */
bool
plidx_follow
;
playlist_item_t
*
node
;
/* current node */
};
...
...
@@ -230,28 +230,26 @@ struct intf_sys_t
* Directories
*****************************************************************************/
static
void
DirsDestroy
(
intf_sys_t
*
p_
sys
)
static
void
DirsDestroy
(
intf_sys_t
*
sys
)
{
while
(
p_sys
->
i_dir_entries
)
{
struct
dir_entry_t
*
p_dir_entry
;
p_dir_entry
=
p_sys
->
pp_dir_entries
[
--
p_sys
->
i_dir_entries
];
free
(
p_dir_entry
->
psz_path
);
free
(
p_dir_entry
);
while
(
sys
->
n_dir_entries
)
{
struct
dir_entry_t
*
dir_entry
=
sys
->
dir_entries
[
--
sys
->
n_dir_entries
];
free
(
dir_entry
->
path
);
free
(
dir_entry
);
}
free
(
p_sys
->
pp_
dir_entries
);
p_sys
->
pp_
dir_entries
=
NULL
;
free
(
sys
->
dir_entries
);
sys
->
dir_entries
=
NULL
;
}
static
int
com
p_dir_entries
(
const
void
*
pp_dir_entry1
,
const
void
*
pp_dir_entry2
)
static
int
com
dir_entries
(
const
void
*
a
,
const
void
*
b
)
{
struct
dir_entry_t
*
p_dir_entry1
=
*
(
struct
dir_entry_t
**
)
pp_dir_entry1
;
struct
dir_entry_t
*
p_dir_entry2
=
*
(
struct
dir_entry_t
**
)
pp_dir_entry2
;
struct
dir_entry_t
*
dir_entry1
=
*
(
struct
dir_entry_t
**
)
a
;
struct
dir_entry_t
*
dir_entry2
=
*
(
struct
dir_entry_t
**
)
b
;
if
(
p_dir_entry1
->
b_file
==
p_dir_entry2
->
b_
file
)
return
strcasecmp
(
p_dir_entry1
->
psz_path
,
p_dir_entry2
->
psz_
path
);
if
(
dir_entry1
->
file
==
dir_entry2
->
file
)
return
strcasecmp
(
dir_entry1
->
path
,
dir_entry2
->
path
);
return
p_dir_entry1
->
b_
file
?
1
:
-
1
;
return
dir_entry1
->
file
?
1
:
-
1
;
}
static
bool
IsFile
(
const
char
*
current_dir
,
const
char
*
entry
)
...
...
@@ -259,10 +257,8 @@ static bool IsFile(const char *current_dir, const char *entry)
bool
ret
=
true
;
#ifdef S_ISDIR
char
*
uri
;
struct
stat
st
;
if
(
asprintf
(
&
uri
,
"%s"
DIR_SEP
"%s"
,
current_dir
,
entry
)
!=
-
1
)
{
if
(
asprintf
(
&
uri
,
"%s"
DIR_SEP
"%s"
,
current_dir
,
entry
)
!=
-
1
)
{
struct
stat
st
;
ret
=
vlc_stat
(
uri
,
&
st
)
||
!
S_ISDIR
(
st
.
st_mode
);
free
(
uri
);
}
...
...
@@ -270,311 +266,281 @@ static bool IsFile(const char *current_dir, const char *entry)
return
ret
;
}
static
void
ReadDir
(
intf_thread_t
*
p_
intf
)
static
void
ReadDir
(
intf_thread_t
*
intf
)
{
intf_sys_t
*
p_sys
=
p_intf
->
p_sys
;
DIR
*
p_current_dir
;
intf_sys_t
*
sys
=
intf
->
p_sys
;
if
(
!
p_sys
->
psz_current_dir
||
!*
p_sys
->
psz_current_dir
)
{
msg_Dbg
(
p_intf
,
"no current dir set"
);
if
(
!
sys
->
current_dir
||
!*
sys
->
current_dir
)
{
msg_Dbg
(
intf
,
"no current dir set"
);
return
;
}
char
*
psz_entry
;
/* Open the dir */
p_current_dir
=
vlc_opendir
(
p_sys
->
psz_current_dir
);
if
(
!
p_current_dir
)
{
/* something went bad, get out of here ! */
msg_Warn
(
p_intf
,
"cannot open directory `%s' (%m)"
,
p_sys
->
psz_current_dir
);
DIR
*
current_dir
=
vlc_opendir
(
sys
->
current_dir
);
if
(
!
current_dir
)
{
msg_Warn
(
intf
,
"cannot open directory `%s' (%m)"
,
sys
->
current_dir
);
return
;
}
/* Clean the old shit */
DirsDestroy
(
p_sys
);
/* while we still have entries in the directory */
while
((
psz_entry
=
vlc_readdir
(
p_current_dir
)))
{
struct
dir_entry_t
*
p_dir_entry
;
DirsDestroy
(
sys
);
if
(
!
p_sys
->
b_show_hidden_files
)
if
(
*
psz_entry
==
'.'
&&
strcmp
(
psz_entry
,
".."
))
goto
next
;
char
*
entry
;
while
((
entry
=
vlc_readdir
(
current_dir
)))
{
if
(
!
sys
->
show_hidden_files
&&
*
entry
==
'.'
&&
strcmp
(
entry
,
".."
))
goto
next
;
if
(
!
(
p_dir_entry
=
malloc
(
sizeof
*
p_dir_entry
)))
struct
dir_entry_t
*
dir_entry
=
malloc
(
sizeof
*
dir_entry
);
if
(
!
dir_entry
)
goto
next
;
p_dir_entry
->
b_file
=
IsFile
(
p_sys
->
psz_current_dir
,
psz_
entry
);
p_dir_entry
->
psz_path
=
psz_
entry
;
INSERT_ELEM
(
p_sys
->
pp_dir_entries
,
p_sys
->
i
_dir_entries
,
p_sys
->
i_dir_entries
,
p_
dir_entry
);
dir_entry
->
file
=
IsFile
(
sys
->
current_dir
,
entry
);
dir_entry
->
path
=
entry
;
INSERT_ELEM
(
sys
->
dir_entries
,
sys
->
n
_dir_entries
,
sys
->
n_dir_entries
,
dir_entry
);
continue
;
next:
free
(
psz_
entry
);
free
(
entry
);
}
/* Sort */
qsort
(
p_sys
->
pp_dir_entries
,
p_sys
->
i_dir_entries
,
sizeof
(
struct
dir_entry_t
*
),
&
comp_dir_entries
);
qsort
(
sys
->
dir_entries
,
sys
->
n_dir_entries
,
sizeof
(
struct
dir_entry_t
*
),
&
comdir_entries
);
closedir
(
p_
current_dir
);
closedir
(
current_dir
);
}
/*****************************************************************************
* Adjust index position after a change (list navigation or item switching)
*****************************************************************************/
static
void
CheckIdx
(
intf_sys_t
*
p_
sys
)
static
void
CheckIdx
(
intf_sys_t
*
sys
)
{
int
lines
=
p_sys
->
i_
box_lines_total
;
int
height
=
LINES
-
p_sys
->
i_
box_y
-
2
;
int
lines
=
sys
->
box_lines_total
;
int
height
=
LINES
-
sys
->
box_y
-
2
;
if
(
height
>
lines
-
1
)
height
=
lines
-
1
;
/* make sure the new index is within the box */
if
(
p_sys
->
i_box_idx
<=
0
)
{
p_sys
->
i_box_idx
=
0
;
p_sys
->
i_box_start
=
0
;
}
else
if
(
p_sys
->
i_box_idx
>=
lines
-
1
&&
lines
>
0
)
{
p_sys
->
i_box_idx
=
lines
-
1
;
p_sys
->
i_box_start
=
p_sys
->
i_box_idx
-
height
;
if
(
sys
->
box_idx
<=
0
)
{
sys
->
box_idx
=
0
;
sys
->
box_start
=
0
;
}
else
if
(
sys
->
box_idx
>=
lines
-
1
&&
lines
>
0
)
{
sys
->
box_idx
=
lines
-
1
;
sys
->
box_start
=
sys
->
box_idx
-
height
;
}
/* Fix box start (1st line of the box displayed) */
if
(
p_sys
->
i_box_idx
<
p_sys
->
i_box_start
||
p_sys
->
i_box_idx
>
height
+
p_sys
->
i_box_start
+
1
)
{
p_sys
->
i_box_start
=
p_sys
->
i_box_idx
-
height
/
2
;
if
(
p_sys
->
i_box_start
<
0
)
p_sys
->
i_box_start
=
0
;
if
(
sys
->
box_idx
<
sys
->
box_start
||
sys
->
box_idx
>
height
+
sys
->
box_start
+
1
)
{
sys
->
box_start
=
sys
->
box_idx
-
height
/
2
;
if
(
sys
->
box_start
<
0
)
sys
->
box_start
=
0
;
}
else
if
(
sys
->
box_idx
==
sys
->
box_start
-
1
)
{
sys
->
box_start
--
;
}
else
if
(
sys
->
box_idx
==
height
+
sys
->
box_start
+
1
)
{
sys
->
box_start
++
;
}
else
if
(
p_sys
->
i_box_idx
==
p_sys
->
i_box_start
-
1
)
p_sys
->
i_box_start
--
;
else
if
(
p_sys
->
i_box_idx
==
height
+
p_sys
->
i_box_start
+
1
)
p_sys
->
i_box_start
++
;
}
/*****************************************************************************
* Playlist
*****************************************************************************/
static
void
PlaylistDestroy
(
intf_sys_t
*
p_
sys
)
static
void
PlaylistDestroy
(
intf_sys_t
*
sys
)
{
while
(
p_sys
->
i_plist_entries
)
{
struct
pl_item_t
*
p_pl_item
=
p_sys
->
pp_plist
[
--
p_sys
->
i_plist_entries
];
free
(
p_pl_item
->
psz_display
);
while
(
sys
->
plist_entries
)
{
struct
pl_item_t
*
p_pl_item
=
sys
->
plist
[
--
sys
->
plist_entries
];
free
(
p_pl_item
->
display
);
free
(
p_pl_item
);
}
free
(
p_sys
->
pp_
plist
);
p_sys
->
pp_
plist
=
NULL
;
free
(
sys
->
plist
);
sys
->
plist
=
NULL
;
}
static
bool
PlaylistAddChild
(
intf_sys_t
*
p_
sys
,
playlist_item_t
*
p_child
,
static
bool
PlaylistAddChild
(
intf_sys_t
*
sys
,
playlist_item_t
*
p_child
,
const
char
*
c
,
const
char
d
)
{
int
ret
;
char
*
psz_
name
=
input_item_GetTitleFbName
(
p_child
->
p_input
);
char
*
name
=
input_item_GetTitleFbName
(
p_child
->
p_input
);
struct
pl_item_t
*
p_pl_item
=
malloc
(
sizeof
*
p_pl_item
);
if
(
!
psz_
name
||
!
p_pl_item
)
if
(
!
name
||
!
p_pl_item
)
goto
error
;
p_pl_item
->
p_
item
=
p_child
;
p_pl_item
->
item
=
p_child
;
if
(
c
&&
*
c
)
ret
=
asprintf
(
&
p_pl_item
->
psz_display
,
"%s%c-%s"
,
c
,
d
,
psz_
name
);
ret
=
asprintf
(
&
p_pl_item
->
display
,
"%s%c-%s"
,
c
,
d
,
name
);
else
ret
=
asprintf
(
&
p_pl_item
->
psz_display
,
" %s"
,
psz_
name
);
ret
=
asprintf
(
&
p_pl_item
->
display
,
" %s"
,
name
);
free
(
psz_
name
);
psz_
name
=
NULL
;
free
(
name
);
name
=
NULL
;
if
(
ret
==
-
1
)
goto
error
;
INSERT_ELEM
(
p_sys
->
pp_plist
,
p_sys
->
i_
plist_entries
,
p_sys
->
i_
plist_entries
,
p_pl_item
);
INSERT_ELEM
(
sys
->
plist
,
sys
->
plist_entries
,
sys
->
plist_entries
,
p_pl_item
);
return
true
;
error:
free
(
psz_
name
);
free
(
name
);
free
(
p_pl_item
);
return
false
;
}
static
void
PlaylistAddNode
(
intf_sys_t
*
p_sys
,
playlist_item_t
*
p_
node
,
static
void
PlaylistAddNode
(
intf_sys_t
*
sys
,
playlist_item_t
*
node
,
const
char
*
c
)
{
for
(
int
k
=
0
;
k
<
p_node
->
i_children
;
k
++
)
{
playlist_item_t
*
p_child
=
p_node
->
pp_children
[
k
];
char
d
=
k
==
p_node
->
i_children
-
1
?
'`'
:
'|'
;
if
(
!
PlaylistAddChild
(
p_sys
,
p_child
,
c
,
d
))
for
(
int
k
=
0
;
k
<
node
->
i_children
;
k
++
)
{
bool
last
=
k
==
node
->
i_children
-
1
;
playlist_item_t
*
p_child
=
node
->
pp_children
[
k
];
if
(
!
PlaylistAddChild
(
sys
,
p_child
,
c
,
last
?
'`'
:
'|'
))
return
;
if
(
p_child
->
i_children
<=
0
)
continue
;
if
(
*
c
)
{
char
*
psz_tmp
;
if
(
asprintf
(
&
psz_tmp
,
"%s%c "
,
c
,
k
==
p_node
->
i_children
-
1
?
' '
:
'|'
)
==
-
1
)
if
(
*
c
)
{
char
*
tmp
;
if
(
asprintf
(
&
tmp
,
"%s%c "
,
c
,
last
?
' '
:
'|'
)
==
-
1
)
return
;
PlaylistAddNode
(
p_sys
,
p_child
,
psz_tmp
);
free
(
psz_tmp
);
PlaylistAddNode
(
sys
,
p_child
,
tmp
);
free
(
tmp
);
}
else
{
PlaylistAddNode
(
sys
,
p_child
,
" "
);
}
else
PlaylistAddNode
(
p_sys
,
p_child
,
" "
);
}
}
static
void
PlaylistRebuild
(
intf_thread_t
*
p_
intf
)
static
void
PlaylistRebuild
(
intf_thread_t
*
intf
)
{
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
playlist_t
*
p_playlist
=
pl_Get
(
p_
intf
);
intf_sys_t
*
sys
=
intf
->
p_sys
;
playlist_t
*
p_playlist
=
pl_Get
(
intf
);
PL_LOCK
;
PlaylistDestroy
(
p_
sys
);
PlaylistAddNode
(
p_
sys
,
p_playlist
->
p_root_onelevel
,
""
);
PlaylistDestroy
(
sys
);
PlaylistAddNode
(
sys
,
p_playlist
->
p_root_onelevel
,
""
);
PL_UNLOCK
;
}
static
int
ItemChanged
(
vlc_object_t
*
p_this
,
const
char
*
psz_
variable
,
static
int
ItemChanged
(
vlc_object_t
*
p_this
,
const
char
*
variable
,
vlc_value_t
oval
,
vlc_value_t
nval
,
void
*
param
)
{
VLC_UNUSED
(
p_this
);
VLC_UNUSED
(
psz_
variable
);
VLC_UNUSED
(
p_this
);
VLC_UNUSED
(
variable
);
VLC_UNUSED
(
oval
);
VLC_UNUSED
(
nval
);
intf_thread_t
*
p_intf
=
(
intf_thread_t
*
)
param
;
intf_sys_t
*
p_sys
=
p_intf
->
p_sys
;
intf_sys_t
*
sys
=
((
intf_thread_t
*
)
param
)
->
p_sys
;
vlc_mutex_lock
(
&
p_
sys
->
pl_lock
);
p_sys
->
b_
need_update
=
true
;
vlc_mutex_unlock
(
&
p_
sys
->
pl_lock
);
vlc_mutex_lock
(
&
sys
->
pl_lock
);
sys
->
need_update
=
true
;
vlc_mutex_unlock
(
&
sys
->
pl_lock
);
return
VLC_SUCCESS
;
}
static
int
PlaylistChanged
(
vlc_object_t
*
p_this
,
const
char
*
psz_
variable
,
static
int
PlaylistChanged
(
vlc_object_t
*
p_this
,
const
char
*
variable
,
vlc_value_t
oval
,
vlc_value_t
nval
,
void
*
param
)
{
VLC_UNUSED
(
p_this
);
VLC_UNUSED
(
psz_
variable
);
VLC_UNUSED
(
p_this
);
VLC_UNUSED
(
variable
);
VLC_UNUSED
(
oval
);
VLC_UNUSED
(
nval
);
intf_thread_t
*
p_
intf
=
(
intf_thread_t
*
)
param
;
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
playlist_item_t
*
p_node
=
playlist_CurrentPlayingItem
(
pl_Get
(
p_
intf
));
intf_thread_t
*
intf
=
(
intf_thread_t
*
)
param
;
intf_sys_t
*
sys
=
intf
->
p_sys
;
playlist_item_t
*
node
=
playlist_CurrentPlayingItem
(
pl_Get
(
intf
));
vlc_mutex_lock
(
&
p_
sys
->
pl_lock
);
p_sys
->
b_
need_update
=
true
;
p_sys
->
p_node
=
p_node
?
p_
node
->
p_parent
:
NULL
;
vlc_mutex_unlock
(
&
p_
sys
->
pl_lock
);
vlc_mutex_lock
(
&
sys
->
pl_lock
);
sys
->
need_update
=
true
;
sys
->
node
=
node
?
node
->
p_parent
:
NULL
;
vlc_mutex_unlock
(
&
sys
->
pl_lock
);
return
VLC_SUCCESS
;
}
/* Playlist suxx */
static
int
SubSearchPlaylist
(
intf_sys_t
*
p_sys
,
char
*
psz_
searchstring
,
static
int
SubSearchPlaylist
(
intf_sys_t
*
sys
,
char
*
searchstring
,
int
i_start
,
int
i_stop
)
{
for
(
int
i
=
i_start
+
1
;
i
<
i_stop
;
i
++
)
if
(
strcasestr
(
p_sys
->
pp_plist
[
i
]
->
psz_display
,
psz_
searchstring
))
for
(
int
i
=
i_start
+
1
;
i
<
i_stop
;
i
++
)
if
(
strcasestr
(
sys
->
plist
[
i
]
->
display
,
searchstring
))
return
i
;
return
-
1
;
}
static
void
SearchPlaylist
(
intf_sys_t
*
p_sys
,
char
*
psz_searchstring
)
static
void
SearchPlaylist
(
intf_sys_t
*
sys
,
char
*
str
)
{
int
i_item
,
i_first
=
p_sys
->
i_before_search
;
int
i_first
=
sys
->
before_search
;
if
(
i_first
<
0
)
i_first
=
0
;
if
(
!
psz_searchstring
||
!*
psz_searchstring
)
{
p_sys
->
i_box_idx
=
p_sys
->
i_before_search
;
if
(
!
str
||
!*
str
)
{
sys
->
box_idx
=
sys
->
before_search
;
return
;
}
i_item
=
SubSearchPlaylist
(
p_sys
,
psz_searchstring
,
i_first
+
1
,
p_sys
->
i_plist_entries
);
int
i_item
=
SubSearchPlaylist
(
sys
,
str
,
i_first
+
1
,
sys
->
plist_entries
);
if
(
i_item
<
0
)
i_item
=
SubSearchPlaylist
(
p_sys
,
psz_searchstring
,
0
,
i_first
);
i_item
=
SubSearchPlaylist
(
sys
,
str
,
0
,
i_first
);
if
(
i_item
>
0
)
{
p_sys
->
i_box_idx
=
i_item
;
CheckIdx
(
p_sys
);
if
(
i_item
>
0
)
{
sys
->
box_idx
=
i_item
;
CheckIdx
(
sys
);
}
}
static
inline
bool
IsIndex
(
intf_sys_t
*
p_
sys
,
playlist_t
*
p_playlist
,
int
i
)
static
inline
bool
IsIndex
(
intf_sys_t
*
sys
,
playlist_t
*
p_playlist
,
int
i
)
{
playlist_item_t
*
p_item
=
p_sys
->
pp_plist
[
i
]
->
p_item
;
playlist_item_t
*
p_played_item
;
playlist_item_t
*
item
=
sys
->
plist
[
i
]
->
item
;
PL_ASSERT_LOCKED
;
vlc_mutex_lock
(
&
p_
sys
->
pl_lock
);
if
(
p_item
->
i_children
==
0
&&
p_item
==
p_sys
->
p_
node
)
{
vlc_mutex_unlock
(
&
p_
sys
->
pl_lock
);
vlc_mutex_lock
(
&
sys
->
pl_lock
);
if
(
item
->
i_children
==
0
&&
item
==
sys
->
node
)
{
vlc_mutex_unlock
(
&
sys
->
pl_lock
);
return
true
;
}
vlc_mutex_unlock
(
&
p_
sys
->
pl_lock
);
vlc_mutex_unlock
(
&
sys
->
pl_lock
);
p_played_item
=
playlist_CurrentPlayingItem
(
p_playlist
);
if
(
p_played_item
&&
p_
item
->
p_input
&&
p_played_item
->
p_input
)
return
p_
item
->
p_input
->
i_id
==
p_played_item
->
p_input
->
i_id
;
p
laylist_item_t
*
p
_played_item
=
playlist_CurrentPlayingItem
(
p_playlist
);
if
(
p_played_item
&&
item
->
p_input
&&
p_played_item
->
p_input
)
return
item
->
p_input
->
i_id
==
p_played_item
->
p_input
->
i_id
;
return
false
;
}
static
void
FindIndex
(
intf_sys_t
*
p_
sys
,
playlist_t
*
p_playlist
)
static
void
FindIndex
(
intf_sys_t
*
sys
,
playlist_t
*
p_playlist
)
{
int
plidx
=
p_sys
->
i_
box_idx
;
int
max
=
p_sys
->
i_
plist_entries
;
int
plidx
=
sys
->
box_idx
;
int
max
=
sys
->
plist_entries
;
PL_LOCK
;
if
(
!
IsIndex
(
p_sys
,
p_playlist
,
plidx
))
for
(
int
i
=
0
;
i
<
max
;
i
++
)
if
(
IsIndex
(
p_sys
,
p_playlist
,
i
))
{
p_sys
->
i_box_idx
=
i
;
CheckIdx
(
p_sys
);
if
(
!
IsIndex
(
sys
,
p_playlist
,
plidx
))
for
(
int
i
=
0
;
i
<
max
;
i
++
)
if
(
IsIndex
(
sys
,
p_playlist
,
i
))
{
sys
->
box_idx
=
i
;
CheckIdx
(
sys
);
break
;
}
PL_UNLOCK
;
p_sys
->
b_
plidx_follow
=
true
;
sys
->
plidx_follow
=
true
;
}
/****************************************************************************
* Drawing
****************************************************************************/
static
void
start_color_and_pairs
(
intf_thread_t
*
p_
intf
)
static
void
start_color_and_pairs
(
intf_thread_t
*
intf
)
{
if
(
!
has_colors
())
{
p_intf
->
p_sys
->
b_color
=
false
;
msg_Warn
(
p_intf
,
"Terminal doesn't support colors"
);
if
(
!
has_colors
())
{
intf
->
p_sys
->
color
=
false
;
msg_Warn
(
intf
,
"Terminal doesn't support colors"
);
return
;
}
start_color
();
for
(
int
i
=
C_DEFAULT
+
1
;
i
<
C_MAX
;
i
++
)
for
(
int
i
=
C_DEFAULT
+
1
;
i
<
C_MAX
;
i
++
)
init_pair
(
i
,
color_pairs
[
i
].
f
,
color_pairs
[
i
].
b
);
/* untested, in all my terminals, !can_change_color() --funman */
...
...
@@ -582,30 +548,27 @@ static void start_color_and_pairs(intf_thread_t *p_intf)
init_color
(
COLOR_YELLOW
,
960
,
500
,
0
);
/* YELLOW -> ORANGE */
}
static
void
DrawBox
(
int
y
,
int
h
,
bool
b_
color
,
const
char
*
title
)
static
void
DrawBox
(
int
y
,
int
h
,
bool
color
,
const
char
*
title
)
{
int
i_len
;
int
w
=
COLS
;
if
(
w
<=
3
||
h
<=
0
)
return
;
if
(
b_
color
)
color_set
(
C_BOX
,
NULL
);
if
(
color
)
color_set
(
C_BOX
,
NULL
);
if
(
!
title
)
title
=
""
;
i
_
len
=
strlen
(
title
);
i
nt
len
=
strlen
(
title
);
if
(
i_
len
>
w
-
2
)
i_
len
=
w
-
2
;
if
(
len
>
w
-
2
)
len
=
w
-
2
;
mvaddch
(
y
,
0
,
ACS_ULCORNER
);
mvhline
(
y
,
1
,
ACS_HLINE
,
(
w
-
i_
len
-
2
)
/
2
);
mvprintw
(
y
,
1
+
(
w
-
i_
len
-
2
)
/
2
,
"%s"
,
title
);
mvhline
(
y
,
(
w
-
i_len
)
/
2
+
i_len
,
ACS_HLINE
,
w
-
1
-
((
w
-
i_len
)
/
2
+
i_
len
));
mvhline
(
y
,
1
,
ACS_HLINE
,
(
w
-
len
-
2
)
/
2
);
mvprintw
(
y
,
1
+
(
w
-
len
-
2
)
/
2
,
"%s"
,
title
);
mvhline
(
y
,
(
w
-
len
)
/
2
+
len
,
ACS_HLINE
,
w
-
1
-
((
w
-
len
)
/
2
+
len
));
mvaddch
(
y
,
w
-
1
,
ACS_URCORNER
);
for
(
int
i
=
0
;
i
<
h
;
i
++
)
{
for
(
int
i
=
0
;
i
<
h
;
i
++
)
{
mvaddch
(
++
y
,
0
,
ACS_VLINE
);
mvaddch
(
y
,
w
-
1
,
ACS_VLINE
);
}
...
...
@@ -613,7 +576,7 @@ static void DrawBox(int y, int h, bool b_color, const char *title)
mvaddch
(
++
y
,
0
,
ACS_LLCORNER
);
mvhline
(
y
,
1
,
ACS_HLINE
,
w
-
2
);
mvaddch
(
y
,
w
-
1
,
ACS_LRCORNER
);
if
(
b_
color
)
color_set
(
C_DEFAULT
,
NULL
);
if
(
color
)
color_set
(
C_DEFAULT
,
NULL
);
}
static
void
DrawEmptyLine
(
int
y
,
int
x
,
int
w
)
...
...
@@ -636,7 +599,7 @@ static void mvnprintw(int y, int x, int w, const char *p_fmt, ...)
{
va_list
vl_args
;
char
*
p_buf
;
int
i_
len
;
int
len
;
if
(
w
<=
0
)
return
;
...
...
@@ -646,36 +609,32 @@ static void mvnprintw(int y, int x, int w, const char *p_fmt, ...)
return
;
va_end
(
vl_args
);
i_
len
=
strlen
(
p_buf
);
len
=
strlen
(
p_buf
);
wchar_t
psz_wide
[
i_
len
+
1
];
wchar_t
wide
[
len
+
1
];
EnsureUTF8
(
p_buf
);
size_t
i_char_len
=
mbstowcs
(
psz_wide
,
p_buf
,
i_
len
);
size_t
i_char_len
=
mbstowcs
(
wide
,
p_buf
,
len
);
size_t
i_width
;
/* number of columns */
if
(
i_char_len
==
(
size_t
)
-
1
)
/* an invalid character was encountered */
{
if
(
i_char_len
==
(
size_t
)
-
1
)
/* an invalid character was encountered */
{
free
(
p_buf
);
return
;
}
i_width
=
wcswidth
(
psz_wide
,
i_char_len
);
if
(
i_width
==
(
size_t
)
-
1
)
{
i_width
=
wcswidth
(
wide
,
i_char_len
);
if
(
i_width
==
(
size_t
)
-
1
)
{
/* a non printable character was encountered */
i_width
=
0
;
for
(
unsigned
i
=
0
;
i
<
i_char_len
;
i
++
)
{
int
i_cwidth
=
wcwidth
(
psz_wide
[
i
]);
for
(
unsigned
i
=
0
;
i
<
i_char_len
;
i
++
)
{
int
i_cwidth
=
wcwidth
(
wide
[
i
]);
if
(
i_cwidth
!=
-
1
)
i_width
+=
i_cwidth
;
}
}
if
(
i_width
<=
(
size_t
)
w
)
{
if
(
i_width
<=
(
size_t
)
w
)
{
mvprintw
(
y
,
x
,
"%s"
,
p_buf
);
mvhline
(
y
,
x
+
i_width
,
' '
,
w
-
i_width
);
free
(
p_buf
);
...
...
@@ -684,56 +643,53 @@ static void mvnprintw(int y, int x, int w, const char *p_fmt, ...)
int
i_total_width
=
0
;
int
i
=
0
;
while
(
i_total_width
<
w
)
{
i_total_width
+=
wcwidth
(
psz_wide
[
i
]);
if
(
w
>
7
&&
i_total_width
>=
w
/
2
)
{
psz_wide
[
i
]
=
'.'
;
psz_wide
[
i
+
1
]
=
'.'
;
i_total_width
-=
wcwidth
(
psz_wide
[
i
])
-
2
;
if
(
i
>
0
)
{
while
(
i_total_width
<
w
)
{
i_total_width
+=
wcwidth
(
wide
[
i
]);
if
(
w
>
7
&&
i_total_width
>=
w
/
2
)
{
wide
[
i
]
=
'.'
;
wide
[
i
+
1
]
=
'.'
;
i_total_width
-=
wcwidth
(
wide
[
i
])
-
2
;
if
(
i
>
0
)
{
/* we require this check only if at least one character
* 4 or more columns wide exists (which i doubt) */
psz_
wide
[
i
-
1
]
=
'.'
;
i_total_width
-=
wcwidth
(
psz_
wide
[
i
-
1
])
-
1
;
wide
[
i
-
1
]
=
'.'
;
i_total_width
-=
wcwidth
(
wide
[
i
-
1
])
-
1
;
}
/* find the widest string */
int
j
,
i_2nd_width
=
0
;
for
(
j
=
i_char_len
-
1
;
i_2nd_width
<
w
-
i_total_width
;
j
--
)
i_2nd_width
+=
wcwidth
(
psz_
wide
[
j
]);
for
(
j
=
i_char_len
-
1
;
i_2nd_width
<
w
-
i_total_width
;
j
--
)
i_2nd_width
+=
wcwidth
(
wide
[
j
]);
/* we already have i_total_width columns filled, and we can't
* have more than w columns */
if
(
i_2nd_width
>
w
-
i_total_width
)
j
++
;
wmemmove
(
&
psz_wide
[
i
+
2
],
&
psz_
wide
[
j
+
1
],
i_char_len
-
j
-
1
);
psz_
wide
[
i
+
2
+
i_char_len
-
j
-
1
]
=
'\0'
;
wmemmove
(
&
wide
[
i
+
2
],
&
wide
[
j
+
1
],
i_char_len
-
j
-
1
);
wide
[
i
+
2
+
i_char_len
-
j
-
1
]
=
'\0'
;
break
;
}
i
++
;
}
if
(
w
<=
7
)
/* we don't add the '...' else we lose too much chars */
psz_
wide
[
i
]
=
'\0'
;
wide
[
i
]
=
'\0'
;
size_t
i_wlen
=
wcslen
(
psz_
wide
)
*
6
+
1
;
/* worst case */
char
psz_
ellipsized
[
i_wlen
];
wcstombs
(
psz_ellipsized
,
psz_
wide
,
i_wlen
);
mvprintw
(
y
,
x
,
"%s"
,
psz_
ellipsized
);
size_t
i_wlen
=
wcslen
(
wide
)
*
6
+
1
;
/* worst case */
char
ellipsized
[
i_wlen
];
wcstombs
(
ellipsized
,
wide
,
i_wlen
);
mvprintw
(
y
,
x
,
"%s"
,
ellipsized
);
free
(
p_buf
);
}
static
void
MainBoxWrite
(
intf_sys_t
*
p_
sys
,
int
l
,
const
char
*
p_fmt
,
...)
static
void
MainBoxWrite
(
intf_sys_t
*
sys
,
int
l
,
const
char
*
p_fmt
,
...)
{
va_list
vl_args
;
char
*
p_buf
;
bool
b_selected
=
l
==
p_sys
->
i_
box_idx
;
bool
b_selected
=
l
==
sys
->
box_idx
;
if
(
l
<
p_sys
->
i_box_start
||
l
-
p_sys
->
i_box_start
>=
p_sys
->
i_
box_height
)
if
(
l
<
sys
->
box_start
||
l
-
sys
->
box_start
>=
sys
->
box_height
)
return
;
va_start
(
vl_args
,
p_fmt
);
...
...
@@ -742,194 +698,175 @@ static void MainBoxWrite(intf_sys_t *p_sys, int l, const char *p_fmt, ...)
va_end
(
vl_args
);
if
(
b_selected
)
attron
(
A_REVERSE
);
mvnprintw
(
p_sys
->
i_box_y
+
l
-
p_sys
->
i_
box_start
,
1
,
COLS
-
2
,
"%s"
,
p_buf
);
mvnprintw
(
sys
->
box_y
+
l
-
sys
->
box_start
,
1
,
COLS
-
2
,
"%s"
,
p_buf
);
if
(
b_selected
)
attroff
(
A_REVERSE
);
free
(
p_buf
);
}
static
int
SubDrawObject
(
intf_sys_t
*
p_
sys
,
int
l
,
vlc_object_t
*
p_obj
,
int
i_level
,
const
char
*
prefix
)
static
int
SubDrawObject
(
intf_sys_t
*
sys
,
int
l
,
vlc_object_t
*
p_obj
,
int
i_level
,
const
char
*
prefix
)
{
int
x
=
2
*
i_level
++
;
char
*
psz_name
=
vlc_object_get_name
(
p_obj
);
vlc_list_t
*
list
;
char
space
[
x
+
3
];
memset
(
space
,
' '
,
x
);
space
[
x
]
=
'\0'
;
if
(
psz_name
)
{
MainBoxWrite
(
p_sys
,
l
++
,
"%s%s%s
\"
%s
\"
(%p)"
,
space
,
prefix
,
p_obj
->
psz_object_type
,
psz_name
,
p_obj
);
free
(
psz_name
);
}
else
MainBoxWrite
(
p_sys
,
l
++
,
"%s%s%s (%p)"
,
space
,
prefix
,
p_obj
->
psz_object_type
,
p_obj
);
list
=
vlc_list_children
(
p_obj
);
for
(
int
i
=
0
;
i
<
list
->
i_count
;
i
++
)
{
l
=
SubDrawObject
(
p_sys
,
l
,
list
->
p_values
[
i
].
p_object
,
i_level
,
char
*
name
=
vlc_object_get_name
(
p_obj
);
MainBoxWrite
(
sys
,
l
++
,
"%*s%s%s
\"
%s
\"
(%p)"
,
2
*
i_level
++
,
""
,
prefix
,
p_obj
->
psz_object_type
,
name
?
name
:
""
,
p_obj
);
free
(
name
);
vlc_list_t
*
list
=
vlc_list_children
(
p_obj
);
for
(
int
i
=
0
;
i
<
list
->
i_count
;
i
++
)
{
l
=
SubDrawObject
(
sys
,
l
,
list
->
p_values
[
i
].
p_object
,
i_level
,
(
i
==
list
->
i_count
-
1
)
?
"`-"
:
"|-"
);
}
vlc_list_release
(
list
);
return
l
;
}
static
int
DrawObjects
(
intf_thread_t
*
p_
intf
)
static
int
DrawObjects
(
intf_thread_t
*
intf
)
{
return
SubDrawObject
(
p_intf
->
p_sys
,
0
,
VLC_OBJECT
(
p_
intf
->
p_libvlc
),
0
,
""
);
return
SubDrawObject
(
intf
->
p_sys
,
0
,
VLC_OBJECT
(
intf
->
p_libvlc
),
0
,
""
);
}
static
int
DrawMeta
(
intf_thread_t
*
p_
intf
)
static
int
DrawMeta
(
intf_thread_t
*
intf
)
{
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
input_thread_t
*
p_input
=
p_
sys
->
p_input
;
input_item_t
*
p_
item
;
intf_sys_t
*
sys
=
intf
->
p_sys
;
input_thread_t
*
p_input
=
sys
->
p_input
;
input_item_t
*
item
;
int
l
=
0
;
if
(
!
p_input
)
return
0
;
p_item
=
input_GetItem
(
p_input
);
vlc_mutex_lock
(
&
p_item
->
lock
);
for
(
int
i
=
0
;
i
<
VLC_META_TYPE_COUNT
;
i
++
)
{
const
char
*
psz_meta
=
vlc_meta_Get
(
p_item
->
p_meta
,
i
);
if
(
!
psz_meta
||
!*
psz_meta
)
item
=
input_GetItem
(
p_input
);
vlc_mutex_lock
(
&
item
->
lock
);
for
(
int
i
=
0
;
i
<
VLC_META_TYPE_COUNT
;
i
++
)
{
const
char
*
meta
=
vlc_meta_Get
(
item
->
p_meta
,
i
);
if
(
!
meta
||
!*
meta
)
continue
;
if
(
p_sys
->
b_
color
)
color_set
(
C_CATEGORY
,
NULL
);
MainBoxWrite
(
p_
sys
,
l
++
,
" [%s]"
,
vlc_meta_TypeToLocalizedString
(
i
));
if
(
p_sys
->
b_
color
)
color_set
(
C_DEFAULT
,
NULL
);
MainBoxWrite
(
p_sys
,
l
++
,
" %s"
,
psz_
meta
);
if
(
sys
->
color
)
color_set
(
C_CATEGORY
,
NULL
);
MainBoxWrite
(
sys
,
l
++
,
" [%s]"
,
vlc_meta_TypeToLocalizedString
(
i
));
if
(
sys
->
color
)
color_set
(
C_DEFAULT
,
NULL
);
MainBoxWrite
(
sys
,
l
++
,
" %s"
,
meta
);
}
vlc_mutex_unlock
(
&
p_
item
->
lock
);
vlc_mutex_unlock
(
&
item
->
lock
);
return
l
;
}
static
int
DrawInfo
(
intf_thread_t
*
p_
intf
)
static
int
DrawInfo
(
intf_thread_t
*
intf
)
{
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
input_thread_t
*
p_input
=
p_
sys
->
p_input
;
input_item_t
*
p_
item
;
intf_sys_t
*
sys
=
intf
->
p_sys
;
input_thread_t
*
p_input
=
sys
->
p_input
;
input_item_t
*
item
;
int
l
=
0
;
if
(
!
p_input
)
return
0
;
p_item
=
input_GetItem
(
p_input
);
vlc_mutex_lock
(
&
p_item
->
lock
);
for
(
int
i
=
0
;
i
<
p_item
->
i_categories
;
i
++
)
{
info_category_t
*
p_category
=
p_item
->
pp_categories
[
i
];
if
(
p_sys
->
b_color
)
color_set
(
C_CATEGORY
,
NULL
);
MainBoxWrite
(
p_sys
,
l
++
,
_
(
" [%s]"
),
p_category
->
psz_name
);
if
(
p_sys
->
b_color
)
color_set
(
C_DEFAULT
,
NULL
);
for
(
int
j
=
0
;
j
<
p_category
->
i_infos
;
j
++
)
{
item
=
input_GetItem
(
p_input
);
vlc_mutex_lock
(
&
item
->
lock
);
for
(
int
i
=
0
;
i
<
item
->
i_categories
;
i
++
)
{
info_category_t
*
p_category
=
item
->
pp_categories
[
i
];
if
(
sys
->
color
)
color_set
(
C_CATEGORY
,
NULL
);
MainBoxWrite
(
sys
,
l
++
,
_
(
" [%s]"
),
p_category
->
psz_name
);
if
(
sys
->
color
)
color_set
(
C_DEFAULT
,
NULL
);
for
(
int
j
=
0
;
j
<
p_category
->
i_infos
;
j
++
)
{
info_t
*
p_info
=
p_category
->
pp_infos
[
j
];
MainBoxWrite
(
p_
sys
,
l
++
,
_
(
" %s: %s"
),
MainBoxWrite
(
sys
,
l
++
,
_
(
" %s: %s"
),
p_info
->
psz_name
,
p_info
->
psz_value
);
}
}
vlc_mutex_unlock
(
&
p_
item
->
lock
);
vlc_mutex_unlock
(
&
item
->
lock
);
return
l
;
}
static
int
DrawStats
(
intf_thread_t
*
p_
intf
)
static
int
DrawStats
(
intf_thread_t
*
intf
)
{
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
input_thread_t
*
p_input
=
p_
sys
->
p_input
;
input_item_t
*
p_
item
;
intf_sys_t
*
sys
=
intf
->
p_sys
;
input_thread_t
*
p_input
=
sys
->
p_input
;
input_item_t
*
item
;
input_stats_t
*
p_stats
;
int
l
=
0
,
i_audio
=
0
,
i_video
=
0
;
if
(
!
p_input
)
return
0
;
p_
item
=
input_GetItem
(
p_input
);
assert
(
p_
item
);
item
=
input_GetItem
(
p_input
);
assert
(
item
);
vlc_mutex_lock
(
&
p_
item
->
lock
);
p_stats
=
p_
item
->
p_stats
;
vlc_mutex_lock
(
&
item
->
lock
);
p_stats
=
item
->
p_stats
;
vlc_mutex_lock
(
&
p_stats
->
lock
);
for
(
int
i
=
0
;
i
<
p_item
->
i_es
;
i
++
)
{
i_audio
+=
(
p_item
->
es
[
i
]
->
i_cat
==
AUDIO_ES
);
i_video
+=
(
p_item
->
es
[
i
]
->
i_cat
==
VIDEO_ES
);
for
(
int
i
=
0
;
i
<
item
->
i_es
;
i
++
)
{
i_audio
+=
(
item
->
es
[
i
]
->
i_cat
==
AUDIO_ES
);
i_video
+=
(
item
->
es
[
i
]
->
i_cat
==
VIDEO_ES
);
}
/* Input */
if
(
p_sys
->
b_
color
)
color_set
(
C_CATEGORY
,
NULL
);
MainBoxWrite
(
p_
sys
,
l
++
,
_
(
" [Incoming]"
));
if
(
p_sys
->
b_
color
)
color_set
(
C_DEFAULT
,
NULL
);
MainBoxWrite
(
p_
sys
,
l
++
,
_
(
" input bytes read : %8.0f KiB"
),
if
(
sys
->
color
)
color_set
(
C_CATEGORY
,
NULL
);
MainBoxWrite
(
sys
,
l
++
,
_
(
" [Incoming]"
));
if
(
sys
->
color
)
color_set
(
C_DEFAULT
,
NULL
);
MainBoxWrite
(
sys
,
l
++
,
_
(
" input bytes read : %8.0f KiB"
),
(
float
)(
p_stats
->
i_read_bytes
)
/
1024
);
MainBoxWrite
(
p_
sys
,
l
++
,
_
(
" input bitrate : %6.0f kb/s"
),
MainBoxWrite
(
sys
,
l
++
,
_
(
" input bitrate : %6.0f kb/s"
),
p_stats
->
f_input_bitrate
*
8000
);
MainBoxWrite
(
p_
sys
,
l
++
,
_
(
" demux bytes read : %8.0f KiB"
),
MainBoxWrite
(
sys
,
l
++
,
_
(
" demux bytes read : %8.0f KiB"
),
(
float
)(
p_stats
->
i_demux_read_bytes
)
/
1024
);
MainBoxWrite
(
p_
sys
,
l
++
,
_
(
" demux bitrate : %6.0f kb/s"
),
MainBoxWrite
(
sys
,
l
++
,
_
(
" demux bitrate : %6.0f kb/s"
),
p_stats
->
f_demux_bitrate
*
8000
);
/* Video */
if
(
i_video
)
{
if
(
p_sys
->
b_color
)
color_set
(
C_CATEGORY
,
NULL
);
MainBoxWrite
(
p_sys
,
l
++
,
_
(
" [Video Decoding]"
));
if
(
p_sys
->
b_color
)
color_set
(
C_DEFAULT
,
NULL
);
MainBoxWrite
(
p_sys
,
l
++
,
_
(
" video decoded : %"
PRId64
),
if
(
i_video
)
{
if
(
sys
->
color
)
color_set
(
C_CATEGORY
,
NULL
);
MainBoxWrite
(
sys
,
l
++
,
_
(
" [Video Decoding]"
));
if
(
sys
->
color
)
color_set
(
C_DEFAULT
,
NULL
);
MainBoxWrite
(
sys
,
l
++
,
_
(
" video decoded : %"
PRId64
),
p_stats
->
i_decoded_video
);
MainBoxWrite
(
p_
sys
,
l
++
,
_
(
" frames displayed : %"
PRId64
),
MainBoxWrite
(
sys
,
l
++
,
_
(
" frames displayed : %"
PRId64
),
p_stats
->
i_displayed_pictures
);
MainBoxWrite
(
p_
sys
,
l
++
,
_
(
" frames lost : %"
PRId64
),
MainBoxWrite
(
sys
,
l
++
,
_
(
" frames lost : %"
PRId64
),
p_stats
->
i_lost_pictures
);
}
/* Audio*/
if
(
i_audio
)
{
if
(
p_sys
->
b_color
)
color_set
(
C_CATEGORY
,
NULL
);
MainBoxWrite
(
p_sys
,
l
++
,
_
(
" [Audio Decoding]"
));
if
(
p_sys
->
b_color
)
color_set
(
C_DEFAULT
,
NULL
);
MainBoxWrite
(
p_sys
,
l
++
,
_
(
" audio decoded : %"
PRId64
),
if
(
i_audio
)
{
if
(
sys
->
color
)
color_set
(
C_CATEGORY
,
NULL
);
MainBoxWrite
(
sys
,
l
++
,
_
(
" [Audio Decoding]"
));
if
(
sys
->
color
)
color_set
(
C_DEFAULT
,
NULL
);
MainBoxWrite
(
sys
,
l
++
,
_
(
" audio decoded : %"
PRId64
),
p_stats
->
i_decoded_audio
);
MainBoxWrite
(
p_
sys
,
l
++
,
_
(
" buffers played : %"
PRId64
),
MainBoxWrite
(
sys
,
l
++
,
_
(
" buffers played : %"
PRId64
),
p_stats
->
i_played_abuffers
);
MainBoxWrite
(
p_
sys
,
l
++
,
_
(
" buffers lost : %"
PRId64
),
MainBoxWrite
(
sys
,
l
++
,
_
(
" buffers lost : %"
PRId64
),
p_stats
->
i_lost_abuffers
);
}
/* Sout */
if
(
p_sys
->
b_
color
)
color_set
(
C_CATEGORY
,
NULL
);
MainBoxWrite
(
p_
sys
,
l
++
,
_
(
" [Streaming]"
));
if
(
p_sys
->
b_
color
)
color_set
(
C_DEFAULT
,
NULL
);
MainBoxWrite
(
p_
sys
,
l
++
,
_
(
" packets sent : %5i"
),
p_stats
->
i_sent_packets
);
MainBoxWrite
(
p_
sys
,
l
++
,
_
(
" bytes sent : %8.0f KiB"
),
if
(
sys
->
color
)
color_set
(
C_CATEGORY
,
NULL
);
MainBoxWrite
(
sys
,
l
++
,
_
(
" [Streaming]"
));
if
(
sys
->
color
)
color_set
(
C_DEFAULT
,
NULL
);
MainBoxWrite
(
sys
,
l
++
,
_
(
" packets sent : %5i"
),
p_stats
->
i_sent_packets
);
MainBoxWrite
(
sys
,
l
++
,
_
(
" bytes sent : %8.0f KiB"
),
(
float
)(
p_stats
->
i_sent_bytes
)
/
1025
);
MainBoxWrite
(
p_
sys
,
l
++
,
_
(
" sending bitrate : %6.0f kb/s"
),
MainBoxWrite
(
sys
,
l
++
,
_
(
" sending bitrate : %6.0f kb/s"
),
p_stats
->
f_send_bitrate
*
8000
);
if
(
p_sys
->
b_
color
)
color_set
(
C_DEFAULT
,
NULL
);
if
(
sys
->
color
)
color_set
(
C_DEFAULT
,
NULL
);
vlc_mutex_unlock
(
&
p_stats
->
lock
);
vlc_mutex_unlock
(
&
p_
item
->
lock
);
vlc_mutex_unlock
(
&
item
->
lock
);
return
l
;
}
static
int
DrawHelp
(
intf_thread_t
*
p_
intf
)
static
int
DrawHelp
(
intf_thread_t
*
intf
)
{
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
intf_sys_t
*
sys
=
intf
->
p_sys
;
int
l
=
0
;
#define H(a) MainBoxWrite(
p_
sys, l++, a)
#define H(a) MainBoxWrite(sys, l++, a)
if
(
p_sys
->
b_
color
)
color_set
(
C_CATEGORY
,
NULL
);
if
(
sys
->
color
)
color_set
(
C_CATEGORY
,
NULL
);
H
(
_
(
"[Display]"
));
if
(
p_sys
->
b_
color
)
color_set
(
C_DEFAULT
,
NULL
);
if
(
sys
->
color
)
color_set
(
C_DEFAULT
,
NULL
);
H
(
_
(
" h,H Show/Hide help box"
));
H
(
_
(
" i Show/Hide info box"
));
H
(
_
(
" m Show/Hide metadata box"
));
...
...
@@ -942,9 +879,9 @@ static int DrawHelp(intf_thread_t *p_intf)
H
(
_
(
" Ctrl-l Refresh the screen"
));
H
(
""
);
if
(
p_sys
->
b_
color
)
color_set
(
C_CATEGORY
,
NULL
);
if
(
sys
->
color
)
color_set
(
C_CATEGORY
,
NULL
);
H
(
_
(
"[Global]"
));
if
(
p_sys
->
b_
color
)
color_set
(
C_DEFAULT
,
NULL
);
if
(
sys
->
color
)
color_set
(
C_DEFAULT
,
NULL
);
H
(
_
(
" q, Q, Esc Quit"
));
H
(
_
(
" s Stop"
));
H
(
_
(
" <space> Pause/Play"
));
...
...
@@ -963,9 +900,9 @@ static int DrawHelp(intf_thread_t *p_intf)
H
(
_
(
" <start>,<end> Navigate to start/end of box"
));
H
(
""
);
if
(
p_sys
->
b_
color
)
color_set
(
C_CATEGORY
,
NULL
);
if
(
sys
->
color
)
color_set
(
C_CATEGORY
,
NULL
);
H
(
_
(
"[Playlist]"
));
if
(
p_sys
->
b_
color
)
color_set
(
C_DEFAULT
,
NULL
);
if
(
sys
->
color
)
color_set
(
C_DEFAULT
,
NULL
);
H
(
_
(
" r Toggle Random playing"
));
H
(
_
(
" l Toggle Loop Playlist"
));
H
(
_
(
" R Toggle Repeat item"
));
...
...
@@ -979,17 +916,17 @@ static int DrawHelp(intf_thread_t *p_intf)
H
(
_
(
" e Eject (if stopped)"
));
H
(
""
);
if
(
p_sys
->
b_
color
)
color_set
(
C_CATEGORY
,
NULL
);
if
(
sys
->
color
)
color_set
(
C_CATEGORY
,
NULL
);
H
(
_
(
"[Filebrowser]"
));
if
(
p_sys
->
b_
color
)
color_set
(
C_DEFAULT
,
NULL
);
if
(
sys
->
color
)
color_set
(
C_DEFAULT
,
NULL
);
H
(
_
(
" <enter> Add the selected file to the playlist"
));
H
(
_
(
" <space> Add the selected directory to the playlist"
));
H
(
_
(
" . Show/Hide hidden files"
));
H
(
""
);
if
(
p_sys
->
b_
color
)
color_set
(
C_CATEGORY
,
NULL
);
if
(
sys
->
color
)
color_set
(
C_CATEGORY
,
NULL
);
H
(
_
(
"[Player]"
));
if
(
p_sys
->
b_
color
)
color_set
(
C_DEFAULT
,
NULL
);
if
(
sys
->
color
)
color_set
(
C_DEFAULT
,
NULL
);
/* xgettext: You can use ↑ and ↓ characters */
H
(
_
(
" <up>,<down> Seek +/-5%%"
));
...
...
@@ -997,105 +934,98 @@ static int DrawHelp(intf_thread_t *p_intf)
return
l
;
}
static
int
DrawBrowse
(
intf_thread_t
*
p_
intf
)
static
int
DrawBrowse
(
intf_thread_t
*
intf
)
{
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
intf_sys_t
*
sys
=
intf
->
p_sys
;
for
(
int
i
=
0
;
i
<
p_sys
->
i_dir_entries
;
i
++
)
{
struct
dir_entry_t
*
p_dir_entry
=
p_sys
->
pp_dir_entries
[
i
];
char
type
=
p_dir_entry
->
b_file
?
' '
:
'+'
;
for
(
int
i
=
0
;
i
<
sys
->
n_dir_entries
;
i
++
)
{
struct
dir_entry_t
*
dir_entry
=
sys
->
dir_entries
[
i
];
char
type
=
dir_entry
->
file
?
' '
:
'+'
;
if
(
p_sys
->
b_
color
)
color_set
(
p_dir_entry
->
b_
file
?
C_DEFAULT
:
C_FOLDER
,
NULL
);
MainBoxWrite
(
p_sys
,
i
,
" %c %s"
,
type
,
p_dir_entry
->
psz_
path
);
if
(
sys
->
color
)
color_set
(
dir_entry
->
file
?
C_DEFAULT
:
C_FOLDER
,
NULL
);
MainBoxWrite
(
sys
,
i
,
" %c %s"
,
type
,
dir_entry
->
path
);
}
return
p_sys
->
i
_dir_entries
;
return
sys
->
n
_dir_entries
;
}
static
int
DrawPlaylist
(
intf_thread_t
*
p_
intf
)
static
int
DrawPlaylist
(
intf_thread_t
*
intf
)
{
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
playlist_t
*
p_playlist
=
pl_Get
(
p_
intf
);
intf_sys_t
*
sys
=
intf
->
p_sys
;
playlist_t
*
p_playlist
=
pl_Get
(
intf
);
vlc_mutex_lock
(
&
p_sys
->
pl_lock
);
if
(
p_sys
->
b_need_update
)
{
PlaylistRebuild
(
p_intf
);
p_sys
->
b_need_update
=
false
;
vlc_mutex_lock
(
&
sys
->
pl_lock
);
if
(
sys
->
need_update
)
{
PlaylistRebuild
(
intf
);
sys
->
need_update
=
false
;
}
vlc_mutex_unlock
(
&
p_
sys
->
pl_lock
);
vlc_mutex_unlock
(
&
sys
->
pl_lock
);
if
(
p_sys
->
b_
plidx_follow
)
FindIndex
(
p_
sys
,
p_playlist
);
if
(
sys
->
plidx_follow
)
FindIndex
(
sys
,
p_playlist
);
for
(
int
i
=
0
;
i
<
p_sys
->
i_plist_entries
;
i
++
)
{
for
(
int
i
=
0
;
i
<
sys
->
plist_entries
;
i
++
)
{
char
c
;
playlist_item_t
*
p_
current_item
;
playlist_item_t
*
p_item
=
p_sys
->
pp_plist
[
i
]
->
p_
item
;
vlc_mutex_lock
(
&
p_
sys
->
pl_lock
);
playlist_item_t
*
p_node
=
p_sys
->
p_
node
;
vlc_mutex_unlock
(
&
p_
sys
->
pl_lock
);
playlist_item_t
*
current_item
;
playlist_item_t
*
item
=
sys
->
plist
[
i
]
->
item
;
vlc_mutex_lock
(
&
sys
->
pl_lock
);
playlist_item_t
*
node
=
sys
->
node
;
vlc_mutex_unlock
(
&
sys
->
pl_lock
);
PL_LOCK
;
assert
(
p_
item
);
p_
current_item
=
playlist_CurrentPlayingItem
(
p_playlist
);
if
((
p_node
&&
p_item
->
p_input
==
p_
node
->
p_input
)
||
(
!
p_node
&&
p_current_item
&&
p_item
->
p_input
==
p_
current_item
->
p_input
))
assert
(
item
);
current_item
=
playlist_CurrentPlayingItem
(
p_playlist
);
if
((
node
&&
item
->
p_input
==
node
->
p_input
)
||
(
!
node
&&
current_item
&&
item
->
p_input
==
current_item
->
p_input
))
c
=
'*'
;
else
if
(
p_item
==
p_node
||
p_current_item
==
p_
item
)
else
if
(
item
==
node
||
current_item
==
item
)
c
=
'>'
;
else
c
=
' '
;
PL_UNLOCK
;
if
(
p_sys
->
b_
color
)
color_set
(
i
%
3
+
C_PLAYLIST_1
,
NULL
);
MainBoxWrite
(
p_sys
,
i
,
"%c%s"
,
c
,
p_sys
->
pp_plist
[
i
]
->
psz_
display
);
if
(
p_sys
->
b_
color
)
color_set
(
C_DEFAULT
,
NULL
);
if
(
sys
->
color
)
color_set
(
i
%
3
+
C_PLAYLIST_1
,
NULL
);
MainBoxWrite
(
sys
,
i
,
"%c%s"
,
c
,
sys
->
plist
[
i
]
->
display
);
if
(
sys
->
color
)
color_set
(
C_DEFAULT
,
NULL
);
}
return
p_sys
->
i_
plist_entries
;
return
sys
->
plist_entries
;
}
static
int
DrawMessages
(
intf_thread_t
*
p_
intf
)
static
int
DrawMessages
(
intf_thread_t
*
intf
)
{
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
intf_sys_t
*
sys
=
intf
->
p_sys
;
int
l
=
0
;
int
i
;
vlc_mutex_lock
(
&
p_sys
->
msg_lock
);
i
=
p_sys
->
i_msgs
;
for
(;;)
{
msg_item_t
*
msg
=
p_sys
->
msgs
[
i
].
item
;
if
(
msg
)
{
if
(
p_sys
->
b_color
)
color_set
(
p_sys
->
msgs
[
i
].
type
+
C_INFO
,
NULL
);
MainBoxWrite
(
p_sys
,
l
++
,
"[%s] %s"
,
msg
->
psz_module
,
p_sys
->
msgs
[
i
].
msg
);
vlc_mutex_lock
(
&
sys
->
msg_lock
);
int
i
=
sys
->
i_msgs
;
for
(;;)
{
msg_item_t
*
msg
=
sys
->
msgs
[
i
].
item
;
if
(
msg
)
{
if
(
sys
->
color
)
color_set
(
sys
->
msgs
[
i
].
type
+
C_INFO
,
NULL
);
MainBoxWrite
(
sys
,
l
++
,
"[%s] %s"
,
msg
->
psz_module
,
sys
->
msgs
[
i
].
msg
);
}
if
(
++
i
==
sizeof
p_sys
->
msgs
/
sizeof
*
p_
sys
->
msgs
)
if
(
++
i
==
sizeof
sys
->
msgs
/
sizeof
*
sys
->
msgs
)
i
=
0
;
if
(
i
==
p_
sys
->
i_msgs
)
/* did we loop around the ring buffer ? */
if
(
i
==
sys
->
i_msgs
)
/* did we loop around the ring buffer ? */
break
;
}
vlc_mutex_unlock
(
&
p_
sys
->
msg_lock
);
if
(
p_sys
->
b_
color
)
vlc_mutex_unlock
(
&
sys
->
msg_lock
);
if
(
sys
->
color
)
color_set
(
C_DEFAULT
,
NULL
);
return
l
;
}
static
int
DrawStatus
(
intf_thread_t
*
p_
intf
)
static
int
DrawStatus
(
intf_thread_t
*
intf
)
{
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
input_thread_t
*
p_input
=
p_
sys
->
p_input
;
playlist_t
*
p_playlist
=
pl_Get
(
p_
intf
);
intf_sys_t
*
sys
=
intf
->
p_sys
;
input_thread_t
*
p_input
=
sys
->
p_input
;
playlist_t
*
p_playlist
=
pl_Get
(
intf
);
static
const
char
name
[]
=
"VLC media player "
PACKAGE_VERSION
;
const
size_t
name_len
=
sizeof
name
-
1
;
/* without \0 termination */
int
y
=
0
;
...
...
@@ -1108,10 +1038,10 @@ static int DrawStatus(intf_thread_t *p_intf)
padding
=
0
;
attrset
(
A_REVERSE
);
if
(
p_sys
->
b_
color
)
color_set
(
C_TITLE
,
NULL
);
if
(
sys
->
color
)
color_set
(
C_TITLE
,
NULL
);
DrawEmptyLine
(
y
,
0
,
COLS
);
mvnprintw
(
y
++
,
padding
/
2
,
COLS
,
"%s"
,
name
);
if
(
p_sys
->
b_
color
)
color_set
(
C_STATUS
,
NULL
);
if
(
sys
->
color
)
color_set
(
C_STATUS
,
NULL
);
attroff
(
A_REVERSE
);
y
++
;
/* leave a blank line */
...
...
@@ -1120,17 +1050,16 @@ static int DrawStatus(intf_thread_t *p_intf)
random
=
var_GetBool
(
p_playlist
,
"random"
)
?
_
(
"[Random] "
)
:
""
;
loop
=
var_GetBool
(
p_playlist
,
"loop"
)
?
_
(
"[Loop]"
)
:
""
;
if
(
p_input
&&
!
p_input
->
b_dead
)
{
if
(
p_input
&&
!
p_input
->
b_dead
)
{
vlc_value_t
val
;
char
*
p
sz_path
,
*
psz_
uri
;
char
*
p
ath
,
*
uri
;
psz_
uri
=
input_item_GetURI
(
input_GetItem
(
p_input
));
p
sz_path
=
make_path
(
psz_
uri
);
uri
=
input_item_GetURI
(
input_GetItem
(
p_input
));
p
ath
=
make_path
(
uri
);
mvnprintw
(
y
++
,
0
,
COLS
,
_
(
" Source : %s"
),
p
sz_path
?
psz_path
:
psz_
uri
);
free
(
psz_
uri
);
free
(
p
sz_p
ath
);
mvnprintw
(
y
++
,
0
,
COLS
,
_
(
" Source : %s"
),
p
ath
?
path
:
uri
);
free
(
uri
);
free
(
path
);
var_Get
(
p_input
,
"state"
,
&
val
);
switch
(
val
.
i_int
)
...
...
@@ -1167,33 +1096,28 @@ static int DrawStatus(intf_thread_t *p_intf)
mvnprintw
(
y
++
,
0
,
COLS
,
_
(
" Volume : %u%%"
),
i_volume
*
100
/
AOUT_VOLUME_DEFAULT
);
if
(
!
var_Get
(
p_input
,
"title"
,
&
val
))
{
if
(
!
var_Get
(
p_input
,
"title"
,
&
val
))
{
int
i_title_count
=
var_CountChoices
(
p_input
,
"title"
);
if
(
i_title_count
>
0
)
mvnprintw
(
y
++
,
0
,
COLS
,
_
(
" Title : %"
PRId64
"/%d"
),
val
.
i_int
,
i_title_count
);
}
if
(
!
var_Get
(
p_input
,
"chapter"
,
&
val
))
{
if
(
!
var_Get
(
p_input
,
"chapter"
,
&
val
))
{
int
i_chapter_count
=
var_CountChoices
(
p_input
,
"chapter"
);
if
(
i_chapter_count
>
0
)
mvnprintw
(
y
++
,
0
,
COLS
,
_
(
" Chapter : %"
PRId64
"/%d"
),
if
(
i_chapter_count
>
0
)
mvnprintw
(
y
++
,
0
,
COLS
,
_
(
" Chapter : %"
PRId64
"/%d"
),
val
.
i_int
,
i_chapter_count
);
}
}
}
else
{
}
else
{
mvnprintw
(
y
++
,
0
,
COLS
,
_
(
" Source: <no current item> "
));
mvnprintw
(
y
++
,
0
,
COLS
,
" %s%s%s"
,
repeat
,
random
,
loop
);
mvnprintw
(
y
++
,
0
,
COLS
,
_
(
" [ h for help ]"
));
DrawEmptyLine
(
y
++
,
0
,
COLS
);
}
if
(
p_sys
->
b_
color
)
color_set
(
C_DEFAULT
,
NULL
);
DrawBox
(
y
++
,
1
,
p_sys
->
b_
color
,
""
);
/* position slider */
if
(
sys
->
color
)
color_set
(
C_DEFAULT
,
NULL
);
DrawBox
(
y
++
,
1
,
sys
->
color
,
""
);
/* position slider */
DrawEmptyLine
(
y
,
1
,
COLS
-
2
);
if
(
p_input
)
DrawLine
(
y
,
1
,
(
int
)((
COLS
-
2
)
*
var_GetFloat
(
p_input
,
"position"
)));
...
...
@@ -1203,21 +1127,21 @@ static int DrawStatus(intf_thread_t *p_intf)
return
y
;
}
static
void
FillTextBox
(
intf_sys_t
*
p_
sys
)
static
void
FillTextBox
(
intf_sys_t
*
sys
)
{
int
width
=
COLS
-
2
;
const
char
*
title
=
p_sys
->
i_
box_type
==
BOX_OPEN
?
"Open: %s"
:
"Find: %s"
;
char
*
chain
=
p_sys
->
i_box_type
==
BOX_OPEN
?
p_sys
->
psz_
open_chain
:
p_sys
->
psz_old_search
?
p_sys
->
psz_
old_search
:
p_sys
->
psz_
search_chain
;
const
char
*
title
=
sys
->
box_type
==
BOX_OPEN
?
"Open: %s"
:
"Find: %s"
;
char
*
chain
=
sys
->
box_type
==
BOX_OPEN
?
sys
->
open_chain
:
sys
->
old_search
?
sys
->
old_search
:
sys
->
search_chain
;
DrawEmptyLine
(
7
,
1
,
width
);
mvnprintw
(
7
,
1
,
width
,
_
(
title
),
chain
);
}
static
void
FillBox
(
intf_thread_t
*
p_
intf
)
static
void
FillBox
(
intf_thread_t
*
intf
)
{
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
intf_sys_t
*
sys
=
intf
->
p_sys
;
static
int
(
*
const
draw
[])
(
intf_thread_t
*
)
=
{
[
BOX_HELP
]
=
DrawHelp
,
[
BOX_INFO
]
=
DrawInfo
,
...
...
@@ -1231,33 +1155,32 @@ static void FillBox(intf_thread_t *p_intf)
[
BOX_LOG
]
=
DrawMessages
,
};
p_sys
->
i_box_lines_total
=
draw
[
p_sys
->
i_box_type
](
p_
intf
);
sys
->
box_lines_total
=
draw
[
sys
->
box_type
](
intf
);
if
(
p_sys
->
i_box_type
==
BOX_SEARCH
||
p_sys
->
i_
box_type
==
BOX_OPEN
)
FillTextBox
(
p_
sys
);
if
(
sys
->
box_type
==
BOX_SEARCH
||
sys
->
box_type
==
BOX_OPEN
)
FillTextBox
(
sys
);
}
static
void
Redraw
(
intf_thread_t
*
p_
intf
)
static
void
Redraw
(
intf_thread_t
*
intf
)
{
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
int
box
=
p_sys
->
i_
box_type
;
int
y
=
DrawStatus
(
p_
intf
);
intf_sys_t
*
sys
=
intf
->
p_sys
;
int
box
=
sys
->
box_type
;
int
y
=
DrawStatus
(
intf
);
p_sys
->
i_
box_height
=
LINES
-
y
-
2
;
DrawBox
(
y
++
,
p_sys
->
i_box_height
,
p_sys
->
b_
color
,
_
(
box_title
[
box
]));
sys
->
box_height
=
LINES
-
y
-
2
;
DrawBox
(
y
++
,
sys
->
box_height
,
sys
->
color
,
_
(
box_title
[
box
]));
p_sys
->
i_
box_y
=
y
;
sys
->
box_y
=
y
;
if
(
box
!=
BOX_NONE
)
{
FillBox
(
p_intf
);
if
(
p_sys
->
i_box_lines_total
==
0
)
p_sys
->
i_box_start
=
0
;
else
if
(
p_sys
->
i_box_start
>
p_sys
->
i_box_lines_total
-
1
)
p_sys
->
i_box_start
=
p_sys
->
i_box_lines_total
-
1
;
y
+=
__MIN
(
p_sys
->
i_box_lines_total
-
p_sys
->
i_box_start
,
p_sys
->
i_box_height
);
if
(
box
!=
BOX_NONE
)
{
FillBox
(
intf
);
if
(
sys
->
box_lines_total
==
0
)
sys
->
box_start
=
0
;
else
if
(
sys
->
box_start
>
sys
->
box_lines_total
-
1
)
sys
->
box_start
=
sys
->
box_lines_total
-
1
;
y
+=
__MIN
(
sys
->
box_lines_total
-
sys
->
box_start
,
sys
->
box_height
);
}
while
(
y
<
LINES
-
1
)
...
...
@@ -1266,10 +1189,10 @@ static void Redraw(intf_thread_t *p_intf)
refresh
();
}
static
void
ChangePosition
(
intf_thread_t
*
p_
intf
,
float
increment
)
static
void
ChangePosition
(
intf_thread_t
*
intf
,
float
increment
)
{
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
input_thread_t
*
p_input
=
p_
sys
->
p_input
;
intf_sys_t
*
sys
=
intf
->
p_sys
;
input_thread_t
*
p_input
=
sys
->
p_input
;
float
pos
;
if
(
!
p_input
||
var_GetInteger
(
p_input
,
"state"
)
!=
PLAYING_S
)
...
...
@@ -1290,7 +1213,7 @@ static inline void RemoveLastUTF8Entity(char *psz, int len)
psz
[
len
]
=
'\0'
;
}
static
char
*
GetDiscDevice
(
intf_thread_t
*
p_
intf
,
const
char
*
name
)
static
char
*
GetDiscDevice
(
intf_thread_t
*
intf
,
const
char
*
name
)
{
static
const
struct
{
const
char
*
s
;
size_t
n
;
const
char
*
v
;
}
devs
[]
=
{
...
...
@@ -1300,19 +1223,14 @@ static char *GetDiscDevice(intf_thread_t *p_intf, const char *name)
};
char
*
device
;
for
(
unsigned
i
=
0
;
i
<
sizeof
devs
/
sizeof
*
devs
;
i
++
)
{
for
(
unsigned
i
=
0
;
i
<
sizeof
devs
/
sizeof
*
devs
;
i
++
)
{
size_t
n
=
devs
[
i
].
n
;
if
(
!
strncmp
(
name
,
devs
[
i
].
s
,
n
))
switch
(
name
[
n
])
{
case
'\0'
:
case
'@'
:
return
config_GetPsz
(
p_intf
,
devs
[
i
].
v
);
default:
/* Omit the beginning MRL-selector characters */
return
strdup
(
name
+
n
);
}
if
(
!
strncmp
(
name
,
devs
[
i
].
s
,
n
))
{
if
(
name
[
n
]
==
'@'
||
name
[
n
]
==
'\0'
)
return
config_GetPsz
(
intf
,
devs
[
i
].
v
);
/* Omit the beginning MRL-selector characters */
return
strdup
(
name
+
n
);
}
}
device
=
strdup
(
name
);
...
...
@@ -1323,60 +1241,56 @@ static char *GetDiscDevice(intf_thread_t *p_intf, const char *name)
return
device
;
}
static
void
Eject
(
intf_thread_t
*
p_
intf
)
static
void
Eject
(
intf_thread_t
*
intf
)
{
char
*
psz_device
,
*
psz_
name
;
playlist_t
*
p_playlist
=
pl_Get
(
p_
intf
);
char
*
device
,
*
name
;
playlist_t
*
p_playlist
=
pl_Get
(
intf
);
/* If there's a stream playing, we aren't allowed to eject ! */
if
(
p_
intf
->
p_sys
->
p_input
)
if
(
intf
->
p_sys
->
p_input
)
return
;
PL_LOCK
;
if
(
!
playlist_CurrentPlayingItem
(
p_playlist
))
{
if
(
!
playlist_CurrentPlayingItem
(
p_playlist
))
{
PL_UNLOCK
;
return
;
}
psz_
name
=
playlist_CurrentPlayingItem
(
p_playlist
)
->
p_input
->
psz_name
;
psz_device
=
psz_name
?
GetDiscDevice
(
p_intf
,
psz_
name
)
:
NULL
;
name
=
playlist_CurrentPlayingItem
(
p_playlist
)
->
p_input
->
psz_name
;
device
=
name
?
GetDiscDevice
(
intf
,
name
)
:
NULL
;
PL_UNLOCK
;
if
(
psz_device
)
{
intf_Eject
(
p_intf
,
psz_device
);
free
(
psz_device
);
if
(
device
)
{
intf_Eject
(
intf
,
device
);
free
(
device
);
}
}
static
void
PlayPause
(
intf_thread_t
*
p_
intf
)
static
void
PlayPause
(
intf_thread_t
*
intf
)
{
input_thread_t
*
p_input
=
p_
intf
->
p_sys
->
p_input
;
input_thread_t
*
p_input
=
intf
->
p_sys
->
p_input
;
if
(
p_input
)
{
if
(
p_input
)
{
int64_t
state
=
var_GetInteger
(
p_input
,
"state"
);
state
=
(
state
!=
PLAYING_S
)
?
PLAYING_S
:
PAUSE_S
;
var_SetInteger
(
p_input
,
"state"
,
state
);
}
else
playlist_Play
(
pl_Get
(
p_intf
));
}
else
playlist_Play
(
pl_Get
(
intf
));
}
static
inline
void
BoxSwitch
(
intf_sys_t
*
p_
sys
,
int
box
)
static
inline
void
BoxSwitch
(
intf_sys_t
*
sys
,
int
box
)
{
p_sys
->
i_box_type
=
(
p_sys
->
i_
box_type
==
box
)
?
BOX_NONE
:
box
;
p_sys
->
i_
box_start
=
0
;
p_sys
->
i_
box_idx
=
0
;
sys
->
box_type
=
(
sys
->
box_type
==
box
)
?
BOX_NONE
:
box
;
sys
->
box_start
=
0
;
sys
->
box_idx
=
0
;
}
static
bool
HandlePlaylistKey
(
intf_thread_t
*
p_
intf
,
int
key
)
static
bool
HandlePlaylistKey
(
intf_thread_t
*
intf
,
int
key
)
{
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
playlist_t
*
p_playlist
=
pl_Get
(
p_
intf
);
intf_sys_t
*
sys
=
intf
->
p_sys
;
playlist_t
*
p_playlist
=
pl_Get
(
intf
);
struct
pl_item_t
*
p_pl_item
;
switch
(
key
)
...
...
@@ -1392,13 +1306,13 @@ static bool HandlePlaylistKey(intf_thread_t *p_intf, int key)
playlist_RecursiveNodeSort
(
p_playlist
,
p_playlist
->
p_root_onelevel
,
SORT_TITLE_NODES_FIRST
,
(
key
==
'o'
)
?
ORDER_NORMAL
:
ORDER_REVERSE
);
vlc_mutex_lock
(
&
p_
sys
->
pl_lock
);
p_sys
->
b_
need_update
=
true
;
vlc_mutex_unlock
(
&
p_
sys
->
pl_lock
);
vlc_mutex_lock
(
&
sys
->
pl_lock
);
sys
->
need_update
=
true
;
vlc_mutex_unlock
(
&
sys
->
pl_lock
);
return
true
;
case
'g'
:
FindIndex
(
p_
sys
,
p_playlist
);
FindIndex
(
sys
,
p_playlist
);
return
true
;
/* Deletion */
...
...
@@ -1407,112 +1321,104 @@ static bool HandlePlaylistKey(intf_thread_t *p_intf, int key)
case
0x7f
:
case
KEY_DC
:
{
playlist_item_t
*
p_
item
;
playlist_item_t
*
item
;
PL_LOCK
;
p_item
=
p_sys
->
pp_plist
[
p_sys
->
i_box_idx
]
->
p_
item
;
if
(
p_
item
->
i_children
==
-
1
)
playlist_DeleteFromInput
(
p_playlist
,
p_
item
->
p_input
,
pl_Locked
);
item
=
sys
->
plist
[
sys
->
box_idx
]
->
item
;
if
(
item
->
i_children
==
-
1
)
playlist_DeleteFromInput
(
p_playlist
,
item
->
p_input
,
pl_Locked
);
else
playlist_NodeDelete
(
p_playlist
,
p_
item
,
true
,
false
);
playlist_NodeDelete
(
p_playlist
,
item
,
true
,
false
);
PL_UNLOCK
;
vlc_mutex_lock
(
&
p_
sys
->
pl_lock
);
p_sys
->
b_
need_update
=
true
;
vlc_mutex_unlock
(
&
p_
sys
->
pl_lock
);
vlc_mutex_lock
(
&
sys
->
pl_lock
);
sys
->
need_update
=
true
;
vlc_mutex_unlock
(
&
sys
->
pl_lock
);
return
true
;
}
case
KEY_ENTER
:
case
'\r'
:
case
'\n'
:
if
(
!
(
p_pl_item
=
p_sys
->
pp_plist
[
p_sys
->
i_
box_idx
]))
if
(
!
(
p_pl_item
=
sys
->
plist
[
sys
->
box_idx
]))
return
false
;
if
(
p_pl_item
->
p_item
->
i_children
)
{
playlist_item_t
*
p_item
,
*
p_parent
=
p_pl_item
->
p_item
;
if
(
p_parent
->
i_children
==
-
1
)
{
p_item
=
p_parent
;
if
(
p_pl_item
->
item
->
i_children
)
{
playlist_item_t
*
item
,
*
p_parent
=
p_pl_item
->
item
;
if
(
p_parent
->
i_children
==
-
1
)
{
item
=
p_parent
;
while
(
p_parent
->
p_parent
)
p_parent
=
p_parent
->
p_parent
;
}
else
{
vlc_mutex_lock
(
&
p_sys
->
pl_lock
);
p_sys
->
p_node
=
p_parent
;
vlc_mutex_unlock
(
&
p_sys
->
pl_lock
);
p_item
=
NULL
;
}
else
{
vlc_mutex_lock
(
&
sys
->
pl_lock
);
sys
->
node
=
p_parent
;
vlc_mutex_unlock
(
&
sys
->
pl_lock
);
item
=
NULL
;
}
playlist_Control
(
p_playlist
,
PLAYLIST_VIEWPLAY
,
pl_Unlocked
,
p_parent
,
p_item
);
}
else
{
/* We only want to set the current node */
p_parent
,
item
);
}
else
{
/* We only want to set the current node */
playlist_Stop
(
p_playlist
);
vlc_mutex_lock
(
&
p_
sys
->
pl_lock
);
p_sys
->
p_node
=
p_pl_item
->
p_
item
;
vlc_mutex_unlock
(
&
p_
sys
->
pl_lock
);
vlc_mutex_lock
(
&
sys
->
pl_lock
);
sys
->
node
=
p_pl_item
->
item
;
vlc_mutex_unlock
(
&
sys
->
pl_lock
);
}
p_sys
->
b_
plidx_follow
=
true
;
sys
->
plidx_follow
=
true
;
return
true
;
}
return
false
;
}
static
bool
HandleBrowseKey
(
intf_thread_t
*
p_
intf
,
int
key
)
static
bool
HandleBrowseKey
(
intf_thread_t
*
intf
,
int
key
)
{
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
intf_sys_t
*
sys
=
intf
->
p_sys
;
struct
dir_entry_t
*
dir_entry
;
switch
(
key
)
{
case
'.'
:
p_sys
->
b_show_hidden_files
=
!
p_sys
->
b_
show_hidden_files
;
ReadDir
(
p_
intf
);
sys
->
show_hidden_files
=
!
sys
->
show_hidden_files
;
ReadDir
(
intf
);
return
true
;
case
KEY_ENTER
:
case
'\r'
:
case
'\n'
:
case
' '
:
dir_entry
=
p_sys
->
pp_dir_entries
[
p_sys
->
i_
box_idx
];
char
*
p
sz_p
ath
;
if
(
asprintf
(
&
p
sz_path
,
"%s"
DIR_SEP
"%s"
,
p_sys
->
psz_
current_dir
,
dir_entry
->
p
sz_p
ath
)
==
-
1
)
dir_entry
=
sys
->
dir_entries
[
sys
->
box_idx
];
char
*
path
;
if
(
asprintf
(
&
p
ath
,
"%s"
DIR_SEP
"%s"
,
sys
->
current_dir
,
dir_entry
->
path
)
==
-
1
)
return
true
;
if
(
!
dir_entry
->
b_file
&&
key
!=
' '
)
{
free
(
p_sys
->
psz_current_dir
);
p_sys
->
psz_current_dir
=
psz_path
;
ReadDir
(
p_intf
);
if
(
!
dir_entry
->
file
&&
key
!=
' '
)
{
free
(
sys
->
current_dir
);
sys
->
current_dir
=
path
;
ReadDir
(
intf
);
p_sys
->
i_
box_start
=
0
;
p_sys
->
i_
box_idx
=
0
;
sys
->
box_start
=
0
;
sys
->
box_idx
=
0
;
return
true
;
}
char
*
psz_uri
=
make_URI
(
psz_path
,
dir_entry
->
b_
file
?
"file"
char
*
uri
=
make_URI
(
path
,
dir_entry
->
file
?
"file"
:
"directory"
);
free
(
p
sz_p
ath
);
if
(
psz_
uri
==
NULL
)
free
(
path
);
if
(
uri
==
NULL
)
return
true
;
playlist_t
*
p_playlist
=
pl_Get
(
p_intf
);
vlc_mutex_lock
(
&
p_sys
->
pl_lock
);
playlist_item_t
*
p_parent
=
p_sys
->
p_node
;
vlc_mutex_unlock
(
&
p_sys
->
pl_lock
);
if
(
!
p_parent
)
{
playlist_item_t
*
p_item
;
playlist_t
*
p_playlist
=
pl_Get
(
intf
);
vlc_mutex_lock
(
&
sys
->
pl_lock
);
playlist_item_t
*
p_parent
=
sys
->
node
;
vlc_mutex_unlock
(
&
sys
->
pl_lock
);
if
(
!
p_parent
)
{
playlist_item_t
*
item
;
PL_LOCK
;
p_
item
=
playlist_CurrentPlayingItem
(
p_playlist
);
p_parent
=
p_item
?
p_
item
->
p_parent
:
NULL
;
item
=
playlist_CurrentPlayingItem
(
p_playlist
);
p_parent
=
item
?
item
->
p_parent
:
NULL
;
PL_UNLOCK
;
if
(
!
p_parent
)
p_parent
=
p_playlist
->
p_local_onelevel
;
...
...
@@ -1522,22 +1428,22 @@ static bool HandleBrowseKey(intf_thread_t *p_intf, int key)
p_parent
=
p_parent
->
p_parent
;
input_item_t
*
p_input
=
p_playlist
->
p_local_onelevel
->
p_input
;
playlist_Add
(
p_playlist
,
psz_
uri
,
NULL
,
PLAYLIST_APPEND
,
playlist_Add
(
p_playlist
,
uri
,
NULL
,
PLAYLIST_APPEND
,
PLAYLIST_END
,
p_parent
->
p_input
==
p_input
,
false
);
BoxSwitch
(
p_
sys
,
BOX_PLAYLIST
);
free
(
psz_
uri
);
BoxSwitch
(
sys
,
BOX_PLAYLIST
);
free
(
uri
);
return
true
;
}
return
false
;
}
static
void
HandleEditBoxKey
(
intf_thread_t
*
p_
intf
,
int
key
,
int
box
)
static
void
HandleEditBoxKey
(
intf_thread_t
*
intf
,
int
key
,
int
box
)
{
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
intf_sys_t
*
sys
=
intf
->
p_sys
;
bool
search
=
box
==
BOX_SEARCH
;
char
*
str
=
search
?
p_sys
->
psz_search_chain
:
p_sys
->
psz_
open_chain
;
char
*
str
=
search
?
sys
->
search_chain
:
sys
->
open_chain
;
size_t
len
=
strlen
(
str
);
assert
(
box
==
BOX_SEARCH
||
box
==
BOX_OPEN
);
...
...
@@ -1550,32 +1456,28 @@ static void HandleEditBoxKey(intf_thread_t *p_intf, int key, int box)
case
KEY_ENTER
:
case
'\r'
:
case
'\n'
:
if
(
search
)
{
if
(
search
)
{
if
(
len
)
p_sys
->
psz_old_search
=
strdup
(
p_sys
->
psz_search_chain
);
else
if
(
p_sys
->
psz_old_search
)
SearchPlaylist
(
p_sys
,
p_sys
->
psz_old_search
);
}
else
if
(
len
)
{
char
*
psz_uri
=
make_URI
(
p_sys
->
psz_open_chain
,
NULL
);
if
(
psz_uri
==
NULL
)
{
p_sys
->
i_box_type
=
BOX_PLAYLIST
;
sys
->
old_search
=
strdup
(
sys
->
search_chain
);
else
if
(
sys
->
old_search
)
SearchPlaylist
(
sys
,
sys
->
old_search
);
}
else
if
(
len
)
{
char
*
uri
=
make_URI
(
sys
->
open_chain
,
NULL
);
if
(
uri
==
NULL
)
{
sys
->
box_type
=
BOX_PLAYLIST
;
return
;
}
playlist_t
*
p_playlist
=
pl_Get
(
p_
intf
);
vlc_mutex_lock
(
&
p_
sys
->
pl_lock
);
playlist_item_t
*
p_parent
=
p_sys
->
p_node
,
*
p_current
;
vlc_mutex_unlock
(
&
p_
sys
->
pl_lock
);
playlist_t
*
p_playlist
=
pl_Get
(
intf
);
vlc_mutex_lock
(
&
sys
->
pl_lock
);
playlist_item_t
*
p_parent
=
sys
->
node
;
vlc_mutex_unlock
(
&
sys
->
pl_lock
);
PL_LOCK
;
if
(
!
p_parent
)
{
p_current
=
playlist_CurrentPlayingItem
(
p_playlist
);
p_parent
=
p_current
?
p_
current
->
p_parent
:
NULL
;
if
(
!
p_parent
)
{
playlist_item_t
*
current
;
current
=
playlist_CurrentPlayingItem
(
p_playlist
);
p_parent
=
current
?
current
->
p_parent
:
NULL
;
if
(
!
p_parent
)
p_parent
=
p_playlist
->
p_local_onelevel
;
}
...
...
@@ -1584,15 +1486,15 @@ static void HandleEditBoxKey(intf_thread_t *p_intf, int key, int box)
p_parent
=
p_parent
->
p_parent
;
PL_UNLOCK
;
playlist_Add
(
p_playlist
,
psz_
uri
,
NULL
,
playlist_Add
(
p_playlist
,
uri
,
NULL
,
PLAYLIST_APPEND
|
PLAYLIST_GO
,
PLAYLIST_END
,
p_parent
->
p_input
==
p_playlist
->
p_local_onelevel
->
p_input
,
false
);
free
(
psz_
uri
);
p_sys
->
b_
plidx_follow
=
true
;
free
(
uri
);
sys
->
plidx_follow
=
true
;
}
p_sys
->
i_
box_type
=
BOX_PLAYLIST
;
sys
->
box_type
=
BOX_PLAYLIST
;
return
;
case
0x1b
:
/* ESC */
...
...
@@ -1613,8 +1515,8 @@ static void HandleEditBoxKey(intf_thread_t *p_intf, int key, int box)
if
(
getch
()
!=
ERR
)
return
;
if
(
search
)
p_sys
->
i_box_idx
=
p_sys
->
i_
before_search
;
p_sys
->
i_
box_type
=
BOX_PLAYLIST
;
if
(
search
)
sys
->
box_idx
=
sys
->
before_search
;
sys
->
box_type
=
BOX_PLAYLIST
;
return
;
case
KEY_BACKSPACE
:
...
...
@@ -1623,19 +1525,17 @@ static void HandleEditBoxKey(intf_thread_t *p_intf, int key, int box)
break
;
default:
if
(
len
+
1
<
(
search
?
sizeof
p_sys
->
psz_search_chain
:
sizeof
p_sys
->
psz_open_chain
))
{
str
[
len
+
0
]
=
(
char
)
key
;
if
(
len
+
1
<
(
search
?
sizeof
sys
->
search_chain
:
sizeof
sys
->
open_chain
))
{
str
[
len
+
0
]
=
key
;
str
[
len
+
1
]
=
'\0'
;
}
}
if
(
search
)
{
free
(
p_sys
->
psz_old_search
);
p_sys
->
psz_old_search
=
NULL
;
SearchPlaylist
(
p_sys
,
str
);
if
(
search
)
{
free
(
sys
->
old_search
);
sys
->
old_search
=
NULL
;
SearchPlaylist
(
sys
,
str
);
}
}
...
...
@@ -1645,10 +1545,10 @@ static void InputNavigate(input_thread_t* p_input, const char *var)
var_TriggerCallback
(
p_input
,
var
);
}
static
void
HandleCommonKey
(
intf_thread_t
*
p_
intf
,
int
key
)
static
void
HandleCommonKey
(
intf_thread_t
*
intf
,
int
key
)
{
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
playlist_t
*
p_playlist
=
pl_Get
(
p_
intf
);
intf_sys_t
*
sys
=
intf
->
p_sys
;
playlist_t
*
p_playlist
=
pl_Get
(
intf
);
switch
(
key
)
{
case
0x1b
:
/* ESC */
...
...
@@ -1658,54 +1558,49 @@ static void HandleCommonKey(intf_thread_t *p_intf, int key)
case
'q'
:
case
'Q'
:
case
KEY_EXIT
:
libvlc_Quit
(
p_
intf
->
p_libvlc
);
p_sys
->
b_
exit
=
true
;
// terminate the main loop
libvlc_Quit
(
intf
->
p_libvlc
);
sys
->
exit
=
true
;
// terminate the main loop
return
;
case
'h'
:
case
'H'
:
BoxSwitch
(
p_
sys
,
BOX_HELP
);
return
;
case
'i'
:
BoxSwitch
(
p_
sys
,
BOX_INFO
);
return
;
case
'm'
:
BoxSwitch
(
p_
sys
,
BOX_META
);
return
;
case
'L'
:
BoxSwitch
(
p_
sys
,
BOX_LOG
);
return
;
case
'P'
:
BoxSwitch
(
p_
sys
,
BOX_PLAYLIST
);
return
;
case
'B'
:
BoxSwitch
(
p_
sys
,
BOX_BROWSE
);
return
;
case
'x'
:
BoxSwitch
(
p_
sys
,
BOX_OBJECTS
);
return
;
case
'S'
:
BoxSwitch
(
p_
sys
,
BOX_STATS
);
return
;
case
'H'
:
BoxSwitch
(
sys
,
BOX_HELP
);
return
;
case
'i'
:
BoxSwitch
(
sys
,
BOX_INFO
);
return
;
case
'm'
:
BoxSwitch
(
sys
,
BOX_META
);
return
;
case
'L'
:
BoxSwitch
(
sys
,
BOX_LOG
);
return
;
case
'P'
:
BoxSwitch
(
sys
,
BOX_PLAYLIST
);
return
;
case
'B'
:
BoxSwitch
(
sys
,
BOX_BROWSE
);
return
;
case
'x'
:
BoxSwitch
(
sys
,
BOX_OBJECTS
);
return
;
case
'S'
:
BoxSwitch
(
sys
,
BOX_STATS
);
return
;
case
'/'
:
/* Search */
p_sys
->
psz_search_chain
[
0
]
=
'\0'
;
p_sys
->
b_plidx_follow
=
false
;
if
(
p_sys
->
i_box_type
==
BOX_PLAYLIST
)
{
p_sys
->
i_before_search
=
p_sys
->
i_box_idx
;
p_sys
->
i_box_type
=
BOX_SEARCH
;
}
else
{
p_sys
->
i_before_search
=
0
;
BoxSwitch
(
p_sys
,
BOX_SEARCH
);
sys
->
search_chain
[
0
]
=
'\0'
;
sys
->
plidx_follow
=
false
;
if
(
sys
->
box_type
==
BOX_PLAYLIST
)
{
sys
->
before_search
=
sys
->
box_idx
;
sys
->
box_type
=
BOX_SEARCH
;
}
else
{
sys
->
before_search
=
0
;
BoxSwitch
(
sys
,
BOX_SEARCH
);
}
return
;
case
'A'
:
/* Open */
p_sys
->
psz_
open_chain
[
0
]
=
'\0'
;
if
(
p_sys
->
i_
box_type
==
BOX_PLAYLIST
)
p_sys
->
i_
box_type
=
BOX_OPEN
;
sys
->
open_chain
[
0
]
=
'\0'
;
if
(
sys
->
box_type
==
BOX_PLAYLIST
)
sys
->
box_type
=
BOX_OPEN
;
else
BoxSwitch
(
p_
sys
,
BOX_OPEN
);
BoxSwitch
(
sys
,
BOX_OPEN
);
return
;
/* Navigation */
case
KEY_RIGHT
:
ChangePosition
(
p_
intf
,
+
0
.
01
);
return
;
case
KEY_LEFT
:
ChangePosition
(
p_
intf
,
-
0
.
01
);
return
;
case
KEY_RIGHT
:
ChangePosition
(
intf
,
+
0
.
01
);
return
;
case
KEY_LEFT
:
ChangePosition
(
intf
,
-
0
.
01
);
return
;
/* Common control */
case
'f'
:
if
(
p_sys
->
p_input
)
{
vout_thread_t
*
p_vout
=
input_GetVout
(
p_sys
->
p_input
);
if
(
p_vout
)
{
if
(
sys
->
p_input
)
{
vout_thread_t
*
p_vout
=
input_GetVout
(
sys
->
p_input
);
if
(
p_vout
)
{
bool
fs
=
var_ToggleBool
(
p_playlist
,
"fullscreen"
);
var_SetBool
(
p_vout
,
"fullscreen"
,
fs
);
vlc_object_release
(
p_vout
);
...
...
@@ -1713,14 +1608,14 @@ static void HandleCommonKey(intf_thread_t *p_intf, int key)
}
return
;
case
' '
:
PlayPause
(
p_
intf
);
return
;
case
' '
:
PlayPause
(
intf
);
return
;
case
's'
:
playlist_Stop
(
p_playlist
);
return
;
case
'e'
:
Eject
(
p_
intf
);
return
;
case
'e'
:
Eject
(
intf
);
return
;
case
'['
:
InputNavigate
(
p_
sys
->
p_input
,
"prev-title"
);
return
;
case
']'
:
InputNavigate
(
p_
sys
->
p_input
,
"next-title"
);
return
;
case
'<'
:
InputNavigate
(
p_
sys
->
p_input
,
"prev-chapter"
);
return
;
case
'>'
:
InputNavigate
(
p_
sys
->
p_input
,
"next-chapter"
);
return
;
case
'['
:
InputNavigate
(
sys
->
p_input
,
"prev-title"
);
return
;
case
']'
:
InputNavigate
(
sys
->
p_input
,
"next-title"
);
return
;
case
'<'
:
InputNavigate
(
sys
->
p_input
,
"prev-chapter"
);
return
;
case
'>'
:
InputNavigate
(
sys
->
p_input
,
"next-chapter"
);
return
;
case
'p'
:
playlist_Prev
(
p_playlist
);
break
;
case
'n'
:
playlist_Next
(
p_playlist
);
break
;
...
...
@@ -1739,10 +1634,10 @@ static void HandleCommonKey(intf_thread_t *p_intf, int key)
return
;
}
static
bool
HandleListKey
(
intf_thread_t
*
p_
intf
,
int
key
)
static
bool
HandleListKey
(
intf_thread_t
*
intf
,
int
key
)
{
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
playlist_t
*
p_playlist
=
pl_Get
(
p_
intf
);
intf_sys_t
*
sys
=
intf
->
p_sys
;
playlist_t
*
p_playlist
=
pl_Get
(
intf
);
switch
(
key
)
{
...
...
@@ -1751,40 +1646,38 @@ static bool HandleListKey(intf_thread_t *p_intf, int key)
* see http://www.nabble.com/curses-vs.-xterm-key-mismatch-t3574377.html */
case
KEY_SELECT
:
#endif
case
KEY_END
:
p_sys
->
i_box_idx
=
p_sys
->
i_
box_lines_total
-
1
;
break
;
case
KEY_HOME
:
p_sys
->
i_
box_idx
=
0
;
break
;
case
KEY_UP
:
p_sys
->
i_
box_idx
--
;
break
;
case
KEY_DOWN
:
p_sys
->
i_
box_idx
++
;
break
;
case
KEY_PPAGE
:
p_sys
->
i_box_idx
-=
p_sys
->
i_
box_height
;
break
;
case
KEY_NPAGE
:
p_sys
->
i_box_idx
+=
p_sys
->
i_
box_height
;
break
;
case
KEY_END
:
sys
->
box_idx
=
sys
->
box_lines_total
-
1
;
break
;
case
KEY_HOME
:
sys
->
box_idx
=
0
;
break
;
case
KEY_UP
:
sys
->
box_idx
--
;
break
;
case
KEY_DOWN
:
sys
->
box_idx
++
;
break
;
case
KEY_PPAGE
:
sys
->
box_idx
-=
sys
->
box_height
;
break
;
case
KEY_NPAGE
:
sys
->
box_idx
+=
sys
->
box_height
;
break
;
default:
return
false
;
}
CheckIdx
(
p_
sys
);
CheckIdx
(
sys
);
if
(
p_sys
->
i_box_type
==
BOX_PLAYLIST
)
{
if
(
sys
->
box_type
==
BOX_PLAYLIST
)
{
PL_LOCK
;
p_sys
->
b_plidx_follow
=
IsIndex
(
p_sys
,
p_playlist
,
p_sys
->
i_
box_idx
);
sys
->
plidx_follow
=
IsIndex
(
sys
,
p_playlist
,
sys
->
box_idx
);
PL_UNLOCK
;
}
return
true
;
}
static
void
HandleKey
(
intf_thread_t
*
p_
intf
)
static
void
HandleKey
(
intf_thread_t
*
intf
)
{
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
intf_sys_t
*
sys
=
intf
->
p_sys
;
int
key
=
getch
();
int
box
=
p_sys
->
i_
box_type
;
int
box
=
sys
->
box_type
;
if
(
key
==
-
1
)
return
;
if
(
box
==
BOX_SEARCH
||
box
==
BOX_OPEN
)
{
HandleEditBoxKey
(
p_intf
,
key
,
p_sys
->
i_box_type
);
if
(
box
==
BOX_SEARCH
||
box
==
BOX_OPEN
)
{
HandleEditBoxKey
(
intf
,
key
,
sys
->
box_type
);
return
;
}
...
...
@@ -1794,23 +1687,23 @@ static void HandleKey(intf_thread_t *p_intf)
#ifdef __FreeBSD__
case
KEY_SELECT
:
#endif
case
KEY_END
:
ChangePosition
(
p_
intf
,
+
.
99
);
return
;
case
KEY_HOME
:
ChangePosition
(
p_
intf
,
-
1
.
0
);
return
;
case
KEY_UP
:
ChangePosition
(
p_
intf
,
+
0
.
05
);
return
;
case
KEY_DOWN
:
ChangePosition
(
p_
intf
,
-
0
.
05
);
return
;
default:
HandleCommonKey
(
p_
intf
,
key
);
return
;
case
KEY_END
:
ChangePosition
(
intf
,
+
.
99
);
return
;
case
KEY_HOME
:
ChangePosition
(
intf
,
-
1
.
0
);
return
;
case
KEY_UP
:
ChangePosition
(
intf
,
+
0
.
05
);
return
;
case
KEY_DOWN
:
ChangePosition
(
intf
,
-
0
.
05
);
return
;
default:
HandleCommonKey
(
intf
,
key
);
return
;
}
if
(
box
==
BOX_BROWSE
&&
HandleBrowseKey
(
p_
intf
,
key
))
if
(
box
==
BOX_BROWSE
&&
HandleBrowseKey
(
intf
,
key
))
return
;
if
(
box
==
BOX_PLAYLIST
&&
HandlePlaylistKey
(
p_
intf
,
key
))
if
(
box
==
BOX_PLAYLIST
&&
HandlePlaylistKey
(
intf
,
key
))
return
;
if
(
HandleListKey
(
p_
intf
,
key
))
if
(
HandleListKey
(
intf
,
key
))
return
;
HandleCommonKey
(
p_
intf
,
key
);
HandleCommonKey
(
intf
,
key
);
}
/*
...
...
@@ -1836,66 +1729,62 @@ static void msg_Free (msg_item_t *msg)
static
void
MsgCallback
(
void
*
data
,
int
type
,
const
msg_item_t
*
msg
,
const
char
*
format
,
va_list
ap
)
{
intf_sys_t
*
p_
sys
=
data
;
intf_sys_t
*
sys
=
data
;
char
*
text
;
if
(
p_sys
->
i_
verbosity
<
0
||
p_sys
->
i_
verbosity
<
(
type
-
VLC_MSG_ERR
)
if
(
sys
->
verbosity
<
0
||
sys
->
verbosity
<
(
type
-
VLC_MSG_ERR
)
||
vasprintf
(
&
text
,
format
,
ap
)
==
-
1
)
return
;
vlc_mutex_lock
(
&
p_
sys
->
msg_lock
);
vlc_mutex_lock
(
&
sys
->
msg_lock
);
p_sys
->
msgs
[
p_
sys
->
i_msgs
].
type
=
type
;
if
(
p_sys
->
msgs
[
p_
sys
->
i_msgs
].
item
!=
NULL
)
msg_Free
(
p_sys
->
msgs
[
p_
sys
->
i_msgs
].
item
);
p_sys
->
msgs
[
p_
sys
->
i_msgs
].
item
=
msg_Copy
(
msg
);
free
(
p_sys
->
msgs
[
p_
sys
->
i_msgs
].
msg
);
p_sys
->
msgs
[
p_
sys
->
i_msgs
].
msg
=
text
;
sys
->
msgs
[
sys
->
i_msgs
].
type
=
type
;
if
(
sys
->
msgs
[
sys
->
i_msgs
].
item
!=
NULL
)
msg_Free
(
sys
->
msgs
[
sys
->
i_msgs
].
item
);
sys
->
msgs
[
sys
->
i_msgs
].
item
=
msg_Copy
(
msg
);
free
(
sys
->
msgs
[
sys
->
i_msgs
].
msg
);
sys
->
msgs
[
sys
->
i_msgs
].
msg
=
text
;
if
(
++
p_sys
->
i_msgs
==
(
sizeof
p_sys
->
msgs
/
sizeof
*
p_
sys
->
msgs
))
p_
sys
->
i_msgs
=
0
;
if
(
++
sys
->
i_msgs
==
(
sizeof
sys
->
msgs
/
sizeof
*
sys
->
msgs
))
sys
->
i_msgs
=
0
;
vlc_mutex_unlock
(
&
p_
sys
->
msg_lock
);
vlc_mutex_unlock
(
&
sys
->
msg_lock
);
}
static
inline
void
UpdateInput
(
intf_sys_t
*
p_
sys
,
playlist_t
*
p_playlist
)
static
inline
void
UpdateInput
(
intf_sys_t
*
sys
,
playlist_t
*
p_playlist
)
{
if
(
!
p_sys
->
p_input
)
{
p_sys
->
p_input
=
playlist_CurrentInput
(
p_playlist
);
}
else
if
(
p_sys
->
p_input
->
b_dead
)
{
vlc_object_release
(
p_sys
->
p_input
);
p_sys
->
p_input
=
NULL
;
if
(
!
sys
->
p_input
)
{
sys
->
p_input
=
playlist_CurrentInput
(
p_playlist
);
}
else
if
(
sys
->
p_input
->
b_dead
)
{
vlc_object_release
(
sys
->
p_input
);
sys
->
p_input
=
NULL
;
}
}
/*****************************************************************************
* Run: ncurses thread
*****************************************************************************/
static
void
Run
(
intf_thread_t
*
p_
intf
)
static
void
Run
(
intf_thread_t
*
intf
)
{
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
;
playlist_t
*
p_playlist
=
pl_Get
(
p_
intf
);
intf_sys_t
*
sys
=
intf
->
p_sys
;
playlist_t
*
p_playlist
=
pl_Get
(
intf
);
int
canc
=
vlc_savecancel
();
var_AddCallback
(
p_playlist
,
"intf-change"
,
PlaylistChanged
,
p_
intf
);
var_AddCallback
(
p_playlist
,
"item-change"
,
ItemChanged
,
p_
intf
);
var_AddCallback
(
p_playlist
,
"playlist-item-append"
,
PlaylistChanged
,
p_
intf
);
var_AddCallback
(
p_playlist
,
"intf-change"
,
PlaylistChanged
,
intf
);
var_AddCallback
(
p_playlist
,
"item-change"
,
ItemChanged
,
intf
);
var_AddCallback
(
p_playlist
,
"playlist-item-append"
,
PlaylistChanged
,
intf
);
while
(
vlc_object_alive
(
p_intf
)
&&
!
p_sys
->
b_exit
)
{
UpdateInput
(
p_sys
,
p_playlist
);
Redraw
(
p_intf
);
HandleKey
(
p_intf
);
while
(
vlc_object_alive
(
intf
)
&&
!
sys
->
exit
)
{
UpdateInput
(
sys
,
p_playlist
);
Redraw
(
intf
);
HandleKey
(
intf
);
}
var_DelCallback
(
p_playlist
,
"intf-change"
,
PlaylistChanged
,
p_
intf
);
var_DelCallback
(
p_playlist
,
"item-change"
,
ItemChanged
,
p_
intf
);
var_DelCallback
(
p_playlist
,
"playlist-item-append"
,
PlaylistChanged
,
p_
intf
);
var_DelCallback
(
p_playlist
,
"intf-change"
,
PlaylistChanged
,
intf
);
var_DelCallback
(
p_playlist
,
"item-change"
,
ItemChanged
,
intf
);
var_DelCallback
(
p_playlist
,
"playlist-item-append"
,
PlaylistChanged
,
intf
);
vlc_restorecancel
(
canc
);
}
...
...
@@ -1904,34 +1793,30 @@ static void Run(intf_thread_t *p_intf)
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
p_this
)
{
intf_thread_t
*
p_
intf
=
(
intf_thread_t
*
)
p_this
;
intf_sys_t
*
p_sys
=
p_
intf
->
p_sys
=
calloc
(
1
,
sizeof
(
intf_sys_t
));
intf_thread_t
*
intf
=
(
intf_thread_t
*
)
p_this
;
intf_sys_t
*
sys
=
intf
->
p_sys
=
calloc
(
1
,
sizeof
(
intf_sys_t
));
if
(
!
p_
sys
)
if
(
!
sys
)
return
VLC_ENOMEM
;
vlc_mutex_init
(
&
p_sys
->
msg_lock
);
vlc_mutex_init
(
&
p_sys
->
pl_lock
);
memset
(
p_sys
->
msgs
,
0
,
sizeof
p_sys
->
msgs
);
p_sys
->
i_msgs
=
0
;
p_sys
->
i_verbosity
=
var_InheritInteger
(
p_intf
,
"verbose"
);
p_sys
->
p_sub
=
vlc_Subscribe
(
MsgCallback
,
p_sys
);
vlc_mutex_init
(
&
sys
->
msg_lock
);
vlc_mutex_init
(
&
sys
->
pl_lock
);
p_sys
->
i_box_type
=
BOX_PLAYLIST
;
p_sys
->
b_plidx_follow
=
true
;
p_sys
->
b_color
=
var_CreateGetBool
(
p_intf
,
"color"
);
sys
->
verbosity
=
var_InheritInteger
(
intf
,
"verbose"
);
sys
->
sub
=
vlc_Subscribe
(
MsgCallback
,
sys
);
p_sys
->
psz_current_dir
=
var_CreateGetString
(
p_intf
,
"browse-dir"
);
if
(
!
p_sys
->
psz_current_dir
||
!*
p_sys
->
psz_current_dir
)
{
free
(
p_sys
->
psz_current_dir
);
p_sys
->
psz_current_dir
=
config_GetUserDir
(
VLC_HOME_DIR
);
}
sys
->
box_type
=
BOX_PLAYLIST
;
sys
->
plidx_follow
=
true
;
sys
->
color
=
var_CreateGetBool
(
intf
,
"color"
);
sys
->
current_dir
=
var_CreateGetNonEmptyString
(
intf
,
"browse-dir"
);
if
(
!
sys
->
current_dir
)
sys
->
current_dir
=
config_GetUserDir
(
VLC_HOME_DIR
);
initscr
();
/* Initialize the curses library */
if
(
p_sys
->
b_
color
)
start_color_and_pairs
(
p_
intf
);
if
(
sys
->
color
)
start_color_and_pairs
(
intf
);
keypad
(
stdscr
,
TRUE
);
nonl
();
/* Don't do NL -> CR/NL */
...
...
@@ -1942,13 +1827,13 @@ static int Open(vlc_object_t *p_this)
clear
();
/* Stop printing errors to the console */
if
(
!
freopen
(
"/dev/null"
,
"wb"
,
stderr
))
msg_Err
(
p_
intf
,
"Couldn't close stderr (%m)"
);
if
(
!
freopen
(
"/dev/null"
,
"wb"
,
stderr
))
msg_Err
(
intf
,
"Couldn't close stderr (%m)"
);
ReadDir
(
p_
intf
);
PlaylistRebuild
(
p_
intf
),
ReadDir
(
intf
);
PlaylistRebuild
(
intf
),
p_
intf
->
pf_run
=
Run
;
intf
->
pf_run
=
Run
;
return
VLC_SUCCESS
;
}
...
...
@@ -1957,27 +1842,26 @@ static int Open(vlc_object_t *p_this)
*****************************************************************************/
static
void
Close
(
vlc_object_t
*
p_this
)
{
intf_sys_t
*
p_
sys
=
((
intf_thread_t
*
)
p_this
)
->
p_sys
;
intf_sys_t
*
sys
=
((
intf_thread_t
*
)
p_this
)
->
p_sys
;
PlaylistDestroy
(
p_
sys
);
DirsDestroy
(
p_
sys
);
PlaylistDestroy
(
sys
);
DirsDestroy
(
sys
);
free
(
p_sys
->
psz_
current_dir
);
free
(
p_sys
->
psz_
old_search
);
free
(
sys
->
current_dir
);
free
(
sys
->
old_search
);
if
(
p_
sys
->
p_input
)
vlc_object_release
(
p_
sys
->
p_input
);
if
(
sys
->
p_input
)
vlc_object_release
(
sys
->
p_input
);
endwin
();
/* Close the ncurses interface */
vlc_Unsubscribe
(
p_sys
->
p_sub
);
vlc_mutex_destroy
(
&
p_sys
->
msg_lock
);
vlc_mutex_destroy
(
&
p_sys
->
pl_lock
);
for
(
unsigned
i
=
0
;
i
<
sizeof
p_sys
->
msgs
/
sizeof
*
p_sys
->
msgs
;
i
++
)
{
if
(
p_sys
->
msgs
[
i
].
item
)
msg_Free
(
p_sys
->
msgs
[
i
].
item
);
free
(
p_sys
->
msgs
[
i
].
msg
);
vlc_Unsubscribe
(
sys
->
sub
);
vlc_mutex_destroy
(
&
sys
->
msg_lock
);
vlc_mutex_destroy
(
&
sys
->
pl_lock
);
for
(
unsigned
i
=
0
;
i
<
sizeof
sys
->
msgs
/
sizeof
*
sys
->
msgs
;
i
++
)
{
if
(
sys
->
msgs
[
i
].
item
)
msg_Free
(
sys
->
msgs
[
i
].
item
);
free
(
sys
->
msgs
[
i
].
msg
);
}
free
(
p_
sys
);
free
(
sys
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment