📄 ws.c
字号:
}void wsPutImage( wsTWindow * win ){ if ( wsUseXShm ) { XShmPutImage( wsDisplay,win->WindowID,win->wGC,win->xImage, 0,0, ( win->Width - win->xImage->width ) / 2,( win->Height - win->xImage->height ) / 2, win->xImage->width,win->xImage->height,0 ); } else { XPutImage( wsDisplay,win->WindowID,win->wGC,win->xImage, 0,0, ( win->Width - win->xImage->width ) / 2,( win->Height - win->xImage->height ) / 2, win->xImage->width,win->xImage->height ); }}// ----------------------------------------------------------------------------------------------// Move window to x, y.// ----------------------------------------------------------------------------------------------void wsMoveWindow( wsTWindow * win,int b,int x, int y ){ if ( b ) { switch ( x ) { case -1: win->X=( wsMaxX / 2 ) - ( win->Width / 2 ) + wsOrgX; break; case -2: win->X=wsMaxX - win->Width + wsOrgX; break; default: win->X=x; break; } switch ( y ) { case -1: win->Y=( wsMaxY / 2 ) - ( win->Height / 2 ) + wsOrgY; break; case -2: win->Y=wsMaxY - win->Height + wsOrgY; break; default: win->Y=y; break; } } else { win->X=x; win->Y=y; } win->SizeHint.flags=PPosition | PWinGravity; win->SizeHint.x=win->X; win->SizeHint.y=win->Y; win->SizeHint.win_gravity=StaticGravity; XSetWMNormalHints( wsDisplay,win->WindowID,&win->SizeHint ); XMoveWindow( wsDisplay,win->WindowID,win->X,win->Y ); if ( win->ReSize ) win->ReSize( win->X,win->Y,win->Width,win->Height );}// ----------------------------------------------------------------------------------------------// Resize window to sx, sy.// ----------------------------------------------------------------------------------------------void wsResizeWindow( wsTWindow * win,int sx, int sy ){ win->Width=sx; win->Height=sy; win->SizeHint.flags=PPosition | PSize | PWinGravity;// | PBaseSize; win->SizeHint.x=win->X; win->SizeHint.y=win->Y; win->SizeHint.width=win->Width; win->SizeHint.height=win->Height; if ( win->Property & wsMinSize ) { win->SizeHint.flags|=PMinSize; win->SizeHint.min_width=win->Width; win->SizeHint.min_height=win->Height; } if ( win->Property & wsMaxSize ) { win->SizeHint.flags|=PMaxSize; win->SizeHint.max_width=win->Width; win->SizeHint.max_height=win->Height; } win->SizeHint.win_gravity=StaticGravity; win->SizeHint.base_width=sx; win->SizeHint.base_height=sy; if ( vo_wm_type == 0 ) XUnmapWindow( wsDisplay,win->WindowID ); XSetWMNormalHints( wsDisplay,win->WindowID,&win->SizeHint ); XResizeWindow( wsDisplay,win->WindowID,sx,sy ); XMapRaised( wsDisplay,win->WindowID ); if ( win->ReSize ) win->ReSize( win->X,win->Y,win->Width,win->Height );}// ----------------------------------------------------------------------------------------------// Iconify window.// ----------------------------------------------------------------------------------------------void wsIconify( wsTWindow win ){ XIconifyWindow( wsDisplay,win.WindowID,0 ); }// ----------------------------------------------------------------------------------------------// Move top the window.// ----------------------------------------------------------------------------------------------void wsMoveTopWindow( Display * wsDisplay,Window win ){// XUnmapWindow( wsDisplay,win );// XMapWindow( wsDisplay,win ); XMapRaised( wsDisplay,win ); XRaiseWindow( wsDisplay,win );}// ----------------------------------------------------------------------------------------------// Set window background to 'color'.// ----------------------------------------------------------------------------------------------void wsSetBackground( wsTWindow * win,int color ){ XSetWindowBackground( wsDisplay,win->WindowID,color ); }void wsSetBackgroundRGB( wsTWindow * win,int r,int g,int b ){ int color = 0; switch ( wsOutMask ) { case wsRGB32: case wsRGB24: color=( r << 16 ) + ( g << 8 ) + b; break; case wsBGR32: case wsBGR24: color=( b << 16 ) + ( g << 8 ) + r; break; case wsRGB16: PACK_RGB16( b,g,r,color ); break; case wsBGR16: PACK_RGB16( r,g,b,color ); break; case wsRGB15: PACK_RGB15( b,g,r,color ); break; case wsBGR15: PACK_RGB15( r,g,b,color ); break; } XSetWindowBackground( wsDisplay,win->WindowID,color );}void wsSetForegroundRGB( wsTWindow * win,int r,int g,int b ){ int color = 0; switch ( wsOutMask ) { case wsRGB32: case wsRGB24: color=( r << 16 ) + ( g << 8 ) + b; break; case wsBGR32: case wsBGR24: color=( b << 16 ) + ( g << 8 ) + r; break; case wsRGB16: PACK_RGB16( b,g,r,color ); break; case wsBGR16: PACK_RGB16( r,g,b,color ); break; case wsRGB15: PACK_RGB15( b,g,r,color ); break; case wsBGR15: PACK_RGB15( r,g,b,color ); break; } XSetForeground( wsDisplay,win->wGC,color );}// ----------------------------------------------------------------------------------------------// Draw string at x,y with fc ( foreground color ) and bc ( background color ).// ----------------------------------------------------------------------------------------------void wsDrawString( wsTWindow win,int x,int y,char * str,int fc,int bc ){ XSetForeground( wsDisplay,win.wGC,bc ); XFillRectangle( wsDisplay,win.WindowID,win.wGC,x,y, XTextWidth( win.Font,str,strlen( str ) ) + 20, win.FontHeight + 2 ); XSetForeground( wsDisplay,win.wGC,fc ); XDrawString( wsDisplay,win.WindowID,win.wGC,x + 10,y + 13,str,strlen( str ) );}// ----------------------------------------------------------------------------------------------// Calculation string width.// ----------------------------------------------------------------------------------------------int wsTextWidth( wsTWindow win,char * str ){ return XTextWidth( win.Font,str,strlen( str ) ) + 20; }// ----------------------------------------------------------------------------------------------// Show / hide mouse cursor.// ----------------------------------------------------------------------------------------------void wsVisibleMouse( wsTWindow * win,int m ){ switch ( m ) { case wsShowMouseCursor: if ( win->wsCursor != None ) { XFreeCursor( wsDisplay,win->wsCursor ); win->wsCursor=None; } XDefineCursor( wsDisplay,win->WindowID,0 ); break; case wsHideMouseCursor: win->wsCursor=XCreatePixmapCursor( wsDisplay,win->wsCursorPixmap,win->wsCursorPixmap,&win->wsColor,&win->wsColor,0,0 ); XDefineCursor( wsDisplay,win->WindowID,win->wsCursor ); break; } XFlush( wsDisplay );}int wsGetDepthOnScreen( void ){ int depth; XImage * mXImage; Visual * visual; if( (depth = vo_find_depth_from_visuals( wsDisplay,wsScreen,&visual )) > 0 ) { mXImage = XCreateImage( wsDisplay,visual,depth,ZPixmap,0,NULL, 1,1,32,0 ); wsDepthOnScreen = mXImage->bits_per_pixel; wsRedMask=mXImage->red_mask; wsGreenMask=mXImage->green_mask; wsBlueMask=mXImage->blue_mask;#ifdef WORDS_BIGENDIAN wsNonNativeOrder = mXImage->byte_order == LSBFirst;#else wsNonNativeOrder = mXImage->byte_order == MSBFirst;#endif XDestroyImage( mXImage ); } else { int bpp,ibpp; XWindowAttributes attribs; mXImage=XGetImage( wsDisplay,wsRootWin,0,0,1,1,AllPlanes,ZPixmap ); bpp=mXImage->bits_per_pixel; XGetWindowAttributes( wsDisplay,wsRootWin,&attribs ); ibpp=attribs.depth; mXImage=XGetImage( wsDisplay,wsRootWin,0,0,1,1,AllPlanes,ZPixmap ); bpp=mXImage->bits_per_pixel; if ( ( ibpp + 7 ) / 8 != ( bpp + 7 ) / 8 ) ibpp=bpp; wsDepthOnScreen=ibpp; wsRedMask=mXImage->red_mask; wsGreenMask=mXImage->green_mask; wsBlueMask=mXImage->blue_mask; XDestroyImage( mXImage ); } return wsDepthOnScreen;}void wsXDone( void ){ XCloseDisplay( wsDisplay );}void wsVisibleWindow( wsTWindow * win,int show ){ switch( show ) { case wsShowWindow: XMapRaised( wsDisplay,win->WindowID ); break; case wsHideWindow: XUnmapWindow( wsDisplay,win->WindowID ); break; } XFlush( wsDisplay );}void wsDestroyImage( wsTWindow * win ){ if ( win->xImage ) { XDestroyImage( win->xImage ); if ( wsUseXShm ) { XShmDetach( wsDisplay,&win->Shminfo ); shmdt( win->Shminfo.shmaddr ); } } win->xImage=NULL;}void wsCreateImage( wsTWindow * win,int Width,int Height ){ int CompletionType = -1; if ( wsUseXShm ) { CompletionType=XShmGetEventBase( wsDisplay ) + ShmCompletion; win->xImage=XShmCreateImage( wsDisplay,win->VisualInfo.visual, win->VisualInfo.depth,ZPixmap,NULL,&win->Shminfo,Width,Height ); if ( win->xImage == NULL ) { mp_msg( MSGT_GPLAYER,MSGL_FATAL,MSGTR_WS_ShmError ); exit( 0 ); } win->Shminfo.shmid=shmget( IPC_PRIVATE,win->xImage->bytes_per_line * win->xImage->height,IPC_CREAT|0777 ); if ( win->Shminfo.shmid < 0 ) { XDestroyImage( win->xImage ); mp_msg( MSGT_GPLAYER,MSGL_FATAL,MSGTR_WS_ShmError ); exit( 0 ); } win->Shminfo.shmaddr=(char *)shmat( win->Shminfo.shmid,0,0 ); if ( win->Shminfo.shmaddr == ((char *) -1) ) { XDestroyImage( win->xImage ); if ( win->Shminfo.shmaddr != ((char *) -1) ) shmdt( win->Shminfo.shmaddr ); mp_msg( MSGT_GPLAYER,MSGL_FATAL,MSGTR_WS_ShmError ); exit( 0 ); } win->xImage->data=win->Shminfo.shmaddr; win->Shminfo.readOnly=0; XShmAttach( wsDisplay,&win->Shminfo ); shmctl( win->Shminfo.shmid,IPC_RMID,0 ); } else { win->xImage=XCreateImage( wsDisplay,win->VisualInfo.visual,win->VisualInfo.depth, ZPixmap,0,0,Width,Height, (wsDepthOnScreen == 3) ? 32 : wsDepthOnScreen, 0 ); if ( ( win->xImage->data=malloc( win->xImage->bytes_per_line * win->xImage->height ) ) == NULL ) { mp_msg( MSGT_GPLAYER,MSGL_FATAL,MSGTR_WS_NotEnoughMemoryDrawBuffer ); exit( 0 ); } } win->ImageData=(unsigned char *)win->xImage->data; win->ImageDataw=(unsigned short int *)win->xImage->data; win->ImageDatadw=(unsigned int *)win->xImage->data;}void wsResizeImage( wsTWindow * win,int Width,int Height ){ wsDestroyImage( win ); wsCreateImage( win,Width,Height ); }int wsGetOutMask( void ){ if ( ( wsDepthOnScreen == 32 )&&( wsRedMask == 0xff0000 )&&( wsGreenMask == 0x00ff00 )&&( wsBlueMask == 0x0000ff ) ) return wsRGB32; if ( ( wsDepthOnScreen == 32 )&&( wsRedMask == 0x0000ff )&&( wsGreenMask == 0x00ff00 )&&( wsBlueMask == 0xff0000 ) ) return wsBGR32; if ( ( wsDepthOnScreen == 24 )&&( wsRedMask == 0xff0000 )&&( wsGreenMask == 0x00ff00 )&&( wsBlueMask == 0x0000ff ) ) return wsRGB24; if ( ( wsDepthOnScreen == 24 )&&( wsRedMask == 0x0000ff )&&( wsGreenMask == 0x00ff00 )&&( wsBlueMask == 0xff0000 ) ) return wsBGR24; if ( ( wsDepthOnScreen == 16 )&&( wsRedMask == 0xf800 )&&( wsGreenMask == 0x7e0 )&&( wsBlueMask == 0x1f ) ) return wsRGB16; if ( ( wsDepthOnScreen == 16 )&&( wsRedMask == 0x1f )&&( wsGreenMask == 0x7e0 )&&( wsBlueMask == 0xf800 ) ) return wsBGR16; if ( ( wsDepthOnScreen == 15 )&&( wsRedMask == 0x7c00 )&&( wsGreenMask == 0x3e0 )&&( wsBlueMask == 0x1f ) ) return wsRGB15; if ( ( wsDepthOnScreen == 15 )&&( wsRedMask == 0x1f )&&( wsGreenMask == 0x3e0 )&&( wsBlueMask == 0x7c00 ) ) return wsBGR15; return 0;}void wsSetTitle( wsTWindow * win,char * name ){ XStoreName( wsDisplay,win->WindowID,name ); }void wsSetMousePosition( wsTWindow * win,int x, int y ){ XWarpPointer( wsDisplay,wsRootWin,win->WindowID,0,0,0,0,x,y ); }#ifdef ENABLE_DPMSstatic int dpms_disabled=0;static int timeout_save=0;void wsScreenSaverOn( Display *mDisplay ){ int nothing;#ifdef HAVE_XDPMS if ( dpms_disabled ) { if ( DPMSQueryExtension( mDisplay,¬hing,¬hing ) ) { if ( !DPMSEnable( mDisplay ) ) mp_msg( MSGT_GPLAYER,MSGL_ERR,MSGTR_WS_DpmsUnavailable ); // restoring power saving settings else { // DPMS does not seem to be enabled unless we call DPMSInfo BOOL onoff; CARD16 state; DPMSInfo( mDisplay,&state,&onoff ); if ( onoff ) mp_msg( MSGT_GPLAYER,MSGL_V,"Successfully enabled DPMS.\n" ); else mp_msg( MSGT_GPLAYER,MSGL_STATUS,MSGTR_WS_DpmsNotEnabled ); } } }#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 ); }}void wsScreenSaverOff( Display * mDisplay ){ int interval,prefer_blank,allow_exp,nothing;#ifdef HAVE_XDPMS if ( DPMSQueryExtension( mDisplay,¬hing,¬hing ) ) { BOOL onoff; CARD16 state; DPMSInfo( mDisplay,&state,&onoff ); if ( onoff ) { Status stat; mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"Disabling DPMS.\n" ); dpms_disabled=1; stat=DPMSDisable( mDisplay ); // monitor powersave off mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"stat: %d.\n",stat ); } }#endif XGetScreenSaver( mDisplay,&timeout_save,&interval,&prefer_blank,&allow_exp ); if ( timeout_save ) XSetScreenSaver( mDisplay,0,interval,prefer_blank,allow_exp ); // turning off screensaver}#endifvoid wsSetShape( wsTWindow * win,char * data ){#ifdef HAVE_XSHAPE if ( !wsUseXShape ) return; if ( data ) { win->Mask=XCreateBitmapFromData( wsDisplay,win->WindowID,data,win->Width,win->Height ); XShapeCombineMask( wsDisplay,win->WindowID,ShapeBounding,0,0,win->Mask,ShapeSet ); XFreePixmap( wsDisplay,win->Mask ); } else XShapeCombineMask( wsDisplay,win->WindowID,ShapeBounding,0,0,None,ShapeSet );#endif}void wsSetIcon( Display * dsp,Window win,Pixmap icon,Pixmap mask ){ XWMHints * wm; long data[2]; Atom iconatom; wm=XGetWMHints( dsp,win ); if ( !wm ) wm=XAllocWMHints(); wm->icon_pixmap=icon; wm->icon_mask=mask; wm->flags|=IconPixmapHint | IconMaskHint; XSetWMHints( dsp,win,wm ); data[0]=icon; data[1]=mask; iconatom=XInternAtom( dsp,"KWM_WIN_ICON",0 ); XChangeProperty( dsp,win,iconatom,iconatom,32,PropModeReplace,(unsigned char *)data,2 ); XFree( wm );}#include "wsmkeys.h"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -