summaryrefslogtreecommitdiffstats
path: root/libvo/x11_common.c
diff options
context:
space:
mode:
Diffstat (limited to 'libvo/x11_common.c')
-rw-r--r--libvo/x11_common.c143
1 files changed, 36 insertions, 107 deletions
diff --git a/libvo/x11_common.c b/libvo/x11_common.c
index fa655ec198..334fe41017 100644
--- a/libvo/x11_common.c
+++ b/libvo/x11_common.c
@@ -43,11 +43,14 @@
#define vo_wm_Unknown 0
#define vo_wm_NetWM 1
-#define vo_wm_KDE 2
-#define vo_wm_IceWM 3
-#define vo_wm_WMakerStyle 4
+#define vo_wm_Layered 2
-int ice_layer=12;
+#define WIN_LAYER_ONBOTTOM 2
+#define WIN_LAYER_NORMAL 4
+#define WIN_LAYER_ONTOP 6
+#define WIN_LAYER_ABOVE_DOCK 12
+
+int ice_layer=WIN_LAYER_ABOVE_DOCK;
int stop_xscreensaver=0;
static int dpms_disabled=0;
@@ -131,18 +134,6 @@ static int x11_errorhandler(Display *display, XErrorEvent *event)
#undef MSGLEN
}
-int vo_wm_string_test( char * name )
-{
- if ( !strncmp( name,"_ICEWM_TRAY",11 ) )
- { mp_dbg( MSGT_VO,MSGL_STATUS,"[x11] Detected wm is IceWM.\n" ); return vo_wm_IceWM; }
- if ( !strncmp( name,"_KDE_",5 ) )
- { mp_dbg( MSGT_VO,MSGL_STATUS,"[x11] Detected wm is KDE.\n" ); return vo_wm_KDE; }
- if ( !strncmp( name,"KWM_WIN",7 ) )
- { mp_dbg( MSGT_VO,MSGL_STATUS,"[x11] Detected wm is WindowMaker style.\n" ); return vo_wm_WMakerStyle; }
-// fprintf(stderr,"[ws] PropertyNotify ( 0x%x ) %s ( 0x%x )\n",win,name,xev.xproperty.atom );
- return vo_wm_Unknown;
-}
-
int net_wm_support_state_test( char *name )
{
mp_dbg(MSGT_VO,MSGL_DBG2, "[x11] NetWM supports %s\n",name);
@@ -158,19 +149,15 @@ int net_wm_support_state_test( char *name )
int vo_wm_detect( void )
{
Atom type;
- Window win;
XEvent xev;
- int c = 0;
+ int i;
int wm = vo_wm_Unknown;
int format;
unsigned long nitems, bytesafter;
Atom * args = NULL;
- char * name = NULL;
- int i;
if ( WinID >= 0 ) return vo_wm_Unknown;
-#if 1
// --- netwm
type=XInternAtom( mDisplay,"_NET_SUPPORTED",False );
if ( Success == XGetWindowProperty( mDisplay,mRootWin,type,0,16384,False,AnyPropertyType,&type,&format,&nitems,&bytesafter,(unsigned char **) &args ) && nitems > 0 )
@@ -179,35 +166,22 @@ int vo_wm_detect( void )
for (i = 0; i < nitems; i++)
net_wm_support |= net_wm_support_state_test (XGetAtomName (mDisplay, args[i]));
XFree( args );
- return vo_wm_NetWM;
+ if (net_wm_support)
+ return vo_wm_NetWM;
}
-#endif
-// --- other wm
- mp_dbg( MSGT_VO,MSGL_STATUS,"[x11] Create window for WM detect ...\n" );
- win=XCreateSimpleWindow( mDisplay,mRootWin,vo_screenwidth,vo_screenheight,1,1,0,0,0 );
- XSelectInput( mDisplay,win,PropertyChangeMask | StructureNotifyMask );
- XMapWindow( mDisplay,win );
- XMoveWindow( mDisplay,win,vo_screenwidth,vo_screenheight );
- do
- {
- XCheckWindowEvent( mDisplay,win,PropertyChangeMask | StructureNotifyMask,&xev );
-
- if ( xev.type == PropertyNotify )
- {
- name=XGetAtomName( mDisplay,xev.xproperty.atom );
- if ( !name ) break;
- wm=vo_wm_string_test( name );
- if ( wm != vo_wm_Unknown ) break;
- XFree( name ); name=NULL;
- }
- } while( c++ < 25 );
- if ( name ) XFree( name );
- XUnmapWindow( mDisplay,win );
- XDestroyWindow( mDisplay,win );
-#ifdef MP_DEBUG
+// -- supports layers
+ type=XInternAtom( mDisplay,"_WIN_PROTOCOLS",False );
+ if ( Success == XGetWindowProperty( mDisplay,mRootWin,type,0,16384,False,AnyPropertyType,&type,&format,&nitems,&bytesafter,(unsigned char **) &args ) && nitems > 0 )
+ {
+ mp_dbg( MSGT_VO,MSGL_STATUS,"[x11] Detected wm supports layers.\n" );
+ for (i = 0; i < nitems; i++)
+ if (!strcmp( XGetAtomName (mDisplay, args[i]), "_WIN_LAYER"));
+ return vo_wm_Layered;
+ XFree( args );
+ }
+
if ( wm == vo_wm_Unknown ) mp_dbg( MSGT_VO,MSGL_STATUS,"[x11] Unknown wm type...\n" );
-#endif
return wm;
}
@@ -628,9 +602,6 @@ int vo_x11_check_events(Display *mydisplay){
if ( !name ) break;
- wm=vo_wm_string_test(name);
- if ( wm != vo_wm_Unknown ) vo_wm_type=wm;
-
// fprintf(stderr,"[ws] PropertyNotify ( 0x%x ) %s ( 0x%x )\n",vo_window,name,Event.xproperty.atom );
XFree( name );
@@ -654,12 +625,6 @@ void vo_x11_sizehint( int x, int y, int width, int height, int max )
XSetWMNormalHints( mDisplay,vo_window,&vo_hint );
}
-#define WIN_LAYER_ONBOTTOM 2
-#define WIN_LAYER_NORMAL 4
-#define WIN_LAYER_ONTOP 6
-#define WIN_LAYER_ABOVE_DOCK 10
-
-
void vo_x11_setlayer( int layer )
{
Atom type,arg1,arg2;
@@ -671,7 +636,7 @@ void vo_x11_setlayer( int layer )
if ( WinID >= 0 ) return;
switch ( vo_wm_type )
- { case vo_wm_IceWM:
+ { case vo_wm_Layered:
{
XClientMessageEvent xev;
memset(&xev, 0, sizeof(xev));
@@ -680,9 +645,9 @@ void vo_x11_setlayer( int layer )
xev.window = vo_window;
xev.message_type = XInternAtom(mDisplay, "_WIN_LAYER", False);
xev.format = 32;
- xev.data.l[0] = layer?ice_layer:4; // if not fullscreen, stay on layer "Normal"
+ xev.data.l[0] = layer?ice_layer:WIN_LAYER_NORMAL; // if not fullscreen, stay on layer "Normal"
xev.data.l[1] = CurrentTime;
- mp_dbg( MSGT_VO,MSGL_STATUS,"[x11] IceWM style stay on top ( layer %d ).\n",xev.data.l[0] );
+ mp_dbg( MSGT_VO,MSGL_STATUS,"[x11] Layered style stay on top ( layer %d ).\n",xev.data.l[0] );
XSendEvent(mDisplay, mRootWin, False, SubstructureNotifyMask, (XEvent *) &xev);
break;
}
@@ -691,8 +656,6 @@ void vo_x11_setlayer( int layer )
XClientMessageEvent xev;
mp_dbg( MSGT_VO,MSGL_STATUS,"[x11] NET style stay on top ( layer %d ).\n",layer );
- if (net_wm_support & SUPPORT_FULLSCREEN)
- {
memset( &xev,0,sizeof( xev ) );
xev.type=ClientMessage;
xev.message_type=XInternAtom( mDisplay,"_NET_WM_STATE",False );
@@ -700,61 +663,24 @@ void vo_x11_setlayer( int layer )
xev.window=vo_window;
xev.format=32;
xev.data.l[0]=layer;
- xev.data.l[1]=XInternAtom( mDisplay,"_NET_WM_STATE_FULLSCREEN",False );
- XSendEvent( mDisplay,mRootWin,False,SubstructureRedirectMask,(XEvent*)&xev );
+
+ if (net_wm_support & SUPPORT_FULLSCREEN)
+ {
+ xev.data.l[1]=XInternAtom( mDisplay,"_NET_WM_STATE_FULLSCREEN",False );
+ XSendEvent( mDisplay,mRootWin,False,SubstructureRedirectMask,(XEvent*)&xev );
} else
if (net_wm_support & SUPPORT_STAYS_ON_TOP)
{
- memset( &xev,0,sizeof( xev ) );
- xev.type=ClientMessage;
- xev.message_type=XInternAtom( mDisplay,"_NET_WM_STATE",False );
- xev.display=mDisplay;
- xev.window=vo_window;
- xev.format=32;
- xev.data.l[0]=layer;
- xev.data.l[1]=XInternAtom( mDisplay,"_NET_WM_STATE_STAYS_ON_TOP",False );
- XSendEvent( mDisplay,mRootWin,False,SubstructureRedirectMask,(XEvent*)&xev );
+ xev.data.l[1]=XInternAtom( mDisplay,"_NET_WM_STATE_STAYS_ON_TOP",False );
+ XSendEvent( mDisplay,mRootWin,False,SubstructureRedirectMask,(XEvent*)&xev );
} else
if (net_wm_support & SUPPORT_ABOVE)
{
- memset( &xev,0,sizeof( xev ) );
- xev.type=ClientMessage;
- xev.message_type=XInternAtom( mDisplay,"_NET_WM_STATE",False );
- xev.display=mDisplay;
- xev.window=vo_window;
- xev.format=32;
- xev.data.l[0]=layer;
- xev.data.l[1]=XInternAtom( mDisplay,"_NET_WM_STATE_ABOVE",False );
- XSendEvent( mDisplay,mRootWin,False,SubstructureRedirectMask,(XEvent*)&xev );
+ xev.data.l[1]=XInternAtom( mDisplay,"_NET_WM_STATE_ABOVE",False );
+ XSendEvent( mDisplay,mRootWin,False,SubstructureRedirectMask,(XEvent*)&xev );
}
- break;
- }
- default:
- {
- type=XInternAtom( mDisplay,"_WIN_SUPPORTING_WM_CHECK",False );
- if ( Success == XGetWindowProperty( mDisplay,mRootWin,type,0,16384,False,AnyPropertyType,&type,&format,&nitems,&bytesafter,(unsigned char**)(&args) ) && nitems > 0 )
- {
- XClientMessageEvent xev;
- mp_dbg( MSGT_VO,MSGL_STATUS,"[x11] Gnome style stay on top ( layer %d ).\n",layer );
- memset( &xev,0,sizeof( xev ) );
- xev.type=ClientMessage;
- xev.window=vo_window;
- xev.message_type=XInternAtom( mDisplay,"_WIN_LAYER",False );
- xev.format=32;
- switch ( layer )
- {
- case -1: xev.data.l[0] = WIN_LAYER_ONBOTTOM; break;
- case 0: xev.data.l[0] = WIN_LAYER_NORMAL; break;
- case 1: xev.data.l[0] = WIN_LAYER_ABOVE_DOCK; break;
- }
-
- if ( layer ) XRaiseWindow( mDisplay,vo_window );
- XSendEvent( mDisplay,mRootWin,False,SubstructureNotifyMask,(XEvent*)&xev );
- XFree( args );
- return;
}
}
- }
}
void vo_x11_fullscreen( void )
@@ -763,6 +689,9 @@ void vo_x11_fullscreen( void )
if ( WinID >= 0 ) return;
+ // window manager could be changed during play
+ vo_wm_type=vo_wm_detect();
+
if ( vo_fs ){
// fs->win
if(vo_dwidth != vo_screenwidth && vo_dheight != vo_screenheight) return;