[vlc-devel] commit: Port panoramix to X RandR with XCB (incomplete) ( Rémi Denis-Courmont )
git version control
git at videolan.org
Wed Jun 10 21:36:38 CEST 2009
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Wed Jun 10 22:36:25 2009 +0300| [2dc30918df346215116efee064543844c0800e79] | committer: Rémi Denis-Courmont
Port panoramix to X RandR with XCB (incomplete)
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2dc30918df346215116efee064543844c0800e79
---
configure.ac | 10 +++--
modules/video_filter/panoramix.c | 85 +++++++++++++++++++++++++++++++++++---
2 files changed, 85 insertions(+), 10 deletions(-)
diff --git a/configure.ac b/configure.ac
index 7490636..071df0d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3915,10 +3915,6 @@ CPPFLAGS="${CPPFLAGS_save} ${X_CFLAGS}"
AS_IF([test "${enable_x11}" != "no"], [
AC_CHECK_HEADERS(X11/Xlib.h, [
- VLC_ADD_PLUGIN([panoramix])
- VLC_ADD_LIBS([panoramix],[${X_LIBS} ${X_PRE_LIBS} -lX11])
- VLC_ADD_CPPFLAGS([panoramix],[${X_CFLAGS}])
-
VLC_ADD_PLUGIN([x11])
VLC_ADD_LIBS([x11],[${X_LIBS} ${X_PRE_LIBS} -lX11])
VLC_ADD_CPPFLAGS([x11],[${X_CFLAGS}])
@@ -4098,6 +4094,12 @@ AS_IF([test "${enable_xcb}" != "no"], [
])
])
+ PKG_CHECK_MODULES(XCB_RANDR, [xcb-randr], [
+ VLC_ADD_PLUGIN([panoramix])
+ VLC_ADD_LIBS([panoramix],[${XCB_RANDR_LIBS} ${XCB_LIBS}])
+ VLC_ADD_CFLAGS([panoramix],[${XCB_RANDR_CFLAGS} ${XCB_CFLAGS}])
+ ], [true])
+
dnl xcb-utils
PKG_CHECK_MODULES(XCB_KEYSYMS, [xcb-keysyms])
diff --git a/modules/video_filter/panoramix.c b/modules/video_filter/panoramix.c
index 2fe05f2..dfb8f52 100644
--- a/modules/video_filter/panoramix.c
+++ b/modules/video_filter/panoramix.c
@@ -46,7 +46,8 @@
# ifdef WIN32
# include <windows.h>
# else
-# include <X11/Xlib.h>
+# include <xcb/xcb.h>
+# include <xcb/randr.h>
# endif
#endif
@@ -336,6 +337,71 @@ static const panoramix_chroma_t p_chroma_array[] = {
{ 0, {0, }, { 0, }, { 0, 0, 0 }, false }
};
+#ifndef WIN32
+/* Get the number of outputs */
+static unsigned CountMonitors (vlc_object_t *obj)
+{
+ char *psz_display = var_CreateGetNonEmptyString( obj, "x11-display" );
+ int snum;
+ xcb_connection_t *conn = xcb_connect( psz_display, &snum );
+ if( xcb_connection_has_error( conn ) )
+ return 0;
+
+ const xcb_setup_t *setup = xcb_get_setup( conn );
+ xcb_screen_t *scr = NULL;
+ for( xcb_screen_iterator_t i = xcb_setup_roots_iterator( setup );
+ i.rem > 0; xcb_screen_next( &i ) )
+ {
+ if (snum == 0)
+ {
+ scr = i.data;
+ break;
+ }
+ snum--;
+ }
+
+ unsigned n = 0;
+ if( scr == NULL )
+ goto error;
+
+ xcb_randr_query_version_reply_t *v =
+ xcb_randr_query_version_reply( conn,
+ xcb_randr_query_version( conn, 1, 2 ), NULL );
+ if( v == NULL )
+ goto error;
+ msg_Dbg( obj, "using X RandR extension v%"PRIu32".%"PRIu32,
+ v->major_version, v->minor_version );
+ free( v );
+
+ xcb_randr_get_screen_resources_reply_t *r =
+ xcb_randr_get_screen_resources_reply( conn,
+ xcb_randr_get_screen_resources( conn, scr->root ), NULL );
+ if( r == NULL )
+ goto error;
+
+ const xcb_randr_output_t *outputs =
+ xcb_randr_get_screen_resources_outputs( r );
+ for( unsigned i = 0; i < r->num_outputs; i++ )
+ {
+ xcb_randr_get_output_info_reply_t *output =
+ xcb_randr_get_output_info_reply( conn,
+ xcb_randr_get_output_info( conn, outputs[i], 0 ), NULL );
+ if( output == NULL )
+ continue;
+ /* FIXME: do not count cloned outputs multiple times */
+ /* XXX: what to do with UNKNOWN state connections? */
+ n += output->connection == XCB_RANDR_CONNECTION_CONNECTED;
+ free( output );
+ }
+ free( r );
+ msg_Dbg( obj, "X randr has %u outputs", n );
+
+error:
+ xcb_disconnect( conn );
+ return n;
+}
+#endif
+
/*****************************************************************************
* Open: allocates Wall video thread output method
*****************************************************************************
@@ -394,14 +460,21 @@ static int Open( vlc_object_t *p_this )
}
}
#else
- /* TODO linux */
+ const unsigned i_monitors = CountMonitors( p_this );
+ if( i_monitors > 1 ) /* Find closest to square */
+ for( unsigned w = 1; (i_monitors / w) >= w ; w++ )
+ {
+ if( i_monitors % w )
+ continue;
+ p_sys->i_row = w;
+ p_sys->i_col = i_monitors / w;
+ }
#endif
/* By default do 2x1 */
- if( p_sys->i_col < 0 || p_sys->i_row < 0 )
- {
- p_sys->i_col = 2;
+ if( p_sys->i_row < 0 )
p_sys->i_row = 1;
- }
+ if( p_sys->i_col < 0 )
+ p_sys->i_col = 2;
var_SetInteger( p_splitter, CFG_PREFIX "cols", p_sys->i_col);
var_SetInteger( p_splitter, CFG_PREFIX "rows", p_sys->i_row);
}
More information about the vlc-devel
mailing list