diff options
Diffstat (limited to 'gui/mplayer/menu.c')
-rw-r--r-- | gui/mplayer/menu.c | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/gui/mplayer/menu.c b/gui/mplayer/menu.c new file mode 100644 index 0000000000..e8ef5cad97 --- /dev/null +++ b/gui/mplayer/menu.c @@ -0,0 +1,159 @@ + +#include <stdlib.h> +#include <stdio.h> +#include <inttypes.h> + +#include "app.h" +#include "../config.h" +#include "../help_mp.h" +#include "../mp_msg.h" + +#include "widgets.h" + +unsigned char * mplMenuDrawBuffer = NULL; +int mplMenuRender = 1; +int mplMenuItem = -1; +int mplOldMenuItem = -1; +int mplMenuX,mplMenuY; +static int mplMenuIsInitialized = 0; + +void mplHideMenu( int mx,int my,int w ); + +void mplMenuDraw( void ) +{ + uint32_t * buf = NULL; + uint32_t * drw = NULL; + int x,y,tmp; + + if ( !appMPlayer.menuIsPresent || !appMPlayer.menuBase.Bitmap.Image ) return; + if ( !mplMenuRender && !appMPlayer.menuWindow.Visible ) return; + + if ( mplMenuRender || mplMenuItem != mplOldMenuItem ) + { + memcpy( mplMenuDrawBuffer,appMPlayer.menuBase.Bitmap.Image,appMPlayer.menuBase.Bitmap.ImageSize ); +// --- + if ( mplMenuItem != -1 ) + { + buf=(uint32_t *)mplMenuDrawBuffer; + drw=(uint32_t *)appMPlayer.menuSelected.Bitmap.Image; + for ( y=appMPlayer.MenuItems[ mplMenuItem ].y; y < appMPlayer.MenuItems[ mplMenuItem ].y + appMPlayer.MenuItems[ mplMenuItem ].height; y++ ) + for ( x=appMPlayer.MenuItems[ mplMenuItem ].x; x < appMPlayer.MenuItems[ mplMenuItem ].x + appMPlayer.MenuItems[ mplMenuItem ].width; x++ ) + { + tmp=drw[ y * appMPlayer.menuSelected.width + x ]; + if ( tmp != 0x00ff00ff ) buf[ y * appMPlayer.menuBase.width + x ]=tmp; + } + } + mplOldMenuItem=mplMenuItem; +// --- + wsConvert( &appMPlayer.menuWindow,mplMenuDrawBuffer,appMPlayer.menuBase.Bitmap.ImageSize ); + mplMenuRender=0; + } + wsPutImage( &appMPlayer.menuWindow ); +} + +void mplMenuMouseHandle( int X,int Y,int RX,int RY ) +{ + int x,y,i; + + if ( !appMPlayer.menuBase.Bitmap.Image ) return; + + mplMenuItem=-1; + x=RX - appMPlayer.menuWindow.X; + y=RY - appMPlayer.menuWindow.Y; + if ( ( x < 0 ) || ( y < 0 ) || ( x > appMPlayer.menuBase.width ) || ( y > appMPlayer.menuBase.height ) ) + { + wsPostRedisplay( &appMPlayer.menuWindow ); + return; + } + + for( i=0;i<=appMPlayer.NumberOfMenuItems;i++ ) + { + if ( wgIsRect( x,y, + appMPlayer.MenuItems[i].x,appMPlayer.MenuItems[i].y, + appMPlayer.MenuItems[i].x+appMPlayer.MenuItems[i].width,appMPlayer.MenuItems[i].y+appMPlayer.MenuItems[i].height ) ) { mplMenuItem=i; break; } + } + wsPostRedisplay( &appMPlayer.menuWindow ); +} + +void mplShowMenu( int mx,int my ) +{ + int x,y; + + if ( !appMPlayer.menuIsPresent || !appMPlayer.menuBase.Bitmap.Image ) return; + + x=mx; + if ( x + appMPlayer.menuWindow.Width > wsMaxX ) x=wsMaxX - appMPlayer.menuWindow.Width - 1 + wsOrgX; + y=my; + if ( y + appMPlayer.menuWindow.Height > wsMaxY ) y=wsMaxY - appMPlayer.menuWindow.Height - 1 + wsOrgY; + + mplMenuX=x; mplMenuY=y; + + mplMenuItem = 0; + + wsMoveWindow( &appMPlayer.menuWindow,False,x,y ); + wsMoveTopWindow( wsDisplay,appMPlayer.menuWindow.WindowID ); + wsSetLayer( wsDisplay,appMPlayer.menuWindow.WindowID,1 ); + mplMenuRender=1; + wsVisibleWindow( &appMPlayer.menuWindow,wsShowWindow ); + wsPostRedisplay( &appMPlayer.menuWindow ); +} + +void mplHideMenu( int mx,int my,int w ) +{ + int x,y,i=mplMenuItem; + + if ( !appMPlayer.menuIsPresent || !appMPlayer.menuBase.Bitmap.Image ) return; + + x=mx-mplMenuX; + y=my-mplMenuY; +// x=RX - appMPlayer.menuWindow.X; +// y=RY - appMPlayer.menuWindow.Y; + + wsVisibleWindow( &appMPlayer.menuWindow,wsHideWindow ); + + if ( ( x < 0 ) || ( y < 0 ) ) return; + +// printf( "---------> %d %d,%d\n",i,x,y ); +// printf( "--------> mi: %d,%d %dx%d\n",appMPlayer.MenuItems[i].x,appMPlayer.MenuItems[i].y,appMPlayer.MenuItems[i].width,appMPlayer.MenuItems[i].height ); + if ( wgIsRect( x,y, + appMPlayer.MenuItems[i].x,appMPlayer.MenuItems[i].y, + appMPlayer.MenuItems[i].x+appMPlayer.MenuItems[i].width, + appMPlayer.MenuItems[i].y+appMPlayer.MenuItems[i].height ) ) + { + mplEventHandling( appMPlayer.MenuItems[i].msg,(float)w ); + } +} + +void mplMenuInit( void ) +{ + + if ( mplMenuIsInitialized || !appMPlayer.menuIsPresent || !appMPlayer.menuBase.Bitmap.Image ) return; + + appMPlayer.menuBase.x=0; + appMPlayer.menuBase.y=0; + + if ( ( mplMenuDrawBuffer = calloc( 1,appMPlayer.menuBase.Bitmap.ImageSize ) ) == NULL ) + { +#ifdef DEBUG + mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[menu.h] %s",MSGTR_NEMFMR ); +#endif + gtkMessageBox( GTK_MB_FATAL,MSGTR_NEMFMR ); + return; + } + + wsCreateWindow( &appMPlayer.menuWindow, + appMPlayer.menuBase.x,appMPlayer.menuBase.y,appMPlayer.menuBase.width,appMPlayer.menuBase.height, + wsNoBorder,wsShowMouseCursor|wsHandleMouseButton|wsHandleMouseMove,wsOverredirect|wsHideFrame|wsMaxSize|wsMinSize|wsHideWindow,"MPlayer menu" ); + + wsSetShape( &appMPlayer.menuWindow,appMPlayer.menuBase.Mask.Image ); + +#ifdef DEBUG + mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[menu.h] menu: 0x%x\n",(int)appMPlayer.menuWindow.WindowID ); +#endif + + mplMenuIsInitialized=1; + appMPlayer.menuWindow.ReDraw=mplMenuDraw; +// appMPlayer.menuWindow.MouseHandler=mplMenuMouseHandle; +// appMPlayer.menuWindow.KeyHandler=mplMainKeyHandle; + mplMenuRender=1; wsPostRedisplay( &appMPlayer.menuWindow ); +} |