changeset 14207:f8670fdf6ab1

added -wid support for vo_directx.
author joey
date Tue, 21 Dec 2004 20:33:51 +0000
parents 9c58002671d5
children 6ab3527bf137
files DOCS/man/en/mplayer.1 cfg-mplayer.h libvo/video_out.c libvo/vo_directx.c libvo/x11_common.c
diffstat 5 files changed, 34 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/DOCS/man/en/mplayer.1	Tue Dec 21 20:32:26 2004 +0000
+++ b/DOCS/man/en/mplayer.1	Tue Dec 21 20:33:51 2004 +0000
@@ -2134,6 +2134,9 @@
 sign is given after the argument it turns the value into a percentage of the
 screen size in that direction.
 It also supports the standard X11 \-geometry option format.
+If an external window is specified using the \-wid option, then the x and
+y coordinates are relative to the top-left corner of the window rather
+than the screen.
 .br
 .I NOTE:
 This option is only supported by the x11, xmga, xv, xvmc, xvidix,
@@ -2269,8 +2272,8 @@
 Enables VBI for the vesa, dfbmga and svga video output drivers.
 .
 .TP
-.B \-wid <window\ ID> (also see \-guiwid) (X11 only)
-This tells MPlayer to attach to an existing X11 window.
+.B \-wid <window\ ID> (also see \-guiwid) (X11 and DirectX only)
+This tells MPlayer to attach to an existing window.
 Useful to embed MPlayer in a browser (e.g.\& the plugger extension).
 .
 .TP
--- a/cfg-mplayer.h	Tue Dec 21 20:32:26 2004 +0000
+++ b/cfg-mplayer.h	Tue Dec 21 20:33:51 2004 +0000
@@ -75,8 +75,8 @@
 extern int stop_xscreensaver;
 extern char **vo_fstype_list;
 extern int vo_nomouse_input;
+#endif
 extern int WinID;
-#endif
 
 #ifdef HAVE_MENU
 extern int menu_startup;
@@ -272,9 +272,9 @@
 	
     {"adapter", &vo_adapter_num, CONF_TYPE_INT, CONF_RANGE, 0, 5, NULL},
     {"refreshrate",&vo_refresh_rate,CONF_TYPE_INT,CONF_RANGE, 0,100, NULL},
+	{"wid", &WinID, CONF_TYPE_INT, 0, 0, 0, NULL},
 #ifdef HAVE_X11
 	// x11,xv,xmga,xvidix
-	{"wid", &WinID, CONF_TYPE_INT, 0, 0, 0, NULL},
 	{"icelayer", "-icelayer is obsolete. Use -fstype layer:<number> instead.\n", CONF_TYPE_PRINT, 0, 0, 0, NULL},
 	{"stop-xscreensaver", &stop_xscreensaver, CONF_TYPE_FLAG, 0, 0, 1, NULL},
 	{"nostop-xscreensaver", &stop_xscreensaver, CONF_TYPE_FLAG, 0, 1, 0, NULL},
--- a/libvo/video_out.c	Tue Dec 21 20:32:26 2004 +0000
+++ b/libvo/video_out.c	Tue Dec 21 20:33:51 2004 +0000
@@ -45,6 +45,7 @@
 int vo_refresh_rate=0;
 int vo_keepaspect=1;
 int vo_rootwin=0;
+int WinID = -1;
 
 int vo_pts=0; // for hw decoding
 float vo_fps=0; // for mp1e rte
--- a/libvo/vo_directx.c	Tue Dec 21 20:32:26 2004 +0000
+++ b/libvo/vo_directx.c	Tue Dec 21 20:33:51 2004 +0000
@@ -81,6 +81,7 @@
 extern int vidmode;
 extern int vo_colorkey;
 extern float monitor_aspect;
+extern int WinID;
 
 /*****************************************************************************
  * DirectDraw GUIDs.
@@ -510,6 +511,17 @@
       rd.top=(vo_screenheight-height)/2;
       if(ShowCursor(FALSE)>=0)while(ShowCursor(FALSE)>=0){}
     }
+    else if (WinID != -1 && vo_geometry) {
+      POINT pt;
+      pt.x = vo_dx;
+      pt.y = vo_dy;
+      ClientToScreen(hWnd,&pt);  
+      width=d_image_width;
+      height=d_image_height;
+      rd.left = pt.x;
+      rd.top = pt.y;
+      while(ShowCursor(TRUE)<=0){}
+    }
     else {
       POINT pt;
       pt.x = 0;  //overlayposition relative to the window
@@ -628,6 +640,7 @@
     }       
 	
     if(!vidmode && !vo_fs){
+      if(WinID == -1) {
           RECT rdw=rd;
           AdjustWindowRect(&rdw,WS_OVERLAPPEDWINDOW|WS_SIZEBOX,FALSE);
 //          printf("window: %i %i %ix%i\n",rdw.left,rdw.top,rdw.right - rdw.left,rdw.bottom - rdw.top);      
@@ -636,18 +649,18 @@
 		  rdw.right += monitor_rect.left;
 		  rdw.bottom += monitor_rect.top;
           SetWindowPos(hWnd,(vo_ontop)?HWND_TOPMOST:(vo_rootwin?HWND_BOTTOM:HWND_NOTOPMOST),rdw.left,rdw.top,rdw.right-rdw.left,rdw.bottom-rdw.top,SWP_NOOWNERZORDER); 
+      }
     }
     else SetWindowPos(vidmode?hWnd:hWndFS,vo_rootwin?HWND_BOTTOM:HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOOWNERZORDER);
 
-  	/*for nonoverlay mode we are finished, for overlay mode we have to display the overlay first*/
-	if(nooverlay)return 0;
-
     /*make sure the overlay is inside the screen*/
     if(rd.left<0)rd.left=0;
     if(rd.right>vo_screenwidth)rd.right=vo_screenwidth;
     if(rd.top<0)rd.top=0;
     if(rd.bottom>vo_screenheight)rd.bottom=vo_screenheight;
     
+  	/*for nonoverlay mode we are finished, for overlay mode we have to display the overlay first*/
+	if(nooverlay)return 0;
 	
 //    printf("overlay: %i %i %ix%i\n",rd.left,rd.top,rd.right - rd.left,rd.bottom - rd.top);
 	ddrval = g_lpddsOverlay->lpVtbl->UpdateOverlay(g_lpddsOverlay,&rs, g_lpddsPrimary, &rd, dwUpdateFlags, &ovfx);
@@ -992,6 +1005,8 @@
     wc.lpszClassName =  "MPlayer - The Movie Player";
     wc.lpszMenuName  =  NULL;
     RegisterClass(&wc);
+    if (WinID != -1) hWnd = WinID;
+    else
     hWnd = CreateWindowEx(vidmode?WS_EX_TOPMOST:0,
         "MPlayer - The Movie Player","",(vidmode)?WS_POPUP:WS_OVERLAPPEDWINDOW| WS_SIZEBOX,
         CW_USEDEFAULT, CW_USEDEFAULT, 100, 100,NULL,NULL,hInstance,NULL);
@@ -1144,6 +1159,8 @@
 	uint32_t y = mpi->y;
 	uint32_t w = mpi->w;
 	uint32_t h = mpi->h;
+
+    if (WinID != -1) Directx_ManageDisplay();
    
     if((mpi->flags&MP_IMGFLAG_DIRECT)||(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK)) 
 	{
@@ -1232,12 +1249,15 @@
         rd.top = vo_dy;
         rd.right = rd.left + d_image_width;
         rd.bottom = rd.top + d_image_height;
+        if (WinID == -1) {
         AdjustWindowRect(&rd,WS_OVERLAPPEDWINDOW|WS_SIZEBOX,FALSE);  
         SetWindowPos(hWnd,NULL, vo_dx, vo_dy,rd.right-rd.left,rd.bottom-rd.top,SWP_SHOWWINDOW|SWP_NOOWNERZORDER); 
+        }
     }
     else ShowWindow(hWnd,SW_SHOW); 
      
     if(vo_fs && !vidmode)ShowWindow(hWndFS,SW_SHOW);   
+	if (WinID == -1)
 	SetWindowText(hWnd,title);
     
     
@@ -1380,6 +1400,7 @@
 	case VOCTRL_DRAW_IMAGE:
         return put_image(data);
     case VOCTRL_ONTOP:
+			if(WinID != -1) return VO_TRUE;
 	        if(vidmode)
 			{
 				mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>ontop has no meaning in exclusive mode\n");
@@ -1392,6 +1413,7 @@
 			}
 		return VO_TRUE;
     case VOCTRL_ROOTWIN:
+			if(WinID != -1) return VO_TRUE;
 	        if(vidmode)
 			{
 				mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>rootwin has no meaning in exclusive mode\n");
--- a/libvo/x11_common.c	Tue Dec 21 20:32:26 2004 +0000
+++ b/libvo/x11_common.c	Tue Dec 21 20:33:51 2004 +0000
@@ -75,7 +75,7 @@
 int mLocalDisplay;
 
 /* output window id */
-int WinID = -1;
+extern int WinID;
 int vo_mouse_autohide = 0;
 int vo_wm_type = 0;
 int vo_fs_type = 0; // needs to be accessible for GUI X11 code