|
发表于 2002-12-30 13:31:12
|
显示全部楼层
本次源码修改基于NightHK3兄弟提出的方法,非常感谢!
修正的bug:rh8下gnome全屏后不能恢复的bug,其中,前面的帖子中NightHK3兄弟已经解决按"F"键全屏恢复的bug,现在的修改是订正gnome下全屏后无法用右键菜单中的"正常大小"选项恢复的bug,并顺带修正了一个判断当前播放窗口是否是单倍播放窗口的小bug(这个bug的现象是:播放电影时,如果你点了最大化按钮,右键菜单上"正常大小"还是勾上)
分析并修改:先下载NightHK3兄弟的源码覆盖编译了一次,证实在gnome下用F键可以恢复窗口,但NightHK3兄弟方案中的恢复后的窗口为固定大小,有点别扭,于是改动了一下play.c,改成恢复到前次操作的窗口大小,但右键菜单中的"正常大小"还不行;打开mplayersource/Gui/mplayer/gtk/menu.c,在那里发现如下代码:
[code:1]
void ActivateMenuItem( int Item )
{
// fprintf( stderr,"[menu] item: %d.%d\n",Item&0xffff,Item>>16 );
gtkPopupMenu=Item & 0x0000ffff;
gtkPopupMenuParam=Item >> 16;
mplEventHandling( Item & 0x0000ffff,Item >> 16 );
}
GtkWidget * AddMenuCheckItem(GtkWidget* Menu,char* label, gboolean state, int Number)
{
GtkWidget * Item = NULL;
Item=gtk_check_menu_item_new_with_label( label );
gtk_menu_append( GTK_MENU( Menu ),Item );
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(Item),state);
gtk_signal_connect_object( GTK_OBJECT(Item),"activate",
GTK_SIGNAL_FUNC(ActivateMenuItem),(gpointer)Number );
gtk_widget_show( Item );
return Item;
}
.
.
.
.
AddMenuCheckItem( Menu,MSGTR_MENU_NormalSize" ",b1, evNormalSize );
AddMenuCheckItem( Menu,MSGTR_MENU_DoubleSize,b2,evDoubleSize );
AddMenuCheckItem( Menu,MSGTR_MENU_FullScreen,appMPlayer.subWindow.isFullScreen,evFullScreen );[/code:1]
这些代码是即时生成右键菜单,并定义相关动作的,最后的几行代码是就是定义"正常大小","双倍大小","全屏"这三个选项的动作
简单解释一下AddMenuCheckItem,前面有定义
[code:1]GtkWidget * AddMenuCheckItem(GtkWidget* Menu,char* label, gboolean state, int Number)[/code:1]
label参数--设置选项的名字,state--设置选项的状态是否已经被选中(就是选项前面是否已经勾上),Number--点击时执行的函数代号(evFullscreen是26,在头文件中有宏定义)
由上面的代码可以看出,点击菜单选项的动作先被关联到ActivateMenuItem,再关联到mplEventHandling函数
打开mplayersource/Gui/mplayer/mw.c,可找到mplEventHandling函数的如下代码:
[code:1]
void mplEventHandling( int msg,float param )
{
.
.
.
case evDoubleSize:
if ( guiIntfStruct.Playing )
{
appMPlayer.subWindow.isFullScreen=True;
appMPlayer.subWindow.OldX=( wsMaxX - guiIntfStruct.MovieWidth * 2 ) / 2;
appMPlayer.subWindow.OldY=( wsMaxY - guiIntfStruct.MovieHeight * 2 ) / 2;
appMPlayer.subWindow.OldWidth=guiIntfStruct.MovieWidth * 2; appMPlayer.subWindow.OldHeight=guiIntfStruct.MovieHeight * 2;
wsFullScreen( &appMPlayer.subWindow );
vo_fs=0;
}
break;
case evNormalSize:
if ( guiIntfStruct.Playing )
{
appMPlayer.subWindow.isFullScreen=True;
appMPlayer.subWindow.OldX=( wsMaxX - guiIntfStruct.MovieWidth ) / 2;
appMPlayer.subWindow.OldY=( wsMaxY - guiIntfStruct.MovieHeight ) / 2;
appMPlayer.subWindow.OldWidth=guiIntfStruct.MovieWidth; appMPlayer.subWindow.OldHeight=guiIntfStruct.MovieHeight;
wsFullScreen( &appMPlayer.subWindow );
vo_fs=0;
break;
} else if ( !appMPlayer.subWindow.isFullScreen ) break;
case evFullScreen:
for ( j=0;j<appMPlayer.NumberOfItems + 1;j++ )
{
if ( appMPlayer.Items[j].msg == evFullScreen )
{
appMPlayer.Items[j].tmp=!appMPlayer.Items[j].tmp;
appMPlayer.Items[j].pressed=appMPlayer.Items[j].tmp;
}
}
mplFullScreen();
break;
[/code:1]
从这些代码可以看出,全屏是执行mplFullScreen这个函数,而在"正常大小"和"双倍大小"的代码,在gnome环境下执行时失效,因此,现在要做的就是修正这两部分的代码,按NightHK3兄弟的方案,加入运行窗口管理器环境的判断,如果是kde,则执行原来的代码,如果不是kde,则执行NightHK3兄弟的方案代码,改正后的相应部分代码如下:
[code:1]
case evDoubleSize: //linuxfans.org_hack:
if ( guiIntfStruct.Playing && wsIsKDE()) //正在播放,kde环境
{
appMPlayer.subWindow.isFullScreen=True;
appMPlayer.subWindow.OldX=( wsMaxX - guiIntfStruct.MovieWidth * 2 ) / 2;
appMPlayer.subWindow.OldY=( wsMaxY - guiIntfStruct.MovieHeight * 2 ) / 2;
appMPlayer.subWindow.OldWidth=guiIntfStruct.MovieWidth * 2; appMPlayer.subWindow.OldHeight=guiIntfStruct.MovieHeight * 2;
wsFullScreen( &appMPlayer.subWindow );//重新设置窗口
vo_fs=0;
}
else if ( guiIntfStruct.Playing && !wsIsKDE()) //正在播放,非kde环境
{
wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow ); //隐藏窗口
wsResizeWindow( &appMPlayer.subWindow,guiIntfStruct.MovieWidth*2, guiIntfStruct.MovieHeight*2); //设置两倍窗口大小
wsMoveWindow( &appMPlayer.subWindow,True,appMPlayer.sub.x,appMPlayer.sub.y ); //移动窗口到屏幕正中
wsWindowDecoration( &appMPlayer.subWindow,appMPlayer.subWindow.Decorations ); //设置窗口边框显示
wsVisibleWindow( &appMPlayer.subWindow,wsShowWindow ); //重新显示窗口
appMPlayer.subWindow.isFullScreen=0;vo_fs=0; //设置相应的标志,其中appxxx=0代表窗口非全屏状态(1全屏),vo_fs=0代表播放窗口里的图像处于非全屏状态
}
break;
case evNormalSize: //linuxfans.org_hack:
if ( guiIntfStruct.Playing &&wsIsKDE()) //正在播放,kde环境
{
appMPlayer.subWindow.isFullScreen=True;
appMPlayer.subWindow.OldX=( wsMaxX - guiIntfStruct.MovieWidth ) / 2;
appMPlayer.subWindow.OldY=( wsMaxY - guiIntfStruct.MovieHeight ) / 2;
appMPlayer.subWindow.OldWidth=guiIntfStruct.MovieWidth; appMPlayer.subWindow.OldHeight=guiIntfStruct.MovieHeight;
wsFullScreen( &appMPlayer.subWindow ); //重新设置窗口
vo_fs=0;
break;
}
else if ( guiIntfStruct.Playing &&!wsIsKDE()) //正在播放,非kde环境
{
wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow );//隐藏窗口
wsResizeWindow( &appMPlayer.subWindow,guiIntfStruct.MovieWidth, guiIntfStruct.MovieHeight); //设置单倍窗口大小
wsMoveWindow( &appMPlayer.subWindow,True,appMPlayer.sub.x,appMPlayer.sub.y );//移动窗口到屏幕正中
wsWindowDecoration( &appMPlayer.subWindow,appMPlayer.subWindow.Decorations );//设置窗口边框显示
wsVisibleWindow( &appMPlayer.subWindow,wsShowWindow );//重新显示窗口
appMPlayer.subWindow.isFullScreen=0;vo_fs=0;//设置相应的标志
break;
}
else if ( !appMPlayer.subWindow.isFullScreen ) break;
[/code:1]
这样修改后,即可修正菜单选项不能恢复的bug
顺带修正:
mplayersource/Gui/mplayer/gtk/menu.c的最后有如下代码:
[code:1]
if ( !appMPlayer.subWindow.isFullScreen && guiIntfStruct.Playing )
{
if ( guiIntfStruct.NoWindow == False )
{
int b1 = 0, b2 = 0;
AddSeparator( Menu );
if ( !appMPlayer.subWindow.isFullScreen && guiIntfStruct.Playing )
{
if ( ( appMPlayer.subWindow.Width == guiIntfStruct.MovieWidth * 2 )&&
( appMPlayer.subWindow.Height == guiIntfStruct.MovieHeight * 2 ) )
b2=1;
else
b1=1;
}
...}}
[/code:1]
这里的b1,b2是右键菜单中"正常大小"和"双倍大小"选项的状态,作者的代码中只判断了双倍窗口的状态,如果窗口处于非全屏,非双倍状态(譬如最大化窗口),则b1为1,右键菜单中的"正常大小"被选中,和实际情况不符,因此加上判断修改,相应部分改动如下:
[code:1]
if ( !appMPlayer.subWindow.isFullScreen && guiIntfStruct.Playing )
{
if ( ( appMPlayer.subWindow.Width == guiIntfStruct.MovieWidth * 2 )&&
( appMPlayer.subWindow.Height == guiIntfStruct.MovieHeight * 2 ) )
b2=1;
else if ( ( appMPlayer.subWindow.Width == guiIntfStruct.MovieWidth )&& ( appMPlayer.subWindow.Height == guiIntfStruct.MovieHeight ) )
b1=1;
}
[/code:1]
至此修改完成,编译通过,测试效果良好,暂时没见副作用,对于一些朋友说的gnome下全屏后还能看见面板的情况,请将视频模式设成xv,我在xv模式下测试没这个现象,而在x11模式下偶尔有这个现象出现,估计是实现全屏的方法不完善所致.
修改过的源码包暂时在这里下载:
http://www.linuxcn.org/soft/temp/gui.tar.gz
下载后解压,看里面的readme.txt操作,请按下面的步骤重新编译(直接make clean编译无效)
make uninstall
./configure --enable-gui
make clean
make
make install |
|