changeset 11542:85e503ddf65f

runtime 'stay-on-top' functionality
author joey
date Sun, 30 Nov 2003 16:36:10 +0000
parents 753ca0c44913
children 9c3dbd952c2f
files DOCS/man/en/mplayer.1 DOCS/tech/libvo.txt DOCS/tech/slave.txt DOCS/xml/en/ports.xml DOCS/xml/en/usage.xml Gui/wm/ws.c cfg-mplayer.h etc/example.conf etc/input.conf input/input.c input/input.h libvo/mga_common.c libvo/video_out.c libvo/video_out.h libvo/vo_directx.c libvo/vo_dxr2.c libvo/vo_dxr3.c libvo/vo_gl.c libvo/vo_gl2.c libvo/vo_x11.c libvo/vo_xmga.c libvo/vo_xover.c libvo/vo_xv.c libvo/vo_xvidix.c libvo/vo_xvmc.c libvo/w32_common.c libvo/w32_common.h libvo/x11_common.c libvo/x11_common.h mplayer.c
diffstat 30 files changed, 153 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/DOCS/man/en/mplayer.1	Sun Nov 30 14:45:42 2003 +0000
+++ b/DOCS/man/en/mplayer.1	Sun Nov 30 16:36:10 2003 +0000
@@ -278,6 +278,9 @@
 mute sound
 .IPs f\ \ \ \ 
 toggle fullscreen
+.IPs T\ \ \ \ 
+toggle stay-on-top.
+Supported by drivers which use X11, except SDL, as well as directx and gl2 under Windows.
 .IPs "w and e"
 decrease/\:increase panscan range
 .IPs o\ \ \ \ 
@@ -1809,6 +1812,10 @@
 .B \-noxv (SDL only)
 Disables XVideo SDL driver.
 .TP
+.B \-ontop 
+Makes the player window stay on top other windows.
+Supported by drivers which use X11, except SDL, as well as directx and gl2 under Windows.
+.TP
 .B \-panscan <0.0\-1.0>
 Enables Pan & Scan functionality, i.e.\& in order to display a 16:9 movie
 on a 4:3 display, the sides of the movie are cropped to get a 4:3 image
--- a/DOCS/tech/libvo.txt	Sun Nov 30 14:45:42 2003 +0000
+++ b/DOCS/tech/libvo.txt	Sun Nov 30 16:36:10 2003 +0000
@@ -57,8 +57,12 @@
 	 VOCTRL_GET_EQUALIZER
 		get the current video equalizer values
 		two arguments are provided: item and value
-		item is a string, the possible values are (currenlty):
+		item is a string, the possible values are (currently):
 		    brightness, contrast, saturation, hue
+	 VOCTRL_ONTOP
+		Makes the player window stay-on-top. Only supported (currently)
+		by drivers which use X11, except SDL, as well as directx and
+		gl2 under Windows.
 
     config():	
       Set up the video system. You get the dimensions and flags.
--- a/DOCS/tech/slave.txt	Sun Nov 30 14:45:42 2003 +0000
+++ b/DOCS/tech/slave.txt	Sun Nov 30 16:36:10 2003 +0000
@@ -86,6 +86,10 @@
 get_vo_fullscreen
     Print out fullscreen status (1 == fullscreened, 0 == windowed).
 
+vo_ontop
+	Toggle stay-on-top. Supported by drivers which use X11, except SDL,
+	as well as directx and gl2 under Windows.
+
 panscan <value> [value2]
     ???
 
--- a/DOCS/xml/en/ports.xml	Sun Nov 30 14:45:42 2003 +0000
+++ b/DOCS/xml/en/ports.xml	Sun Nov 30 16:36:10 2003 +0000
@@ -283,8 +283,7 @@
 <para>Best results are achieved with the native DirectX video output driver
   (<option>-vo directx</option>) and the native Windows waveout audio driver
   (<option>-ao win32</option>)  as OpenGL does not work and SDL is known to
-  distort sound and image or crash on some systems. You can make the movie
-  window stay on top with <option>-vo directx:ontop</option>. If the image is
+  distort sound and image or crash on some systems. If the image is
   distorted, try turning off hardware acceleration with
   <option>-vo directx:noaccel</option>. Download
   <ulink url="http://www.videolan.org/vlc/dx7headers.tgz">DirectX 7 header files</ulink>
--- a/DOCS/xml/en/usage.xml	Sun Nov 30 14:45:42 2003 +0000
+++ b/DOCS/xml/en/usage.xml	Sun Nov 30 16:36:10 2003 +0000
@@ -295,6 +295,11 @@
   <para>
   Switch fullscreen mode.
   </para></listitem>
+<listitem><para><literal>vo_ontop</literal></para>
+  <para>
+  Toggle stay-on-top. Supported by drivers which use X11, except SDL,
+  as well as directx and gl2 under Windows.
+  </para></listitem>
 <listitem><para><literal>tv_step_channel</literal> (int) dir</para>
   <para>
   Select next/previous tv channel.
--- a/Gui/wm/ws.c	Sun Nov 30 14:45:42 2003 +0000
+++ b/Gui/wm/ws.c	Sun Nov 30 16:36:10 2003 +0000
@@ -779,6 +779,9 @@
  vo_x11_decoration( wsDisplay,win->WindowID,decoration );
  vo_x11_sizehint( win->X,win->Y,win->Width,win->Height,0 );
  vo_x11_setlayer( wsDisplay,win->WindowID,win->isFullScreen );
+
+if ((!(win->isFullScreen)) & vo_ontop) vo_x11_setlayer(wsDisplay, win->WindowID,1);
+
  if ( vo_wm_type == 0 && !(vo_fsmode&16) )
   XWithdrawWindow( wsDisplay,win->WindowID,wsScreen );
  XMoveResizeWindow( wsDisplay,win->WindowID,win->X,win->Y,win->Width,win->Height );
--- a/cfg-mplayer.h	Sun Nov 30 14:45:42 2003 +0000
+++ b/cfg-mplayer.h	Sun Nov 30 16:36:10 2003 +0000
@@ -63,6 +63,7 @@
 extern int vo_gamma_contrast;
 extern int vo_gamma_hue;
 extern char *vo_geometry;
+extern int vo_ontop;
 
 extern int opt_screen_size_x;
 extern int opt_screen_size_y;
@@ -181,6 +182,8 @@
 	{"ao", &audio_driver_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL},
 	{"fixed-vo", &fixed_vo, CONF_TYPE_FLAG,CONF_GLOBAL , 0, 1, NULL},
 	{"nofixed-vo", &fixed_vo, CONF_TYPE_FLAG,CONF_GLOBAL, 0, 0, NULL},
+	{"ontop", &vo_ontop, CONF_TYPE_FLAG, 0, 0, 1, NULL},
+	{"noontop", &vo_ontop, CONF_TYPE_FLAG, 0, 1, 0, NULL},
 
 	{"aop", ao_plugin_conf, CONF_TYPE_SUBCONFIG, 0, 0, 0, NULL},
 	{"dsp", "Use -ao oss:dsp_path!\n", CONF_TYPE_PRINT, CONF_NOCFG, 0, 0, NULL},
--- a/etc/example.conf	Sun Nov 30 14:45:42 2003 +0000
+++ b/etc/example.conf	Sun Nov 30 16:36:10 2003 +0000
@@ -34,6 +34,10 @@
 # monitoraspect=4:3	# standard monitor size, with square pixels
 # monitoraspect=16:9	# use this for widescreen monitor! non-square pixels
 
+# ontop=yes		# Makes the player window stay ontop
+			# Used by drivers which use X11, except SDL,
+			# as well as directx and gl2 under Windows
+
 ##
 ## Specify your preferred default skin here
 ## (skins are searched in /usr/local/share/mplayer/Skin/yourskin
--- a/etc/input.conf	Sun Nov 30 14:45:42 2003 +0000
+++ b/etc/input.conf	Sun Nov 30 16:36:10 2003 +0000
@@ -47,6 +47,7 @@
 #? sub_step +1		# immediately display next subtitle
 #? sub_step -1		#                     previous
 f vo_fullscreen
+T vo_ontop
 w panscan -0.1
 e panscan +0.1
 
--- a/input/input.c	Sun Nov 30 14:45:42 2003 +0000
+++ b/input/input.c	Sun Nov 30 16:36:10 2003 +0000
@@ -98,6 +98,7 @@
   { MP_CMD_DVB_SET_CHANNEL, "dvb_set_channel", 1, { { MP_CMD_ARG_INT, {0}}, {-1,{0}}  }},
 #endif
   { MP_CMD_VO_FULLSCREEN, "vo_fullscreen", 0, { {-1,{0}} } },
+  { MP_CMD_VO_ONTOP, "vo_ontop", 0, { {-1,{0}} } },
   { MP_CMD_SCREENSHOT, "screenshot", 0, { {-1,{0}} } },
   { MP_CMD_PANSCAN, "panscan",1,  { {MP_CMD_ARG_FLOAT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },
   { MP_CMD_LOADFILE, "loadfile", 1, { {MP_CMD_ARG_STRING, {0}}, {-1,{0}} } },
@@ -330,6 +331,7 @@
   { { JOY_BTN2, 0 }, "volume 1"},
   { { JOY_BTN3, 0 }, "volume -1"},
 #endif
+  { { 'T', 0 }, "vo_ontop" },
   { { 'f', 0 }, "vo_fullscreen" },
   { { 's', 0 }, "screenshot" },
   { { 'w', 0 }, "panscan -0.1" },
--- a/input/input.h	Sun Nov 30 14:45:42 2003 +0000
+++ b/input/input.h	Sun Nov 30 16:36:10 2003 +0000
@@ -52,6 +52,7 @@
 #define MP_CMD_GET_VO_FULLSCREEN 48
 #define MP_CMD_GET_SUB_VISIBILITY 49
 #define MP_CMD_SUB_FORCED_ONLY 50
+#define MP_CMD_VO_ONTOP 51
 
 #define MP_CMD_GUI_EVENTS       5000
 #define MP_CMD_GUI_LOADFILE     5001
--- a/libvo/mga_common.c	Sun Nov 30 14:45:42 2003 +0000
+++ b/libvo/mga_common.c	Sun Nov 30 16:36:10 2003 +0000
@@ -324,6 +324,9 @@
 #endif
 
 #ifdef VO_XMGA
+  case VOCTRL_ONTOP:
+      vo_x11_ontop();
+      return VO_TRUE;
   case VOCTRL_GET_PANSCAN:
       if ( !inited || !vo_fs ) return VO_FALSE;
       return VO_TRUE;
--- a/libvo/video_out.c	Sun Nov 30 14:45:42 2003 +0000
+++ b/libvo/video_out.c	Sun Nov 30 16:36:10 2003 +0000
@@ -40,6 +40,7 @@
 int vo_fs = 0;
 int vo_fsmode = 0;
 float vo_panscan = 0.0f;
+int vo_ontop = 0;
 
 int vo_pts=0; // for hw decoding
 float vo_fps=0; // for mp1e rte
--- a/libvo/video_out.h	Sun Nov 30 14:45:42 2003 +0000
+++ b/libvo/video_out.h	Sun Nov 30 16:36:10 2003 +0000
@@ -55,6 +55,8 @@
 // ... 21
 #define VOCTRL_START_SLICE 21
 
+#define VOCTRL_ONTOP 25
+
 // Vo can be used by xover
 #define VOCTRL_XOVERLAY_SUPPORT 22
 
--- a/libvo/vo_directx.c	Sun Nov 30 14:45:42 2003 +0000
+++ b/libvo/vo_directx.c	Sun Nov 30 16:36:10 2003 +0000
@@ -43,7 +43,6 @@
 static RECT                 rd;                     //rect of our stretched image
 static RECT                 rs;                     //rect of our source image
 static HWND                 hWnd=NULL;              //handle to the window
-static uint32_t             ontop=0;                //always in foreground
 static uint32_t image_width, image_height;          //image width and height
 static uint32_t d_image_width, d_image_height;      //image width and height zoomed 
 static uint8_t  *image=NULL;                        //image data
@@ -60,6 +59,7 @@
 extern int vo_doublebuffering;                      //tribblebuffering    
 extern int vo_fs;
 extern int vo_directrendering;
+extern int vo_ontop;
 
 /*****************************************************************************
  * DirectDraw GUIDs.
@@ -527,12 +527,12 @@
         dwUpdateFlags = DDOVER_SHOW | DDOVER_DDFX;
         /*if hardware can't do colorkeying set the window on top*/
 		if(capsDrv.dwCKeyCaps & DDCKEYCAPS_DESTOVERLAY) dwUpdateFlags |= DDOVER_KEYDESTOVERRIDE;
-        else ontop = 1;
+        else vo_ontop = 1;
 	}
 	/*calculate window rect with borders*/
 	if(!vo_fs)AdjustWindowRect(&rd_window,WS_OVERLAPPEDWINDOW|WS_SIZEBOX,0);
 
-	if((vo_fs) || (!vo_fs && ontop))hWndafter=HWND_TOPMOST;
+	if((vo_fs) || (!vo_fs && vo_ontop))hWndafter=HWND_TOPMOST;
 	else hWndafter=HWND_NOTOPMOST;
 
 	/*display the window*/
@@ -822,11 +822,6 @@
 			mp_msg(MSGT_VO,MSGL_V,"<vo_directx><INFO>disabled overlay\n");
 		    nooverlay = 1;
 		}
-		if(strstr(arg,"ontop"))
-		{
-			mp_msg(MSGT_VO,MSGL_V,"<vo_directx><INFO>window ontop\n");
-			ontop = 1;
-		}
 	}
 	if (Directx_InitDirectDraw()!= 0)return 1;          //init DirectDraw
     if (Directx_CheckPrimaryPixelformat()!=0)return 1;
@@ -1162,6 +1157,18 @@
         return query_format(*((uint32_t*)data));
 	case VOCTRL_DRAW_IMAGE:
         return put_image(data);
+    case VOCTRL_ONTOP:
+	        if(vm)
+			{
+				mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>ontop has no meaning in exclusive mode\n");
+			}
+	        else
+			{
+				if(vo_ontop) vo_ontop = 0;
+				else vo_ontop = 1;
+				Directx_ManageDisplay(0,0);
+			}
+		return VO_TRUE;
     case VOCTRL_FULLSCREEN:
 		{
 	        if(vm)
--- a/libvo/vo_dxr2.c	Sun Nov 30 14:45:42 2003 +0000
+++ b/libvo/vo_dxr2.c	Sun Nov 30 16:36:10 2003 +0000
@@ -854,6 +854,8 @@
     break;
   }
 
+  if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
+  
   // start playing
   if(ioctl(dxr2_fd, DXR2_IOC_PLAY, NULL) == 0) {
     playing = 1;
@@ -1065,6 +1067,9 @@
     flush_dxr2();
     ioctl(dxr2_fd, DXR2_IOC_PLAY, NULL);
     return VO_TRUE;
+  case VOCTRL_ONTOP:
+    vo_x11_ontop();
+    return VO_TRUE;
   case VOCTRL_FULLSCREEN:
     if(!use_ol)
       return VO_NOTIMPL;
--- a/libvo/vo_dxr3.c	Sun Nov 30 14:45:42 2003 +0000
+++ b/libvo/vo_dxr3.c	Sun Nov 30 16:36:10 2003 +0000
@@ -285,6 +285,9 @@
 		}
 		return VO_TRUE;
 #ifdef HAVE_X11
+	case VOCTRL_ONTOP:
+		vo_x11_ontop();
+		return VO_TRUE;
 	case VOCTRL_FULLSCREEN:
 		if (dxr3_overlay) {
 			vo_x11_fullscreen();
@@ -668,6 +671,9 @@
 		overlay_set_mode(overlay_data, EM8300_OVERLAY_MODE_OVERLAY);
 		overlay_set_mode(overlay_data, EM8300_OVERLAY_MODE_RECTANGLE);
 	}
+
+	if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
+
 #endif
 
 	return 0;
--- a/libvo/vo_gl.c	Sun Nov 30 14:45:42 2003 +0000
+++ b/libvo/vo_gl.c	Sun Nov 30 16:36:10 2003 +0000
@@ -207,6 +207,8 @@
 
       saver_off(mDisplay);  // turning off screen saver
 
+      if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
+
 	return 0;
 }
 
@@ -314,6 +316,9 @@
   case VOCTRL_RESUME: return (int_pause=0);
   case VOCTRL_QUERY_FORMAT:
     return query_format(*((uint32_t*)data));
+  case VOCTRL_ONTOP:
+    vo_x11_ontop();
+    return VO_TRUE;
   case VOCTRL_FULLSCREEN:
     vo_x11_fullscreen();
     return VO_TRUE;
--- a/libvo/vo_gl2.c	Sun Nov 30 14:45:42 2003 +0000
+++ b/libvo/vo_gl2.c	Sun Nov 30 16:36:10 2003 +0000
@@ -1006,6 +1006,7 @@
       return -1;
 #ifndef GL_WIN32
       saver_off(mDisplay);
+      if (vo_ontop) vo_x11_setlayer(mDisplay,vo_window, vo_ontop);
 #endif
 
 	return 0;
@@ -1172,6 +1173,13 @@
   case VOCTRL_RESUME: return (int_pause=0);
   case VOCTRL_QUERY_FORMAT:
     return query_format(*((uint32_t*)data));
+  case VOCTRL_ONTOP:
+#ifdef GL_WIN32
+    vo_w32_ontop();
+#else
+    vo_x11_ontop();
+#endif 
+    return VO_TRUE;
   case VOCTRL_FULLSCREEN:
 #ifdef GL_WIN32
     vo_w32_fullscreen();
--- a/libvo/vo_x11.c	Sun Nov 30 14:45:42 2003 +0000
+++ b/libvo/vo_x11.c	Sun Nov 30 16:36:10 2003 +0000
@@ -435,6 +435,9 @@
 #endif  
 
  saver_off(mDisplay);
+
+ if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
+
  return 0;
 }
 
@@ -657,6 +660,9 @@
       va_end(ap);
       return vo_x11_get_equalizer(data, value);
     }
+  case VOCTRL_ONTOP:
+      vo_x11_ontop();
+      return VO_TRUE;
   case VOCTRL_FULLSCREEN:
     {
       vo_x11_fullscreen();
--- a/libvo/vo_xmga.c	Sun Nov 30 14:45:42 2003 +0000
+++ b/libvo/vo_xmga.c	Sun Nov 30 16:36:10 2003 +0000
@@ -221,6 +221,8 @@
 
  saver_off(mDisplay);
 
+ if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
+
  XFlush( mDisplay );
  XSync( mDisplay,False );
  
--- a/libvo/vo_xover.c	Sun Nov 30 14:45:42 2003 +0000
+++ b/libvo/vo_xover.c	Sun Nov 30 16:36:10 2003 +0000
@@ -192,6 +192,9 @@
   XSetForeground(mDisplay, vo_gc, colorkey);
   XFillRectangle(mDisplay, vo_window, vo_gc, drwX, drwY, drwWidth,
 		 (vo_fs ? drwHeight - 1 : drwHeight));
+
+  if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
+
   /* flush, update drawable */
   XFlush(mDisplay);
 
@@ -456,6 +459,9 @@
   case VOCTRL_GET_PANSCAN:
     if ( !vo_config_count || !vo_fs ) return VO_FALSE;
     return VO_TRUE;
+  case VOCTRL_ONTOP:
+    vo_x11_ontop();
+    return VO_TRUE;
   case VOCTRL_FULLSCREEN:
     vo_x11_fullscreen();
   case VOCTRL_SET_PANSCAN:
--- a/libvo/vo_xv.c	Sun Nov 30 14:45:42 2003 +0000
+++ b/libvo/vo_xv.c	Sun Nov 30 16:36:10 2003 +0000
@@ -346,6 +346,9 @@
      mp_msg(MSGT_VO,MSGL_V, "[xv] dx: %d dy: %d dw: %d dh: %d\n",drwX,drwY,vo_dwidth,vo_dheight );
 
      saver_off(mDisplay);  // turning off screen saver
+
+     if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
+
      return 0;
 }
 
@@ -749,6 +752,9 @@
     
     return(vo_xv_get_eq(xv_port, data, value));
   }
+  case VOCTRL_ONTOP:
+    vo_x11_ontop();
+    return VO_TRUE;
   }
   return VO_NOTIMPL;
 }
--- a/libvo/vo_xvidix.c	Sun Nov 30 14:45:42 2003 +0000
+++ b/libvo/vo_xvidix.c	Sun Nov 30 16:36:10 2003 +0000
@@ -368,6 +368,8 @@
 
     panscan_calc();
 
+    if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
+
     saver_off(mDisplay); /* turning off screen saver */
 
     return(0);
@@ -466,6 +468,9 @@
   case VOCTRL_GET_PANSCAN:
       if ( !vo_config_count || !vo_fs ) return VO_FALSE;
       return VO_TRUE;
+  case VOCTRL_ONTOP:
+      vo_x11_ontop();
+      return VO_TRUE;
   case VOCTRL_FULLSCREEN:
       vo_x11_fullscreen();
   case VOCTRL_SET_PANSCAN:
--- a/libvo/vo_xvmc.c	Sun Nov 30 14:45:42 2003 +0000
+++ b/libvo/vo_xvmc.c	Sun Nov 30 16:36:10 2003 +0000
@@ -792,6 +792,8 @@
 
    mp_msg(MSGT_VO,MSGL_V, "[xvmc] dx: %d dy: %d dw: %d dh: %d\n",drwX,drwY,vo_dwidth,vo_dheight );
 
+   if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
+
    saver_off(mDisplay);  // turning off screen saver
 //end vo_xv
 
@@ -1408,6 +1410,9 @@
       //vo_xv
       case VOCTRL_GUISUPPORT:
          return VO_TRUE;
+      case VOCTRL_ONTOP:
+         vo_x11_ontop();
+	 return VO_TRUE;
       case VOCTRL_FULLSCREEN:
          vo_x11_fullscreen();
       case VOCTRL_GET_PANSCAN:
--- a/libvo/w32_common.c	Sun Nov 30 14:45:42 2003 +0000
+++ b/libvo/w32_common.c	Sun Nov 30 16:36:10 2003 +0000
@@ -146,18 +146,20 @@
 }
 
 int createRenderingContext(void) {
+    HWND layer = HWND_NOTOPMOST;
     if (wglContext) return 1;
 
+    if (vo_fs || vo_ontop) layer = HWND_TOPMOST;
     if (vo_fs) {
 	changeMode();
-	SetWindowPos(vo_hwnd, HWND_TOPMOST, 0, 0, vo_screenwidth, vo_screenheight, SWP_SHOWWINDOW);
+	SetWindowPos(vo_hwnd, layer, 0, 0, vo_screenwidth, vo_screenheight, SWP_SHOWWINDOW);
 	if (cursor) {
 	    ShowCursor(0);
 	    cursor = 0;
 	}
     } else {
 	resetMode();
-	SetWindowPos(vo_hwnd, HWND_NOTOPMOST, (vo_screenwidth - vo_dwidth) / 2, (vo_screenheight - vo_dheight) / 2, vo_dwidth, vo_dheight, SWP_SHOWWINDOW);
+	SetWindowPos(vo_hwnd, layer, (vo_screenwidth - vo_dwidth) / 2, (vo_screenheight - vo_dheight) / 2, vo_dwidth, vo_dheight, SWP_SHOWWINDOW);
 	if (!cursor) {
 	    ShowCursor(1);
 	    cursor = 1;
@@ -256,6 +258,16 @@
     createRenderingContext();
 }
 
+void vo_w32_ontop( void )
+{
+    vo_ontop = !vo_ontop;
+    if (!vo_fs) {
+	HWND layer = HWND_NOTOPMOST;
+	if (vo_ontop) layer = HWND_TOPMOST;
+	SetWindowPos(vo_hwnd, layer, (vo_screenwidth - vo_dwidth) / 2, (vo_screenheight - vo_dheight) / 2, vo_dwidth, vo_dheight, SWP_SHOWWINDOW);
+    }
+}
+
 void vo_w32_uninit() {
     mp_msg(MSGT_VO, MSGL_V, "vo: win32: uninit\n");
     resetMode();
--- a/libvo/w32_common.h	Sun Nov 30 14:45:42 2003 +0000
+++ b/libvo/w32_common.h	Sun Nov 30 16:36:10 2003 +0000
@@ -6,6 +6,7 @@
 extern HDC vo_hdc;
 extern int vo_fs;
 extern int vo_vm;
+extern int vo_ontop;
 
 extern int vo_init(void);
 extern void vo_w32_uninit(void);
--- a/libvo/x11_common.c	Sun Nov 30 14:45:42 2003 +0000
+++ b/libvo/x11_common.c	Sun Nov 30 16:36:10 2003 +0000
@@ -1050,6 +1050,9 @@
  vo_x11_decoration( mDisplay,vo_window,(vo_fs) ? 0 : 1 );
  vo_x11_sizehint( x,y,w,h,0 );
  vo_x11_setlayer( mDisplay,vo_window,vo_fs );
+
+ if ((!(vo_fs)) & vo_ontop) vo_x11_setlayer(mDisplay, vo_window,vo_ontop);
+
  if(vo_wm_type==0 && !(vo_fsmode&16))
 //    XUnmapWindow( mDisplay,vo_window );  // required for MWM
       XWithdrawWindow(mDisplay,vo_window,mScreen);
@@ -1062,6 +1065,13 @@
  XFlush( mDisplay );
 }
 
+void vo_x11_ontop( void )
+{
+ vo_ontop = (!(vo_ontop));
+
+ vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
+}
+
 /*
  * XScreensaver stuff
  */
--- a/libvo/x11_common.h	Sun Nov 30 14:45:42 2003 +0000
+++ b/libvo/x11_common.h	Sun Nov 30 16:36:10 2003 +0000
@@ -27,6 +27,7 @@
 extern int vo_wm_type;
 extern int vo_fs_type;
 extern char** vo_fstype_list;
+extern int vo_ontop;
 
 extern char *mDisplayName;
 extern Display *mDisplay;
@@ -60,6 +61,7 @@
 extern void vo_x11_clearwindow_part(Display *mDisplay, Window vo_window,
 	int img_width, int img_height, int use_fs);
 extern void vo_x11_clearwindow( Display *mDisplay, Window vo_window );
+extern void vo_x11_ontop();
 
 #endif
 
--- a/mplayer.c	Sun Nov 30 14:45:42 2003 +0000
+++ b/mplayer.c	Sun Nov 30 16:36:10 2003 +0000
@@ -736,6 +736,7 @@
 int osd_show_sub_changed = 0;
 int osd_show_percentage = 0;
 int osd_show_tv_channel = 25;
+int osd_show_ontop = 0;
 
 int rtc_fd=-1;
 
@@ -3001,6 +3002,17 @@
 #endif
 	if(video_out && vo_config_count) video_out->control(VOCTRL_FULLSCREEN, 0);
     } break;
+    case MP_CMD_VO_ONTOP:
+    {
+     if(video_out && vo_config_count) {
+       video_out->control(VOCTRL_ONTOP, 0);
+#ifdef USE_OSD
+       osd_show_ontop=10;
+       vo_osd_changed(OSDTYPE_SUBTITLE);
+#endif
+     }
+
+    } break;
     case MP_CMD_PANSCAN : {
       if ( !video_out ) break;
       if ( video_out->control( VOCTRL_GET_PANSCAN,NULL ) == VO_TRUE )
@@ -3551,6 +3563,9 @@
       if (osd_show_av_delay) {
 	  snprintf(osd_text_tmp, 63, "A-V delay: %d ms", ROUND(audio_delay*1000));
 	  osd_show_av_delay--;
+      } else if (osd_show_ontop) {
+	  snprintf(osd_text_tmp, 63, "Stay on top: %sabled", vo_ontop?"en":"dis");
+	  osd_show_ontop--;
       } else if(osd_level>=2) {
           int len = demuxer_get_time_length(demuxer);
           int percentage = -1;