diff options
author | attila <attila@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2004-06-14 04:53:03 +0000 |
---|---|---|
committer | attila <attila@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2004-06-14 04:53:03 +0000 |
commit | 0e4e21aac59563f297b3ece42cec0031fcfd47b1 (patch) | |
tree | f985373c16526ebb690273613e94b694b711b6db /libvo/x11_common.c | |
parent | b44c3a048ad7e1a7ac0e20316947783aa20ca226 (diff) |
major reindentation of x11 code try #2
note that this is plain ident output, i didnt tweak it by
hand like the last attempt.
if anyone is interested in the indent profile i used, just drop me a mail.
please contact me on irc on how to send me my share of cola,
but be aware that i will only accept swiss or german cola, as the japanese is
way to sweet :)
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@12583 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo/x11_common.c')
-rw-r--r-- | libvo/x11_common.c | 2956 |
1 files changed, 1689 insertions, 1267 deletions
diff --git a/libvo/x11_common.c b/libvo/x11_common.c index 5be6285f85..e6a28df904 100644 --- a/libvo/x11_common.c +++ b/libvo/x11_common.c @@ -57,30 +57,30 @@ #define WIN_LAYER_NORMAL 4 #define WIN_LAYER_ONTOP 6 #define WIN_LAYER_ABOVE_DOCK 10 - -int fs_layer=WIN_LAYER_ABOVE_DOCK; -static int orig_layer=0; + +int fs_layer = WIN_LAYER_ABOVE_DOCK; +static int orig_layer = 0; static int old_gravity = NorthWestGravity; -int stop_xscreensaver=0; +int stop_xscreensaver = 0; -static int dpms_disabled=0; -static int timeout_save=0; -static int kdescreensaver_was_running=0; +static int dpms_disabled = 0; +static int timeout_save = 0; +static int kdescreensaver_was_running = 0; -char* mDisplayName=NULL; -Display* mDisplay=NULL; -Window mRootWin; +char *mDisplayName = NULL; +Display *mDisplay = NULL; +Window mRootWin; int mScreen; int mLocalDisplay; /* output window id */ -int WinID=-1; +int WinID = -1; int vo_mouse_autohide = 0; int vo_wm_type = 0; static int vo_fs_type = 0; static int vo_fs_flip = 0; -char** vo_fstype_list; +char **vo_fstype_list; /* if equal to 1 means that WM is a metacity (broken as hell) */ int metacity_hack = 0; @@ -110,7 +110,7 @@ int xinerama_x = 0; int xinerama_y = 0; #endif #ifdef HAVE_XF86VM -XF86VidModeModeInfo **vidmodes=NULL; +XF86VidModeModeInfo **vidmodes = NULL; XF86VidModeModeLine modeline; #endif @@ -124,80 +124,85 @@ static int vo_x11_get_fs_type(int supported); * _NET_WM_STATE_ADD -- add state * _NET_WM_STATE_TOGGLE -- toggle */ -void vo_x11_ewmh_fullscreen( int action ) +void vo_x11_ewmh_fullscreen(int action) { - assert( action == _NET_WM_STATE_REMOVE || - action == _NET_WM_STATE_ADD || - action == _NET_WM_STATE_TOGGLE ); - - if ( vo_fs_type & vo_wm_FULLSCREEN ) - { - XEvent xev; - - /* init X event structure for _NET_WM_FULLSCREEN client msg */ - xev.xclient.type = ClientMessage; - xev.xclient.serial = 0; - xev.xclient.send_event = True; - xev.xclient.message_type = XInternAtom( mDisplay, - "_NET_WM_STATE", False ); - xev.xclient.window = vo_window; - xev.xclient.format = 32; - xev.xclient.data.l[0] = action; - xev.xclient.data.l[1] = XInternAtom( mDisplay, - "_NET_WM_STATE_FULLSCREEN", False ); - xev.xclient.data.l[2] = 0; - xev.xclient.data.l[3] = 0; - xev.xclient.data.l[4] = 0; - - /* finally send that damn thing */ - if ( !XSendEvent( mDisplay, DefaultRootWindow( mDisplay ), False, - SubstructureRedirectMask | SubstructureNotifyMask, &xev ) ) + assert(action == _NET_WM_STATE_REMOVE || + action == _NET_WM_STATE_ADD || action == _NET_WM_STATE_TOGGLE); + + if (vo_fs_type & vo_wm_FULLSCREEN) { - mp_msg( MSGT_VO,MSGL_ERR, MSGTR_EwmhFullscreenStateFailed ); + XEvent xev; + + /* init X event structure for _NET_WM_FULLSCREEN client msg */ + xev.xclient.type = ClientMessage; + xev.xclient.serial = 0; + xev.xclient.send_event = True; + xev.xclient.message_type = XInternAtom(mDisplay, + "_NET_WM_STATE", False); + xev.xclient.window = vo_window; + xev.xclient.format = 32; + xev.xclient.data.l[0] = action; + xev.xclient.data.l[1] = XInternAtom(mDisplay, + "_NET_WM_STATE_FULLSCREEN", + False); + xev.xclient.data.l[2] = 0; + xev.xclient.data.l[3] = 0; + xev.xclient.data.l[4] = 0; + + /* finally send that damn thing */ + if (!XSendEvent(mDisplay, DefaultRootWindow(mDisplay), False, + SubstructureRedirectMask | SubstructureNotifyMask, + &xev)) + { + mp_msg(MSGT_VO, MSGL_ERR, MSGTR_EwmhFullscreenStateFailed); + } } - } } -void vo_hidecursor ( Display *disp , Window win ) +void vo_hidecursor(Display * disp, Window win) { - Cursor no_ptr; - Pixmap bm_no; - XColor black,dummy; - Colormap colormap; - static unsigned char bm_no_data[] = { 0,0,0,0, 0,0,0,0 }; - - if(WinID==0) return; // do not hide, if we're playing at rootwin - - colormap = DefaultColormap(disp,DefaultScreen(disp)); - XAllocNamedColor(disp,colormap,"black",&black,&dummy); - bm_no = XCreateBitmapFromData(disp, win, bm_no_data, 8,8); - no_ptr=XCreatePixmapCursor(disp, bm_no, bm_no,&black, &black,0, 0); - XDefineCursor(disp,win,no_ptr); - XFreeCursor( disp,no_ptr ); - if (bm_no != None) - XFreePixmap(disp, bm_no); + Cursor no_ptr; + Pixmap bm_no; + XColor black, dummy; + Colormap colormap; + static unsigned char bm_no_data[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + + if (WinID == 0) + return; // do not hide, if we're playing at rootwin + + colormap = DefaultColormap(disp, DefaultScreen(disp)); + XAllocNamedColor(disp, colormap, "black", &black, &dummy); + bm_no = XCreateBitmapFromData(disp, win, bm_no_data, 8, 8); + no_ptr = XCreatePixmapCursor(disp, bm_no, bm_no, &black, &black, 0, 0); + XDefineCursor(disp, win, no_ptr); + XFreeCursor(disp, no_ptr); + if (bm_no != None) + XFreePixmap(disp, bm_no); } -void vo_showcursor( Display *disp, Window win ) -{ - if ( WinID==0 ) return; - XDefineCursor( disp,win,0 ); +void vo_showcursor(Display * disp, Window win) +{ + if (WinID == 0) + return; + XDefineCursor(disp, win, 0); } -static int x11_errorhandler(Display *display, XErrorEvent *event) +static int x11_errorhandler(Display * display, XErrorEvent * event) { #define MSGLEN 60 char msg[MSGLEN]; - - XGetErrorText(display, event->error_code, (char *)&msg, MSGLEN); - - mp_msg(MSGT_VO,MSGL_ERR,"X11 error: %s\n", msg); - - mp_msg(MSGT_VO,MSGL_V,"Type: %x, display: %x, resourceid: %x, serial: %x\n", - event->type, event->display, event->resourceid, event->serial); - mp_msg(MSGT_VO,MSGL_V,"Error code: %x, request code: %x, minor code: %x\n", - event->error_code, event->request_code, event->minor_code); - + + XGetErrorText(display, event->error_code, (char *) &msg, MSGLEN); + + mp_msg(MSGT_VO, MSGL_ERR, "X11 error: %s\n", msg); + + mp_msg(MSGT_VO, MSGL_V, + "Type: %x, display: %x, resourceid: %x, serial: %x\n", + event->type, event->display, event->resourceid, event->serial); + mp_msg(MSGT_VO, MSGL_V, + "Error code: %x, request code: %x, minor code: %x\n", + event->error_code, event->request_code, event->minor_code); + abort(); //exit_player("X11 error"); #undef MSGLEN @@ -205,278 +210,314 @@ static int x11_errorhandler(Display *display, XErrorEvent *event) void fstype_help(void) { - mp_msg(MSGT_VO, MSGL_INFO, MSGTR_AvailableFsType); - - mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "none", "don't set fullscreen window layer"); - mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "layer", "use _WIN_LAYER hint with default layer"); - mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "layer=<0..15>", "use _WIN_LAYER hint with a given layer number"); - mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "netwm", "force NETWM style"); - mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "above", "use _NETWM_STATE_ABOVE hint if available"); - mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "below", "use _NETWM_STATE_BELOW hint if available"); - mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "fullscreen", "use _NETWM_STATE_FULLSCREEN hint if availale"); - mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "stays_on_top", "use _NETWM_STATE_STAYS_ON_TOP hint if available"); - mp_msg(MSGT_VO, MSGL_INFO, "You can also negate the settings with simply putting '-' in the beginning"); + mp_msg(MSGT_VO, MSGL_INFO, MSGTR_AvailableFsType); + + mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "none", + "don't set fullscreen window layer"); + mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "layer", + "use _WIN_LAYER hint with default layer"); + mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "layer=<0..15>", + "use _WIN_LAYER hint with a given layer number"); + mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "netwm", + "force NETWM style"); + mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "above", + "use _NETWM_STATE_ABOVE hint if available"); + mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "below", + "use _NETWM_STATE_BELOW hint if available"); + mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "fullscreen", + "use _NETWM_STATE_FULLSCREEN hint if availale"); + mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "stays_on_top", + "use _NETWM_STATE_STAYS_ON_TOP hint if available"); + mp_msg(MSGT_VO, MSGL_INFO, + "You can also negate the settings with simply putting '-' in the beginning"); } static void fstype_dump(int fstype) { if (fstype) { - mp_msg(MSGT_VO, MSGL_V, "[x11] Current fstype setting honours"); - if (fstype & vo_wm_LAYER) - mp_msg(MSGT_VO, MSGL_V, " LAYER"); - if (fstype & vo_wm_FULLSCREEN) - mp_msg(MSGT_VO, MSGL_V, " FULLSCREEN"); - if (fstype & vo_wm_STAYS_ON_TOP) - mp_msg(MSGT_VO, MSGL_V, " STAYS_ON_TOP"); - if (fstype & vo_wm_ABOVE) - mp_msg(MSGT_VO, MSGL_V, " ABOVE"); - if (fstype & vo_wm_BELOW) - mp_msg(MSGT_VO, MSGL_V, " BELOW"); - mp_msg(MSGT_VO, MSGL_V, " X atoms\n"); - } - else - mp_msg(MSGT_VO, MSGL_V, "[x11] Current fstype setting doesn't honour any X atoms\n"); + mp_msg(MSGT_VO, MSGL_V, "[x11] Current fstype setting honours"); + if (fstype & vo_wm_LAYER) + mp_msg(MSGT_VO, MSGL_V, " LAYER"); + if (fstype & vo_wm_FULLSCREEN) + mp_msg(MSGT_VO, MSGL_V, " FULLSCREEN"); + if (fstype & vo_wm_STAYS_ON_TOP) + mp_msg(MSGT_VO, MSGL_V, " STAYS_ON_TOP"); + if (fstype & vo_wm_ABOVE) + mp_msg(MSGT_VO, MSGL_V, " ABOVE"); + if (fstype & vo_wm_BELOW) + mp_msg(MSGT_VO, MSGL_V, " BELOW"); + mp_msg(MSGT_VO, MSGL_V, " X atoms\n"); + } else + mp_msg(MSGT_VO, MSGL_V, + "[x11] Current fstype setting doesn't honour any X atoms\n"); } - + static int net_wm_support_state_test(Atom atom) { #define NET_WM_STATE_TEST(x) { if (atom == XA_NET_WM_STATE_##x) { mp_msg( MSGT_VO,MSGL_V, "[x11] Detected wm supports " #x " state.\n" ); return vo_wm_##x; } } - - NET_WM_STATE_TEST(FULLSCREEN); - NET_WM_STATE_TEST(ABOVE); - NET_WM_STATE_TEST(STAYS_ON_TOP); - NET_WM_STATE_TEST(BELOW); - return 0; + + NET_WM_STATE_TEST(FULLSCREEN); + NET_WM_STATE_TEST(ABOVE); + NET_WM_STATE_TEST(STAYS_ON_TOP); + NET_WM_STATE_TEST(BELOW); + return 0; } -static int x11_get_property(Atom type, Atom **args, unsigned long *nitems) +static int x11_get_property(Atom type, Atom ** args, unsigned long *nitems) { - int format; - unsigned long bytesafter; - - return (Success == XGetWindowProperty( mDisplay,mRootWin,type,0,16384, - False,AnyPropertyType,&type,&format,nitems,&bytesafter, - (unsigned char **) args ) && *nitems > 0 ); + int format; + unsigned long bytesafter; + + return (Success == + XGetWindowProperty(mDisplay, mRootWin, type, 0, 16384, False, + AnyPropertyType, &type, &format, nitems, + &bytesafter, (unsigned char **) args) + && *nitems > 0); } static int vo_wm_detect(void) { - int i; - int wm = 0; - unsigned long nitems; - Atom * args = NULL; - - if ( WinID >= 0 ) return 0; - -// -- supports layers - if (x11_get_property(XA_WIN_PROTOCOLS, &args, &nitems)) - { - mp_msg( MSGT_VO,MSGL_V,"[x11] Detected wm supports layers.\n" ); - for (i = 0; i < nitems; i++) - { - if ( args[i] == XA_WIN_LAYER) { - wm |= vo_wm_LAYER; - metacity_hack |= 1; - } else - // metacity is the only manager I know which reports support only for _WIN_LAYER - // hint in _WIN_PROTOCOLS (what's more support for it is broken) - metacity_hack |= 2; - } - XFree( args ); - if (wm && (metacity_hack == 1)) - { - // metacity reports that it supports layers, but it is not really truth :-) - wm ^= vo_wm_LAYER; - mp_msg( MSGT_VO,MSGL_V,"[x11] Using workaround for Metacity bugs.\n" ); - } - } + int i; + int wm = 0; + unsigned long nitems; + Atom *args = NULL; + + if (WinID >= 0) + return 0; +// -- supports layers + if (x11_get_property(XA_WIN_PROTOCOLS, &args, &nitems)) + { + mp_msg(MSGT_VO, MSGL_V, "[x11] Detected wm supports layers.\n"); + for (i = 0; i < nitems; i++) + { + if (args[i] == XA_WIN_LAYER) + { + wm |= vo_wm_LAYER; + metacity_hack |= 1; + } else + // metacity is the only manager I know which reports support only for _WIN_LAYER + // hint in _WIN_PROTOCOLS (what's more support for it is broken) + metacity_hack |= 2; + } + XFree(args); + if (wm && (metacity_hack == 1)) + { + // metacity reports that it supports layers, but it is not really truth :-) + wm ^= vo_wm_LAYER; + mp_msg(MSGT_VO, MSGL_V, + "[x11] Using workaround for Metacity bugs.\n"); + } + } // --- netwm - if (x11_get_property(XA_NET_SUPPORTED, &args, &nitems)) - { - mp_msg( MSGT_VO,MSGL_V,"[x11] Detected wm supports NetWM.\n" ); - for (i = 0; i < nitems; i++) - wm |= net_wm_support_state_test (args[i]); - XFree( args ); + if (x11_get_property(XA_NET_SUPPORTED, &args, &nitems)) + { + mp_msg(MSGT_VO, MSGL_V, "[x11] Detected wm supports NetWM.\n"); + for (i = 0; i < nitems; i++) + wm |= net_wm_support_state_test(args[i]); + XFree(args); #if 0 - // ugly hack for broken OpenBox _NET_WM_STATE_FULLSCREEN support - // (in their implementation it only changes internal state of window, nothing more!!!) - if (wm & vo_wm_FULLSCREEN) - { - if (x11_get_property(XA_BLACKBOX_PID, &args, &nitems)) - { - mp_msg( MSGT_VO,MSGL_V,"[x11] Detected wm is a broken OpenBox.\n" ); - wm ^= vo_wm_FULLSCREEN; - } - XFree (args); - } + // ugly hack for broken OpenBox _NET_WM_STATE_FULLSCREEN support + // (in their implementation it only changes internal state of window, nothing more!!!) + if (wm & vo_wm_FULLSCREEN) + { + if (x11_get_property(XA_BLACKBOX_PID, &args, &nitems)) + { + mp_msg(MSGT_VO, MSGL_V, + "[x11] Detected wm is a broken OpenBox.\n"); + wm ^= vo_wm_FULLSCREEN; + } + XFree(args); + } #endif - } + } - if ( wm == 0 ) mp_msg( MSGT_VO,MSGL_V,"[x11] Unknown wm type...\n" ); - return wm; -} + if (wm == 0) + mp_msg(MSGT_VO, MSGL_V, "[x11] Unknown wm type...\n"); + return wm; +} static void init_atoms(void) { - XA_INIT(_NET_SUPPORTED); - XA_INIT(_NET_WM_STATE); - XA_INIT(_NET_WM_STATE_FULLSCREEN); - XA_INIT(_NET_WM_STATE_ABOVE); - XA_INIT(_NET_WM_STATE_STAYS_ON_TOP); - XA_INIT(_NET_WM_STATE_BELOW); - XA_INIT(_NET_WM_PID); - XA_INIT(_WIN_PROTOCOLS); - XA_INIT(_WIN_LAYER); - XA_INIT(_WIN_HINTS); - XA_INIT(_BLACKBOX_PID); + XA_INIT(_NET_SUPPORTED); + XA_INIT(_NET_WM_STATE); + XA_INIT(_NET_WM_STATE_FULLSCREEN); + XA_INIT(_NET_WM_STATE_ABOVE); + XA_INIT(_NET_WM_STATE_STAYS_ON_TOP); + XA_INIT(_NET_WM_STATE_BELOW); + XA_INIT(_NET_WM_PID); + XA_INIT(_WIN_PROTOCOLS); + XA_INIT(_WIN_LAYER); + XA_INIT(_WIN_HINTS); + XA_INIT(_BLACKBOX_PID); } -int vo_init( void ) +int vo_init(void) { // int mScreen; - int depth, bpp; - unsigned int mask; + int depth, bpp; + unsigned int mask; + // char * DisplayName = ":0.0"; // Display * mDisplay; - XImage * mXImage = NULL; + XImage *mXImage = NULL; + // Window mRootWin; - XWindowAttributes attribs; - char* dispName; + XWindowAttributes attribs; + char *dispName; - if(vo_depthonscreen) return 1; // already called + if (vo_depthonscreen) + return 1; // already called - XSetErrorHandler(x11_errorhandler); + XSetErrorHandler(x11_errorhandler); #if 0 - if (!mDisplayName) - if (!(mDisplayName=getenv("DISPLAY"))) - mDisplayName=strdup(":0.0"); + if (!mDisplayName) + if (!(mDisplayName = getenv("DISPLAY"))) + mDisplayName = strdup(":0.0"); #else - dispName = XDisplayName(mDisplayName); + dispName = XDisplayName(mDisplayName); #endif - mp_msg(MSGT_VO,MSGL_V,"X11 opening display: %s\n", dispName); + mp_msg(MSGT_VO, MSGL_V, "X11 opening display: %s\n", dispName); + + mDisplay = XOpenDisplay(dispName); + if (!mDisplay) + { + mp_msg(MSGT_VO, MSGL_ERR, + "vo: couldn't open the X11 display (%s)!\n", dispName); + return 0; + } + mScreen = DefaultScreen(mDisplay); // Screen ID. + mRootWin = RootWindow(mDisplay, mScreen); // Root window ID. - mDisplay=XOpenDisplay(dispName); - if ( !mDisplay ) - { - mp_msg(MSGT_VO,MSGL_ERR,"vo: couldn't open the X11 display (%s)!\n",dispName ); - return 0; - } - mScreen=DefaultScreen( mDisplay ); // Screen ID. - mRootWin=RootWindow( mDisplay,mScreen );// Root window ID. + init_atoms(); - init_atoms(); - #ifdef HAVE_XINERAMA - if(XineramaIsActive(mDisplay)) - { - XineramaScreenInfo *screens; - int num_screens; - - screens = XineramaQueryScreens(mDisplay, &num_screens); - if(xinerama_screen >= num_screens) xinerama_screen = 0; - if (! vo_screenwidth) - vo_screenwidth=screens[xinerama_screen].width; - if (! vo_screenheight) - vo_screenheight=screens[xinerama_screen].height; - xinerama_x = screens[xinerama_screen].x_org; - xinerama_y = screens[xinerama_screen].y_org; - - XFree(screens); - } - else + if (XineramaIsActive(mDisplay)) + { + XineramaScreenInfo *screens; + int num_screens; + + screens = XineramaQueryScreens(mDisplay, &num_screens); + if (xinerama_screen >= num_screens) + xinerama_screen = 0; + if (!vo_screenwidth) + vo_screenwidth = screens[xinerama_screen].width; + if (!vo_screenheight) + vo_screenheight = screens[xinerama_screen].height; + xinerama_x = screens[xinerama_screen].x_org; + xinerama_y = screens[xinerama_screen].y_org; + + XFree(screens); + } else #endif #ifdef HAVE_XF86VM - { - int clock; - XF86VidModeGetModeLine( mDisplay,mScreen,&clock ,&modeline ); - if ( !vo_screenwidth ) vo_screenwidth=modeline.hdisplay; - if ( !vo_screenheight ) vo_screenheight=modeline.vdisplay; - } + { + int clock; + + XF86VidModeGetModeLine(mDisplay, mScreen, &clock, &modeline); + if (!vo_screenwidth) + vo_screenwidth = modeline.hdisplay; + if (!vo_screenheight) + vo_screenheight = modeline.vdisplay; + } #endif - { - if (! vo_screenwidth) - vo_screenwidth=DisplayWidth( mDisplay,mScreen ); - if (! vo_screenheight) - vo_screenheight=DisplayHeight( mDisplay,mScreen ); - } - // get color depth (from root window, or the best visual): - XGetWindowAttributes(mDisplay, mRootWin, &attribs); - depth=attribs.depth; - - if (depth != 15 && depth != 16 && depth != 24 && depth != 32) { - Visual *visual; - - depth = vo_find_depth_from_visuals(mDisplay, mScreen, &visual); - if (depth != -1) - mXImage=XCreateImage(mDisplay, visual, depth, ZPixmap, - 0, NULL, 1, 1, 8, 1); - } else - mXImage=XGetImage( mDisplay,mRootWin,0,0,1,1,AllPlanes,ZPixmap ); - - vo_depthonscreen = depth; // display depth on screen - - // get bits/pixel from XImage structure: - if (mXImage == NULL) { - mask = 0; - } else { - /* - * for the depth==24 case, the XImage structures might use - * 24 or 32 bits of data per pixel. The global variable - * vo_depthonscreen stores the amount of data per pixel in the - * XImage structure! - * - * Maybe we should rename vo_depthonscreen to (or add) vo_bpp? - */ - bpp=mXImage->bits_per_pixel; - if((vo_depthonscreen+7)/8 != (bpp+7)/8) vo_depthonscreen=bpp; // by A'rpi - mask=mXImage->red_mask|mXImage->green_mask|mXImage->blue_mask; - mp_msg(MSGT_VO,MSGL_V,"vo: X11 color mask: %X (R:%lX G:%lX B:%lX)\n", - mask,mXImage->red_mask,mXImage->green_mask,mXImage->blue_mask); - XDestroyImage( mXImage ); - } - if(((vo_depthonscreen+7)/8)==2){ - if(mask==0x7FFF) vo_depthonscreen=15; else - if(mask==0xFFFF) vo_depthonscreen=16; - } + { + if (!vo_screenwidth) + vo_screenwidth = DisplayWidth(mDisplay, mScreen); + if (!vo_screenheight) + vo_screenheight = DisplayHeight(mDisplay, mScreen); + } + // get color depth (from root window, or the best visual): + XGetWindowAttributes(mDisplay, mRootWin, &attribs); + depth = attribs.depth; + + if (depth != 15 && depth != 16 && depth != 24 && depth != 32) + { + Visual *visual; + + depth = vo_find_depth_from_visuals(mDisplay, mScreen, &visual); + if (depth != -1) + mXImage = XCreateImage(mDisplay, visual, depth, ZPixmap, + 0, NULL, 1, 1, 8, 1); + } else + mXImage = + XGetImage(mDisplay, mRootWin, 0, 0, 1, 1, AllPlanes, ZPixmap); + + vo_depthonscreen = depth; // display depth on screen + + // get bits/pixel from XImage structure: + if (mXImage == NULL) + { + mask = 0; + } else + { + /* + * for the depth==24 case, the XImage structures might use + * 24 or 32 bits of data per pixel. The global variable + * vo_depthonscreen stores the amount of data per pixel in the + * XImage structure! + * + * Maybe we should rename vo_depthonscreen to (or add) vo_bpp? + */ + bpp = mXImage->bits_per_pixel; + if ((vo_depthonscreen + 7) / 8 != (bpp + 7) / 8) + vo_depthonscreen = bpp; // by A'rpi + mask = + mXImage->red_mask | mXImage->green_mask | mXImage->blue_mask; + mp_msg(MSGT_VO, MSGL_V, + "vo: X11 color mask: %X (R:%lX G:%lX B:%lX)\n", mask, + mXImage->red_mask, mXImage->green_mask, mXImage->blue_mask); + XDestroyImage(mXImage); + } + if (((vo_depthonscreen + 7) / 8) == 2) + { + if (mask == 0x7FFF) + vo_depthonscreen = 15; + else if (mask == 0xFFFF) + vo_depthonscreen = 16; + } // XCloseDisplay( mDisplay ); /* slightly improved local display detection AST */ - if ( strncmp(dispName, "unix:", 5) == 0) - dispName += 4; - else if ( strncmp(dispName, "localhost:", 10) == 0) - dispName += 9; - if (*dispName==':' && atoi(dispName+1)<10) mLocalDisplay=1; else mLocalDisplay=0; - mp_msg(MSGT_VO,MSGL_INFO,"vo: X11 running at %dx%d with depth %d and %d bpp (\"%s\" => %s display)\n", - vo_screenwidth,vo_screenheight, - depth, vo_depthonscreen, - dispName,mLocalDisplay?"local":"remote"); - - vo_wm_type=vo_wm_detect(); - - vo_fs_type=vo_x11_get_fs_type(vo_wm_type); - - fstype_dump(vo_fs_type); - - saver_off(mDisplay); - return 1; + if (strncmp(dispName, "unix:", 5) == 0) + dispName += 4; + else if (strncmp(dispName, "localhost:", 10) == 0) + dispName += 9; + if (*dispName == ':' && atoi(dispName + 1) < 10) + mLocalDisplay = 1; + else + mLocalDisplay = 0; + mp_msg(MSGT_VO, MSGL_INFO, + "vo: X11 running at %dx%d with depth %d and %d bpp (\"%s\" => %s display)\n", + vo_screenwidth, vo_screenheight, depth, vo_depthonscreen, + dispName, mLocalDisplay ? "local" : "remote"); + + vo_wm_type = vo_wm_detect(); + + vo_fs_type = vo_x11_get_fs_type(vo_wm_type); + + fstype_dump(vo_fs_type); + + saver_off(mDisplay); + return 1; } -void vo_uninit( void ) +void vo_uninit(void) { - if (!mDisplay) - { - mp_msg(MSGT_VO, MSGL_V, "vo: x11 uninit called but X11 not inited..\n"); - return; - } + if (!mDisplay) + { + mp_msg(MSGT_VO, MSGL_V, + "vo: x11 uninit called but X11 not inited..\n"); + return; + } // if( !vo_depthonscreen ) return; - mp_msg(MSGT_VO,MSGL_V,"vo: uninit ...\n" ); - XSetErrorHandler(NULL); - XCloseDisplay( mDisplay ); - vo_depthonscreen = 0; - mDisplay=NULL; + mp_msg(MSGT_VO, MSGL_V, "vo: uninit ...\n"); + XSetErrorHandler(NULL); + XCloseDisplay(mDisplay); + vo_depthonscreen = 0; + mDisplay = NULL; } #include "../osdep/keycodes.h" @@ -485,120 +526,285 @@ void vo_uninit( void ) extern void mplayer_put_key(int code); #ifdef XF86XK_AudioPause -void vo_x11_putkey_ext(int keysym){ - switch ( keysym ) - { - case XF86XK_AudioPause: mplayer_put_key(KEY_XF86_PAUSE); break; - case XF86XK_AudioStop: mplayer_put_key(KEY_XF86_STOP); break; - case XF86XK_AudioPrev: mplayer_put_key(KEY_XF86_PREV); break; - case XF86XK_AudioNext: mplayer_put_key(KEY_XF86_NEXT); break; - default: break; - } +void vo_x11_putkey_ext(int keysym) +{ + switch (keysym) + { + case XF86XK_AudioPause: + mplayer_put_key(KEY_XF86_PAUSE); + break; + case XF86XK_AudioStop: + mplayer_put_key(KEY_XF86_STOP); + break; + case XF86XK_AudioPrev: + mplayer_put_key(KEY_XF86_PREV); + break; + case XF86XK_AudioNext: + mplayer_put_key(KEY_XF86_NEXT); + break; + default: + break; + } } #endif -void vo_x11_putkey(int key){ - switch ( key ) - { - case wsLeft: mplayer_put_key(KEY_LEFT); break; - case wsRight: mplayer_put_key(KEY_RIGHT); break; - case wsUp: mplayer_put_key(KEY_UP); break; - case wsDown: mplayer_put_key(KEY_DOWN); break; - case wsSpace: mplayer_put_key(' '); break; - case wsEscape: mplayer_put_key(KEY_ESC); break; - case wsEnter: mplayer_put_key(KEY_ENTER); break; - case wsBackSpace: mplayer_put_key(KEY_BS); break; - case wsDelete: mplayer_put_key(KEY_DELETE); break; - case wsInsert: mplayer_put_key(KEY_INSERT); break; - case wsHome: mplayer_put_key(KEY_HOME); break; - case wsEnd: mplayer_put_key(KEY_END); break; - case wsPageUp: mplayer_put_key(KEY_PAGE_UP); break; - case wsPageDown: mplayer_put_key(KEY_PAGE_DOWN); break; - case wsF1: mplayer_put_key(KEY_F+1); break; - case wsF2: mplayer_put_key(KEY_F+2); break; - case wsF3: mplayer_put_key(KEY_F+3); break; - case wsF4: mplayer_put_key(KEY_F+4); break; - case wsF5: mplayer_put_key(KEY_F+5); break; - case wsF6: mplayer_put_key(KEY_F+6); break; - case wsF7: mplayer_put_key(KEY_F+7); break; - case wsF8: mplayer_put_key(KEY_F+8); break; - case wsF9: mplayer_put_key(KEY_F+9); break; - case wsF10: mplayer_put_key(KEY_F+10); break; - case wsF11: mplayer_put_key(KEY_F+11); break; - case wsF12: mplayer_put_key(KEY_F+12); break; - case wsq: - case wsQ: mplayer_put_key('q'); break; - case wsp: - case wsP: mplayer_put_key('p'); break; - case wsMinus: - case wsGrayMinus: mplayer_put_key('-'); break; - case wsPlus: - case wsGrayPlus: mplayer_put_key('+'); break; - case wsGrayMul: - case wsMul: mplayer_put_key('*'); break; - case wsGrayDiv: - case wsDiv: mplayer_put_key('/'); break; - case wsLess: mplayer_put_key('<'); break; - case wsMore: mplayer_put_key('>'); break; - case wsGray0: mplayer_put_key(KEY_KP0); break; - case wsGrayEnd: - case wsGray1: mplayer_put_key(KEY_KP1); break; - case wsGrayDown: - case wsGray2: mplayer_put_key(KEY_KP2); break; - case wsGrayPgDn: - case wsGray3: mplayer_put_key(KEY_KP3); break; - case wsGrayLeft: - case wsGray4: mplayer_put_key(KEY_KP4); break; - case wsGray5Dup: - case wsGray5: mplayer_put_key(KEY_KP5); break; - case wsGrayRight: - case wsGray6: mplayer_put_key(KEY_KP6); break; - case wsGrayHome: - case wsGray7: mplayer_put_key(KEY_KP7); break; - case wsGrayUp: - case wsGray8: mplayer_put_key(KEY_KP8); break; - case wsGrayPgUp: - case wsGray9: mplayer_put_key(KEY_KP9); break; - case wsGrayDecimal: mplayer_put_key(KEY_KPDEC); break; - case wsGrayInsert: mplayer_put_key(KEY_KPINS); break; - case wsGrayDelete: mplayer_put_key(KEY_KPDEL); break; - case wsGrayEnter: mplayer_put_key(KEY_KPENTER); break; - case wsm: - case wsM: mplayer_put_key('m'); break; - case wso: - case wsO: mplayer_put_key('o'); break; - - case wsGrave: mplayer_put_key('`'); break; - case wsTilde: mplayer_put_key('~'); break; - case wsExclSign: mplayer_put_key('!'); break; - case wsAt: mplayer_put_key('@'); break; - case wsHash: mplayer_put_key('#'); break; - case wsDollar: mplayer_put_key('$'); break; - case wsPercent: mplayer_put_key('%'); break; - case wsCircumflex: mplayer_put_key('^'); break; - case wsAmpersand: mplayer_put_key('&'); break; - case wsobracket: mplayer_put_key('('); break; - case wscbracket: mplayer_put_key(')'); break; - case wsUnder: mplayer_put_key('_'); break; - case wsocbracket: mplayer_put_key('{'); break; - case wsccbracket: mplayer_put_key('}'); break; - case wsColon: mplayer_put_key(':'); break; - case wsSemicolon: mplayer_put_key(';'); break; - case wsDblQuote: mplayer_put_key('\"'); break; - case wsAcute: mplayer_put_key('\''); break; - case wsComma: mplayer_put_key(','); break; - case wsPoint: mplayer_put_key('.'); break; - case wsQuestSign: mplayer_put_key('?'); break; - case wsBSlash: mplayer_put_key('\\'); break; - case wsPipe: mplayer_put_key('|'); break; - case wsEqual: mplayer_put_key('='); break; - case wsosbrackets: mplayer_put_key('['); break; - case wscsbrackets: mplayer_put_key(']'); break; - - - default: if((key>='a' && key<='z')||(key>='A' && key<='Z')|| - (key>='0' && key<='9')) mplayer_put_key(key); - } +void vo_x11_putkey(int key) +{ + switch (key) + { + case wsLeft: + mplayer_put_key(KEY_LEFT); + break; + case wsRight: + mplayer_put_key(KEY_RIGHT); + break; + case wsUp: + mplayer_put_key(KEY_UP); + break; + case wsDown: + mplayer_put_key(KEY_DOWN); + break; + case wsSpace: + mplayer_put_key(' '); + break; + case wsEscape: + mplayer_put_key(KEY_ESC); + break; + case wsEnter: + mplayer_put_key(KEY_ENTER); + break; + case wsBackSpace: + mplayer_put_key(KEY_BS); + break; + case wsDelete: + mplayer_put_key(KEY_DELETE); + break; + case wsInsert: + mplayer_put_key(KEY_INSERT); + break; + case wsHome: + mplayer_put_key(KEY_HOME); + break; + case wsEnd: + mplayer_put_key(KEY_END); + break; + case wsPageUp: + mplayer_put_key(KEY_PAGE_UP); + break; + case wsPageDown: + mplayer_put_key(KEY_PAGE_DOWN); + break; + case wsF1: + mplayer_put_key(KEY_F + 1); + break; + case wsF2: + mplayer_put_key(KEY_F + 2); + break; + case wsF3: + mplayer_put_key(KEY_F + 3); + break; + case wsF4: + mplayer_put_key(KEY_F + 4); + break; + case wsF5: + mplayer_put_key(KEY_F + 5); + break; + case wsF6: + mplayer_put_key(KEY_F + 6); + break; + case wsF7: + mplayer_put_key(KEY_F + 7); + break; + case wsF8: + mplayer_put_key(KEY_F + 8); + break; + case wsF9: + mplayer_put_key(KEY_F + 9); + break; + case wsF10: + mplayer_put_key(KEY_F + 10); + break; + case wsF11: + mplayer_put_key(KEY_F + 11); + break; + case wsF12: + mplayer_put_key(KEY_F + 12); + break; + case wsq: + case wsQ: + mplayer_put_key('q'); + break; + case wsp: + case wsP: + mplayer_put_key('p'); + break; + case wsMinus: + case wsGrayMinus: + mplayer_put_key('-'); + break; + case wsPlus: + case wsGrayPlus: + mplayer_put_key('+'); + break; + case wsGrayMul: + case wsMul: + mplayer_put_key('*'); + break; + case wsGrayDiv: + case wsDiv: + mplayer_put_key('/'); + break; + case wsLess: + mplayer_put_key('<'); + break; + case wsMore: + mplayer_put_key('>'); + break; + case wsGray0: + mplayer_put_key(KEY_KP0); + break; + case wsGrayEnd: + case wsGray1: + mplayer_put_key(KEY_KP1); + break; + case wsGrayDown: + case wsGray2: + mplayer_put_key(KEY_KP2); + break; + case wsGrayPgDn: + case wsGray3: + mplayer_put_key(KEY_KP3); + break; + case wsGrayLeft: + case wsGray4: + mplayer_put_key(KEY_KP4); + break; + case wsGray5Dup: + case wsGray5: + mplayer_put_key(KEY_KP5); + break; + case wsGrayRight: + case wsGray6: + mplayer_put_key(KEY_KP6); + break; + case wsGrayHome: + case wsGray7: + mplayer_put_key(KEY_KP7); + break; + case wsGrayUp: + case wsGray8: + mplayer_put_key(KEY_KP8); + break; + case wsGrayPgUp: + case wsGray9: + mplayer_put_key(KEY_KP9); + break; + case wsGrayDecimal: + mplayer_put_key(KEY_KPDEC); + break; + case wsGrayInsert: + mplayer_put_key(KEY_KPINS); + break; + case wsGrayDelete: + mplayer_put_key(KEY_KPDEL); + break; + case wsGrayEnter: + mplayer_put_key(KEY_KPENTER); + break; + case wsm: + case wsM: + mplayer_put_key('m'); + break; + case wso: + case wsO: + mplayer_put_key('o'); + break; + + case wsGrave: + mplayer_put_key('`'); + break; + case wsTilde: + mplayer_put_key('~'); + break; + case wsExclSign: + mplayer_put_key('!'); + break; + case wsAt: + mplayer_put_key('@'); + break; + case wsHash: + mplayer_put_key('#'); + break; + case wsDollar: + mplayer_put_key('$'); + break; + case wsPercent: + mplayer_put_key('%'); + break; + case wsCircumflex: + mplayer_put_key('^'); + break; + case wsAmpersand: + mplayer_put_key('&'); + break; + case wsobracket: + mplayer_put_key('('); + break; + case wscbracket: + mplayer_put_key(')'); + break; + case wsUnder: + mplayer_put_key('_'); + break; + case wsocbracket: + mplayer_put_key('{'); + break; + case wsccbracket: + mplayer_put_key('}'); + break; + case wsColon: + mplayer_put_key(':'); + break; + case wsSemicolon: + mplayer_put_key(';'); + break; + case wsDblQuote: + mplayer_put_key('\"'); + break; + case wsAcute: + mplayer_put_key('\''); + break; + case wsComma: + mplayer_put_key(','); + break; + case wsPoint: + mplayer_put_key('.'); + break; + case wsQuestSign: + mplayer_put_key('?'); + break; + case wsBSlash: + mplayer_put_key('\\'); + break; + case wsPipe: + mplayer_put_key('|'); + break; + case wsEqual: + mplayer_put_key('='); + break; + case wsosbrackets: + mplayer_put_key('['); + break; + case wscsbrackets: + mplayer_put_key(']'); + break; + + + default: + if ((key >= 'a' && key <= 'z') || (key >= 'A' && key <= 'Z') || + (key >= '0' && key <= '9')) + mplayer_put_key(key); + } } @@ -635,525 +841,634 @@ void vo_x11_putkey(int key){ typedef struct { - long flags; - long functions; - long decorations; - long input_mode; - long state; + long flags; + long functions; + long decorations; + long input_mode; + long state; } MotifWmHints; extern MotifWmHints vo_MotifWmHints; -extern Atom vo_MotifHints; -extern int vo_depthonscreen; -extern int vo_screenwidth; -extern int vo_screenheight; +extern Atom vo_MotifHints; +extern int vo_depthonscreen; +extern int vo_screenwidth; +extern int vo_screenheight; -static MotifWmHints vo_MotifWmHints; -static Atom vo_MotifHints = None; +static MotifWmHints vo_MotifWmHints; +static Atom vo_MotifHints = None; -void vo_x11_decoration( Display * vo_Display,Window w,int d ) +void vo_x11_decoration(Display * vo_Display, Window w, int d) { - static unsigned int olddecor = MWM_DECOR_ALL; - static unsigned int oldfuncs = MWM_FUNC_MOVE | MWM_FUNC_CLOSE | MWM_FUNC_MINIMIZE | MWM_FUNC_MAXIMIZE | MWM_FUNC_RESIZE; - Atom mtype; - int mformat; - unsigned long mn,mb; - if ( !WinID ) return; - - if(vo_fsmode&8){ - XSetTransientForHint (vo_Display, w, RootWindow(vo_Display,mScreen)); - } - - vo_MotifHints=XInternAtom( vo_Display,"_MOTIF_WM_HINTS",0 ); - if ( vo_MotifHints != None ) - { - if (!d) { - MotifWmHints *mhints=NULL; - XGetWindowProperty(vo_Display,w, vo_MotifHints, 0, 20, False, - vo_MotifHints, &mtype, &mformat, &mn, - &mb, (unsigned char **)&mhints) ; - if (mhints){ - if (mhints->flags & MWM_HINTS_DECORATIONS) - olddecor = mhints->decorations; - if (mhints->flags & MWM_HINTS_FUNCTIONS) - oldfuncs = mhints->functions; - XFree (mhints); - } - } - - memset( &vo_MotifWmHints,0,sizeof( MotifWmHints ) ); - vo_MotifWmHints.flags=MWM_HINTS_FUNCTIONS | MWM_HINTS_DECORATIONS; - if ( d ) + static unsigned int olddecor = MWM_DECOR_ALL; + static unsigned int oldfuncs = + MWM_FUNC_MOVE | MWM_FUNC_CLOSE | MWM_FUNC_MINIMIZE | + MWM_FUNC_MAXIMIZE | MWM_FUNC_RESIZE; + Atom mtype; + int mformat; + unsigned long mn, mb; + + if (!WinID) + return; + + if (vo_fsmode & 8) { - vo_MotifWmHints.functions= oldfuncs; - d=olddecor; + XSetTransientForHint(vo_Display, w, + RootWindow(vo_Display, mScreen)); } + + vo_MotifHints = XInternAtom(vo_Display, "_MOTIF_WM_HINTS", 0); + if (vo_MotifHints != None) + { + if (!d) + { + MotifWmHints *mhints = NULL; + + XGetWindowProperty(vo_Display, w, vo_MotifHints, 0, 20, False, + vo_MotifHints, &mtype, &mformat, &mn, + &mb, (unsigned char **) &mhints); + if (mhints) + { + if (mhints->flags & MWM_HINTS_DECORATIONS) + olddecor = mhints->decorations; + if (mhints->flags & MWM_HINTS_FUNCTIONS) + oldfuncs = mhints->functions; + XFree(mhints); + } + } + + memset(&vo_MotifWmHints, 0, sizeof(MotifWmHints)); + vo_MotifWmHints.flags = + MWM_HINTS_FUNCTIONS | MWM_HINTS_DECORATIONS; + if (d) + { + vo_MotifWmHints.functions = oldfuncs; + d = olddecor; + } #if 0 - vo_MotifWmHints.decorations=d|((vo_fsmode&2)?0:MWM_DECOR_MENU); + vo_MotifWmHints.decorations = + d | ((vo_fsmode & 2) ? 0 : MWM_DECOR_MENU); #else - vo_MotifWmHints.decorations=d|((vo_fsmode&2)?MWM_DECOR_MENU:0); + vo_MotifWmHints.decorations = + d | ((vo_fsmode & 2) ? MWM_DECOR_MENU : 0); #endif - XChangeProperty( vo_Display,w,vo_MotifHints,vo_MotifHints,32, - PropModeReplace,(unsigned char *)&vo_MotifWmHints,(vo_fsmode&4)?4:5 ); - } + XChangeProperty(vo_Display, w, vo_MotifHints, vo_MotifHints, 32, + PropModeReplace, + (unsigned char *) &vo_MotifWmHints, + (vo_fsmode & 4) ? 4 : 5); + } } -void vo_x11_classhint( Display * display,Window window,char *name ){ - XClassHint wmClass; - pid_t pid=getpid(); - wmClass.res_name = name; - wmClass.res_class = "MPlayer"; - XSetClassHint(display,window,&wmClass); - XChangeProperty(display,window, XA_NET_WM_PID, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&pid, 1); +void vo_x11_classhint(Display * display, Window window, char *name) +{ + XClassHint wmClass; + pid_t pid = getpid(); + + wmClass.res_name = name; + wmClass.res_class = "MPlayer"; + XSetClassHint(display, window, &wmClass); + XChangeProperty(display, window, XA_NET_WM_PID, XA_CARDINAL, 32, + PropModeReplace, (unsigned char *) &pid, 1); } -Window vo_window = None; -GC vo_gc = NULL; -GC f_gc = NULL; +Window vo_window = None; +GC vo_gc = NULL; +GC f_gc = NULL; XSizeHints vo_hint; #ifdef HAVE_NEW_GUI - void vo_setwindow( Window w,GC g ) { - vo_window=w; vo_gc=g; - } +void vo_setwindow(Window w, GC g) +{ + vo_window = w; + vo_gc = g; +} #endif void vo_x11_uninit() { saver_on(mDisplay); - if(vo_window!=None) vo_showcursor( mDisplay,vo_window ); - - if (f_gc) { XFreeGC(mDisplay, f_gc); f_gc = NULL; } + if (vo_window != None) + vo_showcursor(mDisplay, vo_window); + if (f_gc) + { + XFreeGC(mDisplay, f_gc); + f_gc = NULL; + } #ifdef HAVE_NEW_GUI /* destroy window only if it's not controlled by GUI */ - if ( !use_gui ) + if (!use_gui) #endif { - if(vo_gc){ - XSetBackground( mDisplay,vo_gc,0 ); - XFreeGC( mDisplay,vo_gc ); - vo_gc=NULL; - } - if(vo_window!=None){ - XClearWindow( mDisplay,vo_window ); - if (WinID < 0){ - XEvent xev; - XUnmapWindow( mDisplay,vo_window ); - XDestroyWindow(mDisplay, vo_window); - do { XNextEvent( mDisplay,&xev ); } while ( xev.type != DestroyNotify || xev.xdestroywindow.event != vo_window ); - } - vo_window=None; - } - vo_fs=0; - vo_old_width=vo_old_height=0; + if (vo_gc) + { + XSetBackground(mDisplay, vo_gc, 0); + XFreeGC(mDisplay, vo_gc); + vo_gc = NULL; + } + if (vo_window != None) + { + XClearWindow(mDisplay, vo_window); + if (WinID < 0) + { + XEvent xev; + + XUnmapWindow(mDisplay, vo_window); + XDestroyWindow(mDisplay, vo_window); + do + { + XNextEvent(mDisplay, &xev); + } + while (xev.type != DestroyNotify + || xev.xdestroywindow.event != vo_window); + } + vo_window = None; + } + vo_fs = 0; + vo_old_width = vo_old_height = 0; } } - int vo_mouse_timer_const = 30; +int vo_mouse_timer_const = 30; static int vo_mouse_counter = 30; -int vo_x11_check_events(Display *mydisplay){ - int ret=0; - XEvent Event; - char buf[100]; - KeySym keySym; - static XComposeStatus stat; +int vo_x11_check_events(Display * mydisplay) +{ + int ret = 0; + XEvent Event; + char buf[100]; + KeySym keySym; + static XComposeStatus stat; // unsigned long vo_KeyTable[512]; - if ( ( vo_mouse_autohide )&&( --vo_mouse_counter == 0 ) ) vo_hidecursor( mydisplay,vo_window ); - - while ( XPending( mydisplay ) ) - { - XNextEvent( mydisplay,&Event ); - #ifdef HAVE_NEW_GUI - if ( use_gui ) - { - guiGetEvent( 0,(char*)&Event ); - if ( vo_window != Event.xany.window ) continue; - } - #endif + if ((vo_mouse_autohide) && (--vo_mouse_counter == 0)) + vo_hidecursor(mydisplay, vo_window); + + while (XPending(mydisplay)) + { + XNextEvent(mydisplay, &Event); +#ifdef HAVE_NEW_GUI + if (use_gui) + { + guiGetEvent(0, (char *) &Event); + if (vo_window != Event.xany.window) + continue; + } +#endif // printf("\rEvent.type=%X \n",Event.type); - switch( Event.type ) - { - case Expose: - ret|=VO_EVENT_EXPOSE; - break; - case ConfigureNotify: -// if (!vo_fs && (Event.xconfigure.width == vo_screenwidth || Event.xconfigure.height == vo_screenheight)) break; -// if (vo_fs && Event.xconfigure.width != vo_screenwidth && Event.xconfigure.height != vo_screenheight) break; - if ( vo_window == None ) break; - vo_dwidth=Event.xconfigure.width; - vo_dheight=Event.xconfigure.height; + switch (Event.type) + { + case Expose: + ret |= VO_EVENT_EXPOSE; + break; + case ConfigureNotify: +// if (!vo_fs && (Event.xconfigure.width == vo_screenwidth || Event.xconfigure.height == vo_screenheight)) break; +// if (vo_fs && Event.xconfigure.width != vo_screenwidth && Event.xconfigure.height != vo_screenheight) break; + if (vo_window == None) + break; + vo_dwidth = Event.xconfigure.width; + vo_dheight = Event.xconfigure.height; #if 0 - /* when resizing, x and y are zero :( */ - vo_dx=Event.xconfigure.x; - vo_dy=Event.xconfigure.y; + /* when resizing, x and y are zero :( */ + vo_dx = Event.xconfigure.x; + vo_dy = Event.xconfigure.y; #else - { - Window root; - int foo; - Window win; - XGetGeometry(mydisplay, vo_window, &root, &foo, &foo, - &foo/*width*/, &foo/*height*/, &foo, &foo); - XTranslateCoordinates(mydisplay, vo_window, root, 0, 0, - &vo_dx, &vo_dy, &win); - } + { + Window root; + int foo; + Window win; + + XGetGeometry(mydisplay, vo_window, &root, &foo, &foo, + &foo /*width */ , &foo /*height */ , &foo, + &foo); + XTranslateCoordinates(mydisplay, vo_window, root, 0, 0, + &vo_dx, &vo_dy, &win); + } +#endif + ret |= VO_EVENT_RESIZE; + break; + case KeyPress: + { + int key; + + XLookupString(&Event.xkey, buf, sizeof(buf), &keySym, + &stat); +#ifdef XF86XK_AudioPause + vo_x11_putkey_ext(keySym); +#endif + key = + ((keySym & 0xff00) != + 0 ? ((keySym & 0x00ff) + 256) : (keySym)); +#ifdef HAVE_NEW_GUI + if ((use_gui) && (key == wsEnter)) + break; +#endif + vo_x11_putkey(key); + ret |= VO_EVENT_KEYPRESS; + } + break; + case MotionNotify: + if (vo_mouse_autohide) + { + vo_showcursor(mydisplay, vo_window); + vo_mouse_counter = vo_mouse_timer_const; + } + break; + case ButtonPress: + if (vo_mouse_autohide) + { + vo_showcursor(mydisplay, vo_window); + vo_mouse_counter = vo_mouse_timer_const; + } + // Ignore mouse whell press event + if (Event.xbutton.button > 3) + { + mplayer_put_key(MOUSE_BTN0 + Event.xbutton.button - 1); + break; + } +#ifdef HAVE_NEW_GUI + // Ignor mouse button 1 - 3 under gui + if (use_gui && (Event.xbutton.button >= 1) + && (Event.xbutton.button <= 3)) + break; #endif - ret|=VO_EVENT_RESIZE; - break; - case KeyPress: - { - int key; - XLookupString( &Event.xkey,buf,sizeof(buf),&keySym,&stat ); - #ifdef XF86XK_AudioPause - vo_x11_putkey_ext( keySym ); - #endif - key=( (keySym&0xff00) != 0?( (keySym&0x00ff) + 256 ):( keySym ) ); - #ifdef HAVE_NEW_GUI - if ( ( use_gui )&&( key == wsEnter ) ) break; - #endif - vo_x11_putkey( key ); - ret|=VO_EVENT_KEYPRESS; - } - break; - case MotionNotify: - if ( vo_mouse_autohide ) { vo_showcursor( mydisplay,vo_window ); vo_mouse_counter=vo_mouse_timer_const; } - break; - case ButtonPress: - if ( vo_mouse_autohide ) { vo_showcursor( mydisplay,vo_window ); vo_mouse_counter=vo_mouse_timer_const; } - // Ignore mouse whell press event - if(Event.xbutton.button > 3) { - mplayer_put_key(MOUSE_BTN0+Event.xbutton.button-1); - break; - } - #ifdef HAVE_NEW_GUI - // Ignor mouse button 1 - 3 under gui - if ( use_gui && ( Event.xbutton.button >= 1 )&&( Event.xbutton.button <= 3 ) ) break; - #endif - mplayer_put_key((MOUSE_BTN0+Event.xbutton.button-1)|MP_KEY_DOWN); - break; - case ButtonRelease: - if ( vo_mouse_autohide ) { vo_showcursor( mydisplay,vo_window ); vo_mouse_counter=vo_mouse_timer_const; } - #ifdef HAVE_NEW_GUI - // Ignor mouse button 1 - 3 under gui - if ( use_gui && ( Event.xbutton.button >= 1 )&&( Event.xbutton.button <= 3 ) ) break; - #endif - mplayer_put_key(MOUSE_BTN0+Event.xbutton.button-1); - break; - case PropertyNotify: - { - char * name = XGetAtomName( mydisplay,Event.xproperty.atom ); - - if ( !name ) break; - + mplayer_put_key((MOUSE_BTN0 + Event.xbutton.button - + 1) | MP_KEY_DOWN); + break; + case ButtonRelease: + if (vo_mouse_autohide) + { + vo_showcursor(mydisplay, vo_window); + vo_mouse_counter = vo_mouse_timer_const; + } +#ifdef HAVE_NEW_GUI + // Ignor mouse button 1 - 3 under gui + if (use_gui && (Event.xbutton.button >= 1) + && (Event.xbutton.button <= 3)) + break; +#endif + mplayer_put_key(MOUSE_BTN0 + Event.xbutton.button - 1); + break; + case PropertyNotify: + { + char *name = + XGetAtomName(mydisplay, Event.xproperty.atom); + + if (!name) + break; + // fprintf(stderr,"[ws] PropertyNotify ( 0x%x ) %s ( 0x%x )\n",vo_window,name,Event.xproperty.atom ); - - XFree( name ); - } - break; - case MapNotify: - vo_hint.win_gravity = old_gravity; - XSetWMNormalHints( mDisplay,vo_window,&vo_hint ); - vo_fs_flip = 0; - break; - } - } - return ret; + + XFree(name); + } + break; + case MapNotify: + vo_hint.win_gravity = old_gravity; + XSetWMNormalHints(mDisplay, vo_window, &vo_hint); + vo_fs_flip = 0; + break; + } + } + return ret; } -void vo_x11_sizehint( int x, int y, int width, int height, int max ) +void vo_x11_sizehint(int x, int y, int width, int height, int max) { - vo_hint.flags=PPosition | PSize | PWinGravity; - if(vo_keepaspect) - { - vo_hint.flags |= PAspect; - vo_hint.min_aspect.x = width; - vo_hint.min_aspect.y = height; - vo_hint.max_aspect.x = width; - vo_hint.max_aspect.y = height; - } - - vo_hint.x=x; vo_hint.y=y; vo_hint.width=width; vo_hint.height=height; - if ( max ) - { - vo_hint.max_width=width; vo_hint.max_height=height; - vo_hint.flags|=PMaxSize; - } else { vo_hint.max_width=0; vo_hint.max_height=0; } - - // set min height/width to 4 to avoid off by one errors - // and because mga_vid requires a minial size of 4 pixel - vo_hint.min_width = vo_hint.min_height = 4; - vo_hint.flags |= PMinSize; - - vo_hint.win_gravity=StaticGravity; - XSetWMNormalHints( mDisplay,vo_window,&vo_hint ); + vo_hint.flags = PPosition | PSize | PWinGravity; + if (vo_keepaspect) + { + vo_hint.flags |= PAspect; + vo_hint.min_aspect.x = width; + vo_hint.min_aspect.y = height; + vo_hint.max_aspect.x = width; + vo_hint.max_aspect.y = height; + } + + vo_hint.x = x; + vo_hint.y = y; + vo_hint.width = width; + vo_hint.height = height; + if (max) + { + vo_hint.max_width = width; + vo_hint.max_height = height; + vo_hint.flags |= PMaxSize; + } else + { + vo_hint.max_width = 0; + vo_hint.max_height = 0; + } + + // set min height/width to 4 to avoid off by one errors + // and because mga_vid requires a minial size of 4 pixel + vo_hint.min_width = vo_hint.min_height = 4; + vo_hint.flags |= PMinSize; + + vo_hint.win_gravity = StaticGravity; + XSetWMNormalHints(mDisplay, vo_window, &vo_hint); } static int vo_x11_get_gnome_layer(Display * mDisplay, Window win) { - Atom type; - int format; - unsigned long nitems; - unsigned long bytesafter; - unsigned short *args = NULL; - - if (XGetWindowProperty (mDisplay, win, XA_WIN_LAYER, 0, 16384, - False, AnyPropertyType, &type, &format, &nitems, - &bytesafter, (unsigned char **) &args) == Success - && nitems > 0 && args) - { - mp_msg (MSGT_VO, MSGL_V, "[x11] original window layer is %d.\n", *args); - return *args; - } - return WIN_LAYER_NORMAL; + Atom type; + int format; + unsigned long nitems; + unsigned long bytesafter; + unsigned short *args = NULL; + + if (XGetWindowProperty(mDisplay, win, XA_WIN_LAYER, 0, 16384, + False, AnyPropertyType, &type, &format, &nitems, + &bytesafter, + (unsigned char **) &args) == Success + && nitems > 0 && args) + { + mp_msg(MSGT_VO, MSGL_V, "[x11] original window layer is %d.\n", + *args); + return *args; + } + return WIN_LAYER_NORMAL; } // -Window vo_x11_create_smooth_window( Display *mDisplay, Window mRoot, Visual *vis, int x, int y, unsigned int width, unsigned int height, int depth, Colormap col_map) +Window vo_x11_create_smooth_window(Display * mDisplay, Window mRoot, + Visual * vis, int x, int y, + unsigned int width, unsigned int height, + int depth, Colormap col_map) { - unsigned long xswamask = CWBackingStore | CWBorderPixel; - XSetWindowAttributes xswa; - Window ret_win; - - if (col_map!=CopyFromParent) - { - xswa.colormap = col_map; - xswamask|=CWColormap; - } - xswa.background_pixel = 0; - xswa.border_pixel = 0; - xswa.backing_store = Always; - xswa.bit_gravity = StaticGravity; - - ret_win = XCreateWindow(mDisplay, mRootWin, x, y, width, height, 0, depth, - CopyFromParent, vis, xswamask , &xswa); - if (!f_gc) f_gc=XCreateGC (mDisplay, ret_win, 0, 0); - XSetForeground (mDisplay, f_gc, 0); - - return ret_win; + unsigned long xswamask = CWBackingStore | CWBorderPixel; + XSetWindowAttributes xswa; + Window ret_win; + + if (col_map != CopyFromParent) + { + xswa.colormap = col_map; + xswamask |= CWColormap; + } + xswa.background_pixel = 0; + xswa.border_pixel = 0; + xswa.backing_store = Always; + xswa.bit_gravity = StaticGravity; + + ret_win = + XCreateWindow(mDisplay, mRootWin, x, y, width, height, 0, depth, + CopyFromParent, vis, xswamask, &xswa); + if (!f_gc) + f_gc = XCreateGC(mDisplay, ret_win, 0, 0); + XSetForeground(mDisplay, f_gc, 0); + + return ret_win; } - -void vo_x11_clearwindow_part(Display *mDisplay, Window vo_window, int img_width, int img_height, int use_fs) + +void vo_x11_clearwindow_part(Display * mDisplay, Window vo_window, + int img_width, int img_height, int use_fs) { - int u_dheight, u_dwidth, left_ov, left_ov2; - - if (!f_gc) return; - - u_dheight = use_fs?vo_screenheight:vo_dheight; - u_dwidth = use_fs?vo_screenwidth:vo_dwidth; - if ((u_dheight<=img_height) && (u_dwidth<=img_width)) return; - - left_ov = (u_dheight - img_height)/2; - left_ov2 = (u_dwidth - img_width)/2; - - XFillRectangle(mDisplay, vo_window, f_gc, 0, 0, u_dwidth, left_ov); - XFillRectangle(mDisplay, vo_window, f_gc, 0, u_dheight-left_ov-1, u_dwidth, left_ov+1); - - if (u_dwidth>img_width) - { - XFillRectangle(mDisplay, vo_window, f_gc, 0, left_ov, left_ov2, img_height); - XFillRectangle(mDisplay, vo_window, f_gc, u_dwidth-left_ov2-1, left_ov, left_ov2, img_height); - } - - XFlush(mDisplay); + int u_dheight, u_dwidth, left_ov, left_ov2; + + if (!f_gc) + return; + + u_dheight = use_fs ? vo_screenheight : vo_dheight; + u_dwidth = use_fs ? vo_screenwidth : vo_dwidth; + if ((u_dheight <= img_height) && (u_dwidth <= img_width)) + return; + + left_ov = (u_dheight - img_height) / 2; + left_ov2 = (u_dwidth - img_width) / 2; + + XFillRectangle(mDisplay, vo_window, f_gc, 0, 0, u_dwidth, left_ov); + XFillRectangle(mDisplay, vo_window, f_gc, 0, u_dheight - left_ov - 1, + u_dwidth, left_ov + 1); + + if (u_dwidth > img_width) + { + XFillRectangle(mDisplay, vo_window, f_gc, 0, left_ov, left_ov2, + img_height); + XFillRectangle(mDisplay, vo_window, f_gc, u_dwidth - left_ov2 - 1, + left_ov, left_ov2, img_height); + } + + XFlush(mDisplay); } -void vo_x11_clearwindow( Display *mDisplay, Window vo_window ) +void vo_x11_clearwindow(Display * mDisplay, Window vo_window) { - if (!f_gc) return; - XFillRectangle(mDisplay, vo_window, f_gc, 0, 0, vo_screenwidth, vo_screenheight); - // - XFlush(mDisplay); + if (!f_gc) + return; + XFillRectangle(mDisplay, vo_window, f_gc, 0, 0, vo_screenwidth, + vo_screenheight); + // + XFlush(mDisplay); } - -void vo_x11_setlayer( Display * mDisplay,Window vo_window,int layer ) + +void vo_x11_setlayer(Display * mDisplay, Window vo_window, int layer) { - if (WinID >= 0) return; - - if ( vo_fs_type & vo_wm_LAYER ) - { - XClientMessageEvent xev; - - if (!orig_layer) orig_layer=vo_x11_get_gnome_layer( mDisplay, vo_window ); - - memset(&xev, 0, sizeof(xev)); - xev.type = ClientMessage; - xev.display= mDisplay; - xev.window = vo_window; - xev.message_type = XA_WIN_LAYER; - xev.format = 32; - xev.data.l[0] = layer?fs_layer:orig_layer; // if not fullscreen, stay on default layer - xev.data.l[1] = CurrentTime; - mp_msg( MSGT_VO,MSGL_V,"[x11] Layered style stay on top (layer %d).\n",xev.data.l[0] ); - XSendEvent(mDisplay, mRootWin, False, SubstructureNotifyMask, (XEvent *) &xev); - } else - if ( vo_fs_type & vo_wm_NETWM ) - { - XClientMessageEvent xev; - char *state; - - memset( &xev,0,sizeof( xev ) ); - xev.type=ClientMessage; - xev.message_type=XA_NET_WM_STATE; - xev.display=mDisplay; - xev.window=vo_window; - xev.format=32; - xev.data.l[0]=layer; - - if ( vo_fs_type & vo_wm_STAYS_ON_TOP ) - xev.data.l[1]=XA_NET_WM_STATE_STAYS_ON_TOP; - else - if ( vo_fs_type & vo_wm_ABOVE ) - xev.data.l[1]=XA_NET_WM_STATE_ABOVE; - else - if ( vo_fs_type & vo_wm_FULLSCREEN ) - xev.data.l[1]=XA_NET_WM_STATE_FULLSCREEN; - else - if ( vo_fs_type & vo_wm_BELOW ) - // This is not fallback. We can safely assume that situation where - // only NETWM_STATE_BELOW is supported and others not, doesn't exist. - xev.data.l[1]=XA_NET_WM_STATE_BELOW; - - XSendEvent( mDisplay,mRootWin,False,SubstructureRedirectMask,(XEvent*)&xev ); - state = XGetAtomName (mDisplay, xev.data.l[1]); - mp_msg( MSGT_VO,MSGL_V,"[x11] NET style stay on top (layer %d). Using state %s.\n",layer,state ); - XFree (state); - } + if (WinID >= 0) + return; + + if (vo_fs_type & vo_wm_LAYER) + { + XClientMessageEvent xev; + + if (!orig_layer) + orig_layer = vo_x11_get_gnome_layer(mDisplay, vo_window); + + memset(&xev, 0, sizeof(xev)); + xev.type = ClientMessage; + xev.display = mDisplay; + xev.window = vo_window; + xev.message_type = XA_WIN_LAYER; + xev.format = 32; + xev.data.l[0] = layer ? fs_layer : orig_layer; // if not fullscreen, stay on default layer + xev.data.l[1] = CurrentTime; + mp_msg(MSGT_VO, MSGL_V, + "[x11] Layered style stay on top (layer %d).\n", + xev.data.l[0]); + XSendEvent(mDisplay, mRootWin, False, SubstructureNotifyMask, + (XEvent *) & xev); + } else if (vo_fs_type & vo_wm_NETWM) + { + XClientMessageEvent xev; + char *state; + + memset(&xev, 0, sizeof(xev)); + xev.type = ClientMessage; + xev.message_type = XA_NET_WM_STATE; + xev.display = mDisplay; + xev.window = vo_window; + xev.format = 32; + xev.data.l[0] = layer; + + if (vo_fs_type & vo_wm_STAYS_ON_TOP) + xev.data.l[1] = XA_NET_WM_STATE_STAYS_ON_TOP; + else if (vo_fs_type & vo_wm_ABOVE) + xev.data.l[1] = XA_NET_WM_STATE_ABOVE; + else if (vo_fs_type & vo_wm_FULLSCREEN) + xev.data.l[1] = XA_NET_WM_STATE_FULLSCREEN; + else if (vo_fs_type & vo_wm_BELOW) + // This is not fallback. We can safely assume that situation where + // only NETWM_STATE_BELOW is supported and others not, doesn't exist. + xev.data.l[1] = XA_NET_WM_STATE_BELOW; + + XSendEvent(mDisplay, mRootWin, False, SubstructureRedirectMask, + (XEvent *) & xev); + state = XGetAtomName(mDisplay, xev.data.l[1]); + mp_msg(MSGT_VO, MSGL_V, + "[x11] NET style stay on top (layer %d). Using state %s.\n", + layer, state); + XFree(state); + } } static int vo_x11_get_fs_type(int supported) { - int i; - int type = supported; - - if (vo_fstype_list) { - i = 0; - for (i = 0; vo_fstype_list[i]; i++) + int i; + int type = supported; + + if (vo_fstype_list) { - int neg = 0; - char * arg = vo_fstype_list[i]; - - if (vo_fstype_list[i][0] == '-') - { - neg = 1; - arg = vo_fstype_list[i] + 1; - } - - if (!strncmp(arg, "layer", 5)) - { - if (!neg && (arg[5] == '=')) + i = 0; + for (i = 0; vo_fstype_list[i]; i++) { - char *endptr = NULL; - int layer = strtol(vo_fstype_list[i]+6, &endptr, 10); - - if (endptr && *endptr == '\0' && layer >= 0 && layer <= 15) - fs_layer = layer; + int neg = 0; + char *arg = vo_fstype_list[i]; + + if (vo_fstype_list[i][0] == '-') + { + neg = 1; + arg = vo_fstype_list[i] + 1; + } + + if (!strncmp(arg, "layer", 5)) + { + if (!neg && (arg[5] == '=')) + { + char *endptr = NULL; + int layer = strtol(vo_fstype_list[i] + 6, &endptr, 10); + + if (endptr && *endptr == '\0' && layer >= 0 + && layer <= 15) + fs_layer = layer; + } + if (neg) + type &= ~vo_wm_LAYER; + else + type |= vo_wm_LAYER; + } else if (!strcmp(arg, "above")) + { + if (neg) + type &= ~vo_wm_ABOVE; + else + type |= vo_wm_ABOVE; + } else if (!strcmp(arg, "fullscreen")) + { + if (neg) + type &= ~vo_wm_FULLSCREEN; + else + type |= vo_wm_FULLSCREEN; + } else if (!strcmp(arg, "stays_on_top")) + { + if (neg) + type &= ~vo_wm_STAYS_ON_TOP; + else + type |= vo_wm_STAYS_ON_TOP; + } else if (!strcmp(arg, "below")) + { + if (neg) + type &= ~vo_wm_BELOW; + else + type |= vo_wm_BELOW; + } else if (!strcmp(arg, "netwm")) + { + if (neg) + type &= ~vo_wm_NETWM; + else + type |= vo_wm_NETWM; + } else if (!strcmp(arg, "none")) + return 0; } - if (neg) - type &= ~vo_wm_LAYER; - else - type |= vo_wm_LAYER; - } - else if (!strcmp(arg, "above")) - { - if (neg) - type &= ~vo_wm_ABOVE; - else - type |= vo_wm_ABOVE; - } else if (!strcmp(arg, "fullscreen")) - { - if (neg) - type &= ~vo_wm_FULLSCREEN; - else - type |= vo_wm_FULLSCREEN; - } else if (!strcmp(arg, "stays_on_top")) - { - if (neg) - type &= ~vo_wm_STAYS_ON_TOP; - else - type |= vo_wm_STAYS_ON_TOP; - } else if (!strcmp(arg, "below")) - { - if (neg) - type &= ~vo_wm_BELOW; - else - type |= vo_wm_BELOW; - } else if (!strcmp(arg, "netwm")) - { - if (neg) - type &= ~vo_wm_NETWM; - else - type |= vo_wm_NETWM; - } else if (!strcmp(arg, "none")) return 0; } - } - return type; + return type; } - -void vo_x11_fullscreen( void ) + +void vo_x11_fullscreen(void) { - int x,y,w,h; - - if ( WinID >= 0 || vo_fs_flip) return; - - if ( vo_fs ){ - // fs->win - vo_x11_ewmh_fullscreen( _NET_WM_STATE_REMOVE ); // removes fullscreen state if wm supports EWMH - - if(vo_dwidth != vo_screenwidth && vo_dheight != vo_screenheight) return; - vo_fs=VO_FALSE; - x=vo_old_x; y=vo_old_y; w=vo_old_width; h=vo_old_height; - } else { - // win->fs - vo_x11_ewmh_fullscreen( _NET_WM_STATE_ADD ); // sends fullscreen state to be added if wm supports EWMH - - if(vo_old_width && - (vo_dwidth==vo_screenwidth && vo_dwidth!=vo_old_width) && - (vo_dheight==vo_screenheight && vo_dheight!=vo_old_height) ) return; - vo_fs=VO_TRUE; - vo_old_x=vo_dx; vo_old_y=vo_dy; vo_old_width=vo_dwidth; vo_old_height=vo_dheight; - x=0; y=0; w=vo_screenwidth; h=vo_screenheight; - - } - { - long dummy; - XGetWMNormalHints(mDisplay, vo_window, &vo_hint, &dummy); - if (!(vo_hint.flags & PWinGravity)) - old_gravity = NorthWestGravity; - else - old_gravity = vo_hint.win_gravity; - } - if(vo_wm_type==0 && !(vo_fsmode&16)) { - XUnmapWindow( mDisplay,vo_window ); // required for MWM - XWithdrawWindow(mDisplay,vo_window,mScreen); - vo_fs_flip = 1; - } - - 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); - - XMoveResizeWindow( mDisplay,vo_window,x,y,w,h ); + int x, y, w, h; + + if (WinID >= 0 || vo_fs_flip) + return; + + if (vo_fs) + { + // fs->win + vo_x11_ewmh_fullscreen(_NET_WM_STATE_REMOVE); // removes fullscreen state if wm supports EWMH + + if (vo_dwidth != vo_screenwidth && vo_dheight != vo_screenheight) + return; + vo_fs = VO_FALSE; + x = vo_old_x; + y = vo_old_y; + w = vo_old_width; + h = vo_old_height; + } else + { + // win->fs + vo_x11_ewmh_fullscreen(_NET_WM_STATE_ADD); // sends fullscreen state to be added if wm supports EWMH + + if (vo_old_width && + (vo_dwidth == vo_screenwidth && vo_dwidth != vo_old_width) && + (vo_dheight == vo_screenheight && vo_dheight != vo_old_height)) + return; + vo_fs = VO_TRUE; + vo_old_x = vo_dx; + vo_old_y = vo_dy; + vo_old_width = vo_dwidth; + vo_old_height = vo_dheight; + x = 0; + y = 0; + w = vo_screenwidth; + h = vo_screenheight; + + } + { + long dummy; + + XGetWMNormalHints(mDisplay, vo_window, &vo_hint, &dummy); + if (!(vo_hint.flags & PWinGravity)) + old_gravity = NorthWestGravity; + else + old_gravity = vo_hint.win_gravity; + } + if (vo_wm_type == 0 && !(vo_fsmode & 16)) + { + XUnmapWindow(mDisplay, vo_window); // required for MWM + XWithdrawWindow(mDisplay, vo_window, mScreen); + vo_fs_flip = 1; + } + + 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); + + XMoveResizeWindow(mDisplay, vo_window, x, y, w, h); #ifdef HAVE_XINERAMA - vo_x11_xinerama_move(mDisplay,vo_window); + vo_x11_xinerama_move(mDisplay, vo_window); #endif - XMapRaised( mDisplay,vo_window ); - XRaiseWindow( mDisplay,vo_window ); - XFlush( mDisplay ); + XMapRaised(mDisplay, vo_window); + XRaiseWindow(mDisplay, vo_window); + XFlush(mDisplay); } -void vo_x11_ontop( void ) +void vo_x11_ontop(void) { - vo_ontop = (!(vo_ontop)); + vo_ontop = (!(vo_ontop)); - vo_x11_setlayer(mDisplay, vo_window, vo_ontop); + vo_x11_setlayer(mDisplay, vo_window, vo_ontop); } /* @@ -1163,16 +1478,16 @@ void vo_x11_ontop( void ) static int got_badwindow; static XErrorHandler old_handler; -static int badwindow_handler(Display *dpy, XErrorEvent *error) +static int badwindow_handler(Display * dpy, XErrorEvent * error) { if (error->error_code != BadWindow) - return (*old_handler)(dpy, error); + return (*old_handler) (dpy, error); got_badwindow = True; return 0; } -static Window find_xscreensaver_window(Display *dpy) +static Window find_xscreensaver_window(Display * dpy) { int i; Window root = RootWindowOfScreen(DefaultScreenOfDisplay(dpy)); @@ -1185,28 +1500,33 @@ static Window find_xscreensaver_window(Display *dpy) if (!(xs_version != None && XQueryTree(dpy, root, &root2, &parent, &kids, &nkids) && - kids && nkids)) return 0; + kids && nkids)) + return 0; old_handler = XSetErrorHandler(badwindow_handler); - for (i = 0; i < nkids; i++) { - Atom type; - int format; - unsigned long nitems, bytesafter; - char *v; - int status; + for (i = 0; i < nkids; i++) + { + Atom type; + int format; + unsigned long nitems, bytesafter; + char *v; + int status; got_badwindow = False; - status = XGetWindowProperty(dpy, kids[i], xs_version, 0, 200, False, - XA_STRING, &type, &format, &nitems, - &bytesafter, (unsigned char**) &v); - XSync(dpy, False); - if (got_badwindow) status = BadWindow; - - if (status == Success && type != None) { - retval = kids[i]; - break; - } + status = + XGetWindowProperty(dpy, kids[i], xs_version, 0, 200, False, + XA_STRING, &type, &format, &nitems, + &bytesafter, (unsigned char **) &v); + XSync(dpy, False); + if (got_badwindow) + status = BadWindow; + + if (status == Success && type != None) + { + retval = kids[i]; + break; + } } XFree(kids); XSetErrorHandler(old_handler); @@ -1226,35 +1546,36 @@ void xscreensaver_heartbeat(void) XEvent ev; if (mDisplay && xs_windowid && - ((time - time_last)>30000 || - (time - time_last)<0)) { - time_last = time; - - ev.xany.type = ClientMessage; - ev.xclient.display = mDisplay; - ev.xclient.window = xs_windowid; - ev.xclient.message_type = screensaver; - ev.xclient.format = 32; - memset(&ev.xclient.data, 0, sizeof(ev.xclient.data)); - ev.xclient.data.l[0] = (long) deactivate; - - mp_msg(MSGT_VO,MSGL_DBG2, "Pinging xscreensaver.\n"); - XSendEvent(mDisplay, xs_windowid, False, 0L, &ev); - XSync(mDisplay, False); + ((time - time_last) > 30000 || (time - time_last) < 0)) + { + time_last = time; + + ev.xany.type = ClientMessage; + ev.xclient.display = mDisplay; + ev.xclient.window = xs_windowid; + ev.xclient.message_type = screensaver; + ev.xclient.format = 32; + memset(&ev.xclient.data, 0, sizeof(ev.xclient.data)); + ev.xclient.data.l[0] = (long) deactivate; + + mp_msg(MSGT_VO, MSGL_DBG2, "Pinging xscreensaver.\n"); + XSendEvent(mDisplay, xs_windowid, False, 0L, &ev); + XSync(mDisplay, False); } } -static void xscreensaver_disable(Display *dpy) +static void xscreensaver_disable(Display * dpy) { - mp_msg(MSGT_VO,MSGL_DBG2, "xscreensaver_disable()\n"); + mp_msg(MSGT_VO, MSGL_DBG2, "xscreensaver_disable()\n"); xs_windowid = find_xscreensaver_window(dpy); - if (!xs_windowid) { - mp_msg(MSGT_VO,MSGL_INFO, - "xscreensaver_disable: Could not find xscreensaver window.\n"); - return; + if (!xs_windowid) + { + mp_msg(MSGT_VO, MSGL_INFO, + "xscreensaver_disable: Could not find xscreensaver window.\n"); + return; } - mp_msg(MSGT_VO,MSGL_INFO, + mp_msg(MSGT_VO, MSGL_INFO, "xscreensaver_disable: xscreensaver wid=%d.\n", xs_windowid); deactivate = XInternAtom(dpy, "DEACTIVATE", False); @@ -1270,203 +1591,264 @@ static void xscreensaver_enable(void) * End of XScreensaver stuff */ -void saver_on(Display *mDisplay) { +void saver_on(Display * mDisplay) +{ #ifdef HAVE_XDPMS int nothing; + if (dpms_disabled) { - if (DPMSQueryExtension(mDisplay, ¬hing, ¬hing)) - { - if (!DPMSEnable(mDisplay)) { // restoring power saving settings - mp_msg(MSGT_VO,MSGL_WARN,"DPMS not available?\n"); - } else { + if (DPMSQueryExtension(mDisplay, ¬hing, ¬hing)) + { + if (!DPMSEnable(mDisplay)) + { // restoring power saving settings + mp_msg(MSGT_VO, MSGL_WARN, "DPMS not available?\n"); + } else + { // DPMS does not seem to be enabled unless we call DPMSInfo - BOOL onoff; - CARD16 state; - DPMSForceLevel(mDisplay, DPMSModeOn); - DPMSInfo(mDisplay, &state, &onoff); - if (onoff) { - mp_msg(MSGT_VO,MSGL_INFO,"Successfully enabled DPMS\n"); - } else { - mp_msg(MSGT_VO,MSGL_WARN,"Could not enable DPMS\n"); + BOOL onoff; + CARD16 state; + + DPMSForceLevel(mDisplay, DPMSModeOn); + DPMSInfo(mDisplay, &state, &onoff); + if (onoff) + { + mp_msg(MSGT_VO, MSGL_INFO, + "Successfully enabled DPMS\n"); + } else + { + mp_msg(MSGT_VO, MSGL_WARN, "Could not enable DPMS\n"); } } - } - dpms_disabled=0; + } + dpms_disabled = 0; } #endif if (timeout_save) { - int dummy, interval, prefer_blank, allow_exp; - XGetScreenSaver(mDisplay, &dummy, &interval, &prefer_blank, &allow_exp); - XSetScreenSaver(mDisplay, timeout_save, interval, prefer_blank, allow_exp); - XGetScreenSaver(mDisplay, &timeout_save, &interval, &prefer_blank, &allow_exp); - timeout_save=0; + int dummy, interval, prefer_blank, allow_exp; + + XGetScreenSaver(mDisplay, &dummy, &interval, &prefer_blank, + &allow_exp); + XSetScreenSaver(mDisplay, timeout_save, interval, prefer_blank, + allow_exp); + XGetScreenSaver(mDisplay, &timeout_save, &interval, &prefer_blank, + &allow_exp); + timeout_save = 0; } - if (stop_xscreensaver) xscreensaver_enable(); - if (kdescreensaver_was_running && stop_xscreensaver) { - system("dcop kdesktop KScreensaverIface enable true 2>/dev/null >/dev/null"); - kdescreensaver_was_running = 0; + if (stop_xscreensaver) + xscreensaver_enable(); + if (kdescreensaver_was_running && stop_xscreensaver) + { + system + ("dcop kdesktop KScreensaverIface enable true 2>/dev/null >/dev/null"); + kdescreensaver_was_running = 0; } } -void saver_off(Display *mDisplay) { +void saver_off(Display * mDisplay) +{ int interval, prefer_blank, allow_exp; + #ifdef HAVE_XDPMS int nothing; if (DPMSQueryExtension(mDisplay, ¬hing, ¬hing)) { - BOOL onoff; - CARD16 state; - DPMSInfo(mDisplay, &state, &onoff); - if (onoff) - { - Status stat; - mp_msg(MSGT_VO,MSGL_INFO,"Disabling DPMS\n"); - dpms_disabled=1; - stat = DPMSDisable(mDisplay); // monitor powersave off - mp_msg(MSGT_VO,MSGL_V,"DPMSDisable stat: %d\n", stat); - } + BOOL onoff; + CARD16 state; + + DPMSInfo(mDisplay, &state, &onoff); + if (onoff) + { + Status stat; + + mp_msg(MSGT_VO, MSGL_INFO, "Disabling DPMS\n"); + dpms_disabled = 1; + stat = DPMSDisable(mDisplay); // monitor powersave off + mp_msg(MSGT_VO, MSGL_V, "DPMSDisable stat: %d\n", stat); + } } #endif - if (!timeout_save) { - XGetScreenSaver(mDisplay, &timeout_save, &interval, &prefer_blank, &allow_exp); - if (timeout_save) - XSetScreenSaver(mDisplay, 0, interval, prefer_blank, allow_exp); + if (!timeout_save) + { + XGetScreenSaver(mDisplay, &timeout_save, &interval, &prefer_blank, + &allow_exp); + if (timeout_save) + XSetScreenSaver(mDisplay, 0, interval, prefer_blank, + allow_exp); } - // turning off screensaver - if (stop_xscreensaver) xscreensaver_disable(mDisplay); + // turning off screensaver + if (stop_xscreensaver) + xscreensaver_disable(mDisplay); if (stop_xscreensaver && !kdescreensaver_was_running) { - kdescreensaver_was_running=(system("dcop kdesktop KScreensaverIface isEnabled 2>/dev/null | sed 's/1/true/g' | grep true 2>/dev/null >/dev/null")==0); - if (kdescreensaver_was_running) - system("dcop kdesktop KScreensaverIface enable false 2>/dev/null >/dev/null"); + kdescreensaver_was_running = + (system + ("dcop kdesktop KScreensaverIface isEnabled 2>/dev/null | sed 's/1/true/g' | grep true 2>/dev/null >/dev/null") + == 0); + if (kdescreensaver_was_running) + system + ("dcop kdesktop KScreensaverIface enable false 2>/dev/null >/dev/null"); } } static XErrorHandler old_handler = NULL; static int selectinput_err = 0; -static int x11_selectinput_errorhandler(Display *display, XErrorEvent *event) +static int x11_selectinput_errorhandler(Display * display, + XErrorEvent * event) { - if (event->error_code == BadAccess) { - selectinput_err = 1; - mp_msg(MSGT_VO, MSGL_ERR, "X11 error: BadAccess during XSelectInput Call\n"); - mp_msg(MSGT_VO, MSGL_ERR, "X11 error: The 'ButtonPressMask' mask of specified window has probably already used by another appication (see man XSelectInput)\n"); - /* If you think mplayer should shutdown with this error, comments out following line */ - return 0; - } - if (old_handler != NULL) old_handler(display, event); - else x11_errorhandler(display, event); - return 0; + if (event->error_code == BadAccess) + { + selectinput_err = 1; + mp_msg(MSGT_VO, MSGL_ERR, + "X11 error: BadAccess during XSelectInput Call\n"); + mp_msg(MSGT_VO, MSGL_ERR, + "X11 error: The 'ButtonPressMask' mask of specified window has probably already used by another appication (see man XSelectInput)\n"); + /* If you think mplayer should shutdown with this error, comments out following line */ + return 0; + } + if (old_handler != NULL) + old_handler(display, event); + else + x11_errorhandler(display, event); + return 0; } -void vo_x11_selectinput_witherr(Display *display, Window w, long event_mask) +void vo_x11_selectinput_witherr(Display * display, Window w, + long event_mask) { - XSync(display, False); - old_handler = XSetErrorHandler(x11_selectinput_errorhandler); - selectinput_err = 0; - if(vo_nomouse_input){ - XSelectInput(display,w,event_mask & (~(ButtonPressMask | ButtonReleaseMask))); - } else { - XSelectInput(display, w, event_mask); - } - XSync(display, False); - XSetErrorHandler(old_handler); - if (selectinput_err) { - mp_msg(MSGT_VO, MSGL_ERR, "X11 error: MPlayer discards mouse control (reconfiguring)\n"); - XSelectInput(display, w, event_mask & (~(ButtonPressMask | ButtonReleaseMask | PointerMotionMask)) ); - } + XSync(display, False); + old_handler = XSetErrorHandler(x11_selectinput_errorhandler); + selectinput_err = 0; + if (vo_nomouse_input) + { + XSelectInput(display, w, + event_mask & + (~(ButtonPressMask | ButtonReleaseMask))); + } else + { + XSelectInput(display, w, event_mask); + } + XSync(display, False); + XSetErrorHandler(old_handler); + if (selectinput_err) + { + mp_msg(MSGT_VO, MSGL_ERR, + "X11 error: MPlayer discards mouse control (reconfiguring)\n"); + XSelectInput(display, w, + event_mask & + (~ + (ButtonPressMask | ButtonReleaseMask | + PointerMotionMask))); + } } #ifdef HAVE_XINERAMA -void vo_x11_xinerama_move(Display *dsp, Window w) +void vo_x11_xinerama_move(Display * dsp, Window w) { - if(XineramaIsActive(dsp) && ! geometry_xy_changed) - { - /* printf("XXXX Xinerama screen: x: %hd y: %hd\n",xinerama_x,xinerama_y); */ - XMoveWindow(dsp,w,xinerama_x,xinerama_y); - } + if (XineramaIsActive(dsp) && !geometry_xy_changed) + { + /* printf("XXXX Xinerama screen: x: %hd y: %hd\n",xinerama_x,xinerama_y); */ + XMoveWindow(dsp, w, xinerama_x, xinerama_y); + } } #endif #ifdef HAVE_XF86VM -void vo_vm_switch(uint32_t X, uint32_t Y, int* modeline_width, int* modeline_height) +void vo_vm_switch(uint32_t X, uint32_t Y, int *modeline_width, + int *modeline_height) { unsigned int vm_event, vm_error; unsigned int vm_ver, vm_rev; - int i,j,have_vm=0; + int i, j, have_vm = 0; int modecount; - - if (XF86VidModeQueryExtension(mDisplay, &vm_event, &vm_error)) { - XF86VidModeQueryVersion(mDisplay, &vm_ver, &vm_rev); - mp_msg(MSGT_VO,MSGL_V,"XF86VidMode Extension v%i.%i\n", vm_ver, vm_rev); - have_vm=1; + + if (XF86VidModeQueryExtension(mDisplay, &vm_event, &vm_error)) + { + XF86VidModeQueryVersion(mDisplay, &vm_ver, &vm_rev); + mp_msg(MSGT_VO, MSGL_V, "XF86VidMode Extension v%i.%i\n", vm_ver, + vm_rev); + have_vm = 1; } else - mp_msg(MSGT_VO,MSGL_WARN,"XF86VidMode Extenstion not available.\n"); - - if (have_vm) { - if (vidmodes==NULL) - XF86VidModeGetAllModeLines(mDisplay,mScreen,&modecount,&vidmodes); - j=0; - *modeline_width=vidmodes[0]->hdisplay; - *modeline_height=vidmodes[0]->vdisplay; - - for (i=1; i<modecount; i++) - if ((vidmodes[i]->hdisplay >= X) && (vidmodes[i]->vdisplay >= Y)) - if ( (vidmodes[i]->hdisplay <= *modeline_width ) && (vidmodes[i]->vdisplay <= *modeline_height) ) - { - *modeline_width=vidmodes[i]->hdisplay; - *modeline_height=vidmodes[i]->vdisplay; - j=i; - } - - mp_msg(MSGT_VO,MSGL_INFO,"XF86VM: Selected video mode %dx%d for image size %dx%d.\n",*modeline_width, *modeline_height, X, Y); - XF86VidModeLockModeSwitch(mDisplay,mScreen,0); - XF86VidModeSwitchToMode(mDisplay,mScreen,vidmodes[j]); - XF86VidModeSwitchToMode(mDisplay,mScreen,vidmodes[j]); - X=(vo_screenwidth-*modeline_width)/2; - Y=(vo_screenheight-*modeline_height)/2; - XF86VidModeSetViewPort(mDisplay,mScreen,X,Y); + mp_msg(MSGT_VO, MSGL_WARN, + "XF86VidMode Extenstion not available.\n"); + + if (have_vm) + { + if (vidmodes == NULL) + XF86VidModeGetAllModeLines(mDisplay, mScreen, &modecount, + &vidmodes); + j = 0; + *modeline_width = vidmodes[0]->hdisplay; + *modeline_height = vidmodes[0]->vdisplay; + + for (i = 1; i < modecount; i++) + if ((vidmodes[i]->hdisplay >= X) + && (vidmodes[i]->vdisplay >= Y)) + if ((vidmodes[i]->hdisplay <= *modeline_width) + && (vidmodes[i]->vdisplay <= *modeline_height)) + { + *modeline_width = vidmodes[i]->hdisplay; + *modeline_height = vidmodes[i]->vdisplay; + j = i; + } + + mp_msg(MSGT_VO, MSGL_INFO, + "XF86VM: Selected video mode %dx%d for image size %dx%d.\n", + *modeline_width, *modeline_height, X, Y); + XF86VidModeLockModeSwitch(mDisplay, mScreen, 0); + XF86VidModeSwitchToMode(mDisplay, mScreen, vidmodes[j]); + XF86VidModeSwitchToMode(mDisplay, mScreen, vidmodes[j]); + X = (vo_screenwidth - *modeline_width) / 2; + Y = (vo_screenheight - *modeline_height) / 2; + XF86VidModeSetViewPort(mDisplay, mScreen, X, Y); } } -void vo_vm_close(Display *dpy) +void vo_vm_close(Display * dpy) { - #ifdef HAVE_NEW_GUI - if (vidmodes!=NULL && vo_window != None) - #else - if (vidmodes!=NULL) - #endif - { - int i, modecount; - int screen; screen=DefaultScreen( dpy ); - - free(vidmodes); vidmodes=NULL; - XF86VidModeGetAllModeLines(mDisplay,mScreen,&modecount,&vidmodes); - for (i=0; i<modecount; i++) - if ((vidmodes[i]->hdisplay == vo_screenwidth) && (vidmodes[i]->vdisplay == vo_screenheight)) - { - mp_msg(MSGT_VO,MSGL_INFO,"Returning to original mode %dx%d\n", vo_screenwidth, vo_screenheight); - break; - } - - XF86VidModeSwitchToMode(dpy,screen,vidmodes[i]); - XF86VidModeSwitchToMode(dpy,screen,vidmodes[i]); - free(vidmodes); - vidmodes = NULL; - } +#ifdef HAVE_NEW_GUI + if (vidmodes != NULL && vo_window != None) +#else + if (vidmodes != NULL) +#endif + { + int i, modecount; + int screen; + + screen = DefaultScreen(dpy); + + free(vidmodes); + vidmodes = NULL; + XF86VidModeGetAllModeLines(mDisplay, mScreen, &modecount, + &vidmodes); + for (i = 0; i < modecount; i++) + if ((vidmodes[i]->hdisplay == vo_screenwidth) + && (vidmodes[i]->vdisplay == vo_screenheight)) + { + mp_msg(MSGT_VO, MSGL_INFO, + "Returning to original mode %dx%d\n", + vo_screenwidth, vo_screenheight); + break; + } + + XF86VidModeSwitchToMode(dpy, screen, vidmodes[i]); + XF86VidModeSwitchToMode(dpy, screen, vidmodes[i]); + free(vidmodes); + vidmodes = NULL; + } } #endif -#endif /* X11_FULLSCREEN */ +#endif /* X11_FULLSCREEN */ /* @@ -1475,45 +1857,50 @@ void vo_vm_close(Display *dpy) * depth (at least 15bit). If there are multiple visuals with depth * >= 15bit, we prefer visuals with a smaller color depth. */ -int vo_find_depth_from_visuals(Display *dpy, int screen, Visual **visual_return) +int vo_find_depth_from_visuals(Display * dpy, int screen, + Visual ** visual_return) { - XVisualInfo visual_tmpl; - XVisualInfo *visuals; - int nvisuals, i; - int bestvisual = -1; - int bestvisual_depth = -1; - - visual_tmpl.screen = screen; - visual_tmpl.class = TrueColor; - visuals = XGetVisualInfo(dpy, - VisualScreenMask | VisualClassMask, &visual_tmpl, - &nvisuals); - if (visuals != NULL) { - for (i = 0; i < nvisuals; i++) { - mp_msg(MSGT_VO,MSGL_V,"vo: X11 truecolor visual %#x, depth %d, R:%lX G:%lX B:%lX\n", - visuals[i].visualid, visuals[i].depth, - visuals[i].red_mask, visuals[i].green_mask, - visuals[i].blue_mask); - /* - * save the visual index and it's depth, if this is the first - * truecolor visul, or a visual that is 'preferred' over the - * previous 'best' visual - */ - if (bestvisual_depth == -1 - || (visuals[i].depth >= 15 - && ( visuals[i].depth < bestvisual_depth - || bestvisual_depth < 15))) { - bestvisual = i; - bestvisual_depth = visuals[i].depth; - } - } + XVisualInfo visual_tmpl; + XVisualInfo *visuals; + int nvisuals, i; + int bestvisual = -1; + int bestvisual_depth = -1; + + visual_tmpl.screen = screen; + visual_tmpl.class = TrueColor; + visuals = XGetVisualInfo(dpy, + VisualScreenMask | VisualClassMask, + &visual_tmpl, &nvisuals); + if (visuals != NULL) + { + for (i = 0; i < nvisuals; i++) + { + mp_msg(MSGT_VO, MSGL_V, + "vo: X11 truecolor visual %#x, depth %d, R:%lX G:%lX B:%lX\n", + visuals[i].visualid, visuals[i].depth, + visuals[i].red_mask, visuals[i].green_mask, + visuals[i].blue_mask); + /* + * save the visual index and it's depth, if this is the first + * truecolor visul, or a visual that is 'preferred' over the + * previous 'best' visual + */ + if (bestvisual_depth == -1 + || (visuals[i].depth >= 15 + && (visuals[i].depth < bestvisual_depth + || bestvisual_depth < 15))) + { + bestvisual = i; + bestvisual_depth = visuals[i].depth; + } + } - if (bestvisual != -1 && visual_return != NULL) - *visual_return = visuals[bestvisual].visual; + if (bestvisual != -1 && visual_return != NULL) + *visual_return = visuals[bestvisual].visual; - XFree(visuals); - } - return bestvisual_depth; + XFree(visuals); + } + return bestvisual_depth; } @@ -1522,45 +1909,58 @@ static XColor cols[256]; static int cm_size, red_mask, green_mask, blue_mask; -Colormap vo_x11_create_colormap(XVisualInfo *vinfo) +Colormap vo_x11_create_colormap(XVisualInfo * vinfo) { - unsigned k, r, g, b, ru, gu, bu, m, rv, gv, bv, rvu, gvu, bvu; - - if (vinfo->class != DirectColor) - return XCreateColormap(mDisplay, mRootWin, vinfo->visual, AllocNone); - - /* can this function get called twice or more? */ - if (cmap) return cmap; - cm_size = vinfo->colormap_size; - red_mask = vinfo->red_mask; - green_mask = vinfo->green_mask; - blue_mask = vinfo->blue_mask; - ru = (red_mask&(red_mask-1))^red_mask; - gu = (green_mask&(green_mask-1))^green_mask; - bu = (blue_mask&(blue_mask-1))^blue_mask; - rvu = 65536ull*ru/(red_mask + ru); - gvu = 65536ull*gu/(green_mask + gu); - bvu = 65536ull*bu/(blue_mask + bu); - r = g = b = 0; - rv = gv = bv = 0; - m = DoRed|DoGreen|DoBlue; - for (k = 0; k < cm_size; k++) { - int t; - cols[k].pixel = r|g|b; - cols[k].red = rv; - cols[k].green = gv; - cols[k].blue = bv; - cols[k].flags = m; - t = (r + ru) & red_mask; if (t < r) m &= ~DoRed; r = t; - t = (g + gu) & green_mask; if (t < g) m &= ~DoGreen; g = t; - t = (b + bu) & blue_mask; if (t < b) m &= ~DoBlue; b = t; - rv += rvu; - gv += gvu; - bv += bvu; - } - cmap = XCreateColormap(mDisplay, mRootWin, vinfo->visual, AllocAll); - XStoreColors(mDisplay, cmap, cols, cm_size); - return cmap; + unsigned k, r, g, b, ru, gu, bu, m, rv, gv, bv, rvu, gvu, bvu; + + if (vinfo->class != DirectColor) + return XCreateColormap(mDisplay, mRootWin, vinfo->visual, + AllocNone); + + /* can this function get called twice or more? */ + if (cmap) + return cmap; + cm_size = vinfo->colormap_size; + red_mask = vinfo->red_mask; + green_mask = vinfo->green_mask; + blue_mask = vinfo->blue_mask; + ru = (red_mask & (red_mask - 1)) ^ red_mask; + gu = (green_mask & (green_mask - 1)) ^ green_mask; + bu = (blue_mask & (blue_mask - 1)) ^ blue_mask; + rvu = 65536ull * ru / (red_mask + ru); + gvu = 65536ull * gu / (green_mask + gu); + bvu = 65536ull * bu / (blue_mask + bu); + r = g = b = 0; + rv = gv = bv = 0; + m = DoRed | DoGreen | DoBlue; + for (k = 0; k < cm_size; k++) + { + int t; + + cols[k].pixel = r | g | b; + cols[k].red = rv; + cols[k].green = gv; + cols[k].blue = bv; + cols[k].flags = m; + t = (r + ru) & red_mask; + if (t < r) + m &= ~DoRed; + r = t; + t = (g + gu) & green_mask; + if (t < g) + m &= ~DoGreen; + g = t; + t = (b + bu) & blue_mask; + if (t < b) + m &= ~DoBlue; + b = t; + rv += rvu; + gv += gvu; + bv += bvu; + } + cmap = XCreateColormap(mDisplay, mRootWin, vinfo->visual, AllocAll); + XStoreColors(mDisplay, cmap, cols, cm_size); + return cmap; } /* @@ -1577,208 +1977,230 @@ static int vo_contrast = 0; uint32_t vo_x11_set_equalizer(char *name, int value) { - float gamma, brightness, contrast; - float rf, gf, bf; - int k; - - /* - * IMPLEMENTME: consider using XF86VidModeSetGammaRamp in the case - * of TrueColor-ed window but be careful: - * unlike the colormaps, which are private for the X client - * who created them and thus automatically destroyed on client - * disconnect, this gamma ramp is a system-wide (X-server-wide) - * setting and _must_ be restored before the process exit. - * Unforunately when the process crashes (or get killed - * for some reason) it is impossible to restore the setting, - * and such behaviour could be rather annoying for the users. - */ - if (cmap == None) return VO_NOTAVAIL; - - if (!strcasecmp(name, "brightness")) vo_brightness = value; - else if (!strcasecmp(name, "contrast")) vo_contrast = value; - else if (!strcasecmp(name, "gamma")) vo_gamma = value; - else return VO_NOTIMPL; - - brightness = 0.01*vo_brightness; - contrast = tan(0.0095*(vo_contrast+100)*M_PI/4); - gamma = pow(2, -0.02*vo_gamma); - - rf = (float)((red_mask & (red_mask - 1)) ^ red_mask)/red_mask; - gf = (float)((green_mask & (green_mask - 1)) ^ green_mask)/green_mask; - bf = (float)((blue_mask & (blue_mask - 1)) ^ blue_mask)/blue_mask; - - /* now recalculate the colormap using the newly set value */ - for (k = 0; k < cm_size; k++) { - float s; - - s = pow(rf*k, gamma); - s = (s - 0.5)*contrast + 0.5; - s += brightness; - if (s < 0) s = 0; - if (s > 1) s = 1; - cols[k].red = (unsigned short)(s * 65535); - - s = pow(gf*k, gamma); - s = (s - 0.5)*contrast + 0.5; - s += brightness; - if (s < 0) s = 0; - if (s > 1) s = 1; - cols[k].green = (unsigned short)(s * 65535); - - s = pow(bf*k, gamma); - s = (s - 0.5)*contrast + 0.5; - s += brightness; - if (s < 0) s = 0; - if (s > 1) s = 1; - cols[k].blue = (unsigned short)(s * 65535); - } - - XStoreColors(mDisplay, cmap, cols, cm_size); - XFlush(mDisplay); - return VO_TRUE; + float gamma, brightness, contrast; + float rf, gf, bf; + int k; + + /* + * IMPLEMENTME: consider using XF86VidModeSetGammaRamp in the case + * of TrueColor-ed window but be careful: + * unlike the colormaps, which are private for the X client + * who created them and thus automatically destroyed on client + * disconnect, this gamma ramp is a system-wide (X-server-wide) + * setting and _must_ be restored before the process exit. + * Unforunately when the process crashes (or get killed + * for some reason) it is impossible to restore the setting, + * and such behaviour could be rather annoying for the users. + */ + if (cmap == None) + return VO_NOTAVAIL; + + if (!strcasecmp(name, "brightness")) + vo_brightness = value; + else if (!strcasecmp(name, "contrast")) + vo_contrast = value; + else if (!strcasecmp(name, "gamma")) + vo_gamma = value; + else + return VO_NOTIMPL; + + brightness = 0.01 * vo_brightness; + contrast = tan(0.0095 * (vo_contrast + 100) * M_PI / 4); + gamma = pow(2, -0.02 * vo_gamma); + + rf = (float) ((red_mask & (red_mask - 1)) ^ red_mask) / red_mask; + gf = (float) ((green_mask & (green_mask - 1)) ^ green_mask) / + green_mask; + bf = (float) ((blue_mask & (blue_mask - 1)) ^ blue_mask) / blue_mask; + + /* now recalculate the colormap using the newly set value */ + for (k = 0; k < cm_size; k++) + { + float s; + + s = pow(rf * k, gamma); + s = (s - 0.5) * contrast + 0.5; + s += brightness; + if (s < 0) + s = 0; + if (s > 1) + s = 1; + cols[k].red = (unsigned short) (s * 65535); + + s = pow(gf * k, gamma); + s = (s - 0.5) * contrast + 0.5; + s += brightness; + if (s < 0) + s = 0; + if (s > 1) + s = 1; + cols[k].green = (unsigned short) (s * 65535); + + s = pow(bf * k, gamma); + s = (s - 0.5) * contrast + 0.5; + s += brightness; + if (s < 0) + s = 0; + if (s > 1) + s = 1; + cols[k].blue = (unsigned short) (s * 65535); + } + + XStoreColors(mDisplay, cmap, cols, cm_size); + XFlush(mDisplay); + return VO_TRUE; } uint32_t vo_x11_get_equalizer(char *name, int *value) { - if (cmap == None) return VO_NOTAVAIL; - if (!strcasecmp(name, "brightness")) *value = vo_brightness; - else if (!strcasecmp(name, "contrast")) *value = vo_contrast; - else if (!strcasecmp(name, "gamma")) *value = vo_gamma; - else return VO_NOTIMPL; - return VO_TRUE; + if (cmap == None) + return VO_NOTAVAIL; + if (!strcasecmp(name, "brightness")) + *value = vo_brightness; + else if (!strcasecmp(name, "contrast")) + *value = vo_contrast; + else if (!strcasecmp(name, "gamma")) + *value = vo_gamma; + else + return VO_NOTIMPL; + return VO_TRUE; } + #ifdef HAVE_XV int vo_xv_set_eq(uint32_t xv_port, char *name, int value) { XvAttribute *attributes; - int i,howmany, xv_atom; + int i, howmany, xv_atom; mp_dbg(MSGT_VO, MSGL_V, "xv_set_eq called! (%s, %d)\n", name, value); /* get available attributes */ attributes = XvQueryPortAttributes(mDisplay, xv_port, &howmany); for (i = 0; i < howmany && attributes; i++) - if (attributes[i].flags & XvSettable) - { - xv_atom = XInternAtom(mDisplay, attributes[i].name, True); + if (attributes[i].flags & XvSettable) + { + xv_atom = XInternAtom(mDisplay, attributes[i].name, True); /* since we have SET_DEFAULTS first in our list, we can check if it's available then trigger it if it's ok so that the other values are at default upon query */ - if (xv_atom != None) + if (xv_atom != None) + { + int hue = 0, port_value, port_min, port_max; + + if (!strcmp(attributes[i].name, "XV_BRIGHTNESS") && + (!strcasecmp(name, "brightness"))) + port_value = value; + else if (!strcmp(attributes[i].name, "XV_CONTRAST") && + (!strcasecmp(name, "contrast"))) + port_value = value; + else if (!strcmp(attributes[i].name, "XV_SATURATION") && + (!strcasecmp(name, "saturation"))) + port_value = value; + else if (!strcmp(attributes[i].name, "XV_HUE") && + (!strcasecmp(name, "hue"))) { - int hue = 0,port_value,port_min,port_max; - - if(!strcmp(attributes[i].name,"XV_BRIGHTNESS") && - (!strcasecmp(name, "brightness"))) - port_value = value; - else - if(!strcmp(attributes[i].name,"XV_CONTRAST") && - (!strcasecmp(name, "contrast"))) - port_value = value; - else - if(!strcmp(attributes[i].name,"XV_SATURATION") && - (!strcasecmp(name, "saturation"))) - port_value = value; - else - if(!strcmp(attributes[i].name,"XV_HUE") && - (!strcasecmp(name, "hue"))) - { port_value = value; hue=1; } - else + port_value = value; + hue = 1; + } else /* Note: since 22.01.2002 GATOS supports these attrs for radeons (NK) */ - if(!strcmp(attributes[i].name,"XV_RED_INTENSITY") && - (!strcasecmp(name, "red_intensity"))) - port_value = value; - else - if(!strcmp(attributes[i].name,"XV_GREEN_INTENSITY") && - (!strcasecmp(name, "green_intensity"))) - port_value = value; - else - if(!strcmp(attributes[i].name,"XV_BLUE_INTENSITY") && - (!strcasecmp(name, "blue_intensity"))) - port_value = value; - else continue; - - port_min = attributes[i].min_value; - port_max = attributes[i].max_value; - - /* nvidia hue workaround */ - if ( hue && port_min == 0 && port_max == 360 ){ - port_value = (port_value>=0) ? (port_value-100) : (port_value+100); - } - - // -100 -> min - // 0 -> (max+min)/2 - // +100 -> max - port_value = (port_value+100)*(port_max-port_min)/200+port_min; - XvSetPortAttribute(mDisplay, xv_port, xv_atom, port_value); - return(VO_TRUE); + if (!strcmp(attributes[i].name, "XV_RED_INTENSITY") && + (!strcasecmp(name, "red_intensity"))) + port_value = value; + else if (!strcmp(attributes[i].name, "XV_GREEN_INTENSITY") + && (!strcasecmp(name, "green_intensity"))) + port_value = value; + else if (!strcmp(attributes[i].name, "XV_BLUE_INTENSITY") + && (!strcasecmp(name, "blue_intensity"))) + port_value = value; + else + continue; + + port_min = attributes[i].min_value; + port_max = attributes[i].max_value; + + /* nvidia hue workaround */ + if (hue && port_min == 0 && port_max == 360) + { + port_value = + (port_value >= + 0) ? (port_value - 100) : (port_value + 100); } - } - return(VO_FALSE); + // -100 -> min + // 0 -> (max+min)/2 + // +100 -> max + port_value = + (port_value + 100) * (port_max - port_min) / 200 + + port_min; + XvSetPortAttribute(mDisplay, xv_port, xv_atom, port_value); + return (VO_TRUE); + } + } + return (VO_FALSE); } int vo_xv_get_eq(uint32_t xv_port, char *name, int *value) { - + XvAttribute *attributes; - int i,howmany, xv_atom; + int i, howmany, xv_atom; /* get available attributes */ attributes = XvQueryPortAttributes(mDisplay, xv_port, &howmany); for (i = 0; i < howmany && attributes; i++) - if (attributes[i].flags & XvGettable) - { - xv_atom = XInternAtom(mDisplay, attributes[i].name, True); + if (attributes[i].flags & XvGettable) + { + xv_atom = XInternAtom(mDisplay, attributes[i].name, True); /* since we have SET_DEFAULTS first in our list, we can check if it's available then trigger it if it's ok so that the other values are at default upon query */ - if (xv_atom != None) + if (xv_atom != None) + { + int val, port_value = 0, port_min, port_max; + + XvGetPortAttribute(mDisplay, xv_port, xv_atom, + &port_value); + + port_min = attributes[i].min_value; + port_max = attributes[i].max_value; + val = + (port_value - port_min) * 200 / (port_max - port_min) - + 100; + + if (!strcmp(attributes[i].name, "XV_BRIGHTNESS") && + (!strcasecmp(name, "brightness"))) + *value = val; + else if (!strcmp(attributes[i].name, "XV_CONTRAST") && + (!strcasecmp(name, "contrast"))) + *value = val; + else if (!strcmp(attributes[i].name, "XV_SATURATION") && + (!strcasecmp(name, "saturation"))) + *value = val; + else if (!strcmp(attributes[i].name, "XV_HUE") && + (!strcasecmp(name, "hue"))) { - int val, port_value=0, port_min, port_max; - - XvGetPortAttribute(mDisplay, xv_port, xv_atom, &port_value); - - port_min = attributes[i].min_value; - port_max = attributes[i].max_value; - val=(port_value-port_min)*200/(port_max-port_min)-100; - - if(!strcmp(attributes[i].name,"XV_BRIGHTNESS") && - (!strcasecmp(name, "brightness"))) - *value = val; - else - if(!strcmp(attributes[i].name,"XV_CONTRAST") && - (!strcasecmp(name, "contrast"))) - *value = val; - else - if(!strcmp(attributes[i].name,"XV_SATURATION") && - (!strcasecmp(name, "saturation"))) - *value = val; - else - if(!strcmp(attributes[i].name,"XV_HUE") && - (!strcasecmp(name, "hue"))){ - /* nasty nvidia detect */ - if (port_min == 0 && port_max == 360) - *value = (val>=0) ? (val-100) : (val+100); - else - *value = val; - } else + /* nasty nvidia detect */ + if (port_min == 0 && port_max == 360) + *value = (val >= 0) ? (val - 100) : (val + 100); + else + *value = val; + } else /* Note: since 22.01.2002 GATOS supports these attrs for radeons (NK) */ - if(!strcmp(attributes[i].name,"XV_RED_INTENSITY") && - (!strcasecmp(name, "red_intensity"))) - *value = val; - else - if(!strcmp(attributes[i].name,"XV_GREEN_INTENSITY") && - (!strcasecmp(name, "green_intensity"))) - *value = val; - else - if(!strcmp(attributes[i].name,"XV_BLUE_INTENSITY") && - (!strcasecmp(name, "blue_intensity"))) - *value = val; - else continue; - - mp_dbg(MSGT_VO, MSGL_V, "xv_get_eq called! (%s, %d)\n", name, *value); - return(VO_TRUE); - } - } - return(VO_FALSE); + if (!strcmp(attributes[i].name, "XV_RED_INTENSITY") && + (!strcasecmp(name, "red_intensity"))) + *value = val; + else if (!strcmp(attributes[i].name, "XV_GREEN_INTENSITY") + && (!strcasecmp(name, "green_intensity"))) + *value = val; + else if (!strcmp(attributes[i].name, "XV_BLUE_INTENSITY") + && (!strcasecmp(name, "blue_intensity"))) + *value = val; + else + continue; + + mp_dbg(MSGT_VO, MSGL_V, "xv_get_eq called! (%s, %d)\n", + name, *value); + return (VO_TRUE); + } + } + return (VO_FALSE); } #endif |