vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Tue Nov 29 22:08:48 2016 +0200| [785b0f18d70815288c8a673bcd0f3849af7ef6f7] | committer: Rémi Denis-Courmont
qt: add Wayland run-time detection This is for the GUI only. It does _NOT_ include video embedded windowing. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=785b0f18d70815288c8a673bcd0f3849af7ef6f7 --- modules/gui/qt/Makefile.am | 4 ++ modules/gui/qt/qt.cpp | 106 +++++++++++++++++++++++++++++++++------------ 2 files changed, 82 insertions(+), 28 deletions(-) diff --git a/modules/gui/qt/Makefile.am b/modules/gui/qt/Makefile.am index c00dc87..feef2e9 100644 --- a/modules/gui/qt/Makefile.am +++ b/modules/gui/qt/Makefile.am @@ -24,6 +24,10 @@ if HAVE_QT5_X11 libqt_plugin_la_CXXFLAGS += $(QT5_X11_CFLAGS) -DQT5_HAS_X11 libqt_plugin_la_LIBADD += $(QT5_X11_LIBS) endif +if HAVE_WAYLAND +libqt_plugin_la_CXXFLAGS += $(WAYLAND_CLIENT_CFLAGS) -DQT5_HAS_WAYLAND +libqt_plugin_la_LIBADD += $(WAYLAND_CLIENT_LIBS) +endif if HAVE_WIN32 libqt_plugin_la_LIBADD += $(LIBCOM) -lcomctl32 -luuid else diff --git a/modules/gui/qt/qt.cpp b/modules/gui/qt/qt.cpp index 1b05958..9a09824 100644 --- a/modules/gui/qt/qt.cpp +++ b/modules/gui/qt/qt.cpp @@ -44,10 +44,6 @@ #include "util/qvlcapp.hpp" /* QVLCApplication definition */ #include "components/playlist/playlist_model.hpp" /* for ~PLModel() */ -#if defined (QT5_HAS_X11) || defined (Q_WS_X11) - #include <vlc_xlib.h> -#endif - #include <vlc_plugin.h> #include <vlc_vout_window.h> @@ -75,7 +71,6 @@ static int Open ( vlc_object_t *, bool ); static void Close ( vlc_object_t * ); static int WindowOpen ( vout_window_t *, const vout_window_cfg_t * ); static void WindowClose ( vout_window_t * ); -static void *Thread ( void * ); static void ShowDialog ( intf_thread_t *, int, int, intf_dialog_args_t * ); /***************************************************************************** @@ -333,6 +328,13 @@ static bool active = false; * Module callbacks *****************************************************************************/ +static void *ThreadPlatform( void *, char * ); + +static void *Thread( void *data ) +{ + return ThreadPlatform( data, NULL ); +} + #ifdef Q_OS_MAC /* Used to abort the app.exec() on OSX after libvlc_Quit is called */ #include "../../../lib/libvlc_internal.h" /* libvlc_SetExitHandler */ @@ -342,6 +344,49 @@ static void Abort( void *obj ) } #endif +#if defined (QT5_HAS_X11) +# include <vlc_xlib.h> + +static void *ThreadXCB( void *data ) +{ + char platform_name[] = "xcb"; + return ThreadPlatform( data, platform_name ); +} + +static bool HasX11( vlc_object_t *obj ) +{ + if( !vlc_xlib_init( obj ) ) + return false; + + Display *dpy = XOpenDisplay( NULL ); + if( dpy == NULL ) + return false; + + XCloseDisplay( dpy ); + return true; +} +#endif + +#ifdef QT5_HAS_WAYLAND +# include <wayland-client.h> + +static void *ThreadWayland( void *data ) +{ + char platform_name[] = "wayland"; + return ThreadPlatform( data, platform_name ); +} + +static bool HasWayland( void ) +{ + struct wl_display *dpy = wl_display_connect( NULL ); + if( dpy == NULL ) + return false; + + wl_display_disconnect( dpy ); + return true; +} +#endif + static void RegisterIntf( intf_thread_t *p_this ) { playlist_t *pl = p_this->p_sys->p_playlist; @@ -355,18 +400,24 @@ static void RegisterIntf( intf_thread_t *p_this ) static int Open( vlc_object_t *p_this, bool isDialogProvider ) { intf_thread_t *p_intf = (intf_thread_t *)p_this; + void *(*thread)(void *) = Thread; -#if defined (QT5_HAS_X11) || defined (Q_WS_X11) - if( !vlc_xlib_init( p_this ) ) +#ifdef QT5_HAS_WAYLAND + if( HasWayland() ) + thread = ThreadWayland; + else +#endif +#ifdef QT5_HAS_X11 + if( HasX11( p_this ) ) + thread = ThreadXCB; + else +#endif +#if defined (QT5_HAS_X11) || defined (QT5_HAS_WAYLAND) return VLC_EGENERIC; - - Display *p_display = XOpenDisplay( NULL ); - if( !p_display ) - { - msg_Err( p_intf, "Could not connect to X server" ); +#endif +#ifdef Q_WS_X11 + if( !HasX11( p_this ) ) return VLC_EGENERIC; - } - XCloseDisplay( p_display ); #endif QMutexLocker locker (&lock); @@ -393,9 +444,9 @@ static int Open( vlc_object_t *p_this, bool isDialogProvider ) #ifdef Q_OS_MAC /* Run mainloop on the main thread as Cocoa requires */ libvlc_SetExitHandler( p_intf->obj.libvlc, Abort, p_intf ); - Thread( (void *)p_intf ); + thread( (void *)p_intf ); #else - if( vlc_clone( &p_sys->thread, Thread, p_intf, VLC_THREAD_PRIORITY_LOW ) ) + if( vlc_clone( &p_sys->thread, thread, p_intf, VLC_THREAD_PRIORITY_LOW ) ) { delete p_sys; return VLC_ENOMEM; @@ -458,23 +509,22 @@ static void Close( vlc_object_t *p_this ) busy = false; } -static void *Thread( void *obj ) +static void *ThreadPlatform( void *obj, char *platform_name ) { intf_thread_t *p_intf = (intf_thread_t *)obj; intf_sys_t *p_sys = p_intf->p_sys; char vlc_name[] = "vlc"; /* for WM_CLASS */ -#ifdef QT5_HAS_X11 char platform_parm[] = "-platform"; - char platform_value[] = "xcb"; -#endif - char *argv[] = { - vlc_name, -#ifdef QT5_HAS_X11 - platform_parm, platform_value, -#endif - NULL, - }; - int argc = sizeof(argv) / sizeof(argv[0]) - 1; + char *argv[4]; + int argc = 0; + + argv[argc++] = vlc_name; + if( platform_name != NULL ) + { + argv[argc++] = platform_parm; + argv[argc++] = platform_name; + } + argv[argc] = NULL; Q_INIT_RESOURCE( vlc ); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
