Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
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-2-2
Commits
20f054d0
Commit
20f054d0
authored
Nov 14, 2007
by
Jean-Paul Saman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add new files which should have been in previous commit.
parent
ad1fb879
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
529 additions
and
0 deletions
+529
-0
modules/misc/osd/simple.c
modules/misc/osd/simple.c
+458
-0
modules/misc/osd/xml.c
modules/misc/osd/xml.c
+71
-0
No files found.
modules/misc/osd/simple.c
0 → 100644
View file @
20f054d0
/*****************************************************************************
* simple.c - The OSD Menu simple parser code.
*****************************************************************************
* Copyright (C) 2005-2007 M2X
* $Id: $
*
* Authors: Jean-Paul Saman
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <vlc/vlc.h>
#include <vlc_vout.h>
#include <vlc_config.h>
#include <vlc_keys.h>
#include <vlc_image.h>
#include <vlc_osd.h>
#include <vlc_charset.h>
/*****************************************************************************
* osd_ConfigLoader: Load and parse osd text configurationfile
*****************************************************************************/
int
E_
(
osd_parser_simpleOpen
)
(
vlc_object_t
*
p_this
)
{
osd_menu_t
*
p_menu
=
(
osd_menu_t
*
)
p_this
->
p_menu
;
osd_button_t
*
p_current
=
NULL
;
/* button currently processed */
osd_button_t
*
p_prev
=
NULL
;
/* previous processed button */
#define MAX_FILE_PATH 256
FILE
*
fd
=
NULL
;
int
result
=
0
;
msg_Dbg
(
p_this
,
"opening osdmenu definition file %s"
,
p_menu
->
psz_file
);
fd
=
utf8_fopen
(
p_menu
->
psz_file
,
"r"
);
if
(
!
fd
)
{
msg_Err
(
p_this
,
"failed to open osdmenu definition file %s"
,
p_menu
->
psz_file
);
return
VLC_EGENERIC
;
}
/* Read first line */
if
(
!
feof
(
fd
)
)
{
char
action
[
25
]
=
""
;
char
cmd
[
25
]
=
""
;
char
path
[
MAX_FILE_PATH
]
=
""
;
char
*
psz_path
=
NULL
;
size_t
i_len
=
0
;
long
pos
=
0
;
result
=
fscanf
(
fd
,
"%24s %255s"
,
&
action
[
0
],
&
path
[
0
]
);
/* override images path ? */
psz_path
=
config_GetPsz
(
p_this
,
"osdmenu-file-path"
);
if
(
psz_path
)
{
/* psz_path is not null and therefor &path[0] cannot be NULL
* it might be null terminated.
*/
strncpy
(
&
path
[
0
],
psz_path
,
MAX_FILE_PATH
);
free
(
psz_path
);
psz_path
=
NULL
;
}
/* NULL terminate before asking the length of path[] */
path
[
MAX_FILE_PATH
-
1
]
=
'\0'
;
i_len
=
strlen
(
&
path
[
0
]);
if
(
i_len
==
MAX_FILE_PATH
)
i_len
--
;
/* truncate to prevent buffer overflow */
#if defined(WIN32) || defined(UNDER_CE)
if
(
(
i_len
>
0
)
&&
path
[
i_len
]
!=
'\\'
)
path
[
i_len
]
=
'\\'
;
#else
if
(
(
i_len
>
0
)
&&
path
[
i_len
]
!=
'/'
)
path
[
i_len
]
=
'/'
;
#endif
path
[
i_len
+
1
]
=
'\0'
;
if
(
result
==
0
||
result
==
EOF
)
goto
error
;
msg_Dbg
(
p_this
,
"osdmenu dir %s"
,
&
path
[
0
]
);
if
(
i_len
==
0
)
*
p_menu
=
osd_MenuNew
(
*
p_menu
,
NULL
,
0
,
0
);
else
*
p_menu
=
osd_MenuNew
(
*
p_menu
,
&
path
[
0
],
0
,
0
);
/* Peek for 'style' argument */
pos
=
ftell
(
fd
);
if
(
pos
<
0
)
goto
error
;
result
=
fscanf
(
fd
,
"%24s %24s"
,
&
cmd
[
0
],
&
action
[
0
]
);
if
(
result
==
0
||
result
==
EOF
)
goto
error
;
msg_Dbg
(
p_this
,
"osdmenu %s %s"
,
&
cmd
[
0
],
&
action
[
0
]
);
if
(
strncmp
(
&
cmd
[
0
],
"style"
,
5
)
==
0
)
{
if
(
strncmp
(
&
action
[
0
],
"default"
,
7
)
==
0
)
{
(
*
p_menu
)
->
i_style
=
OSD_MENU_STYLE_SIMPLE
;
}
else
if
(
strncmp
(
&
action
[
0
],
"concat"
,
6
)
==
0
)
{
(
*
p_menu
)
->
i_style
=
OSD_MENU_STYLE_CONCAT
;
}
}
else
{
result
=
fseek
(
fd
,
pos
,
SEEK_SET
);
if
(
result
<
0
)
goto
error
;
}
}
if
(
!*
p_menu
)
goto
error
;
/* read successive lines */
while
(
!
feof
(
fd
)
)
{
osd_state_t
*
p_state_current
=
NULL
;
/* button state currently processed */
osd_state_t
*
p_state_prev
=
NULL
;
/* previous state processed button */
char
cmd
[
25
]
=
""
;
char
action
[
25
]
=
""
;
char
state
[
25
]
=
""
;
char
file
[
256
]
=
""
;
char
path
[
512
]
=
""
;
int
i_x
=
0
;
int
i_y
=
0
;
result
=
fscanf
(
fd
,
"%24s %24s (%d,%d)"
,
&
cmd
[
0
],
&
action
[
0
],
&
i_x
,
&
i_y
);
if
(
result
==
0
)
goto
error
;
if
(
strncmp
(
&
cmd
[
0
],
"action"
,
6
)
!=
0
)
break
;
msg_Dbg
(
p_this
,
" + %s hotkey=%s (%d,%d)"
,
&
cmd
[
0
],
&
action
[
0
],
i_x
,
i_y
);
p_prev
=
p_current
;
p_current
=
osd_ButtonNew
(
&
action
[
0
],
i_x
,
i_y
);
if
(
!
p_current
)
goto
error
;
if
(
p_prev
)
p_prev
->
p_next
=
p_current
;
else
(
*
p_menu
)
->
p_button
=
p_current
;
p_current
->
p_prev
=
p_prev
;
/* parse all states */
while
(
!
feof
(
fd
)
)
{
char
type
[
25
]
=
""
;
result
=
fscanf
(
fd
,
"
\t
%24s"
,
&
state
[
0
]
);
if
(
result
==
0
)
goto
error
;
/* FIXME: We only parse one level deep now */
if
(
strncmp
(
&
state
[
0
],
"action"
,
6
)
==
0
)
{
osd_button_t
*
p_up
=
NULL
;
result
=
fscanf
(
fd
,
"%24s (%d,%d)"
,
&
action
[
0
],
&
i_x
,
&
i_y
);
if
(
result
==
0
)
goto
error
;
/* create new button */
p_up
=
osd_ButtonNew
(
&
action
[
0
],
i_x
,
i_y
);
if
(
!
p_up
)
goto
error
;
/* Link to list */
p_up
->
p_down
=
p_current
;
p_current
->
p_up
=
p_up
;
msg_Dbg
(
p_this
,
" + (menu up) hotkey=%s (%d,%d)"
,
&
action
[
0
],
i_x
,
i_y
);
/* Parse type state */
result
=
fscanf
(
fd
,
"
\t
%24s %24s"
,
&
cmd
[
0
],
&
type
[
0
]
);
if
(
result
==
0
)
goto
error
;
if
(
strncmp
(
&
cmd
[
0
],
"type"
,
4
)
==
0
)
{
if
(
strncmp
(
&
type
[
0
],
"volume"
,
6
)
==
0
)
{
(
*
p_menu
)
->
p_state
->
p_volume
=
p_up
;
msg_Dbg
(
p_this
,
" + type=%s"
,
&
type
[
0
]
);
}
}
/* Parse range state */
result
=
fscanf
(
fd
,
"
\t
%24s"
,
&
state
[
0
]
);
if
(
result
==
0
)
goto
error
;
/* Parse the range state */
if
(
strncmp
(
&
state
[
0
],
"range"
,
5
)
==
0
)
{
osd_state_t
*
p_range_current
=
NULL
;
/* range state currently processed */
osd_state_t
*
p_range_prev
=
NULL
;
/* previous state processed range */
int
i_index
=
0
;
p_up
->
b_range
=
VLC_TRUE
;
result
=
fscanf
(
fd
,
"
\t
%24s"
,
&
action
[
0
]
);
if
(
result
==
0
)
goto
error
;
result
=
fscanf
(
fd
,
"
\t
%d"
,
&
i_index
);
if
(
result
==
0
)
goto
error
;
msg_Dbg
(
p_this
,
" + (menu up) hotkey down %s, file=%s%s"
,
&
action
[
0
],
(
*
p_menu
)
->
psz_path
,
&
file
[
0
]
);
if
(
p_up
->
psz_action_down
)
free
(
p_up
->
psz_action_down
);
p_up
->
psz_action_down
=
strdup
(
&
action
[
0
]
);
/* Parse range contstruction :
* range <hotkey>
* <state1> <file1>
*
* <stateN> <fileN>
* end
*/
while
(
!
feof
(
fd
)
)
{
result
=
fscanf
(
fd
,
"
\t
%255s"
,
&
file
[
0
]
);
if
(
result
==
0
)
goto
error
;
if
(
strncmp
(
&
file
[
0
],
"end"
,
3
)
==
0
)
break
;
p_range_prev
=
p_range_current
;
if
(
(
*
p_menu
)
->
psz_path
)
{
size_t
i_path_size
=
strlen
(
(
*
p_menu
)
->
psz_path
);
size_t
i_file_size
=
strlen
(
&
file
[
0
]
);
strncpy
(
&
path
[
0
],
(
*
p_menu
)
->
psz_path
,
i_path_size
);
strncpy
(
&
path
[
i_path_size
],
&
file
[
0
],
512
-
(
i_path_size
+
i_file_size
)
);
path
[
i_path_size
+
i_file_size
]
=
'\0'
;
p_range_current
=
osd_StateNew
(
p_this
,
&
path
[
0
],
"pressed"
);
}
else
/* absolute paths are used. */
p_range_current
=
osd_StateNew
(
p_this
,
&
file
[
0
],
"pressed"
);
if
(
!
p_range_current
||
!
p_range_current
->
p_pic
)
goto
error
;
/* increment the number of ranges for this button */
p_up
->
i_ranges
++
;
if
(
p_range_prev
)
p_range_prev
->
p_next
=
p_range_current
;
else
p_up
->
p_states
=
p_range_current
;
p_range_current
->
p_prev
=
p_range_prev
;
msg_Dbg
(
p_this
,
" |- range=%d, file=%s%s"
,
p_up
->
i_ranges
,
(
*
p_menu
)
->
psz_path
,
&
file
[
0
]
);
}
if
(
i_index
>
0
)
{
osd_state_t
*
p_range
=
NULL
;
/* Find the default index for state range */
p_range
=
p_up
->
p_states
;
while
(
(
--
i_index
>
0
)
&&
p_range
->
p_next
)
{
osd_state_t
*
p_temp
=
NULL
;
p_temp
=
p_range
->
p_next
;
p_range
=
p_temp
;
}
p_up
->
p_current_state
=
p_range
;
}
else
p_up
->
p_current_state
=
p_up
->
p_states
;
}
result
=
fscanf
(
fd
,
"
\t
%24s"
,
&
state
[
0
]
);
if
(
result
==
0
)
goto
error
;
if
(
strncmp
(
&
state
[
0
],
"end"
,
3
)
!=
0
)
goto
error
;
/* Continue at the beginning of the while() */
continue
;
}
/* Parse the range state */
if
(
strncmp
(
&
state
[
0
],
"range"
,
5
)
==
0
)
{
osd_state_t
*
p_range_current
=
NULL
;
/* range state currently processed */
osd_state_t
*
p_range_prev
=
NULL
;
/* previous state processed range */
int
i_index
=
0
;
p_current
->
b_range
=
VLC_TRUE
;
result
=
fscanf
(
fd
,
"
\t
%24s"
,
&
action
[
0
]
);
if
(
result
==
0
)
goto
error
;
result
=
fscanf
(
fd
,
"
\t
%d"
,
&
i_index
);
if
(
result
==
0
)
goto
error
;
msg_Dbg
(
p_this
,
" + hotkey down %s, file=%s%s"
,
&
action
[
0
],
(
*
p_menu
)
->
psz_path
,
&
file
[
0
]
);
if
(
p_current
->
psz_action_down
)
free
(
p_current
->
psz_action_down
);
p_current
->
psz_action_down
=
strdup
(
&
action
[
0
]
);
/* Parse range contstruction :
* range <hotkey>
* <state1> <file1>
*
* <stateN> <fileN>
* end
*/
while
(
!
feof
(
fd
)
)
{
result
=
fscanf
(
fd
,
"
\t
%255s"
,
&
file
[
0
]
);
if
(
result
==
0
)
goto
error
;
if
(
strncmp
(
&
file
[
0
],
"end"
,
3
)
==
0
)
break
;
p_range_prev
=
p_range_current
;
if
(
(
*
p_menu
)
->
psz_path
)
{
size_t
i_path_size
=
strlen
(
(
*
p_menu
)
->
psz_path
);
size_t
i_file_size
=
strlen
(
&
file
[
0
]
);
strncpy
(
&
path
[
0
],
(
*
p_menu
)
->
psz_path
,
i_path_size
);
strncpy
(
&
path
[
i_path_size
],
&
file
[
0
],
512
-
(
i_path_size
+
i_file_size
)
);
path
[
i_path_size
+
i_file_size
]
=
'\0'
;
p_range_current
=
osd_StateNew
(
p_this
,
&
path
[
0
],
"pressed"
);
}
else
/* absolute paths are used. */
p_range_current
=
osd_StateNew
(
p_this
,
&
file
[
0
],
"pressed"
);
if
(
!
p_range_current
||
!
p_range_current
->
p_pic
)
goto
error
;
/* increment the number of ranges for this button */
p_current
->
i_ranges
++
;
if
(
p_range_prev
)
p_range_prev
->
p_next
=
p_range_current
;
else
p_current
->
p_states
=
p_range_current
;
p_range_current
->
p_prev
=
p_range_prev
;
msg_Dbg
(
p_this
,
" |- range=%d, file=%s%s"
,
p_current
->
i_ranges
,
(
*
p_menu
)
->
psz_path
,
&
file
[
0
]
);
}
if
(
i_index
>
0
)
{
osd_state_t
*
p_range
=
NULL
;
/* Find the default index for state range */
p_range
=
p_current
->
p_states
;
while
(
(
--
i_index
>
0
)
&&
p_range
->
p_next
)
{
osd_state_t
*
p_temp
=
NULL
;
p_temp
=
p_range
->
p_next
;
p_range
=
p_temp
;
}
p_current
->
p_current_state
=
p_range
;
}
else
p_current
->
p_current_state
=
p_current
->
p_states
;
/* Continue at the beginning of the while() */
continue
;
}
if
(
strncmp
(
&
state
[
0
],
"end"
,
3
)
==
0
)
break
;
result
=
fscanf
(
fd
,
"
\t
%255s"
,
&
file
[
0
]
);
if
(
result
==
0
)
goto
error
;
p_state_prev
=
p_state_current
;
if
(
(
strncmp
(
ppsz_button_states
[
0
],
&
state
[
0
],
strlen
(
ppsz_button_states
[
0
])
)
!=
0
)
&&
(
strncmp
(
ppsz_button_states
[
1
],
&
state
[
0
],
strlen
(
ppsz_button_states
[
1
])
)
!=
0
)
&&
(
strncmp
(
ppsz_button_states
[
2
],
&
state
[
0
],
strlen
(
ppsz_button_states
[
2
])
)
!=
0
)
)
{
msg_Err
(
p_this
,
"invalid button state %s for button %s "
"expected %u: unselect, select or pressed)"
,
&
state
[
0
],
&
action
[
0
],
(
unsigned
)
strlen
(
&
state
[
0
]));
goto
error
;
}
if
(
(
*
p_menu
)
->
psz_path
)
{
size_t
i_path_size
=
strlen
(
(
*
p_menu
)
->
psz_path
);
size_t
i_file_size
=
strlen
(
&
file
[
0
]
);
strncpy
(
&
path
[
0
],
(
*
p_menu
)
->
psz_path
,
i_path_size
);
strncpy
(
&
path
[
i_path_size
],
&
file
[
0
],
512
-
(
i_path_size
+
i_file_size
)
);
path
[
i_path_size
+
i_file_size
]
=
'\0'
;
p_state_current
=
osd_StateNew
(
p_this
,
&
path
[
0
],
&
state
[
0
]
);
}
else
/* absolute paths are used. */
p_state_current
=
osd_StateNew
(
p_this
,
&
file
[
0
],
&
state
[
0
]
);
if
(
!
p_state_current
||
!
p_state_current
->
p_pic
)
goto
error
;
if
(
p_state_prev
)
p_state_prev
->
p_next
=
p_state_current
;
else
p_current
->
p_states
=
p_state_current
;
p_state_current
->
p_prev
=
p_state_prev
;
msg_Dbg
(
p_this
,
" |- state=%s, file=%s%s"
,
&
state
[
0
],
(
*
p_menu
)
->
psz_path
,
&
file
[
0
]
);
}
p_current
->
p_current_state
=
p_current
->
p_states
;
}
/* Find the last button and store its pointer.
* The OSD menu behaves like a roundrobin list.
*/
p_current
=
(
*
p_menu
)
->
p_button
;
while
(
p_current
&&
p_current
->
p_next
)
{
osd_button_t
*
p_temp
=
NULL
;
p_temp
=
p_current
->
p_next
;
p_current
=
p_temp
;
}
(
*
p_menu
)
->
p_last_button
=
p_current
;
fclose
(
fd
);
return
VLC_SUCCESS
;
#undef MAX_FILE_PATH
error:
msg_Err
(
p_this
,
"parsing file failed (returned %d)"
,
result
);
osd_MenuFree
(
p_this
,
*
p_menu
);
fclose
(
fd
);
return
VLC_EGENERIC
;
}
modules/misc/osd/xml.c
0 → 100644
View file @
20f054d0
/*****************************************************************************
* xml.c - The OSD Menu XML parser code.
*****************************************************************************
* Copyright (C) 2005-2007 M2X
* $Id: $
*
* Authors: Jean-Paul Saman
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <vlc/vlc.h>
#include <vlc_vout.h>
#include <vlc_config.h>
#include <vlc_keys.h>
#include <vlc_image.h>
#include <vlc_osd.h>
#include <vlc_charset.h>
/***************************************************************************
* Prototypes
***************************************************************************/
static
int
E_
(
osd_parser_xmlOpen
)
(
vlc_object_t
*
p_this
);
static
void
E_
(
osd_parser_xmlClose
)(
vlc_object_t
*
p_this
);
/*****************************************************************************
* Module descriptor
*****************************************************************************/
vlc_module_begin
();
set_category
(
CAT_MISC
);
set_subcategory
(
SUBCAT_OSD_IMPORT
);
set_description
(
_
(
"XML OSD configuration importer"
)
);
add_shortcut
(
"import-osd-xml"
);
set_capability
(
"osd parser"
,
0
);
set_callbacks
(
osd_parser_xmlOpen
,
osd_parser_xmlClose
);
vlc_module_end
();
/****************************************************************************
* Local structures
****************************************************************************/
int
E_
(
osd_parser_xmlOpen
)
(
vlc_object_t
*
p_this
)
{
return
VLC_SUCCESS
;
}
void
E_
(
osd_parser_xmlClose
)
(
vlc_object_t
*
p_this
)
{
}
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