当前位置

Mplayer的GTK2版本UI

主标签

Mplayer的UI还是很让人怀念的,虽然它仅仅是个UI,其他的功能一概没有.

但是他支持Skin,速度快,而且操作起来也不复杂。但是只有GTK+-1.x的版本。

这个是绝对不行的,至少Magic将不再支持GTK+-1.x,要么我们放弃,要么我们移植到gtk2.

现在有现成的gtk2补丁,gentoo里面有一个,仅仅需要修改一下about。

但是patch完了却不尽人意。右键菜单不能用了,而且,就这么点代码,这个程序肯定不是一个纯正的gtk2程序。

鉴于Mplayer UI的性能,决定尝试一下:

UI位于mplayer/Gui目录

wm目录下是有关X的底层定义:
拖放,鼠标按键等等。
mplayer目录是对Ui的实现,因为用到了gtk,所以
还有一个gtk目录,是对具体widget的实现:比如菜单,about对话框等等。

mplayer有两个菜单,一个是邮件菜单,就是我们常用的,一个是中健菜单,
可以支持皮肤的那个。
中间菜单没有VCD和DVD子菜单,但是其他功能相同,关于菜单的构件,是由
gtk/menu.c完成的,代码很简单,自己看。

那么mplayer的带皮肤的Ui是怎么实现的?
是在Gui/mplayer目录实现
我们只分析两个,mplayer主窗口的事件和播放窗口的事件。
mw.c定义了主窗口的事件。sw.c定义了screen windows的事件,
也就是说播放窗口鼠标右键不正常肯定是sw.c的问题。

看一下这个函数:
void mplSubMouseHandle( int Button,int X,int Y,int RX,int RY )
{
static int mplSubMoved = 0;
static int msButton = 0;

mplPBShow( X,Y );

switch( Button )
{
case wsPRMouseButton:
gtkShow( evShowPopUpMenu,NULL );
break;
case wsPMMouseButton:
gtkShow( evHidePopUpMenu,NULL );
mplShowMenu( RX,RY );
msButton=wsPMMouseButton;
break;
case wsRMMouseButton:
mplHideMenu( RX,RY,1 );
msButton=0;
break;
// ---
case wsPLMouseButton:
gtkShow( evHidePopUpMenu,NULL );
sx=X; sy=Y;
msButton=wsPLMouseButton;
mplSubMoved=0;
break;
case wsMoveMouse:
switch ( msButton )
{
case wsPLMouseButton:
mplSubMoved=1;
if ( !appMPlayer.subWindow.isFullScreen ) wsMoveWindow( &appMPlayer.subWindow,False,RX - sx,RY - sy );
break;
case wsPMMouseButton:
mplMenuMouseHandle( X,Y,RX,RY );
break;
default: mplPBShow( X,Y ); break;
}
break;
case wsRLMouseButton:
if ( ( !mplSubMoved )&&( appMPlayer.subWindow.isFullScreen ) )
{
if( SubVisible++%2 ) wsMoveTopWindow( wsDisplay,appMPlayer.mainWindow.WindowID );
else wsMoveTopWindow( wsDisplay,appMPlayer.subWindow.WindowID );
}
msButton=0;
mplSubMoved=0;
break;
}
}
里面定义了鼠标按键的判断。

按键是在Gui/wm/ws.h定义的:

#define wsPLMouseButton 1
#define wsPMMouseButton 2
#define wsPRMouseButton 3
#define wsP4MouseButton 4
#define wsP5MouseButton 5
#define wsRLMouseButton 1 + 128
#define wsRMMouseButton 2 + 128
#define wsRRMouseButton 3 + 128
#define wsR4MouseButton 4 + 128
#define wsR5MouseButton 5 + 128
#define wsEnterWindow 253
#define wsLeaveWindow 254
#define wsMoveMouse 255

#define wsShowMouseCursor 1
#define wsMouse 1
#define wsHideMouseCursor 0
#define wsNoMouse 0
#define wsHandleMouseButton 2
#define wsHandleMouseMove 4

现在怎么修改大家应该清楚了。

mw.c也一样,不过不要乱改,改错了就会乱弹菜单了,呵呵。

关于菜单的中文翻译,我们都知道,mplayer是编译时包含的,也就是根据制定的locale包含定义了中文翻译的头文件。
有一个help_mp.h,configure后生成,如果指定--language=zh_CN,他就包含
help目录下的help_mp-zh_CN.h,这个是中文翻译,给命令行的mplayer和UI使用.
gtk2很是麻烦,必须UTF8字符串,所以必须把help_mp-zh_CN转成utf8格式。这样菜单就可以正常显示中文了。但是mplayer命令是在命令行运行的,如果没有utf8的终端,就会是乱码,所以最好的办法是把两者分开,无所谓了,反正很少有人直接从命令行播放。这个如果改了,就提交不了patch了。

现在的补丁,不支持gtk+,只支持gtk2,所以也麻烦,mplayer CVS肯定不会接受。