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
ade91b27
Commit
ade91b27
authored
Nov 19, 2006
by
Rafaël Carré
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Initial support of one instance mode on systems running D-Bus
parent
6443ce82
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
204 additions
and
22 deletions
+204
-22
include/vlc_common.h
include/vlc_common.h
+7
-0
modules/control/dbus.c
modules/control/dbus.c
+3
-12
modules/control/dbus.h
modules/control/dbus.h
+0
-6
src/libvlc-common.c
src/libvlc-common.c
+173
-0
src/libvlc.h
src/libvlc.h
+21
-4
No files found.
include/vlc_common.h
View file @
ade91b27
...
@@ -1176,3 +1176,10 @@ VLC_EXPORT( const char *, VLC_Changeset, ( void ) );
...
@@ -1176,3 +1176,10 @@ VLC_EXPORT( const char *, VLC_Changeset, ( void ) );
# define DIR_SEP_CHAR '/'
# define DIR_SEP_CHAR '/'
# define DIR_SEP "/"
# define DIR_SEP "/"
#endif
#endif
#ifdef HAVE_DBUS_3
/* registered name on the session bus */
#define VLC_DBUS_SERVICE "org.videolan.vlc"
#define VLC_DBUS_INTERFACE "org.videolan.vlc"
#define VLC_DBUS_OBJECT_PATH "/org/videolan/vlc"
#endif
modules/control/dbus.c
View file @
ade91b27
...
@@ -251,7 +251,7 @@ DBUS_METHOD( AddMRL )
...
@@ -251,7 +251,7 @@ DBUS_METHOD( AddMRL )
if
(
p_item
)
if
(
p_item
)
{
{
playlist_AddInput
(
p_playlist
,
p_item
,
playlist_AddInput
(
p_playlist
,
p_item
,
(
b_play
==
TRUE
)
?
PLAYLIST_GO
|
PLAYLIST_APPEND
:
PLAYLIST_APPEND
,
PLAYLIST_APPEND
|
(
(
b_play
==
TRUE
)
?
PLAYLIST_GO
:
0
)
,
PLAYLIST_END
,
VLC_TRUE
);
PLAYLIST_END
,
VLC_TRUE
);
}
}
pl_Release
(
p_playlist
);
pl_Release
(
p_playlist
);
...
@@ -331,17 +331,8 @@ static int Open( vlc_object_t *p_this )
...
@@ -331,17 +331,8 @@ static int Open( vlc_object_t *p_this )
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
}
}
/* we request the service org.videolan.vlc */
/* we unregister the object /, registered by libvlc */
dbus_bus_request_name
(
p_conn
,
VLC_DBUS_SERVICE
,
dbus_connection_unregister_object_path
(
p_conn
,
"/"
);
DBUS_NAME_FLAG_REPLACE_EXISTING
,
&
error
);
if
(
dbus_error_is_set
(
&
error
)
)
{
msg_Err
(
p_this
,
"Error requesting %s service: %s
\n
"
,
VLC_DBUS_SERVICE
,
error
.
message
);
dbus_error_free
(
&
error
);
free
(
p_sys
);
return
VLC_EGENERIC
;
}
/* we register the object /org/videolan/vlc */
/* we register the object /org/videolan/vlc */
dbus_connection_register_object_path
(
p_conn
,
VLC_DBUS_OBJECT_PATH
,
dbus_connection_register_object_path
(
p_conn
,
VLC_DBUS_OBJECT_PATH
,
...
...
modules/control/dbus.h
View file @
ade91b27
...
@@ -21,12 +21,6 @@
...
@@ -21,12 +21,6 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
*****************************************************************************/
/* DBUS IDENTIFIERS */
#define VLC_DBUS_SERVICE "org.videolan.vlc"
#define VLC_DBUS_INTERFACE "org.videolan.vlc"
#define VLC_DBUS_OBJECT_PATH "/org/videolan/vlc"
/* MACROS */
/* MACROS */
#define DBUS_METHOD( method_function ) \
#define DBUS_METHOD( method_function ) \
...
...
src/libvlc-common.c
View file @
ade91b27
...
@@ -66,6 +66,10 @@
...
@@ -66,6 +66,10 @@
# include <locale.h>
# include <locale.h>
#endif
#endif
#ifdef HAVE_DBUS_3
# include <dbus/dbus.h>
#endif
#ifdef HAVE_HAL
#ifdef HAVE_HAL
# include <hal/libhal.h>
# include <hal/libhal.h>
#endif
#endif
...
@@ -215,6 +219,41 @@ libvlc_int_t * libvlc_InternalCreate( void )
...
@@ -215,6 +219,41 @@ libvlc_int_t * libvlc_InternalCreate( void )
return
p_libvlc
;
return
p_libvlc
;
}
}
/*
* D-Bus callbacks needed in libvlc_InternalInit()
*/
#ifdef HAVE_DBUS_3
/* Handling of messages received on / object */
static
DBusHandlerResult
handle_root
(
DBusConnection
*
p_conn
,
DBusMessage
*
p_from
,
void
*
p_data
)
{
DBusMessage
*
p_msg
=
dbus_message_new_method_return
(
p_from
);
if
(
!
p_msg
)
return
DBUS_HANDLER_RESULT_NEED_MEMORY
;
DBusMessageIter
args
;
dbus_message_iter_init_append
(
p_msg
,
&
args
);
dbus_uint32_t
i_serial
=
0
;
char
*
p_root
=
malloc
(
strlen
(
"<node name='/'></node>"
)
);
if
(
!
p_root
)
return
DBUS_HANDLER_RESULT_NEED_MEMORY
;
sprintf
(
p_root
,
"<node name='/'></node>"
);
if
(
!
dbus_message_iter_append_basic
(
&
args
,
DBUS_TYPE_STRING
,
&
p_root
)
)
return
DBUS_HANDLER_RESULT_NEED_MEMORY
;
if
(
!
dbus_connection_send
(
p_conn
,
p_msg
,
&
i_serial
)
)
return
DBUS_HANDLER_RESULT_NEED_MEMORY
;
dbus_connection_flush
(
p_conn
);
dbus_message_unref
(
p_msg
);
return
DBUS_HANDLER_RESULT_HANDLED
;
}
/* vtable passed to dbus_connection_register_object_path() */
static
DBusObjectPathVTable
vlc_dbus_root_vtable
=
{
NULL
,
handle_root
,
NULL
,
NULL
,
NULL
,
NULL
};
#endif
/**
/**
* Initialize a libvlc instance
* Initialize a libvlc instance
* This function initializes a previously allocated libvlc instance:
* This function initializes a previously allocated libvlc instance:
...
@@ -569,6 +608,140 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] )
...
@@ -569,6 +608,140 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] )
*/
*/
system_Configure
(
p_libvlc
,
&
i_argc
,
ppsz_argv
);
system_Configure
(
p_libvlc
,
&
i_argc
,
ppsz_argv
);
#ifdef HAVE_DBUS_3
/* Initialise D-Bus interface, check for other instances */
DBusConnection
*
p_conn
;
DBusError
dbus_error
;
int
i_dbus_service
;
dbus_threads_init_default
();
dbus_error_init
(
&
dbus_error
);
/* connect to the session bus */
p_conn
=
dbus_bus_get
(
DBUS_BUS_SESSION
,
&
dbus_error
);
if
(
!
p_conn
)
{
msg_Err
(
p_libvlc
,
"Failed to connect to the D-Bus session daemon: %s"
,
dbus_error
.
message
);
dbus_error_free
(
&
dbus_error
);
}
else
{
/* we request the service org.videolan.vlc */
i_dbus_service
=
dbus_bus_request_name
(
p_conn
,
VLC_DBUS_SERVICE
,
0
,
&
dbus_error
);
if
(
dbus_error_is_set
(
&
dbus_error
)
)
{
msg_Err
(
p_libvlc
,
"Error requesting %s service: %s
\n
"
,
VLC_DBUS_SERVICE
,
dbus_error
.
message
);
dbus_error_free
(
&
dbus_error
);
}
else
{
if
(
i_dbus_service
!=
DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER
)
/* TODO: register a '/' object */
{
/*23:08 < mjj29> it should reply immediately with <node name='/'></node>*/
if
(
config_GetInt
(
p_libvlc
,
"one-instance"
)
)
{
msg_Warn
(
p_libvlc
,
"Another vlc instance exists: will now exit"
);
int
i_input
;
DBusMessage
*
p_dbus_msg
;
DBusMessageIter
dbus_args
;
DBusPendingCall
*
p_dbus_pending
;
dbus_bool_t
b_play
;
for
(
i_input
=
optind
;
i_input
<
i_argc
;
i_input
++
)
{
msg_Dbg
(
p_libvlc
,
"Give %s to other vlc
\n
"
,
ppsz_argv
[
i_input
]
);
p_dbus_msg
=
dbus_message_new_method_call
(
VLC_DBUS_SERVICE
,
VLC_DBUS_OBJECT_PATH
,
VLC_DBUS_INTERFACE
,
"AddMRL"
);
if
(
NULL
==
p_dbus_msg
)
{
msg_Err
(
p_libvlc
,
"D-Bus problem"
);
system_End
(
p_libvlc
);
exit
(
0
);
}
/* append MRLs */
dbus_message_iter_init_append
(
p_dbus_msg
,
&
dbus_args
);
if
(
!
dbus_message_iter_append_basic
(
&
dbus_args
,
DBUS_TYPE_STRING
,
&
ppsz_argv
[
i_input
]
)
)
{
msg_Err
(
p_libvlc
,
"Out of memory"
);
dbus_message_unref
(
p_dbus_msg
);
system_End
(
p_libvlc
);
exit
(
0
);
}
b_play
=
TRUE
;
if
(
config_GetInt
(
p_libvlc
,
"playlist-enqueue"
)
)
b_play
=
FALSE
;
if
(
!
dbus_message_iter_append_basic
(
&
dbus_args
,
DBUS_TYPE_BOOLEAN
,
&
b_play
)
)
{
msg_Err
(
p_libvlc
,
"Out of memory"
);
dbus_message_unref
(
p_dbus_msg
);
system_End
(
p_libvlc
);
exit
(
0
);
}
/* send message and get a handle for a reply */
if
(
!
dbus_connection_send_with_reply
(
p_conn
,
p_dbus_msg
,
&
p_dbus_pending
,
-
1
)
)
{
msg_Err
(
p_libvlc
,
"D-Bus problem"
);
dbus_message_unref
(
p_dbus_msg
);
system_End
(
p_libvlc
);
exit
(
0
);
}
if
(
NULL
==
p_dbus_pending
)
{
msg_Err
(
p_libvlc
,
"D-Bus problem"
);
dbus_message_unref
(
p_dbus_msg
);
system_End
(
p_libvlc
);
exit
(
0
);
}
dbus_connection_flush
(
p_conn
);
dbus_message_unref
(
p_dbus_msg
);
/* block until we receive a reply */
dbus_pending_call_block
(
p_dbus_pending
);
dbus_pending_call_unref
(
p_dbus_pending
);
}
/* bye bye */
system_End
(
p_libvlc
);
exit
(
0
);
}
else
{
msg_Warn
(
p_libvlc
,
"Name %s is already owned on the session bus"
,
VLC_DBUS_SERVICE
);
}
}
else
{
/* register "/" object */
if
(
!
dbus_connection_register_object_path
(
p_conn
,
"/"
,
&
vlc_dbus_root_vtable
,
NULL
)
)
{
msg_Err
(
p_libvlc
,
"Out of memory"
);
}
msg_Dbg
(
p_libvlc
,
"We are the primary owner of %s on the session bus"
,
VLC_DBUS_SERVICE
);
}
}
}
#endif
/*
/*
* Message queue options
* Message queue options
*/
*/
...
...
src/libvlc.h
View file @
ade91b27
...
@@ -875,14 +875,24 @@ static const char *ppsz_clock_descriptions[] =
...
@@ -875,14 +875,24 @@ static const char *ppsz_clock_descriptions[] =
#define SYSLOG_LONGTEXT N_( \
#define SYSLOG_LONGTEXT N_( \
"Log all VLC messages to syslog (UNIX systems)." )
"Log all VLC messages to syslog (UNIX systems)." )
#define ONEINSTANCE_TEXT N_("Allow only one running instance")
#define ONEINSTANCE_
WIN_
TEXT N_("Allow only one running instance")
#define ONEINSTANCE_LONGTEXT N_( \
#define ONEINSTANCE_
WIN_
LONGTEXT N_( \
"Allowing only one running instance of VLC can sometimes be useful, " \
"Allowing only one running instance of VLC can sometimes be useful, " \
"for example if you associated VLC with some media types and you " \
"for example if you associated VLC with some media types and you " \
"don't want a new instance of VLC to be opened each time you " \
"don't want a new instance of VLC to be opened each time you " \
"double-click on a file in the explorer. This option will allow you " \
"double-click on a file in the explorer. This option will allow you " \
"to play the file with the already running instance or enqueue it.")
"to play the file with the already running instance or enqueue it.")
#define ONEINSTANCE_DBUS_TEXT ONEINSTANCE_WIN_TEXT
#define ONEINSTANCE_DBUS_LONGTEXT N_( \
"Allowing only one running instance of VLC can sometimes be useful, " \
"for example if you associated VLC with some media types and you " \
"don't want a new instance of VLC to be opened each time you " \
"open a file in your file manager. This option will allow you " \
"to play the file with the already running instance or enqueue it." \
"This option require the D-Bus session daemon to be active " \
"and the running instance of VLC to use D-Bus control interface.")
#define STARTEDFROMFILE_TEXT N_("VLC is started from file association")
#define STARTEDFROMFILE_TEXT N_("VLC is started from file association")
#define STARTEDFROMFILE_LONGTEXT N_( \
#define STARTEDFROMFILE_LONGTEXT N_( \
"Tell VLC that it is being launched due to a file association in the OS" )
"Tell VLC that it is being launched due to a file association in the OS" )
...
@@ -1612,9 +1622,16 @@ vlc_module_begin();
...
@@ -1612,9 +1622,16 @@ vlc_module_begin();
change_need_restart
();
change_need_restart
();
#endif
#endif
#if defined(HAVE_DBUS_3)
add_bool
(
"one-instance"
,
0
,
NULL
,
ONEINSTANCE_DBUS_TEXT
,
ONEINSTANCE_DBUS_LONGTEXT
,
VLC_TRUE
);
add_bool
(
"playlist-enqueue"
,
0
,
NULL
,
PLAYLISTENQUEUE_TEXT
,
PLAYLISTENQUEUE_LONGTEXT
,
VLC_TRUE
);
#endif
#if defined(WIN32)
#if defined(WIN32)
add_bool
(
"one-instance"
,
0
,
NULL
,
ONEINSTANCE_TEXT
,
add_bool
(
"one-instance"
,
0
,
NULL
,
ONEINSTANCE_
WIN_
TEXT
,
ONEINSTANCE_LONGTEXT
,
VLC_TRUE
);
ONEINSTANCE_
WIN_
LONGTEXT
,
VLC_TRUE
);
add_bool
(
"started-from-file"
,
0
,
NULL
,
STARTEDFROMFILE_TEXT
,
add_bool
(
"started-from-file"
,
0
,
NULL
,
STARTEDFROMFILE_TEXT
,
STARTEDFROMFILE_LONGTEXT
,
VLC_TRUE
);
STARTEDFROMFILE_LONGTEXT
,
VLC_TRUE
);
add_bool
(
"one-instance-when-started-from-file"
,
1
,
NULL
,
add_bool
(
"one-instance-when-started-from-file"
,
1
,
NULL
,
...
...
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