aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar atmos4 <atmos4@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-01-06 21:07:20 +0000
committerGravatar atmos4 <atmos4@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-01-06 21:07:20 +0000
commiteb2c656b52c6cf903cb0f2e8d69aab7ea424f50b (patch)
treed97ce2816e6dc9cbc7687edbb4867c8711e14d0d
parent280cb5acaf6b8d66519aa78cd9c6e69952dc3e6f (diff)
Xinerama patch number two by attila.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@4018 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--cfg-mplayer.h8
-rw-r--r--libvo/vo_gl.c3
-rw-r--r--libvo/vo_gl2.c3
-rw-r--r--libvo/vo_x11.c3
-rw-r--r--libvo/vo_xmga.c29
-rw-r--r--libvo/x11_common.c25
6 files changed, 60 insertions, 11 deletions
diff --git a/cfg-mplayer.h b/cfg-mplayer.h
index 64699e235c..8a0adadd74 100644
--- a/cfg-mplayer.h
+++ b/cfg-mplayer.h
@@ -73,6 +73,10 @@ extern char * skinName;
extern int use_old_pp;
#endif
+#ifdef HAVE_XINERAMA
+extern int xinerama_screen;
+#endif
+
/* from libvo/aspect.c */
extern float monitor_aspect;
@@ -261,6 +265,10 @@ struct config conf[]={
{"rootwin", &WinID, CONF_TYPE_FLAG, 0, -1, 0},
#endif
+#ifdef HAVE_XINERAMA
+ {"xineramascreen", &xinerama_screen, CONF_TYPE_INT, CONF_RANGE, 0, 32},
+#endif
+
#define MAIN_CONF
#include "cfg-common.h"
#undef MAIN_CONF
diff --git a/libvo/vo_gl.c b/libvo/vo_gl.c
index 2ea0bb920c..b19779a93b 100644
--- a/libvo/vo_gl.c
+++ b/libvo/vo_gl.c
@@ -181,6 +181,9 @@ init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint3
/* Map window. */
XMapWindow(mDisplay, mywindow);
+#ifdef HAVE_XINERAMA
+ vo_x11_xinerama_move(mDisplay,mywindow);
+#endif
/* Wait for map. */
do
diff --git a/libvo/vo_gl2.c b/libvo/vo_gl2.c
index b52ff7ed52..424d20bc1d 100644
--- a/libvo/vo_gl2.c
+++ b/libvo/vo_gl2.c
@@ -691,6 +691,9 @@ init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint3
/* Map window. */
XMapWindow(mDisplay, mywindow);
+#ifdef HAVE_XINERAMA
+ vo_x11_xinerama_move(mDisplay,mywindow);
+#endif
XClearWindow(mDisplay,mywindow);
/* Wait for map. */
diff --git a/libvo/vo_x11.c b/libvo/vo_x11.c
index 96ec7c2d41..266614f35f 100644
--- a/libvo/vo_x11.c
+++ b/libvo/vo_x11.c
@@ -298,6 +298,9 @@ static uint32_t init( uint32_t width,uint32_t height,uint32_t d_width,uint32_t d
XSelectInput( mDisplay,mywindow,StructureNotifyMask );
XSetStandardProperties( mDisplay,mywindow,hello,hello,None,NULL,0,&hint );
XMapWindow( mDisplay,mywindow );
+#ifdef HAVE_XINERAMA
+ vo_x11_xinerama_move(mDisplay,mywindow);
+#endif
do { XNextEvent( mDisplay,&xev ); } while ( xev.type != MapNotify || xev.xmap.event != mywindow );
XSelectInput( mDisplay,mywindow,NoEventMask );
diff --git a/libvo/vo_xmga.c b/libvo/vo_xmga.c
index e2c6b7784a..5494f683d6 100644
--- a/libvo/vo_xmga.c
+++ b/libvo/vo_xmga.c
@@ -45,6 +45,10 @@ LIBVO_EXTERN( xmga )
#include <X11/Xutil.h>
#include <errno.h>
+#ifdef HAVE_XINERAMA
+#include <X11/extensions/Xinerama.h>
+#endif
+
#include "x11_common.h"
#include "sub.h"
#include "aspect.h"
@@ -139,6 +143,31 @@ static void set_window(){
mDrawColorKey();
+#ifdef HAVE_XINERAMA
+ if(XineramaIsActive(mDisplay))
+ {
+ XineramaScreenInfo *screens;
+ int num_screens;
+ int i;
+
+ screens = XineramaQueryScreens(mDisplay,&num_screens);
+
+ /* find the screen we are on */
+ i = 0;
+ while(!(screens[i].x_org <= drwcX && screens[i].y_org <= drwcY &&
+ screens[i].x_org + screens[i].width >= drwcX &&
+ screens[i].y_org + screens[i].height >= drwcY ))
+ {
+ i++;
+ }
+
+ /* set drwcX and drwcY to the right values */
+ drwcX = drwcX - screens[i].x_org;
+ drwcY = drwcY - screens[i].y_org;
+ XFree(screens);
+ }
+
+#endif
mga_vid_config.x_org=drwcX;
mga_vid_config.y_org=drwcY;
mga_vid_config.dest_width=drwWidth;
diff --git a/libvo/x11_common.c b/libvo/x11_common.c
index ea530e60b9..8290e442ab 100644
--- a/libvo/x11_common.c
+++ b/libvo/x11_common.c
@@ -48,6 +48,12 @@ int mLocalDisplay;
/* output window id */
int WinID=-1;
+#ifdef HAVE_XINERAMA
+int xinerama_screen = 0;
+int xinerama_x = 0;
+int xinerama_y = 0;
+#endif
+
void vo_hidecursor ( Display *disp , Window win )
{
Cursor no_ptr;
@@ -149,13 +155,15 @@ int vo_init( void )
XineramaScreenInfo *screens;
int num_screens;
- mScreen = 0;
-
screens = XineramaQueryScreens(mDisplay, &num_screens);
+ if(xinerama_screen >= num_screens) xinerama_screen = 0;
if (! vo_screenwidth)
- vo_screenwidth=screens[mScreen].width;
+ vo_screenwidth=screens[xinerama_screen].width;
if (! vo_screenheight)
- vo_screenheight=screens[mScreen].height;
+ vo_screenheight=screens[xinerama_screen].height;
+ xinerama_x = screens[xinerama_screen].x_org;
+ xinerama_y = screens[xinerama_screen].y_org;
+
XFree(screens);
}
else
@@ -482,15 +490,10 @@ void saver_off(Display *mDisplay) {
#ifdef HAVE_XINERAMA
void vo_x11_xinerama_move(Display *dsp, Window w)
{
- XineramaScreenInfo *screens;
- int num_screens;
-
if(XineramaIsActive(dsp))
{
- screens = XineramaQueryScreens(dsp,&num_screens);
- /* printf("XXXX Xinerama screen: x: %hd y: %hd\n",screens[mScreen].x_org,screens[mScreen].y_org); */
- XMoveWindow(dsp,w,screens[mScreen].x_org,screens[mScreen].y_org);
- XFree(screens);
+ /* printf("XXXX Xinerama screen: x: %hd y: %hd\n",xinerama_x,xinerama_y); */
+ XMoveWindow(dsp,w,xinerama_x,xinerama_y);
}
}
#endif