Update to MPlayer SVN rev 34578.
[vaapi:athaifas-mplayer.git] / gui / ui / .svn / text-base / menu.c.svn-base
1 /*
2  * This file is part of MPlayer.
3  *
4  * MPlayer is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * MPlayer is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with MPlayer; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  */
18
19 #include <stdlib.h>
20 #include <stdio.h>
21 #include <stdint.h>
22 #include <string.h>
23
24 #include "config.h"
25 #include "help_mp.h"
26 #include "mp_msg.h"
27 #include "gui/app.h"
28 #include "gmplayer.h"
29
30 #include "widgets.h"
31
32 unsigned char * menuDrawBuffer = NULL;
33 int             menuRender = 1;
34 int             menuItem = -1;
35 int             oldMenuItem = -1;
36 int             menuX,menuY;
37 static int      menuIsInitialized = 0;
38
39 static void uiMenuDraw( void )
40 {
41  uint32_t * buf = NULL;
42  uint32_t * drw = NULL;
43  int             x,y,tmp;
44
45  if ( !guiApp.menuIsPresent || !guiApp.menu.Bitmap.Image ) return;
46  if ( !menuRender && !guiApp.menuWindow.Visible ) return;
47
48  if ( menuRender || menuItem != oldMenuItem )
49   {
50    memcpy( menuDrawBuffer,guiApp.menu.Bitmap.Image,guiApp.menu.Bitmap.ImageSize );
51 // ---
52    if ( menuItem != -1 )
53     {
54      buf=(uint32_t *)menuDrawBuffer;
55      drw=(uint32_t *)guiApp.menuSelected.Bitmap.Image;
56      for ( y=guiApp.menuItems[ menuItem ].y; y < guiApp.menuItems[ menuItem ].y + guiApp.menuItems[ menuItem ].height; y++ )
57        for ( x=guiApp.menuItems[ menuItem ].x; x < guiApp.menuItems[ menuItem ].x + guiApp.menuItems[ menuItem ].width; x++ )
58          {
59           tmp=drw[ y * guiApp.menuSelected.width + x ];
60           if ( !IS_TRANSPARENT ( tmp ) ) buf[ y * guiApp.menu.width + x ]=tmp;
61          }
62     }
63    oldMenuItem=menuItem;
64 // ---
65    wsConvert( &guiApp.menuWindow,menuDrawBuffer );
66    menuRender=0;
67   }
68  wsPutImage( &guiApp.menuWindow );
69 }
70
71 void uiMenuMouseHandle( int RX,int RY )
72 {
73  int x,y,i;
74
75  if ( !guiApp.menu.Bitmap.Image ) return;
76
77  menuItem=-1;
78  x=RX - guiApp.menuWindow.X;
79  y=RY - guiApp.menuWindow.Y;
80  if ( ( x < 0 ) || ( y < 0  ) || ( x > guiApp.menu.width ) || ( y > guiApp.menu.height ) )
81   {
82    wsPostRedisplay( &guiApp.menuWindow );
83    return;
84   }
85
86  for( i=0;i<=guiApp.IndexOfMenuItems;i++ )
87   {
88    if ( wgIsRect( x,y,
89          guiApp.menuItems[i].x,guiApp.menuItems[i].y,
90          guiApp.menuItems[i].x+guiApp.menuItems[i].width,guiApp.menuItems[i].y+guiApp.menuItems[i].height ) ) { menuItem=i; break; }
91   }
92  wsPostRedisplay( &guiApp.menuWindow );
93 }
94
95 void uiShowMenu( int mx,int my )
96 {
97  int x,y;
98
99  if ( !guiApp.menuIsPresent || !guiApp.menu.Bitmap.Image ) return;
100
101  x=mx;
102  if ( x + guiApp.menuWindow.Width > wsMaxX ) x=wsMaxX - guiApp.menuWindow.Width - 1 + wsOrgX;
103  y=my;
104  if ( y + guiApp.menuWindow.Height > wsMaxY ) y=wsMaxY - guiApp.menuWindow.Height - 1 + wsOrgY;
105
106  menuX=x; menuY=y;
107
108  menuItem = 0;
109
110  wsMoveWindow( &guiApp.menuWindow,True,x,y );
111  wsRaiseWindowTop( wsDisplay,guiApp.menuWindow.WindowID );
112  wsSetLayer( wsDisplay,guiApp.menuWindow.WindowID,1 );
113  menuRender=1;
114  wsVisibleWindow( &guiApp.menuWindow,wsShowWindow );
115  wsPostRedisplay( &guiApp.menuWindow );
116 }
117
118 void uiHideMenu( int mx,int my,int w )
119 {
120  int x,y,i=menuItem;
121
122  if ( !guiApp.menuIsPresent || !guiApp.menu.Bitmap.Image ) return;
123
124  x=mx-menuX;
125  y=my-menuY;
126 // x=RX - guiApp.menuWindow.X;
127 // y=RY - guiApp.menuWindow.Y;
128
129  wsVisibleWindow( &guiApp.menuWindow,wsHideWindow );
130
131  if ( ( x < 0 ) || ( y < 0 ) ) return;
132
133 // printf( "---------> %d %d,%d\n",i,x,y );
134 // printf( "--------> mi: %d,%d %dx%d\n",guiApp.menuItems[i].x,guiApp.menuItems[i].y,guiApp.menuItems[i].width,guiApp.menuItems[i].height );
135  if ( wgIsRect( x,y,
136         guiApp.menuItems[i].x,guiApp.menuItems[i].y,
137         guiApp.menuItems[i].x+guiApp.menuItems[i].width,
138         guiApp.menuItems[i].y+guiApp.menuItems[i].height ) )
139    {
140     uiEventHandling( guiApp.menuItems[i].message,(float)w );
141    }
142 }
143
144 void uiMenuInit( void )
145 {
146
147  if ( menuIsInitialized || !guiApp.menuIsPresent || !guiApp.menu.Bitmap.Image ) return;
148
149  guiApp.menu.x=0;
150  guiApp.menu.y=0;
151
152  if ( ( menuDrawBuffer = calloc( 1,guiApp.menu.Bitmap.ImageSize ) ) == NULL )
153   {
154     mp_msg( MSGT_GPLAYER,MSGL_DBG2,MSGTR_NEMFMR );
155    gtkMessageBox( GTK_MB_FATAL,MSGTR_NEMFMR );
156    return;
157   }
158
159  wsCreateWindow( &guiApp.menuWindow,
160  guiApp.menu.x,guiApp.menu.y,guiApp.menu.width,guiApp.menu.height,
161  wsNoBorder,wsShowMouseCursor|wsHandleMouseButton|wsHandleMouseMove,wsOverredirect|wsHideFrame|wsMaxSize|wsMinSize|wsHideWindow,"MPlayer menu" );
162
163  wsSetShape( &guiApp.menuWindow,guiApp.menu.Mask.Image );
164
165  mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[menu] menuWindow ID: 0x%x\n",(int)guiApp.menuWindow.WindowID );
166
167  menuIsInitialized=1;
168  guiApp.menuWindow.ReDraw=uiMenuDraw;
169 // guiApp.menuWindow.MouseHandler=uiMenuMouseHandle;
170 // guiApp.menuWindow.KeyHandler=uiMainKeyHandle;
171  menuRender=1; wsPostRedisplay( &guiApp.menuWindow );
172 }