QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4198|回复: 16

修改源程序,解决MPlayer的全屏问题

[复制链接]
发表于 2002-12-28 00:01:40 | 显示全部楼层 |阅读模式
本文提供的方法并不十分完美,主要是提供一个方法,希望能起到抛砖引玉的作用。
方法如下:
1.打开MPlayer-0.90rc2/Gui/wm下的ws.c文件,在结尾处加上如下一段代码:
int wsIsKDE( void )
{
Atom            type;
int             format;
unsigned long   nitems, bytesafter;
unsigned char * args = NULL;

Window                 win;
XEvent          xev;

int             wm = wsWMUnknown;


type=XInternAtom( wsDisplay,"_WIN_SUPPORTING_WM_CHECK",False );
if ( Success == XGetWindowProperty( wsDisplay,wsRootWin,type,0,65536 / sizeof( int32_t ),False,AnyPropertyType,&type,&format,&nitems,&bytesafter,&args ) && nitems > 0 )
  {
   XFree( args );
   return 0;
   }
else
  {
   return 1;
  }
}

这段代码是由wsWindowManagerType函数改编而来,主要是判断桌面是否使用Gnome2。

2.打开MPlayer-0.90rc2/Gui/wm下的ws.h文件,在结尾处添加“extern int wsIsKDE( void );”

3.打开MPlayer-0.90rc2/Gui/mplayer下的play.c文件,照以下代码修改mplFullScreen()函数:
void mplFullScreen( void )
{
if ( guiIntfStruct.NoWindow && guiIntfStruct.Playing ) return;
if (!wsIsKDE())
{
static int sx,sy;
// if ( !guiIntfStruct.Playing )
  {
   wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow );
   if ( appMPlayer.subWindow.isFullScreen )
    {
     wsResizeWindow( &appMPlayer.subWindow,350,240 ); /*别忘了修改这行,指定默认窗口大小,否则可能不能从全屏复元*/
     wsMoveWindow( &appMPlayer.subWindow,True,appMPlayer.sub.x,appMPlayer.sub.y );
     wsWindowDecoration( &appMPlayer.subWindow,appMPlayer.subWindow.Decorations );
     appMPlayer.subWindow.isFullScreen=0;
    }
    else
     {
      sx=appMPlayer.subWindow.Width; sy=appMPlayer.subWindow.Height;
      wsResizeWindow( &appMPlayer.subWindow,wsMaxX,wsMaxY );
      wsMoveWindow( &appMPlayer.subWindow,True,0,0 );
      wsWindowDecoration( &appMPlayer.subWindow,0 );
      appMPlayer.subWindow.isFullScreen=1;
     }
   vo_fs=appMPlayer.subWindow.isFullScreen;
   wsVisibleWindow( &appMPlayer.subWindow,wsShowWindow );
  }// else { vo_x11_fullscreen(); appMPlayer.subWindow.isFullScreen=vo_fs; }
  }
else
{
  if ( ( guiIntfStruct.Playing )&&( appMPlayer.subWindow.isFullScreen ) )
   {
    appMPlayer.subWindow.OldWidth=guiIntfStruct.MovieWidth; appMPlayer.subWindow.OldHeight=guiIntfStruct.MovieHeight;
    switch ( appMPlayer.sub.x )
     {
      case -1: appMPlayer.subWindow.OldX=( wsMaxX / 2 ) - ( appMPlayer.subWindow.OldWidth / 2 ); break;
      case -2: appMPlayer.subWindow.OldX=wsMaxX - appMPlayer.subWindow.OldWidth; break;
      default: appMPlayer.subWindow.OldX=appMPlayer.sub.x; break;
     }
    switch ( appMPlayer.sub.y )
     {
      case -1: appMPlayer.subWindow.OldY=( wsMaxY / 2 ) - ( appMPlayer.subWindow.OldHeight / 2 ); break;
      case -2: appMPlayer.subWindow.OldY=wsMaxY - appMPlayer.subWindow.OldHeight; break;
      default: appMPlayer.subWindow.OldY=appMPlayer.sub.y; break;
     }
   }
  wsFullScreen( &appMPlayer.subWindow );
  vo_fs=appMPlayer.subWindow.isFullScreen;
  wsSetLayer( wsDisplay,appMPlayer.mainWindow.WindowID,appMPlayer.subWindow.isFullScreen );
  wsSetLayer( wsDisplay,appMPlayer.menuWindow.WindowID,appMPlayer.subWindow.isFullScreen );
}

fullscreen=appMPlayer.subWindow.isFullScreen;
if ( guiIntfStruct.Playing ) wsSetBackgroundRGB( &appMPlayer.subWindow,0,0,0 );
  else wsSetBackgroundRGB( &appMPlayer.subWindow,appMPlayer.subR,appMPlayer.subG,appMPlayer.subB );
}

这段代码说明了两种实现全屏的方法,第一种对Gnome2有效,对kde支持不好,第二种对kde有效,而在Gnome2下不能从全屏恢复。系统默认编译第二种。现在我让它自动选择。

4.重新编译MPlayer

注意:在Gnome2下只能用快捷键“F”切换全屏,用菜单不行,希望哪位高手能解决。而且我只测试了rh8.0自带的Gnome2和KDE3,其它窗口管理器没试过。
rh8.0下测试通过。
发表于 2002-12-28 00:14:40 | 显示全部楼层
高!
回复

使用道具 举报

发表于 2002-12-28 00:38:01 | 显示全部楼层
mplayer的菜单里的全屏选项是调用evFullScreen函数,参数为appMPlayer.subWindow.isFullScreen(布尔值?)
你能说说上面改动的大概原理吗?大概说说,我试试能懂多少算多少
回复

使用道具 举报

 楼主| 发表于 2002-12-28 13:49:52 | 显示全部楼层
在play.c中:
void mplFullScreen( void ) //全屏设置函数
{
if (!wsIsKDE()) //wsIsKDE(),我加入的Gnome2判断函数
{
   全屏方法一:Gnome下可行,KDE下不可行
}
else
{
   全屏方法二:KDE下可行,Gnome2下不能从全屏复原
}
}

参数说明:
方法一中调用了如下函数:
wsResizeWindow() //设置窗口大小
wsMoveWindow()  //移动窗体
wsWindowDecoration()  //隐藏/显视窗体边框
wsVisibleWindow()   //隐藏/显视窗体
全屏具体实现:隐藏窗体--最大化窗体--隐藏窗体边框--显视窗体


方法二实际上调用了“ws.c”中的“wsFullScreen()”函数来实现全屏的
与方法一不同的是它直接设置了窗体参数,没有用“wsResizeWindow()”、“wsMoveWindow()”和“wsWindowDecoration()”
参数的含义可参考上述三个函数。
最后一步是关键,法一用wsVisibleWindow()来实现全屏,法二用“XMapRaised()”和“XRaiseWindow()”来实现全屏,这是两者的根本区别。
(对比一下wsMoveTopWindow()和wsVisibleWindow()你就会明白)
法二全屏具体实现:设置窗体位置--移动窗体到当前层上--最大化窗体--隐藏窗体边框--把当前层挪到所有窗体之上

希望大家也能把自己的修改方法说出来,互相学习,共同促进linux的发展。
回复

使用道具 举报

发表于 2002-12-28 15:29:12 | 显示全部楼层
效果还不够好,全屏后屏幕顶端的 GNOME 菜单条和底下的任务栏无法隐藏了。而且通过菜单全屏,恢复时窗口呈最大化状态。。。

不过比起以前全屏后只能靠 Alt + F4 恢复可好多了(Alt +F4 等于退出了 ),谢谢你的积极探索
(可惜我不是编程牛人啊~~~   )
回复

使用道具 举报

发表于 2002-12-28 15:50:42 | 显示全部楼层
你们讲的怎么这么地深奥,难懂的。

我编译的 mplayer 想怎么全屏,都没有问题的呢 !

看看我的 mplayer.spec 文件:


# $Id: mplayer.spec,v 1.36 2002/12/09 16:42:47 dude Exp $

# The default font size for subtitles : 14, 18, 24 or 28
%define fontsize        18

# Default font encoding, you may easily change to iso-8859-2 if needed
%define fontdir         iso-8859-1

# Is this a daily build? If so, put the date like "20020808" otherwise put 0
%define date            0
%define rcver           rc2

%define desktop_vendor  freshrpms

%define name mplayer
%define fname MPlayer
%define ver 0.90rc2
%define cvsbuild 20021225
%define ffversion 20021225

%define release 1

%define cvs 0

%if%{cvs}
%define version %{ver}.%{cvsbuild}
%define fversion %{cvsbuild}
%else
%define version %{ver}
%define fversion %{ver}
%endif

%ifnarch %{ix86}
%define         _without_win32  1
%define         _without_vidix  1
%endif

%if%{!?_without_gui:1}%{?_without_gui:0}
%define         _with_png       1
%endif

# The language to use in mplayer, one of : cz de dk en es fr hu nl no pl ro ru
%define mplang          zh

%define _win32_libdir   "/usr/local/lib/win32"
%define _xanim_libdir   "/usr/X11R6/lib/xanim"
%define _real_libdir    "/usr/local/Real/Codecs"

Summary: MPlayer, the Movie Player for Linux.
Name: mplayer
Version: 0.90
Release: %{rcver}.gugong2
Epoch: 2
License: GPL
Group: Applications/Multimedia
%if %{date}
Source0: http://www2.mplayerhq.hu/MPlayer/cvs/MPlayer-current.tar.bz2
%else
Source0: http://www2.mplayerhq.hu/MPlayer/cvs/MPlayer-%{version}%{rcver}.tar.bz2
%endif
Source1: http://www2.mplayerhq.hu/MPlayer/Skin/default.tar.bz2
Source2: http://www2.mplayerhq.hu/MPlayer/releases/mp-arial-iso-8859-1.zip
Source3: http://www2.mplayerhq.hu/MPlayer/releases/mp-arial-iso-8859-2.zip
Patch0: MPlayer-0.90pre9-runtimemsg.patch
Patch1: MPlayer-0.90pre10-redhat.patch
Patch2: MPlayer-0.90pre10-cdda.patch
Patch3: %{name}-rpm-cvs.patch
Patch4: %{name}-rpm-release.patch
Patch5: %{name}-gui.patch
Patch6: %{name}-warnings.patch
Patch7: %{name}-nodebug.patch
Patch8: %{name}-xanim-x86.patch
Patch9: %{name}-xanim-alpha.patch
Patch10: %{name}-loader.patch
Patch11: %{name}-loader-cosmetic.patch
Patch12: %{name}-libmpdvdkit2.patch
Patch13: %{name}-lavc.patch

URL: http://mplayerhq.hu/
BuildRoot: %{_tmppath}/%{name}-root
Requires: libdvdread, gtk+, SDL, divx4linux
Requires: lame, libvorbis
%{?_with_dvdnav:Requires: libdvdnav}
%{!?_without_alsa:Requires: alsa-lib}
%{!?_without_aalib:Requires: aalib}
%{!?_without_lirc:Requires: lirc}
%{!?_without_libdv:Requires: libdv}
%{!?_without_arts:Requires: arts}
BuildRequires: libdvdread-devel, gtk+-devel, SDL-devel, divx4linux
BuildRequires: lame-devel, libvorbis-devel, libmad
BuildRequires: /usr/bin/find, unzip, desktop-file-utils
%{?_with_dvdnav:BuildRequires: libdvdnav-devel}
%{!?_without_alsa:BuildRequires: alsa-lib-devel}
%{!?_without_aalib:BuildRequires: aalib-devel}
%{!?_without_cdparanoia:BuildRequires: cdparanoia-devel}
%{!?_without_libdv:BuildRequires: libdv-devel}
%{!?_without_arts:BuildRequires: arts-devel}

%description
MPlayer is a movie player. It plays most video formats as well as DVDs.
Its big feature is the wide range of supported output drivers. There are also
nice antialiased shaded subtitles and OSD.

Available rpmbuild rebuild options :

--without : alsa aalib lirc cdparanoia libdv arts dvdnav

%prep
%if %{date}
%setup -q -n MPlayer-%{date}
%else
%setup -q -n MPlayer-%{version}%{rcver}
%endif
%patch0 -p1 -b .runtimemsg
%patch1 -p0 -b .redhat
#%patch2 -p0 -b .cdda
%if%{cvs}
%setup -q -n %{fname}-%{fversion} -a 1
# needed with CVS snapshots
cp -ar ffmpeg/libavcodec .
find . -name CVS | xargs rm -rf
%else
%setup -q -n %{fname}-%{fversion}
%endif
%if%{cvs}
%patch3 -p1 -b .r
%else
%patch4 -p1 -b .r
%endif
#%{!?_without_gui:%patch5 -p1 -b .gui}
%patch6 -p1 -b .warn
%patch7 -p1 -b .nodebug
%ifarch %{ix86}
%patch8 -p1 -b .xanim
%endif
%ifarch alpha
%patch9 -p1 -b .xanim
%endif
%patch10 -p1 -b .loader
#%patch11 -p1 -b .loader-cosmetic
%patch12 -p1 -b .mpdvdkit2
%patch13 -p1 -b .lavc


%build
find . -name "CVS" | xargs rm -rf
./configure \
        --target=%{_target_platform} \
        --prefix=%{_prefix} \
        --datadir=%{_datadir}/mplayer \
        --confdir=%{_sysconfdir}/mplayer \
        --mandir=%{_mandir} \
        --language=%{mplang} \
        --enable-gui \
        --enable-largefiles \
        --enable-joystick \
        --disable-mpdvdkit \
        --enable-win32 \
        --with-win32libdir=%{_win32_libdir} \
        --with-xanimlibdir=%{_xanim_libdir} \
        --with-reallibdir=%{_real_libdir} \
        --enable-freetype \
        --with-freetype-config=/usr/bin/freetype-config \
        --enable-qtx-codecs \
        --enable-new-conf \
        --enable-menu \
        --enable-fbdev \
        --enable-fbdev=nocopy \
        --enable-mga \
        --enable-tdfxfb \
        --enable-vm \
        --enable-x11 \
        --enable-xmga \
        --enable-xv \
        --enable-dga \
        %{?_with_dvdnav:--disable-dvdnav} \
        %{?_without_alsa:--disable-alsa} \
        %{?_without_aalib:--disable-aa} \
        %{?_without_lirc:--disable-lirc} \
        %{?_without_libdv:--disable-libdv} \
        %{?_without_arts:--disable-arts} \
        --disable-runtime-cpudetection \
        --enable-shared-pp \
        --enable-i18n

#       --enable-win32 \
#       --with-win32libdir=%{_libdir}/win32 \
#       --enable-runtime-cpudetection \
#       %{?_without_cdparanoia:--disable-cdparanoia} \
#       %{!?_without_cdparanoia:--with-cdparanoiaincdir=%{_includedir}/cdda} \

make %{?_smp_mflags}

%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}

# The Skins (well, only one left, others are in mplayer-skins now)
mkdir -p %{buildroot}%{_datadir}/mplayer/Skin
pushd %{buildroot}%{_datadir}/mplayer/Skin
        for skin in %{SOURCE1}
        do
                tar -x -j -f ${skin}
        done
popd

# The font for the subtitles
pushd %{buildroot}%{_datadir}/mplayer
        rmdir font || :
        unzip %{SOURCE2}
        unzip %{SOURCE3}
        ln -s -f %{fontdir}/arial-%{fontsize} font
popd

# The icon used in the menu entry
install -D -m 644 Gui/mplayer/pixmaps/logo.xpm \
        %{buildroot}%{_datadir}/pixmaps/mplayer-logo.xpm

# Last, add system menu entries!
cat > %{name}.desktop << EOF
[Desktop Entry]
Name=Movie Player
Comment=Play DivX ;-), MPEG and other movies
Icon=mplayer-logo.xpm
Exec=gmplayer %f
Terminal=false
MimeType=video/mpeg;video/x-msvideo;video/quicktime
Type=Application
EOF

mkdir -p %{buildroot}%{_datadir}/applications
desktop-file-install --vendor %{desktop_vendor} --delete-original \
  --dir %{buildroot}%{_datadir}/applications                      \
  --add-category X-Red-Hat-Extra                                  \
  --add-category Application                                      \
  --add-category AudioVideo                                       \
  %{name}.desktop
[ -d %{_datadir}/mplayer/font ] && \
        rmdir %{_datadir}/mplayer/font 2>/dev/null || :

%post -p /sbin/ldconfig

%postun -p /sbin/ldconfig

%clean
rm -rf %{buildroot}

%files
%defattr(-, root, root, 755)
%doc AUTHORS ChangeLog DOCS/ README etc/*.conf
%dir %{_sysconfdir}/mplayer
%config %{_sysconfdir}/mplayer/codecs.conf
%{_prefix}/bin/*
%{_prefix}/include/*
%{_prefix}/lib/*
%{_datadir}/applications/*%{name}.desktop
%{_datadir}/mplayer
%{_datadir}/pixmaps/mplayer-logo.xpm
%{_mandir}/man1/*


... ....
回复

使用道具 举报

发表于 2002-12-28 19:45:21 | 显示全部楼层
我没能力解决这个全屏问题,懂多一点就算一点,先按你的方法用着
回复

使用道具 举报

 楼主| 发表于 2002-12-28 20:55:36 | 显示全部楼层
Kuye斑竹说道:
效果还不够好,全屏后屏幕顶端的 GNOME 菜单条和底下的任务栏无法隐藏了。而且通过菜单全屏,恢复时窗口呈最大化状态。。。

我的一点都没问题,不知是不是代码改错了,我还是把修改后的代码贴上来吧(只适用于rc2版)。使用方法见readme,用快捷键F切换全屏
在rc3出来之前先用着吧,或者哪位高手能再改进一下。

linux fan应该具有修改源码的本领,我只是C语言初学者而已,希望能跟大家一起讨论学习。
rh8.0+gnome2+kde3+Geforce2 mx

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

发表于 2002-12-29 09:05:26 | 显示全部楼层
你们讲的怎么这么地深奥,难懂的。

我编译的 mplayer 想怎么全屏,都没有问题的呢 !

看看我的 mplayer.spec 文件:
.............................
.............................
略去
..............................


什么意思啊?能否详细点说!!
回复

使用道具 举报

发表于 2002-12-30 10:45:24 | 显示全部楼层
OK,基于NightHK3的方法上的源码修改已经完成,现在无论是F键还是菜单上的"全屏"键功能,无论是在kde还是gnome(我只在rh8下测试了这个)都可以正常工作了
先整理一下,稍候放出修改过的源码
回复

使用道具 举报

发表于 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
回复

使用道具 举报

发表于 2002-12-30 19:26:40 | 显示全部楼层
请 llc 部长检查一下压缩源码包,我。。。无法解压(7 次下载里我下载了 4 次,都解压缩不了 )
[code:1]$ tar zxvf gui.tar.gz
tar: This does not look like a tar archive
tar: Skipping to next header
tar: Archive contains obsolescent base-64 headers
tar: Error exit delayed from previous errors[/code:1]
用 gunzip 可以解压出一个 tar 包,不过没办法用 tar xvf 解压
[quote:b0e35eacc8="NightHK3"]linux fan应该具有修改源码的本领,我只是C语言初学者而已,希望能跟大家一起讨论学习。[/quote]
您教训得是,别看我整天都说要把 Linux 应用于工作学习中,可每天的时间都花在打 Quake3、灌水上了

向你学习
回复

使用道具 举报

发表于 2002-12-30 19:57:19 | 显示全部楼层
重新上传了,有需要的朋友先下载测试一下
回复

使用道具 举报

 楼主| 发表于 2002-12-30 23:30:24 | 显示全部楼层
不愧为公社软件部长,回复特快,不仅解决了菜单全屏问题,而且对修改方法的解释比我的还详细、清楚,使我的这篇文章真正起到了抛砖引玉的作用。希望部长一如继往,我会继续支持公社的。
回复

使用道具 举报

发表于 2002-12-31 08:05:14 | 显示全部楼层
llc 老兄,你应该生成一个 可以 patch 的 diff 文件。

如同人家流行的做法。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 12:44 , Processed in 0.146177 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表